ZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCmluZGV4IDRjZGI4ODEuLmU0ZjEyYzggMTAwNjQ0Ci0tLSBhL0FuZHJvaWQuYnAKKysrIGIvQW5kcm9pZC5icApAQCAtMiw3ICsyLDYgQEAKICAgICAiY2FtZXJhIiwKICAgICAiZHJtLyoiLAogICAgICJtZWRpYS8qIiwKLSAgICAicmFkaW8iLAogICAgICJzZXJ2aWNlcy8qIiwKICAgICAic291bmR0cmlnZ2VyIiwKIF0KZGlmZiAtLWdpdCBhL0NsZWFuU3BlYy5tayBiL0NsZWFuU3BlYy5tawppbmRleCA1ZTRkODFkLi43OTNjYmY0IDEwMDY0NAotLS0gYS9DbGVhblNwZWMubWsKKysrIGIvQ2xlYW5TcGVjLm1rCkBAIC03OCw2ICs3OCw5IEBACiAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliL3NvdW5kZngvbGliYnVuZGxld3JhcHBlci5zbykKICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvc291bmRmeC9saWJhdWRpb3ByZXByb2Nlc3Npbmcuc28pCiAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliL2xpYm1lZGlhY29kZWNzZXJ2aWNlLnNvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYi9saWJzdGFnZWZyaWdodF94bWxwYXJzZXJAMS4wLnNvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYi9saWJzdGFnZWZyaWdodF9zb2Z0XyopCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliL3ZuZGsvbGlic3RhZ2VmcmlnaHRfc29mdF8qKQogCiAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIyBORVdFUiBDTEVBTiBTVEVQUyBNVVNUIEJFIEFUIFRIRSBFTkQgT0YgVEhFIExJU1QKZGlmZiAtLWdpdCBhL2NhbWVyYS9BbmRyb2lkLmJwIGIvY2FtZXJhL0FuZHJvaWQuYnAKaW5kZXggYmViMjA1YS4uMjRiMzkxOCAxMDA2NDQKLS0tIGEvY2FtZXJhL0FuZHJvaWQuYnAKKysrIGIvY2FtZXJhL0FuZHJvaWQuYnAKQEAgLTc3LDcgKzc3LDcgQEAKIAogfQogCi0vLyBBSURMIGludGVyZmFjZSBiZXR3ZWVuIGxpYmNhbWVyYV9jbGllbnQgYW5kIGZyYW1ld29yay5qYXIuCisvLyBBSURMIGludGVyZmFjZSBiZXR3ZWVuIGNhbWVyYSBjbGllbnRzIGFuZCB0aGUgY2FtZXJhIHNlcnZpY2UuCiBmaWxlZ3JvdXAgewogICAgIG5hbWU6ICJsaWJjYW1lcmFfY2xpZW50X2FpZGwiLAogICAgIHNyY3M6IFsKZGlmZiAtLWdpdCBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmFpZGwgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5haWRsCmluZGV4IDgzMDgwOTUuLjI4MjUyYzAgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmFpZGwKKysrIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuYWlkbApAQCAtNDIsNyArNDIsOSBAQAogICAgICAqIFJlcGVhdGluZyByZXF1ZXN0IGVuY291bnRlcmVkIGFuIGVycm9yIGFuZCB3YXMgc3RvcHBlZC4KICAgICAgKgogICAgICAqIEBwYXJhbSBsYXN0RnJhbWVOdW1iZXIgRnJhbWUgbnVtYmVyIG9mIHRoZSBsYXN0IGZyYW1lIG9mIHRoZSBzdHJlYW1pbmcgcmVxdWVzdC4KKyAgICAgKiBAcGFyYW0gcmVwZWF0aW5nUmVxdWVzdElkIHRoZSBJRCBvZiB0aGUgcmVwZWF0aW5nIHJlcXVlc3QgYmVpbmcgc3RvcHBlZAogICAgICAqLwotICAgIG9uZXdheSB2b2lkIG9uUmVwZWF0aW5nUmVxdWVzdEVycm9yKGluIGxvbmcgbGFzdEZyYW1lTnVtYmVyKTsKKyAgICBvbmV3YXkgdm9pZCBvblJlcGVhdGluZ1JlcXVlc3RFcnJvcihpbiBsb25nIGxhc3RGcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBpbnQgcmVwZWF0aW5nUmVxdWVzdElkKTsKICAgICBvbmV3YXkgdm9pZCBvblJlcXVlc3RRdWV1ZUVtcHR5KCk7CiB9CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5jcHAgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5jcHAKaW5kZXggOTg1NzFjMS4uOTA3ODAyYyAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcApAQCAtMTM3Miw3ICsxMzcyLDggQEAKIH0KIAogYmluZGVyOjpTdGF0dXMKLUNhbWVyYURldmljZTo6U2VydmljZUNhbGxiYWNrOjpvblJlcGVhdGluZ1JlcXVlc3RFcnJvcihpbnQ2NF90IGxhc3RGcmFtZU51bWJlcikgeworQ2FtZXJhRGV2aWNlOjpTZXJ2aWNlQ2FsbGJhY2s6Om9uUmVwZWF0aW5nUmVxdWVzdEVycm9yKAorICAgICAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciwgaW50MzJfdCBzdG9wcGVkU2VxdWVuY2VJZCkgewogICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IGJpbmRlcjo6U3RhdHVzOjpvaygpOwogCiAgICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBtRGV2aWNlLnByb21vdGUoKTsKQEAgLTEzODMsNyArMTM4NCw5IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGRldi0+bURldmljZUxvY2spOwogCiAgICAgaW50IHJlcGVhdGluZ1NlcXVlbmNlSWQgPSBkZXYtPm1SZXBlYXRpbmdTZXF1ZW5jZUlkOwotICAgIGRldi0+bVJlcGVhdGluZ1NlcXVlbmNlSWQgPSBSRVFVRVNUX0lEX05PTkU7CisgICAgaWYgKHN0b3BwZWRTZXF1ZW5jZUlkID09IHJlcGVhdGluZ1NlcXVlbmNlSWQpIHsKKyAgICAgICAgZGV2LT5tUmVwZWF0aW5nU2VxdWVuY2VJZCA9IFJFUVVFU1RfSURfTk9ORTsKKyAgICB9CiAKICAgICBkZXYtPmNoZWNrUmVwZWF0aW5nU2VxdWVuY2VDb21wbGV0ZUxvY2tlZChyZXBlYXRpbmdTZXF1ZW5jZUlkLCBsYXN0RnJhbWVOdW1iZXIpOwogCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5oIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaAppbmRleCAxNWRkMDhkLi42ZWQzODgxIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5oCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKQEAgLTc1LDcgKzc1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgb3ZlcnJpZGU7CiAgICAgICAgIGJpbmRlcjo6U3RhdHVzIG9uUHJlcGFyZWQoaW50IHN0cmVhbUlkKSBvdmVycmlkZTsKICAgICAgICAgYmluZGVyOjpTdGF0dXMgb25SZXF1ZXN0UXVldWVFbXB0eSgpIG92ZXJyaWRlOwotICAgICAgICBiaW5kZXI6OlN0YXR1cyBvblJlcGVhdGluZ1JlcXVlc3RFcnJvcihpbnQ2NF90IGxhc3RGcmFtZU51bWJlcikgb3ZlcnJpZGU7CisgICAgICAgIGJpbmRlcjo6U3RhdHVzIG9uUmVwZWF0aW5nUmVxdWVzdEVycm9yKGludDY0X3QgbGFzdEZyYW1lTnVtYmVyLAorICAgICAgICAgICAgICAgIGludDMyX3Qgc3RvcHBlZFNlcXVlbmNlSWQpIG92ZXJyaWRlOwogICAgICAgcHJpdmF0ZToKICAgICAgICAgY29uc3Qgd3A8Q2FtZXJhRGV2aWNlPiBtRGV2aWNlOwogICAgIH07CmRpZmYgLS1naXQgYS9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwIGIvY2FtZXJhL3Rlc3RzL0NhbWVyYUJpbmRlclRlc3RzLmNwcAppbmRleCA5NDZlM2I4Li41MWQ5MjE0IDEwMDY0NAotLS0gYS9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwCisrKyBiL2NhbWVyYS90ZXN0cy9DYW1lcmFCaW5kZXJUZXN0cy5jcHAKQEAgLTIxNyw4ICsyMTcsMTAgQEAKICAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwogICAgIH0KIAotICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25SZXBlYXRpbmdSZXF1ZXN0RXJyb3IoaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIpIHsKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uUmVwZWF0aW5nUmVxdWVzdEVycm9yKAorICAgICAgICAgICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIsIGludDMyX3Qgc3RvcHBlZFNlcXVlbmNlSWQpIHsKICAgICAgICAgKHZvaWQpIGxhc3RGcmFtZU51bWJlcjsKKyAgICAgICAgKHZvaWQpIHN0b3BwZWRTZXF1ZW5jZUlkOwogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgICAgIG1MYXN0U3RhdHVzID0gUkVQRUFUSU5HX1JFUVVFU1RfRVJST1I7CiAgICAgICAgIG1TdGF0dXNlc0hpdC5wdXNoX2JhY2sobUxhc3RTdGF0dXMpOwpkaWZmIC0tZ2l0IGEvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcCBiL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAKaW5kZXggZGUwMTY3YS4uYmMzMmJiZSAxMDA2NDQKLS0tIGEvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcAorKysgYi9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwCkBAIC03OCw3ICs3OCw3IEBACiBzdGF0aWMgYm9vbCBnV2FudEZyYW1lVGltZSA9IGZhbHNlOyAgICAgLy8gZG8gd2Ugd2FudCB0aW1lcyBvbiBlYWNoIGZyYW1lPwogc3RhdGljIHVpbnQzMl90IGdWaWRlb1dpZHRoID0gMDsgICAgICAgIC8vIGRlZmF1bHQgd2lkdGgraGVpZ2h0CiBzdGF0aWMgdWludDMyX3QgZ1ZpZGVvSGVpZ2h0ID0gMDsKLXN0YXRpYyB1aW50MzJfdCBnQml0UmF0ZSA9IDQwMDAwMDA7ICAgICAvLyA0TWJwcworc3RhdGljIHVpbnQzMl90IGdCaXRSYXRlID0gMjAwMDAwMDA7ICAgICAvLyAyME1icHMKIHN0YXRpYyB1aW50MzJfdCBnVGltZUxpbWl0U2VjID0ga01heFRpbWVMaW1pdFNlYzsKIAogLy8gU2V0IGJ5IHNpZ25hbCBoYW5kbGVyIHRvIHN0b3AgcmVjb3JkaW5nLgpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAppbmRleCBkN2MyZTg3Li5kNzAyODJiIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcApAQCAtODcwLDcgKzg3MCw5IEBACiAKICAgICAgICAgICAgIHNwPElNZW1vcnk+IG1lbSA9CiAgICAgICAgICAgICAgICAgICAgIHJldHJpZXZlci0+Z2V0RnJhbWVBdFRpbWUoLTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qbWV0YU9ubHkqLyk7CiAKICAgICAgICAgICAgIGlmIChtZW0gIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGZhaWxlZCA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAgYi9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icAppbmRleCA0NDRmMzA3Li4wYzE0MjAxIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icAorKysgYi9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icApAQCAtNSwzMyArNSwzMSBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJtZWRpYWRybSIsCiAKLSAgICBhaWRsOiB7Ci0gICAgICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJhaWRsIl0sCi0gICAgICAgIGV4cG9ydF9haWRsX2hlYWRlcnM6IHRydWUsCi0gICAgfSwKIAogICAgIHNyY3M6IFsKLSAgICAgICAgIjpsaWJtZWRpYWRybV9haWRsIiwKLQotICAgICAgICAiQ2FzSW1wbC5jcHAiLAotICAgICAgICAiRGVzY3JhbWJsZXJJbXBsLmNwcCIsCiAgICAgICAgICJEcm1QbHVnaW5QYXRoLmNwcCIsCiAgICAgICAgICJEcm1TZXNzaW9uTWFuYWdlci5jcHAiLAogICAgICAgICAiSUNyeXB0by5jcHAiLAogICAgICAgICAiSURybS5jcHAiLAogICAgICAgICAiSURybUNsaWVudC5jcHAiLAogICAgICAgICAiSU1lZGlhRHJtU2VydmljZS5jcHAiLAotICAgICAgICAiTWVkaWFDYXNEZWZzLmNwcCIsCisgICAgICAgICJQbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmNwcCIsCiAgICAgICAgICJTaGFyZWRMaWJyYXJ5LmNwcCIsCiAgICAgICAgICJEcm1IYWwuY3BwIiwKICAgICAgICAgIkNyeXB0b0hhbC5jcHAiLAorICAgICAgICAicHJvdG9zL3BsdWdpbl9tZXRyaWNzLnByb3RvIiwKICAgICBdLAogCisgICAgcHJvdG86IHsKKyAgICAgICAgdHlwZTogImxpdGUiLAorICAgIH0sCisKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJkbCIsCiAgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKICAgICAgICAgImxpYm1lZGlhdXRpbHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCkBAIC00NiwxNCArNDQsMyBAQAogICAgICAgICAiLVdhbGwiLAogICAgIF0sCiB9Ci0KLS8vIEFJREwgaW50ZXJmYWNlIGJldHdlZW4gbGlibWVkaWFkcm0gYW5kIGZyYW1ld29yay5qYXIKLWZpbGVncm91cCB7Ci0gICAgbmFtZTogImxpYm1lZGlhZHJtX2FpZGwiLAotICAgIHNyY3M6IFsKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JQ2FzLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lDYXNMaXN0ZW5lci5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JRGVzY3JhbWJsZXIuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhQ2FzU2VydmljZS5haWRsIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0Nhc0ltcGwuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0Nhc0ltcGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTMzYmIwLi4wMDAwMDAwCi0tLSBhL2RybS9saWJtZWRpYWRybS9DYXNJbXBsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJDYXNJbXBsIgotCi0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JQ2FzTGlzdGVuZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9jYXMvQ2FzQVBJLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQ2FzSW1wbC5oPgotI2luY2x1ZGUgPG1lZGlhL1NoYXJlZExpYnJhcnkuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgU3RhdHVzIGdldEJpbmRlclN0YXR1cyhzdGF0dXNfdCBlcnIpIHsKLSAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gICAgfQotICAgIGlmIChlcnIgPT0gQkFEX1ZBTFVFKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKFN0YXR1czo6RVhfSUxMRUdBTF9BUkdVTUVOVCk7Ci0gICAgfQotICAgIGlmIChlcnIgPT0gSU5WQUxJRF9PUEVSQVRJT04pIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoU3RhdHVzOjpFWF9JTExFR0FMX1NUQVRFKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKGVycik7Ci19Ci0KLXN0YXRpYyBTdHJpbmc4IHNlc3Npb25JZFRvU3RyaW5nKGNvbnN0IENhc1Nlc3Npb25JZCAmc2Vzc2lvbklkKSB7Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzZXNzaW9uSWQuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTAyeCAiLCBzZXNzaW9uSWRbaV0pOwotICAgIH0KLSAgICBpZiAocmVzdWx0LmlzRW1wdHkoKSkgewotICAgICAgICByZXN1bHQuYXBwZW5kKCIobnVsbCkiKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RydWN0IENhc0ltcGw6OlBsdWdpbkhvbGRlciA6IHB1YmxpYyBSZWZCYXNlIHsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBQbHVnaW5Ib2xkZXIoQ2FzUGx1Z2luICpwbHVnaW4pIDogbVBsdWdpbihwbHVnaW4pIHt9Ci0gICAgflBsdWdpbkhvbGRlcigpIHsgaWYgKG1QbHVnaW4gIT0gTlVMTCkgZGVsZXRlIG1QbHVnaW47IH0KLSAgICBDYXNQbHVnaW4qIGdldCgpIHsgcmV0dXJuIG1QbHVnaW47IH0KLQotcHJpdmF0ZToKLSAgICBDYXNQbHVnaW4gKm1QbHVnaW47Ci0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUGx1Z2luSG9sZGVyKTsKLX07Ci0KLUNhc0ltcGw6OkNhc0ltcGwoY29uc3Qgc3A8SUNhc0xpc3RlbmVyPiAmbGlzdGVuZXIpCi0gICAgOiBtUGx1Z2luSG9sZGVyKE5VTEwpLCBtTGlzdGVuZXIobGlzdGVuZXIpIHsKLSAgICBBTE9HVigiQ1RPUiIpOwotfQotCi1DYXNJbXBsOjp+Q2FzSW1wbCgpIHsKLSAgICBBTE9HVigiRFRPUiIpOwotICAgIHJlbGVhc2UoKTsKLX0KLQotLy9zdGF0aWMKLXZvaWQgQ2FzSW1wbDo6T25FdmVudCgKLSAgICAgICAgdm9pZCAqYXBwRGF0YSwKLSAgICAgICAgaW50MzJfdCBldmVudCwKLSAgICAgICAgaW50MzJfdCBhcmcsCi0gICAgICAgIHVpbnQ4X3QgKmRhdGEsCi0gICAgICAgIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKGFwcERhdGEgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiSW52YWxpZCBhcHBEYXRhISIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENhc0ltcGwgKmNhc0ltcGwgPSBzdGF0aWNfY2FzdDxDYXNJbXBsICo+KGFwcERhdGEpOwotICAgIGNhc0ltcGwtPm9uRXZlbnQoZXZlbnQsIGFyZywgZGF0YSwgc2l6ZSk7Ci19Ci0KLXZvaWQgQ2FzSW1wbDo6aW5pdChjb25zdCBzcDxTaGFyZWRMaWJyYXJ5PiYgbGlicmFyeSwgQ2FzUGx1Z2luICpwbHVnaW4pIHsKLSAgICBtTGlicmFyeSA9IGxpYnJhcnk7Ci0gICAgbVBsdWdpbkhvbGRlciA9IG5ldyBQbHVnaW5Ib2xkZXIocGx1Z2luKTsKLX0KLQotdm9pZCBDYXNJbXBsOjpvbkV2ZW50KAotICAgICAgICBpbnQzMl90IGV2ZW50LCBpbnQzMl90IGFyZywgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBpZiAobUxpc3RlbmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN0ZDo6dW5pcXVlX3B0cjxDYXNEYXRhPiBldmVudERhdGE7Ci0gICAgaWYgKGRhdGEgIT0gTlVMTCAmJiBzaXplID4gMCkgewotICAgICAgICBldmVudERhdGEucmVzZXQobmV3IENhc0RhdGEoZGF0YSwgZGF0YSArIHNpemUpKTsKLSAgICB9Ci0KLSAgICBtTGlzdGVuZXItPm9uRXZlbnQoZXZlbnQsIGFyZywgZXZlbnREYXRhKTsKLX0KLQotU3RhdHVzIENhc0ltcGw6OnNldFByaXZhdGVEYXRhKGNvbnN0IENhc0RhdGEmIHB2dERhdGEpIHsKLSAgICBBTE9HVigic2V0UHJpdmF0ZURhdGEiKTsKLSAgICBzcDxQbHVnaW5Ib2xkZXI+IGhvbGRlciA9IG1QbHVnaW5Ib2xkZXI7Ci0gICAgaWYgKGhvbGRlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoSU5WQUxJRF9PUEVSQVRJT04pOwotICAgIH0KLSAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKGhvbGRlci0+Z2V0KCktPnNldFByaXZhdGVEYXRhKHB2dERhdGEpKTsKLX0KLQotU3RhdHVzIENhc0ltcGw6Om9wZW5TZXNzaW9uKENhc1Nlc3Npb25JZCogc2Vzc2lvbklkKSB7Ci0gICAgQUxPR1YoIm9wZW5TZXNzaW9uIik7Ci0gICAgc3A8UGx1Z2luSG9sZGVyPiBob2xkZXIgPSBtUGx1Z2luSG9sZGVyOwotICAgIGlmIChob2xkZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKElOVkFMSURfT1BFUkFUSU9OKTsKLSAgICB9Ci0gICAgc3RhdHVzX3QgZXJyID0gaG9sZGVyLT5nZXQoKS0+b3BlblNlc3Npb24oc2Vzc2lvbklkKTsKLQotICAgIEFMT0dWKCJvcGVuU2Vzc2lvbjogc2Vzc2lvbiBvcGVuZWQsIHNlc3Npb25JZD0lcyIsCi0gICAgICAgICAgICBzZXNzaW9uSWRUb1N0cmluZygqc2Vzc2lvbklkKS5zdHJpbmcoKSk7Ci0KLSAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKGVycik7Ci19Ci0KLVN0YXR1cyBDYXNJbXBsOjpzZXRTZXNzaW9uUHJpdmF0ZURhdGEoCi0gICAgICAgIGNvbnN0IENhc1Nlc3Npb25JZCAmc2Vzc2lvbklkLCBjb25zdCBDYXNEYXRhJiBwdnREYXRhKSB7Ci0gICAgQUxPR1YoInNldFNlc3Npb25Qcml2YXRlRGF0YTogc2Vzc2lvbklkPSVzIiwKLSAgICAgICAgICAgIHNlc3Npb25JZFRvU3RyaW5nKHNlc3Npb25JZCkuc3RyaW5nKCkpOwotICAgIHNwPFBsdWdpbkhvbGRlcj4gaG9sZGVyID0gbVBsdWdpbkhvbGRlcjsKLSAgICBpZiAoaG9sZGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhJTlZBTElEX09QRVJBVElPTik7Ci0gICAgfQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoaG9sZGVyLT5nZXQoKS0+c2V0U2Vzc2lvblByaXZhdGVEYXRhKHNlc3Npb25JZCwgcHZ0RGF0YSkpOwotfQotCi1TdGF0dXMgQ2FzSW1wbDo6Y2xvc2VTZXNzaW9uKGNvbnN0IENhc1Nlc3Npb25JZCAmc2Vzc2lvbklkKSB7Ci0gICAgQUxPR1YoImNsb3NlU2Vzc2lvbjogc2Vzc2lvbklkPSVzIiwKLSAgICAgICAgICAgIHNlc3Npb25JZFRvU3RyaW5nKHNlc3Npb25JZCkuc3RyaW5nKCkpOwotICAgIHNwPFBsdWdpbkhvbGRlcj4gaG9sZGVyID0gbVBsdWdpbkhvbGRlcjsKLSAgICBpZiAoaG9sZGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhJTlZBTElEX09QRVJBVElPTik7Ci0gICAgfQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoaG9sZGVyLT5nZXQoKS0+Y2xvc2VTZXNzaW9uKHNlc3Npb25JZCkpOwotfQotCi1TdGF0dXMgQ2FzSW1wbDo6cHJvY2Vzc0VjbShjb25zdCBDYXNTZXNzaW9uSWQgJnNlc3Npb25JZCwgY29uc3QgUGFyY2VsYWJsZUNhc0RhdGEmIGVjbSkgewotICAgIEFMT0dWKCJwcm9jZXNzRWNtOiBzZXNzaW9uSWQ9JXMiLAotICAgICAgICAgICAgc2Vzc2lvbklkVG9TdHJpbmcoc2Vzc2lvbklkKS5zdHJpbmcoKSk7Ci0gICAgc3A8UGx1Z2luSG9sZGVyPiBob2xkZXIgPSBtUGx1Z2luSG9sZGVyOwotICAgIGlmIChob2xkZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKElOVkFMSURfT1BFUkFUSU9OKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKGhvbGRlci0+Z2V0KCktPnByb2Nlc3NFY20oc2Vzc2lvbklkLCBlY20pKTsKLX0KLQotU3RhdHVzIENhc0ltcGw6OnByb2Nlc3NFbW0oY29uc3QgUGFyY2VsYWJsZUNhc0RhdGEmIGVtbSkgewotICAgIEFMT0dWKCJwcm9jZXNzRW1tIik7Ci0gICAgc3A8UGx1Z2luSG9sZGVyPiBob2xkZXIgPSBtUGx1Z2luSG9sZGVyOwotICAgIGlmIChob2xkZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKElOVkFMSURfT1BFUkFUSU9OKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZ2V0QmluZGVyU3RhdHVzKGhvbGRlci0+Z2V0KCktPnByb2Nlc3NFbW0oZW1tKSk7Ci19Ci0KLVN0YXR1cyBDYXNJbXBsOjpzZW5kRXZlbnQoCi0gICAgICAgIGludDMyX3QgZXZlbnQsIGludDMyX3QgYXJnLCBjb25zdCA6OnN0ZDo6dW5pcXVlX3B0cjxDYXNEYXRhPiAmZXZlbnREYXRhKSB7Ci0gICAgQUxPR1YoInNlbmRFdmVudCIpOwotICAgIHNwPFBsdWdpbkhvbGRlcj4gaG9sZGVyID0gbVBsdWdpbkhvbGRlcjsKLSAgICBpZiAoaG9sZGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhJTlZBTElEX09QRVJBVElPTik7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyOwotICAgIGlmIChldmVudERhdGEgPT0gbnVsbHB0cikgewotICAgICAgICBlcnIgPSBob2xkZXItPmdldCgpLT5zZW5kRXZlbnQoZXZlbnQsIGFyZywgQ2FzRGF0YSgpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSBob2xkZXItPmdldCgpLT5zZW5kRXZlbnQoZXZlbnQsIGFyZywgKmV2ZW50RGF0YSk7Ci0gICAgfQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoZXJyKTsKLX0KLQotU3RhdHVzIENhc0ltcGw6OnByb3Zpc2lvbihjb25zdCBTdHJpbmcxNiYgcHJvdmlzaW9uU3RyaW5nKSB7Ci0gICAgQUxPR1YoInByb3Zpc2lvbjogcHJvdmlzaW9uU3RyaW5nPSVzIiwgU3RyaW5nOChwcm92aXNpb25TdHJpbmcpLnN0cmluZygpKTsKLSAgICBzcDxQbHVnaW5Ib2xkZXI+IGhvbGRlciA9IG1QbHVnaW5Ib2xkZXI7Ci0gICAgaWYgKGhvbGRlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoSU5WQUxJRF9PUEVSQVRJT04pOwotICAgIH0KLQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoaG9sZGVyLT5nZXQoKS0+cHJvdmlzaW9uKFN0cmluZzgocHJvdmlzaW9uU3RyaW5nKSkpOwotfQotCi1TdGF0dXMgQ2FzSW1wbDo6cmVmcmVzaEVudGl0bGVtZW50cygKLSAgICAgICAgaW50MzJfdCByZWZyZXNoVHlwZSwgY29uc3QgOjpzdGQ6OnVuaXF1ZV9wdHI8Q2FzRGF0YT4gJnJlZnJlc2hEYXRhKSB7Ci0gICAgQUxPR1YoInJlZnJlc2hFbnRpdGxlbWVudHMiKTsKLSAgICBzcDxQbHVnaW5Ib2xkZXI+IGhvbGRlciA9IG1QbHVnaW5Ib2xkZXI7Ci0gICAgaWYgKGhvbGRlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoSU5WQUxJRF9PUEVSQVRJT04pOwotICAgIH0KLQotICAgIHN0YXR1c190IGVycjsKLSAgICBpZiAocmVmcmVzaERhdGEgPT0gbnVsbHB0cikgewotICAgICAgICBlcnIgPSBob2xkZXItPmdldCgpLT5yZWZyZXNoRW50aXRsZW1lbnRzKHJlZnJlc2hUeXBlLCBDYXNEYXRhKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IGhvbGRlci0+Z2V0KCktPnJlZnJlc2hFbnRpdGxlbWVudHMocmVmcmVzaFR5cGUsICpyZWZyZXNoRGF0YSk7Ci0gICAgfQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoZXJyKTsKLX0KLQotU3RhdHVzIENhc0ltcGw6OnJlbGVhc2UoKSB7Ci0gICAgQUxPR1YoInJlbGVhc2U6IHBsdWdpbj0lcCIsCi0gICAgICAgICAgICBtUGx1Z2luSG9sZGVyID09IE5VTEwgPyBtUGx1Z2luSG9sZGVyLT5nZXQoKSA6IE5VTEwpOwotICAgIG1QbHVnaW5Ib2xkZXIuY2xlYXIoKTsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9EZXNjcmFtYmxlckltcGwuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0Rlc2NyYW1ibGVySW1wbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZTA5ZTIuLjAwMDAwMDAKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0Rlc2NyYW1ibGVySW1wbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiRGVzY3JhbWJsZXJJbXBsIgotCi0jaW5jbHVkZSA8bWVkaWEvY2FzL0Rlc2NyYW1ibGVyQVBJLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRGVzY3JhbWJsZXJJbXBsLmg+Ci0jaW5jbHVkZSA8bWVkaWEvU2hhcmVkTGlicmFyeS5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIFN0YXR1cyBnZXRCaW5kZXJTdGF0dXMoc3RhdHVzX3QgZXJyKSB7Ci0gICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICAgIH0KLSAgICBpZiAoZXJyID09IEJBRF9WQUxVRSkgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShTdGF0dXM6OkVYX0lMTEVHQUxfQVJHVU1FTlQpOwotICAgIH0KLSAgICBpZiAoZXJyID09IElOVkFMSURfT1BFUkFUSU9OKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKFN0YXR1czo6RVhfSUxMRUdBTF9TVEFURSk7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihlcnIpOwotfQotCi1zdGF0aWMgU3RyaW5nOCBzZXNzaW9uSWRUb1N0cmluZyhjb25zdCBDYXNTZXNzaW9uSWQgJnNlc3Npb25JZCkgewotICAgIFN0cmluZzggcmVzdWx0OwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2Vzc2lvbklkLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiUwMnggIiwgc2Vzc2lvbklkW2ldKTsKLSAgICB9Ci0gICAgaWYgKHJlc3VsdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiKG51bGwpIik7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLURlc2NyYW1ibGVySW1wbDo6RGVzY3JhbWJsZXJJbXBsKAotICAgICAgICBjb25zdCBzcDxTaGFyZWRMaWJyYXJ5PiYgbGlicmFyeSwgRGVzY3JhbWJsZXJQbHVnaW4gKnBsdWdpbikgOgotICAgICAgICBtTGlicmFyeShsaWJyYXJ5KSwgbVBsdWdpbihwbHVnaW4pIHsKLSAgICBBTE9HVigiQ1RPUjogbVBsdWdpbj0lcCIsIG1QbHVnaW4pOwotfQotCi1EZXNjcmFtYmxlckltcGw6On5EZXNjcmFtYmxlckltcGwoKSB7Ci0gICAgQUxPR1YoIkRUT1I6IG1QbHVnaW49JXAiLCBtUGx1Z2luKTsKLSAgICByZWxlYXNlKCk7Ci19Ci0KLVN0YXR1cyBEZXNjcmFtYmxlckltcGw6OnNldE1lZGlhQ2FzU2Vzc2lvbihjb25zdCBDYXNTZXNzaW9uSWQmIHNlc3Npb25JZCkgewotICAgIEFMT0dWKCJzZXRNZWRpYUNhc1Nlc3Npb246IHNlc3Npb25JZD0lcyIsCi0gICAgICAgICAgICBzZXNzaW9uSWRUb1N0cmluZyhzZXNzaW9uSWQpLnN0cmluZygpKTsKLQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMobVBsdWdpbi0+c2V0TWVkaWFDYXNTZXNzaW9uKHNlc3Npb25JZCkpOwotfQotCi1TdGF0dXMgRGVzY3JhbWJsZXJJbXBsOjpyZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoCi0gICAgICAgIGNvbnN0IFN0cmluZzE2JiBtaW1lLCBib29sICpyZXN1bHQpIHsKLSAgICAqcmVzdWx0ID0gbVBsdWdpbi0+cmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KFN0cmluZzgobWltZSkpOwotCi0gICAgcmV0dXJuIGdldEJpbmRlclN0YXR1cyhPSyk7Ci19Ci0KLVN0YXR1cyBEZXNjcmFtYmxlckltcGw6OmRlc2NyYW1ibGUoCi0gICAgICAgIGNvbnN0IERlc2NyYW1ibGVJbmZvJiBpbmZvLCBpbnQzMl90ICpyZXN1bHQpIHsKLSAgICBBTE9HVigiZGVzY3JhbWJsZSIpOwotCi0gICAgKnJlc3VsdCA9IG1QbHVnaW4tPmRlc2NyYW1ibGUoCi0gICAgICAgICAgICBpbmZvLmRzdFR5cGUgIT0gRGVzY3JhbWJsZUluZm86OmtEZXN0aW5hdGlvblR5cGVWbVBvaW50ZXIsCi0gICAgICAgICAgICBpbmZvLnNjcmFtYmxpbmdDb250cm9sLAotICAgICAgICAgICAgaW5mby5udW1TdWJTYW1wbGVzLAotICAgICAgICAgICAgaW5mby5zdWJTYW1wbGVzLAotICAgICAgICAgICAgaW5mby5zcmNNZW0tPnBvaW50ZXIoKSwKLSAgICAgICAgICAgIGluZm8uc3JjT2Zmc2V0LAotICAgICAgICAgICAgaW5mby5kc3RUeXBlID09IERlc2NyYW1ibGVJbmZvOjprRGVzdGluYXRpb25UeXBlVm1Qb2ludGVyID8KLSAgICAgICAgICAgICAgICAgICAgaW5mby5zcmNNZW0tPnBvaW50ZXIoKSA6IGluZm8uZHN0UHRyLAotICAgICAgICAgICAgaW5mby5kc3RPZmZzZXQsCi0gICAgICAgICAgICBOVUxMKTsKLQotICAgIHJldHVybiBnZXRCaW5kZXJTdGF0dXMoKnJlc3VsdCA+PSAwID8gT0sgOiAqcmVzdWx0KTsKLX0KLQotU3RhdHVzIERlc2NyYW1ibGVySW1wbDo6cmVsZWFzZSgpIHsKLSAgICBBTE9HVigicmVsZWFzZTogbVBsdWdpbj0lcCIsIG1QbHVnaW4pOwotCi0gICAgaWYgKG1QbHVnaW4gIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgbVBsdWdpbjsKLSAgICAgICAgbVBsdWdpbiA9IE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0RybUhhbC5jcHAgYi9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcAppbmRleCAwNzQ0ODlhLi5iYzM3NTU3IDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcApAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPG1lZGlhL0RybUhhbC5oPgogI2luY2x1ZGUgPG1lZGlhL0RybVNlc3Npb25DbGllbnRJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9Ecm1TZXNzaW9uTWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuaD4KICNpbmNsdWRlIDxtZWRpYS9kcm0vRHJtQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KQEAgLTE5NCw3ICsxOTUsMTggQEAKICAgICAgbUluaXRDaGVjaygobUZhY3Rvcmllcy5zaXplKCkgPT0gMCkgPyBFUlJPUl9VTlNVUFBPUlRFRCA6IE5PX0lOSVQpIHsKIH0KIAordm9pZCBEcm1IYWw6OmNsb3NlT3BlblNlc3Npb25zKCkgeworICAgIGlmIChtUGx1Z2luICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3BlblNlc3Npb25zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBtUGx1Z2luLT5jbG9zZVNlc3Npb24odG9IaWRsVmVjKG1PcGVuU2Vzc2lvbnNbaV0pKTsKKyAgICAgICAgICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT5yZW1vdmVTZXNzaW9uKG1PcGVuU2Vzc2lvbnNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIG1PcGVuU2Vzc2lvbnMuY2xlYXIoKTsKK30KKwogRHJtSGFsOjp+RHJtSGFsKCkgeworICAgIGNsb3NlT3BlblNlc3Npb25zKCk7CiAgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnJlbW92ZURybShtRHJtU2Vzc2lvbkNsaWVudCk7CiB9CiAKQEAgLTQxMywxMSArNDI1LDEyIEBACiAKIHN0YXR1c190IERybUhhbDo6ZGVzdHJveVBsdWdpbigpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CiAgICAgfQogCisgICAgY2xvc2VPcGVuU2Vzc2lvbnMoKTsKKyAgICByZXBvcnRNZXRyaWNzKCk7CiAgICAgc2V0TGlzdGVuZXIoTlVMTCk7CiAgICAgbUluaXRDaGVjayA9IE5PX0lOSVQ7CiAKQEAgLTQ3MSw2ICs0ODQsNyBAQAogICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPmFkZFNlc3Npb24oZ2V0Q2FsbGluZ1BpZCgpLAogICAgICAgICAgICAgICAgIG1Ecm1TZXNzaW9uQ2xpZW50LCBzZXNzaW9uSWQpOworICAgICAgICBtT3BlblNlc3Npb25zLnB1c2goc2Vzc2lvbklkKTsKICAgICB9CiAgICAgcmV0dXJuIGVycjsKIH0KQEAgLTQ4Niw3ICs1MDAsMTQgQEAKICAgICBpZiAoc3RhdHVzLmlzT2soKSkgewogICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKICAgICAgICAgICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT5yZW1vdmVTZXNzaW9uKHNlc3Npb25JZCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PcGVuU2Vzc2lvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobU9wZW5TZXNzaW9uc1tpXSA9PSBzZXNzaW9uSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbU9wZW5TZXNzaW9ucy5yZW1vdmVBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIHJlcG9ydE1ldHJpY3MoKTsKICAgICAgICAgcmV0dXJuIHRvU3RhdHVzVChzdGF0dXMpOwogICAgIH0KICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CkBAIC03NDAsNiArNzYxLDEyIEBACiAKIHN0YXR1c190IERybUhhbDo6Z2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUgKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChuYW1lLCB2YWx1ZSk7Cit9CisKK3N0YXR1c190IERybUhhbDo6Z2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSkgY29uc3QgeworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgaW50ZXJuYWwgdG8gdGhlIGNsYXNzIGFuZCBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hpbGUKKyAgICAvLyBtTG9jayBpcyBhbHJlYWR5IGhlbGQuCiAKICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewogICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKQEAgLTc2MSw2ICs3ODgsMTIgQEAKIAogc3RhdHVzX3QgRHJtSGFsOjpnZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0ICZuYW1lLCBWZWN0b3I8dWludDhfdD4gJnZhbHVlICkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIGdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwobmFtZSwgdmFsdWUpOworfQorCitzdGF0dXNfdCBEcm1IYWw6OmdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwoU3RyaW5nOCBjb25zdCAmbmFtZSwgVmVjdG9yPHVpbnQ4X3Q+ICZ2YWx1ZSApIGNvbnN0IHsKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGludGVybmFsIHRvIHRoZSBjbGFzcyBhbmQgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoaWxlCisgICAgLy8gbUxvY2sgaXMgYWxyZWFkeSBoZWxkLgogCiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CkBAIC05NzUsNyArMTAwOCw3IEBACiB2b2lkIERybUhhbDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmdGhlX2xhdGVfd2hvIF9fdW51c2VkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KKyAgICBjbG9zZU9wZW5TZXNzaW9ucygpOwogICAgIHNldExpc3RlbmVyKE5VTEwpOwogICAgIG1Jbml0Q2hlY2sgPSBOT19JTklUOwogCkBAIC05OTcsNCArMTAzMCwyMCBAQAogICAgIH0KIH0KIAordm9pZCBEcm1IYWw6OnJlcG9ydE1ldHJpY3MoKSBjb25zdAoreworICAgIFZlY3Rvcjx1aW50OF90PiBtZXRyaWNzOworICAgIFN0cmluZzggdmVuZG9yOworICAgIFN0cmluZzggZGVzY3JpcHRpb247CisgICAgaWYgKGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgidmVuZG9yIiksIHZlbmRvcikgPT0gT0sgJiYKKyAgICAgICAgICAgIGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgiZGVzY3JpcHRpb24iKSwgZGVzY3JpcHRpb24pID09IE9LICYmCisgICAgICAgICAgICBnZXRQcm9wZXJ0eUJ5dGVBcnJheUludGVybmFsKFN0cmluZzgoIm1ldHJpY3MiKSwgbWV0cmljcykgPT0gT0spIHsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gYW5kcm9pZDo6cmVwb3J0RHJtUGx1Z2luTWV0cmljcygKKyAgICAgICAgICAgICAgICBtZXRyaWNzLCB2ZW5kb3IsIGRlc2NyaXB0aW9uKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIk1ldHJpY3Mgd2VyZSByZXRyaWV2ZWQgYnV0IGNvdWxkIG5vdCBiZSByZXBvcnRlZDogJWkiLCByZXMpOworICAgICAgICB9CisgICAgfQorfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0lEcm0uY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0lEcm0uY3BwCmluZGV4IDRlNDcxMTIuLjhmZjZlNmEgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9JRHJtLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vSURybS5jcHAKQEAgLTU2MSw4ICs1NjEsMTMgQEAKIAogdm9pZCBCbkRybTo6cmVhZFZlY3Rvcihjb25zdCBQYXJjZWwgJmRhdGEsIFZlY3Rvcjx1aW50OF90PiAmdmVjdG9yKSBjb25zdCB7CiAgICAgdWludDMyX3Qgc2l6ZSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgdmVjdG9yLmluc2VydEF0KChzaXplX3QpMCwgc2l6ZSk7Ci0gICAgZGF0YS5yZWFkKHZlY3Rvci5lZGl0QXJyYXkoKSwgc2l6ZSk7CisgICAgaWYgKHZlY3Rvci5pbnNlcnRBdCgoc2l6ZV90KTAsIHNpemUpIDwgMCkgeworICAgICAgICB2ZWN0b3IuY2xlYXIoKTsKKyAgICB9CisgICAgaWYgKGRhdGEucmVhZCh2ZWN0b3IuZWRpdEFycmF5KCksIHNpemUpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHZlY3Rvci5jbGVhcigpOworICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVXaXRoSW5mb0xvZygweDUzNGU0NTU0LCAiNjI4NzIzODQiLCAtMSwgTlVMTCwgMCk7CisgICAgfQogfQogCiB2b2lkIEJuRHJtOjp3cml0ZVZlY3RvcihQYXJjZWwgKnJlcGx5LCBWZWN0b3I8dWludDhfdD4gY29uc3QgJnZlY3RvcikgY29uc3QgewpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL01lZGlhQ2FzRGVmcy5jcHAgYi9kcm0vbGlibWVkaWFkcm0vTWVkaWFDYXNEZWZzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMyYmEzOC4uMDAwMDAwMAotLS0gYS9kcm0vbGlibWVkaWFkcm0vTWVkaWFDYXNEZWZzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTWVkaWFDYXMiCi0KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUNhc0RlZnMuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgbWVkaWEgewotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1uYW1lc3BhY2UgTWVkaWFDYXMgewotCi1zdGF0dXNfdCBQYXJjZWxhYmxlQ2FzRGF0YTo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIHsKLSAgICByZXR1cm4gcGFyY2VsLT5yZWFkQnl0ZVZlY3Rvcih0aGlzKTsKLX0KLQotc3RhdHVzX3QgUGFyY2VsYWJsZUNhc0RhdGE6OndyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0ICB7Ci0gICAgcmV0dXJuIHBhcmNlbC0+d3JpdGVCeXRlVmVjdG9yKCp0aGlzKTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1zdGF0dXNfdCBQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcjo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiAvKnBhcmNlbCovKSB7Ci0gICAgQUxPR0UoIkNBUGx1Z2luRGVzY3JpcHRvcjo6cmVhZEZyb21QYXJjZWwoKSBzaG91bGRuJ3QgYmUgY2FsbGVkIik7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcjo6d3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3QgewotICAgIHN0YXR1c190IGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtQ0FTeXN0ZW1JZCk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICByZXR1cm4gcGFyY2VsLT53cml0ZVN0cmluZzE2KG1OYW1lKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgTWVkaWFDYXMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotbmFtZXNwYWNlIE1lZGlhRGVzY3JhbWJsZXIgewotCi1EZXNjcmFtYmxlSW5mbzo6RGVzY3JhbWJsZUluZm8oKSB7fQotCi1EZXNjcmFtYmxlSW5mbzo6fkRlc2NyYW1ibGVJbmZvKCkge30KLQotc3RhdHVzX3QgRGVzY3JhbWJsZUluZm86OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoKGludDMyX3QqKSZkc3RUeXBlKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGlmIChkc3RUeXBlICE9IGtEZXN0aW5hdGlvblR5cGVOYXRpdmVIYW5kbGUKLSAgICAgICAgICAgICYmIGRzdFR5cGUgIT0ga0Rlc3RpbmF0aW9uVHlwZVZtUG9pbnRlcikgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIGVyciA9IHBhcmNlbC0+cmVhZEludDMyKChpbnQzMl90Kikmc2NyYW1ibGluZ0NvbnRyb2wpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSBwYXJjZWwtPnJlYWRVaW50MzIoKHVpbnQzMl90KikmbnVtU3ViU2FtcGxlcyk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBpZiAobnVtU3ViU2FtcGxlcyA+IDB4ZmZmZikgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIHN1YlNhbXBsZXMgPSBuZXcgRGVzY3JhbWJsZXJQbHVnaW46OlN1YlNhbXBsZVtudW1TdWJTYW1wbGVzXTsKLSAgICBpZiAoc3ViU2FtcGxlcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdWJTYW1wbGVzOyBpKyspIHsKLSAgICAgICAgZXJyID0gcGFyY2VsLT5yZWFkVWludDMyKCZzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mQ2xlYXJEYXRhKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBlcnIgPSBwYXJjZWwtPnJlYWRVaW50MzIoJnN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHNyY01lbSA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHBhcmNlbC0+cmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICBpZiAoc3JjTWVtID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmc3JjT2Zmc2V0KTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbmF0aXZlX2hhbmRsZV90ICpuYXRpdmVIYW5kbGUgPSBOVUxMOwotICAgIGlmIChkc3RUeXBlID09IGtEZXN0aW5hdGlvblR5cGVOYXRpdmVIYW5kbGUpIHsKLSAgICAgICAgbmF0aXZlSGFuZGxlID0gcGFyY2VsLT5yZWFkTmF0aXZlSGFuZGxlKCk7Ci0gICAgICAgIGRzdFB0ciA9IHN0YXRpY19jYXN0PHZvaWQgKj4obmF0aXZlSGFuZGxlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBkc3RQdHIgPSBOVUxMOwotICAgIH0KLQotICAgIGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZkc3RPZmZzZXQpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERlc2NyYW1ibGVJbmZvOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCB7Ci0gICAgaWYgKGRzdFR5cGUgIT0ga0Rlc3RpbmF0aW9uVHlwZU5hdGl2ZUhhbmRsZQotICAgICAgICAgICAgJiYgZHN0VHlwZSAhPSBrRGVzdGluYXRpb25UeXBlVm1Qb2ludGVyKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KWRzdFR5cGUpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIoc2NyYW1ibGluZ0NvbnRyb2wpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSBwYXJjZWwtPndyaXRlVWludDMyKG51bVN1YlNhbXBsZXMpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVN1YlNhbXBsZXM7IGkrKykgewotICAgICAgICBlcnIgPSBwYXJjZWwtPndyaXRlVWludDMyKHN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZDbGVhckRhdGEpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIGVyciA9IHBhcmNlbC0+d3JpdGVVaW50MzIoc3ViU2FtcGxlc1tpXS5tTnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZXJyID0gcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihzcmNNZW0pKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKHNyY09mZnNldCk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChkc3RUeXBlID09IGtEZXN0aW5hdGlvblR5cGVOYXRpdmVIYW5kbGUpIHsKLSAgICAgICAgcGFyY2VsLT53cml0ZU5hdGl2ZUhhbmRsZShzdGF0aWNfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4oZHN0UHRyKSk7Ci0gICAgfQotCi0gICAgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKGRzdE9mZnNldCk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotfSAvLyBuYW1lc3BhY2UgTWVkaWFEZXNjcmFtYmxlcgotCi19IC8vIG5hbWVzcGFjZSBtZWRpYQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vUGx1Z2luTWV0cmljc1JlcG9ydGluZy5jcHAgYi9kcm0vbGlibWVkaWFkcm0vUGx1Z2luTWV0cmljc1JlcG9ydGluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdmZjViOAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJtZWRpYWRybS9QbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmNwcApAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiUGx1Z2luTWV0cmljc1JlcG9ydGluZyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuaD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgorCisjaW5jbHVkZSAicHJvdG9zL3BsdWdpbl9tZXRyaWNzLnBiLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKwordXNpbmcgYW5kcm9pZDo6ZHJtX21ldHJpY3M6Ok1ldHJpY3NHcm91cDsKK3VzaW5nIGFuZHJvaWQ6OmRybV9tZXRyaWNzOjpNZXRyaWNzR3JvdXBfTWV0cmljOwordXNpbmcgYW5kcm9pZDo6ZHJtX21ldHJpY3M6Ok1ldHJpY3NHcm91cF9NZXRyaWNfTWV0cmljVmFsdWU7CisKK2NvbnN0IGNoYXIqIGNvbnN0IGtQYXJlbnRBdHRyaWJ1dGUgPSAiL3BhcmVudC9leHRlcm5hbCI7CisKK3N0YXR1c190IHJlcG9ydE1ldHJpY3NHcm91cChjb25zdCBNZXRyaWNzR3JvdXAmIG1ldHJpY3NHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBiYXRjaE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCogcGFyZW50SWQpIHsKKyAgICBNZWRpYUFuYWx5dGljc0l0ZW0gYW5hbHl0aWNzSXRlbShiYXRjaE5hbWUuY19zdHIoKSk7CisgICAgYW5hbHl0aWNzSXRlbS5nZW5lcmF0ZVNlc3Npb25JRCgpOworICAgIGludDY0X3Qgc2Vzc2lvbklkID0gYW5hbHl0aWNzSXRlbS5nZXRTZXNzaW9uSUQoKTsKKyAgICBpZiAocGFyZW50SWQgIT0gTlVMTCkgeworICAgICAgICBhbmFseXRpY3NJdGVtLnNldEludDY0KGtQYXJlbnRBdHRyaWJ1dGUsICpwYXJlbnRJZCk7CisgICAgfQorCisgICAgLy8gUmVwb3J0IHRoZSBwYWNrYWdlIG5hbWUuCisgICAgaWYgKG1ldHJpY3NHcm91cC5oYXNfYXBwX3BhY2thZ2VfbmFtZSgpKSB7CisgICAgICBBU3RyaW5nIGFwcF9wYWNrYWdlX25hbWUobWV0cmljc0dyb3VwLmFwcF9wYWNrYWdlX25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3NHcm91cC5hcHBfcGFja2FnZV9uYW1lKCkuc2l6ZSgpKTsKKyAgICAgIGFuYWx5dGljc0l0ZW0uc2V0UGtnTmFtZShhcHBfcGFja2FnZV9uYW1lKTsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldHJpY3NHcm91cC5tZXRyaWNfc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgTWV0cmljc0dyb3VwX01ldHJpYyYgbWV0cmljID0gbWV0cmljc0dyb3VwLm1ldHJpYyhpKTsKKyAgICAgICAgaWYgKCFtZXRyaWMuaGFzX25hbWUoKSkgeworICAgICAgICAgICAgQUxPR0UoIk1ldHJpYyB3aXRoIG5vIG5hbWUuIik7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtZXRyaWMuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJNZXRyaWMgd2l0aCBubyB2YWx1ZS4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBNZXRyaWNzR3JvdXBfTWV0cmljX01ldHJpY1ZhbHVlJiB2YWx1ZSA9IG1ldHJpYy52YWx1ZSgpOworICAgICAgICBpZiAodmFsdWUuaGFzX2ludF92YWx1ZSgpKSB7CisgICAgICAgICAgICBhbmFseXRpY3NJdGVtLnNldEludDY0KG1ldHJpYy5uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuaW50X3ZhbHVlKCkpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmhhc19kb3VibGVfdmFsdWUoKSkgeworICAgICAgICAgICAgYW5hbHl0aWNzSXRlbS5zZXREb3VibGUobWV0cmljLm5hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuZG91YmxlX3ZhbHVlKCkpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmhhc19zdHJpbmdfdmFsdWUoKSkgeworICAgICAgICAgICAgYW5hbHl0aWNzSXRlbS5zZXRDU3RyaW5nKG1ldHJpYy5uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5zdHJpbmdfdmFsdWUoKS5jX3N0cigpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJNZXRyaWMgVmFsdWUgd2l0aCBubyBhY3R1YWwgdmFsdWUuIik7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisgICAgYW5hbHl0aWNzSXRlbS5zZXRGaW5hbGl6ZWQodHJ1ZSk7CisgICAgaWYgKCFhbmFseXRpY3NJdGVtLnNlbGZyZWNvcmQoKSkgeworICAgICAgLy8gTm90ZSB0aGUgY2FzdCB0byBpbnQgaXMgYmVjYXVzZSB3ZSBidWlsZCBvbiAzMiBhbmQgNjQgYml0LgorICAgICAgLy8gVGhlIGNhc3QgcHJldmVudHMgYSBwZWN1bGlhciBwcmludGYgcHJvYmxlbSB3aGVyZSBvbmUgZm9ybWF0IGNhbm5vdAorICAgICAgLy8gc2F0aXNmeSBib3RoLgorICAgICAgQUxPR0UoInNlbGZyZWNvcmQoKSByZXR1cm5lZCBmYWxzZS4gc2Vzc2lvSWQgJWQiLCAoaW50KSBzZXNzaW9uSWQpOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0cmljc0dyb3VwLm1ldHJpY19zdWJfZ3JvdXBfc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgTWV0cmljc0dyb3VwJiBzdWJHcm91cCA9IG1ldHJpY3NHcm91cC5tZXRyaWNfc3ViX2dyb3VwKGkpOworICAgICAgICBzdGF0dXNfdCByZXMgPSByZXBvcnRNZXRyaWNzR3JvdXAoc3ViR3JvdXAsIGJhdGNoTmFtZSwgJnNlc3Npb25JZCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK1N0cmluZzggc2FuaXRpemUoY29uc3QgU3RyaW5nOCYgaW5wdXQpIHsKKyAgICAvLyBGaWx0ZXJzIHRoZSBpbnB1dCBzdHJpbmcgZG93biB0byBqdXN0IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLgorICAgIFN0cmluZzggb3V0cHV0OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5wdXQuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY2hhciBjYW5kaWRhdGUgPSBpbnB1dFtpXTsKKyAgICAgICAgaWYgKChjYW5kaWRhdGUgPj0gJ2EnICYmIGNhbmRpZGF0ZSA8PSAneicpIHx8CisgICAgICAgICAgICAgICAgKGNhbmRpZGF0ZSA+PSAnQScgJiYgY2FuZGlkYXRlIDw9ICdaJykgfHwKKyAgICAgICAgICAgICAgICAoY2FuZGlkYXRlID49ICcwJyAmJiBjYW5kaWRhdGUgPD0gJzknKSkgeworICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgmY2FuZGlkYXRlLCAxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gb3V0cHV0OworfQorCit9ICAvLyBuYW1lc3BhY2UKKworc3RhdHVzX3QgcmVwb3J0RHJtUGx1Z2luTWV0cmljcyhjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlcmlhbGl6ZWRNZXRyaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiB2ZW5kb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGRlc2NyaXB0aW9uKSB7CisgICAgTWV0cmljc0dyb3VwIHJvb3RfbWV0cmljc19ncm91cDsKKyAgICBpZiAoIXJvb3RfbWV0cmljc19ncm91cC5QYXJzZUZyb21BcnJheShzZXJpYWxpemVkTWV0cmljcy5hcnJheSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRNZXRyaWNzLnNpemUoKSkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWx1cmUgdG8gcGFyc2UuIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgU3RyaW5nOCBuYW1lID0gU3RyaW5nODo6Zm9ybWF0KCJkcm0udmVuZG9yLiVzLiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FuaXRpemUodmVuZG9yKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW5pdGl6ZShkZXNjcmlwdGlvbikuY19zdHIoKSk7CisKKyAgICByZXR1cm4gcmVwb3J0TWV0cmljc0dyb3VwKHJvb3RfbWV0cmljc19ncm91cCwgbmFtZSwgTlVMTCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lDYXMuYWlkbCBiL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSUNhcy5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzQ2NTkzLi4wMDAwMDAwCi0tLSBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSUNhcy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDYXM7Ci0KLS8qKiBAaGlkZSAqLwotaW50ZXJmYWNlIElDYXMgewotICAgIHZvaWQgc2V0UHJpdmF0ZURhdGEoaW4gYnl0ZVtdIHB2dERhdGEpOwotICAgIGJ5dGVbXSBvcGVuU2Vzc2lvbigpOwotICAgIHZvaWQgY2xvc2VTZXNzaW9uKGluIGJ5dGVbXSBzZXNzaW9uSWQpOwotICAgIHZvaWQgc2V0U2Vzc2lvblByaXZhdGVEYXRhKGluIGJ5dGVbXSBzZXNzaW9uSWQsIGluIGJ5dGVbXSBwdnREYXRhKTsKLSAgICB2b2lkIHByb2Nlc3NFY20oaW4gYnl0ZVtdIHNlc3Npb25JZCwgaW4gTWVkaWFDYXMuUGFyY2VsYWJsZUNhc0RhdGEgZWNtKTsKLSAgICB2b2lkIHByb2Nlc3NFbW0oaW4gTWVkaWFDYXMuUGFyY2VsYWJsZUNhc0RhdGEgZW1tKTsKLSAgICB2b2lkIHNlbmRFdmVudChpbnQgZXZlbnQsIGludCBhcmcsIGluIEBudWxsYWJsZSBieXRlW10gZXZlbnREYXRhKTsKLSAgICB2b2lkIHByb3Zpc2lvbihTdHJpbmcgcHJvdmlzaW9uU3RyaW5nKTsKLSAgICB2b2lkIHJlZnJlc2hFbnRpdGxlbWVudHMoaW50IHJlZnJlc2hUeXBlLCBpbiBAbnVsbGFibGUgYnl0ZVtdIHJlZnJlc2hEYXRhKTsKLSAgICB2b2lkIHJlbGVhc2UoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYUNhc1NlcnZpY2UuYWlkbCBiL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhQ2FzU2VydmljZS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGY2ODI1Li4wMDAwMDAwCi0tLSBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhQ2FzU2VydmljZS5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEuSURlc2NyYW1ibGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuSUNhczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLklDYXNMaXN0ZW5lcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ2FzOwotCi0vKiogQGhpZGUgKi8KLWludGVyZmFjZSBJTWVkaWFDYXNTZXJ2aWNlIHsKLSAgICBNZWRpYUNhcy5QYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcltdIGVudW1lcmF0ZVBsdWdpbnMoKTsKLSAgICBib29sZWFuIGlzU3lzdGVtSWRTdXBwb3J0ZWQoaW50IENBX3N5c3RlbV9pZCk7Ci0gICAgSUNhcyBjcmVhdGVQbHVnaW4oaW50IENBX3N5c3RlbV9pZCwgSUNhc0xpc3RlbmVyIGxpc3RlbmVyKTsKLSAgICBib29sZWFuIGlzRGVzY3JhbWJsZXJTdXBwb3J0ZWQoaW50IENBX3N5c3RlbV9pZCk7Ci0gICAgSURlc2NyYW1ibGVyIGNyZWF0ZURlc2NyYW1ibGVyKGludCBDQV9zeXN0ZW1faWQpOwotfQotCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhQ2FzLmFpZGwgYi9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhQ2FzLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOGQwYzYuLjAwMDAwMDAKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYUNhcy5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqIEBoaWRlICovCi1wYXJjZWxhYmxlIE1lZGlhQ2FzLlBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yIGNwcF9oZWFkZXIgIm1lZGlhL01lZGlhQ2FzRGVmcy5oIjsKLQotLyoqIEBoaWRlICovCi1wYXJjZWxhYmxlIE1lZGlhQ2FzLlBhcmNlbGFibGVDYXNEYXRhIGNwcF9oZWFkZXIgIm1lZGlhL01lZGlhQ2FzRGVmcy5oIjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhRGVzY3JhbWJsZXIuYWlkbCBiL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFEZXNjcmFtYmxlci5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzg5MjQ0Li4wMDAwMDAwCi0tLSBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFEZXNjcmFtYmxlci5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqIEBoaWRlICovCi1wYXJjZWxhYmxlIE1lZGlhRGVzY3JhbWJsZXIuRGVzY3JhbWJsZUluZm8gY3BwX2hlYWRlciAibWVkaWEvTWVkaWFDYXNEZWZzLmgiOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9wcm90b3MvcGx1Z2luX21ldHJpY3MucHJvdG8gYi9kcm0vbGlibWVkaWFkcm0vcHJvdG9zL3BsdWdpbl9tZXRyaWNzLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlM2JjZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGlibWVkaWFkcm0vcHJvdG9zL3BsdWdpbl9tZXRyaWNzLnByb3RvCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitzeW50YXggPSAicHJvdG8yIjsKKworcGFja2FnZSBhbmRyb2lkLmRybV9tZXRyaWNzOworCisvLyBuZWVkIHRoaXMgaWYgd2UgYXJlIHVzaW5nIGxpYnByb3RvYnVmLWNwcC0yLjMuMC1saXRlCitvcHRpb24gb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FOworCisvLyBUaGUgTWV0cmljc0dyb3VwIGlzIGEgY29sbGVjdGlvbiBvZiBtZXRyaWMgbmFtZS92YWx1ZSBwYWlyIGluc3RhbmNlcworLy8gdGhhdCBjYW4gYmUgc2VyaWFsaXplZCBhbmQgcHJvdmlkZWQgdG8gYSBjYWxsZXIuCittZXNzYWdlIE1ldHJpY3NHcm91cCB7CisgIG1lc3NhZ2UgTWV0cmljIHsKKyAgICBtZXNzYWdlIE1ldHJpY1ZhbHVlIHsKKyAgICAgIC8vIEV4YWN0bHkgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIG11c3QgYmUgc2V0LgorICAgICAgb3B0aW9uYWwgaW50NjQgaW50X3ZhbHVlID0gMTsKKyAgICAgIG9wdGlvbmFsIGRvdWJsZSBkb3VibGVfdmFsdWUgPSAyOworICAgICAgb3B0aW9uYWwgc3RyaW5nIHN0cmluZ192YWx1ZSA9IDM7CisgICAgfQorCisgICAgLy8gVGhlIG5hbWUgb2YgdGhlIG1ldHJpYy4gTXVzdCBiZSB2YWxpZCBVVEYtOC4gUmVxdWlyZWQuCisgICAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworCisgICAgLy8gVGhlIHZhbHVlIG9mIHRoZSBtZXRyaWMuIFJlcXVpcmVkLgorICAgIG9wdGlvbmFsIE1ldHJpY1ZhbHVlIHZhbHVlID0gMjsKKyAgfQorCisgIC8vIFRoZSBsaXN0IG9mIG5hbWUvdmFsdWUgcGFpcnMgb2YgbWV0cmljcy4KKyAgcmVwZWF0ZWQgTWV0cmljIG1ldHJpYyA9IDE7CisKKyAgLy8gQWxsb3cgbXVsdGlwbGUgc3ViIGdyb3VwcyBvZiBtZXRyaWNzLgorICByZXBlYXRlZCBNZXRyaWNzR3JvdXAgbWV0cmljX3N1Yl9ncm91cCA9IDI7CisKKyAgLy8gTmFtZSBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1ldHJpY3MuCisgIG9wdGlvbmFsIHN0cmluZyBhcHBfcGFja2FnZV9uYW1lID0gMzsKK30KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0FuZHJvaWQubWsgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9BbmRyb2lkLm1rCmluZGV4IDhmZDg2NmMuLjRiMTM5YTggMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0FuZHJvaWQubWsKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQW5kcm9pZC5tawpAQCAtMjgsOCArMjgsNyBAQAogCiBMT0NBTF9NT0RVTEUgOj0gbGliY2xlYXJrZXljYXNwbHVnaW4KIAotI1RPRE86IG1vdmUgdGhpcyBiYWNrIHRvIC92ZW5kb3IvbGliIGFmdGVyIGNvbnZlcnNpb24gdG8gdHJlYmxlCi0jTE9DQUxfUFJPUFJJRVRBUllfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSA6PSB0cnVlCiBMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBtZWRpYWNhcwogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKQEAgLTM5LDYgKzM4LDkgQEAKICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKICAgICBsaWJwcm90b2J1Zi1jcHAtbGl0ZSBcCiAKK0xPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAorICAgIG1lZGlhX3BsdWdpbl9oZWFkZXJzCisKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgIGxpYmpzbW4gXAogCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5jcHAgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5jcHAKaW5kZXggNGVkNWZjZS4uZTI3NjMxZiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlDYXNQbHVnaW4uY3BwCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmNwcApAQCAtMTIxLDcgKzEyMSw3IEBACiAgICAgc3A8Q2xlYXJLZXlDYXNTZXNzaW9uPiBzZXNzaW9uID0KICAgICAgICAgICAgIENsZWFyS2V5U2Vzc2lvbkxpYnJhcnk6OmdldCgpLT5maW5kU2Vzc2lvbihzZXNzaW9uSWQpOwogICAgIGlmIChzZXNzaW9uID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgICAgIHJldHVybiBFUlJPUl9DQVNfU0VTU0lPTl9OT1RfT1BFTkVEOwogICAgIH0KIAogICAgIENsZWFyS2V5U2Vzc2lvbkxpYnJhcnk6OmdldCgpLT5kZXN0cm95U2Vzc2lvbihzZXNzaW9uSWQpOwpAQCAtMTM1LDcgKzEzNSw3IEBACiAgICAgc3A8Q2xlYXJLZXlDYXNTZXNzaW9uPiBzZXNzaW9uID0KICAgICAgICAgICAgIENsZWFyS2V5U2Vzc2lvbkxpYnJhcnk6OmdldCgpLT5maW5kU2Vzc2lvbihzZXNzaW9uSWQpOwogICAgIGlmIChzZXNzaW9uID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgICAgIHJldHVybiBFUlJPUl9DQVNfU0VTU0lPTl9OT1RfT1BFTkVEOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CkBAIC0xNDYsNyArMTQ2LDcgQEAKICAgICBzcDxDbGVhcktleUNhc1Nlc3Npb24+IHNlc3Npb24gPQogICAgICAgICAgICAgQ2xlYXJLZXlTZXNzaW9uTGlicmFyeTo6Z2V0KCktPmZpbmRTZXNzaW9uKHNlc3Npb25JZCk7CiAgICAgaWYgKHNlc3Npb24gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19TRVNTSU9OX05PVF9PUEVORUQ7CiAgICAgfQogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUtleUZldGNoZXJMb2NrKTsKQEAgLTI5Myw3ICsyOTMsNyBAQAogc3RhdHVzX3QgQ2xlYXJLZXlDYXNTZXNzaW9uOjp1cGRhdGVFQ00oCiAgICAgICAgIEtleUZldGNoZXIgKmtleUZldGNoZXIsIHZvaWQgKmVjbSwgc2l6ZV90IHNpemUpIHsKICAgICBpZiAoa2V5RmV0Y2hlciA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fTk9UX1BST1ZJU0lPTkVEOworICAgICAgICByZXR1cm4gRVJST1JfQ0FTX05PVF9QUk9WSVNJT05FRDsKICAgICB9CiAKICAgICBpZiAoc2l6ZSA8IGtFY21IZWFkZXJMZW5ndGgpIHsKQEAgLTM0NCw3ICszNDQsNyBAQAogICAgICAgICBzaXplX3QgbnVtU3ViU2FtcGxlcywgY29uc3QgRGVzY3JhbWJsZXJQbHVnaW46OlN1YlNhbXBsZSAqc3ViU2FtcGxlcywKICAgICAgICAgY29uc3Qgdm9pZCAqc3JjUHRyLCB2b2lkICpkc3RQdHIsIEFTdHJpbmcgKiAvKiBlcnJvckRldGFpbE1zZyAqLykgewogICAgIGlmIChzZWN1cmUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgICAgICByZXR1cm4gRVJST1JfQ0FTX0NBTk5PVF9IQU5ETEU7CiAgICAgfQogCiAgICAgQUVTX0tFWSBjb250ZW50S2V5OwpAQCAtMzU2LDcgKzM1Niw3IEBACiAgICAgICAgIGludDMyX3Qga2V5SW5kZXggPSAoc2NyYW1ibGluZ0NvbnRyb2wgJiAxKTsKICAgICAgICAgaWYgKCFtS2V5SW5mb1trZXlJbmRleF0udmFsaWQpIHsKICAgICAgICAgICAgIEFMT0dFKCJkZWNyeXB0OiBrZXkgJWQgaXMgaW52YWxpZCIsIGtleUluZGV4KTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fREVDUllQVDsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9DQVNfREVDUllQVDsKICAgICAgICAgfQogICAgICAgICBjb250ZW50S2V5ID0gbUtleUluZm9ba2V5SW5kZXhdLmNvbnRlbnRLZXk7CiAgICAgfQpAQCAtNDIwLDcgKzQyMCw3IEBACiAKICAgICBpZiAoc2Vzc2lvbiA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJDbGVhcktleURlc2NyYW1ibGVyUGx1Z2luOiBzZXNzaW9uIG5vdCBmb3VuZCIpOwotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19TRVNTSU9OX05PVF9PUEVORUQ7CiAgICAgfQogCiAgICAgbUNBU1Nlc3Npb24gPSBzZXNzaW9uOwpAQCAtNDQ2LDcgKzQ0Niw3IEBACiAKICAgICBpZiAobUNBU1Nlc3Npb24gPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiVW5pbml0aWFsaXplZCBDQVMgc2Vzc2lvbiEiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVEOworICAgICAgICByZXR1cm4gRVJST1JfQ0FTX0RFQ1JZUFRfVU5JVF9OT1RfSU5JVElBTElaRUQ7CiAgICAgfQogCiAgICAgcmV0dXJuIG1DQVNTZXNzaW9uLT5kZWNyeXB0KApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvSnNvbkFzc2V0TG9hZGVyLmNwcCBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0pzb25Bc3NldExvYWRlci5jcHAKaW5kZXggOWNkNzdlOS4uNmUxMDA0YyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvSnNvbkFzc2V0TG9hZGVyLmNwcAorKysgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9Kc29uQXNzZXRMb2FkZXIuY3BwCkBAIC00OCwyNCArNDgsMjQgQEAKICAqIEV4dHJhY3QgYSBjbGVhciBrZXkgYXNzZXQgZnJvbSBhIEpTT04gc3RyaW5nLgogICoKICAqIFJldHVybnMgT0sgaWYgYSBjbGVhciBrZXkgYXNzZXQgaXMgZXh0cmFjdGVkIHN1Y2Nlc3NmdWxseSwKLSAqIG9yIEVSUk9SX0RSTV9OT19MSUNFTlNFIGlmIHRoZSBzdHJpbmcgZG9lc24ndCBjb250YWluIGEgdmFsaWQKKyAqIG9yIEVSUk9SX0NBU19OT19MSUNFTlNFIGlmIHRoZSBzdHJpbmcgZG9lc24ndCBjb250YWluIGEgdmFsaWQKICAqIGNsZWFyIGtleSBhc3NldC4KICAqLwogc3RhdHVzX3QgSnNvbkFzc2V0TG9hZGVyOjpleHRyYWN0QXNzZXRGcm9tU3RyaW5nKAogICAgICAgICBjb25zdCBTdHJpbmc4JiBqc29uQXNzZXRTdHJpbmcsIEFzc2V0ICphc3NldCkgewogICAgIGlmICghcGFyc2VKc29uQXNzZXRTdHJpbmcoanNvbkFzc2V0U3RyaW5nLCAmbUpzb25PYmplY3RzKSkgewotICAgICAgICByZXR1cm4gRVJST1JfRFJNX05PX0xJQ0VOU0U7CisgICAgICAgIHJldHVybiBFUlJPUl9DQVNfTk9fTElDRU5TRTsKICAgICB9CiAKICAgICBpZiAobUpzb25PYmplY3RzLnNpemUoKSA8IDEpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9OT19MSUNFTlNFOworICAgICAgICByZXR1cm4gRVJST1JfQ0FTX05PX0xJQ0VOU0U7CiAgICAgfQogCiAgICAgaWYgKCFwYXJzZUpzb25PYmplY3QobUpzb25PYmplY3RzWzBdLCAmbVRva2VucykpCi0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fTk9fTElDRU5TRTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19OT19MSUNFTlNFOwogCiAgICAgaWYgKCFmaW5kS2V5KG1Kc29uT2JqZWN0c1swXSwgYXNzZXQpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fTk9fTElDRU5TRTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19OT19MSUNFTlNFOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9lY21fZ2VuZXJhdG9yLmggYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9lY21fZ2VuZXJhdG9yLmgKaW5kZXggMmVmMDZjNC4uNWZiZGVhNSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvZWNtX2dlbmVyYXRvci5oCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L2VjbV9nZW5lcmF0b3IuaApAQCAtMjksNyArMjksNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGNsZWFya2V5Y2FzIHsKIGVudW0gewotICAgIENMRUFSS0VZX1NUQVRVU19CQVNFID0gRVJST1JfRFJNX1ZFTkRPUl9NQVgsCisgICAgQ0xFQVJLRVlfU1RBVFVTX0JBU0UgPSBFUlJPUl9DQVNfVkVORE9SX01BWCwKICAgICBDTEVBUktFWV9TVEFUVVNfSU5WQUxJREFTU0VUSUQgPSBDTEVBUktFWV9TVEFUVVNfQkFTRSAtIDEsCiAgICAgQ0xFQVJLRVlfU1RBVFVTX0lOVkFMSURTWVNURU1JRCA9IENMRUFSS0VZX1NUQVRVU19CQVNFIC0gMiwKICAgICBDTEVBUktFWV9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVIgPSBDTEVBUktFWV9TVEFUVVNfQkFTRSAtIDMsCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLm1rIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQW5kcm9pZC5tawppbmRleCBjYmY3YmU3Li5lMTU0NWFmIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0FuZHJvaWQubWsKQEAgLTIxLDEyICsyMSwxMyBAQAogICAgIENsZWFyS2V5RmV0Y2hlclRlc3QuY3BwCiAKIExPQ0FMX01PRFVMRSA6PSBDbGVhcktleUZldGNoZXJUZXN0CitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKIAogIyBMT0NBTF9MREZMQUdTIGlzIG5lZWRlZCBoZXJlIGZvciB0aGUgdGVzdCB0byB1c2UgdGhlIHBsdWdpbiwgYmVjYXVzZQogIyB0aGUgcGx1Z2luIGlzIG5vdCBpbiBzdGFuZGFyZCBsaWJyYXJ5IHNlYXJjaCBwYXRoLiBXaXRob3V0IHRoaXMgLnNvCiAjIGxvYWRpbmcgZmFpbHMgYXQgcnVuLXRpbWUgKGxpbmtpbmcgaXMgb2theSkuCiBMT0NBTF9MREZMQUdTIDo9IFwKLSAgICAtV2wsLS1ycGF0aCxcJCR7T1JJR0lOfS8uLi8uLi8uLi9zeXN0ZW0vbGliL21lZGlhY2FzIC1XbCwtLWVuYWJsZS1uZXctZHRhZ3MKKyAgICAtV2wsLS1ycGF0aCxcJCR7T1JJR0lOfS8uLi8uLi8uLi9zeXN0ZW0vdmVuZG9yL2xpYi9tZWRpYWNhcyAtV2wsLS1lbmFibGUtbmV3LWR0YWdzCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgIGxpYnV0aWxzIGxpYmNsZWFya2V5Y2FzcGx1Z2luIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGlicHJvdG9idWYtY3BwLWxpdGUgbGlibG9nCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL0FuZHJvaWQubWsgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL0FuZHJvaWQubWsKaW5kZXggYTk3ZmFjNi4uYTFkNjFkYSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9BbmRyb2lkLm1rCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svQW5kcm9pZC5tawpAQCAtMjgsNiArMjgsOCBAQAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgbGlidXRpbHMgbGlibG9nCiAKK0xPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gbWVkaWFfcGx1Z2luX2hlYWRlcnMKKwogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvaW5jbHVkZSBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEgXApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlVVUlELmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5VVVJRC5jcHAKaW5kZXggZWQwNTBmNy4uMDI1OWE0MiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlVVUlELmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVVVSUQuY3BwCkBAIC0yMSwxMiArMjEsMTkgQEAKIG5hbWVzcGFjZSBjbGVhcmtleWRybSB7CiAKIGJvb2wgaXNDbGVhcktleVVVSUQoY29uc3QgdWludDhfdCB1dWlkWzE2XSkgewotICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtDbGVhcktleVVVSURbMTZdID0geworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtDb21tb25Qc3NoQm94VVVJRFsxNl0gPSB7CiAgICAgICAgIDB4MTAsMHg3NywweEVGLDB4RUMsMHhDMCwweEIyLDB4NEQsMHgwMiwKICAgICAgICAgMHhBQywweEUzLDB4M0MsMHgxRSwweDUyLDB4RTIsMHhGQiwweDRCCiAgICAgfTsKIAotICAgIHJldHVybiAhbWVtY21wKHV1aWQsIGtDbGVhcktleVVVSUQsIHNpemVvZihrQ2xlYXJLZXlVVUlEKSk7CisgICAgLy8gVG8gYmUgdXNlZCBpbiBtcGQgdG8gc3BlY2lmeSBkcm0gc2NoZW1lIGZvciBwbGF5ZXJzCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0NsZWFyS2V5VVVJRFsxNl0gPSB7CisgICAgICAgIDB4RTIsMHg3MSwweDlELDB4NTgsMHhBOSwweDg1LDB4QjMsMHhDOSwKKyAgICAgICAgMHg3OCwweDFBLDB4QjAsMHgzMCwweEFGLDB4NzgsMHhEMywweDBFCisgICAgfTsKKworICAgIHJldHVybiAhbWVtY21wKHV1aWQsIGtDb21tb25Qc3NoQm94VVVJRCwgc2l6ZW9mKGtDb21tb25Qc3NoQm94VVVJRCkpIHx8CisgICAgICAgICAgICFtZW1jbXAodXVpZCwga0NsZWFyS2V5VVVJRCwgc2l6ZW9mKGtDbGVhcktleVVVSUQpKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1QbHVnaW4uY3BwCmluZGV4IDVmZGFjNWMuLmVjMDdkODcgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtUGx1Z2luLmNwcApAQCAtMjUsMTAgKzI1LDI4IEBACiAKICNpbmNsdWRlICJTZXNzaW9uLmgiCiAKK25hbWVzcGFjZSB7Citjb25zdCBhbmRyb2lkOjpTdHJpbmc4IGtTdHJlYW1pbmcoIlN0cmVhbWluZyIpOworY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrT2ZmbGluZSgiT2ZmbGluZSIpOworY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrVHJ1ZSgiVHJ1ZSIpOworCitjb25zdCBhbmRyb2lkOjpTdHJpbmc4IGtRdWVyeUtleUxpY2Vuc2VUeXBlKCJMaWNlbnNlVHlwZSIpOworICAgIC8vIFZhbHVlOiAiU3RyZWFtaW5nIiBvciAiT2ZmbGluZSIKK2NvbnN0IGFuZHJvaWQ6OlN0cmluZzgga1F1ZXJ5S2V5UGxheUFsbG93ZWQoIlBsYXlBbGxvd2VkIik7CisgICAgLy8gVmFsdWU6ICJUcnVlIiBvciAiRmFsc2UiCitjb25zdCBhbmRyb2lkOjpTdHJpbmc4IGtRdWVyeUtleVJlbmV3QWxsb3dlZCgiUmVuZXdBbGxvd2VkIik7CisgICAgLy8gVmFsdWU6ICJUcnVlIiBvciAiRmFsc2UiCit9OworCiBuYW1lc3BhY2UgY2xlYXJrZXlkcm0gewogCiB1c2luZyBhbmRyb2lkOjpzcDsKIAorRHJtUGx1Z2luOjpEcm1QbHVnaW4oU2Vzc2lvbkxpYnJhcnkqIHNlc3Npb25MaWJyYXJ5KQorICAgICAgICA6IG1TZXNzaW9uTGlicmFyeShzZXNzaW9uTGlicmFyeSkgeworICAgIG1QbGF5UG9saWN5LmNsZWFyKCk7Cit9CisKIHN0YXR1c190IERybVBsdWdpbjo6b3BlblNlc3Npb24oVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKICAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5jcmVhdGVTZXNzaW9uKCk7CiAgICAgc2Vzc2lvbklkID0gc2Vzc2lvbi0+c2Vzc2lvbklkKCk7CkBAIC02MCwxOCArNzgsMjggQEAKICAgICBpZiAoc2NvcGUuc2l6ZSgpID09IDApIHsKICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKICAgICB9CisKICAgICBpZiAoa2V5VHlwZSAhPSBrS2V5VHlwZV9TdHJlYW1pbmcpIHsKICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwogICAgIH0KKwogICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX0luaXRpYWw7CiAgICAgZGVmYXVsdFVybC5jbGVhcigpOwogICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHNjb3BlKTsKICAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CiAgICAgfQorCiAgICAgcmV0dXJuIHNlc3Npb24tPmdldEtleVJlcXVlc3QoaW5pdERhdGEsIG1pbWVUeXBlLCAmcmVxdWVzdCk7CiB9CiAKK3ZvaWQgRHJtUGx1Z2luOjpzZXRQbGF5UG9saWN5KCkgeworICAgIG1QbGF5UG9saWN5LmNsZWFyKCk7CisgICAgbVBsYXlQb2xpY3kuYWRkKGtRdWVyeUtleUxpY2Vuc2VUeXBlLCBrU3RyZWFtaW5nKTsKKyAgICBtUGxheVBvbGljeS5hZGQoa1F1ZXJ5S2V5UGxheUFsbG93ZWQsIGtUcnVlKTsKKyAgICBtUGxheVBvbGljeS5hZGQoa1F1ZXJ5S2V5UmVuZXdBbGxvd2VkLCBrVHJ1ZSk7Cit9CisKIHN0YXR1c190IERybVBsdWdpbjo6cHJvdmlkZUtleVJlc3BvbnNlKAogICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNjb3BlLAogICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHJlc3BvbnNlLApAQCAtODMsNiArMTExLDggQEAKICAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CiAgICAgfQorCisgICAgc2V0UGxheVBvbGljeSgpOwogICAgIHN0YXR1c190IHJlcyA9IHNlc3Npb24tPnByb3ZpZGVLZXlSZXNwb25zZShyZXNwb25zZSk7CiAgICAgaWYgKHJlcyA9PSBhbmRyb2lkOjpPSykgewogICAgICAgICAvLyBUaGlzIGlzIGZvciB0ZXN0aW5nIEFNZWRpYURybV9zZXRPbkV2ZW50TGlzdGVuZXIgb25seS4KQEAgLTExMSw0ICsxNDEsMTggQEAKICAgICByZXR1cm4gYW5kcm9pZDo6T0s7CiB9CiAKK3N0YXR1c190IERybVBsdWdpbjo6cXVlcnlLZXlTdGF0dXMoCisgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiYgaW5mb01hcCkgY29uc3QgeworCisgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOworICAgIH0KKworICAgIGluZm9NYXAuY2xlYXIoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5UG9saWN5LnNpemUoKTsgKytpKSB7CisgICAgICAgIGluZm9NYXAuYWRkKG1QbGF5UG9saWN5LmtleUF0KGkpLCBtUGxheVBvbGljeS52YWx1ZUF0KGkpKTsKKyAgICB9CisgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOworfQogfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1QbHVnaW4uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5oCmluZGV4IDU4NDIxYjkuLmYzN2E3MDYgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5oCkBAIC0zOSw4ICszOSw4IEBACiAKIGNsYXNzIERybVBsdWdpbiA6IHB1YmxpYyBhbmRyb2lkOjpEcm1QbHVnaW4gewogcHVibGljOgotICAgIGV4cGxpY2l0IERybVBsdWdpbihTZXNzaW9uTGlicmFyeSogc2Vzc2lvbkxpYnJhcnkpCi0gICAgICAgICAgICA6IG1TZXNzaW9uTGlicmFyeShzZXNzaW9uTGlicmFyeSkge30KKyAgICBleHBsaWNpdCBEcm1QbHVnaW4oU2Vzc2lvbkxpYnJhcnkqIHNlc3Npb25MaWJyYXJ5KTsKKwogICAgIHZpcnR1YWwgfkRybVBsdWdpbigpIHt9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5TZXNzaW9uKFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKTsKQEAgLTgxLDEzICs4MSw3IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5S2V5U3RhdHVzKAogICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCi0gICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiYgaW5mb01hcCkgY29uc3QgewotICAgICAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIFVOVVNFRChpbmZvTWFwKTsKLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgIH0KKyAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+JiBpbmZvTWFwKSBjb25zdDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvdmlzaW9uUmVxdWVzdCgKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNlcnRfdHlwZSwKQEAgLTI0OCw5ICsyNDIsMTIgQEAKICAgICB9CiAKIHByaXZhdGU6Ci0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHJtUGx1Z2luKTsKKyAgICB2b2lkIHNldFBsYXlQb2xpY3koKTsKIAorICAgIGFuZHJvaWQ6OktleWVkVmVjdG9yPGFuZHJvaWQ6OlN0cmluZzgsIGFuZHJvaWQ6OlN0cmluZzg+IG1QbGF5UG9saWN5OwogICAgIFNlc3Npb25MaWJyYXJ5KiBtU2Vzc2lvbkxpYnJhcnk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEcm1QbHVnaW4pOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0luaXREYXRhUGFyc2VyLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0luaXREYXRhUGFyc2VyLmNwcAppbmRleCA2YTRmOGQ1Li5jYWZmMzkzIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Jbml0RGF0YVBhcnNlci5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSW5pdERhdGFQYXJzZXIuY3BwCkBAIC0xMzYsNyArMTM2LDcgQEAKICAgICBBU3RyaW5nIGVuY29kZWRJZDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtleUlkcy5zaXplKCk7ICsraSkgewogICAgICAgICBlbmNvZGVkSWQuY2xlYXIoKTsKLSAgICAgICAgYW5kcm9pZDo6ZW5jb2RlQmFzZTY0KGtleUlkc1tpXSwga0tleUlkU2l6ZSwgJmVuY29kZWRJZCk7CisgICAgICAgIGFuZHJvaWQ6OmVuY29kZUJhc2U2NFVybChrZXlJZHNbaV0sIGtLZXlJZFNpemUsICZlbmNvZGVkSWQpOwogICAgICAgICBpZiAoaSAhPSAwKSB7CiAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiLCIpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLmJwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQW5kcm9pZC5icAppbmRleCA5M2ZlYjgwLi5lYTE3YmJiIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTM2LDQgKzM2LDUgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsibWVkaWFfcGx1Z2luX2hlYWRlcnMiXSwKIH0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0luaXREYXRhUGFyc2VyVW5pdHRlc3QuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvSW5pdERhdGFQYXJzZXJVbml0dGVzdC5jcHAKaW5kZXggODRlZDI0Mi4uOGM0OTY1NiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvSW5pdERhdGFQYXJzZXJVbml0dGVzdC5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvSW5pdERhdGFQYXJzZXJVbml0dGVzdC5jcHAKQEAgLTU5LDcgKzU5LDcgQEAKICAgICAgICAgICAgICAgICAgIChzaXplX3QpcmVxdWVzdFN0cmluZy5maW5kKGtSZXF1ZXN0U3VmZml4KSk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXhwZWN0ZWRLZXlzLnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgICBBU3RyaW5nIGVuY29kZWRJZEFTdHJpbmc7Ci0gICAgICAgICAgICBhbmRyb2lkOjplbmNvZGVCYXNlNjQoZXhwZWN0ZWRLZXlzW2ldLCBrS2V5SWRTaXplLAorICAgICAgICAgICAgYW5kcm9pZDo6ZW5jb2RlQmFzZTY0VXJsKGV4cGVjdGVkS2V5c1tpXSwga0tleUlkU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RlZElkQVN0cmluZyk7CiAgICAgICAgICAgICBTdHJpbmc4IGVuY29kZWRJZChlbmNvZGVkSWRBU3RyaW5nLmNfc3RyKCkpOwogICAgICAgICAgICAgZW5jb2RlZElkLnJlbW92ZUFsbChrQmFzZTY0UGFkZGluZyk7CkBAIC0yMzEsNSArMjMxLDQgQEAKIAogICAgIGF0dGVtcHRQYXJzZUV4cGVjdGluZ0ZhaWx1cmUoaW5pdERhdGEsIGtDZW5jTWltZVR5cGUpOwogfQotCiB9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0pzb25XZWJLZXlVbml0dGVzdC5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9Kc29uV2ViS2V5VW5pdHRlc3QuY3BwCmluZGV4IGMzYjBkODQuLmQ5ZjNlYTYgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0pzb25XZWJLZXlVbml0dGVzdC5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvSnNvbldlYktleVVuaXR0ZXN0LmNwcApAQCAtMjg0LDE0ICsyODQsMTQgQEAKICAgICAgICAgICAgICAgICAiXCJrZXlzXCI6IgogICAgICAgICAgICAgICAgICAgICAiW3siCiAgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF4XCIiCi0gICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJTR1ZzYkc4Z1JuSnBaVzVrSVNFXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJTR1ZzYkc4Z1JuSnBaVzVrSUNFLVB3XCIiCiAgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgogICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1cxXCIiCiAgICAgICAgICAgICAgICAgICAgICJ9IgogICAgICAgICAgICAgICAgICAgICAieyIKICAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCiAgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzJcIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIlNHVnNiRzhnUm5KcFpXNWtJUVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiU0dWc2JHOGdSbkpwWlc1a0lDRV9cIiIKICAgICAgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiWTJ4bFlYSnJaWGxyWlhscFpEQXlcIiIKICAgICAgICAgICAgICAgICAgICAgIn0iCiAgICAgICAgICAgICAgICAgICAgICJ7IgpAQCAtMzAzLDcgKzMwMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICJ7IgogICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1czXCIiCiAgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF6XCIiCi0gICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJSMjl2WkNCa1lYa2hcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIlNHVnNiRzhnUHo0LUlFWnlhV1Z1WkNBX1BnXCIiCiAgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgogICAgICAgICAgICAgICAgICAgICAifV0iCiAgICAgICAgICAgICAifSIpOwpAQCAtMzEzLDggKzMxMyw4IEBACiAgICAgRVhQRUNUX1RSVUUoa2V5cy5zaXplKCkgPT0gMyk7CiAKICAgICBjb25zdCBTdHJpbmc4IGNsZWFyS2V5c1tdID0KLSAgICAgICAgICAgIHsgU3RyaW5nOCgiSGVsbG8gRnJpZW5kISEiKSwgU3RyaW5nOCgiSGVsbG8gRnJpZW5kISIpLAotICAgICAgICAgICAgICBTdHJpbmc4KCJHb29kIGRheSEiKSB9OworICAgICAgICAgICAgeyBTdHJpbmc4KCJIZWxsbyBGcmllbmQgIT4/IiksIFN0cmluZzgoIkhlbGxvIEZyaWVuZCAhPyIpLAorICAgICAgICAgICAgICBTdHJpbmc4KCJIZWxsbyA/Pj4gRnJpZW5kID8+IikgfTsKICAgICB2ZXJpZnlLZXlzKGtleXMsIGNsZWFyS2V5cyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svQW5kcm9pZC5icCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svQW5kcm9pZC5icAppbmRleCBmMGExZGRkLi5kZDJhZDdiIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL0FuZHJvaWQuYnAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9BbmRyb2lkLmJwCkBAIC0yMiw2ICsyMiw4IEBACiAgICAgdmVuZG9yOiB0cnVlLAogICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogIm1lZGlhZHJtIiwKIAorICAgIGhlYWRlcl9saWJzOiBbIm1lZGlhX3BsdWdpbl9oZWFkZXJzIl0sCisKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibG9nIiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvT1dORVJTIGIvaW5jbHVkZS9PV05FUlMKaW5kZXggMGVjNzUyOS4uM2NiNmQ5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9PV05FUlMKKysrIGIvaW5jbHVkZS9PV05FUlMKQEAgLTEsNSArMSw2IEBACiBlbGF1cmVudEBnb29nbGUuY29tCiBna2FzdGVuQGFuZHJvaWQuY29tCiBodW5nYUBnb29nbGUuY29tCitqdGlua2VyQGdvb2dsZS5jb20KIGxham9zQGdvb2dsZS5jb20KIG1hcmNvbmVAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb0NsaWVudC5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0NsaWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCBhMDUzMGU0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9DbGllbnQuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9DbGllbnQuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSURlc2NyYW1ibGVyLmFpZGwgYi9pbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmgKc2ltaWxhcml0eSBpbmRleCA2MSUKY29weSBmcm9tIGRybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSURlc2NyYW1ibGVyLmFpZGwKY29weSB0byBpbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmgKaW5kZXggZmRmOTllYi4uOWVmZDc2ZCAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9JRGVzY3JhbWJsZXIuYWlkbAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmgKQEAgLTE0LDE0ICsxNCwyNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYURlc2NyYW1ibGVyOworI2lmbmRlZiBBTkRST0lEX0FVRElPX0NMSUVOVF9ICisjZGVmaW5lIEFORFJPSURfQVVESU9fQ0xJRU5UX0gKIAotLyoqIEBoaWRlICovCi1pbnRlcmZhY2UgSURlc2NyYW1ibGVyIHsKLSAgICB2b2lkIHNldE1lZGlhQ2FzU2Vzc2lvbihpbiBieXRlW10gc2Vzc2lvbklkKTsKLSAgICBib29sZWFuIHJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChTdHJpbmcgbWltZSk7Ci0gICAgaW50IGRlc2NyYW1ibGUoaW4gTWVkaWFEZXNjcmFtYmxlci5EZXNjcmFtYmxlSW5mbyBkZXNjcmFtYmxlSW5mbyk7Ci0gICAgdm9pZCByZWxlYXNlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQXVkaW9DbGllbnQgeworIHB1YmxpYzoKKyAgICBBdWRpb0NsaWVudCgpIDoKKyAgICAgICAgY2xpZW50VWlkKC0xKSwgY2xpZW50UGlkKC0xKSwgcGFja2FnZU5hbWUoIiIpIHt9CisKKyAgICB1aWRfdCBjbGllbnRVaWQ7CisgICAgcGlkX3QgY2xpZW50UGlkOworICAgIFN0cmluZzE2IHBhY2thZ2VOYW1lOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0FVRElPX0NMSUVOVF9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyLmgKaW5kZXggNTBlMTJmNC4uNzcxZjFiOCAxMjAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXIuaApAQCAtMSArMSBAQAotLi4vLi4vbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvQXVkaW9SZXNhbXBsZXIuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKy4uLy4uL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKaW5kZXggMzA5YzIzZC4uY2UzMGE3OCAxMjAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaApAQCAtMSArMSBAQAotLi4vLi4vbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKy4uLy4uL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0Nhc0ltcGwuaCBiL2luY2x1ZGUvbWVkaWEvQ2FzSW1wbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjZmMWNlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvQ2FzSW1wbC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQ0FTX0lNUExfSF8KLSNkZWZpbmUgQ0FTX0lNUExfSF8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0JuQ2FzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBtZWRpYSB7Ci1jbGFzcyBJQ2FzTGlzdGVuZXI7Ci19Ci11c2luZyBuYW1lc3BhY2UgbWVkaWE7Ci11c2luZyBuYW1lc3BhY2UgTWVkaWFDYXM7Ci11c2luZyBiaW5kZXI6OlN0YXR1czsKLXN0cnVjdCBDYXNQbHVnaW47Ci1jbGFzcyBTaGFyZWRMaWJyYXJ5OwotCi1jbGFzcyBDYXNJbXBsIDogcHVibGljIEJuQ2FzIHsKLXB1YmxpYzoKLSAgICBDYXNJbXBsKGNvbnN0IHNwPElDYXNMaXN0ZW5lcj4gJmxpc3RlbmVyKTsKLSAgICB2aXJ0dWFsIH5DYXNJbXBsKCk7Ci0KLSAgICBzdGF0aWMgdm9pZCBPbkV2ZW50KAotICAgICAgICAgICAgdm9pZCAqYXBwRGF0YSwKLSAgICAgICAgICAgIGludDMyX3QgZXZlbnQsCi0gICAgICAgICAgICBpbnQzMl90IGFyZywKLSAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEsCi0gICAgICAgICAgICBzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2b2lkIGluaXQoY29uc3Qgc3A8U2hhcmVkTGlicmFyeT4mIGxpYnJhcnksIENhc1BsdWdpbiAqcGx1Z2luKTsKLSAgICB2b2lkIG9uRXZlbnQoCi0gICAgICAgICAgICBpbnQzMl90IGV2ZW50LAotICAgICAgICAgICAgaW50MzJfdCBhcmcsCi0gICAgICAgICAgICB1aW50OF90ICpkYXRhLAotICAgICAgICAgICAgc2l6ZV90IHNpemUpOwotCi0gICAgLy8gSUNhcyBpbmhlcml0cwotCi0gICAgdmlydHVhbCBTdGF0dXMgc2V0UHJpdmF0ZURhdGEoCi0gICAgICAgICAgICBjb25zdCBDYXNEYXRhJiBwdnREYXRhKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIG9wZW5TZXNzaW9uKENhc1Nlc3Npb25JZCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIGNsb3NlU2Vzc2lvbihjb25zdCBDYXNTZXNzaW9uSWQmIHNlc3Npb25JZCkgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyBzZXRTZXNzaW9uUHJpdmF0ZURhdGEoCi0gICAgICAgICAgICBjb25zdCBDYXNTZXNzaW9uSWQmIHNlc3Npb25JZCwKLSAgICAgICAgICAgIGNvbnN0IENhc0RhdGEmIHB2dERhdGEpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgcHJvY2Vzc0VjbSgKLSAgICAgICAgICAgIGNvbnN0IENhc1Nlc3Npb25JZCYgc2Vzc2lvbklkLCBjb25zdCBQYXJjZWxhYmxlQ2FzRGF0YSYgZWNtKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIHByb2Nlc3NFbW0oY29uc3QgUGFyY2VsYWJsZUNhc0RhdGEmIGVtbSkgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyBzZW5kRXZlbnQoCi0gICAgICAgICAgICBpbnQzMl90IGV2ZW50LCBpbnQzMl90IGFyZywgY29uc3QgOjpzdGQ6OnVuaXF1ZV9wdHI8Q2FzRGF0YT4gJmV2ZW50RGF0YSkgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyBwcm92aXNpb24oY29uc3QgU3RyaW5nMTYmIHByb3Zpc2lvblN0cmluZykgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyByZWZyZXNoRW50aXRsZW1lbnRzKAotICAgICAgICAgICAgaW50MzJfdCByZWZyZXNoVHlwZSwgY29uc3QgOjpzdGQ6OnVuaXF1ZV9wdHI8Q2FzRGF0YT4gJnJlZnJlc2hEYXRhKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIHJlbGVhc2UoKSBvdmVycmlkZTsKLQotcHJpdmF0ZToKLSAgICBzdHJ1Y3QgUGx1Z2luSG9sZGVyOwotICAgIHNwPFNoYXJlZExpYnJhcnk+IG1MaWJyYXJ5OwotICAgIHNwPFBsdWdpbkhvbGRlcj4gbVBsdWdpbkhvbGRlcjsKLSAgICBzcDxJQ2FzTGlzdGVuZXI+IG1MaXN0ZW5lcjsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENhc0ltcGwpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQ0FTX0lNUExfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvRGVzY3JhbWJsZXJJbXBsLmggYi9pbmNsdWRlL21lZGlhL0Rlc2NyYW1ibGVySW1wbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjIxMmFjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvRGVzY3JhbWJsZXJJbXBsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBERVNDUkFNQkxFUl9JTVBMX0hfCi0jZGVmaW5lIERFU0NSQU1CTEVSX0lNUExfSF8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0JuRGVzY3JhbWJsZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotdXNpbmcgbmFtZXNwYWNlIG1lZGlhOwotdXNpbmcgbmFtZXNwYWNlIE1lZGlhRGVzY3JhbWJsZXI7Ci11c2luZyBiaW5kZXI6OlN0YXR1czsKLXN0cnVjdCBEZXNjcmFtYmxlclBsdWdpbjsKLWNsYXNzIFNoYXJlZExpYnJhcnk7Ci0KLWNsYXNzIERlc2NyYW1ibGVySW1wbCA6IHB1YmxpYyBCbkRlc2NyYW1ibGVyIHsKLXB1YmxpYzoKLSAgICBEZXNjcmFtYmxlckltcGwoY29uc3Qgc3A8U2hhcmVkTGlicmFyeT4mIGxpYnJhcnksIERlc2NyYW1ibGVyUGx1Z2luICpwbHVnaW4pOwotICAgIHZpcnR1YWwgfkRlc2NyYW1ibGVySW1wbCgpOwotCi0gICAgdmlydHVhbCBTdGF0dXMgc2V0TWVkaWFDYXNTZXNzaW9uKAotICAgICAgICAgICAgY29uc3QgQ2FzU2Vzc2lvbklkJiBzZXNzaW9uSWQpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgcmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KAotICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG1pbWUsIGJvb2wgKnJlc3VsdCkgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIFN0YXR1cyBkZXNjcmFtYmxlKAotICAgICAgICAgICAgY29uc3QgRGVzY3JhbWJsZUluZm8mIGRlc2NyYW1ibGVJbmZvLCBpbnQzMl90ICpyZXN1bHQpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBTdGF0dXMgcmVsZWFzZSgpIG92ZXJyaWRlOwotCi1wcml2YXRlOgotICAgIHNwPFNoYXJlZExpYnJhcnk+IG1MaWJyYXJ5OwotICAgIERlc2NyYW1ibGVyUGx1Z2luICptUGx1Z2luOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRGVzY3JhbWJsZXJJbXBsKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIERFU0NSQU1CTEVSX0lNUExfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFDYXNEZWZzLmggYi9pbmNsdWRlL21lZGlhL01lZGlhQ2FzRGVmcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzVhOTY3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFDYXNEZWZzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9DQVNfREVGU19IXwotI2RlZmluZSBNRURJQV9DQVNfREVGU19IXwotCi0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPG1lZGlhL2Nhcy9DYXNBUEkuaD4KLSNpbmNsdWRlIDxtZWRpYS9jYXMvRGVzY3JhbWJsZXJBUEkuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLWNsYXNzIElNZW1vcnk7Ci1uYW1lc3BhY2UgbWVkaWEgewotCi1uYW1lc3BhY2UgTWVkaWFDYXMgewotY2xhc3MgUGFyY2VsYWJsZUNhc0RhdGEgOiBwdWJsaWMgQ2FzRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFBhcmNlbGFibGUgewotcHVibGljOgotICAgIFBhcmNlbGFibGVDYXNEYXRhKCkge30KLSAgICBQYXJjZWxhYmxlQ2FzRGF0YShjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgOgotICAgICAgICBDYXNEYXRhKGRhdGEsIGRhdGEgKyBzaXplKSB7fQotICAgIHZpcnR1YWwgflBhcmNlbGFibGVDYXNEYXRhKCkge30KLSAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7Ci0gICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLXByaXZhdGU6Ci0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUGFyY2VsYWJsZUNhc0RhdGEpOwotfTsKLQotY2xhc3MgUGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3IgOiBwdWJsaWMgUGFyY2VsYWJsZSB7Ci1wdWJsaWM6Ci0gICAgUGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3IoaW50MzJfdCBDQV9zeXN0ZW1faWQsIGNvbnN0IGNoYXIgKm5hbWUpCi0gICAgICAgIDogbUNBU3lzdGVtSWQoQ0Ffc3lzdGVtX2lkKSwgbU5hbWUobmFtZSkge30KLQotICAgIFBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yKCkgOiBtQ0FTeXN0ZW1JZCgwKSB7fQotCi0gICAgUGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3IoUGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3ImJiBkZXNjKSA9IGRlZmF1bHQ7Ci0KLSAgICB2aXJ0dWFsIH5QYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcigpIHt9Ci0KLSAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7Ci0gICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLXByaXZhdGU6Ci0gICAgaW50MzJfdCBtQ0FTeXN0ZW1JZDsKLSAgICBTdHJpbmcxNiBtTmFtZTsKLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcik7Ci19OwotfQotCi1uYW1lc3BhY2UgTWVkaWFEZXNjcmFtYmxlciB7Ci1jbGFzcyBEZXNjcmFtYmxlSW5mbyA6IHB1YmxpYyBQYXJjZWxhYmxlIHsKLXB1YmxpYzoKLSAgICBlbnVtIERlc3RpbmF0aW9uVHlwZSB7Ci0gICAgICAgIGtEZXN0aW5hdGlvblR5cGVWbVBvaW50ZXIsICAgIC8vIG5vbi1zZWN1cmUKLSAgICAgICAga0Rlc3RpbmF0aW9uVHlwZU5hdGl2ZUhhbmRsZSAgLy8gc2VjdXJlCi0gICAgfTsKLQotICAgIERlc3RpbmF0aW9uVHlwZSBkc3RUeXBlOwotICAgIERlc2NyYW1ibGVyUGx1Z2luOjpTY3JhbWJsaW5nQ29udHJvbCBzY3JhbWJsaW5nQ29udHJvbDsKLSAgICBzaXplX3QgbnVtU3ViU2FtcGxlczsKLSAgICBEZXNjcmFtYmxlclBsdWdpbjo6U3ViU2FtcGxlICpzdWJTYW1wbGVzOwotICAgIHNwPElNZW1vcnk+IHNyY01lbTsKLSAgICBpbnQzMl90IHNyY09mZnNldDsKLSAgICB2b2lkICpkc3RQdHI7Ci0gICAgaW50MzJfdCBkc3RPZmZzZXQ7Ci0KLSAgICBEZXNjcmFtYmxlSW5mbygpOwotICAgIHZpcnR1YWwgfkRlc2NyYW1ibGVJbmZvKCk7Ci0gICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwotICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwotCi1wcml2YXRlOgotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRGVzY3JhbWJsZUluZm8pOwotfTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgbWVkaWEKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotCi0jZW5kaWYgLy8gTUVESUFfQ0FTX0RFRlNfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvUGx1Z2luTWV0cmljc1JlcG9ydGluZy5oIGIvaW5jbHVkZS9tZWRpYS9QbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uN2Q5YTdhMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvUGx1Z2luTWV0cmljc1JlcG9ydGluZy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvUGx1Z2luTWV0cmljc1JlcG9ydGluZy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbCBiL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwKaW5kZXggMzdlMmMzOS4uZjQwMDU4MiAxMjAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbAorKysgYi9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsCkBAIC0xICsxIEBACi0uLi8uLi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorLi4vLi4vbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvIGIvaW5jbHVkZS9tZWRpYS9uYmFpbwpkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggNjdkMGJhNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNTU4NDFlNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5mNWJjYzc2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi40M2JmYWM1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU2luay5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU2luay5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjhhMTNiNmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTaW5rLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU2luay5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU291cmNlLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4yNzUwZmRlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU291cmNlLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU291cmNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL01vbm9QaXBlLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL01vbm9QaXBlLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNGVhNDNiZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTW9ub1BpcGUuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlX21vbm8vbWVkaWEvbmJhaW8vTW9ub1BpcGUuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vTW9ub1BpcGVSZWFkZXIuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTW9ub1BpcGVSZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4zMGY0MjZjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9Nb25vUGlwZVJlYWRlci5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9Nb25vUGlwZVJlYWRlci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkFJTy5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkFJTy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmZmNmExNTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL05CQUlPLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZV9tb25vL21lZGlhL25iYWlvL05CQUlPLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYzM1NDAxZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGVyZm9ybWFuY2VBbmFseXNpcy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjdhY2ZjOTAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYTRiYmJjOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlUmVhZGVyLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGVSZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi42NGIyMWNmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlUmVhZGVyLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlUmVhZGVyLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjc0YTNiMDYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdm5kay94bWxwYXJzZXIvMS4wL01lZGlhQ29kZWNzWG1sUGFyc2VyLmggYi9pbmNsdWRlL21lZGlhL3ZuZGsveG1scGFyc2VyLzEuMC9NZWRpYUNvZGVjc1htbFBhcnNlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzI0Y2Q4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvdm5kay94bWxwYXJzZXIvMS4wL01lZGlhQ29kZWNzWG1sUGFyc2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9DT0RFQ1NfWE1MX1BBUlNFUl9IXwotCi0jZGVmaW5lIE1FRElBX0NPREVDU19YTUxfUEFSU0VSX0hfCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBBTWVzc2FnZTsKLQotLy8gUXVpcmsgc3RpbGwgc3VwcG9ydGVkLCBldmVuIHRob3VnaCBkZXByZWNhdGVkCi1lbnVtIFF1aXJrcyB7Ci0gICAga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbklucHV0UG9ydHMgICA9IDEsCi0gICAga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbk91dHB1dFBvcnRzICA9IDIsCi0KLSAgICBrUXVpcmtzTWFzayA9IGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25JbnB1dFBvcnRzCi0gICAgICAgICAgICAgICAgfCBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uT3V0cHV0UG9ydHMsCi19OwotCi0vLyBMaWdodHdlaWdodCBzdHJ1Y3QgZm9yIHF1ZXJ5aW5nIGNvbXBvbmVudHMuCi1zdHJ1Y3QgVHlwZUluZm8gewotICAgIEFTdHJpbmcgbU5hbWU7Ci0gICAgc3RkOjptYXA8QVN0cmluZywgQVN0cmluZz4gbVN0cmluZ0ZlYXR1cmVzOwotICAgIHN0ZDo6bWFwPEFTdHJpbmcsIGJvb2w+IG1Cb29sRmVhdHVyZXM7Ci0gICAgc3RkOjptYXA8QVN0cmluZywgQVN0cmluZz4gbURldGFpbHM7Ci19OwotCi1zdHJ1Y3QgUHJvZmlsZUxldmVsIHsKLSAgICB1aW50MzJfdCBtUHJvZmlsZTsKLSAgICB1aW50MzJfdCBtTGV2ZWw7Ci19OwotCi1zdHJ1Y3QgQ29kZWNJbmZvIHsKLSAgICBzdGQ6OnZlY3RvcjxUeXBlSW5mbz4gbVR5cGVzOwotICAgIHN0ZDo6dmVjdG9yPFByb2ZpbGVMZXZlbD4gbVByb2ZpbGVMZXZlbHM7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IG1Db2xvckZvcm1hdHM7Ci0gICAgdWludDMyX3QgbUZsYWdzOwotICAgIGJvb2wgbUlzRW5jb2RlcjsKLX07Ci0KLWNsYXNzIE1lZGlhQ29kZWNzWG1sUGFyc2VyIHsKLXB1YmxpYzoKLSAgICBNZWRpYUNvZGVjc1htbFBhcnNlcigpOwotICAgIH5NZWRpYUNvZGVjc1htbFBhcnNlcigpOwotCi0gICAgdm9pZCBnZXRHbG9iYWxTZXR0aW5ncyhzdGQ6Om1hcDxBU3RyaW5nLCBBU3RyaW5nPiAqc2V0dGluZ3MpIGNvbnN0OwotCi0gICAgc3RhdHVzX3QgZ2V0Q29kZWNJbmZvKGNvbnN0IGNoYXIgKm5hbWUsIENvZGVjSW5mbyAqaW5mbykgY29uc3Q7Ci0KLSAgICBzdGF0dXNfdCBnZXRRdWlya3MoY29uc3QgY2hhciAqbmFtZSwgc3RkOjp2ZWN0b3I8QVN0cmluZz4gKnF1aXJrcykgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgZW51bSBTZWN0aW9uIHsKLSAgICAgICAgU0VDVElPTl9UT1BMRVZFTCwKLSAgICAgICAgU0VDVElPTl9TRVRUSU5HUywKLSAgICAgICAgU0VDVElPTl9ERUNPREVSUywKLSAgICAgICAgU0VDVElPTl9ERUNPREVSLAotICAgICAgICBTRUNUSU9OX0RFQ09ERVJfVFlQRSwKLSAgICAgICAgU0VDVElPTl9FTkNPREVSUywKLSAgICAgICAgU0VDVElPTl9FTkNPREVSLAotICAgICAgICBTRUNUSU9OX0VOQ09ERVJfVFlQRSwKLSAgICAgICAgU0VDVElPTl9JTkNMVURFLAotICAgIH07Ci0KLSAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwotICAgIFNlY3Rpb24gbUN1cnJlbnRTZWN0aW9uOwotICAgIGJvb2wgbVVwZGF0ZTsKLSAgICBWZWN0b3I8U2VjdGlvbj4gbVBhc3RTZWN0aW9uczsKLSAgICBpbnQzMl90IG1EZXB0aDsKLSAgICBBU3RyaW5nIG1IcmVmQmFzZTsKLQotICAgIHN0ZDo6bWFwPEFTdHJpbmcsIEFTdHJpbmc+IG1HbG9iYWxTZXR0aW5nczsKLQotICAgIC8vIG5hbWUgLT4gQ29kZWNJbmZvCi0gICAgc3RkOjptYXA8QVN0cmluZywgQ29kZWNJbmZvPiBtQ29kZWNJbmZvczsKLSAgICBzdGQ6Om1hcDxBU3RyaW5nLCBzdGQ6OnZlY3RvcjxBU3RyaW5nPj4gbVF1aXJrczsKLSAgICBBU3RyaW5nIG1DdXJyZW50TmFtZTsKLSAgICBzdGQ6OnZlY3RvcjxUeXBlSW5mbz46Oml0ZXJhdG9yIG1DdXJyZW50VHlwZTsKLQotICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotICAgIHZvaWQgcGFyc2VUb3BMZXZlbFhNTEZpbGUoY29uc3QgY2hhciAqcGF0aCwgYm9vbCBpZ25vcmVfZXJyb3JzID0gZmFsc2UpOwotCi0gICAgdm9pZCBwYXJzZVhNTEZpbGUoY29uc3QgY2hhciAqcGF0aCk7Ci0KLSAgICBzdGF0aWMgdm9pZCBTdGFydEVsZW1lbnRIYW5kbGVyV3JhcHBlcigKLSAgICAgICAgICAgIHZvaWQgKm1lLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cnMpOwotCi0gICAgc3RhdGljIHZvaWQgRW5kRWxlbWVudEhhbmRsZXJXcmFwcGVyKHZvaWQgKm1lLCBjb25zdCBjaGFyICpuYW1lKTsKLQotICAgIHZvaWQgc3RhcnRFbGVtZW50SGFuZGxlcihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cnMpOwotICAgIHZvaWQgZW5kRWxlbWVudEhhbmRsZXIoY29uc3QgY2hhciAqbmFtZSk7Ci0KLSAgICBzdGF0dXNfdCBpbmNsdWRlWE1MRmlsZShjb25zdCBjaGFyICoqYXR0cnMpOwotICAgIHN0YXR1c190IGFkZFNldHRpbmdGcm9tQXR0cmlidXRlcyhjb25zdCBjaGFyICoqYXR0cnMpOwotICAgIHN0YXR1c190IGFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlcyhib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKiphdHRycyk7Ci0gICAgdm9pZCBhZGRNZWRpYUNvZGVjKGJvb2wgZW5jb2RlciwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdHlwZSA9IE5VTEwpOwotCi0gICAgc3RhdHVzX3QgYWRkUXVpcmsoY29uc3QgY2hhciAqKmF0dHJzKTsKLSAgICBzdGF0dXNfdCBhZGRUeXBlRnJvbUF0dHJpYnV0ZXMoY29uc3QgY2hhciAqKmF0dHJzLCBib29sIGVuY29kZXIpOwotICAgIHN0YXR1c190IGFkZExpbWl0KGNvbnN0IGNoYXIgKiphdHRycyk7Ci0gICAgc3RhdHVzX3QgYWRkRmVhdHVyZShjb25zdCBjaGFyICoqYXR0cnMpOwotICAgIHZvaWQgYWRkVHlwZShjb25zdCBjaGFyICpuYW1lKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lZGlhQ29kZWNzWG1sUGFyc2VyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTUVESUFfQ09ERUNTX1hNTF9QQVJTRVJfSF8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaCBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKaW5kZXggOWRhNWVmMy4uZmY0NDBiYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaAorKysgYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCkBAIC01NjgsNiArNTY4LDkgQEAKICAgICAvLyB3aGljaCBtYXkgaW5jbHVkZSBub24tY29udGlndW91cyBmcmFtZXMKICAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGZyYW1lc1JlYWR5KCk7CiAKKyAgICAvLyBTYWZlIGZyYW1lcyByZWFkeSBxdWVyeSB1c2VkIGJ5IGR1bXAoKSAtIHRoaXMgaGFzIG5vIHNpZGUgZWZmZWN0cy4KKyAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGZyYW1lc1JlYWR5U2FmZSgpIGNvbnN0OworCiAgICAgLy8gQ3VycmVudGx5IEF1ZGlvRmxpbmdlciB3aWxsIGNhbGwgZnJhbWVzUmVhZHkoKSBmb3IgYSBmYXN0IHRyYWNrIGZyb20gdHdvIHRocmVhZHM6CiAgICAgLy8gRmFzdE1peGVyIHRocmVhZCwgYW5kIG5vcm1hbCBtaXhlciB0aHJlYWQuICBUaGlzIGlzIGRhbmdlcm91cywgYXMgdGhlIHByb3h5IGlzIGludGVuZGVkCiAgICAgLy8gdG8gYmUgY2FsbGVkIGZyb20gYXQgbW9zdCBvbmUgdGhyZWFkIG9mIHNlcnZlciwgYW5kIG9uZSB0aHJlYWQgb2YgY2xpZW50LgpAQCAtNjIwLDYgKzYyMyw3IEBACiAKIHB1YmxpYzoKICAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGZyYW1lc1JlYWR5KCk7CisgICAgdmlydHVhbCBzaXplX3QgICAgICBmcmFtZXNSZWFkeVNhZmUoKSBjb25zdCBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGZyYW1lc1JlYWR5SXNDYWxsZWRCeU11bHRpcGxlVGhyZWFkcygpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb2J0YWluQnVmZmVyKEJ1ZmZlciogYnVmZmVyLCBib29sIGFja0ZsdXNoKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHJlbGVhc2VCdWZmZXIoQnVmZmVyKiBidWZmZXIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaCBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9WaWRlb0ZyYW1lLmgKaW5kZXggNTEwNTBjZC4uYTlkNGRkMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaAorKysgYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oCkBAIC0zMCwxNCArMzAsNDEgQEAKIGNsYXNzIFZpZGVvRnJhbWUKIHsKIHB1YmxpYzoKLSAgICBWaWRlb0ZyYW1lKCk6IG1XaWR0aCgwKSwgbUhlaWdodCgwKSwgbURpc3BsYXlXaWR0aCgwKSwgbURpc3BsYXlIZWlnaHQoMCksIG1TaXplKDApLAotICAgICAgICAgICAgbVJvdGF0aW9uQW5nbGUoMCksIG1EYXRhKDApIHt9CisgICAgLy8gQ29uc3RydWN0IGEgVmlkZW9GcmFtZSBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMsCisgICAgLy8gd2lsbCBhbGxvY2F0ZSBmcmFtZSBidWZmZXIgaWYgfGFsbG9jYXRlfCBpcyBzZXQgdG8gdHJ1ZSwgd2lsbAorICAgIC8vIGFsbG9jYXRlIGJ1ZmZlciB0byBob2xkIElDQyBkYXRhIGlmIHxpY2NEYXRhfCBhbmQgfGljY1NpemV8CisgICAgLy8gaW5kaWNhdGUgaXRzIHByZXNlbmNlLgorICAgIFZpZGVvRnJhbWUodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90IGRpc3BsYXlXaWR0aCwgdWludDMyX3QgZGlzcGxheUhlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90IGFuZ2xlLCB1aW50MzJfdCBicHAsIGJvb2wgYWxsb2NhdGUsCisgICAgICAgICAgICBjb25zdCB2b2lkICppY2NEYXRhLCBzaXplX3QgaWNjU2l6ZSk6CisgICAgICAgIG1XaWR0aCh3aWR0aCksIG1IZWlnaHQoaGVpZ2h0KSwKKyAgICAgICAgbURpc3BsYXlXaWR0aChkaXNwbGF5V2lkdGgpLCBtRGlzcGxheUhlaWdodChkaXNwbGF5SGVpZ2h0KSwKKyAgICAgICAgbVJvdGF0aW9uQW5nbGUoYW5nbGUpLCBtQnl0ZXNQZXJQaXhlbChicHApLCBtUm93Qnl0ZXMoYnBwICogd2lkdGgpLAorICAgICAgICBtU2l6ZSgwKSwgbUljY1NpemUoMCksIG1SZXNlcnZlZCgwKSwgbURhdGEoMCksIG1JY2NEYXRhKDApIHsKKyAgICAgICAgaWYgKGFsbG9jYXRlKSB7CisgICAgICAgICAgICBtU2l6ZSA9IG1Sb3dCeXRlcyAqIG1IZWlnaHQ7CisgICAgICAgICAgICBtRGF0YSA9IG5ldyB1aW50OF90W21TaXplXTsKKyAgICAgICAgICAgIGlmIChtRGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbVNpemUgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKKyAgICAgICAgaWYgKGljY0RhdGEgIT0gTlVMTCAmJiBpY2NTaXplID4gMCkgeworICAgICAgICAgICAgbUljY1NpemUgPSBpY2NTaXplOworICAgICAgICAgICAgbUljY0RhdGEgPSBuZXcgdWludDhfdFtpY2NTaXplXTsKKyAgICAgICAgICAgIGlmIChtSWNjRGF0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KG1JY2NEYXRhLCBpY2NEYXRhLCBpY2NTaXplKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUljY1NpemUgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gRGVlcCBjb3B5IG9mIGJvdGggdGhlIGluZm9ybWF0aW9uIGZpZWxkcyBhbmQgdGhlIGZyYW1lIGRhdGEKICAgICBWaWRlb0ZyYW1lKGNvbnN0IFZpZGVvRnJhbWUmIGNvcHkpIHsKLSAgICAgICAgbVdpZHRoID0gY29weS5tV2lkdGg7Ci0gICAgICAgIG1IZWlnaHQgPSBjb3B5Lm1IZWlnaHQ7Ci0gICAgICAgIG1EaXNwbGF5V2lkdGggPSBjb3B5Lm1EaXNwbGF5V2lkdGg7Ci0gICAgICAgIG1EaXNwbGF5SGVpZ2h0ID0gY29weS5tRGlzcGxheUhlaWdodDsKKyAgICAgICAgY29weUluZm9Pbmx5KGNvcHkpOworCiAgICAgICAgIG1TaXplID0gY29weS5tU2l6ZTsKICAgICAgICAgbURhdGEgPSBOVUxMOyAgLy8gaW5pdGlhbGl6ZSBpdCBmaXJzdAogICAgICAgICBpZiAobVNpemUgPiAwICYmIGNvcHkubURhdGEgIT0gTlVMTCkgewpAQCAtNDgsMjYgKzc1LDk5IEBACiAgICAgICAgICAgICAgICAgbVNpemUgPSAwOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1Sb3RhdGlvbkFuZ2xlID0gY29weS5tUm90YXRpb25BbmdsZTsKKworICAgICAgICBtSWNjU2l6ZSA9IGNvcHkubUljY1NpemU7CisgICAgICAgIG1JY2NEYXRhID0gTlVMTDsgIC8vIGluaXRpYWxpemUgaXQgZmlyc3QKKyAgICAgICAgaWYgKG1JY2NTaXplID4gMCAmJiBjb3B5Lm1JY2NEYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1JY2NEYXRhID0gbmV3IHVpbnQ4X3RbbUljY1NpemVdOworICAgICAgICAgICAgaWYgKG1JY2NEYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkobUljY0RhdGEsIGNvcHkubUljY0RhdGEsIG1JY2NTaXplKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUljY1NpemUgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgflZpZGVvRnJhbWUoKSB7CiAgICAgICAgIGlmIChtRGF0YSAhPSAwKSB7CiAgICAgICAgICAgICBkZWxldGVbXSBtRGF0YTsKICAgICAgICAgfQorICAgICAgICBpZiAobUljY0RhdGEgIT0gMCkgeworICAgICAgICAgICAgZGVsZXRlW10gbUljY0RhdGE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDb3B5IHxjb3B5fCB0byBhIGZsYXR0ZW5lZCBWaWRlb0ZyYW1lIGluIElNZW1vcnksICd0aGlzJyBtdXN0IHBvaW50IHRvCisgICAgLy8gYSBjaHVuayBvZiBtZW1vcnkgYmFjayBieSBJTWVtb3J5IG9mIHNpemUgYXQgbGVhc3QgZ2V0RmxhdHRlbmVkU2l6ZSgpCisgICAgLy8gb2YgfGNvcHl8LgorICAgIHZvaWQgY29weUZsYXR0ZW5lZChjb25zdCBWaWRlb0ZyYW1lJiBjb3B5KSB7CisgICAgICAgIGNvcHlJbmZvT25seShjb3B5KTsKKworICAgICAgICBtU2l6ZSA9IGNvcHkubVNpemU7CisgICAgICAgIG1EYXRhID0gTlVMTDsgIC8vIGluaXRpYWxpemUgaXQgZmlyc3QKKyAgICAgICAgaWYgKGNvcHkubVNpemUgPiAwICYmIGNvcHkubURhdGEgIT0gTlVMTCkgeworICAgICAgICAgICAgbWVtY3B5KGdldEZsYXR0ZW5lZERhdGEoKSwgY29weS5tRGF0YSwgY29weS5tU2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBtSWNjU2l6ZSA9IGNvcHkubUljY1NpemU7CisgICAgICAgIG1JY2NEYXRhID0gTlVMTDsgIC8vIGluaXRpYWxpemUgaXQgZmlyc3QKKyAgICAgICAgaWYgKGNvcHkubUljY1NpemUgPiAwICYmIGNvcHkubUljY0RhdGEgIT0gTlVMTCkgeworICAgICAgICAgICAgbWVtY3B5KGdldEZsYXR0ZW5lZEljY0RhdGEoKSwgY29weS5tSWNjRGF0YSwgY29weS5tSWNjU2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDYWxjdWxhdGUgdGhlIGZsYXR0ZW5lZCBzaXplIHRvIHB1dCBpdCBpbiBJTWVtb3J5CisgICAgc2l6ZV90IGdldEZsYXR0ZW5lZFNpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzaXplb2YoVmlkZW9GcmFtZSkgKyBtU2l6ZSArIG1JY2NTaXplOworICAgIH0KKworICAgIC8vIEdldCB0aGUgcG9pbnRlciB0byB0aGUgZnJhbWUgZGF0YSBpbiBhIGZsYXR0ZW5lZCBWaWRlb0ZyYW1lIGluIElNZW1vcnkKKyAgICB1aW50OF90KiBnZXRGbGF0dGVuZWREYXRhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKHVpbnQ4X3QqKXRoaXMgKyBzaXplb2YoVmlkZW9GcmFtZSk7CisgICAgfQorCisgICAgLy8gR2V0IHRoZSBwb2ludGVyIHRvIHRoZSBJQ0MgZGF0YSBpbiBhIGZsYXR0ZW5lZCBWaWRlb0ZyYW1lIGluIElNZW1vcnkKKyAgICB1aW50OF90KiBnZXRGbGF0dGVuZWRJY2NEYXRhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKHVpbnQ4X3QqKXRoaXMgKyBzaXplb2YoVmlkZW9GcmFtZSkgKyBtU2l6ZTsKICAgICB9CiAKICAgICAvLyBJbnRlbnRpb25hbCBwdWJsaWMgYWNjZXNzIG1vZGlmaWVyOgotICAgIHVpbnQzMl90IG1XaWR0aDsKLSAgICB1aW50MzJfdCBtSGVpZ2h0OwotICAgIHVpbnQzMl90IG1EaXNwbGF5V2lkdGg7Ci0gICAgdWludDMyX3QgbURpc3BsYXlIZWlnaHQ7CisgICAgdWludDMyX3QgbVdpZHRoOyAgICAgICAgICAgLy8gRGVjb2RlZCBpbWFnZSB3aWR0aCBiZWZvcmUgcm90YXRpb24KKyAgICB1aW50MzJfdCBtSGVpZ2h0OyAgICAgICAgICAvLyBEZWNvZGVkIGltYWdlIGhlaWdodCBiZWZvcmUgcm90YXRpb24KKyAgICB1aW50MzJfdCBtRGlzcGxheVdpZHRoOyAgICAvLyBEaXNwbGF5IHdpZHRoIGJlZm9yZSByb3RhdGlvbgorICAgIHVpbnQzMl90IG1EaXNwbGF5SGVpZ2h0OyAgIC8vIERpc3BsYXkgaGVpZ2h0IGJlZm9yZSByb3RhdGlvbgorICAgIGludDMyX3QgIG1Sb3RhdGlvbkFuZ2xlOyAgIC8vIFJvdGF0aW9uIGFuZ2xlLCBjbG9ja3dpc2UsIHNob3VsZCBiZSBtdWx0aXBsZSBvZiA5MAorICAgIHVpbnQzMl90IG1CeXRlc1BlclBpeGVsOyAgIC8vIE51bWJlciBvZiBieXRlcyBwZXIgcGl4ZWwKKyAgICB1aW50MzJfdCBtUm93Qnl0ZXM7ICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgcGVyIHJvdyBiZWZvcmUgcm90YXRpb24KICAgICB1aW50MzJfdCBtU2l6ZTsgICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgaW4gbURhdGEKLSAgICBpbnQzMl90ICBtUm90YXRpb25BbmdsZTsgICAvLyByb3RhdGlvbiBhbmdsZSwgY2xvY2t3aXNlLCBzaG91bGQgYmUgbXVsdGlwbGUgb2YgOTAKLSAgICAvLyBtRGF0YSBzaG91bGQgYmUgNjQgYml0IGFsaWduZWQgdG8gcHJldmVudCBhZGRpdGlvbmFsIHBhZGRpbmcKKyAgICB1aW50MzJfdCBtSWNjU2l6ZTsgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgaW4gbUljY0RhdGEKKyAgICB1aW50MzJfdCBtUmVzZXJ2ZWQ7ICAgICAgICAvLyAocGFkZGluZyB0byBtYWtlIG1EYXRhIDY0LWJpdCBhbGlnbmVkKQorCisgICAgLy8gbURhdGEgc2hvdWxkIGJlIDY0LWJpdCBhbGlnbmVkIHRvIHByZXZlbnQgYWRkaXRpb25hbCBwYWRkaW5nCiAgICAgdWludDhfdCogbURhdGE7ICAgICAgICAgICAgLy8gQWN0dWFsIGJpbmFyeSBkYXRhCi0gICAgLy8gcGFkIHN0cnVjdHVyZSBzbyBpdCdzIHRoZSBzYW1lIHNpemUgb24gNjQgYml0IGFuZCAzMiBiaXQKKyAgICAvLyBwYWQgc3RydWN0dXJlIHNvIGl0J3MgdGhlIHNhbWUgc2l6ZSBvbiA2NC1iaXQgYW5kIDMyLWJpdAogICAgIGNoYXIgICAgIG1QYWRkaW5nWzggLSBzaXplb2YobURhdGEpXTsKKworICAgIC8vIG1JY2NEYXRhIHNob3VsZCBiZSA2NC1iaXQgYWxpZ25lZCB0byBwcmV2ZW50IGFkZGl0aW9uYWwgcGFkZGluZworICAgIHVpbnQ4X3QqIG1JY2NEYXRhOyAgICAgICAgICAgIC8vIEFjdHVhbCBiaW5hcnkgZGF0YQorICAgIC8vIHBhZCBzdHJ1Y3R1cmUgc28gaXQncyB0aGUgc2FtZSBzaXplIG9uIDY0LWJpdCBhbmQgMzItYml0CisgICAgY2hhciAgICAgbUljY1BhZGRpbmdbOCAtIHNpemVvZihtSWNjRGF0YSldOworCitwcml2YXRlOgorICAgIC8vCisgICAgLy8gVXRpbGl0eSBtZXRob2RzIHVzZWQgb25seSB3aXRoaW4gVmlkZW9GcmFtZSBzdHJ1Y3QKKyAgICAvLworCisgICAgLy8gQ29weSB0aGUgaW5mb3JtYXRpb24gZmllbGRzIG9ubHkKKyAgICB2b2lkIGNvcHlJbmZvT25seShjb25zdCBWaWRlb0ZyYW1lJiBjb3B5KSB7CisgICAgICAgIG1XaWR0aCA9IGNvcHkubVdpZHRoOworICAgICAgICBtSGVpZ2h0ID0gY29weS5tSGVpZ2h0OworICAgICAgICBtRGlzcGxheVdpZHRoID0gY29weS5tRGlzcGxheVdpZHRoOworICAgICAgICBtRGlzcGxheUhlaWdodCA9IGNvcHkubURpc3BsYXlIZWlnaHQ7CisgICAgICAgIG1Sb3RhdGlvbkFuZ2xlID0gY29weS5tUm90YXRpb25BbmdsZTsKKyAgICAgICAgbUJ5dGVzUGVyUGl4ZWwgPSBjb3B5Lm1CeXRlc1BlclBpeGVsOworICAgICAgICBtUm93Qnl0ZXMgPSBjb3B5Lm1Sb3dCeXRlczsKKyAgICB9CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yYWRpby9JUmFkaW8uaCBiL2luY2x1ZGUvcmFkaW8vSVJhZGlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NzdmOGYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9yYWRpby9JUmFkaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfSVJBRElPX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9JUkFESU9fSAotCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3JhZGlvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgSVJhZGlvIDogcHVibGljIElJbnRlcmZhY2UKLXsKLXB1YmxpYzoKLQotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoUmFkaW8pOwotCi0gICAgdmlydHVhbCB2b2lkIGRldGFjaCgpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q29uZmlndXJhdGlvbihjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZykgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDb25maWd1cmF0aW9uKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE11dGUoYm9vbCBtdXRlKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE11dGUoYm9vbCAqbXV0ZSkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwU3ViQ2hhbm5lbCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzY2FuKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwU3ViQ2hhbm5lbCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCB0dW5lKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgc3ViQ2hhbm5lbCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjYW5jZWwoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb2dyYW1JbmZvcm1hdGlvbihzdHJ1Y3QgcmFkaW9fcHJvZ3JhbV9pbmZvICppbmZvKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGhhc0NvbnRyb2woYm9vbCAqaGFzQ29udHJvbCkgPSAwOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBCblJhZGlvOiBwdWJsaWMgQm5JbnRlcmZhY2U8SVJhZGlvPgotewotcHVibGljOgotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vQU5EUk9JRF9IQVJEV0FSRV9JUkFESU9fSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yYWRpby9JUmFkaW9DbGllbnQuaCBiL2luY2x1ZGUvcmFkaW8vSVJhZGlvQ2xpZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNjJhZDYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9yYWRpby9JUmFkaW9DbGllbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfSVJBRElPX0NMSUVOVF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfSVJBRElPX0NMSUVOVF9ICi0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBJUmFkaW9DbGllbnQgOiBwdWJsaWMgSUludGVyZmFjZQotewotcHVibGljOgotCi0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShSYWRpb0NsaWVudCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25FdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpID0gMDsKLQotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBCblJhZGlvQ2xpZW50IDogcHVibGljIEJuSW50ZXJmYWNlPElSYWRpb0NsaWVudD4KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvL0FORFJPSURfSEFSRFdBUkVfSVJBRElPX0NMSUVOVF9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3JhZGlvL0lSYWRpb1NlcnZpY2UuaCBiL2luY2x1ZGUvcmFkaW8vSVJhZGlvU2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTQ2ZGQ1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcmFkaW8vSVJhZGlvU2VydmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9JUkFESU9fU0VSVklDRV9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfSVJBRElPX1NFUlZJQ0VfSAotCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPHN5c3RlbS9yYWRpby5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIElSYWRpbzsKLWNsYXNzIElSYWRpb0NsaWVudDsKLQotY2xhc3MgSVJhZGlvU2VydmljZSA6IHB1YmxpYyBJSW50ZXJmYWNlCi17Ci1wdWJsaWM6Ci0KLSAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKFJhZGlvU2VydmljZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RNb2R1bGVzKHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgYXR0YWNoKGNvbnN0IHJhZGlvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJUmFkaW9DbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3aXRoQXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVJhZGlvPiYgcmFkaW8pID0gMDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQm5SYWRpb1NlcnZpY2U6IHB1YmxpYyBCbkludGVyZmFjZTxJUmFkaW9TZXJ2aWNlPgotewotcHVibGljOgotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vQU5EUk9JRF9IQVJEV0FSRV9JUkFESU9fU0VSVklDRV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3JhZGlvL1JhZGlvLmggYi9pbmNsdWRlL3JhZGlvL1JhZGlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNGRkMmYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9yYWRpby9SYWRpby5oCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfUkFESU9fSAotCi0jaW5jbHVkZSA8YmluZGVyL0lCaW5kZXIuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8cmFkaW8vUmFkaW9DYWxsYmFjay5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpby5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpb1NlcnZpY2UuaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW9DbGllbnQuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBNZW1vcnlEZWFsZXI7Ci0KLWNsYXNzIFJhZGlvIDogcHVibGljIEJuUmFkaW9DbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKLXsKLXB1YmxpYzoKLQotICAgIHZpcnR1YWwgflJhZGlvKCk7Ci0KLSAgICBzdGF0aWMgIHN0YXR1c190IGxpc3RNb2R1bGVzKHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpOwotICAgIHN0YXRpYyAgc3A8UmFkaW8+IGF0dGFjaChyYWRpb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdpdGhBdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8UmFkaW9DYWxsYmFjaz4mIGNhbGxiYWNrKTsKLQotCi0gICAgICAgICAgICB2b2lkIGRldGFjaCgpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBzZXRDb25maWd1cmF0aW9uKGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZ2V0Q29uZmlndXJhdGlvbihzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZyk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHNldE11dGUoYm9vbCBtdXRlKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZ2V0TXV0ZShib29sICptdXRlKTsKLQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RlcChyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBzY2FuKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwU3ViQ2hhbm5lbCk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHR1bmUodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBzdWJDaGFubmVsKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgY2FuY2VsKCk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGdldFByb2dyYW1JbmZvcm1hdGlvbihzdHJ1Y3QgcmFkaW9fcHJvZ3JhbV9pbmZvICppbmZvKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgaGFzQ29udHJvbChib29sICpoYXNDb250cm9sKTsKLQotICAgICAgICAgICAgLy8gQnBSYWRpb0NsaWVudAotICAgICAgICAgICAgdmlydHVhbCB2b2lkIG9uRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KTsKLQotICAgICAgICAgICAgLy9JQmluZGVyOjpEZWF0aFJlY2lwaWVudAotICAgICAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyk7Ci0KLXByaXZhdGU6Ci0gICAgICAgICAgICBSYWRpbyhyYWRpb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8UmFkaW9DYWxsYmFjaz4mKTsKLSAgICAgICAgICAgIHN0YXRpYyBjb25zdCBzcDxJUmFkaW9TZXJ2aWNlPiBnZXRSYWRpb1NlcnZpY2UoKTsKLQotICAgICAgICAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgbUxvY2s7Ci0gICAgICAgICAgICBzcDxJUmFkaW8+ICAgICAgICAgICAgICBtSVJhZGlvOwotICAgICAgICAgICAgc3A8UmFkaW9DYWxsYmFjaz4gICAgICAgbUNhbGxiYWNrOwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vQU5EUk9JRF9IQVJEV0FSRV9SQURJT19ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3JhZGlvL1JhZGlvQ2FsbGJhY2suaCBiL2luY2x1ZGUvcmFkaW8vUmFkaW9DYWxsYmFjay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTdmMWE2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcmFkaW8vUmFkaW9DYWxsYmFjay5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19DQUxMQkFDS19ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfUkFESU9fQ0FMTEJBQ0tfSAotCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHN5c3RlbS9yYWRpby5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFJhZGlvQ2FsbGJhY2sgOiBwdWJsaWMgUmVmQmFzZQotewotcHVibGljOgotCi0gICAgICAgICAgICBSYWRpb0NhbGxiYWNrKCkge30KLSAgICB2aXJ0dWFsIH5SYWRpb0NhbGxiYWNrKCkge30KLQotICAgIHZpcnR1YWwgdm9pZCBvbkV2ZW50KHN0cnVjdCByYWRpb19ldmVudCAqZXZlbnQpID0gMDsKLQotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vQU5EUk9JRF9IQVJEV0FSRV9SQURJT19DQUxMQkFDS19ICmRpZmYgLS1naXQgYS9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5tawppbmRleCBhZmQxMTg5Li4zZWU3NDk0IDEwMDY0NAotLS0gYS9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsKQEAgLTE0LDcgKzE0LDYgQEAKIAlsaWJsb2cgXAogCWxpYm1lZGlhbG9nc2VydmljZSBcCiAJbGlibmJhaW8gXAotCWxpYnJhZGlvc2VydmljZSBcCiAJbGlic291bmR0cmlnZ2Vyc2VydmljZSBcCiAJbGlidXRpbHMgXAogCWxpYmh3YmluZGVyCmRpZmYgLS1naXQgYS9tZWRpYS9hdWRpb3NlcnZlci9tYWluX2F1ZGlvc2VydmVyLmNwcCBiL21lZGlhL2F1ZGlvc2VydmVyL21haW5fYXVkaW9zZXJ2ZXIuY3BwCmluZGV4IGVlMDJkMjMuLjQ3NGVmOTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2F1ZGlvc2VydmVyL21haW5fYXVkaW9zZXJ2ZXIuY3BwCisrKyBiL21lZGlhL2F1ZGlvc2VydmVyL21haW5fYXVkaW9zZXJ2ZXIuY3BwCkBAIC0zMiwxMSArMzIsMTIgQEAKICNpbmNsdWRlIDxod2JpbmRlci9Qcm9jZXNzU3RhdGUuaD4KIAogLy8gZnJvbSBMT0NBTF9DX0lOQ0xVREVTCisjaW5jbHVkZSAiYWF1ZGlvL0FBdWRpb1Rlc3RpbmcuaCIKICNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKICNpbmNsdWRlICJBdWRpb1BvbGljeVNlcnZpY2UuaCIKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlLmgiCisjaW5jbHVkZSAidXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaCIKICNpbmNsdWRlICJNZWRpYUxvZ1NlcnZpY2UuaCIKLSNpbmNsdWRlICJSYWRpb1NlcnZpY2UuaCIKICNpbmNsdWRlICJTb3VuZFRyaWdnZXJId1NlcnZpY2UuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CkBAIC0xMzIsOCArMTMzLDE2IEBACiAgICAgICAgIEFMT0dJKCJTZXJ2aWNlTWFuYWdlcjogJXAiLCBzbS5nZXQoKSk7CiAgICAgICAgIEF1ZGlvRmxpbmdlcjo6aW5zdGFudGlhdGUoKTsKICAgICAgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOwotICAgICAgICBBQXVkaW9TZXJ2aWNlOjppbnN0YW50aWF0ZSgpOwotICAgICAgICBSYWRpb1NlcnZpY2U6Omluc3RhbnRpYXRlKCk7CisKKyAgICAgICAgLy8gQUF1ZGlvU2VydmljZSBzaG91bGQgb25seSBiZSB1c2VkIGluIE9DLU1SMSBhbmQgbGF0ZXIuCisgICAgICAgIC8vIEFuZCBvbmx5IGVuYWJsZSB0aGUgQUF1ZGlvU2VydmljZSBpZiB0aGUgc3lzdGVtIE1NQVAgcG9saWN5IGV4cGxpY2l0bHkgYWxsb3dzIGl0LgorICAgICAgICAvLyBUaGlzIHByZXZlbnRzIGEgY2xpZW50IGZyb20gbWlzdXNpbmcgQUF1ZGlvU2VydmljZSB3aGVuIGl0IGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICAgIGFhdWRpb19wb2xpY3lfdCBtbWFwUG9saWN5ID0gcHJvcGVydHlfZ2V0X2ludDMyKEFBVURJT19QUk9QX01NQVBfUE9MSUNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fUE9MSUNZX05FVkVSKTsKKyAgICAgICAgaWYgKG1tYXBQb2xpY3kgPT0gQUFVRElPX1BPTElDWV9BVVRPIHx8IG1tYXBQb2xpY3kgPT0gQUFVRElPX1BPTElDWV9BTFdBWVMpIHsKKyAgICAgICAgICAgIEFBdWRpb1NlcnZpY2U6Omluc3RhbnRpYXRlKCk7CisgICAgICAgIH0KKwogICAgICAgICBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAgICAgICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL0RveHlmaWxlIGIvbWVkaWEvbGliYWF1ZGlvL0RveHlmaWxlCmluZGV4IGUyYzQ5NjAuLjcyOThkMTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9Eb3h5ZmlsZQorKysgYi9tZWRpYS9saWJhYXVkaW8vRG94eWZpbGUKQEAgLTc0NCwxMiArNzQ0LDEyIEBACiAjIE5vdGU6IElmIHRoaXMgdGFnIGlzIGVtcHR5IHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyBzZWFyY2hlZC4KIAogSU5QVVQgICAgICAgICAgICAgICAgICA9IGluY2x1ZGUvYWF1ZGlvL0FBdWRpby5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvYmluZGluZy9BQXVkaW9Db21tb24uaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL2xlZ2FjeS9BQXVkaW9MZWdhY3kuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9jb3JlL0F1ZGlvU3RyZWFtLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy91dGlsaXR5L0hhbmRsZVRyYWNrZXIuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3V0aWxpdHkvTW9ub3RvbmljQ291bnRlci5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdXRpbGl0eS9BdWRpb0Nsb2NrLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vT1dORVJTIGIvbWVkaWEvbGliYWF1ZGlvL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGQ1MWY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL09XTkVSUwpAQCAtMCwwICsxIEBACitwaGlsYnVya0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9zcmMvaW5wdXRfbW9uaXRvci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9zcmMvaW5wdXRfbW9uaXRvci5jcHAKaW5kZXggZDFhZTE2MC4uZTVhZDJkOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivc3JjL2lucHV0X21vbml0b3IuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL3NyYy9pbnB1dF9tb25pdG9yLmNwcApAQCAtMjcsOSArMjcsMTEgQEAKICNpbmNsdWRlICJBQXVkaW9TaW1wbGVSZWNvcmRlci5oIgogCiAvLyBUT0RPIHN1cHBvcnQgRkxPQVQKLSNkZWZpbmUgUkVRVUlSRURfRk9STUFUICBBQVVESU9fRk9STUFUX1BDTV9JMTYKKyNkZWZpbmUgUkVRVUlSRURfRk9STUFUICAgIEFBVURJT19GT1JNQVRfUENNX0kxNgogI2RlZmluZSBNSU5fRlJBTUVTX1RPX1JFQUQgNDggIC8qIGFyYml0cmFyeSwgMSBtc2VjIGF0IDQ4MDAwIEh6ICovCiAKK3N0YXRpYyBjb25zdCBpbnQgRlJBTUVTX1BFUl9MSU5FID0gMjAwMDA7CisKIGludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKIHsKICAgICBBQXVkaW9BcmdzUGFyc2VyICAgYXJnUGFyc2VyOwpAQCAtNDUsMTcgKzQ3LDE5IEBACiAgICAgaW50MzJfdCBmcmFtZXNQZXJSZWFkID0gMDsKICAgICBpbnQzMl90IGZyYW1lc1RvUmVjb3JkID0gMDsKICAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSAwOworICAgIGludDMyX3QgbmV4dEZyYW1lQ291bnQgPSAwOworICAgIGludDMyX3QgZnJhbWVDb3VudCA9IDA7CiAgICAgaW50MzJfdCB4UnVuQ291bnQgPSAwOworICAgIGludDY0X3QgcHJldmlvdXNGcmFtZVBvc2l0aW9uID0gLTE7CiAgICAgaW50MTZfdCAqZGF0YSA9IG51bGxwdHI7CiAgICAgZmxvYXQgcGVha0xldmVsID0gMC4wOwotICAgIGludCBsb29wQ291bnRlciA9IDA7CiAgICAgaW50MzJfdCBkZXZpY2VJZDsKIAogICAgIC8vIE1ha2UgcHJpbnRmIHByaW50IGltbWVkaWF0ZWx5IHNvIHRoYXQgZGVidWcgaW5mbyBpcyBub3Qgc3R1Y2sKICAgICAvLyBpbiBhIGJ1ZmZlciBpZiB3ZSBoYW5nIG9yIGNyYXNoLgogICAgIHNldHZidWYoc3Rkb3V0LCBudWxscHRyLCBfSU9OQkYsIChzaXplX3QpIDApOwogCi0gICAgcHJpbnRmKCIlcyAtIE1vbml0b3IgaW5wdXQgbGV2ZWwgdXNpbmcgQUF1ZGlvXG4iLCBhcmd2WzBdKTsKKyAgICBwcmludGYoIiVzIC0gTW9uaXRvciBpbnB1dCBsZXZlbCB1c2luZyBBQXVkaW8gcmVhZCwgVjAuMS4yXG4iLCBhcmd2WzBdKTsKIAogICAgIGFyZ1BhcnNlci5zZXRGb3JtYXQoUkVRVUlSRURfRk9STUFUKTsKICAgICBpZiAoYXJnUGFyc2VyLnBhcnNlQXJncyhhcmdjLCBhcmd2KSkgewpAQCAtNzMsNyArNzcsNyBAQAogICAgIGRldmljZUlkID0gQUF1ZGlvU3RyZWFtX2dldERldmljZUlkKGFhdWRpb1N0cmVhbSk7CiAgICAgcHJpbnRmKCJkZXZpY2VJZCA9ICVkXG4iLCBkZXZpY2VJZCk7CiAKLSAgICBhY3R1YWxTYW1wbGVzUGVyRnJhbWUgPSBBQXVkaW9TdHJlYW1fZ2V0U2FtcGxlc1BlckZyYW1lKGFhdWRpb1N0cmVhbSk7CisgICAgYWN0dWFsU2FtcGxlc1BlckZyYW1lID0gQUF1ZGlvU3RyZWFtX2dldENoYW5uZWxDb3VudChhYXVkaW9TdHJlYW0pOwogICAgIHByaW50ZigiU2FtcGxlc1BlckZyYW1lID0gJWRcbiIsIGFjdHVhbFNhbXBsZXNQZXJGcmFtZSk7CiAgICAgYWN0dWFsU2FtcGxlUmF0ZSA9IEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVSYXRlKGFhdWRpb1N0cmVhbSk7CiAgICAgcHJpbnRmKCJTYW1wbGVzUGVyRnJhbWUgPSAlZFxuIiwgYWN0dWFsU2FtcGxlUmF0ZSk7CkBAIC0xMzIsNiArMTM2LDcgQEAKICAgICAgICAgICAgIGdvdG8gZmluaXNoOwogICAgICAgICB9CiAgICAgICAgIGZyYW1lc0xlZnQgLT0gYWN0dWFsOworICAgICAgICBmcmFtZUNvdW50ICs9IGFjdHVhbDsKIAogICAgICAgICAvLyBQZWFrIGZpbmRlci4KICAgICAgICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBhY3R1YWw7IGZyYW1lSW5kZXgrKykgewpAQCAtMTQyLDkgKzE0NywzNiBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gRGlzcGxheSBsZXZlbCBhcyBzdGFycywgZWcuICIqKioqKioiLgotICAgICAgICBpZiAoKGxvb3BDb3VudGVyKysgJSAxMCkgPT0gMCkgeworICAgICAgICBpZiAoZnJhbWVDb3VudCA+IG5leHRGcmFtZUNvdW50KSB7CiAgICAgICAgICAgICBkaXNwbGF5UGVha0xldmVsKHBlYWtMZXZlbCk7CiAgICAgICAgICAgICBwZWFrTGV2ZWwgPSAwLjA7CisgICAgICAgICAgICBuZXh0RnJhbWVDb3VudCArPSBGUkFNRVNfUEVSX0xJTkU7CisgICAgICAgIH0KKworICAgICAgICAvLyBQcmludCB0aW1lc3RhbXBzLgorICAgICAgICBpbnQ2NF90IGZyYW1lUG9zaXRpb24gPSAwOworICAgICAgICBpbnQ2NF90IGZyYW1lVGltZSA9IDA7CisgICAgICAgIGFhdWRpb19yZXN1bHRfdCB0aW1lUmVzdWx0OworICAgICAgICB0aW1lUmVzdWx0ID0gQUF1ZGlvU3RyZWFtX2dldFRpbWVzdGFtcChhYXVkaW9TdHJlYW0sIENMT0NLX01PTk9UT05JQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lUG9zaXRpb24sICZmcmFtZVRpbWUpOworCisgICAgICAgIGlmICh0aW1lUmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICAgICAgaWYgKGZyYW1lUG9zaXRpb24gPiAocHJldmlvdXNGcmFtZVBvc2l0aW9uICsgRlJBTUVTX1BFUl9MSU5FKSkgeworICAgICAgICAgICAgICAgIGludDY0X3QgcmVhbFRpbWUgPSBnZXROYW5vc2Vjb25kcygpOworICAgICAgICAgICAgICAgIGludDY0X3QgZnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKGFhdWRpb1N0cmVhbSk7CisKKyAgICAgICAgICAgICAgICBkb3VibGUgbGF0ZW5jeU1pbGxpcyA9IGNhbGN1bGF0ZUxhdGVuY3lNaWxsaXMoZnJhbWVzUmVhZCwgcmVhbFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lUG9zaXRpb24sIGZyYW1lVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsU2FtcGxlUmF0ZSk7CisKKyAgICAgICAgICAgICAgICBwcmludGYoIi0tLSB0aW1lc3RhbXA6IHJlc3VsdCA9ICU0ZCwgcG9zaXRpb24gPSAlbGxkLCBhdCAlbGxkIG5hbm9zIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIGxhdGVuY3kgPSAlNy4yZiBtc2VjXG4iLAorICAgICAgICAgICAgICAgICAgICAgICB0aW1lUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBmcmFtZVBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBmcmFtZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3lNaWxsaXMpOworICAgICAgICAgICAgICAgIHByZXZpb3VzRnJhbWVQb3NpdGlvbiA9IGZyYW1lUG9zaXRpb247CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL3NyYy9pbnB1dF9tb25pdG9yX2NhbGxiYWNrLmNwcCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL3NyYy9pbnB1dF9tb25pdG9yX2NhbGxiYWNrLmNwcAppbmRleCA5ZGUyZWIwLi44OTM3OTViIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9zcmMvaW5wdXRfbW9uaXRvcl9jYWxsYmFjay5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivc3JjL2lucHV0X21vbml0b3JfY2FsbGJhY2suY3BwCkBAIC00MSw3ICs0MSw3IEBACiAgICAgLy8gTWFrZSBwcmludGYgcHJpbnQgaW1tZWRpYXRlbHkgc28gdGhhdCBkZWJ1ZyBpbmZvIGlzIG5vdCBzdHVjawogICAgIC8vIGluIGEgYnVmZmVyIGlmIHdlIGhhbmcgb3IgY3Jhc2guCiAgICAgc2V0dmJ1ZihzdGRvdXQsIG51bGxwdHIsIF9JT05CRiwgKHNpemVfdCkgMCk7Ci0gICAgcHJpbnRmKCIlcyAtIERpc3BsYXkgYXVkaW8gaW5wdXQgdXNpbmcgYW4gQUF1ZGlvIGNhbGxiYWNrXG4iLCBhcmd2WzBdKTsKKyAgICBwcmludGYoIiVzIC0gRGlzcGxheSBhdWRpbyBpbnB1dCB1c2luZyBhbiBBQXVkaW8gY2FsbGJhY2ssIFYwLjEuMlxuIiwgYXJndlswXSk7CiAKICAgICByZXN1bHQgPSByZWNvcmRlci5vcGVuKDIsIDQ4MDAwLCBBQVVESU9fRk9STUFUX1BDTV9JMTYsCiAgICAgICAgICAgICAgICAgICAgICAgIFNpbXBsZVJlY29yZGVyRGF0YUNhbGxiYWNrUHJvYywgU2ltcGxlUmVjb3JkZXJFcnJvckNhbGxiYWNrUHJvYywgJm15RGF0YSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2xvb3BiYWNrLmNwcCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvbG9vcGJhY2suY3BwCmluZGV4IGQzYjZmZjcuLmI2NzhkOGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvbG9vcGJhY2suY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvbG9vcGJhY2suY3BwCkBAIC00MTMsMTEgKzQxMywxOCBAQAogICAgICAgICAgICAgc2xlZXAoMSk7CiAgICAgICAgICAgICBwcmludGYoIiU0ZDogIiwgaSk7CiAgICAgICAgICAgICBsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3ItPnByaW50U3RhdHVzKCk7Ci0gICAgICAgICAgICBpbnQ2NF90IGZyYW1lc1dyaXR0ZW4gPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihsb29wYmFja0RhdGEuaW5wdXRTdHJlYW0pOwotICAgICAgICAgICAgaW50NjRfdCBmcmFtZXNSZWFkID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQobG9vcGJhY2tEYXRhLmlucHV0U3RyZWFtKTsKLSAgICAgICAgICAgIHByaW50ZigiIGlucHV0IHdyaXR0ZW4gPSAlbGxkLCByZWFkICVsbGQsIHhydW5zID0gJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgZnJhbWVzV3JpdHRlbiwKLSAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBmcmFtZXNSZWFkLAorCisgICAgICAgICAgICBpbnQ2NF90IGlucHV0RnJhbWVzV3JpdHRlbiA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKGxvb3BiYWNrRGF0YS5pbnB1dFN0cmVhbSk7CisgICAgICAgICAgICBpbnQ2NF90IGlucHV0RnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKGxvb3BiYWNrRGF0YS5pbnB1dFN0cmVhbSk7CisgICAgICAgICAgICBpbnQ2NF90IG91dHB1dEZyYW1lc1dyaXR0ZW4gPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihvdXRwdXRTdHJlYW0pOworICAgICAgICAgICAgaW50NjRfdCBvdXRwdXRGcmFtZXNSZWFkID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQob3V0cHV0U3RyZWFtKTsKKyAgICAgICAgICAgIHByaW50ZigiIElOUFVUOiB3ciAlbGxkIHJkICVsbGQgc3RhdGUgJXMsIE9VVFBVVDogd3IgJWxsZCByZCAlbGxkIHN0YXRlICVzLCB4cnVucyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBpbnB1dEZyYW1lc1dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgaW5wdXRGcmFtZXNSZWFkLAorICAgICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQoQUF1ZGlvU3RyZWFtX2dldFN0YXRlKGxvb3BiYWNrRGF0YS5pbnB1dFN0cmVhbSkpLAorICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIG91dHB1dEZyYW1lc1dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgb3V0cHV0RnJhbWVzUmVhZCwKKyAgICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KEFBdWRpb1N0cmVhbV9nZXRTdGF0ZShvdXRwdXRTdHJlYW0pKSwKICAgICAgICAgICAgICAgICAgICBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50KG91dHB1dFN0cmVhbSkKICAgICAgICAgICAgICk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9BcmdzUGFyc2VyLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvQXJnc1BhcnNlci5oCmluZGV4IDQ2YmM5OWUuLmFkYTM3ZTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9BcmdzUGFyc2VyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0FyZ3NQYXJzZXIuaApAQCAtMjQsNyArMjQsOCBAQAogCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW9UZXN0aW5nLmg+Ci0jaW5jbHVkZSA8QUF1ZGlvRXhhbXBsZVV0aWxzLmg+CisKKyNpbmNsdWRlICJBQXVkaW9FeGFtcGxlVXRpbHMuaCIKIAogLy8gVE9ETyB1c2UgdGhpcyBhcyBhIGJhc2UgY2xhc3Mgd2l0aGluIEFBdWRpbwogY2xhc3MgQUF1ZGlvUGFyYW1ldGVycyB7CkBAIC0xNDksNiArMTUwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgc2V0Q2hhbm5lbENvdW50KGF0b2koJmFyZ1syXSkpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgICAgICAgICAgc2V0RGV2aWNlSWQoYXRvaSgmYXJnWzJdKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICAgICAgICAgICBtRHVyYXRpb25TZWNvbmRzID0gYXRvaSgmYXJnWzJdKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAnbSc6IHsKQEAgLTIwMSw3ICsyMDUsOCBAQAogICAgICAgICBwcmludGYoIiAgICAgIERlZmF1bHQgdmFsdWVzIGFyZSBVTlNQRUNJRklFRCB1bmxlc3Mgb3RoZXJ3aXNlIHN0YXRlZC5cbiIpOwogICAgICAgICBwcmludGYoIiAgICAgIC1ie2J1ZmZlckNhcGFjaXR5fSBmcmFtZXNcbiIpOwogICAgICAgICBwcmludGYoIiAgICAgIC1je2NoYW5uZWxzfSBmb3IgZXhhbXBsZSAyIGZvciBzdGVyZW9cbiIpOwotICAgICAgICBwcmludGYoIiAgICAgIC1ke2R1cmF0aW9ufSBpbiBzZWNvbmRzLCBkZWZhdWx0IGlzICVkXG4iLCBERUZBVUxUX0RVUkFUSU9OX1NFQ09ORFMpOworICAgICAgICBwcmludGYoIiAgICAgIC1ke2RldmljZUlkfSBkZWZhdWx0IGlzICVkXG4iLCBBQVVESU9fVU5TUEVDSUZJRUQpOworICAgICAgICBwcmludGYoIiAgICAgIC1ze2R1cmF0aW9ufSBpbiBzZWNvbmRzLCBkZWZhdWx0IGlzICVkXG4iLCBERUZBVUxUX0RVUkFUSU9OX1NFQ09ORFMpOwogICAgICAgICBwcmludGYoIiAgICAgIC1tezB8MXwyfDN9IHNldCBNTUFQIHBvbGljeVxuIik7CiAgICAgICAgIHByaW50ZigiICAgICAgICAgIDAgPSBfVU5TUEVDSUZJRUQsIGRlZmF1bHRcbiIpOwogICAgICAgICBwcmludGYoIiAgICAgICAgICAxID0gX05FVkVSXG4iKTsKQEAgLTIzOSw3ICsyNDQsNyBAQAogICAgICAqIFByaW50IHN0cmVhbSBwYXJhbWV0ZXJzIGluIGNvbXBhcmlzb24gd2l0aCByZXF1ZXN0ZWQgdmFsdWVzLgogICAgICAqIEBwYXJhbSBzdHJlYW0KICAgICAgKi8KLSAgICB2b2lkIGNvbXBhcmVXaXRoU3RyZWFtKEFBdWRpb1N0cmVhbSAqc3RyZWFtKSB7CisgICAgdm9pZCBjb21wYXJlV2l0aFN0cmVhbShBQXVkaW9TdHJlYW0gKnN0cmVhbSkgY29uc3QgewogCiAgICAgICAgIHByaW50ZigiICBEZXZpY2VJZDogICAgIHJlcXVlc3RlZCA9ICVkLCBhY3R1YWwgPSAlZFxuIiwKICAgICAgICAgICAgICAgIGdldERldmljZUlkKCksIEFBdWRpb1N0cmVhbV9nZXREZXZpY2VJZChzdHJlYW0pKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9FeGFtcGxlVXRpbHMuaCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9FeGFtcGxlVXRpbHMuaAppbmRleCAxNTZjN2JlLi4yNjcxYzNhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvRXhhbXBsZVV0aWxzLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0V4YW1wbGVVdGlscy5oCkBAIC0xNywzMSArMTcsNzQgQEAKICNpZm5kZWYgQUFVRElPX0VYQU1QTEVfVVRJTFNfSAogI2RlZmluZSBBQVVESU9fRVhBTVBMRV9VVElMU19ICiAKKyNpbmNsdWRlIDxhdG9taWM+CiAjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgogI2luY2x1ZGUgPHNjaGVkLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KIAogI2RlZmluZSBOQU5PU19QRVJfTUlDUk9TRUNPTkQgKChpbnQ2NF90KTEwMDApCiAjZGVmaW5lIE5BTk9TX1BFUl9NSUxMSVNFQ09ORCAoTkFOT1NfUEVSX01JQ1JPU0VDT05EICogMTAwMCkKICNkZWZpbmUgTkFOT1NfUEVSX1NFQ09ORCAgICAgIChOQU5PU19QRVJfTUlMTElTRUNPTkQgKiAxMDAwKQogCi10ZW1wbGF0ZSA8Y2xhc3MgVCA9IGFhdWRpb19zaGFyaW5nX21vZGVfdD4KIGNvbnN0IGNoYXIgKmdldFNoYXJpbmdNb2RlVGV4dChhYXVkaW9fc2hhcmluZ19tb2RlX3QgbW9kZSkgewotICAgIGNvbnN0IGNoYXIgKm1vZGVUZXh0ID0gInVua25vd24iOworICAgIGNvbnN0IGNoYXIgKnRleHQgPSAidW5rbm93biI7CiAgICAgc3dpdGNoIChtb2RlKSB7Ci0gICAgY2FzZSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRToKLSAgICAgICAgbW9kZVRleHQgPSAiRVhDTFVTSVZFIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDoKLSAgICAgICAgbW9kZVRleHQgPSAiU0hBUkVEIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU6CisgICAgICAgICAgICB0ZXh0ID0gIkVYQ0xVU0lWRSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDoKKyAgICAgICAgICAgIHRleHQgPSAiU0hBUkVEIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIHJldHVybiBtb2RlVGV4dDsKKyAgICByZXR1cm4gdGV4dDsKK30KKworY29uc3QgY2hhciAqZ2V0UGVyZm9ybWFuY2VNb2RlVGV4dChhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IG1vZGUpIHsKKyAgICBjb25zdCBjaGFyICp0ZXh0ID0gInVua25vd24iOworICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkU6CisgICAgICAgICAgICB0ZXh0ID0gIk5PTkUiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1k6CisgICAgICAgICAgICB0ZXh0ID0gIkxPV19MQVRFTkNZIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX1BPV0VSX1NBVklORzoKKyAgICAgICAgICAgIHRleHQgPSAiUE9XRVJfU0FWSU5HIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB0ZXh0OworfQorCitjb25zdCBjaGFyICpnZXREaXJlY3Rpb25UZXh0KGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIHsKKyAgICBjb25zdCBjaGFyICp0ZXh0ID0gInVua25vd24iOworICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7CisgICAgICAgIGNhc2UgQUFVRElPX0RJUkVDVElPTl9JTlBVVDoKKyAgICAgICAgICAgIHRleHQgPSAiSU5QVVQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQ6CisgICAgICAgICAgICB0ZXh0ID0gIk9VVFBVVCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gdGV4dDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQgPSBpbnQ2NF90Pgordm9pZCBjb252ZXJ0TmFub3NlY29uZHNUb1RpbWVzcGVjKGludDY0X3QgbmFub3NlY29uZHMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZSkgeworICAgIHRpbWUtPnR2X3NlYyA9IG5hbm9zZWNvbmRzIC8gTkFOT1NfUEVSX1NFQ09ORDsKKyAgICAvLyBDYWxjdWxhdGUgdGhlIGZyYWN0aW9uYWwgbmFub3NlY29uZHMuIEF2b2lkcyBleHBlbnNpdmUgJSBvcGVyYXRpb24uCisgICAgdGltZS0+dHZfbnNlYyA9IG5hbm9zZWNvbmRzIC0gKHRpbWUtPnR2X3NlYyAqIE5BTk9TX1BFUl9TRUNPTkQpOwogfQogCiB0ZW1wbGF0ZSA8Y2xhc3MgVCA9IGNsb2NraWRfdD4KQEAgLTU0LDYgKzk3LDcgQEAKICAgICByZXR1cm4gKHRpbWUudHZfc2VjICogTkFOT1NfUEVSX1NFQ09ORCkgKyB0aW1lLnR2X25zZWM7CiB9CiAKK3RlbXBsYXRlIDxjbGFzcyBUID0gZmxvYXQ+CiB2b2lkIGRpc3BsYXlQZWFrTGV2ZWwoZmxvYXQgcGVha0xldmVsKSB7CiAgICAgcHJpbnRmKCIlNS4zZiAiLCBwZWFrTGV2ZWwpOwogICAgIGNvbnN0IGludCBtYXhTdGFycyA9IDUwOyAvLyBhcmJpdHJhcnksIGZpdHMgb24gb25lIGxpbmUKQEAgLTY0LDQgKzEwOCwxMDEgQEAKICAgICBwcmludGYoIlxuIik7CiB9CiAKKy8qKgorICogQHBhcmFtIHBvc2l0aW9uMSBwb3NpdGlvbiBvZiBoYXJkd2FyZSBmcmFtZQorICogQHBhcmFtIG5hbm9zZWNvbmRzMQorICogQHBhcmFtIHBvc2l0aW9uMiBwb3NpdGlvbiBvZiBjbGllbnQgcmVhZC93cml0ZQorICogQHBhcmFtIG5hbm9zZWNvbmRzMgorICogQHBhcmFtIHNhbXBsZVJhdGUKKyAqIEByZXR1cm4gbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMKKyAqLwordGVtcGxhdGUgPGNsYXNzIFQgPSBpbnQ2NF90PgorZG91YmxlIGNhbGN1bGF0ZUxhdGVuY3lNaWxsaXMoaW50NjRfdCBwb3NpdGlvbjEsIGludDY0X3QgbmFub3NlY29uZHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwb3NpdGlvbjIsIGludDY0X3QgbmFub3NlY29uZHMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzYW1wbGVSYXRlKSB7CisgICAgaW50NjRfdCBkZWx0YUZyYW1lcyA9IHBvc2l0aW9uMiAtIHBvc2l0aW9uMTsKKyAgICBpbnQ2NF90IGRlbHRhVGltZSA9CisgICAgICAgICAgICAoTkFOT1NfUEVSX1NFQ09ORCAqIGRlbHRhRnJhbWVzIC8gc2FtcGxlUmF0ZSk7CisgICAgaW50NjRfdCB0aW1lQ3VycmVudEZyYW1lUGxheWVkID0gbmFub3NlY29uZHMxICsgZGVsdGFUaW1lOworICAgIGludDY0X3QgbGF0ZW5jeU5hbm9zID0gdGltZUN1cnJlbnRGcmFtZVBsYXllZCAtIG5hbm9zZWNvbmRzMjsKKyAgICBkb3VibGUgbGF0ZW5jeU1pbGxpcyA9IGxhdGVuY3lOYW5vcyAvIDEwMDAwMDAuMDsKKyAgICByZXR1cm4gbGF0ZW5jeU1pbGxpczsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFRoZXNlIEZ1dGV4IGNhbGxzIGFyZSBjb21tb24gb25saW5lIGV4YW1wbGVzLgordGVtcGxhdGUgPGNsYXNzIFQgPSBpbnQ+CithbmRyb2lkOjpzdGF0dXNfdCBzeXNfZnV0ZXgodm9pZCAqYWRkcjEsIGludCBvcCwgaW50IHZhbDEsCisgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRpbWVzcGVjICp0aW1lb3V0LCB2b2lkICphZGRyMiwgaW50IHZhbDMpIHsKKyAgICBhbmRyb2lkOjpzdGF0dXNfdCByZXN1bHQgPSAoYW5kcm9pZDo6c3RhdHVzX3QpIHN5c2NhbGwoU1lTX2Z1dGV4LCBhZGRyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AsIHZhbDEsIHRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIyLCB2YWwzKTsKKyAgICByZXR1cm4gKHJlc3VsdCA9PSAwKSA/IDAgOiAtZXJybm87Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUID0gaW50PgorYW5kcm9pZDo6c3RhdHVzX3QgZnV0ZXhfd2FrZSh2b2lkICphZGRyLCBpbnQgbnVtV2FrZSkgeworICAgIC8vIFVzZSBfUFJJVkFURSBiZWNhdXNlIHdlIGFyZSBqdXN0IHVzaW5nIHRoZSBmdXRleCBpbiBvbmUgcHJvY2Vzcy4KKyAgICByZXR1cm4gc3lzX2Z1dGV4KGFkZHIsIEZVVEVYX1dBS0VfUFJJVkFURSwgbnVtV2FrZSwgTlVMTCwgTlVMTCwgMCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUID0gaW50PgorYW5kcm9pZDo6c3RhdHVzX3QgZnV0ZXhfd2FpdCh2b2lkICphZGRyLCBpbnQgY3VycmVudCwgc3RydWN0IHRpbWVzcGVjICp0aW1lKSB7CisgICAgLy8gVXNlIF9QUklWQVRFIGJlY2F1c2Ugd2UgYXJlIGp1c3QgdXNpbmcgdGhlIGZ1dGV4IGluIG9uZSBwcm9jZXNzLgorICAgIHJldHVybiBzeXNfZnV0ZXgoYWRkciwgRlVURVhfV0FJVF9QUklWQVRFLCBjdXJyZW50LCB0aW1lLCBOVUxMLCAwKTsKK30KKworLy8gVE9ETyBiZXR0ZXIgbmFtZT8KKy8qKgorICogVGhlIFdha2VVcCBjbGFzcyBpcyB1c2VkIHRvIHNlbmQgYSB3YWtldXAgc2lnbmFsIHRvIG9uZSBvciBtb3JlIHNsZWVwaW5nIHRocmVhZHMuCisgKi8KK2NsYXNzIFdha2VVcCB7CitwdWJsaWM6CisgICAgV2FrZVVwKCkgOiBtVmFsdWUoMCkge30KKyAgICBleHBsaWNpdCBXYWtlVXAoaW50MzJfdCB2YWx1ZSkgOiBtVmFsdWUodmFsdWUpIHt9CisKKyAgICAvKioKKyAgICAgKiBXYWl0IHVudGlsIHRoZSBpbnRlcm5hbCB2YWx1ZSBubyBsb25nZXIgbWF0Y2hlcyB0aGUgZ2l2ZW4gdmFsdWUuCisgICAgICogTm90ZSB0aGF0IHRoaXMgY29kZSB1c2VzIGEgZnV0ZXgsIHdoaWNoIGlzIHN1YmplY3QgdG8gc3B1cmlvdXMgd2FrZS11cHMuCisgICAgICogU28gY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGRlc2lyZWQgY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gemVybyBpZiB0aGUgdmFsdWUgY2hhbmdlcyBvciB2YXJpb3VzIG5lZ2F0aXZlIGVycm9ycyBpbmNsdWRpbmcKKyAgICAgKiAgICAtRVRJTUVET1VUIGlmIGEgdGltZW91dCBvY2N1cnMsCisgICAgICogICAgb3IgLUVJTlRSIGlmIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsLAorICAgICAqICAgIG9yIC1FQUdBSU4gb3IgLUVXT1VMREJMT0NLIGlmIHRoZSBpbnRlcm5hbCB2YWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgc3BlY2lmaWVkIHZhbHVlCisgICAgICovCisgICAgYW5kcm9pZDo6c3RhdHVzX3Qgd2FpdChpbnQzMl90IHZhbHVlLCBpbnQ2NF90IHRpbWVvdXROYW5vc2Vjb25kcykgeworICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgdGltZTsKKyAgICAgICAgY29udmVydE5hbm9zZWNvbmRzVG9UaW1lc3BlYyh0aW1lb3V0TmFub3NlY29uZHMsICZ0aW1lKTsKKyAgICAgICAgcmV0dXJuIGZ1dGV4X3dhaXQoJm1WYWx1ZSwgdmFsdWUsICZ0aW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmNyZW1lbnQgdmFsdWUgYW5kIHdha2UgdXAgYW55IHRocmVhZHMgdGhhdCBuZWVkIHRvIGJlIHdva2VuLgorICAgICAqCisgICAgICogQHJldHVybiBudW1iZXIgb2Ygd2FpdGVycyB3b2tlbiB1cAorICAgICAqLworICAgIGFuZHJvaWQ6OnN0YXR1c190IHdha2UoKSB7CisgICAgICAgICsrbVZhbHVlOworICAgICAgICByZXR1cm4gZnV0ZXhfd2FrZSgmbVZhbHVlLCBJTlRfTUFYKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdmFsdWUgYW5kIHdha2UgdXAgYW55IHRocmVhZHMgdGhhdCBuZWVkIHRvIGJlIHdva2VuLgorICAgICAqCisgICAgICogQHJldHVybiBudW1iZXIgb2Ygd2FpdGVycyB3b2tlbiB1cAorICAgICAqLworICAgIGFuZHJvaWQ6OnN0YXR1c190IHdha2UoaW50MzJfdCB2YWx1ZSkgeworICAgICAgICBtVmFsdWUuc3RvcmUodmFsdWUpOworICAgICAgICByZXR1cm4gZnV0ZXhfd2FrZSgmbVZhbHVlLCBJTlRfTUFYKTsKKyAgICB9CisKKyAgICBpbnQzMl90IGdldCgpIHsKKyAgICAgICAgcmV0dXJuIG1WYWx1ZS5sb2FkKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6YXRvbWljPGludDMyX3Q+ICAgbVZhbHVlOworfTsKKwogI2VuZGlmIC8vIEFBVURJT19FWEFNUExFX1VUSUxTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVQbGF5ZXIuaCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVQbGF5ZXIuaAppbmRleCBjYzBjYjM0Li42MDZjNGJhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUGxheWVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVBsYXllci5oCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8c2NoZWQuaD4KIAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlIDxhdG9taWM+CiAjaW5jbHVkZSAiQUF1ZGlvQXJnc1BhcnNlci5oIgogI2luY2x1ZGUgIlNpbmVHZW5lcmF0b3IuaCIKIApAQCAtMzUsNiArMzYsMTMgQEAKIC8vIEhvdyBsb25nIHRvIHNsZWVwIGluIGEgY2FsbGJhY2sgdG8gY2F1c2UgYW4gaW50ZW50aW9uYWwgZ2xpdGNoLiBGb3IgdGVzdGluZy4KICNkZWZpbmUgRk9SQ0VEX1VOREVSUlVOX1NMRUVQX01JQ1JPUyAgICAgKDEwICogMTAwMCkKIAorI2RlZmluZSBNQVhfVElNRVNUQU1QUyAgIDE2CisKK3R5cGVkZWYgc3RydWN0IFRpbWVzdGFtcCB7CisgICAgaW50NjRfdCBwb3NpdGlvbjsKKyAgICBpbnQ2NF90IG5hbm9zZWNvbmRzOworfSBUaW1lc3RhbXA7CisKIC8qKgogICogU2ltcGxlIHdyYXBwZXIgZm9yIEFBdWRpbyB0aGF0IG9wZW5zIGFuIG91dHB1dCBzdHJlYW0gZWl0aGVyIGluIGNhbGxiYWNrIG9yIGJsb2NraW5nIHdyaXRlIG1vZGUuCiAgKi8KQEAgLTIxOSwxOCArMjI3LDI4IEBACiAgICAgQUF1ZGlvU3RyZWFtICAgICAgICAgICAgICptU3RyZWFtID0gbnVsbHB0cjsKICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3QgICAgIG1SZXF1ZXN0ZWRTaGFyaW5nTW9kZSA9IFNIQVJJTkdfTU9ERTsKICAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IG1SZXF1ZXN0ZWRQZXJmb3JtYW5jZU1vZGUgPSBQRVJGT1JNQU5DRV9NT0RFOworCiB9OwogCiB0eXBlZGVmIHN0cnVjdCBTaW5lVGhyZWFkZWREYXRhX3MgeworCiAgICAgU2luZUdlbmVyYXRvciAgc2luZU9zYzE7CiAgICAgU2luZUdlbmVyYXRvciAgc2luZU9zYzI7CisgICAgVGltZXN0YW1wICAgICAgdGltZXN0YW1wc1tNQVhfVElNRVNUQU1QU107CiAgICAgaW50NjRfdCAgICAgICAgZnJhbWVzVG90YWwgPSAwOwogICAgIGludDY0X3QgICAgICAgIG5leHRGcmFtZVRvR2xpdGNoID0gRk9SQ0VEX1VOREVSUlVOX1BFUklPRF9GUkFNRVM7CiAgICAgaW50MzJfdCAgICAgICAgbWluTnVtRnJhbWVzID0gSU5UMzJfTUFYOwogICAgIGludDMyX3QgICAgICAgIG1heE51bUZyYW1lcyA9IDA7Ci0gICAgaW50ICAgICAgICAgICAgc2NoZWR1bGVyOworICAgIGludDMyX3QgICAgICAgIHRpbWVzdGFtcENvdW50ID0gMDsgLy8gaW4gdGltZXN0YW1wcworCisgICAgaW50ICAgICAgICAgICAgc2NoZWR1bGVyID0gMDsKICAgICBib29sICAgICAgICAgICBzY2hlZHVsZXJDaGVja2VkID0gZmFsc2U7CiAgICAgYm9vbCAgICAgICAgICAgZm9yY2VVbmRlcnJ1bnMgPSBmYWxzZTsKKworICAgIEFBdWRpb1NpbXBsZVBsYXllciBzaW1wbGVQbGF5ZXI7CisgICAgaW50MzJfdCAgICAgICAgICAgIGNhbGxiYWNrQ291bnQgPSAwOworICAgIFdha2VVcCAgICAgICAgICAgICB3YWtlcntBQVVESU9fT0t9OworCiB9IFNpbmVUaHJlYWRlZERhdGFfdDsKIAogLy8gQ2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBmaWxscyB0aGUgYXVkaW8gb3V0cHV0IGJ1ZmZlci4KQEAgLTI0Nyw2ICsyNjUsNyBAQAogICAgICAgICByZXR1cm4gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QOwogICAgIH0KICAgICBTaW5lVGhyZWFkZWREYXRhX3QgKnNpbmVEYXRhID0gKFNpbmVUaHJlYWRlZERhdGFfdCAqKSB1c2VyRGF0YTsKKyAgICBzaW5lRGF0YS0+Y2FsbGJhY2tDb3VudCsrOwogCiAgICAgc2luZURhdGEtPmZyYW1lc1RvdGFsICs9IG51bUZyYW1lczsKIApAQCAtMjYzLDYgKzI4MiwxNyBAQAogICAgICAgICBzaW5lRGF0YS0+c2NoZWR1bGVyQ2hlY2tlZCA9IHRydWU7CiAgICAgfQogCisgICAgaWYgKHNpbmVEYXRhLT50aW1lc3RhbXBDb3VudCA8IE1BWF9USU1FU1RBTVBTKSB7CisgICAgICAgIFRpbWVzdGFtcCAqdGltZXN0YW1wID0gJnNpbmVEYXRhLT50aW1lc3RhbXBzW3NpbmVEYXRhLT50aW1lc3RhbXBDb3VudF07CisgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TdHJlYW1fZ2V0VGltZXN0YW1wKHN0cmVhbSwKKyAgICAgICAgICAgIENMT0NLX01PTk9UT05JQywgJnRpbWVzdGFtcC0+cG9zaXRpb24sICZ0aW1lc3RhbXAtPm5hbm9zZWNvbmRzKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0sgJiYgLy8gdmFsaWQ/CisgICAgICAgICAgICAgICAgKHNpbmVEYXRhLT50aW1lc3RhbXBDb3VudCA9PSAwIHx8IC8vIGZpcnN0IG9uZT8KKyAgICAgICAgICAgICAgICAodGltZXN0YW1wLT5wb3NpdGlvbiAhPSAodGltZXN0YW1wIC0gMSktPnBvc2l0aW9uKSkpIHsgLy8gYWR2YW5jZWQgcG9zaXRpb24/CisgICAgICAgICAgICBzaW5lRGF0YS0+dGltZXN0YW1wQ291bnQrKzsgLy8ga2VlcCB0aGlzIG9uZQorICAgICAgICB9CisgICAgfQorCiAgICAgaWYgKG51bUZyYW1lcyA+IHNpbmVEYXRhLT5tYXhOdW1GcmFtZXMpIHsKICAgICAgICAgc2luZURhdGEtPm1heE51bUZyYW1lcyA9IG51bUZyYW1lczsKICAgICB9CkBAIC0zMDQsOSArMzM0LDE2IEBACiB2b2lkIFNpbXBsZVBsYXllckVycm9yQ2FsbGJhY2tQcm9jKAogICAgICAgICBBQXVkaW9TdHJlYW0gKnN0cmVhbSBfX3VudXNlZCwKICAgICAgICAgdm9pZCAqdXNlckRhdGEgX191bnVzZWQsCi0gICAgICAgIGFhdWRpb19yZXN1bHRfdCBlcnJvcikKLXsKLSAgICBwcmludGYoIkVycm9yIENhbGxiYWNrLCBlcnJvcjogJWRcbiIsKGludCllcnJvcik7CisgICAgICAgIGFhdWRpb19yZXN1bHRfdCBlcnJvcikgeworICAgIC8vIHNob3VsZCBub3QgaGFwcGVuIGJ1dCBqdXN0IGluIGNhc2UuLi4KKyAgICBpZiAodXNlckRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICBwcmludGYoIkVSUk9SIC0gTXlQbGF5ZXJFcnJvckNhbGxiYWNrUHJvYyBuZWVkcyB1c2VyRGF0YVxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgU2luZVRocmVhZGVkRGF0YV90ICpzaW5lRGF0YSA9IChTaW5lVGhyZWFkZWREYXRhX3QgKikgdXNlckRhdGE7CisgICAgYW5kcm9pZDo6c3RhdHVzX3QgcmV0ID0gc2luZURhdGEtPndha2VyLndha2UoZXJyb3IpOworICAgIHByaW50ZigiRXJyb3IgQ2FsbGJhY2ssIGVycm9yOiAlZCwgZnV0ZXggd2FrZSByZXR1cm5zICVkXG4iLCBlcnJvciwgcmV0KTsKIH0KIAorCiAjZW5kaWYgLy9BQVVESU9fU0lNUExFX1BMQVlFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUmVjb3JkZXIuaCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVSZWNvcmRlci5oCmluZGV4IDVlY2FjMDQuLjEzNDQyNzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVSZWNvcmRlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVSZWNvcmRlci5oCkBAIC03Nyw3ICs3Nyw3IEBACiAgICAgICAgIGlmIChtU3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gQUF1ZGlvU3RyZWFtX2dldENoYW5uZWxDb3VudChtU3RyZWFtKTsKKyAgICAgICAgcmV0dXJuIEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQobVN0cmVhbSk7OwogICAgIH0KIAogICAgIC8qKgpAQCAtMTg3LDcgKzE4Nyw3IEBACiAKICAgICAvLyBXcml0ZSB6ZXJvIGRhdGEgdG8gZmlsbCB1cCB0aGUgYnVmZmVyIGFuZCBwcmV2ZW50IHVuZGVycnVucy4KICAgICBhYXVkaW9fcmVzdWx0X3QgcHJpbWUoKSB7Ci0gICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lID0gQUF1ZGlvU3RyZWFtX2dldFNhbXBsZXNQZXJGcmFtZShtU3RyZWFtKTsKKyAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUgPSBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KG1TdHJlYW0pOwogICAgICAgICBjb25zdCBpbnQgbnVtRnJhbWVzID0gMzI7IC8vIGFyYml0cmFyeQogICAgICAgICBmbG9hdCB6ZXJvc1tudW1GcmFtZXMgKiBzYW1wbGVzUGVyRnJhbWVdOwogICAgICAgICBtZW1zZXQoemVyb3MsIDAsIHNpemVvZih6ZXJvcykpOwpAQCAtMjYwLDcgKzI2MCw3IEBACiAgICAgfQogICAgIFBlYWtUcmFja2VyRGF0YV90ICpkYXRhID0gKFBlYWtUcmFja2VyRGF0YV90ICopIHVzZXJEYXRhOwogICAgIC8vIHByaW50ZigiTXlDYWxsYmFja1Byb2MoKTogZnJhbWVDb3VudCA9ICVkXG4iLCBudW1GcmFtZXMpOwotICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lID0gQUF1ZGlvU3RyZWFtX2dldFNhbXBsZXNQZXJGcmFtZShzdHJlYW0pOworICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lID0gQUF1ZGlvU3RyZWFtX2dldENoYW5uZWxDb3VudChzdHJlYW0pOwogICAgIGZsb2F0IHNhbXBsZTsKICAgICAvLyBUaGlzIGNvZGUgYXNzdW1lIG1vbm8gb3Igc3RlcmVvLgogICAgIHN3aXRjaCAoQUF1ZGlvU3RyZWFtX2dldEZvcm1hdChzdHJlYW0pKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvU2luZUdlbmVyYXRvci5oIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL1NpbmVHZW5lcmF0b3IuaAppbmRleCA2NGI3NzJkLi5hNzU1NTgyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvU2luZUdlbmVyYXRvci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9TaW5lR2VuZXJhdG9yLmgKQEAgLTU4LDYgKzU4LDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICB2b2lkIHNldEFtcGxpdHVkZShkb3VibGUgYW1wbGl0dWRlKSB7CisgICAgICAgIG1BbXBsaXR1ZGUgPSBhbXBsaXR1ZGU7CisgICAgfQorICAgIGRvdWJsZSBnZXRBbXBsaXR1ZGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQW1wbGl0dWRlOworICAgIH0KKwogcHJpdmF0ZToKICAgICB2b2lkIGFkdmFuY2VQaGFzZSgpIHsKICAgICAgICAgbVBoYXNlICs9IG1QaGFzZUluY3JlbWVudDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lLmNwcCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lLmNwcAppbmRleCA2NTZhYjA1Li44YzZmNzgzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmUuY3BwCkBAIC01Niw3ICs1Niw3IEBACiAgICAgLy8gaW4gYSBidWZmZXIgaWYgd2UgaGFuZyBvciBjcmFzaC4KICAgICBzZXR2YnVmKHN0ZG91dCwgbnVsbHB0ciwgX0lPTkJGLCAoc2l6ZV90KSAwKTsKIAotICAgIHByaW50ZigiJXMgLSBQbGF5IGEgc2luZSB3YXZlIHVzaW5nIEFBdWRpbyBWMC4xLjFcbiIsIGFyZ3ZbMF0pOworICAgIHByaW50ZigiJXMgLSBQbGF5IGEgc2luZSB3YXZlIHVzaW5nIEFBdWRpbyBWMC4xLjJcbiIsIGFyZ3ZbMF0pOwogCiAgICAgaWYgKGFyZ1BhcnNlci5wYXJzZUFyZ3MoYXJnYywgYXJndikpIHsKICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lX2NhbGxiYWNrLmNwcCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lX2NhbGxiYWNrLmNwcAppbmRleCBiNTYwMmU5Li40ZjljZGU2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZV9jYWxsYmFjay5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmVfY2FsbGJhY2suY3BwCkBAIC0xNSw2ICsxNSw3IEBACiAgKi8KIAogLy8gUGxheSBzaW5lIHdhdmVzIHVzaW5nIGFuIEFBdWRpbyBjYWxsYmFjay4KKy8vIElmIGEgZGlzY29ubmVjdGlvbiBvY2N1cnMgdGhlbiByZW9wZW4gdGhlIHN0cmVhbSBvbiB0aGUgbmV3IGRldmljZS4KIAogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgpAQCAtMjIsMzMgKzIzLDMyIEBACiAjaW5jbHVkZSA8c2NoZWQuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogI2luY2x1ZGUgIkFBdWRpb0V4YW1wbGVVdGlscy5oIgogI2luY2x1ZGUgIkFBdWRpb1NpbXBsZVBsYXllci5oIgogI2luY2x1ZGUgIi4uLy4uL3V0aWxzL0FBdWRpb1NpbXBsZVBsYXllci5oIgogCi1pbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCisvKioKKyAqIE9wZW4gc3RyZWFtLCBwbGF5IHNvbWUgc2luZSB3YXZlcywgdGhlbiBjbG9zZSB0aGUgc3RyZWFtLgorICoKKyAqIEBwYXJhbSBhcmdQYXJzZXIKKyAqIEByZXR1cm4gQUFVRElPX09LIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGFhdWRpb19yZXN1bHRfdCB0ZXN0T3BlblBsYXlDbG9zZShBQXVkaW9BcmdzUGFyc2VyICZhcmdQYXJzZXIpCiB7Ci0gICAgQUF1ZGlvQXJnc1BhcnNlciAgIGFyZ1BhcnNlcjsKLSAgICBBQXVkaW9TaW1wbGVQbGF5ZXIgcGxheWVyOwogICAgIFNpbmVUaHJlYWRlZERhdGFfdCBteURhdGE7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdDsKLSAgICBpbnQzMl90IGFjdHVhbFNhbXBsZVJhdGU7CisgICAgQUF1ZGlvU2ltcGxlUGxheWVyICZwbGF5ZXIgPSBteURhdGEuc2ltcGxlUGxheWVyOworICAgIGFhdWRpb19yZXN1bHRfdCAgICByZXN1bHQgPSBBQVVESU9fT0s7CisgICAgYm9vbCAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RlZCA9IGZhbHNlOworICAgIGludDY0X3QgICAgICAgICAgICBzdGFydGVkQXROYW5vczsKIAotICAgIC8vIE1ha2UgcHJpbnRmIHByaW50IGltbWVkaWF0ZWx5IHNvIHRoYXQgZGVidWcgaW5mbyBpcyBub3Qgc3R1Y2sKLSAgICAvLyBpbiBhIGJ1ZmZlciBpZiB3ZSBoYW5nIG9yIGNyYXNoLgotICAgIHNldHZidWYoc3Rkb3V0LCBudWxscHRyLCBfSU9OQkYsIChzaXplX3QpIDApOwotCi0gICAgcHJpbnRmKCIlcyAtIFBsYXkgYSBzaW5lIHN3ZWVwIHVzaW5nIGFuIEFBdWRpbyBjYWxsYmFjayBWMC4xLjJcbiIsIGFyZ3ZbMF0pOwotCisgICAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBydW4gY29tcGxldGUgdGVzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAgICAgbXlEYXRhLnNjaGVkdWxlckNoZWNrZWQgPSBmYWxzZTsKKyAgICBteURhdGEuY2FsbGJhY2tDb3VudCA9IDA7CiAgICAgbXlEYXRhLmZvcmNlVW5kZXJydW5zID0gZmFsc2U7IC8vIHNldCB0cnVlIHRvIHRlc3QgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudCgpCiAKLSAgICBpZiAoYXJnUGFyc2VyLnBhcnNlQXJncyhhcmdjLCBhcmd2KSkgewotICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwotICAgIH0KLQogICAgIHJlc3VsdCA9IHBsYXllci5vcGVuKGFyZ1BhcnNlciwKICAgICAgICAgICAgICAgICAgICAgICAgICBTaW1wbGVQbGF5ZXJEYXRhQ2FsbGJhY2tQcm9jLCBTaW1wbGVQbGF5ZXJFcnJvckNhbGxiYWNrUHJvYywgJm15RGF0YSk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKQEAgLTU4LDEzICs1OCwxOSBAQAogCiAgICAgYXJnUGFyc2VyLmNvbXBhcmVXaXRoU3RyZWFtKHBsYXllci5nZXRTdHJlYW0oKSk7CiAKLSAgICBhY3R1YWxTYW1wbGVSYXRlID0gcGxheWVyLmdldFNhbXBsZVJhdGUoKTsKLSAgICBteURhdGEuc2luZU9zYzEuc2V0dXAoNDQwLjAsIGFjdHVhbFNhbXBsZVJhdGUpOwotICAgIG15RGF0YS5zaW5lT3NjMS5zZXRTd2VlcCgzMDAuMCwgNjAwLjAsIDUuMCk7Ci0gICAgbXlEYXRhLnNpbmVPc2MyLnNldHVwKDY2MC4wLCBhY3R1YWxTYW1wbGVSYXRlKTsKLSAgICBteURhdGEuc2luZU9zYzIuc2V0U3dlZXAoMzUwLjAsIDkwMC4wLCA3LjApOworICAgIC8vIFNldHVwIHNpbmUgd2F2ZSBnZW5lcmF0b3JzLgorICAgIHsKKyAgICAgICAgaW50MzJfdCBhY3R1YWxTYW1wbGVSYXRlID0gcGxheWVyLmdldFNhbXBsZVJhdGUoKTsKKyAgICAgICAgbXlEYXRhLnNpbmVPc2MxLnNldHVwKDQ0MC4wLCBhY3R1YWxTYW1wbGVSYXRlKTsKKyAgICAgICAgbXlEYXRhLnNpbmVPc2MxLnNldFN3ZWVwKDMwMC4wLCA2MDAuMCwgNS4wKTsKKyAgICAgICAgbXlEYXRhLnNpbmVPc2MxLnNldEFtcGxpdHVkZSgwLjIpOworICAgICAgICBteURhdGEuc2luZU9zYzIuc2V0dXAoNjYwLjAsIGFjdHVhbFNhbXBsZVJhdGUpOworICAgICAgICBteURhdGEuc2luZU9zYzIuc2V0U3dlZXAoMzUwLjAsIDkwMC4wLCA3LjApOworICAgICAgICBteURhdGEuc2luZU9zYzIuc2V0QW1wbGl0dWRlKDAuMik7CisgICAgfQogCiAjaWYgMAorICAgIC8vICB3cml0ZXMgbm90IGFsbG93ZWQgZm9yIGNhbGxiYWNrIHN0cmVhbXMKICAgICByZXN1bHQgPSBwbGF5ZXIucHJpbWUoKTsgLy8gRklYTUUgY3Jhc2hlcyBBdWRpb1RyYWNrLmNwcAogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgLSBwbGF5ZXIucHJpbWUoKSByZXR1cm5lZCAlZFxuIiwgcmVzdWx0KTsKQEAgLTc4LDM0ICs4NCwzMiBAQAogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAorICAgIC8vIFBsYXkgYSBzaW5lIHdhdmUgaW4gdGhlIGJhY2tncm91bmQuCiAgICAgcHJpbnRmKCJTbGVlcCBmb3IgJWQgc2Vjb25kcyB3aGlsZSBhdWRpbyBwbGF5cyBpbiBhIGNhbGxiYWNrIHRocmVhZC5cbiIsCiAgICAgICAgICAgIGFyZ1BhcnNlci5nZXREdXJhdGlvblNlY29uZHMoKSk7CisgICAgc3RhcnRlZEF0TmFub3MgPSBnZXROYW5vc2Vjb25kcyhDTE9DS19NT05PVE9OSUMpOwogICAgIGZvciAoaW50IHNlY29uZCA9IDA7IHNlY29uZCA8IGFyZ1BhcnNlci5nZXREdXJhdGlvblNlY29uZHMoKTsgc2Vjb25kKyspCiAgICAgewotICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgcmVxdWVzdCA9IHsgLnR2X3NlYyA9IDEsIC50dl9uc2VjID0gMCB9OwotICAgICAgICAodm9pZCkgY2xvY2tfbmFub3NsZWVwKENMT0NLX01PTk9UT05JQywgMCAvKmZsYWdzKi8sICZyZXF1ZXN0LCBOVUxMIC8qcmVtYWluKi8pOwotCi0gICAgICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBzdGF0ZTsKLSAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3dhaXRGb3JTdGF0ZUNoYW5nZShwbGF5ZXIuZ2V0U3RyZWFtKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAvLyBTbGVlcCBhIHdoaWxlLiBXYWtlIHVwIGVhcmx5IGlmIHRoZXJlIGlzIGFuIGVycm9yLCBmb3IgZXhhbXBsZSBhIERJU0NPTk5FQ1QuCisgICAgICAgIGxvbmcgcmV0ID0gbXlEYXRhLndha2VyLndhaXQoQUFVRElPX09LLCBOQU5PU19QRVJfU0VDT05EKTsKKyAgICAgICAgaW50NjRfdCBtaWxsaXMgPSAoZ2V0TmFub3NlY29uZHMoQ0xPQ0tfTU9OT1RPTklDKSAtIHN0YXJ0ZWRBdE5hbm9zKSAvIE5BTk9TX1BFUl9NSUxMSVNFQ09ORDsKKyAgICAgICAgcmVzdWx0ID0gbXlEYXRhLndha2VyLmdldCgpOworICAgICAgICBwcmludGYoIndhaXQoKSByZXR1cm5zICVsZCwgYWF1ZGlvX3Jlc3VsdCA9ICVkLCBhdCAlNmQgbWlsbGlzIgorICAgICAgICAgICAgICAgIiwgc2Vjb25kID0gJWQsIGZyYW1lc1dyaXR0ZW4gPSAlOGQsIHVuZGVycnVucyA9ICVkXG4iLAorICAgICAgICAgICAgICAgcmV0LCByZXN1bHQsIChpbnQpIG1pbGxpcywKKyAgICAgICAgICAgICAgIHNlY29uZCwKKyAgICAgICAgICAgICAgIChpbnQpIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKHBsYXllci5nZXRTdHJlYW0oKSksCisgICAgICAgICAgICAgICAoaW50KSBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50KHBsYXllci5nZXRTdHJlYW0oKSkpOwogICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAtIEFBdWRpb1N0cmVhbV93YWl0Rm9yU3RhdGVDaGFuZ2UoKSByZXR1cm5lZCAlZFxuIiwgcmVzdWx0KTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXRlICE9IEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRJTkcgJiYgc3RhdGUgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEKSB7Ci0gICAgICAgICAgICBwcmludGYoIlN0cmVhbSBzdGF0ZSBpcyAlZCAlcyFcbiIsIHN0YXRlLCBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KHN0YXRlKSk7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICBkaXNjb25uZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgcHJpbnRmKCJmcmFtZXNXcml0dGVuID0gJWQsIHVuZGVycnVucyA9ICVkXG4iLAotICAgICAgICAgICAgICAgKGludCkgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4ocGxheWVyLmdldFN0cmVhbSgpKSwKLSAgICAgICAgICAgICAgIChpbnQpIEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQocGxheWVyLmdldFN0cmVhbSgpKQotICAgICAgICApOwogICAgIH0KLSAgICBwcmludGYoIldva2UgdXAgbm93LlxuIik7CisgICAgcHJpbnRmKCJBQXVkaW8gcmVzdWx0ID0gJWQgPSAlc1xuIiwgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKIAotICAgIHByaW50ZigiY2FsbCBzdG9wKClcbiIpOworICAgIHByaW50ZigiY2FsbCBzdG9wKCkgY2FsbGJhY2sgIyA9ICVkXG4iLCBteURhdGEuY2FsbGJhY2tDb3VudCk7CiAgICAgcmVzdWx0ID0gcGxheWVyLnN0b3AoKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICBnb3RvIGVycm9yOwpAQCAtMTE2LDYgKzEyMCwxOCBAQAogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXlEYXRhLnRpbWVzdGFtcENvdW50OyBpKyspIHsKKyAgICAgICAgVGltZXN0YW1wICp0aW1lc3RhbXAgPSAmbXlEYXRhLnRpbWVzdGFtcHNbaV07CisgICAgICAgIGJvb2wgcmV0cm8gPSAoaSA+IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAoKHRpbWVzdGFtcC0+cG9zaXRpb24gPCAodGltZXN0YW1wIC0gMSktPnBvc2l0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICB8fCAoKHRpbWVzdGFtcC0+bmFub3NlY29uZHMgPCAodGltZXN0YW1wIC0gMSktPm5hbm9zZWNvbmRzKSkpKTsKKyAgICAgICAgY29uc3QgY2hhciAqbWVzc2FnZSA9IHJldHJvID8gIiAgPD0gUkVUUk9HUkFERSEiIDogIiI7CisgICAgICAgIHByaW50ZigiVGltZXN0YW1wICUzZCA6ICU4bGxkLCAlOGxsZCAlc1xuIiwgaSwKKyAgICAgICAgICAgICAgIChsb25nIGxvbmcpIHRpbWVzdGFtcC0+cG9zaXRpb24sCisgICAgICAgICAgICAgICAobG9uZyBsb25nKSB0aW1lc3RhbXAtPm5hbm9zZWNvbmRzLAorICAgICAgICAgICAgICAgbWVzc2FnZSk7CisgICAgfQorCiAgICAgaWYgKG15RGF0YS5zY2hlZHVsZXJDaGVja2VkKSB7CiAgICAgICAgIHByaW50Zigic2NoZWR1bGVyID0gMHglMDh4LCBTQ0hFRF9GSUZPID0gMHglMDhYXG4iLAogICAgICAgICAgICAgICAgbXlEYXRhLnNjaGVkdWxlciwKQEAgLTEyNiwxMCArMTQyLDI4IEBACiAgICAgcHJpbnRmKCJtYXggbnVtRnJhbWVzID0gJThkXG4iLCAoaW50KSBteURhdGEubWF4TnVtRnJhbWVzKTsKIAogICAgIHByaW50ZigiU1VDQ0VTU1xuIik7Ci0gICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKIGVycm9yOgogICAgIHBsYXllci5jbG9zZSgpOwotICAgIHByaW50ZigiZXhpdGluZyAtIEFBdWRpbyByZXN1bHQgPSAlZCA9ICVzXG4iLCByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwotICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgcmV0dXJuIGRpc2Nvbm5lY3RlZCA/IEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQgOiByZXN1bHQ7CiB9CiAKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKyAgICBBQXVkaW9BcmdzUGFyc2VyICAgYXJnUGFyc2VyOworICAgIGFhdWRpb19yZXN1bHRfdCAgICByZXN1bHQ7CisKKyAgICAvLyBNYWtlIHByaW50ZiBwcmludCBpbW1lZGlhdGVseSBzbyB0aGF0IGRlYnVnIGluZm8gaXMgbm90IHN0dWNrCisgICAgLy8gaW4gYSBidWZmZXIgaWYgd2UgaGFuZyBvciBjcmFzaC4KKyAgICBzZXR2YnVmKHN0ZG91dCwgbnVsbHB0ciwgX0lPTkJGLCAoc2l6ZV90KSAwKTsKKworICAgIHByaW50ZigiJXMgLSBQbGF5IGEgc2luZSBzd2VlcCB1c2luZyBhbiBBQXVkaW8gY2FsbGJhY2sgVjAuMS4yXG4iLCBhcmd2WzBdKTsKKworICAgIGlmIChhcmdQYXJzZXIucGFyc2VBcmdzKGFyZ2MsIGFyZ3YpKSB7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorCisgICAgLy8gS2VlcCBsb29waW5nIHVudGlsIHdlIGNhbiBjb21wbGV0ZSB0aGUgdGVzdCB3aXRob3V0IGRpc2Nvbm5lY3RpbmcuCisgICAgd2hpbGUoKHJlc3VsdCA9IHRlc3RPcGVuUGxheUNsb3NlKGFyZ1BhcnNlcikpID09IEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQpOworCisgICAgcmV0dXJuIChyZXN1bHQpID8gRVhJVF9GQUlMVVJFIDogRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oIGIvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oCmluZGV4IGUxODg2YWMuLjNjMjM3MzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaAorKysgYi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmgKQEAgLTIzNCwxMCArMjM0LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudCk7CiAKIC8qKgorICogSWRlbnRpY2FsIHRvIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q2hhbm5lbENvdW50KCkuCiAgKgotICogQGRlcHJlY2F0ZWQgdXNlIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q2hhbm5lbENvdW50KCkKKyAqIEBwYXJhbSBidWlsZGVyIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigpCisgKiBAcGFyYW0gc2FtcGxlc1BlckZyYW1lIE51bWJlciBvZiBzYW1wbGVzIGluIGEgZnJhbWUuCiAgKi8KLS8vIFRPRE8gcmVtb3ZlIGFzIHNvb24gYXMgdGhlIE5ESyBhbmQgT1MgYXJlIGluIHN5bmMsIGJlZm9yZSBSQzEKIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNhbXBsZXNQZXJGcmFtZShBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lKTsKIApAQCAtNzI5LDExICs3MzAsMTAgQEAKIEFBVURJT19BUEkgaW50MzJfdCBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KEFBdWRpb1N0cmVhbSogc3RyZWFtKTsKIAogLyoqCi0gKiBUaGUgc2FtcGxlc1BlckZyYW1lIGlzIGFsc28ga25vd24gYXMgY2hhbm5lbENvdW50LgorICogSWRlbnRpY2FsIHRvIEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQoKS4KICAqCi0gKiBAZGVwcmVjYXRlZCB1c2UgQUF1ZGlvU3RyZWFtX2dldENoYW5uZWxDb3VudCgpCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQotICogQHJldHVybiBhY3R1YWwgc2FtcGxlcyBwZXIgZnJhbWUKKyAqIEByZXR1cm4gYWN0dWFsIG51bWJlciBvZiBzYW1wbGVzIGZyYW1lCiAgKi8KIEFBVURJT19BUEkgaW50MzJfdCBBQXVkaW9TdHJlYW1fZ2V0U2FtcGxlc1BlckZyYW1lKEFBdWRpb1N0cmVhbSogc3RyZWFtKTsKIApAQCAtODEwLDcgKzgxMCw3IEBACiAgKiBUaGUgcG9zaXRpb24gYW5kIHRpbWUgcGFzc2VkIGJhY2sgYXJlIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZy4KICAqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQotICogQHBhcmFtIGNsb2NraWQgQUFVRElPX0NMT0NLX01PTk9UT05JQyBvciBBQVVESU9fQ0xPQ0tfQk9PVFRJTUUKKyAqIEBwYXJhbSBjbG9ja2lkIENMT0NLX01PTk9UT05JQyBvciBDTE9DS19CT09UVElNRQogICogQHBhcmFtIGZyYW1lUG9zaXRpb24gcG9pbnRlciB0byBhIHZhcmlhYmxlIHRvIHJlY2VpdmUgdGhlIHBvc2l0aW9uCiAgKiBAcGFyYW0gdGltZU5hbm9zZWNvbmRzIHBvaW50ZXIgdG8gYSB2YXJpYWJsZSB0byByZWNlaXZlIHRoZSB0aW1lCiAgKiBAcmV0dXJuIEFBVURJT19PSyBvciBhIG5lZ2F0aXZlIGVycm9yCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL0FuZHJvaWQuYnAKaW5kZXggNDJmNTc3ZS4uNzg4ODMzYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5icApAQCAtMjEsNyArMjEsNiBAQAogICAgICAgICAibGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmNwcCIsCiAgICAgICAgICJsZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwIiwKICAgICAgICAgImxlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmNwcCIsCi0gICAgICAgICJ1dGlsaXR5L0hhbmRsZVRyYWNrZXIuY3BwIiwKICAgICAgICAgInV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmNwcCIsCiAgICAgICAgICJ1dGlsaXR5L0ZpeGVkQmxvY2tBZGFwdGVyLmNwcCIsCiAgICAgICAgICJ1dGlsaXR5L0ZpeGVkQmxvY2tSZWFkZXIuY3BwIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9CaW5kZXJDbGllbnQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5jcHAKaW5kZXggYTI2OGU0OS4uMDdlZTJkZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5jcHAKQEAgLTQ1LDYgKzQ1LDcgQEAKIHVzaW5nIGFuZHJvaWQ6OklJbnRlcmZhY2U7CiB1c2luZyBhbmRyb2lkOjpJQUF1ZGlvU2VydmljZTsKIHVzaW5nIGFuZHJvaWQ6Ok11dGV4OwordXNpbmcgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOwogdXNpbmcgYW5kcm9pZDo6c3A7CiB1c2luZyBhbmRyb2lkOjp3cDsKIApAQCAtNTIsMTUgKzUzLDE5IEBACiAKIEFORFJPSURfU0lOR0xFVE9OX1NUQVRJQ19JTlNUQU5DRShBQXVkaW9CaW5kZXJDbGllbnQpOwogCisvLyBJZiB3ZSBkb24ndCBrZWVwIGEgc3Ryb25nIHBvaW50ZXIgaGVyZSB0aGVuIHRoaXMgc2luZ2xldG9uIGNhbiBnZXQgZGVsZXRlZCEKK2FuZHJvaWQ6OnNwPEFBdWRpb0JpbmRlckNsaWVudD4gZ0tlZXBCaW5kZXJDbGllbnQ7CisKIEFBdWRpb0JpbmRlckNsaWVudDo6QUF1ZGlvQmluZGVyQ2xpZW50KCkKICAgICAgICAgOiBBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlKCkKICAgICAgICAgLCBTaW5nbGV0b248QUF1ZGlvQmluZGVyQ2xpZW50PigpIHsKLQorICAgIGdLZWVwQmluZGVyQ2xpZW50ID0gdGhpczsgLy8gc28gdGhpcyBzaW5nbGV0b24gd29uJ3QgZ2V0IGRlbGV0ZWQKICAgICBtQUF1ZGlvQ2xpZW50ID0gbmV3IEFBdWRpb0NsaWVudCh0aGlzKTsKLSAgICBBTE9HVigiQUF1ZGlvQmluZGVyQ2xpZW50KCkgY3JlYXRlZCBtQUF1ZGlvQ2xpZW50ID0gJXAiLCBtQUF1ZGlvQ2xpZW50LmdldCgpKTsKKyAgICBBTE9HVigiQUF1ZGlvQmluZGVyQ2xpZW50KCkgdGhpcyA9ICVwLCBjcmVhdGVkIG1BQXVkaW9DbGllbnQgPSAlcCIsIHRoaXMsIG1BQXVkaW9DbGllbnQuZ2V0KCkpOwogfQogCiBBQXVkaW9CaW5kZXJDbGllbnQ6On5BQXVkaW9CaW5kZXJDbGllbnQoKSB7CisgICAgQUxPR1YoIkFBdWRpb0JpbmRlckNsaWVudCgpOjp+QUF1ZGlvQmluZGVyQ2xpZW50KCkgZGVzdHJveWluZyAlcCIsIHRoaXMpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2VydmljZUxvY2spOwogICAgIGlmIChtQUF1ZGlvU2VydmljZSAhPSAwKSB7CiAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1BQXVkaW9TZXJ2aWNlKS0+dW5saW5rVG9EZWF0aChtQUF1ZGlvQ2xpZW50KTsKQEAgLTc1LDE5ICs4MCwxOSBAQAogICAgIGJvb2wgbmVlZFRvUmVnaXN0ZXIgPSBmYWxzZTsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2VydmljZUxvY2spOwotICAgICAgICBpZiAobUFBdWRpb1NlcnZpY2UgPT0gMCkgeworICAgICAgICBpZiAobUFBdWRpb1NlcnZpY2UuZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyOwogICAgICAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwogICAgICAgICAgICAgLy8gVHJ5IHNldmVyYWwgdGltZXMgdG8gZ2V0IHRoZSBzZXJ2aWNlLgogICAgICAgICAgICAgaW50IHJldHJpZXMgPSA0OwogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KEFBVURJT19TRVJWSUNFX05BTUUpKTsgLy8gVGhpcyB3aWxsIHdhaXQgYSB3aGlsZS4KLSAgICAgICAgICAgICAgICBpZiAoYmluZGVyICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoYmluZGVyLmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAocmV0cmllcy0tID4gMCk7CiAKLSAgICAgICAgICAgIGlmIChiaW5kZXIgIT0gMCkgeworICAgICAgICAgICAgaWYgKGJpbmRlci5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgLy8gQXNrIGZvciBub3RpZmljYXRpb24gaWYgdGhlIHNlcnZpY2UgZGllcy4KICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBiaW5kZXItPmxpbmtUb0RlYXRoKG1BQXVkaW9DbGllbnQpOwogICAgICAgICAgICAgICAgIC8vIFRPRE8gcmV2aWV3IHdoYXQgd2Ugc2hvdWxkIGRvIGlmIHRoaXMgZmFpbHMKQEAgLTk4LDcgKzEwMyw3IEBACiAgICAgICAgICAgICAgICAgbUFBdWRpb1NlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJQUF1ZGlvU2VydmljZT4oYmluZGVyKTsKICAgICAgICAgICAgICAgICBuZWVkVG9SZWdpc3RlciA9IHRydWU7CiAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGNhbGxiYWNrcyBjYW4gYmUgcmVjZWl2ZWQgYnkgbUFBdWRpb0NsaWVudAotICAgICAgICAgICAgICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKKyAgICAgICAgICAgICAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIEFMT0dFKCJBQXVkaW9CaW5kZXJDbGllbnQgY291bGQgbm90IGNvbm5lY3QgdG8gJXMiLCBBQVVESU9fU0VSVklDRV9OQU1FKTsKICAgICAgICAgICAgIH0KQEAgLTEwNiw3ICsxMTEsNyBAQAogICAgICAgICBhYXVkaW9TZXJ2aWNlID0gbUFBdWRpb1NlcnZpY2U7CiAgICAgfQogICAgIC8vIERvIHRoaXMgb3V0c2lkZSB0aGUgbXV0ZXggbG9jay4KLSAgICBpZiAobmVlZFRvUmVnaXN0ZXIgJiYgYWF1ZGlvU2VydmljZSAhPSAwKSB7IC8vIG5ldyBjbGllbnQ/CisgICAgaWYgKG5lZWRUb1JlZ2lzdGVyICYmIGFhdWRpb1NlcnZpY2UuZ2V0KCkgIT0gbnVsbHB0cikgeyAvLyBuZXcgY2xpZW50PwogICAgICAgICBhYXVkaW9TZXJ2aWNlLT5yZWdpc3RlckNsaWVudChtQUF1ZGlvQ2xpZW50KTsKICAgICB9CiAgICAgcmV0dXJuIGFhdWRpb1NlcnZpY2U7CkBAIC0xMTcsNyArMTIyLDYgQEAKICAgICBtQUF1ZGlvU2VydmljZS5jbGVhcigpOyAvLyBmb3JjZSBhIHJlY29ubmVjdAogfQogCi0KIC8qKgogKiBAcGFyYW0gcmVxdWVzdCBpbmZvIG5lZWRlZCB0byBjcmVhdGUgdGhlIHN0cmVhbQogKiBAcGFyYW0gY29uZmlndXJhdGlvbiBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3JlYXRlZCBzdHJlYW0KQEAgLTEyOCwxNCArMTMyLDEyIEBACiAgICAgYWF1ZGlvX2hhbmRsZV90IHN0cmVhbTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewogICAgICAgICBjb25zdCBzcDxJQUF1ZGlvU2VydmljZT4gJnNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7Ci0gICAgICAgIGlmIChzZXJ2aWNlID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKLSAgICAgICAgfQorICAgICAgICBpZiAoc2VydmljZS5nZXQoKSA9PSBudWxscHRyKSByZXR1cm4gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0U7CiAKICAgICAgICAgc3RyZWFtID0gc2VydmljZS0+b3BlblN0cmVhbShyZXF1ZXN0LCBjb25maWd1cmF0aW9uT3V0cHV0KTsKIAogICAgICAgICBpZiAoc3RyZWFtID09IEFBVURJT19FUlJPUl9OT19TRVJWSUNFKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQUF1ZGlvQmluZGVyQ2xpZW50OiBsb3N0IGNvbm5lY3Rpb24gdG8gQUF1ZGlvU2VydmljZS4iKTsKKyAgICAgICAgICAgIEFMT0dFKCJBQXVkaW9CaW5kZXJDbGllbnQ6Om9wZW5TdHJlYW0gbG9zdCBjb25uZWN0aW9uIHRvIEFBdWRpb1NlcnZpY2UuIik7CiAgICAgICAgICAgICBkcm9wQUF1ZGlvU2VydmljZSgpOyAvLyBmb3JjZSBhIHJlY29ubmVjdAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYnJlYWs7CkBAIC0xNDUsOCArMTQ3LDggQEAKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb0JpbmRlckNsaWVudDo6Y2xvc2VTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgewotICAgIGNvbnN0IHNwPElBQXVkaW9TZXJ2aWNlPiAmc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKLSAgICBpZiAoc2VydmljZSA9PSAwKSByZXR1cm4gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0U7CisgICAgY29uc3Qgc3A8SUFBdWRpb1NlcnZpY2U+IHNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7CisgICAgaWYgKHNlcnZpY2UuZ2V0KCkgPT0gbnVsbHB0cikgcmV0dXJuIEFBVURJT19FUlJPUl9OT19TRVJWSUNFOwogICAgIHJldHVybiBzZXJ2aWNlLT5jbG9zZVN0cmVhbShzdHJlYW1IYW5kbGUpOwogfQogCkBAIC0xNTUsMzIgKzE1NywzMiBAQAogKi8KIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9CaW5kZXJDbGllbnQ6OmdldFN0cmVhbURlc2NyaXB0aW9uKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkgewotICAgIGNvbnN0IHNwPElBQXVkaW9TZXJ2aWNlPiAmc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKLSAgICBpZiAoc2VydmljZSA9PSAwKSByZXR1cm4gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0U7CisgICAgY29uc3Qgc3A8SUFBdWRpb1NlcnZpY2U+IHNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7CisgICAgaWYgKHNlcnZpY2UuZ2V0KCkgPT0gbnVsbHB0cikgcmV0dXJuIEFBVURJT19FUlJPUl9OT19TRVJWSUNFOwogICAgIHJldHVybiBzZXJ2aWNlLT5nZXRTdHJlYW1EZXNjcmlwdGlvbihzdHJlYW1IYW5kbGUsIHBhcmNlbGFibGUpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvQmluZGVyQ2xpZW50OjpzdGFydFN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSB7Ci0gICAgY29uc3Qgc3A8SUFBdWRpb1NlcnZpY2U+ICZzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOwotICAgIGlmIChzZXJ2aWNlID09IDApIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKKyAgICBjb25zdCBzcDxJQUF1ZGlvU2VydmljZT4gc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKKyAgICBpZiAoc2VydmljZS5nZXQoKSA9PSBudWxscHRyKSByZXR1cm4gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0U7CiAgICAgcmV0dXJuIHNlcnZpY2UtPnN0YXJ0U3RyZWFtKHN0cmVhbUhhbmRsZSk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9CaW5kZXJDbGllbnQ6OnBhdXNlU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKLSAgICBjb25zdCBzcDxJQUF1ZGlvU2VydmljZT4gJnNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7Ci0gICAgaWYgKHNlcnZpY2UgPT0gMCkgcmV0dXJuIEFBVURJT19FUlJPUl9OT19TRVJWSUNFOworICAgIGNvbnN0IHNwPElBQXVkaW9TZXJ2aWNlPiBzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOworICAgIGlmIChzZXJ2aWNlLmdldCgpID09IG51bGxwdHIpIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKICAgICByZXR1cm4gc2VydmljZS0+cGF1c2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb0JpbmRlckNsaWVudDo6c3RvcFN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSB7Ci0gICAgY29uc3Qgc3A8SUFBdWRpb1NlcnZpY2U+ICZzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOwotICAgIGlmIChzZXJ2aWNlID09IDApIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKKyAgICBjb25zdCBzcDxJQUF1ZGlvU2VydmljZT4gc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKKyAgICBpZiAoc2VydmljZS5nZXQoKSA9PSBudWxscHRyKSByZXR1cm4gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0U7CiAgICAgcmV0dXJuIHNlcnZpY2UtPnN0b3BTdHJlYW0oc3RyZWFtSGFuZGxlKTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb0JpbmRlckNsaWVudDo6Zmx1c2hTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgewotICAgIGNvbnN0IHNwPElBQXVkaW9TZXJ2aWNlPiAmc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKLSAgICBpZiAoc2VydmljZSA9PSAwKSByZXR1cm4gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0U7CisgICAgY29uc3Qgc3A8SUFBdWRpb1NlcnZpY2U+IHNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7CisgICAgaWYgKHNlcnZpY2UuZ2V0KCkgPT0gbnVsbHB0cikgcmV0dXJuIEFBVURJT19FUlJPUl9OT19TRVJWSUNFOwogICAgIHJldHVybiBzZXJ2aWNlLT5mbHVzaFN0cmVhbShzdHJlYW1IYW5kbGUpOwogfQogCkBAIC0xOTAsOCArMTkyLDggQEAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9CaW5kZXJDbGllbnQ6OnJlZ2lzdGVyQXVkaW9UaHJlYWQoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgY2xpZW50VGhyZWFkSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcGVyaW9kTmFub3NlY29uZHMpIHsKLSAgICBjb25zdCBzcDxJQUF1ZGlvU2VydmljZT4gJnNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7Ci0gICAgaWYgKHNlcnZpY2UgPT0gMCkgcmV0dXJuIEFBVURJT19FUlJPUl9OT19TRVJWSUNFOworICAgIGNvbnN0IHNwPElBQXVkaW9TZXJ2aWNlPiBzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOworICAgIGlmIChzZXJ2aWNlLmdldCgpID09IG51bGxwdHIpIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKICAgICByZXR1cm4gc2VydmljZS0+cmVnaXN0ZXJBdWRpb1RocmVhZChzdHJlYW1IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50VGhyZWFkSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kTmFub3NlY29uZHMpOwpAQCAtMTk5LDggKzIwMSw4IEBACiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9CaW5kZXJDbGllbnQ6OnVucmVnaXN0ZXJBdWRpb1RocmVhZChhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IGNsaWVudFRocmVhZElkKSB7Ci0gICAgY29uc3Qgc3A8SUFBdWRpb1NlcnZpY2U+ICZzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOwotICAgIGlmIChzZXJ2aWNlID09IDApIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKKyAgICBjb25zdCBzcDxJQUF1ZGlvU2VydmljZT4gc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKKyAgICBpZiAoc2VydmljZS5nZXQoKSA9PSBudWxscHRyKSByZXR1cm4gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0U7CiAgICAgcmV0dXJuIHNlcnZpY2UtPnVucmVnaXN0ZXJBdWRpb1RocmVhZChzdHJlYW1IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRUaHJlYWRJZCk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmgKaW5kZXggODlhZTg1Yy4uZjlkYThiNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9CaW5kZXJDbGllbnQuaApAQCAtMTE4LDEzICsxMTgsMTMgQEAKICAgICB7CiAgICAgcHVibGljOgogICAgICAgICBBQXVkaW9DbGllbnQoYW5kcm9pZDo6d3A8QUF1ZGlvQmluZGVyQ2xpZW50PiBhYXVkaW9CaW5kZXJDbGllbnQpCi0gICAgICAgICAgICA6IG1CaW5kZXJDbGllbnQoYWF1ZGlvQmluZGVyQ2xpZW50KSB7CisgICAgICAgICAgICAgICAgOiBtQmluZGVyQ2xpZW50KGFhdWRpb0JpbmRlckNsaWVudCkgewogICAgICAgICB9CiAKICAgICAgICAgLy8gaW1wbGVtZW50IERlYXRoUmVjaXBpZW50CiAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IGFuZHJvaWQ6OndwPGFuZHJvaWQ6OklCaW5kZXI+JiB3aG8gX191bnVzZWQpIHsKICAgICAgICAgICAgIGFuZHJvaWQ6OnNwPEFBdWRpb0JpbmRlckNsaWVudD4gY2xpZW50ID0gbUJpbmRlckNsaWVudC5wcm9tb3RlKCk7Ci0gICAgICAgICAgICBpZiAoY2xpZW50ICE9IDApIHsKKyAgICAgICAgICAgIGlmIChjbGllbnQuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIGNsaWVudC0+ZHJvcEFBdWRpb1NlcnZpY2UoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dXKCJBQXVkaW8gc2VydmljZSBiaW5kZXJEaWVkKCkhIik7CkBAIC0xMzMsNyArMTMzLDcgQEAKICAgICAgICAgLy8gaW1wbGVtZW50IEJuQUF1ZGlvQ2xpZW50CiAgICAgICAgIHZvaWQgb25TdHJlYW1DaGFuZ2UoYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSwgaW50MzJfdCBvcGNvZGUsIGludDMyX3QgdmFsdWUpIHsKICAgICAgICAgICAgIGFuZHJvaWQ6OnNwPEFBdWRpb0JpbmRlckNsaWVudD4gY2xpZW50ID0gbUJpbmRlckNsaWVudC5wcm9tb3RlKCk7Ci0gICAgICAgICAgICBpZiAoY2xpZW50ICE9IDApIHsKKyAgICAgICAgICAgIGlmIChjbGllbnQuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIGNsaWVudC0+b25TdHJlYW1DaGFuZ2UoaGFuZGxlLCBvcGNvZGUsIHZhbHVlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTQxLDEwICsxNDEsMTEgQEAKICAgICAgICAgYW5kcm9pZDo6d3A8QUF1ZGlvQmluZGVyQ2xpZW50PiBtQmluZGVyQ2xpZW50OwogICAgIH07CiAKK3ByaXZhdGU6CiAKLSAgICBhbmRyb2lkOjpNdXRleCAgICAgICAgICAgICAgIG1TZXJ2aWNlTG9jazsKKyAgICBhbmRyb2lkOjpNdXRleCAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlTG9jazsKICAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpJQUF1ZGlvU2VydmljZT4gIG1BQXVkaW9TZXJ2aWNlOwotICAgIGFuZHJvaWQ6OnNwPEFBdWRpb0NsaWVudD4gICAgbUFBdWRpb0NsaWVudDsKKyAgICBhbmRyb2lkOjpzcDxBQXVkaW9DbGllbnQ+ICAgICAgIG1BQXVkaW9DbGllbnQ7CiAKIH07CiAKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSUNhc0xpc3RlbmVyLmFpZGwgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQ29tbW9uLmgKc2ltaWxhcml0eSBpbmRleCA2OSUKcmVuYW1lIGZyb20gZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9JQ2FzTGlzdGVuZXIuYWlkbApyZW5hbWUgdG8gbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0NvbW1vbi5oCmluZGV4IDAxYTVhYmMuLmUzZTllODIgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSUNhc0xpc3RlbmVyLmFpZGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0NvbW1vbi5oCkBAIC0xNCw5ICsxNCwxOSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBhbmRyb2lkLm1lZGlhOworI2lmbmRlZiBBTkRST0lEX0FBVURJT19DT01NT05fSAorI2RlZmluZSBBTkRST0lEX0FBVURJT19DT01NT05fSAogCi0vKiogQGhpZGUgKi8KLWludGVyZmFjZSBJQ2FzTGlzdGVuZXIgewotICAgIHZvaWQgb25FdmVudChpbnQgZXZlbnQsIGludCBhcmcsIGluIEBudWxsYWJsZSBieXRlW10gZGF0YSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKgorICogSW50ZXJuYWwgaGVhZGVyIHRoYXQgaXMgY29tbW9uIHRvIGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIuCisgKgorICovCituYW1lc3BhY2UgYWF1ZGlvIHsKKwordHlwZWRlZiBpbnQzMl90IGFhdWRpb19oYW5kbGVfdDsKKworfSAvKiBuYW1lc3BhY2UgYWF1ZGlvICovCisKKyNlbmRpZiAvLyBBTkRST0lEX0FBVURJT19DT01NT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1NlcnZpY2VNZXNzYWdlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU2VydmljZU1lc3NhZ2UuaAppbmRleCBiNDM3N2ZiLi41NGU4MDAxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU2VydmljZU1lc3NhZ2UuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU2VydmljZU1lc3NhZ2UuaApAQCAtMjgsNyArMjgsNiBAQAogLy8gVXNlZCB0byBzZW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZSBIQUwgdG8gdGhlIGNsaWVudC4KIHN0cnVjdCBBQXVkaW9NZXNzYWdlVGltZXN0YW1wIHsKICAgICBpbnQ2NF90IHBvc2l0aW9uOyAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyB0cmFuc2ZlcnJlZCBzbyBmYXIKLSAgICBpbnQ2NF90IGRldmljZU9mZnNldDsgLy8gYWRkIHRvIGNsaWVudCBwb3NpdGlvbiB0byBnZXQgZGV2aWNlIHBvc2l0aW9uCiAgICAgaW50NjRfdCB0aW1lc3RhbXA7ICAgIC8vIHRpbWUgd2hlbiB0aGF0IHBvc2l0aW9uIHdhcyByZWFjaGVkCiB9OwogCkBAIC01MSw3ICs1MCw4IEBACiB0eXBlZGVmIHN0cnVjdCBBQXVkaW9TZXJ2aWNlTWVzc2FnZV9zIHsKICAgICBlbnVtIGNsYXNzIGNvZGUgOiB1aW50MzJfdCB7CiAgICAgICAgIE5PVEhJTkcsCi0gICAgICAgIFRJTUVTVEFNUCwKKyAgICAgICAgVElNRVNUQU1QX1NFUlZJQ0UsIC8vIHdoZW4gZnJhbWUgaXMgcmVhZCBvciB3cml0dGVuIGJ5IHRoZSBzZXJ2aWNlIHRvIHRoZSBjbGllbnQKKyAgICAgICAgVElNRVNUQU1QX0hBUkRXQVJFLCAvLyB3aGVuIGZyYW1lIGlzIGF0IERBQyBvciBBREMKICAgICAgICAgRVZFTlQsCiAgICAgfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uY3BwCmluZGV4IGU3NjM5MzQuLjE1M2ZjZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAKQEAgLTQ2LDYgKzQ2LDggQEAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMigoaW50MzJfdCkgZ2V0Rm9ybWF0KCkpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CisgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KSBnZXREaXJlY3Rpb24oKSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC03Myw5ICs3NSwxMiBAQAogICAgIHNldEZvcm1hdCh2YWx1ZSk7CiAgICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnZhbHVlKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOworICAgIHNldERpcmVjdGlvbigoYWF1ZGlvX2RpcmVjdGlvbl90KSB2YWx1ZSk7CisgICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnZhbHVlKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIHNldEJ1ZmZlckNhcGFjaXR5KHZhbHVlKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiBlcnJvcjoKICAgICBBTE9HRSgiQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5yZWFkRnJvbVBhcmNlbCgpOiByZWFkIGZhaWxlZCA9ICVkIiwgc3RhdHVzKTsKICAgICByZXR1cm4gc3RhdHVzOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmNwcAppbmRleCBhYmRjZjViLi4xMjAwYWIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtUmVxdWVzdC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuY3BwCkBAIC00Niw5ICs0Niw2IEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KSBtVXNlcklkKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogCi0gICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KSBtRGlyZWN0aW9uKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotCiAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUJvb2wobVNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKIApAQCAtNzEsMTAgKzY4LDYgQEAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIG1Vc2VySWQgPSAodWlkX3QpIHRlbXA7CiAKLSAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdGVtcCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICBtRGlyZWN0aW9uID0gKGFhdWRpb19kaXJlY3Rpb25fdCkgdGVtcDsKLQogICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEJvb2woJm1TaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAKQEAgLTk4LDcgKzkxLDYgQEAKIHZvaWQgQUF1ZGlvU3RyZWFtUmVxdWVzdDo6ZHVtcCgpIGNvbnN0IHsKICAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtUmVxdWVzdCBtVXNlcklkICAgID0gJWQiLCBtVXNlcklkKTsKICAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtUmVxdWVzdCBtUHJvY2Vzc0lkID0gJWQiLCBtUHJvY2Vzc0lkKTsKLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtUmVxdWVzdCBtRGlyZWN0aW9uID0gJWQiLCBtRGlyZWN0aW9uKTsKICAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtUmVxdWVzdCBtU2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkID0gJWQiLCBtU2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkKTsKICAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtUmVxdWVzdCBtSW5TZXJ2aWNlID0gJWQiLCBtSW5TZXJ2aWNlKTsKICAgICBtQ29uZmlndXJhdGlvbi5kdW1wKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtUmVxdWVzdC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuaAppbmRleCBiMGZhOTZhLi40OTJmNjlkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtUmVxdWVzdC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmgKQEAgLTUyLDE0ICs1Miw2IEBACiAgICAgICAgIG1Qcm9jZXNzSWQgPSBwcm9jZXNzSWQ7CiAgICAgfQogCi0gICAgYWF1ZGlvX2RpcmVjdGlvbl90IGdldERpcmVjdGlvbigpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1EaXJlY3Rpb247Ci0gICAgfQotCi0gICAgdm9pZCBzZXREaXJlY3Rpb24oYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgewotICAgICAgICBtRGlyZWN0aW9uID0gZGlyZWN0aW9uOwotICAgIH0KLQogICAgIGJvb2wgaXNTaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtU2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkOwogICAgIH0KQEAgLTk0LDkgKzg2LDggQEAKIAogcHJvdGVjdGVkOgogICAgIEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gIG1Db25maWd1cmF0aW9uOwotICAgIHVpZF90ICAgICAgICAgICAgICAgICAgICAgIG1Vc2VySWQ7Ci0gICAgcGlkX3QgICAgICAgICAgICAgICAgICAgICAgbVByb2Nlc3NJZDsKLSAgICBhYXVkaW9fZGlyZWN0aW9uX3QgICAgICAgICBtRGlyZWN0aW9uOworICAgIHVpZF90ICAgICAgICAgICAgICAgICAgICAgIG1Vc2VySWQgPSAodWlkX3QpIC0xOworICAgIHBpZF90ICAgICAgICAgICAgICAgICAgICAgIG1Qcm9jZXNzSWQgPSAocGlkX3QpIC0xOwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIG1TaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQgPSBmYWxzZTsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICBtSW5TZXJ2aWNlID0gZmFsc2U7IC8vIFN0cmVhbSBvcGVuZWQgYnkgQUF1ZGlvc2VydmljZQogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9JQUF1ZGlvQ2xpZW50LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb0NsaWVudC5oCmluZGV4IDIxY2MzM2IuLmYyMWZkOTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9JQUF1ZGlvQ2xpZW50LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9DbGllbnQuaApAQCAtMjIsNyArMjIsNyBAQAogCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogCi0jaW5jbHVkZSAidXRpbGl0eS9IYW5kbGVUcmFja2VyLmgiCisjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9Db21tb24uaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zMyw3ICszMyw3IEBACiAKICAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKEFBdWRpb0NsaWVudCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgb25TdHJlYW1DaGFuZ2UoYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSwgaW50MzJfdCBvcGNvZGUsIGludDMyX3QgdmFsdWUpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgb25TdHJlYW1DaGFuZ2UoYWF1ZGlvOjphYXVkaW9faGFuZGxlX3QgaGFuZGxlLCBpbnQzMl90IG9wY29kZSwgaW50MzJfdCB2YWx1ZSkgPSAwOwogCiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb1NlcnZpY2UuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9JQUF1ZGlvU2VydmljZS5oCmluZGV4IDMwYjNlYWQuLjZiZGI4MjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9JQUF1ZGlvU2VydmljZS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9JQUF1ZGlvU2VydmljZS5oCkBAIC0yNCwxMiArMjQsMTIgQEAKIAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KIAorI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvQ29tbW9uLmgiCiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TZXJ2aWNlRGVmaW5pdGlvbnMuaCIKLSNpbmNsdWRlICJiaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmgiCi0jaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmgiCiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmgiCisjaW5jbHVkZSAiYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5oIgogI2luY2x1ZGUgImJpbmRpbmcvSUFBdWRpb0NsaWVudC5oIgotI2luY2x1ZGUgInV0aWxpdHkvSGFuZGxlVHJhY2tlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTUxLDcgKzUxLDcgQEAKICAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3JlYXRlZCBzdHJlYW0KICAgICAgKiBAcmV0dXJuIGhhbmRsZSB0byB0aGUgc3RyZWFtIG9yIGEgbmVnYXRpdmUgZXJyb3IKICAgICAgKi8KLSAgICB2aXJ0dWFsIGFhdWRpb19oYW5kbGVfdCBvcGVuU3RyZWFtKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCwKKyAgICB2aXJ0dWFsIGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IG9wZW5TdHJlYW0oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpbzo6QUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbk91dHB1dCkgPSAwOwogCiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgY2xvc2VTdHJlYW0oYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSA9IDA7CkBAIC04OSwxMSArODksMTEgQEAKICAgICAvKioKICAgICAgKiBNYW5hZ2UgdGhlIHNwZWNpZmllZCB0aHJlYWQgYXMgYSBsb3cgbGF0ZW5jeSBhdWRpbyB0aHJlYWQuCiAgICAgICovCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgcmVnaXN0ZXJBdWRpb1RocmVhZChhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAorICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHJlZ2lzdGVyQXVkaW9UaHJlYWQoYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IGNsaWVudFRocmVhZElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcGVyaW9kTmFub3NlY29uZHMpID0gMDsKIAotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHVucmVnaXN0ZXJBdWRpb1RocmVhZChhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAorICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHVucmVnaXN0ZXJBdWRpb1RocmVhZChhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBjbGllbnRUaHJlYWRJZCkgPSAwOwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmNwcAppbmRleCA2ZWMyODVmLi42MDRlZWQ1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmNwcApAQCAtMzIsMTQgKzMyLDE3IEBACiAjZGVmaW5lIFJJRElDVUxPVVNMWV9MQVJHRV9GUkFNRV9TSVpFICAgICAgICA0MDk2CiAKIEF1ZGlvRW5kcG9pbnQ6OkF1ZGlvRW5kcG9pbnQoKQotICAgIDogbUZyZWVSdW5uaW5nKGZhbHNlKQorICAgIDogbVVwQ29tbWFuZFF1ZXVlKG51bGxwdHIpCisgICAgLCBtRGF0YVF1ZXVlKG51bGxwdHIpCisgICAgLCBtRnJlZVJ1bm5pbmcoZmFsc2UpCiAgICAgLCBtRGF0YVJlYWRDb3VudGVyKDApCiAgICAgLCBtRGF0YVdyaXRlQ291bnRlcigwKQogewogfQogCi1BdWRpb0VuZHBvaW50Ojp+QXVkaW9FbmRwb2ludCgpCi17CitBdWRpb0VuZHBvaW50Ojp+QXVkaW9FbmRwb2ludCgpIHsKKyAgICBkZWxldGUgbURhdGFRdWV1ZTsKKyAgICBkZWxldGUgbVVwQ29tbWFuZFF1ZXVlOwogfQogCiBzdGF0aWMgYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvRW5kcG9pbnRfdmFsaWRhdGVRdWV1ZURlc2NyaXB0b3IoY29uc3QgY2hhciAqdHlwZSwKQEAgLTExOCwyNCArMTIxLDI4IEBACiB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEF1ZGlvRW5kcG9pbnRfdmFsaWRhdGVEZXNjcmlwdG9yKHBFbmRwb2ludERlc2NyaXB0b3IpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb0VuZHBvaW50X3ZhbGlkYXRlUXVldWVEZXNjcmlwdG9yIHJldHVybmVkICVkICVzIiwKLSAgICAgICAgICAgICAgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IHVwIG1lc3NhZ2UgcXVldWUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICBjb25zdCBSaW5nQnVmZmVyRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9ICZwRW5kcG9pbnREZXNjcmlwdG9yLT51cE1lc3NhZ2VRdWV1ZURlc2NyaXB0b3I7CiAgICAgaWYoZGVzY3JpcHRvci0+Ynl0ZXNQZXJGcmFtZSAhPSBzaXplb2YoQUF1ZGlvU2VydmljZU1lc3NhZ2UpKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb0VuZHBvaW50Ojpjb25maWd1cmUoKSBieXRlc1BlckZyYW1lICE9IHNpemVvZihBQXVkaW9TZXJ2aWNlTWVzc2FnZSkgPSAlZCIsCisgICAgICAgIEFMT0dFKCJBdWRpb0VuZHBvaW50LmNvbmZpZ3VyZSgpIGJ5dGVzUGVyRnJhbWUgIT0gc2l6ZW9mKEFBdWRpb1NlcnZpY2VNZXNzYWdlKSA9ICVkIiwKICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+Ynl0ZXNQZXJGcmFtZSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7CiAgICAgfQogCiAgICAgaWYoZGVzY3JpcHRvci0+cmVhZENvdW50ZXJBZGRyZXNzID09IG51bGxwdHIgfHwgZGVzY3JpcHRvci0+d3JpdGVDb3VudGVyQWRkcmVzcyA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb0VuZHBvaW50X3ZhbGlkYXRlUXVldWVEZXNjcmlwdG9yKCkgTlVMTCBjb3VudGVyIGFkZHJlc3MiKTsKKyAgICAgICAgQUxPR0UoIkF1ZGlvRW5kcG9pbnQuY29uZmlndXJlKCkgTlVMTCBjb3VudGVyIGFkZHJlc3MiKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9OVUxMOwogICAgIH0KIAorICAgIC8vIFByZXZlbnQgbWVtb3J5IGxlYWsgYW5kIHJldXNlLgorICAgIGlmKG1VcENvbW1hbmRRdWV1ZSAhPSBudWxscHRyIHx8IG1EYXRhUXVldWUgIT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQXVkaW9FbmRwb2ludC5jb25maWd1cmUoKSBlbmRwb2ludCBhbHJlYWR5IHVzZWQiKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsKKyAgICB9CisKICAgICBtVXBDb21tYW5kUXVldWUgPSBuZXcgRmlmb0J1ZmZlcigKICAgICAgICAgICAgIGRlc2NyaXB0b3ItPmJ5dGVzUGVyRnJhbWUsCiAgICAgICAgICAgICBkZXNjcmlwdG9yLT5jYXBhY2l0eUluRnJhbWVzLApAQCAtMTQ2LDggKzE1Myw4IEBACiAKICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IGRhdGEgcXVldWUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICBkZXNjcmlwdG9yID0gJnBFbmRwb2ludERlc2NyaXB0b3ItPmRhdGFRdWV1ZURlc2NyaXB0b3I7Ci0gICAgQUxPR1YoIkF1ZGlvRW5kcG9pbnQ6OmNvbmZpZ3VyZSgpIGRhdGEgZnJhbWVzUGVyQnVyc3QgPSAlZCIsIGRlc2NyaXB0b3ItPmZyYW1lc1BlckJ1cnN0KTsKLSAgICBBTE9HVigiQXVkaW9FbmRwb2ludDo6Y29uZmlndXJlKCkgZGF0YSByZWFkQ291bnRlckFkZHJlc3MgPSAlcCIsCisgICAgQUxPR1YoIkF1ZGlvRW5kcG9pbnQuY29uZmlndXJlKCkgZGF0YSBmcmFtZXNQZXJCdXJzdCA9ICVkIiwgZGVzY3JpcHRvci0+ZnJhbWVzUGVyQnVyc3QpOworICAgIEFMT0dWKCJBdWRpb0VuZHBvaW50LmNvbmZpZ3VyZSgpIGRhdGEgcmVhZENvdW50ZXJBZGRyZXNzID0gJXAiLAogICAgICAgICAgIGRlc2NyaXB0b3ItPnJlYWRDb3VudGVyQWRkcmVzcyk7CiAKICAgICAvLyBBbiBleGFtcGxlIG9mIGZyZWUgcnVubmluZyBpcyB3aGVuIHRoZSBvdGhlciBzaWRlIGlzIHJlYWQgb3Igd3JpdHRlbiBieSBoYXJkd2FyZSBETUEKQEAgLTE1Niw3ICsxNjMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRlc2NyaXB0b3ItPnJlYWRDb3VudGVyQWRkcmVzcyAvLyByZWFkIGJ5IG90aGVyIHNpZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZXNjcmlwdG9yLT53cml0ZUNvdW50ZXJBZGRyZXNzOyAvLyB3cml0dGVuIGJ5IG90aGVyIHNpZGUKICAgICBtRnJlZVJ1bm5pbmcgPSAocmVtb3RlQ291bnRlciA9PSBudWxscHRyKTsKLSAgICBBTE9HVigiQXVkaW9FbmRwb2ludDo6Y29uZmlndXJlKCkgbUZyZWVSdW5uaW5nID0gJWQiLCBtRnJlZVJ1bm5pbmcgPyAxIDogMCk7CisgICAgQUxPR1YoIkF1ZGlvRW5kcG9pbnQuY29uZmlndXJlKCkgbUZyZWVSdW5uaW5nID0gJWQiLCBtRnJlZVJ1bm5pbmcgPyAxIDogMCk7CiAKICAgICBpbnQ2NF90ICpyZWFkQ291bnRlckFkZHJlc3MgPSAoZGVzY3JpcHRvci0+cmVhZENvdW50ZXJBZGRyZXNzID09IG51bGxwdHIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAmbURhdGFSZWFkQ291bnRlcgpAQCAtMjU0LDMgKzI2MSw3IEBACiAgICAgQUxPR0QoIkF1ZGlvRW5kcG9pbnQ6IGRhdGEgcmVhZENvdW50ZXIgID0gJWxsZCIsIChsb25nIGxvbmcpIG1EYXRhUXVldWUtPmdldFJlYWRDb3VudGVyKCkpOwogICAgIEFMT0dEKCJBdWRpb0VuZHBvaW50OiBkYXRhIHdyaXRlQ291bnRlciA9ICVsbGQiLCAobG9uZyBsb25nKSBtRGF0YVF1ZXVlLT5nZXRXcml0ZUNvdW50ZXIoKSk7CiB9CisKK3ZvaWQgQXVkaW9FbmRwb2ludDo6ZXJhc2VEYXRhTWVtb3J5KCkgeworICAgIG1EYXRhUXVldWUtPmVyYXNlTWVtb3J5KCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmgKaW5kZXggODFhNGY3Yi4uZjViNjdlOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuaApAQCAtODYsNiArODYsMTEgQEAKIAogICAgIGludDMyX3QgZ2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcygpIGNvbnN0OwogCisgICAgLyoqCisgICAgICogV3JpdGUgemVyb3MgdG8gdGhlIGRhdGEgcXVldWUgbWVtb3J5LgorICAgICAqLworICAgIHZvaWQgZXJhc2VEYXRhTWVtb3J5KCk7CisKICAgICB2b2lkIGR1bXAoKSBjb25zdDsKIAogcHJpdmF0ZToKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAKaW5kZXggNGM3ZDBmNy4uMmZkYmZhZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAKQEAgLTIzLDcgKzIzLDYgQEAKICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0FVRElPCiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KIApAQCAtNTUsNyArNTQsNyBAQAogLy8gV2FpdCBhdCBsZWFzdCB0aGlzIG1hbnkgdGltZXMgbG9uZ2VyIHRoYW4gdGhlIG9wZXJhdGlvbiBzaG91bGQgdGFrZS4KICNkZWZpbmUgTUlOX1RJTUVPVVRfT1BFUkFUSU9OUyAgICA0CiAKLSNkZWZpbmUgTE9HX1RJTUVTVEFNUFMgICAwCisjZGVmaW5lIExPR19USU1FU1RBTVBTICAgICAgICAgICAgMAogCiBBdWRpb1N0cmVhbUludGVybmFsOjpBdWRpb1N0cmVhbUludGVybmFsKEFBdWRpb1NlcnZpY2VJbnRlcmZhY2UgICZzZXJ2aWNlSW50ZXJmYWNlLCBib29sIGluU2VydmljZSkKICAgICAgICAgOiBBdWRpb1N0cmVhbSgpCkBAIC02Myw5ICs2Miw5IEBACiAgICAgICAgICwgbUF1ZGlvRW5kcG9pbnQoKQogICAgICAgICAsIG1TZXJ2aWNlU3RyZWFtSGFuZGxlKEFBVURJT19IQU5ETEVfSU5WQUxJRCkKICAgICAgICAgLCBtRnJhbWVzUGVyQnVyc3QoMTYpCi0gICAgICAgICwgbVN0cmVhbVZvbHVtZSgxLjBmKQogICAgICAgICAsIG1JblNlcnZpY2UoaW5TZXJ2aWNlKQogICAgICAgICAsIG1TZXJ2aWNlSW50ZXJmYWNlKHNlcnZpY2VJbnRlcmZhY2UpCisgICAgICAgICwgbUF0b21pY1RpbWVzdGFtcCgpCiAgICAgICAgICwgbVdha2V1cERlbGF5TmFub3MoQUF1ZGlvUHJvcGVydHlfZ2V0V2FrZXVwRGVsYXlNaWNyb3MoKSAqIEFBVURJT19OQU5PU19QRVJfTUlDUk9TRUNPTkQpCiAgICAgICAgICwgbU1pbmltdW1TbGVlcE5hbm9zKEFBdWRpb1Byb3BlcnR5X2dldE1pbmltdW1TbGVlcE1pY3JvcygpICogQUFVRElPX05BTk9TX1BFUl9NSUNST1NFQ09ORCkKICAgICAgICAgewpAQCAtNzksOSArNzgsMTYgQEAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpvcGVuKGNvbnN0IEF1ZGlvU3RyZWFtQnVpbGRlciAmYnVpbGRlcikgewogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKKyAgICBpbnQzMl90IGNhcGFjaXR5OwogICAgIEFBdWRpb1N0cmVhbVJlcXVlc3QgcmVxdWVzdDsKLSAgICBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247CisgICAgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uT3V0cHV0OwogCisgICAgaWYgKGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9VTklOSVRJQUxJWkVEKSB7CisgICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbUludGVybmFsOjpvcGVuKCk6IGFscmVhZHkgb3BlbiEgc3RhdGUgPSAlZCIsIGdldFN0YXRlKCkpOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgfQorCisgICAgLy8gQ29weSByZXF1ZXN0ZWQgcGFyYW1ldGVycyB0byB0aGUgc3RyZWFtLgogICAgIHJlc3VsdCA9IEF1ZGlvU3RyZWFtOjpvcGVuKGJ1aWxkZXIpOwogICAgIGlmIChyZXN1bHQgPCAwKSB7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CkBAIC05NywxMDMgKzEwMywxMDggQEAKICAgICAvLyBCdWlsZCB0aGUgcmVxdWVzdCB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIuCiAgICAgcmVxdWVzdC5zZXRVc2VySWQoZ2V0dWlkKCkpOwogICAgIHJlcXVlc3Quc2V0UHJvY2Vzc0lkKGdldHBpZCgpKTsKLSAgICByZXF1ZXN0LnNldERpcmVjdGlvbihnZXREaXJlY3Rpb24oKSk7CiAgICAgcmVxdWVzdC5zZXRTaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQoaXNTaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQoKSk7CiAgICAgcmVxdWVzdC5zZXRJblNlcnZpY2UobUluU2VydmljZSk7CiAKICAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXREZXZpY2VJZChnZXREZXZpY2VJZCgpKTsKICAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRTYW1wbGVSYXRlKGdldFNhbXBsZVJhdGUoKSk7CiAgICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0U2FtcGxlc1BlckZyYW1lKGdldFNhbXBsZXNQZXJGcmFtZSgpKTsKKyAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXREaXJlY3Rpb24oZ2V0RGlyZWN0aW9uKCkpOwogICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldFNoYXJpbmdNb2RlKGdldFNoYXJpbmdNb2RlKCkpOwogCiAgICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0QnVmZmVyQ2FwYWNpdHkoYnVpbGRlci5nZXRCdWZmZXJDYXBhY2l0eSgpKTsKIAotICAgIG1TZXJ2aWNlU3RyZWFtSGFuZGxlID0gbVNlcnZpY2VJbnRlcmZhY2Uub3BlblN0cmVhbShyZXF1ZXN0LCBjb25maWd1cmF0aW9uKTsKKyAgICBtU2VydmljZVN0cmVhbUhhbmRsZSA9IG1TZXJ2aWNlSW50ZXJmYWNlLm9wZW5TdHJlYW0ocmVxdWVzdCwgY29uZmlndXJhdGlvbk91dHB1dCk7CiAgICAgaWYgKG1TZXJ2aWNlU3RyZWFtSGFuZGxlIDwgMCkgewogICAgICAgICByZXN1bHQgPSBtU2VydmljZVN0cmVhbUhhbmRsZTsKLSAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtSW50ZXJuYWwub3BlbigpOiBvcGVuU3RyZWFtKCkgcmV0dXJuZWQgJWQiLCByZXN1bHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdCA9IGNvbmZpZ3VyYXRpb24udmFsaWRhdGUoKTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgIGNsb3NlKCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIC8vIFNhdmUgcmVzdWx0cyBvZiB0aGUgb3Blbi4KLSAgICAgICAgc2V0U2FtcGxlUmF0ZShjb25maWd1cmF0aW9uLmdldFNhbXBsZVJhdGUoKSk7Ci0gICAgICAgIHNldFNhbXBsZXNQZXJGcmFtZShjb25maWd1cmF0aW9uLmdldFNhbXBsZXNQZXJGcmFtZSgpKTsKLSAgICAgICAgc2V0RGV2aWNlSWQoY29uZmlndXJhdGlvbi5nZXREZXZpY2VJZCgpKTsKLSAgICAgICAgc2V0U2hhcmluZ01vZGUoY29uZmlndXJhdGlvbi5nZXRTaGFyaW5nTW9kZSgpKTsKLQotICAgICAgICAvLyBTYXZlIGRldmljZSBmb3JtYXQgc28gd2UgY2FuIGRvIGZvcm1hdCBjb252ZXJzaW9uIGFuZCB2b2x1bWUgc2NhbGluZyB0b2dldGhlci4KLSAgICAgICAgbURldmljZUZvcm1hdCA9IGNvbmZpZ3VyYXRpb24uZ2V0Rm9ybWF0KCk7Ci0KLSAgICAgICAgcmVzdWx0ID0gbVNlcnZpY2VJbnRlcmZhY2UuZ2V0U3RyZWFtRGVzY3JpcHRpb24obVNlcnZpY2VTdHJlYW1IYW5kbGUsIG1FbmRQb2ludFBhcmNlbGFibGUpOwotICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgbVNlcnZpY2VJbnRlcmZhY2UuY2xvc2VTdHJlYW0obVNlcnZpY2VTdHJlYW1IYW5kbGUpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlc29sdmUgcGFyY2VsYWJsZSBpbnRvIGEgZGVzY3JpcHRvcgotICAgICAgICByZXN1bHQgPSBtRW5kUG9pbnRQYXJjZWxhYmxlLnJlc29sdmUoJm1FbmRwb2ludERlc2NyaXB0b3IpOwotICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgbVNlcnZpY2VJbnRlcmZhY2UuY2xvc2VTdHJlYW0obVNlcnZpY2VTdHJlYW1IYW5kbGUpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENvbmZpZ3VyZSBlbmRwb2ludCBiYXNlZCBvbiBkZXNjcmlwdG9yLgotICAgICAgICBtQXVkaW9FbmRwb2ludC5jb25maWd1cmUoJm1FbmRwb2ludERlc2NyaXB0b3IsIGdldERpcmVjdGlvbigpKTsKLQotICAgICAgICBtRnJhbWVzUGVyQnVyc3QgPSBtRW5kcG9pbnREZXNjcmlwdG9yLmRhdGFRdWV1ZURlc2NyaXB0b3IuZnJhbWVzUGVyQnVyc3Q7Ci0gICAgICAgIGludDMyX3QgY2FwYWNpdHkgPSBtRW5kcG9pbnREZXNjcmlwdG9yLmRhdGFRdWV1ZURlc2NyaXB0b3IuY2FwYWNpdHlJbkZyYW1lczsKLQotICAgICAgICAvLyBWYWxpZGF0ZSByZXN1bHQgZnJvbSBzZXJ2ZXIuCi0gICAgICAgIGlmIChtRnJhbWVzUGVyQnVyc3QgPCAxNiB8fCBtRnJhbWVzUGVyQnVyc3QgPiAxNiAqIDEwMjQpIHsKLSAgICAgICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbTo6b3BlbigpOiBmcmFtZXNQZXJCdXJzdCBvdXQgb2YgcmFuZ2UgPSAlZCIsIG1GcmFtZXNQZXJCdXJzdCk7Ci0gICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2FwYWNpdHkgPCBtRnJhbWVzUGVyQnVyc3QgfHwgY2FwYWNpdHkgPiAzMiAqIDEwMjQpIHsKLSAgICAgICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbTo6b3BlbigpOiBidWZmZXJDYXBhY2l0eSBvdXQgb2YgcmFuZ2UgPSAlZCIsIGNhcGFjaXR5KTsKLSAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwotICAgICAgICB9Ci0KLSAgICAgICAgbUNsb2NrTW9kZWwuc2V0U2FtcGxlUmF0ZShnZXRTYW1wbGVSYXRlKCkpOwotICAgICAgICBtQ2xvY2tNb2RlbC5zZXRGcmFtZXNQZXJCdXJzdChtRnJhbWVzUGVyQnVyc3QpOwotCi0gICAgICAgIGlmIChnZXREYXRhQ2FsbGJhY2tQcm9jKCkpIHsKLSAgICAgICAgICAgIG1DYWxsYmFja0ZyYW1lcyA9IGJ1aWxkZXIuZ2V0RnJhbWVzUGVyRGF0YUNhbGxiYWNrKCk7Ci0gICAgICAgICAgICBpZiAobUNhbGxiYWNrRnJhbWVzID4gZ2V0QnVmZmVyQ2FwYWNpdHkoKSAvIDIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6b3BlbigpOiBmcmFtZXNQZXJDYWxsYmFjayB0b28gYmlnID0gJWQsIGNhcGFjaXR5ID0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0ZyYW1lcywgZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2VJbnRlcmZhY2UuY2xvc2VTdHJlYW0obVNlcnZpY2VTdHJlYW1IYW5kbGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKG1DYWxsYmFja0ZyYW1lcyA8IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6b3BlbigpOiBmcmFtZXNQZXJDYWxsYmFjayBuZWdhdGl2ZSIpOwotICAgICAgICAgICAgICAgIG1TZXJ2aWNlSW50ZXJmYWNlLmNsb3NlU3RyZWFtKG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1DYWxsYmFja0ZyYW1lcyA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2tGcmFtZXMgPSBtRnJhbWVzUGVyQnVyc3Q7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludDMyX3QgYnl0ZXNQZXJGcmFtZSA9IGdldFNhbXBsZXNQZXJGcmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEFBdWRpb0NvbnZlcnRfZm9ybWF0VG9TaXplSW5CeXRlcyhnZXRGb3JtYXQoKSk7Ci0gICAgICAgICAgICBpbnQzMl90IGNhbGxiYWNrQnVmZmVyU2l6ZSA9IG1DYWxsYmFja0ZyYW1lcyAqIGJ5dGVzUGVyRnJhbWU7Ci0gICAgICAgICAgICBtQ2FsbGJhY2tCdWZmZXIgPSBuZXcgdWludDhfdFtjYWxsYmFja0J1ZmZlclNpemVdOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9PUEVOKTsKLSAgICAgICAgLy8gb25seSBjb25uZWN0IHRvIEF1ZGlvTWFuYWdlciBpZiB0aGlzIGlzIGEgcGxheWJhY2sgc3RyZWFtIHJ1bm5pbmcgaW4gY2xpZW50IHByb2Nlc3MKLSAgICAgICAgaWYgKCFtSW5TZXJ2aWNlICYmIGdldERpcmVjdGlvbigpID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKSB7Ci0gICAgICAgICAgICBpbml0KGFuZHJvaWQ6OlBMQVlFUl9UWVBFX0FBVURJTywgQVVESU9fVVNBR0VfTUVESUEpOwotICAgICAgICB9CisgICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbUludGVybmFsOjpvcGVuKCk6IG9wZW5TdHJlYW0oKSByZXR1cm5lZCAlZCIsIHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQorCisgICAgcmVzdWx0ID0gY29uZmlndXJhdGlvbk91dHB1dC52YWxpZGF0ZSgpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIC8vIFNhdmUgcmVzdWx0cyBvZiB0aGUgb3Blbi4KKyAgICBzZXRTYW1wbGVSYXRlKGNvbmZpZ3VyYXRpb25PdXRwdXQuZ2V0U2FtcGxlUmF0ZSgpKTsKKyAgICBzZXRTYW1wbGVzUGVyRnJhbWUoY29uZmlndXJhdGlvbk91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKSk7CisgICAgc2V0RGV2aWNlSWQoY29uZmlndXJhdGlvbk91dHB1dC5nZXREZXZpY2VJZCgpKTsKKyAgICBzZXRTaGFyaW5nTW9kZShjb25maWd1cmF0aW9uT3V0cHV0LmdldFNoYXJpbmdNb2RlKCkpOworCisgICAgLy8gU2F2ZSBkZXZpY2UgZm9ybWF0IHNvIHdlIGNhbiBkbyBmb3JtYXQgY29udmVyc2lvbiBhbmQgdm9sdW1lIHNjYWxpbmcgdG9nZXRoZXIuCisgICAgbURldmljZUZvcm1hdCA9IGNvbmZpZ3VyYXRpb25PdXRwdXQuZ2V0Rm9ybWF0KCk7CisKKyAgICByZXN1bHQgPSBtU2VydmljZUludGVyZmFjZS5nZXRTdHJlYW1EZXNjcmlwdGlvbihtU2VydmljZVN0cmVhbUhhbmRsZSwgbUVuZFBvaW50UGFyY2VsYWJsZSk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvLyBSZXNvbHZlIHBhcmNlbGFibGUgaW50byBhIGRlc2NyaXB0b3IuCisgICAgcmVzdWx0ID0gbUVuZFBvaW50UGFyY2VsYWJsZS5yZXNvbHZlKCZtRW5kcG9pbnREZXNjcmlwdG9yKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIC8vIENvbmZpZ3VyZSBlbmRwb2ludCBiYXNlZCBvbiBkZXNjcmlwdG9yLgorICAgIHJlc3VsdCA9IG1BdWRpb0VuZHBvaW50LmNvbmZpZ3VyZSgmbUVuZHBvaW50RGVzY3JpcHRvciwgZ2V0RGlyZWN0aW9uKCkpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgbUZyYW1lc1BlckJ1cnN0ID0gbUVuZHBvaW50RGVzY3JpcHRvci5kYXRhUXVldWVEZXNjcmlwdG9yLmZyYW1lc1BlckJ1cnN0OworICAgIGNhcGFjaXR5ID0gbUVuZHBvaW50RGVzY3JpcHRvci5kYXRhUXVldWVEZXNjcmlwdG9yLmNhcGFjaXR5SW5GcmFtZXM7CisKKyAgICAvLyBWYWxpZGF0ZSByZXN1bHQgZnJvbSBzZXJ2ZXIuCisgICAgaWYgKG1GcmFtZXNQZXJCdXJzdCA8IDE2IHx8IG1GcmFtZXNQZXJCdXJzdCA+IDE2ICogMTAyNCkgeworICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6b3BlbigpOiBmcmFtZXNQZXJCdXJzdCBvdXQgb2YgcmFuZ2UgPSAlZCIsIG1GcmFtZXNQZXJCdXJzdCk7CisgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIGlmIChjYXBhY2l0eSA8IG1GcmFtZXNQZXJCdXJzdCB8fCBjYXBhY2l0eSA+IDMyICogMTAyNCkgeworICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6b3BlbigpOiBidWZmZXJDYXBhY2l0eSBvdXQgb2YgcmFuZ2UgPSAlZCIsIGNhcGFjaXR5KTsKKyAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBtQ2xvY2tNb2RlbC5zZXRTYW1wbGVSYXRlKGdldFNhbXBsZVJhdGUoKSk7CisgICAgbUNsb2NrTW9kZWwuc2V0RnJhbWVzUGVyQnVyc3QobUZyYW1lc1BlckJ1cnN0KTsKKworICAgIGlmIChnZXREYXRhQ2FsbGJhY2tQcm9jKCkpIHsKKyAgICAgICAgbUNhbGxiYWNrRnJhbWVzID0gYnVpbGRlci5nZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soKTsKKyAgICAgICAgaWYgKG1DYWxsYmFja0ZyYW1lcyA+IGdldEJ1ZmZlckNhcGFjaXR5KCkgLyAyKSB7CisgICAgICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6b3BlbigpOiBmcmFtZXNQZXJDYWxsYmFjayB0b28gYmlnID0gJWQsIGNhcGFjaXR5ID0gJWQiLAorICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrRnJhbWVzLCBnZXRCdWZmZXJDYXBhY2l0eSgpKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgICAgICAgICBnb3RvIGVycm9yOworCisgICAgICAgIH0gZWxzZSBpZiAobUNhbGxiYWNrRnJhbWVzIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9wZW4oKTogZnJhbWVzUGVyQ2FsbGJhY2sgbmVnYXRpdmUiKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgICAgICAgICBnb3RvIGVycm9yOworCisgICAgICAgIH0KKyAgICAgICAgaWYgKG1DYWxsYmFja0ZyYW1lcyA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgICAgIG1DYWxsYmFja0ZyYW1lcyA9IG1GcmFtZXNQZXJCdXJzdDsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgYnl0ZXNQZXJGcmFtZSA9IGdldFNhbXBsZXNQZXJGcmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQUF1ZGlvQ29udmVydF9mb3JtYXRUb1NpemVJbkJ5dGVzKGdldEZvcm1hdCgpKTsKKyAgICAgICAgaW50MzJfdCBjYWxsYmFja0J1ZmZlclNpemUgPSBtQ2FsbGJhY2tGcmFtZXMgKiBieXRlc1BlckZyYW1lOworICAgICAgICBtQ2FsbGJhY2tCdWZmZXIgPSBuZXcgdWludDhfdFtjYWxsYmFja0J1ZmZlclNpemVdOworICAgIH0KKworICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfT1BFTik7CisKKyAgICByZXR1cm4gcmVzdWx0OworCitlcnJvcjoKKyAgICBjbG9zZSgpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpjbG9zZSgpIHsKLSAgICBBTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6Y2xvc2UoKTogbVNlcnZpY2VTdHJlYW1IYW5kbGUgPSAweCUwOFgiLAorICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CisgICAgQUxPR0QoImNsb3NlKCk6IG1TZXJ2aWNlU3RyZWFtSGFuZGxlID0gMHglMDhYIiwKICAgICAgICAgICAgICBtU2VydmljZVN0cmVhbUhhbmRsZSk7CiAgICAgaWYgKG1TZXJ2aWNlU3RyZWFtSGFuZGxlICE9IEFBVURJT19IQU5ETEVfSU5WQUxJRCkgewogICAgICAgICAvLyBEb24ndCBjbG9zZSBhIHN0cmVhbSB3aGlsZSBpdCBpcyBydW5uaW5nLgpAQCAtMjAyLDEwICsyMTMsMTAgQEAKICAgICAgICAgICAgIHJlcXVlc3RTdG9wKCk7CiAgICAgICAgICAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgbmV4dFN0YXRlOwogICAgICAgICAgICAgaW50NjRfdCB0aW1lb3V0TmFub3NlY29uZHMgPSBNSU5fVElNRU9VVF9OQU5PUzsKLSAgICAgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSB3YWl0Rm9yU3RhdGVDaGFuZ2UoY3VycmVudFN0YXRlLCAmbmV4dFN0YXRlLAorICAgICAgICAgICAgcmVzdWx0ID0gd2FpdEZvclN0YXRlQ2hhbmdlKGN1cnJlbnRTdGF0ZSwgJm5leHRTdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0TmFub3NlY29uZHMpOwogICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6Y2xvc2UoKSB3YWl0Rm9yU3RhdGVDaGFuZ2UoKSByZXR1cm5lZCAlZCAlcyIsCisgICAgICAgICAgICAgICAgQUxPR0UoImNsb3NlKCkgd2FpdEZvclN0YXRlQ2hhbmdlKCkgcmV0dXJuZWQgJWQgJXMiLAogICAgICAgICAgICAgICAgIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIxNiwxNCArMjI3LDE2IEBACiAgICAgICAgIG1TZXJ2aWNlSW50ZXJmYWNlLmNsb3NlU3RyZWFtKHNlcnZpY2VTdHJlYW1IYW5kbGUpOwogICAgICAgICBkZWxldGVbXSBtQ2FsbGJhY2tCdWZmZXI7CiAgICAgICAgIG1DYWxsYmFja0J1ZmZlciA9IG51bGxwdHI7CisKICAgICAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQpOwotICAgICAgICByZXR1cm4gbUVuZFBvaW50UGFyY2VsYWJsZS5jbG9zZSgpOworICAgICAgICByZXN1bHQgPSBtRW5kUG9pbnRQYXJjZWxhYmxlLmNsb3NlKCk7CisgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQyID0gQXVkaW9TdHJlYW06OmNsb3NlKCk7CisgICAgICAgIHJldHVybiAocmVzdWx0ICE9IEFBVURJT19PSykgPyByZXN1bHQgOiByZXN1bHQyOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEU7CiAgICAgfQogfQogCi0KIHN0YXRpYyB2b2lkICphYXVkaW9fY2FsbGJhY2tfdGhyZWFkX3Byb2Modm9pZCAqY29udGV4dCkKIHsKICAgICBBdWRpb1N0cmVhbUludGVybmFsICpzdHJlYW0gPSAoQXVkaW9TdHJlYW1JbnRlcm5hbCAqKWNvbnRleHQ7CkBAIC0yMzUsMjQgKzI0OCw0NiBAQAogICAgIH0KIH0KIAorLyoKKyAqIEl0IG5vcm1hbGx5IHRha2VzIGFib3V0IDIwLTMwIG1zZWMgdG8gc3RhcnQgYSBzdHJlYW0gb24gdGhlIHNlcnZlci4KKyAqIEJ1dCB0aGUgZmlyc3QgdGltZSBjYW4gdGFrZSBhcyBtdWNoIGFzIDIwMC0zMDAgbXNlYy4gVGhlIEhXCisgKiBzdGFydHMgcmlnaHQgYXdheSBzbyBieSB0aGUgdGltZSB0aGUgY2xpZW50IGdldHMgYSBjaGFuY2UgdG8gd3JpdGUgaW50bworICogdGhlIGJ1ZmZlciwgaXQgaXMgYWxyZWFkeSBpbiBhIGRlZXAgdW5kZXJmbG93IHN0YXRlLiBUaGF0IGNhbiBjYXVzZSB0aGUKKyAqIFhSdW5Db3VudCB0byBiZSBub24temVybywgd2hpY2ggY291bGQgbGVhZCBhbiBhcHAgdG8gdHVuZSBpdHMgbGF0ZW5jeSBoaWdoZXIuCisgKiBUbyBhdm9pZCB0aGlzIHByb2JsZW0sIHdlIHNldCBhIHJlcXVlc3QgZm9yIHRoZSBwcm9jZXNzaW5nIGNvZGUgdG8gc3RhcnQgdGhlCisgKiBjbGllbnQgc3RyZWFtIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGFzIHRoZSBzZXJ2ZXIgc3RyZWFtLgorICogVGhlIHByb2Nlc3NpbmcgY29kZSB3aWxsIHRoZW4gc2F2ZSB0aGUgY3VycmVudCBvZmZzZXQKKyAqIGJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIgYW5kIGFwcGx5IHRoYXQgdG8gYW55IHBvc2l0aW9uIGdpdmVuIHRvIHRoZSBhcHAuCisgKi8KIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpyZXF1ZXN0U3RhcnQoKQogewogICAgIGludDY0X3Qgc3RhcnRUaW1lOwotICAgIEFMT0dEKCJBdWRpb1N0cmVhbUludGVybmFsKCk6OnJlcXVlc3RTdGFydCgpIik7CiAgICAgaWYgKG1TZXJ2aWNlU3RyZWFtSGFuZGxlID09IEFBVURJT19IQU5ETEVfSU5WQUxJRCkgeworICAgICAgICBBTE9HRSgicmVxdWVzdFN0YXJ0KCkgbVNlcnZpY2VTdHJlYW1IYW5kbGUgaW52YWxpZCIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogICAgIGlmIChpc0FjdGl2ZSgpKSB7CisgICAgICAgIEFMT0dFKCJyZXF1ZXN0U3RhcnQoKSBhbHJlYWR5IGFjdGl2ZSIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQotICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBvcmlnaW5hbFN0YXRlID0gZ2V0U3RhdGUoKTsKIAorICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBvcmlnaW5hbFN0YXRlID0gZ2V0U3RhdGUoKTsKKyAgICBpZiAob3JpZ2luYWxTdGF0ZSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCkgeworICAgICAgICBBTE9HRSgicmVxdWVzdFN0YXJ0KCkgYnV0IERJU0NPTk5FQ1RFRCIpOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRDsKKyAgICB9CiAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVElORyk7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXJ0V2l0aFN0YXR1cygpKTsKKworICAgIC8vIENsZWFyIGFueSBzdGFsZSB0aW1lc3RhbXBzIGZyb20gdGhlIHByZXZpb3VzIHJ1bi4KKyAgICBkcmFpblRpbWVzdGFtcHNGcm9tU2VydmljZSgpOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IG1TZXJ2aWNlSW50ZXJmYWNlLnN0YXJ0U3RyZWFtKG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKIAogICAgIHN0YXJ0VGltZSA9IEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCk7CiAgICAgbUNsb2NrTW9kZWwuc3RhcnQoc3RhcnRUaW1lKTsKKyAgICBtTmVlZENhdGNoVXAucmVxdWVzdCgpOyAgLy8gQXNrIGRhdGEgcHJvY2Vzc2luZyBjb2RlIHRvIGNhdGNoIHVwIHdoZW4gZmlyc3QgdGltZXN0YW1wIHJlY2VpdmVkLgogCisgICAgLy8gU3RhcnQgZGF0YSBjYWxsYmFjayB0aHJlYWQuCiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0sgJiYgZ2V0RGF0YUNhbGxiYWNrUHJvYygpICE9IG51bGxwdHIpIHsKICAgICAgICAgLy8gTGF1bmNoIHRoZSBjYWxsYmFjayBsb29wIHRocmVhZC4KICAgICAgICAgaW50NjRfdCBwZXJpb2ROYW5vcyA9IG1DYWxsYmFja0ZyYW1lcwpAQCAtMjk3LDE0ICszMzIsMTYgQEAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpyZXF1ZXN0U3RvcEludGVybmFsKCkKIHsKICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgPT0gQUFVRElPX0hBTkRMRV9JTlZBTElEKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbUludGVybmFsOjpyZXF1ZXN0U3RvcEludGVybmFsKCkgbVNlcnZpY2VTdHJlYW1IYW5kbGUgaW52YWxpZCA9IDB4JTA4WCIsCisgICAgICAgIEFMT0dFKCJyZXF1ZXN0U3RvcEludGVybmFsKCkgbVNlcnZpY2VTdHJlYW1IYW5kbGUgaW52YWxpZCA9IDB4JTA4WCIsCiAgICAgICAgICAgICAgIG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KIAogICAgIG1DbG9ja01vZGVsLnN0b3AoQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSk7CiAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORyk7Ci0gICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0b3BXaXRoU3RhdHVzKCkpOworICAgIG1BdG9taWNUaW1lc3RhbXAuY2xlYXIoKTsKKworICAgIHJldHVybiBtU2VydmljZUludGVyZmFjZS5zdG9wU3RyZWFtKG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnJlcXVlc3RTdG9wKCkKQEAgLTMxOSw2ICszNTYsNyBAQAogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6cmVnaXN0ZXJUaHJlYWQoKSB7CiAgICAgaWYgKG1TZXJ2aWNlU3RyZWFtSGFuZGxlID09IEFBVURJT19IQU5ETEVfSU5WQUxJRCkgeworICAgICAgICBBTE9HRSgicmVnaXN0ZXJUaHJlYWQoKSBtU2VydmljZVN0cmVhbUhhbmRsZSBpbnZhbGlkIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAgICAgcmV0dXJuIG1TZXJ2aWNlSW50ZXJmYWNlLnJlZ2lzdGVyQXVkaW9UaHJlYWQobVNlcnZpY2VTdHJlYW1IYW5kbGUsCkBAIC0zMjgsNiArMzY2LDcgQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnVucmVnaXN0ZXJUaHJlYWQoKSB7CiAgICAgaWYgKG1TZXJ2aWNlU3RyZWFtSGFuZGxlID09IEFBVURJT19IQU5ETEVfSU5WQUxJRCkgeworICAgICAgICBBTE9HRSgidW5yZWdpc3RlclRocmVhZCgpIG1TZXJ2aWNlU3RyZWFtSGFuZGxlIGludmFsaWQiKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KICAgICByZXR1cm4gbVNlcnZpY2VJbnRlcmZhY2UudW5yZWdpc3RlckF1ZGlvVGhyZWFkKG1TZXJ2aWNlU3RyZWFtSGFuZGxlLCBnZXR0aWQoKSk7CkBAIC0zMzgsNiArMzc3LDcgQEAKICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgPT0gQUFVRElPX0hBTkRMRV9JTlZBTElEKSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CisKICAgICByZXR1cm4gbVNlcnZpY2VJbnRlcmZhY2Uuc3RhcnRDbGllbnQobVNlcnZpY2VTdHJlYW1IYW5kbGUsIGNsaWVudCwgY2xpZW50SGFuZGxlKTsKIH0KIApAQCAtMzUxLDE1ICszOTEsMjAgQEAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpnZXRUaW1lc3RhbXAoY2xvY2tpZF90IGNsb2NrSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpmcmFtZVBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zZWNvbmRzKSB7Ci0gICAgLy8gVE9ETyBHZW5lcmF0ZSBpbiBzZXJ2ZXIgYW5kIHBhc3MgdG8gY2xpZW50LiBSZXR1cm4gbGF0ZXN0LgotICAgIGludDY0X3QgdGltZSA9IEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCk7Ci0gICAgKmZyYW1lUG9zaXRpb24gPSBtQ2xvY2tNb2RlbC5jb252ZXJ0VGltZVRvUG9zaXRpb24odGltZSkgKyBtRnJhbWVzT2Zmc2V0RnJvbVNlcnZpY2U7Ci0gICAgLy8gVE9ETyBHZXQgYSBtb3JlIGFjY3VyYXRlIHRpbWVzdGFtcCBmcm9tIHRoZSBzZXJ2aWNlLiBUaGlzIGNvZGUganVzdCBhZGRzIGEgZnVkZ2UgZmFjdG9yLgotICAgICp0aW1lTmFub3NlY29uZHMgPSB0aW1lICsgKDYgKiBBQVVESU9fTkFOT1NfUEVSX01JTExJU0VDT05EKTsKLSAgICByZXR1cm4gQUFVRElPX09LOworICAgIC8vIEdlbmVyYXRlZCBpbiBzZXJ2ZXIgYW5kIHBhc3NlZCB0byBjbGllbnQuIFJldHVybiBsYXRlc3QuCisgICAgaWYgKG1BdG9taWNUaW1lc3RhbXAuaXNWYWxpZCgpKSB7CisgICAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAgPSBtQXRvbWljVGltZXN0YW1wLnJlYWQoKTsKKyAgICAgICAgaW50NjRfdCBwb3NpdGlvbiA9IHRpbWVzdGFtcC5nZXRQb3NpdGlvbigpICsgbUZyYW1lc09mZnNldEZyb21TZXJ2aWNlOworICAgICAgICBpZiAocG9zaXRpb24gPj0gMCkgeworICAgICAgICAgICAgKmZyYW1lUG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICAgICAgICAgICp0aW1lTmFub3NlY29uZHMgPSB0aW1lc3RhbXAuZ2V0TmFub3NlY29uZHMoKTsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogfQogCi1hYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6dXBkYXRlU3RhdGVXaGlsZVdhaXRpbmcoKSB7CithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6dXBkYXRlU3RhdGVNYWNoaW5lKCkgewogICAgIGlmIChpc0RhdGFDYWxsYmFja0FjdGl2ZSgpKSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7IC8vIHN0YXRlIGlzIGdldHRpbmcgdXBkYXRlZCBieSB0aGUgY2FsbGJhY2sgdGhyZWFkIHJlYWQvd3JpdGUgY2FsbAogICAgIH0KQEAgLTM3MSwyMSArNDE2LDIxIEBACiAgICAgc3RhdGljIGludDY0X3Qgb2xkVGltZSA9IDA7CiAgICAgaW50NjRfdCBmcmFtZVBvc2l0aW9uID0gY29tbWFuZC50aW1lc3RhbXAucG9zaXRpb247CiAgICAgaW50NjRfdCBuYW5vVGltZSA9IGNvbW1hbmQudGltZXN0YW1wLnRpbWVzdGFtcDsKLSAgICBBTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbDogdGltZXN0YW1wIHNheXMgZnJhbWVQb3NpdGlvbiA9ICUwOGxsZCBhdCBuYW5vVGltZSAlbGxkIiwKKyAgICBBTE9HRCgibG9nVGltZXN0YW1wOiB0aW1lc3RhbXAgc2F5cyBmcmFtZVBvc2l0aW9uID0gJThsbGQgYXQgbmFub1RpbWUgJWxsZCIsCiAgICAgICAgICAobG9uZyBsb25nKSBmcmFtZVBvc2l0aW9uLAogICAgICAgICAgKGxvbmcgbG9uZykgbmFub1RpbWUpOwogICAgIGludDY0X3QgbmFub3NEZWx0YSA9IG5hbm9UaW1lIC0gb2xkVGltZTsKICAgICBpZiAobmFub3NEZWx0YSA+IDAgJiYgb2xkVGltZSA+IDApIHsKICAgICAgICAgaW50NjRfdCBmcmFtZXNEZWx0YSA9IGZyYW1lUG9zaXRpb24gLSBvbGRQb3NpdGlvbjsKICAgICAgICAgaW50NjRfdCByYXRlID0gKGZyYW1lc0RlbHRhICogQUFVRElPX05BTk9TX1BFUl9TRUNPTkQpIC8gbmFub3NEZWx0YTsKLSAgICAgICAgQUxPR0QoIkF1ZGlvU3RyZWFtSW50ZXJuYWw6IGZyYW1lc0RlbHRhID0gJTA4bGxkLCBuYW5vc0RlbHRhID0gJTA4bGxkLCByYXRlID0gJWxsZCIsCisgICAgICAgIEFMT0dEKCJsb2dUaW1lc3RhbXA6ICAgICBmcmFtZXNEZWx0YSA9ICU4bGxkLCBuYW5vc0RlbHRhID0gJThsbGQsIHJhdGUgPSAlbGxkIiwKICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgZnJhbWVzRGVsdGEsIChsb25nIGxvbmcpIG5hbm9zRGVsdGEsIChsb25nIGxvbmcpIHJhdGUpOwogICAgIH0KICAgICBvbGRQb3NpdGlvbiA9IGZyYW1lUG9zaXRpb247CiAgICAgb2xkVGltZSA9IG5hbm9UaW1lOwogfQogCi1hYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6b25UaW1lc3RhbXBGcm9tU2VydmVyKEFBdWRpb1NlcnZpY2VNZXNzYWdlICptZXNzYWdlKSB7CithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6b25UaW1lc3RhbXBTZXJ2aWNlKEFBdWRpb1NlcnZpY2VNZXNzYWdlICptZXNzYWdlKSB7CiAjaWYgTE9HX1RJTUVTVEFNUFMKICAgICBsb2dUaW1lc3RhbXAoKm1lc3NhZ2UpOwogI2VuZGlmCkBAIC0zOTMsMjMgKzQzOCwyOSBAQAogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpvblRpbWVzdGFtcEhhcmR3YXJlKEFBdWRpb1NlcnZpY2VNZXNzYWdlICptZXNzYWdlKSB7CisgICAgVGltZXN0YW1wIHRpbWVzdGFtcChtZXNzYWdlLT50aW1lc3RhbXAucG9zaXRpb24sIG1lc3NhZ2UtPnRpbWVzdGFtcC50aW1lc3RhbXApOworICAgIG1BdG9taWNUaW1lc3RhbXAud3JpdGUodGltZXN0YW1wKTsKKyAgICByZXR1cm4gQUFVRElPX09LOworfQorCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6b25FdmVudEZyb21TZXJ2ZXIoQUF1ZGlvU2VydmljZU1lc3NhZ2UgKm1lc3NhZ2UpIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwogICAgIHN3aXRjaCAobWVzc2FnZS0+ZXZlbnQuZXZlbnQpIHsKICAgICAgICAgY2FzZSBBQVVESU9fU0VSVklDRV9FVkVOVF9TVEFSVEVEOgotICAgICAgICAgICAgQUxPR0QoIkF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9uRXZlbnRGcm9tU2VydmVyZ290KCkgQUFVRElPX1NFUlZJQ0VfRVZFTlRfU1RBUlRFRCIpOworICAgICAgICAgICAgQUxPR0QoIkF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9uRXZlbnRGcm9tU2VydmVyKCkgZ290IEFBVURJT19TRVJWSUNFX0VWRU5UX1NUQVJURUQiKTsKICAgICAgICAgICAgIGlmIChnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRJTkcpIHsKICAgICAgICAgICAgICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQUFVRElPX1NFUlZJQ0VfRVZFTlRfUEFVU0VEOgotICAgICAgICAgICAgQUxPR0QoIkF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9uRXZlbnRGcm9tU2VydmVyZ290KCkgQUFVRElPX1NFUlZJQ0VfRVZFTlRfUEFVU0VEIik7CisgICAgICAgICAgICBBTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6b25FdmVudEZyb21TZXJ2ZXIoKSBnb3QgQUFVRElPX1NFUlZJQ0VfRVZFTlRfUEFVU0VEIik7CiAgICAgICAgICAgICBpZiAoZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNJTkcpIHsKICAgICAgICAgICAgICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNFRCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBQVVESU9fU0VSVklDRV9FVkVOVF9TVE9QUEVEOgotICAgICAgICAgICAgQUxPR0QoIkF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9uRXZlbnRGcm9tU2VydmVyZ290KCkgQUFVRElPX1NFUlZJQ0VfRVZFTlRfU1RPUFBFRCIpOworICAgICAgICAgICAgQUxPR0QoIkF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9uRXZlbnRGcm9tU2VydmVyKCkgZ290IEFBVURJT19TRVJWSUNFX0VWRU5UX1NUT1BQRUQiKTsKICAgICAgICAgICAgIGlmIChnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkcpIHsKICAgICAgICAgICAgICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQRUQpOwogICAgICAgICAgICAgfQpAQCAtNDI2LDEwICs0NzcsMTQgQEAKICAgICAgICAgICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VEKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFBVURJT19TRVJWSUNFX0VWRU5UX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgIC8vIFByZXZlbnQgaGFyZHdhcmUgZnJvbSBsb29waW5nIG9uIG9sZCBkYXRhIGFuZCBtYWtpbmcgYnV6emluZyBzb3VuZHMuCisgICAgICAgICAgICBpZiAoZ2V0RGlyZWN0aW9uKCkgPT0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpIHsKKyAgICAgICAgICAgICAgICBtQXVkaW9FbmRwb2ludC5lcmFzZURhdGFNZW1vcnkoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQ7CiAgICAgICAgICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCk7CiAgICAgICAgICAgICBBTE9HVygiV0FSTklORyAtIEF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9uRXZlbnRGcm9tU2VydmVyKCkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgQUFVRElPX1NFUlZJQ0VfRVZFTlRfRElTQ09OTkVDVEVEIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICIgQUFVRElPX1NFUlZJQ0VfRVZFTlRfRElTQ09OTkVDVEVEIC0gRklGTyBjbGVhcmVkIik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBQVVESU9fU0VSVklDRV9FVkVOVF9WT0xVTUU6CiAgICAgICAgICAgICBtU3RyZWFtVm9sdW1lID0gKGZsb2F0KW1lc3NhZ2UtPmV2ZW50LmRhdGFEb3VibGU7CkBAIC00NDUsNiArNTAwLDM0IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OmRyYWluVGltZXN0YW1wc0Zyb21TZXJ2aWNlKCkgeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CisKKyAgICB3aGlsZSAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICBBQXVkaW9TZXJ2aWNlTWVzc2FnZSBtZXNzYWdlOworICAgICAgICBpZiAobUF1ZGlvRW5kcG9pbnQucmVhZFVwQ29tbWFuZCgmbWVzc2FnZSkgIT0gMSkgeworICAgICAgICAgICAgYnJlYWs7IC8vIG5vIGNvbW1hbmQgdGhpcyB0aW1lLCBubyBwcm9ibGVtCisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZSBtb3N0IG1lc3NhZ2VzCisgICAgICAgICAgICBjYXNlIEFBdWRpb1NlcnZpY2VNZXNzYWdlOjpjb2RlOjpUSU1FU1RBTVBfU0VSVklDRToKKyAgICAgICAgICAgIGNhc2UgQUF1ZGlvU2VydmljZU1lc3NhZ2U6OmNvZGU6OlRJTUVTVEFNUF9IQVJEV0FSRToKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBBQXVkaW9TZXJ2aWNlTWVzc2FnZTo6Y29kZTo6RVZFTlQ6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gb25FdmVudEZyb21TZXJ2ZXIoJm1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dFKCJXQVJOSU5HIC0gZHJhaW5UaW1lc3RhbXBzRnJvbVNlcnZpY2UoKSBVbnJlY29nbml6ZWQgd2hhdCA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAoaW50KSBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlRFUk5BTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCiAvLyBQcm9jZXNzIGFsbCB0aGUgY29tbWFuZHMgY29taW5nIGZyb20gdGhlIHNlcnZlci4KIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpwcm9jZXNzQ29tbWFuZHMoKSB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKQEAgLTQ1Niw4ICs1MzksMTIgQEAKICAgICAgICAgICAgIGJyZWFrOyAvLyBubyBjb21tYW5kIHRoaXMgdGltZSwgbm8gcHJvYmxlbQogICAgICAgICB9CiAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7Ci0gICAgICAgIGNhc2UgQUF1ZGlvU2VydmljZU1lc3NhZ2U6OmNvZGU6OlRJTUVTVEFNUDoKLSAgICAgICAgICAgIHJlc3VsdCA9IG9uVGltZXN0YW1wRnJvbVNlcnZlcigmbWVzc2FnZSk7CisgICAgICAgIGNhc2UgQUF1ZGlvU2VydmljZU1lc3NhZ2U6OmNvZGU6OlRJTUVTVEFNUF9TRVJWSUNFOgorICAgICAgICAgICAgcmVzdWx0ID0gb25UaW1lc3RhbXBTZXJ2aWNlKCZtZXNzYWdlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQUF1ZGlvU2VydmljZU1lc3NhZ2U6OmNvZGU6OlRJTUVTVEFNUF9IQVJEV0FSRToKKyAgICAgICAgICAgIHJlc3VsdCA9IG9uVGltZXN0YW1wSGFyZHdhcmUoJm1lc3NhZ2UpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBBQXVkaW9TZXJ2aWNlTWVzc2FnZTo6Y29kZTo6RVZFTlQ6CkBAIC00NjUsNyArNTUyLDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgiV0FSTklORyAtIEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnByb2Nlc3NDb21tYW5kcygpIFVucmVjb2duaXplZCB3aGF0ID0gJWQiLAorICAgICAgICAgICAgQUxPR0UoIldBUk5JTkcgLSBwcm9jZXNzQ29tbWFuZHMoKSBVbnJlY29nbml6ZWQgd2hhdCA9ICVkIiwKICAgICAgICAgICAgICAgICAgKGludCkgbWVzc2FnZS53aGF0KTsKICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlRFUk5BTDsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNTE3LDEyICs2MDQsMTkgQEAKICAgICAgICAgICAgICAgICB3YWtlVGltZU5hbm9zICs9IG1XYWtldXBEZWxheU5hbm9zOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBjdXJyZW50VGltZU5hbm9zID0gQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKTsKKyAgICAgICAgICAgIGludDY0X3QgZWFybGllc3RXYWtlVGltZSA9IGN1cnJlbnRUaW1lTmFub3MgKyBtTWluaW11bVNsZWVwTmFub3M7CisgICAgICAgICAgICAvLyBHdWFyYW50ZWUgYSBtaW5pbXVtIHNsZWVwIHRpbWUuCisgICAgICAgICAgICBpZiAod2FrZVRpbWVOYW5vcyA8IGVhcmxpZXN0V2FrZVRpbWUpIHsKKyAgICAgICAgICAgICAgICB3YWtlVGltZU5hbm9zID0gZWFybGllc3RXYWtlVGltZTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHdha2VUaW1lTmFub3MgPiBkZWFkbGluZU5hbm9zKSB7CiAgICAgICAgICAgICAgICAgLy8gSWYgd2UgdGltZSBvdXQsIGp1c3QgcmV0dXJuIHRoZSBmcmFtZXNXcml0dGVuIHNvIGZhci4KICAgICAgICAgICAgICAgICAvLyBUT0RPIHJlbW92ZSBhZnRlciB3ZSBmaXggdGhlIGRlYWRsaW5lIGJ1ZwogICAgICAgICAgICAgICAgIEFMT0dXKCJBdWRpb1N0cmVhbUludGVybmFsOjpwcm9jZXNzRGF0YSgpOiBlbnRlcmVkIGF0ICVsbGQgbmFub3MsIGN1cnJlbnRseSAlbGxkIiwKICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBlbnRyeVRpbWVOYW5vcywgKGxvbmcgbG9uZykgY3VycmVudFRpbWVOYW5vcyk7Ci0gICAgICAgICAgICAgICAgQUxPR1coIkF1ZGlvU3RyZWFtSW50ZXJuYWw6OnByb2Nlc3NEYXRhKCk6IHRpbWVkIG91dCBhZnRlciAlbGxkIG5hbm9zIiwKKyAgICAgICAgICAgICAgICBBTE9HVygiQXVkaW9TdHJlYW1JbnRlcm5hbDo6cHJvY2Vzc0RhdGEoKTogVElNRU9VVCBhZnRlciAlbGxkIG5hbm9zIiwKICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSB0aW1lb3V0TmFub3NlY29uZHMpOwogICAgICAgICAgICAgICAgIEFMT0dXKCJBdWRpb1N0cmVhbUludGVybmFsOjpwcm9jZXNzRGF0YSgpOiB3YWtlVGltZSA9ICVsbGQsIGRlYWRsaW5lID0gJWxsZCBuYW5vcyIsCiAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgd2FrZVRpbWVOYW5vcywgKGxvbmcgbG9uZykgZGVhZGxpbmVOYW5vcyk7CkBAIC01MzMsMTMgKzYyNyw2IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGN1cnJlbnRUaW1lTmFub3MgPSBBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpOwotICAgICAgICAgICAgaW50NjRfdCBlYXJsaWVzdFdha2VUaW1lID0gY3VycmVudFRpbWVOYW5vcyArIG1NaW5pbXVtU2xlZXBOYW5vczsKLSAgICAgICAgICAgIC8vIEd1YXJhbnRlZSBhIG1pbmltdW0gc2xlZXAgdGltZS4KLSAgICAgICAgICAgIGlmICh3YWtlVGltZU5hbm9zIDwgZWFybGllc3RXYWtlVGltZSkgewotICAgICAgICAgICAgICAgIHdha2VUaW1lTmFub3MgPSBlYXJsaWVzdFdha2VUaW1lOwotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBpZiAoQVRSQUNFX0VOQUJMRUQoKSkgewogICAgICAgICAgICAgICAgIGludDMyX3QgZnVsbEZyYW1lcyA9IG1BdWRpb0VuZHBvaW50LmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKICAgICAgICAgICAgICAgICBBVFJBQ0VfSU5UKGZpZm9OYW1lLCBmdWxsRnJhbWVzKTsKQEAgLTU3Niw3ICs2NjMsNyBAQAogICAgIH0KIAogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBtQXVkaW9FbmRwb2ludC5zZXRCdWZmZXJTaXplSW5GcmFtZXMocmVxdWVzdGVkRnJhbWVzLCAmYWN0dWFsRnJhbWVzKTsKLSAgICBBTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6c2V0QnVmZmVyU2l6ZSgpIHJlcSA9ICVkID0+ICVkIiwgcmVxdWVzdGVkRnJhbWVzLCBhY3R1YWxGcmFtZXMpOworICAgIEFMT0dEKCJzZXRCdWZmZXJTaXplKCkgcmVxID0gJWQgPT4gJWQiLCByZXF1ZXN0ZWRGcmFtZXMsIGFjdHVhbEZyYW1lcyk7CiAgICAgaWYgKHJlc3VsdCA8IDApIHsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9IGVsc2UgewpAQCAtNTk5LDMyICs2ODYsMyBAQAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OmpvaW5UaHJlYWQodm9pZCoqIHJldHVybkFyZykgewogICAgIHJldHVybiBBdWRpb1N0cmVhbTo6am9pblRocmVhZChyZXR1cm5BcmcsIGNhbGN1bGF0ZVJlYXNvbmFibGVUaW1lb3V0KGdldEZyYW1lc1BlckJ1cnN0KCkpKTsKIH0KLQotdm9pZCBBdWRpb1N0cmVhbUludGVybmFsOjpkb1NldFZvbHVtZSgpIHsKLSAgICAvLyBObyBwYW4gYW5kIG9ubHkgbGVmdCB2b2x1bWUgaXMgdGFrZW4gaW50byBhY2NvdW50IGZyb20gSVBMYXllciBpbnRlcmZhY2UKLSAgICBtVm9sdW1lUmFtcC5zZXRUYXJnZXQobVN0cmVhbVZvbHVtZSAqIG1Wb2x1bWVNdWx0aXBsaWVyTCAvKiAqIG1QYW5NdWx0aXBsaWVyTCAqLyk7Ci19Ci0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEltcGxlbWVudGF0aW9uIG9mIFBsYXllckJhc2UKLXN0YXR1c190IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnBsYXllclN0YXJ0KCkgewotICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyhtU2VydmljZUludGVyZmFjZS5zdGFydFN0cmVhbShtU2VydmljZVN0cmVhbUhhbmRsZSkpOwotfQotCi1zdGF0dXNfdCBBdWRpb1N0cmVhbUludGVybmFsOjpwbGF5ZXJQYXVzZSgpIHsKLSAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTdGF0dXMobVNlcnZpY2VJbnRlcmZhY2UucGF1c2VTdHJlYW0obVNlcnZpY2VTdHJlYW1IYW5kbGUpKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6cGxheWVyU3RvcCgpIHsKLSAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTdGF0dXMobVNlcnZpY2VJbnRlcmZhY2Uuc3RvcFN0cmVhbShtU2VydmljZVN0cmVhbUhhbmRsZSkpOwotfQotCi1zdGF0dXNfdCBBdWRpb1N0cmVhbUludGVybmFsOjpwbGF5ZXJTZXRWb2x1bWUoKSB7Ci0gICAgZG9TZXRWb2x1bWUoKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXZvaWQgQXVkaW9TdHJlYW1JbnRlcm5hbDo6ZGVzdHJveSgpIHsKLSAgICBiYXNlRGVzdHJveSgpOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oCmluZGV4IDFiOTkxZGUuLjQ3MDI0YzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgKQEAgLTE4LDcgKzE4LDYgQEAKICNkZWZpbmUgQU5EUk9JRF9BQVVESU9fQVVESU9fU1RSRUFNX0lOVEVSTkFMX0gKIAogI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPG1lZGlhL1BsYXllckJhc2UuaD4KICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAKICNpbmNsdWRlICJiaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmgiCkBAIC0zNiw3ICszNSw3IEBACiBuYW1lc3BhY2UgYWF1ZGlvIHsKIAogLy8gQSBzdHJlYW0gdGhhdCB0YWxrcyB0byB0aGUgQUF1ZGlvU2VydmljZSBvciBkaXJlY3RseSB0byBhIEhBTC4KLWNsYXNzIEF1ZGlvU3RyZWFtSW50ZXJuYWwgOiBwdWJsaWMgQXVkaW9TdHJlYW0sIHB1YmxpYyBhbmRyb2lkOjpQbGF5ZXJCYXNlICB7CitjbGFzcyBBdWRpb1N0cmVhbUludGVybmFsIDogcHVibGljIEF1ZGlvU3RyZWFtIHsKIAogcHVibGljOgogICAgIEF1ZGlvU3RyZWFtSW50ZXJuYWwoQUF1ZGlvU2VydmljZUludGVyZmFjZSAgJnNlcnZpY2VJbnRlcmZhY2UsIGJvb2wgaW5TZXJ2aWNlKTsKQEAgLTUwLDcgKzQ5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmZyYW1lUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3NlY29uZHMpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgdXBkYXRlU3RhdGVXaGlsZVdhaXRpbmcoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCB1cGRhdGVTdGF0ZU1hY2hpbmUoKSBvdmVycmlkZTsKIAogICAgIGFhdWRpb19yZXN1bHRfdCBvcGVuKGNvbnN0IEF1ZGlvU3RyZWFtQnVpbGRlciAmYnVpbGRlcikgb3ZlcnJpZGU7CiAKQEAgLTg1LDE0ICs4NCwxNSBAQAogICAgIC8vIENhbGN1bGF0ZSB0aW1lb3V0IGJhc2VkIG9uIGZyYW1lc1BlckJ1cnN0CiAgICAgaW50NjRfdCBjYWxjdWxhdGVSZWFzb25hYmxlVGltZW91dCgpOwogCi0gICAgLy9QbGF5ZXJCYXNlIHZpcnR1YWxzCi0gICAgdmlydHVhbCB2b2lkIGRlc3Ryb3koKTsKLQogICAgIGFhdWRpb19yZXN1bHRfdCBzdGFydENsaWVudChjb25zdCBhbmRyb2lkOjpBdWRpb0NsaWVudCYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpjbGllbnRIYW5kbGUpOwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHN0b3BDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBjbGllbnRIYW5kbGUpOwogCisgICAgYWF1ZGlvX2hhbmRsZV90IGdldFNlcnZpY2VIYW5kbGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU2VydmljZVN0cmVhbUhhbmRsZTsKKyAgICB9CisKIHByb3RlY3RlZDoKIAogICAgIGFhdWRpb19yZXN1bHRfdCBwcm9jZXNzRGF0YSh2b2lkICpidWZmZXIsCkBAIC0xMTEsMzIgKzExMSwyOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY3VycmVudFRpbWVOYW5vcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp3YWtlVGltZVB0cikgPSAwOwogCisgICAgYWF1ZGlvX3Jlc3VsdF90IGRyYWluVGltZXN0YW1wc0Zyb21TZXJ2aWNlKCk7CisKICAgICBhYXVkaW9fcmVzdWx0X3QgcHJvY2Vzc0NvbW1hbmRzKCk7CiAKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVxdWVzdFN0b3BJbnRlcm5hbCgpOwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHN0b3BDYWxsYmFjaygpOwogCisgICAgdmlydHVhbCB2b2lkIGFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQgb25GbHVzaEZyb21TZXJ2ZXIoKSB7fQogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IG9uRXZlbnRGcm9tU2VydmVyKEFBdWRpb1NlcnZpY2VNZXNzYWdlICptZXNzYWdlKTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCBvblRpbWVzdGFtcEZyb21TZXJ2ZXIoQUF1ZGlvU2VydmljZU1lc3NhZ2UgKm1lc3NhZ2UpOworICAgIGFhdWRpb19yZXN1bHRfdCBvblRpbWVzdGFtcFNlcnZpY2UoQUF1ZGlvU2VydmljZU1lc3NhZ2UgKm1lc3NhZ2UpOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IG9uVGltZXN0YW1wSGFyZHdhcmUoQUF1ZGlvU2VydmljZU1lc3NhZ2UgKm1lc3NhZ2UpOwogCiAgICAgdm9pZCBsb2dUaW1lc3RhbXAoQUF1ZGlvU2VydmljZU1lc3NhZ2UgJm1lc3NhZ2UpOwogCiAgICAgLy8gQ2FsY3VsYXRlIHRpbWVvdXQgZm9yIGFuIG9wZXJhdGlvbiBpbnZvbHZpbmcgZnJhbWVzUGVyT3BlcmF0aW9uLgogICAgIGludDY0X3QgY2FsY3VsYXRlUmVhc29uYWJsZVRpbWVvdXQoaW50MzJfdCBmcmFtZXNQZXJPcGVyYXRpb24pOwogCi0gICAgdm9pZCBkb1NldFZvbHVtZSgpOwotCi0gICAgLy9QbGF5ZXJCYXNlIHZpcnR1YWxzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwbGF5ZXJTdGFydCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcGxheWVyUGF1c2UoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHBsYXllclN0b3AoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHBsYXllclNldFZvbHVtZSgpOwotCiAgICAgYWF1ZGlvX2Zvcm1hdF90ICAgICAgICAgIG1EZXZpY2VGb3JtYXQgPSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOwogCiAgICAgSXNvY2hyb25vdXNDbG9ja01vZGVsICAgIG1DbG9ja01vZGVsOyAgICAgIC8vIHRpbWluZyBtb2RlbCBmb3IgY2hhc2luZyB0aGUgSEFMCkBAIC0xNDcsOSArMTQ0LDYgQEAKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgbUZyYW1lc1BlckJ1cnN0OyAgICAgLy8gZnJhbWVzIHBlciBIQUwgdHJhbnNmZXIKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgbVhSdW5Db3VudCA9IDA7ICAgICAgLy8gaG93IG1hbnkgdW5kZXJydW4gZXZlbnRzPwogCi0gICAgTGluZWFyUmFtcCAgICAgICAgICAgICAgIG1Wb2x1bWVSYW1wOwotICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICBtU3RyZWFtVm9sdW1lOwotCiAgICAgLy8gT2Zmc2V0IGZyb20gdW5kZXJseWluZyBmcmFtZSBwb3NpdGlvbi4KICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgbUZyYW1lc09mZnNldEZyb21TZXJ2aWNlID0gMDsgLy8gb2Zmc2V0IGZvciB0aW1lc3RhbXBzCiAKQEAgLTE2MSw2ICsxNTUsMTIgQEAKIAogICAgIEFBdWRpb1NlcnZpY2VJbnRlcmZhY2UgICZtU2VydmljZUludGVyZmFjZTsgICAvLyBhYnN0cmFjdCBpbnRlcmZhY2UgdG8gdGhlIHNlcnZpY2UKIAorICAgIFNpbXBsZURvdWJsZUJ1ZmZlcjxUaW1lc3RhbXA+ICBtQXRvbWljVGltZXN0YW1wOworCisgICAgQXRvbWljUmVxdWVzdG9yICAgICAgICAgIG1OZWVkQ2F0Y2hVcDsgICAvLyBBc2sgcmVhZCgpIG9yIHdyaXRlKCkgdG8gc3luYyBvbiBmaXJzdCB0aW1lc3RhbXAuCisKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgbVN0cmVhbVZvbHVtZSA9IDEuMGY7CisKIHByaXZhdGU6CiAgICAgLyoKICAgICAgKiBBc3luY2hyb25vdXMgd3JpdGUgd2l0aCBkYXRhIGNvbnZlcnNpb24uCkBAIC0xODEsNiArMTgxLDggQEAKIAogICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICBtRW5kUG9pbnRQYXJjZWxhYmxlOyAvLyBkZXNjcmlwdGlvbiBvZiB0aGUgYnVmZmVycyBmaWxsZWQgYnkgc2VydmljZQogICAgIEVuZHBvaW50RGVzY3JpcHRvciAgICAgICBtRW5kcG9pbnREZXNjcmlwdG9yOyAvLyBidWZmZXIgZGVzY3JpcHRpb24gd2l0aCByZXNvbHZlZCBhZGRyZXNzZXMKKworICAgIGludDY0X3QgICAgICAgICAgICAgICAgICBtU2VydmljZUxhdGVuY3lOYW5vcyA9IDA7CiB9OwogCiB9IC8qIG5hbWVzcGFjZSBhYXVkaW8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcAppbmRleCA3YjFlNTNlLi5iNzkyZWNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwCkBAIC0zOSw2ICszOSwyMSBAQAogCiBBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZTo6fkF1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlKCkge30KIAordm9pZCBBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZTo6YWR2YW5jZUNsaWVudFRvTWF0Y2hTZXJ2ZXJQb3NpdGlvbigpIHsKKyAgICBpbnQ2NF90IHJlYWRDb3VudGVyID0gbUF1ZGlvRW5kcG9pbnQuZ2V0RGF0YVJlYWRDb3VudGVyKCk7CisgICAgaW50NjRfdCB3cml0ZUNvdW50ZXIgPSBtQXVkaW9FbmRwb2ludC5nZXREYXRhV3JpdGVDb3VudGVyKCk7CisKKyAgICAvLyBCdW1wIG9mZnNldCBzbyBjYWxsZXIgZG9lcyBub3Qgc2VlIHRoZSByZXRyb2dyYWRlIG1vdGlvbiBpbiBnZXRGcmFtZXNSZWFkKCkuCisgICAgaW50NjRfdCBvZmZzZXQgPSByZWFkQ291bnRlciAtIHdyaXRlQ291bnRlcjsKKyAgICBtRnJhbWVzT2Zmc2V0RnJvbVNlcnZpY2UgKz0gb2Zmc2V0OworICAgIEFMT0dEKCJhZHZhbmNlQ2xpZW50VG9NYXRjaFNlcnZlclBvc2l0aW9uKCkgcmVhZE4gPSAlbGxkLCB3cml0ZU4gPSAlbGxkLCBvZmZzZXQgPSAlbGxkIiwKKyAgICAgICAgICAobG9uZyBsb25nKXJlYWRDb3VudGVyLCAobG9uZyBsb25nKXdyaXRlQ291bnRlciwgKGxvbmcgbG9uZyltRnJhbWVzT2Zmc2V0RnJvbVNlcnZpY2UpOworCisgICAgLy8gRm9yY2UgcmVhZENvdW50ZXIgdG8gbWF0Y2ggd3JpdGVDb3VudGVyLgorICAgIC8vIFRoaXMgaXMgYmVjYXVzZSB3ZSBjYW5ub3QgY2hhbmdlIHRoZSB3cml0ZSBjb3VudGVyIGluIHRoZSBoYXJkd2FyZS4KKyAgICBtQXVkaW9FbmRwb2ludC5zZXREYXRhUmVhZENvdW50ZXIod3JpdGVDb3VudGVyKTsKK30KKwogLy8gV3JpdGUgdGhlIGRhdGEsIGJsb2NrIGlmIG5lZWRlZCBhbmQgdGltZW91dE1pbGxpcyA+IDAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZTo6cmVhZCh2b2lkICpidWZmZXIsIGludDMyX3QgbnVtRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVvdXROYW5vc2Vjb25kcykKQEAgLTU3LDYgKzcyLDE4IEBACiAgICAgY29uc3QgY2hhciAqdHJhY2VOYW1lID0gImFhUmROb3ciOwogICAgIEFUUkFDRV9CRUdJTih0cmFjZU5hbWUpOwogCisgICAgaWYgKG1DbG9ja01vZGVsLmlzU3RhcnRpbmcoKSkgeworICAgICAgICAvLyBTdGlsbCBoYXZlbid0IGdvdCBhbnkgdGltZXN0YW1wcyBmcm9tIHNlcnZlci4KKyAgICAgICAgLy8gS2VlcCB3YWl0aW5nIHVudGlsIHdlIGdldCBzb21lIHZhbGlkIHRpbWVzdGFtcHMgdGhlbiBzdGFydCB3cml0aW5nIHRvIHRoZQorICAgICAgICAvLyBjdXJyZW50IGJ1ZmZlciBwb3NpdGlvbi4KKyAgICAgICAgQUxPR0QoInByb2Nlc3NEYXRhTm93KCkgd2FpdCBmb3IgdmFsaWQgdGltZXN0YW1wcyIpOworICAgICAgICAvLyBTbGVlcCB2ZXJ5IGJyaWVmbHkgYW5kIGhvcGUgd2UgZ2V0IGEgdGltZXN0YW1wIHNvb24uCisgICAgICAgICp3YWtlVGltZVB0ciA9IGN1cnJlbnROYW5vVGltZSArICgyMDAwICogQUFVRElPX05BTk9TX1BFUl9NSUNST1NFQ09ORCk7CisgICAgICAgIEFUUkFDRV9FTkQoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8vIElmIHdlIGhhdmUgZ290dGVuIHRoaXMgZmFyIHRoZW4gd2UgaGF2ZSBhdCBsZWFzdCBvbmUgdGltZXN0YW1wIGZyb20gc2VydmVyLgorCiAgICAgaWYgKG1BdWRpb0VuZHBvaW50LmlzRnJlZVJ1bm5pbmcoKSkgewogICAgICAgICAvL0FMT0dEKCJBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZTo6cHJvY2Vzc0RhdGFOb3coKSAtIHVwZGF0ZSByZW1vdGUgY291bnRlciIpOwogICAgICAgICAvLyBVcGRhdGUgZGF0YSBxdWV1ZSBiYXNlZCBvbiB0aGUgdGltaW5nIG1vZGVsLgpAQCAtNjUsNiArOTIsMTQgQEAKICAgICAgICAgbUF1ZGlvRW5kcG9pbnQuc2V0RGF0YVdyaXRlQ291bnRlcihlc3RpbWF0ZWRSZW1vdGVDb3VudGVyKTsKICAgICB9CiAKKyAgICAvLyBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IHdlIGhhdmUgYWxyZWFkeSByZWNlaXZlZCB2YWxpZCB0aW1lc3RhbXBzLgorICAgIGlmIChtTmVlZENhdGNoVXAuaXNSZXF1ZXN0ZWQoKSkgeworICAgICAgICAvLyBDYXRjaCBhbiBNTUFQIHBvaW50ZXIgdGhhdCBpcyBhbHJlYWR5IGFkdmFuY2luZy4KKyAgICAgICAgLy8gVGhpcyB3aWxsIGF2b2lkIGluaXRpYWwgdW5kZXJydW5zIGNhdXNlZCBieSBhIHNsb3cgY29sZCBzdGFydC4KKyAgICAgICAgYWR2YW5jZUNsaWVudFRvTWF0Y2hTZXJ2ZXJQb3NpdGlvbigpOworICAgICAgICBtTmVlZENhdGNoVXAuYWNrbm93bGVkZ2UoKTsKKyAgICB9CisKICAgICAvLyBJZiB0aGUgd3JpdGUgaW5kZXggcGFzc2VkIHRoZSByZWFkIGluZGV4IHRoZW4gY29uc2lkZXIgaXQgYW4gb3ZlcnJ1bi4KICAgICBpZiAobUF1ZGlvRW5kcG9pbnQuZ2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKSA8IDApIHsKICAgICAgICAgbVhSdW5Db3VudCsrOwpAQCAtMTAwLDggKzEzNSw4IEBACiAgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGZyYW1lIHBvc2l0aW9uIGJhc2VkIG9mZiBvZiB0aGUgcmVhZENvdW50ZXIgYmVjYXVzZQogICAgICAgICAgICAgICAgIC8vIHRoZSB3cml0ZUNvdW50ZXIgbWlnaHQgaGF2ZSBqdXN0IGFkdmFuY2VkIGluIHRoZSBiYWNrZ3JvdW5kLAogICAgICAgICAgICAgICAgIC8vIGNhdXNpbmcgdXMgdG8gc2xlZXAgdW50aWwgYSBsYXRlciBidXJzdC4KLSAgICAgICAgICAgICAgICBpbnQ2NF90IG5leHRSZWFkUG9zaXRpb24gPSBtQXVkaW9FbmRwb2ludC5nZXREYXRhUmVhZENvdW50ZXIoKSArIG1GcmFtZXNQZXJCdXJzdDsKLSAgICAgICAgICAgICAgICB3YWtlVGltZSA9IG1DbG9ja01vZGVsLmNvbnZlcnRQb3NpdGlvblRvVGltZShuZXh0UmVhZFBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IG5leHRQb3NpdGlvbiA9IG1BdWRpb0VuZHBvaW50LmdldERhdGFSZWFkQ291bnRlcigpICsgbUZyYW1lc1BlckJ1cnN0OworICAgICAgICAgICAgICAgIHdha2VUaW1lID0gbUNsb2NrTW9kZWwuY29udmVydFBvc2l0aW9uVG9UaW1lKG5leHRQb3NpdGlvbik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtMTg2LDggKzIyMSw3IEBACiB9CiAKIGludDY0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmU6OmdldEZyYW1lc1JlYWQoKSB7Ci0gICAgaW50NjRfdCBmcmFtZXMgPSBtQXVkaW9FbmRwb2ludC5nZXREYXRhV3JpdGVDb3VudGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1GcmFtZXNPZmZzZXRGcm9tU2VydmljZTsKKyAgICBpbnQ2NF90IGZyYW1lcyA9IG1BdWRpb0VuZHBvaW50LmdldERhdGFSZWFkQ291bnRlcigpICsgbUZyYW1lc09mZnNldEZyb21TZXJ2aWNlOwogICAgIC8vQUxPR0QoIkF1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlOjpnZXRGcmFtZXNSZWFkKCkgcmV0dXJucyAlbGxkIiwgKGxvbmcgbG9uZylmcmFtZXMpOwogICAgIHJldHVybiBmcmFtZXM7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuaAppbmRleCAxN2YzN2U4Li4yOTRkYmFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmgKQEAgLTQ2LDYgKzQ2LDggQEAKICAgICB9CiBwcm90ZWN0ZWQ6CiAKKyAgICB2b2lkIGFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oKSBvdmVycmlkZTsKKwogLyoqCiAgKiBMb3cgbGV2ZWwgZGF0YSBwcm9jZXNzaW5nIHRoYXQgd2lsbCBub3QgYmxvY2suIEl0IHdpbGwganVzdCByZWFkIG9yIHdyaXRlIGFzIG11Y2ggYXMgaXQgY2FuLgogICoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcAppbmRleCAzMWUwYTQwLi4xZTAyZWVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwCkBAIC00OCw3ICs0OCw4IEBACiAKICAgICBtQ2xvY2tNb2RlbC5zdG9wKEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkpOwogICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0lORyk7Ci0gICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHBhdXNlV2l0aFN0YXR1cygpKTsKKyAgICBtQXRvbWljVGltZXN0YW1wLmNsZWFyKCk7CisgICAgcmV0dXJuIG1TZXJ2aWNlSW50ZXJmYWNlLnBhdXNlU3RyZWFtKG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5OjpyZXF1ZXN0UGF1c2UoKQpAQCAtNzIsMjEgKzczLDI1IEBACiAgICAgcmV0dXJuIG1TZXJ2aWNlSW50ZXJmYWNlLmZsdXNoU3RyZWFtKG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKIH0KIAotdm9pZCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6b25GbHVzaEZyb21TZXJ2ZXIoKSB7Cit2b2lkIEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5OjphZHZhbmNlQ2xpZW50VG9NYXRjaFNlcnZlclBvc2l0aW9uKCkgewogICAgIGludDY0X3QgcmVhZENvdW50ZXIgPSBtQXVkaW9FbmRwb2ludC5nZXREYXRhUmVhZENvdW50ZXIoKTsKICAgICBpbnQ2NF90IHdyaXRlQ291bnRlciA9IG1BdWRpb0VuZHBvaW50LmdldERhdGFXcml0ZUNvdW50ZXIoKTsKIAogICAgIC8vIEJ1bXAgb2Zmc2V0IHNvIGNhbGxlciBkb2VzIG5vdCBzZWUgdGhlIHJldHJvZ3JhZGUgbW90aW9uIGluIGdldEZyYW1lc1JlYWQoKS4KLSAgICBpbnQ2NF90IGZyYW1lc0ZsdXNoZWQgPSB3cml0ZUNvdW50ZXIgLSByZWFkQ291bnRlcjsKLSAgICBtRnJhbWVzT2Zmc2V0RnJvbVNlcnZpY2UgKz0gZnJhbWVzRmx1c2hlZDsKLSAgICBBTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6b25GbHVzaEZyb21TZXJ2ZXIoKSByZWFkTiA9ICVsbGQsIHdyaXRlTiA9ICVsbGQsIG9mZnNldCA9ICVsbGQiLAorICAgIGludDY0X3Qgb2Zmc2V0ID0gd3JpdGVDb3VudGVyIC0gcmVhZENvdW50ZXI7CisgICAgbUZyYW1lc09mZnNldEZyb21TZXJ2aWNlICs9IG9mZnNldDsKKyAgICBBTE9HRCgiYWR2YW5jZUNsaWVudFRvTWF0Y2hTZXJ2ZXJQb3NpdGlvbigpIHJlYWROID0gJWxsZCwgd3JpdGVOID0gJWxsZCwgb2Zmc2V0ID0gJWxsZCIsCiAgICAgICAgICAgKGxvbmcgbG9uZylyZWFkQ291bnRlciwgKGxvbmcgbG9uZyl3cml0ZUNvdW50ZXIsIChsb25nIGxvbmcpbUZyYW1lc09mZnNldEZyb21TZXJ2aWNlKTsKIAotICAgIC8vIEZsdXNoIHdyaXR0ZW4gZnJhbWVzIGJ5IGZvcmNpbmcgd3JpdGVDb3VudGVyIHRvIHJlYWRDb3VudGVyLgotICAgIC8vIFRoaXMgaXMgYmVjYXVzZSB3ZSBjYW5ub3QgbW92ZSB0aGUgcmVhZCBjb3VudGVyIGluIHRoZSBoYXJkd2FyZS4KKyAgICAvLyBGb3JjZSB3cml0ZUNvdW50ZXIgdG8gbWF0Y2ggcmVhZENvdW50ZXIuCisgICAgLy8gVGhpcyBpcyBiZWNhdXNlIHdlIGNhbm5vdCBjaGFuZ2UgdGhlIHJlYWQgY291bnRlciBpbiB0aGUgaGFyZHdhcmUuCiAgICAgbUF1ZGlvRW5kcG9pbnQuc2V0RGF0YVdyaXRlQ291bnRlcihyZWFkQ291bnRlcik7CiB9CiAKK3ZvaWQgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6Om9uRmx1c2hGcm9tU2VydmVyKCkgeworICAgIGFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oKTsKK30KKwogLy8gV3JpdGUgdGhlIGRhdGEsIGJsb2NrIGlmIG5lZWRlZCBhbmQgdGltZW91dE1pbGxpcyA+IDAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6d3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBpbnQzMl90IG51bUZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVvdXROYW5vc2Vjb25kcykKQEAgLTEwNiw2ICsxMTEsMTggQEAKICAgICBjb25zdCBjaGFyICp0cmFjZU5hbWUgPSAiYWFXck5vdyI7CiAgICAgQVRSQUNFX0JFR0lOKHRyYWNlTmFtZSk7CiAKKyAgICBpZiAobUNsb2NrTW9kZWwuaXNTdGFydGluZygpKSB7CisgICAgICAgIC8vIFN0aWxsIGhhdmVuJ3QgZ290IGFueSB0aW1lc3RhbXBzIGZyb20gc2VydmVyLgorICAgICAgICAvLyBLZWVwIHdhaXRpbmcgdW50aWwgd2UgZ2V0IHNvbWUgdmFsaWQgdGltZXN0YW1wcyB0aGVuIHN0YXJ0IHdyaXRpbmcgdG8gdGhlCisgICAgICAgIC8vIGN1cnJlbnQgYnVmZmVyIHBvc2l0aW9uLgorICAgICAgICBBTE9HRCgicHJvY2Vzc0RhdGFOb3coKSB3YWl0IGZvciB2YWxpZCB0aW1lc3RhbXBzIik7CisgICAgICAgIC8vIFNsZWVwIHZlcnkgYnJpZWZseSBhbmQgaG9wZSB3ZSBnZXQgYSB0aW1lc3RhbXAgc29vbi4KKyAgICAgICAgKndha2VUaW1lUHRyID0gY3VycmVudE5hbm9UaW1lICsgKDIwMDAgKiBBQVVESU9fTkFOT1NfUEVSX01JQ1JPU0VDT05EKTsKKyAgICAgICAgQVRSQUNFX0VORCgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLy8gSWYgd2UgaGF2ZSBnb3R0ZW4gdGhpcyBmYXIgdGhlbiB3ZSBoYXZlIGF0IGxlYXN0IG9uZSB0aW1lc3RhbXAgZnJvbSBzZXJ2ZXIuCisKICAgICAvLyBJZiBhIERNQSBjaGFubmVsIG9yIERTUCBpcyByZWFkaW5nIHRoZSBvdGhlciBlbmQgdGhlbiB3ZSBoYXZlIHRvIHVwZGF0ZSB0aGUgcmVhZENvdW50ZXIuCiAgICAgaWYgKG1BdWRpb0VuZHBvaW50LmlzRnJlZVJ1bm5pbmcoKSkgewogICAgICAgICAvLyBVcGRhdGUgZGF0YSBxdWV1ZSBiYXNlZCBvbiB0aGUgdGltaW5nIG1vZGVsLgpAQCAtMTE0LDYgKzEzMSwxMyBAQAogICAgICAgICBtQXVkaW9FbmRwb2ludC5zZXREYXRhUmVhZENvdW50ZXIoZXN0aW1hdGVkUmVhZENvdW50ZXIpOwogICAgIH0KIAorICAgIGlmIChtTmVlZENhdGNoVXAuaXNSZXF1ZXN0ZWQoKSkgeworICAgICAgICAvLyBDYXRjaCBhbiBNTUFQIHBvaW50ZXIgdGhhdCBpcyBhbHJlYWR5IGFkdmFuY2luZy4KKyAgICAgICAgLy8gVGhpcyB3aWxsIGF2b2lkIGluaXRpYWwgdW5kZXJydW5zIGNhdXNlZCBieSBhIHNsb3cgY29sZCBzdGFydC4KKyAgICAgICAgYWR2YW5jZUNsaWVudFRvTWF0Y2hTZXJ2ZXJQb3NpdGlvbigpOworICAgICAgICBtTmVlZENhdGNoVXAuYWNrbm93bGVkZ2UoKTsKKyAgICB9CisKICAgICAvLyBJZiB0aGUgcmVhZCBpbmRleCBwYXNzZWQgdGhlIHdyaXRlIGluZGV4IHRoZW4gY29uc2lkZXIgaXQgYW4gdW5kZXJydW4uCiAgICAgaWYgKG1BdWRpb0VuZHBvaW50LmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKSA8IDApIHsKICAgICAgICAgbVhSdW5Db3VudCsrOwpAQCAtMTUzLDkgKzE3Nyw5IEBACiAgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGZyYW1lIHBvc2l0aW9uIGJhc2VkIG9mZiBvZiB0aGUgd3JpdGVDb3VudGVyIGJlY2F1c2UKICAgICAgICAgICAgICAgICAvLyB0aGUgcmVhZENvdW50ZXIgbWlnaHQgaGF2ZSBqdXN0IGFkdmFuY2VkIGluIHRoZSBiYWNrZ3JvdW5kLAogICAgICAgICAgICAgICAgIC8vIGNhdXNpbmcgdXMgdG8gc2xlZXAgdW50aWwgYSBsYXRlciBidXJzdC4KLSAgICAgICAgICAgICAgICBpbnQ2NF90IG5leHRSZWFkUG9zaXRpb24gPSBtQXVkaW9FbmRwb2ludC5nZXREYXRhV3JpdGVDb3VudGVyKCkgKyBtRnJhbWVzUGVyQnVyc3QKKyAgICAgICAgICAgICAgICBpbnQ2NF90IG5leHRQb3NpdGlvbiA9IG1BdWRpb0VuZHBvaW50LmdldERhdGFXcml0ZUNvdW50ZXIoKSArIG1GcmFtZXNQZXJCdXJzdAogICAgICAgICAgICAgICAgICAgICAgICAgLSBtQXVkaW9FbmRwb2ludC5nZXRCdWZmZXJTaXplSW5GcmFtZXMoKTsKLSAgICAgICAgICAgICAgICB3YWtlVGltZSA9IG1DbG9ja01vZGVsLmNvbnZlcnRQb3NpdGlvblRvVGltZShuZXh0UmVhZFBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICB3YWtlVGltZSA9IG1DbG9ja01vZGVsLmNvbnZlcnRQb3NpdGlvblRvVGltZShuZXh0UG9zaXRpb24pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKQEAgLTI2Niw3ICsyOTAsNiBAQAogICAgIHJldHVybiBmcmFtZXNXcml0dGVuOwogfQogCi0KIGludDY0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OmdldEZyYW1lc1JlYWQoKQogewogICAgIGludDY0X3QgZnJhbWVzUmVhZEhhcmR3YXJlOwpAQCAtMzQwLDMgKzM2MywxMCBAQAogICAgICAgICAgIHJlc3VsdCwgKGludCkgaXNBY3RpdmUoKSk7CiAgICAgcmV0dXJuIE5VTEw7CiB9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbXBsZW1lbnRhdGlvbiBvZiBQbGF5ZXJCYXNlCitzdGF0dXNfdCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6ZG9TZXRWb2x1bWUoKSB7CisgICAgbVZvbHVtZVJhbXAuc2V0VGFyZ2V0KG1TdHJlYW1Wb2x1bWUgKiBnZXREdWNrQW5kTXV0ZVZvbHVtZSgpKTsKKyAgICByZXR1cm4gYW5kcm9pZDo6Tk9fRVJST1I7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaAppbmRleCBlNTlkMDJjLi5kNWMxYjFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmgKQEAgLTU0LDggKzU0LDEyIEBACiAKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVxdWVzdFBhdXNlSW50ZXJuYWwoKTsKIAorICAgIHZvaWQgYWR2YW5jZUNsaWVudFRvTWF0Y2hTZXJ2ZXJQb3NpdGlvbigpIG92ZXJyaWRlOworCiAgICAgdm9pZCBvbkZsdXNoRnJvbVNlcnZlcigpIG92ZXJyaWRlOwogCisgICAgYW5kcm9pZDo6c3RhdHVzX3QgZG9TZXRWb2x1bWUoKSBvdmVycmlkZTsKKwogLyoqCiAgKiBMb3cgbGV2ZWwgd3JpdGUgdGhhdCB3aWxsIG5vdCBibG9jay4gSXQgd2lsbCBqdXN0IHdyaXRlIGFzIG11Y2ggYXMgaXQgY2FuLgogICoKQEAgLTc4LDYgKzgyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcyk7CiAKICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgbUxhc3RGcmFtZXNSZWFkID0gMDsgLy8gdXNlZCB0byBwcmV2ZW50IHJldHJvZ3JhZGUgbW90aW9uCisKKyAgICBMaW5lYXJSYW1wICAgICAgICAgICAgICAgbVZvbHVtZVJhbXA7CisKIH07CiAKIH0gLyogbmFtZXNwYWNlIGFhdWRpbyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5jcHAKaW5kZXggYzA2YzhhOS4uYmFjNjlmMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuY3BwCkBAIC00OCwxOSArNDgsMjYgQEAKIH0KIAogdm9pZCBJc29jaHJvbm91c0Nsb2NrTW9kZWw6OnN0YXJ0KGludDY0X3QgbmFub1RpbWUpIHsKLSAgICBBTE9HRCgiSXNvY2hyb25vdXNDbG9ja01vZGVsOjpzdGFydChuYW5vcyA9ICVsbGQpXG4iLCAobG9uZyBsb25nKSBuYW5vVGltZSk7CisgICAgQUxPR1YoIklzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6c3RhcnQobmFub3MgPSAlbGxkKVxuIiwgKGxvbmcgbG9uZykgbmFub1RpbWUpOwogICAgIG1NYXJrZXJOYW5vVGltZSA9IG5hbm9UaW1lOwogICAgIG1TdGF0ZSA9IFNUQVRFX1NUQVJUSU5HOwogfQogCiB2b2lkIElzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6c3RvcChpbnQ2NF90IG5hbm9UaW1lKSB7Ci0gICAgQUxPR0QoIklzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6c3RvcChuYW5vcyA9ICVsbGQpXG4iLCAobG9uZyBsb25nKSBuYW5vVGltZSk7CisgICAgQUxPR1YoIklzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6c3RvcChuYW5vcyA9ICVsbGQpXG4iLCAobG9uZyBsb25nKSBuYW5vVGltZSk7CiAgICAgc2V0UG9zaXRpb25BbmRUaW1lKGNvbnZlcnRUaW1lVG9Qb3NpdGlvbihuYW5vVGltZSksIG5hbm9UaW1lKTsKICAgICAvLyBUT0RPIHNob3VsZCB3ZSBzZXQgcG9zaXRpb24/CiAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKIH0KIAorYm9vbCBJc29jaHJvbm91c0Nsb2NrTW9kZWw6OmlzU3RhcnRpbmcoKSB7CisgICAgcmV0dXJuIG1TdGF0ZSA9PSBTVEFURV9TVEFSVElORzsKK30KKwogdm9pZCBJc29jaHJvbm91c0Nsb2NrTW9kZWw6OnByb2Nlc3NUaW1lc3RhbXAoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQ2NF90IG5hbm9UaW1lKSB7CisvLyAgICBBTE9HRCgicHJvY2Vzc1RpbWVzdGFtcCgpIC0gZnJhbWVQb3NpdGlvbiA9ICVsbGQgYXQgbmFub1RpbWUgJWxsdSIsCisvLyAgICAgICAgIChsb25nIGxvbmcpZnJhbWVQb3NpdGlvbiwKKy8vICAgICAgICAgKGxvbmcgbG9uZyluYW5vVGltZSk7CiAgICAgaW50NjRfdCBmcmFtZXNEZWx0YSA9IGZyYW1lUG9zaXRpb24gLSBtTWFya2VyRnJhbWVQb3NpdGlvbjsKICAgICBpbnQ2NF90IG5hbm9zRGVsdGEgPSBuYW5vVGltZSAtIG1NYXJrZXJOYW5vVGltZTsKICAgICBpZiAobmFub3NEZWx0YSA8IDEwMDApIHsKQEAgLTcwLDkgKzc3LDYgQEAKIC8vICAgIEFMT0dEKCJwcm9jZXNzVGltZXN0YW1wKCkgLSBtTWFya2VyRnJhbWVQb3NpdGlvbiA9ICVsbGQgYXQgbU1hcmtlck5hbm9UaW1lICVsbHUiLAogLy8gICAgICAgICAobG9uZyBsb25nKW1NYXJrZXJGcmFtZVBvc2l0aW9uLAogLy8gICAgICAgICAobG9uZyBsb25nKW1NYXJrZXJOYW5vVGltZSk7Ci0vLyAgICBBTE9HRCgicHJvY2Vzc1RpbWVzdGFtcCgpIC0gZnJhbWVQb3NpdGlvbiA9ICVsbGQgYXQgbmFub1RpbWUgJWxsdSIsCi0vLyAgICAgICAgIChsb25nIGxvbmcpZnJhbWVQb3NpdGlvbiwKLS8vICAgICAgICAgKGxvbmcgbG9uZyluYW5vVGltZSk7CiAKICAgICBpbnQ2NF90IGV4cGVjdGVkTmFub3NEZWx0YSA9IGNvbnZlcnREZWx0YVBvc2l0aW9uVG9UaW1lKGZyYW1lc0RlbHRhKTsKIC8vICAgIEFMT0dEKCJwcm9jZXNzVGltZXN0YW1wKCkgLSBleHBlY3RlZE5hbm9zRGVsdGEgPSAlbGxkLCBuYW5vc0RlbHRhID0gJWxsdSIsCkBAIC0xMTYsNiArMTIwLDggQEAKICAgICBkZWZhdWx0OgogICAgICAgICBicmVhazsKICAgICB9CisKKy8vICAgIEFMT0dEKCJwcm9jZXNzVGltZXN0YW1wKCkgLSBtU3RhdGUgPSAlZCIsIG1TdGF0ZSk7CiB9CiAKIHZvaWQgSXNvY2hyb25vdXNDbG9ja01vZGVsOjpzZXRTYW1wbGVSYXRlKGludDMyX3Qgc2FtcGxlUmF0ZSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuaAppbmRleCA1ODVmNTNhLi43MTgyMzc2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuaApAQCAtMzYsNiArMzYsOCBAQAogICAgIHZvaWQgc3RhcnQoaW50NjRfdCBuYW5vVGltZSk7CiAgICAgdm9pZCBzdG9wKGludDY0X3QgbmFub1RpbWUpOwogCisgICAgYm9vbCBpc1N0YXJ0aW5nKCk7CisKICAgICB2b2lkIHByb2Nlc3NUaW1lc3RhbXAoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQ2NF90IG5hbm9UaW1lKTsKIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAKaW5kZXggM2Y1ZGU3Ny4uMWVhZWU4MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwCkBAIC0yNCwxNSArMjQsMTQgQEAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpb1Rlc3RpbmcuaD4KIAorI2luY2x1ZGUgIkF1ZGlvQ2xvY2suaCIKICNpbmNsdWRlICJBdWRpb1N0cmVhbUJ1aWxkZXIuaCIKICNpbmNsdWRlICJBdWRpb1N0cmVhbS5oIgotI2luY2x1ZGUgIkF1ZGlvQ2xvY2suaCIKKyNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb0NvbW1vbi5oIgogI2luY2x1ZGUgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgiCi0jaW5jbHVkZSAiSGFuZGxlVHJhY2tlci5oIgogCiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwogCi0KIC8vIE1hY3JvcyBmb3IgY29tbW9uIGNvZGUgdGhhdCBpbmNsdWRlcyBhIHJldHVybi4KIC8vIFRPRE8gQ29uc2lkZXIgdXNpbmcgZG97fXdoaWxlKDApIGNvbnN0cnVjdC4gSSB0cmllZCBidXQgaXQgaHVuZyBBbmRyb2lkU3R1ZGlvCiAjZGVmaW5lIENPTlZFUlRfQlVJTERFUl9IQU5ETEVfT1JfUkVUVVJOKCkgXApAQCAtMTAxLDcgKzEwMCw2IEBACiAgKi8KIHN0YXRpYyBhYXVkaW9fcG9saWN5X3Qgc19NTWFwUG9saWN5ID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogCi0KIHN0YXRpYyBBdWRpb1N0cmVhbSAqY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCiB7CiAgICAgcmV0dXJuIChBdWRpb1N0cmVhbSopIHN0cmVhbTsKQEAgLTE0NCwxNyArMTQyLDE2IEBACiB9CiAKIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENoYW5uZWxDb3VudChBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50KQogewogICAgIEF1ZGlvU3RyZWFtQnVpbGRlciAqc3RyZWFtQnVpbGRlciA9IGNvbnZlcnRBQXVkaW9CdWlsZGVyVG9TdHJlYW1CdWlsZGVyKGJ1aWxkZXIpOwogICAgIHN0cmVhbUJ1aWxkZXItPnNldFNhbXBsZXNQZXJGcmFtZShjaGFubmVsQ291bnQpOwogfQogCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVzUGVyRnJhbWUoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudCkKIHsKLSAgICBBdWRpb1N0cmVhbUJ1aWxkZXIgKnN0cmVhbUJ1aWxkZXIgPSBjb252ZXJ0QUF1ZGlvQnVpbGRlclRvU3RyZWFtQnVpbGRlcihidWlsZGVyKTsKLSAgICBzdHJlYW1CdWlsZGVyLT5zZXRTYW1wbGVzUGVyRnJhbWUoc2FtcGxlc1BlckZyYW1lKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENoYW5uZWxDb3VudChidWlsZGVyLCBjaGFubmVsQ291bnQpOwogfQogCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREaXJlY3Rpb24oQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKQEAgLTIyMSw2ICsyMTgsNyBAQAogICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKSByZXR1cm5zICVkID0gJXMgZm9yICglcCkgLS0tLS0tLS0tLS0tLS0tLSIsCiAgICAgICAgICAgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpLCBhdWRpb1N0cmVhbSk7CiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgYXVkaW9TdHJlYW0tPnJlZ2lzdGVyUGxheWVyQmFzZSgpOwogICAgICAgICAqc3RyZWFtUHRyID0gKEFBdWRpb1N0cmVhbSopIGF1ZGlvU3RyZWFtOwogICAgIH0gZWxzZSB7CiAgICAgICAgICpzdHJlYW1QdHIgPSBudWxscHRyOwpAQCAtMjQ0LDYgKzI0Miw3IEBACiAgICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9jbG9zZSglcCkiLCBzdHJlYW0pOwogICAgIGlmIChhdWRpb1N0cmVhbSAhPSBudWxscHRyKSB7CiAgICAgICAgIGF1ZGlvU3RyZWFtLT5jbG9zZSgpOworICAgICAgICBhdWRpb1N0cmVhbS0+dW5yZWdpc3RlclBsYXllckJhc2UoKTsKICAgICAgICAgZGVsZXRlIGF1ZGlvU3RyZWFtOwogICAgICAgICByZXR1cm4gQUFVRElPX09LOwogICAgIH0KQEAgLTI1NCw4ICsyNTMsOCBAQAogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7CiAgICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoJXApIGNhbGxlZCAtLS0tLS0tLS0tLS0tLSIsIHN0cmVhbSk7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGF1ZGlvU3RyZWFtLT5yZXF1ZXN0U3RhcnQoKTsKLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydCglcCkgcmV0dXJuZWQgLS0tLS0tLS0tLS0tIiwgc3RyZWFtKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gYXVkaW9TdHJlYW0tPnN5c3RlbVN0YXJ0KCk7CisgICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoJXApIHJldHVybmVkICVkIC0tLS0tLS0tLSIsIHN0cmVhbSwgcmVzdWx0KTsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCkBAIC0yNjMsNyArMjYyLDcgQEAKIHsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOwogICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFBhdXNlKCVwKSIsIHN0cmVhbSk7Ci0gICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5yZXF1ZXN0UGF1c2UoKTsKKyAgICByZXR1cm4gYXVkaW9TdHJlYW0tPnN5c3RlbVBhdXNlKCk7CiB9CiAKIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1fcmVxdWVzdEZsdXNoKEFBdWRpb1N0cmVhbSogc3RyZWFtKQpAQCAtMjc3LDcgKzI3Niw3IEBACiB7CiAgICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oc3RyZWFtKTsKICAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKCVwKSIsIHN0cmVhbSk7Ci0gICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5yZXF1ZXN0U3RvcCgpOworICAgIHJldHVybiBhdWRpb1N0cmVhbS0+c3lzdGVtU3RvcCgpOwogfQogCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TdHJlYW1fd2FpdEZvclN0YXRlQ2hhbmdlKEFBdWRpb1N0cmVhbSogc3RyZWFtLApAQCAtMzU5LDggKzM1OCw3IEBACiAKIEFBVURJT19BUEkgaW50MzJfdCBBQXVkaW9TdHJlYW1fZ2V0U2FtcGxlc1BlckZyYW1lKEFBdWRpb1N0cmVhbSogc3RyZWFtKQogewotICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7Ci0gICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICByZXR1cm4gQUF1ZGlvU3RyZWFtX2dldENoYW5uZWxDb3VudChzdHJlYW0pOwogfQogCiBBQVVESU9fQVBJIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBBQXVkaW9TdHJlYW1fZ2V0U3RhdGUoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5jcHAKaW5kZXggNjVjMmI0Ni4uODI0NDVlNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcApAQCAtMzQsNiArMzQsMTYgQEAKIEFBdWRpb1N0cmVhbVBhcmFtZXRlcnM6OkFBdWRpb1N0cmVhbVBhcmFtZXRlcnMoKSB7fQogQUF1ZGlvU3RyZWFtUGFyYW1ldGVyczo6fkFBdWRpb1N0cmVhbVBhcmFtZXRlcnMoKSB7fQogCit2b2lkIEFBdWRpb1N0cmVhbVBhcmFtZXRlcnM6OmNvcHlGcm9tKGNvbnN0IEFBdWRpb1N0cmVhbVBhcmFtZXRlcnMgJm90aGVyKSB7CisgICAgbVNhbXBsZXNQZXJGcmFtZSA9IG90aGVyLm1TYW1wbGVzUGVyRnJhbWU7CisgICAgbVNhbXBsZVJhdGUgICAgICA9IG90aGVyLm1TYW1wbGVSYXRlOworICAgIG1EZXZpY2VJZCAgICAgICAgPSBvdGhlci5tRGV2aWNlSWQ7CisgICAgbVNoYXJpbmdNb2RlICAgICA9IG90aGVyLm1TaGFyaW5nTW9kZTsKKyAgICBtQXVkaW9Gb3JtYXQgICAgID0gb3RoZXIubUF1ZGlvRm9ybWF0OworICAgIG1EaXJlY3Rpb24gICAgICAgPSBvdGhlci5tRGlyZWN0aW9uOworICAgIG1CdWZmZXJDYXBhY2l0eSAgPSBvdGhlci5tQnVmZmVyQ2FwYWNpdHk7Cit9CisKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzOjp2YWxpZGF0ZSgpIGNvbnN0IHsKICAgICBpZiAobVNhbXBsZXNQZXJGcmFtZSAhPSBBQVVESU9fVU5TUEVDSUZJRUQKICAgICAgICAgJiYgKG1TYW1wbGVzUGVyRnJhbWUgPCBTQU1QTEVTX1BFUl9GUkFNRV9NSU4gfHwgbVNhbXBsZXNQZXJGcmFtZSA+IFNBTVBMRVNfUEVSX0ZSQU1FX01BWCkpIHsKQEAgLTc4LDYgKzg4LDE2IEBACiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwogICAgIH0KIAorICAgIHN3aXRjaCAobURpcmVjdGlvbikgeworICAgICAgICBjYXNlIEFBVURJT19ESVJFQ1RJT05fSU5QVVQ6CisgICAgICAgIGNhc2UgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQ6CisgICAgICAgICAgICBicmVhazsgLy8gdmFsaWQKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzOiBkaXJlY3Rpb24gbm90IHZhbGlkID0gJWQiLCBtRGlyZWN0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKKyAgICAgICAgICAgIC8vIGJyZWFrOworICAgIH0KKwogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKQEAgLTg3LDUgKzEwNyw3IEBACiAgICAgQUxPR0QoIkFBdWRpb1N0cmVhbVBhcmFtZXRlcnMgbVNhbXBsZXNQZXJGcmFtZSA9ICVkIiwgbVNhbXBsZXNQZXJGcmFtZSk7CiAgICAgQUxPR0QoIkFBdWRpb1N0cmVhbVBhcmFtZXRlcnMgbVNoYXJpbmdNb2RlICAgICA9ICVkIiwgKGludCltU2hhcmluZ01vZGUpOwogICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzIG1BdWRpb0Zvcm1hdCAgICAgPSAlZCIsIChpbnQpbUF1ZGlvRm9ybWF0KTsKKyAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtUGFyYW1ldGVycyBtRGlyZWN0aW9uICAgICAgID0gJWQiLCBtRGlyZWN0aW9uKTsKICAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtUGFyYW1ldGVycyBtQnVmZmVyQ2FwYWNpdHkgID0gJWQiLCBtQnVmZmVyQ2FwYWNpdHkpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmgKaW5kZXggOTczNzljYy4uNWU2N2M5MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaD4KIAogbmFtZXNwYWNlIGFhdWRpbyB7CiAKQEAgLTc5LDYgKzgwLDI0IEBACiAgICAgICAgIG1CdWZmZXJDYXBhY2l0eSA9IGZyYW1lczsKICAgICB9CiAKKyAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZ2V0RGlyZWN0aW9uKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURpcmVjdGlvbjsKKyAgICB9CisKKyAgICB2b2lkIHNldERpcmVjdGlvbihhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSB7CisgICAgICAgIG1EaXJlY3Rpb24gPSBkaXJlY3Rpb247CisgICAgfQorCisgICAgaW50MzJfdCBjYWxjdWxhdGVCeXRlc1BlckZyYW1lKCkgY29uc3QgeworICAgICAgICByZXR1cm4gZ2V0U2FtcGxlc1BlckZyYW1lKCkgKiBBQXVkaW9Db252ZXJ0X2Zvcm1hdFRvU2l6ZUluQnl0ZXMoZ2V0Rm9ybWF0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgdmFyaWFibGVzIGRlZmluZWQgaW4gb3RoZXIgQUF1ZGlvU3RyZWFtUGFyYW1ldGVycyBpbnN0YW5jZSB0byB0aGlzIG9uZS4KKyAgICAgKiBAcGFyYW0gb3RoZXIKKyAgICAgKi8KKyAgICB2b2lkIGNvcHlGcm9tKGNvbnN0IEFBdWRpb1N0cmVhbVBhcmFtZXRlcnMgJm90aGVyKTsKKwogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHZhbGlkYXRlKCkgY29uc3Q7CiAKICAgICB2b2lkIGR1bXAoKSBjb25zdDsKQEAgLTg5LDkgKzEwOCwxMCBAQAogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VJZCAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90ICAgICAgbVNoYXJpbmdNb2RlICAgICA9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOwogICAgIGFhdWRpb19mb3JtYXRfdCAgICAgICAgICAgIG1BdWRpb0Zvcm1hdCAgICAgPSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOworICAgIGFhdWRpb19kaXJlY3Rpb25fdCAgICAgICAgIG1EaXJlY3Rpb24gICAgICAgPSBBQVVESU9fRElSRUNUSU9OX09VVFBVVDsKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtQnVmZmVyQ2FwYWNpdHkgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogfTsKIAogfSAvKiBuYW1lc3BhY2UgYWF1ZGlvICovCiAKLSNlbmRpZiAvL0FBVURJT19TVFJFQU1fUEFSQU1FVEVSU19IClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorI2VuZGlmIC8vQUFVRElPX1NUUkVBTV9QQVJBTUVURVJTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uY3BwCmluZGV4IDQ4NTljNjkuLjhkY2MzN2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmNwcApAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBMT0dfVEFHICJBQXVkaW8iCisjZGVmaW5lIExPR19UQUcgIkFBdWRpb1N0cmVhbSIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIApAQCAtMjksMTMgKzI5LDI2IEBACiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwogCiBBdWRpb1N0cmVhbTo6QXVkaW9TdHJlYW0oKQotICAgICAgICA6IG1DYWxsYmFja0VuYWJsZWQoZmFsc2UpCisgICAgICAgIDogbVBsYXllckJhc2UobmV3IE15UGxheWVyQmFzZSh0aGlzKSkKIHsKICAgICAvLyBtVGhyZWFkIGlzIGEgcHRocmVhZF90IG9mIHVua25vd24gc2l6ZSBzbyB3ZSBuZWVkIG1lbXNldC4KICAgICBtZW1zZXQoJm1UaHJlYWQsIDAsIHNpemVvZihtVGhyZWFkKSk7CiAgICAgc2V0UGVyaW9kTmFub3NlY29uZHMoMCk7CiB9CiAKK0F1ZGlvU3RyZWFtOjp+QXVkaW9TdHJlYW0oKSB7CisgICAgQUxPR0QoImRlc3Ryb3lpbmcgJXAsIHN0YXRlID0gJXMiLCB0aGlzLCBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KGdldFN0YXRlKCkpKTsKKyAgICAvLyBJZiB0aGUgc3RyZWFtIGlzIGRlbGV0ZWQgd2hlbiBPUEVOIG9yIGluIHVzZSB0aGVuIGF1ZGlvIHJlc291cmNlcyB3aWxsIGxlYWsuCisgICAgLy8gVGhpcyB3b3VsZCBpbmRpY2F0ZSBhbiBpbnRlcm5hbCBlcnJvci4gU28gd2Ugd2FudCB0byBmaW5kIHRoaXMgQVNBUC4KKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCEoZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRAorICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfVU5JTklUSUFMSVpFRAorICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhYXVkaW8gc3RyZWFtIHN0aWxsIGluIHVzZSwgc3RhdGUgPSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KGdldFN0YXRlKCkpKTsKKworICAgIG1QbGF5ZXJCYXNlLT5jbGVhclBhcmVudFJlZmVyZW5jZSgpOyAvLyByZW1vdmUgcmVmZXJlbmNlIHRvIHRoaXMgQXVkaW9TdHJlYW0KK30KKwogc3RhdGljIGNvbnN0IGNoYXIgKkF1ZGlvU3RyZWFtX2NvbnZlcnRTaGFyaW5nTW9kZVRvU2hvcnRUZXh0KGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSkgewogICAgIGNvbnN0IGNoYXIgKnJlc3VsdDsKICAgICBzd2l0Y2ggKHNoYXJpbmdNb2RlKSB7CkBAIC05MCwxNSArMTAzLDEyIEBACiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAotQXVkaW9TdHJlYW06On5BdWRpb1N0cmVhbSgpIHsKLSAgICBjbG9zZSgpOwotfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OndhaXRGb3JTdGF0ZUNoYW5nZShhYXVkaW9fc3RyZWFtX3N0YXRlX3QgY3VycmVudFN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90ICpuZXh0U3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVvdXROYW5vc2Vjb25kcykKIHsKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gdXBkYXRlU3RhdGVXaGlsZVdhaXRpbmcoKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gdXBkYXRlU3RhdGVNYWNoaW5lKCk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CkBAIC0xMTIsNyArMTIyLDcgQEAKICAgICAgICAgQXVkaW9DbG9jazo6c2xlZXBGb3JOYW5vcyhkdXJhdGlvbk5hbm9zKTsKICAgICAgICAgdGltZW91dE5hbm9zZWNvbmRzIC09IGR1cmF0aW9uTmFub3M7CiAKLSAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHVwZGF0ZVN0YXRlV2hpbGVXYWl0aW5nKCk7CisgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSB1cGRhdGVTdGF0ZU1hY2hpbmUoKTsKICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgIH0KQEAgLTE1Myw2ICsxNjMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHRocmVhZEFyZykKIHsKICAgICBpZiAobUhhc1RocmVhZCkgeworICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW06OmNyZWF0ZVRocmVhZCgpIC0gbUhhc1RocmVhZCBhbHJlYWR5IHRydWUiKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KICAgICBpZiAodGhyZWFkUHJvYyA9PSBudWxscHRyKSB7CkBAIC0xNzQsNiArMTg1LDcgQEAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6am9pblRocmVhZCh2b2lkKiogcmV0dXJuQXJnLCBpbnQ2NF90IHRpbWVvdXROYW5vc2Vjb25kcykKIHsKICAgICBpZiAoIW1IYXNUaHJlYWQpIHsKKyAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtOjpqb2luVGhyZWFkKCkgLSBidXQgaGFzIG5vIHRocmVhZCIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogI2lmIDAKQEAgLTE4NywzICsxOTksMzggQEAKICAgICByZXR1cm4gZXJyID8gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoLWVycm5vKSA6IG1UaHJlYWRSZWdpc3RyYXRpb25SZXN1bHQ7CiB9CiAKKworI2lmIEFBVURJT19VU0VfVk9MVU1FX1NIQVBFUgorYW5kcm9pZDo6bWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzIEF1ZGlvU3RyZWFtOjphcHBseVZvbHVtZVNoYXBlcigKKyAgICAgICAgY29uc3QgYW5kcm9pZDo6bWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbiBfX3VudXNlZCwKKyAgICAgICAgY29uc3QgYW5kcm9pZDo6bWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uJiBvcGVyYXRpb24gX191bnVzZWQpIHsKKyAgICBBTE9HVygiYXBwbHlWb2x1bWVTaGFwZXIoKSBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgcmV0dXJuIGFuZHJvaWQ6Om1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXR1czo6b2soKTsKK30KKyNlbmRpZgorCitBdWRpb1N0cmVhbTo6TXlQbGF5ZXJCYXNlOjpNeVBsYXllckJhc2UoQXVkaW9TdHJlYW0gKnBhcmVudCkgOiBtUGFyZW50KHBhcmVudCkgeworfQorCitBdWRpb1N0cmVhbTo6TXlQbGF5ZXJCYXNlOjp+TXlQbGF5ZXJCYXNlKCkgeworICAgIEFMT0dWKCJNeVBsYXllckJhc2U6On5NeVBsYXllckJhc2UoJXApIGRlbGV0ZWQiLCB0aGlzKTsKK30KKwordm9pZCBBdWRpb1N0cmVhbTo6TXlQbGF5ZXJCYXNlOjpyZWdpc3RlcldpdGhBdWRpb01hbmFnZXIoKSB7CisgICAgaWYgKCFtUmVnaXN0ZXJlZCkgeworICAgICAgICBpbml0KGFuZHJvaWQ6OlBMQVlFUl9UWVBFX0FBVURJTywgQVVESU9fVVNBR0VfTUVESUEpOworICAgICAgICBtUmVnaXN0ZXJlZCA9IHRydWU7CisgICAgfQorfQorCit2b2lkIEF1ZGlvU3RyZWFtOjpNeVBsYXllckJhc2U6OnVucmVnaXN0ZXJXaXRoQXVkaW9NYW5hZ2VyKCkgeworICAgIGlmIChtUmVnaXN0ZXJlZCkgeworICAgICAgICBiYXNlRGVzdHJveSgpOworICAgICAgICBtUmVnaXN0ZXJlZCA9IGZhbHNlOworICAgIH0KK30KKworCit2b2lkIEF1ZGlvU3RyZWFtOjpNeVBsYXllckJhc2U6OmRlc3Ryb3koKSB7CisgICAgdW5yZWdpc3RlcldpdGhBdWRpb01hbmFnZXIoKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmgKaW5kZXggZTVmZGNjNi4uMzQyMDJkMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmgKQEAgLTIxLDEwICsyMSwxOCBAQAogI2luY2x1ZGUgPG11dGV4PgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL1N0YXR1cy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KIAorI2luY2x1ZGUgIm1lZGlhL1ZvbHVtZVNoYXBlci5oIgorI2luY2x1ZGUgIm1lZGlhL1BsYXllckJhc2UuaCIKICNpbmNsdWRlICJ1dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oIgogI2luY2x1ZGUgInV0aWxpdHkvTW9ub3RvbmljQ291bnRlci5oIgogCisvLyBDYW5ub3QgZ2V0IGFuZHJvaWQ6Om1lZGlhOjpWb2x1bWVTaGFwZXIgdG8gY29tcGlsZSEKKyNkZWZpbmUgQUFVRElPX1VTRV9WT0xVTUVfU0hBUEVSICAwCisKIG5hbWVzcGFjZSBhYXVkaW8gewogCiB0eXBlZGVmIHZvaWQgKigqYWF1ZGlvX2F1ZGlvX3RocmVhZF9wcm9jX3QpKHZvaWQgKik7CkBAIC02OCwxMCArNzYsMTAgQEAKIAogCiAgICAgLyoqCi0gICAgICogVXBkYXRlIHN0YXRlIHdoaWxlIGluIHRoZSBtaWRkbGUgb2Ygd2FpdEZvclN0YXRlQ2hhbmdlKCkKKyAgICAgKiBVcGRhdGUgc3RhdGUgbWFjaGluZS4oKQogICAgICAqIEByZXR1cm4KICAgICAgKi8KLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCB1cGRhdGVTdGF0ZVdoaWxlV2FpdGluZygpID0gMDsKKyAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCB1cGRhdGVTdGF0ZU1hY2hpbmUoKSA9IDA7CiAKIAogICAgIC8vID09PT09PT09PT09IEVuZCBBQlNUUkFDVCBtZXRob2RzID09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMjM0LDggKzI0MiwxMzIgQEAKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTklNUExFTUVOVEVEOwogICAgIH0KIAorICAgIC8vIFRoaXMgaXMgdXNlZCBieSB0aGUgQXVkaW9NYW5hZ2VyIHRvIGR1Y2sgYW5kIG11dGUgdGhlIHN0cmVhbSB3aGVuIGNoYW5naW5nIGF1ZGlvIGZvY3VzLgorICAgIHZvaWQgc2V0RHVja0FuZE11dGVWb2x1bWUoZmxvYXQgZHVja0FuZE11dGVWb2x1bWUpIHsKKyAgICAgICAgbUR1Y2tBbmRNdXRlVm9sdW1lID0gZHVja0FuZE11dGVWb2x1bWU7CisgICAgICAgIGRvU2V0Vm9sdW1lKCk7IC8vIGFwcGx5IHRoaXMgY2hhbmdlCisgICAgfQorCisgICAgZmxvYXQgZ2V0RHVja0FuZE11dGVWb2x1bWUoKSB7CisgICAgICAgIHJldHVybiBtRHVja0FuZE11dGVWb2x1bWU7CisgICAgfQorCisgICAgLy8gSW1wbGVtZW50IHRoaXMgaW4gdGhlIG91dHB1dCBzdWJjbGFzc2VzLgorICAgIHZpcnR1YWwgYW5kcm9pZDo6c3RhdHVzX3QgZG9TZXRWb2x1bWUoKSB7IHJldHVybiBhbmRyb2lkOjpOT19FUlJPUjsgfQorCisjaWYgQUFVRElPX1VTRV9WT0xVTUVfU0hBUEVSCisgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAorICAgICAgICAgICAgY29uc3QgOjphbmRyb2lkOjptZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uIF9fdW51c2VkLAorICAgICAgICAgICAgY29uc3QgOjphbmRyb2lkOjptZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24mIG9wZXJhdGlvbiBfX3VudXNlZCk7CisjZW5kaWYKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIHRoaXMgc3RyZWFtJ3MgUGxheWVyQmFzZSB3aXRoIHRoZSBBdWRpb01hbmFnZXIgaWYgbmVlZGVkLgorICAgICAqIE9ubHkgcmVnaXN0ZXIgb3V0cHV0IHN0cmVhbXMuCisgICAgICogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgZm9yIGNsaWVudCBzdHJlYW1zIGFuZCBub3QgZm9yIHN0cmVhbXMKKyAgICAgKiB0aGF0IHJ1biBpbiB0aGUgc2VydmljZS4KKyAgICAgKi8KKyAgICB2b2lkIHJlZ2lzdGVyUGxheWVyQmFzZSgpIHsKKyAgICAgICAgaWYgKGdldERpcmVjdGlvbigpID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKSB7CisgICAgICAgICAgICBtUGxheWVyQmFzZS0+cmVnaXN0ZXJXaXRoQXVkaW9NYW5hZ2VyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbnJlZ2lzdGVyIHRoaXMgc3RyZWFtJ3MgUGxheWVyQmFzZSB3aXRoIHRoZSBBdWRpb01hbmFnZXIuCisgICAgICogVGhpcyB3aWxsIG9ubHkgdW5yZWdpc3RlciBpZiBhbHJlYWR5IHJlZ2lzdGVyZWQuCisgICAgICovCisgICAgdm9pZCB1bnJlZ2lzdGVyUGxheWVyQmFzZSgpIHsKKyAgICAgICAgbVBsYXllckJhc2UtPnVucmVnaXN0ZXJXaXRoQXVkaW9NYW5hZ2VyKCk7CisgICAgfQorCisgICAgLy8gUGFzcyBzdGFydCByZXF1ZXN0IHRocm91Z2ggUGxheWVyQmFzZSBmb3IgdHJhY2tpbmcuCisgICAgYWF1ZGlvX3Jlc3VsdF90IHN5c3RlbVN0YXJ0KCkgeworICAgICAgICBtUGxheWVyQmFzZS0+c3RhcnQoKTsKKyAgICAgICAgLy8gUGFzcyBhYXVkaW9fcmVzdWx0X3QgYXJvdW5kIHRoZSBQbGF5ZXJCYXNlIGludGVyZmFjZSwgd2hpY2ggdXNlcyBzdGF0dXNfX3QuCisgICAgICAgIHJldHVybiBtUGxheWVyQmFzZS0+Z2V0UmVzdWx0KCk7CisgICAgfQorCisgICAgYWF1ZGlvX3Jlc3VsdF90IHN5c3RlbVBhdXNlKCkgeworICAgICAgICBtUGxheWVyQmFzZS0+cGF1c2UoKTsKKyAgICAgICAgcmV0dXJuIG1QbGF5ZXJCYXNlLT5nZXRSZXN1bHQoKTsKKyAgICB9CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3lzdGVtU3RvcCgpIHsKKyAgICAgICAgbVBsYXllckJhc2UtPnN0b3AoKTsKKyAgICAgICAgcmV0dXJuIG1QbGF5ZXJCYXNlLT5nZXRSZXN1bHQoKTsKKyAgICB9CisKIHByb3RlY3RlZDoKIAorICAgIC8vIFBsYXllckJhc2UgYWxsb3dzIHRoZSBzeXN0ZW0gdG8gY29udHJvbCB0aGUgc3RyZWFtLgorICAgIC8vIENhbGxpbmcgdGhyb3VnaCBQbGF5ZXJCYXNlLT5zdGFydCgpIG5vdGlmaWVzIHRoZSBBdWRpb01hbmFnZXIgb2YgdGhlIHBsYXllciBzdGF0ZS4KKyAgICAvLyBUaGUgQXVkaW9NYW5hZ2VyIGFsc28gY2FuIHN0YXJ0L3N0b3AgYSBzdHJlYW0gYnkgY2FsbGluZyBtUGxheWVyQmFzZS0+cGxheWVyU3RhcnQoKS4KKyAgICAvLyBzeXN0ZW1TdGFydCgpID09PiBtUGxheWVyQmFzZS0+c3RhcnQoKSAgIG1QbGF5ZXJCYXNlLT5wbGF5ZXJTdGFydCgpID09PiByZXF1ZXN0U3RhcnQoKQorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgXCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8KKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0gQXVkaW9NYW5hZ2VyIC0tLS0tLS0KKyAgICBjbGFzcyBNeVBsYXllckJhc2UgOiBwdWJsaWMgYW5kcm9pZDo6UGxheWVyQmFzZSB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBNeVBsYXllckJhc2UoQXVkaW9TdHJlYW0gKnBhcmVudCk7CisKKyAgICAgICAgdmlydHVhbCB+TXlQbGF5ZXJCYXNlKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlZ2lzdGVyIGZvciB2b2x1bWUgY2hhbmdlcyBhbmQgcmVtb3RlIGNvbnRyb2wuCisgICAgICAgICAqLworICAgICAgICB2b2lkIHJlZ2lzdGVyV2l0aEF1ZGlvTWFuYWdlcigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBVblJlZ2lzdGVyLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCB1bnJlZ2lzdGVyV2l0aEF1ZGlvTWFuYWdlcigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBKdXN0IGNhbGxzIHVucmVnaXN0ZXJXaXRoQXVkaW9NYW5hZ2VyKCkuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGRlc3Ryb3koKSBvdmVycmlkZTsKKworICAgICAgICB2b2lkIGNsZWFyUGFyZW50UmVmZXJlbmNlKCkgeyBtUGFyZW50ID0gbnVsbHB0cjsgfQorCisgICAgICAgIGFuZHJvaWQ6OnN0YXR1c190IHBsYXllclN0YXJ0KCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgLy8gbVBhcmVudCBzaG91bGQgTk9UIGJlIG51bGwuIFNvIGdvIGFoZWFkIGFuZCBjcmFzaCBpZiBpdCBpcy4KKyAgICAgICAgICAgIG1SZXN1bHQgPSBtUGFyZW50LT5yZXF1ZXN0U3RhcnQoKTsKKyAgICAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyhtUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIGFuZHJvaWQ6OnN0YXR1c190IHBsYXllclBhdXNlKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgbVJlc3VsdCA9IG1QYXJlbnQtPnJlcXVlc3RQYXVzZSgpOworICAgICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKG1SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgYW5kcm9pZDo6c3RhdHVzX3QgcGxheWVyU3RvcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIG1SZXN1bHQgPSBtUGFyZW50LT5yZXF1ZXN0U3RvcCgpOworICAgICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKG1SZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgYW5kcm9pZDo6c3RhdHVzX3QgcGxheWVyU2V0Vm9sdW1lKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgLy8gTm8gcGFuIGFuZCBvbmx5IGxlZnQgdm9sdW1lIGlzIHRha2VuIGludG8gYWNjb3VudCBmcm9tIElQTGF5ZXIgaW50ZXJmYWNlCisgICAgICAgICAgICBtUGFyZW50LT5zZXREdWNrQW5kTXV0ZVZvbHVtZShtVm9sdW1lTXVsdGlwbGllckwgIC8qICogbVBhbk11bHRpcGxpZXJMICovKTsKKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpOT19FUlJPUjsKKyAgICAgICAgfQorCisjaWYgQUFVRElPX1VTRV9WT0xVTUVfU0hBUEVSCisgICAgICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgYXBwbHlWb2x1bWVTaGFwZXIoCisgICAgICAgICAgICAgICAgY29uc3QgOjphbmRyb2lkOjptZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6bWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uJiBvcGVyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBtUGFyZW50LT5hcHBseVZvbHVtZVNoYXBlcihjb25maWd1cmF0aW9uLCBvcGVyYXRpb24pOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0UmVzdWx0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1SZXN1bHQ7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIEF1ZGlvU3RyZWFtICAgICAgICAgICptUGFyZW50OworICAgICAgICBhYXVkaW9fcmVzdWx0X3QgICAgICAgbVJlc3VsdCA9IEFBVURJT19PSzsKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgIG1SZWdpc3RlcmVkID0gZmFsc2U7CisgICAgfTsKIAogICAgIC8qKgogICAgICAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgpAQCAtMjc1LDcgKzQwNyw5IEBACiAKICAgICBzdGQ6Om11dGV4ICAgICAgICAgICBtU3RyZWFtTXV0ZXg7CiAKLSAgICBzdGQ6OmF0b21pYzxib29sPiAgICBtQ2FsbGJhY2tFbmFibGVkOworICAgIHN0ZDo6YXRvbWljPGJvb2w+ICAgIG1DYWxsYmFja0VuYWJsZWR7ZmFsc2V9OworCisgICAgZmxvYXQgICAgICAgICAgICAgICAgbUR1Y2tBbmRNdXRlVm9sdW1lID0gMS4wZjsKIAogcHJvdGVjdGVkOgogCkBAIC0yODgsNiArNDIyLDggQEAKICAgICB9CiAKIHByaXZhdGU6CisgICAgY29uc3QgYW5kcm9pZDo6c3A8TXlQbGF5ZXJCYXNlPiAgIG1QbGF5ZXJCYXNlOworCiAgICAgLy8gVGhlc2UgZG8gbm90IGNoYW5nZSBhZnRlciBvcGVuKCkuCiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICBtU2FtcGxlc1BlckZyYW1lID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGludDMyX3QgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuY3BwCmluZGV4IDQzYTFlZjEuLjA5ZWJiM2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuY3BwCkBAIC0xODQsMTYgKzE4NCw2IEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCi0gICAgc3dpdGNoIChtRGlyZWN0aW9uKSB7Ci0gICAgICAgIGNhc2UgQUFVRElPX0RJUkVDVElPTl9JTlBVVDoKLSAgICAgICAgY2FzZSBBQVVESU9fRElSRUNUSU9OX09VVFBVVDoKLSAgICAgICAgICAgIGJyZWFrOyAvLyB2YWxpZAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtQnVpbGRlcjogZGlyZWN0aW9uIG5vdCB2YWxpZCA9ICVkIiwgbURpcmVjdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQ7Ci0gICAgICAgICAgICAvLyBicmVhazsKLSAgICB9Ci0KICAgICBzd2l0Y2ggKG1QZXJmb3JtYW5jZU1vZGUpIHsKICAgICAgICAgY2FzZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FOgogICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX1BPV0VSX1NBVklORzoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuaAppbmRleCA2ZTU0OGIxLi5hNDNjZmE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5oCkBAIC0zNSwxNSArMzUsNiBAQAogCiAgICAgfkF1ZGlvU3RyZWFtQnVpbGRlcigpOwogCi0gICAgYWF1ZGlvX2RpcmVjdGlvbl90IGdldERpcmVjdGlvbigpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1EaXJlY3Rpb247Ci0gICAgfQotCi0gICAgQXVkaW9TdHJlYW1CdWlsZGVyKiBzZXREaXJlY3Rpb24oYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgewotICAgICAgICBtRGlyZWN0aW9uID0gZGlyZWN0aW9uOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KICAgICBib29sIGlzU2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbVNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZDsKICAgICB9CkBAIC0xMTMsNyArMTA0LDYgQEAKIAogcHJpdmF0ZToKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICBtU2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkID0gZmFsc2U7IC8vIG11c3QgbWF0Y2ggc2hhcmluZyBtb2RlIHJlcXVlc3RlZAotICAgIGFhdWRpb19kaXJlY3Rpb25fdCAgICAgICAgIG1EaXJlY3Rpb24gPSBBQVVESU9fRElSRUNUSU9OX09VVFBVVDsKICAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90ICBtUGVyZm9ybWFuY2VNb2RlID0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORTsKIAogICAgIEFBdWRpb1N0cmVhbV9kYXRhQ2FsbGJhY2sgIG1EYXRhQ2FsbGJhY2tQcm9jID0gbnVsbHB0cjsgIC8vIGV4dGVybmFsIGNhbGxiYWNrIGZ1bmN0aW9ucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuY3BwCmluZGV4IDhkMmM2MmQuLmE4Njk4ODYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5jcHAKQEAgLTIxMCwzICsyMTAsOSBAQAogICAgIHJldHVybiBtRmlmby0+Z2V0Q2FwYWNpdHkoKTsKIH0KIAordm9pZCBGaWZvQnVmZmVyOjplcmFzZU1lbW9yeSgpIHsKKyAgICBpbnQzMl90IG51bUJ5dGVzID0gY29udmVydEZyYW1lc1RvQnl0ZXMoZ2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcygpKTsKKyAgICBpZiAobnVtQnl0ZXMgPiAwKSB7CisgICAgICAgIG1lbXNldChtU3RvcmFnZSwgMCwgKHNpemVfdCkgbnVtQnl0ZXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5oCmluZGV4IGE5NGU5YjAuLmY1YTllMjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuaApAQCAtMTExLDYgKzExMSwxMSBAQAogICAgICAgICBtRmlmby0+c2V0V3JpdGVDb3VudGVyKG4pOwogICAgIH0KIAorICAgIC8qCisgICAgICogVGhpcyBpcyBnZW5lcmFsbHkgb25seSBjYWxsZWQgYmVmb3JlIG9yIGFmdGVyIHRoZSBidWZmZXIgaXMgdXNlZC4KKyAgICAgKi8KKyAgICB2b2lkIGVyYXNlTWVtb3J5KCk7CisKIHByaXZhdGU6CiAKICAgICB2b2lkIGZpbGxXcmFwcGluZ0J1ZmZlcihXcmFwcGluZ0J1ZmZlciAqd3JhcHBpbmdCdWZmZXIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAKaW5kZXggZGQ1ZTNjMC4uZWUyNTA0ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmNwcApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVGltZXN0YW1wLmg+CiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogCiAjaW5jbHVkZSAiY29yZS9BdWRpb1N0cmVhbS5oIgpAQCAtMzAsNyArMzEsOCBAQAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKIAogQXVkaW9TdHJlYW1MZWdhY3k6OkF1ZGlvU3RyZWFtTGVnYWN5KCkKLSAgICAgICAgOiBBdWRpb1N0cmVhbSgpLCBtRGV2aWNlQ2FsbGJhY2sobmV3IFN0cmVhbURldmljZUNhbGxiYWNrKHRoaXMpKSB7CisgICAgICAgIDogQXVkaW9TdHJlYW0oKQorICAgICAgICAsIG1EZXZpY2VDYWxsYmFjayhuZXcgU3RyZWFtRGV2aWNlQ2FsbGJhY2sodGhpcykpIHsKIH0KIAogQXVkaW9TdHJlYW1MZWdhY3k6On5BdWRpb1N0cmVhbUxlZ2FjeSgpIHsKQEAgLTQ2LDMzICs0OCw1MSBAQAogICAgIHJldHVybiBBdWRpb1N0cmVhbUxlZ2FjeV9jYWxsYmFjazsKIH0KIAotLy8gSW1wbGVtZW50IEZpeGVkQmxvY2tQcm9jZXNzb3IKLWludDMyX3QgQXVkaW9TdHJlYW1MZWdhY3k6Om9uUHJvY2Vzc0ZpeGVkQmxvY2sodWludDhfdCAqYnVmZmVyLCBpbnQzMl90IG51bUJ5dGVzKSB7Ci0gICAgaW50MzJfdCBmcmFtZUNvdW50ID0gbnVtQnl0ZXMgLyBnZXRCeXRlc1BlckZyYW1lKCk7CitpbnQzMl90IEF1ZGlvU3RyZWFtTGVnYWN5OjpjYWxsRGF0YUNhbGxiYWNrRnJhbWVzKHVpbnQ4X3QgKmJ1ZmZlciwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBpZiAoZ2V0RGlyZWN0aW9uKCkgPT0gQUFVRElPX0RJUkVDVElPTl9JTlBVVCkgeworICAgICAgICAvLyBJbmNyZW1lbnQgYmVmb3JlIGJlY2F1c2Ugd2UgYWxyZWFkeSBnb3QgdGhlIGRhdGEgZnJvbSB0aGUgZGV2aWNlLgorICAgICAgICBpbmNyZW1lbnRGcmFtZXNSZWFkKG51bUZyYW1lcyk7CisgICAgfQorCiAgICAgLy8gQ2FsbCB1c2luZyB0aGUgQUF1ZGlvIGNhbGxiYWNrIGludGVyZmFjZS4KICAgICBBQXVkaW9TdHJlYW1fZGF0YUNhbGxiYWNrIGFwcENhbGxiYWNrID0gZ2V0RGF0YUNhbGxiYWNrUHJvYygpOwotICAgIHJldHVybiAoKmFwcENhbGxiYWNrKSgKKyAgICBhYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBjYWxsYmFja1Jlc3VsdCA9ICgqYXBwQ2FsbGJhY2spKAogICAgICAgICAgICAgKEFBdWRpb1N0cmVhbSAqKSB0aGlzLAogICAgICAgICAgICAgZ2V0RGF0YUNhbGxiYWNrVXNlckRhdGEoKSwKICAgICAgICAgICAgIGJ1ZmZlciwKLSAgICAgICAgICAgIGZyYW1lQ291bnQpOworICAgICAgICAgICAgbnVtRnJhbWVzKTsKKworICAgIGlmIChjYWxsYmFja1Jlc3VsdCA9PSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX0NPTlRJTlVFCisgICAgICAgICAgICAmJiBnZXREaXJlY3Rpb24oKSA9PSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCkgeworICAgICAgICAvLyBJbmNyZW1lbnQgYWZ0ZXIgYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gd3JpdGUgdGhlIGRhdGEgdG8gdGhlIGRldmljZS4KKyAgICAgICAgaW5jcmVtZW50RnJhbWVzV3JpdHRlbihudW1GcmFtZXMpOworICAgIH0KKyAgICByZXR1cm4gY2FsbGJhY2tSZXN1bHQ7Cit9CisKKy8vIEltcGxlbWVudCBGaXhlZEJsb2NrUHJvY2Vzc29yCitpbnQzMl90IEF1ZGlvU3RyZWFtTGVnYWN5OjpvblByb2Nlc3NGaXhlZEJsb2NrKHVpbnQ4X3QgKmJ1ZmZlciwgaW50MzJfdCBudW1CeXRlcykgeworICAgIGludDMyX3QgbnVtRnJhbWVzID0gbnVtQnl0ZXMgLyBnZXRCeXRlc1BlckZyYW1lKCk7CisgICAgcmV0dXJuIGNhbGxEYXRhQ2FsbGJhY2tGcmFtZXMoYnVmZmVyLCBudW1GcmFtZXMpOwogfQogCiB2b2lkIEF1ZGlvU3RyZWFtTGVnYWN5Ojpwcm9jZXNzQ2FsbGJhY2tDb21tb24oYWF1ZGlvX2NhbGxiYWNrX29wZXJhdGlvbl90IG9wY29kZSwgdm9pZCAqaW5mbykgewogICAgIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IGNhbGxiYWNrUmVzdWx0OwogCi0gICAgaWYgKCFtQ2FsbGJhY2tFbmFibGVkLmxvYWQoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCiAgICAgc3dpdGNoIChvcGNvZGUpIHsKICAgICAgICAgY2FzZSBBQVVESU9fQ0FMTEJBQ0tfT1BFUkFUSU9OX1BST0NFU1NfREFUQTogewotICAgICAgICAgICAgaWYgKGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBjb2RlIGFzc3VtZXMgYW4gQXVkaW9UcmFjazo6QnVmZmVyIGlzIHRoZSBzYW1lIGFzCi0gICAgICAgICAgICAgICAgLy8gQXVkaW9SZWNvcmQ6OkJ1ZmZlcgotICAgICAgICAgICAgICAgIC8vIFRPRE8gZGVmaW5lIG91ciBvd24gQXVkaW9CdWZmZXIgYW5kIHBhc3MgaXQgZnJvbSB0aGUgc3ViY2xhc3Nlcy4KLSAgICAgICAgICAgICAgICBBdWRpb1RyYWNrOjpCdWZmZXIgKmF1ZGlvQnVmZmVyID0gc3RhdGljX2Nhc3Q8QXVkaW9UcmFjazo6QnVmZmVyICo+KGluZm8pOwotICAgICAgICAgICAgICAgIGlmIChhdWRpb0J1ZmZlci0+ZnJhbWVDb3VudCA9PSAwKSByZXR1cm47CisgICAgICAgICAgICBjaGVja0ZvckRpc2Nvbm5lY3RSZXF1ZXN0KCk7CisKKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGNvZGUgYXNzdW1lcyBhbiBBdWRpb1RyYWNrOjpCdWZmZXIgaXMgdGhlIHNhbWUgYXMKKyAgICAgICAgICAgIC8vIEF1ZGlvUmVjb3JkOjpCdWZmZXIKKyAgICAgICAgICAgIC8vIFRPRE8gZGVmaW5lIG91ciBvd24gQXVkaW9CdWZmZXIgYW5kIHBhc3MgaXQgZnJvbSB0aGUgc3ViY2xhc3Nlcy4KKyAgICAgICAgICAgIEF1ZGlvVHJhY2s6OkJ1ZmZlciAqYXVkaW9CdWZmZXIgPSBzdGF0aWNfY2FzdDxBdWRpb1RyYWNrOjpCdWZmZXIgKj4oaW5mbyk7CisgICAgICAgICAgICBpZiAoZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCB8fCAhbUNhbGxiYWNrRW5hYmxlZC5sb2FkKCkpIHsKKyAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IDA7IC8vIHNpbGVuY2UgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoYXVkaW9CdWZmZXItPmZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNhbGxlciBzcGVjaWZpZWQgYW4gZXhhY3Qgc2l6ZSB0aGVuIHVzZSBhIGJsb2NrIHNpemUgYWRhcHRlci4KICAgICAgICAgICAgICAgICBpZiAobUJsb2NrQWRhcHRlciAhPSBudWxscHRyKSB7CkBAIC04MSw0NCArMTAxLDU5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKikgYXVkaW9CdWZmZXItPnJhdywgYnl0ZUNvdW50KTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvLyBDYWxsIHVzaW5nIHRoZSBBQXVkaW8gY2FsbGJhY2sgaW50ZXJmYWNlLgotICAgICAgICAgICAgICAgICAgICBjYWxsYmFja1Jlc3VsdCA9ICgqZ2V0RGF0YUNhbGxiYWNrUHJvYygpKSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUF1ZGlvU3RyZWFtICopIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGF0YUNhbGxiYWNrVXNlckRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+cmF3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tSZXN1bHQgPSBjYWxsRGF0YUNhbGxiYWNrRnJhbWVzKCh1aW50OF90ICopYXVkaW9CdWZmZXItPnJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrUmVzdWx0ID09IEFBVURJT19DQUxMQkFDS19SRVNVTFRfQ09OVElOVUUpIHsKICAgICAgICAgICAgICAgICAgICAgYXVkaW9CdWZmZXItPnNpemUgPSBhdWRpb0J1ZmZlci0+ZnJhbWVDb3VudCAqIGdldEJ5dGVzUGVyRnJhbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50Q2xpZW50RnJhbWVDb3VudGVyKGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50KTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IDA7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyBGQUxMIFRIUk9VR0gKIAotICAgICAgICAgICAgLy8gU3RyZWFtIGdvdCByZXJvdXRlZCBzbyB3ZSBkaXNjb25uZWN0LgotICAgICAgICBjYXNlIEFBVURJT19DQUxMQkFDS19PUEVSQVRJT05fRElTQ09OTkVDVEVEOiB7Ci0gICAgICAgICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCk7Ci0gICAgICAgICAgICBBTE9HRCgicHJvY2Vzc0NhbGxiYWNrQ29tbW9uKCkgc3RyZWFtIGRpc2Nvbm5lY3RlZCIpOwotICAgICAgICAgICAgaWYgKGdldEVycm9yQ2FsbGJhY2tQcm9jKCkgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICgqZ2V0RXJyb3JDYWxsYmFja1Byb2MoKSkoCi0gICAgICAgICAgICAgICAgICAgICAgICAoQUF1ZGlvU3RyZWFtICopIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRFcnJvckNhbGxiYWNrVXNlckRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQKLSAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZVN0YXRlTWFjaGluZSgpICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgICAgICAgICBmb3JjZURpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7CiAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgIC8vIFN0cmVhbSBnb3QgcmVyb3V0ZWQgc28gd2UgZGlzY29ubmVjdC4KKyAgICAgICAgY2FzZSBBQVVESU9fQ0FMTEJBQ0tfT1BFUkFUSU9OX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgIEFMT0dEKCJwcm9jZXNzQ2FsbGJhY2tDb21tb24oKSBzdHJlYW0gZGlzY29ubmVjdGVkIik7CisgICAgICAgICAgICBmb3JjZURpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIH0KIAorCisKK3ZvaWQgQXVkaW9TdHJlYW1MZWdhY3k6OmNoZWNrRm9yRGlzY29ubmVjdFJlcXVlc3QoKSB7CisgICAgaWYgKG1SZXF1ZXN0RGlzY29ubmVjdC5pc1JlcXVlc3RlZCgpKSB7CisgICAgICAgIEFMT0dEKCJjaGVja0ZvckRpc2Nvbm5lY3RSZXF1ZXN0KCkgbVJlcXVlc3REaXNjb25uZWN0IGFja25vd2xlZGdlZCIpOworICAgICAgICBmb3JjZURpc2Nvbm5lY3QoKTsKKyAgICAgICAgbVJlcXVlc3REaXNjb25uZWN0LmFja25vd2xlZGdlKCk7CisgICAgICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOworICAgIH0KK30KKwordm9pZCBBdWRpb1N0cmVhbUxlZ2FjeTo6Zm9yY2VEaXNjb25uZWN0KCkgeworICAgIGlmIChnZXRTdGF0ZSgpICE9IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKSB7CisgICAgICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKTsKKyAgICAgICAgaWYgKGdldEVycm9yQ2FsbGJhY2tQcm9jKCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgKCpnZXRFcnJvckNhbGxiYWNrUHJvYygpKSgKKyAgICAgICAgICAgICAgICAgICAgKEFBdWRpb1N0cmVhbSAqKSB0aGlzLAorICAgICAgICAgICAgICAgICAgICBnZXRFcnJvckNhbGxiYWNrVXNlckRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRAorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KK30KKwogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtTGVnYWN5OjpnZXRCZXN0VGltZXN0YW1wKGNsb2NraWRfdCBjbG9ja0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqZnJhbWVQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vc2Vjb25kcywKQEAgLTEzNiw4ICsxNzEsMjMgQEAKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBleHRlbmRlZFRpbWVzdGFtcC0+Z2V0QmVzdFRpbWVzdGFtcChmcmFtZVBvc2l0aW9uLCB0aW1lTmFub3NlY29uZHMsIHRpbWViYXNlKTsKLSAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzKTsKKyAgICBFeHRlbmRlZFRpbWVzdGFtcDo6TG9jYXRpb24gbG9jYXRpb24gPSBFeHRlbmRlZFRpbWVzdGFtcDo6TG9jYXRpb246OkxPQ0FUSU9OX0lOVkFMSUQ7CisgICAgaW50NjRfdCBsb2NhbFBvc2l0aW9uOworICAgIHN0YXR1c190IHN0YXR1cyA9IGV4dGVuZGVkVGltZXN0YW1wLT5nZXRCZXN0VGltZXN0YW1wKCZsb2NhbFBvc2l0aW9uLCB0aW1lTmFub3NlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZWJhc2UsICZsb2NhdGlvbik7CisgICAgLy8gdXNlIE1vbm90b25pY0NvdW50ZXIgdG8gcHJldmVudCByZXRyb2dyYWRlIG1vdGlvbi4KKyAgICBtVGltZXN0YW1wUG9zaXRpb24udXBkYXRlMzIoKGludDMyX3QpbG9jYWxQb3NpdGlvbik7CisgICAgKmZyYW1lUG9zaXRpb24gPSBtVGltZXN0YW1wUG9zaXRpb24uZ2V0KCk7CisKKy8vICAgIEFMT0dEKCJnZXRCZXN0VGltZXN0YW1wKCkgZnBvc2l0aW9uOiBzZXJ2ZXIgPSAlNmxsZCwga2VybmVsID0gJTZsbGQsIGxvY2F0aW9uID0gJWQiLAorLy8gICAgICAgICAgKGxvbmcgbG9uZykgZXh0ZW5kZWRUaW1lc3RhbXAtPm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TG9jYXRpb246OkxPQ0FUSU9OX1NFUlZFUl0sCisvLyAgICAgICAgICAobG9uZyBsb25nKSBleHRlbmRlZFRpbWVzdGFtcC0+bVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMb2NhdGlvbjo6TE9DQVRJT05fS0VSTkVMXSwKKy8vICAgICAgICAgIChpbnQpbG9jYXRpb24pOworICAgIGlmIChzdGF0dXMgPT0gV09VTERfQkxPQ0spIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChzdGF0dXMpOworICAgIH0KIH0KIAogdm9pZCBBdWRpb1N0cmVhbUxlZ2FjeTo6b25BdWRpb0RldmljZVVwZGF0ZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKQpAQCAtMTQ1LDE1ICsxOTUsMTggQEAKICAgICBBTE9HRCgib25BdWRpb0RldmljZVVwZGF0ZSgpIGRldmljZUlkICVkIiwgKGludClkZXZpY2VJZCk7CiAgICAgaWYgKGdldERldmljZUlkKCkgIT0gQUFVRElPX1VOU1BFQ0lGSUVEICYmIGdldERldmljZUlkKCkgIT0gZGV2aWNlSWQgJiYKICAgICAgICAgICAgIGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpIHsKLSAgICAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpOwotICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgZGF0YSBjYWxsYmFjayBhbmQgdGhlIHN0cmVhbSBpcyBhY3RpdmUsIHNlbmQgdGhlIGVycm9yIGNhbGxiYWNrIGZyb20KLSAgICAgICAgLy8gZGF0YSBjYWxsYmFjayB0aHJlYWQgd2hlbiBpdCBzZWVzIHRoZSBESVNDT05ORUNURUQgc3RhdGUKLSAgICAgICAgaWYgKCFpc0RhdGFDYWxsYmFja0FjdGl2ZSgpICYmIGdldEVycm9yQ2FsbGJhY2tQcm9jKCkgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgKCpnZXRFcnJvckNhbGxiYWNrUHJvYygpKSgKLSAgICAgICAgICAgICAgICAgICAgKEFBdWRpb1N0cmVhbSAqKSB0aGlzLAotICAgICAgICAgICAgICAgICAgICBnZXRFcnJvckNhbGxiYWNrVXNlckRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRAotICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAvLyBOb3RlIHRoYXQgaXNEYXRhQ2FsbGJhY2tBY3RpdmUoKSBpcyBhZmZlY3RlZCBieSBzdGF0ZSBzbyBjYWxsIGl0IGJlZm9yZSBESVNDT05ORUNUSU5HLgorICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgZGF0YSBjYWxsYmFjayBhbmQgdGhlIHN0cmVhbSBpcyBhY3RpdmUsIHRoZW4gYXNrIHRoZSBkYXRhIGNhbGxiYWNrCisgICAgICAgIC8vIHRvIERJU0NPTk5FQ1QgYW5kIGNhbGwgdGhlIGVycm9yIGNhbGxiYWNrLgorICAgICAgICBpZiAoaXNEYXRhQ2FsbGJhY2tBY3RpdmUoKSkgeworICAgICAgICAgICAgQUxPR0QoIm9uQXVkaW9EZXZpY2VVcGRhdGUoKSByZXF1ZXN0IERJU0NPTk5FQ1QgaW4gZGF0YSBjYWxsYmFjayBkdWUgdG8gZGV2aWNlIGNoYW5nZSIpOworICAgICAgICAgICAgLy8gSWYgdGhlIHN0cmVhbSBpcyBzdG9wcGVkIGJlZm9yZSB0aGUgZGF0YSBjYWxsYmFjayBoYXMgYSBjaGFuY2UgdG8gaGFuZGxlIHRoZQorICAgICAgICAgICAgLy8gcmVxdWVzdCB0aGVuIHRoZSByZXF1ZXN0U3RvcCgpIGFuZCByZXF1ZXN0UGF1c2UoKSBtZXRob2RzIHdpbGwgaGFuZGxlIGl0IGFmdGVyCisgICAgICAgICAgICAvLyB0aGUgY2FsbGJhY2sgaGFzIHN0b3BwZWQuCisgICAgICAgICAgICBtUmVxdWVzdERpc2Nvbm5lY3QucmVxdWVzdCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0QoIm9uQXVkaW9EZXZpY2VVcGRhdGUoKSBESVNDT05ORUNUIHRoZSBzdHJlYW0gbm93Iik7CisgICAgICAgICAgICBmb3JjZURpc2Nvbm5lY3QoKTsKICAgICAgICAgfQogICAgIH0KICAgICBzZXREZXZpY2VJZChkZXZpY2VJZCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuaAppbmRleCBkMmVmM2M3Li43ZTI4NTc5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmgKQEAgLTI0LDYgKzI0LDcgQEAKIAogI2luY2x1ZGUgIkF1ZGlvU3RyZWFtLmgiCiAjaW5jbHVkZSAiQUF1ZGlvTGVnYWN5LmgiCisjaW5jbHVkZSAidXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaCIKICNpbmNsdWRlICJ1dGlsaXR5L0ZpeGVkQmxvY2tBZGFwdGVyLmgiCiAKIG5hbWVzcGFjZSBhYXVkaW8gewpAQCAtNjMsNiArNjQsOCBAQAogCiAgICAgYWF1ZGlvX2xlZ2FjeV9jYWxsYmFja190IGdldExlZ2FjeUNhbGxiYWNrKCk7CiAKKyAgICBpbnQzMl90IGNhbGxEYXRhQ2FsbGJhY2tGcmFtZXModWludDhfdCAqYnVmZmVyLCBpbnQzMl90IG51bUZyYW1lcyk7CisKICAgICAvLyBUaGlzIGlzIHB1YmxpYyBzbyBpdCBjYW4gYmUgY2FsbGVkIGZyb20gdGhlIEMgY2FsbGJhY2sgZnVuY3Rpb24uCiAgICAgLy8gVGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgQXVkaW9UcmFjay9BdWRpb1JlY29yZCBjbGllbnQuCiAgICAgdmlydHVhbCB2b2lkIHByb2Nlc3NDYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKmluZm8pID0gMDsKQEAgLTEwOSw2ICsxMTIsMTAgQEAKIAogICAgIHZvaWQgb25BdWRpb0RldmljZVVwZGF0ZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKIAorICAgIHZvaWQgY2hlY2tGb3JEaXNjb25uZWN0UmVxdWVzdCgpOworCisgICAgdm9pZCBmb3JjZURpc2Nvbm5lY3QoKTsKKwogICAgIHZvaWQgb25TdGFydCgpIHsgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZSh0cnVlKTsgfQogICAgIHZvaWQgb25TdG9wKCkgeyBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKGZhbHNlKTsgfQogCkBAIC0xMjIsMTEgKzEyOSwxNCBAQAogCiAgICAgTW9ub3RvbmljQ291bnRlciAgICAgICAgICAgbUZyYW1lc1dyaXR0ZW47CiAgICAgTW9ub3RvbmljQ291bnRlciAgICAgICAgICAgbUZyYW1lc1JlYWQ7CisgICAgTW9ub3RvbmljQ291bnRlciAgICAgICAgICAgbVRpbWVzdGFtcFBvc2l0aW9uOwogCiAgICAgRml4ZWRCbG9ja0FkYXB0ZXIgICAgICAgICAqbUJsb2NrQWRhcHRlciA9IG51bGxwdHI7CiAgICAgYWF1ZGlvX3dyYXBwaW5nX2ZyYW1lc190ICAgbVBvc2l0aW9uV2hlblN0YXJ0aW5nID0gMDsKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tCdWZmZXJTaXplID0gMDsKICAgICBjb25zdCBhbmRyb2lkOjpzcDxTdHJlYW1EZXZpY2VDYWxsYmFjaz4gICBtRGV2aWNlQ2FsbGJhY2s7CisKKyAgICBBdG9taWNSZXF1ZXN0b3IgICAgICAgICAgICBtUmVxdWVzdERpc2Nvbm5lY3Q7CiB9OwogCiB9IC8qIG5hbWVzcGFjZSBhYXVkaW8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcAppbmRleCA4ZTgwNzBjLi5iYzZlNjBjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIExPR19UQUcgIkFBdWRpbyIKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9TdHJlYW1SZWNvcmQiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKQEAgLTE1OSw2ICsxNTksOSBAQAogICAgICAgICBhY3R1YWxQZXJmb3JtYW5jZU1vZGUgPSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWTsKICAgICB9CiAgICAgc2V0UGVyZm9ybWFuY2VNb2RlKGFjdHVhbFBlcmZvcm1hbmNlTW9kZSk7CisKKyAgICBzZXRTaGFyaW5nTW9kZShBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCk7IC8vIEVYQ0xVU0lWRSBtb2RlIG5vdCBzdXBwb3J0ZWQgaW4gbGVnYWN5CisKICAgICAvLyBMb2cgd2FybmluZyBpZiB3ZSBkaWQgbm90IGdldCB3aGF0IHdlIGFza2VkIGZvci4KICAgICBBTE9HV19JRihhY3R1YWxGbGFncyAhPSBmbGFncywKICAgICAgICAgICAgICAiQXVkaW9TdHJlYW1SZWNvcmQ6Om9wZW4oKSBmbGFncyBjaGFuZ2VkIGZyb20gMHglMDhYIHRvIDB4JTA4WCIsCkBAIC0xNzgsMTEgKzE4MSwxMiBAQAogewogICAgIC8vIFRPRE8gYWRkIGNsb3NlKCkgb3IgcmVsZWFzZSgpIHRvIEF1ZGlvUmVjb3JkIEFQSSB0aGVuIGNhbGwgaXQgZnJvbSBoZXJlCiAgICAgaWYgKGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQpIHsKKyAgICAgICAgbUF1ZGlvUmVjb3JkLT5yZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjayk7CiAgICAgICAgIG1BdWRpb1JlY29yZC5jbGVhcigpOwogICAgICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRCk7CiAgICAgfQogICAgIG1GaXhlZEJsb2NrV3JpdGVyLmNsb3NlKCk7Ci0gICAgcmV0dXJuIEFBVURJT19PSzsKKyAgICByZXR1cm4gQXVkaW9TdHJlYW06OmNsb3NlKCk7CiB9CiAKIHZvaWQgQXVkaW9TdHJlYW1SZWNvcmQ6OnByb2Nlc3NDYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKmluZm8pIHsKQEAgLTIwNyw3ICsyMTEsNyBAQAogICAgIGlmIChtQXVkaW9SZWNvcmQuZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQotICAgIC8vIEdldCBjdXJyZW50IHBvc2l0aW9uIHNvIHdlIGNhbiBkZXRlY3Qgd2hlbiB0aGUgdHJhY2sgaXMgcGxheWluZy4KKyAgICAvLyBHZXQgY3VycmVudCBwb3NpdGlvbiBzbyB3ZSBjYW4gZGV0ZWN0IHdoZW4gdGhlIHRyYWNrIGlzIHJlY29yZGluZy4KICAgICBzdGF0dXNfdCBlcnIgPSBtQXVkaW9SZWNvcmQtPmdldFBvc2l0aW9uKCZtUG9zaXRpb25XaGVuU3RhcnRpbmcpOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KGVycik7CkBAIC0yMzAsMTIgKzIzNCwxNSBAQAogICAgIG9uU3RvcCgpOwogICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkcpOwogICAgIGluY3JlbWVudEZyYW1lc1dyaXR0ZW4oZ2V0RnJhbWVzUmVhZCgpIC0gZ2V0RnJhbWVzV3JpdHRlbigpKTsgLy8gVE9ETyByZXZpZXcKKyAgICBtVGltZXN0YW1wUG9zaXRpb24uc2V0KGdldEZyYW1lc1JlYWQoKSk7CiAgICAgbUF1ZGlvUmVjb3JkLT5zdG9wKCk7CiAgICAgbUZyYW1lc1JlYWQucmVzZXQzMigpOworICAgIG1UaW1lc3RhbXBQb3NpdGlvbi5yZXNldDMyKCk7CisgICAgY2hlY2tGb3JEaXNjb25uZWN0UmVxdWVzdCgpOwogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVJlY29yZDo6dXBkYXRlU3RhdGVXaGlsZVdhaXRpbmcoKQorYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtUmVjb3JkOjp1cGRhdGVTdGF0ZU1hY2hpbmUoKQogewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAgICAgYWF1ZGlvX3dyYXBwaW5nX2ZyYW1lc190IHBvc2l0aW9uOwpAQCAtMjkyLDYgKzI5OSwxMiBAQAogICAgIH0KICAgICBpbnQzMl90IGZyYW1lc1JlYWQgPSAoaW50MzJfdCkoYnl0ZXNSZWFkIC8gYnl0ZXNQZXJGcmFtZSk7CiAgICAgaW5jcmVtZW50RnJhbWVzUmVhZChmcmFtZXNSZWFkKTsKKworICAgIHJlc3VsdCA9IHVwZGF0ZVN0YXRlTWFjaGluZSgpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCiAgICAgcmV0dXJuIChhYXVkaW9fcmVzdWx0X3QpIGZyYW1lc1JlYWQ7CiB9CiAKQEAgLTMyNSw4ICszMzgsMjggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zZWNvbmRzKSB7CiAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgZXh0ZW5kZWRUaW1lc3RhbXA7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvUmVjb3JkLT5nZXRUaW1lc3RhbXAoJmV4dGVuZGVkVGltZXN0YW1wKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgaWYgKHN0YXR1cyA9PSBXT1VMRF9CTE9DSykgeworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgfSBlbHNlIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1cyk7CiAgICAgfQogICAgIHJldHVybiBnZXRCZXN0VGltZXN0YW1wKGNsb2NrSWQsIGZyYW1lUG9zaXRpb24sIHRpbWVOYW5vc2Vjb25kcywgJmV4dGVuZGVkVGltZXN0YW1wKTsKIH0KKworaW50NjRfdCBBdWRpb1N0cmVhbVJlY29yZDo6Z2V0RnJhbWVzV3JpdHRlbigpIHsKKyAgICBhYXVkaW9fd3JhcHBpbmdfZnJhbWVzX3QgcG9zaXRpb247CisgICAgc3RhdHVzX3QgcmVzdWx0OworICAgIHN3aXRjaCAoZ2V0U3RhdGUoKSkgeworICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRJTkc6CisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEOgorICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkc6CisgICAgICAgICAgICByZXN1bHQgPSBtQXVkaW9SZWNvcmQtPmdldFBvc2l0aW9uKCZwb3NpdGlvbik7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IE9LKSB7CisgICAgICAgICAgICAgICAgbUZyYW1lc1dyaXR0ZW4udXBkYXRlMzIocG9zaXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIEF1ZGlvU3RyZWFtTGVnYWN5OjpnZXRGcmFtZXNXcml0dGVuKCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuaAppbmRleCAyYzZhN2ViLi5jMTcyM2JhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmgKQEAgLTU5LDkgKzU5LDExIEBACiAKICAgICBpbnQzMl90IGdldFhSdW5Db3VudCgpIGNvbnN0IG92ZXJyaWRlOwogCisgICAgaW50NjRfdCBnZXRGcmFtZXNXcml0dGVuKCkgb3ZlcnJpZGU7CisKICAgICBpbnQzMl90IGdldEZyYW1lc1BlckJ1cnN0KCkgY29uc3Qgb3ZlcnJpZGU7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgdXBkYXRlU3RhdGVXaGlsZVdhaXRpbmcoKSBvdmVycmlkZTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgdXBkYXRlU3RhdGVNYWNoaW5lKCkgb3ZlcnJpZGU7CiAKICAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZ2V0RGlyZWN0aW9uKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgICByZXR1cm4gQUFVRElPX0RJUkVDVElPTl9JTlBVVDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAKaW5kZXggNzdmMzFlMi4uMGU5YWFlZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvIgorI2RlZmluZSBMT0dfVEFHICJBdWRpb1N0cmVhbVRyYWNrIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCkBAIC0xMTUsNyArMTE1LDcgQEAKIAogICAgIEFMT0dEKCJBdWRpb1N0cmVhbVRyYWNrOjpvcGVuKCksIHJlcXVlc3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gJWQsIGZyYW1lQ291bnQgPSAldSIsCiAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLCAodWludClmcmFtZUNvdW50KTsKLSAgICBtQXVkaW9UcmFjayA9IG5ldyBBdWRpb1RyYWNrKCk7CisgICAgbUF1ZGlvVHJhY2sgPSBuZXcgQXVkaW9UcmFjaygpOyAvLyBUT0RPIHJldmlldwogICAgIGlmIChnZXREZXZpY2VJZCgpICE9IEFBVURJT19VTlNQRUNJRklFRCkgewogICAgICAgICBtQXVkaW9UcmFjay0+c2V0T3V0cHV0RGV2aWNlKGdldERldmljZUlkKCkpOwogICAgIH0KQEAgLTE0Myw4ICsxNDMsNyBAQAogICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzKTsKICAgICB9CiAKLSAgICAvL1RyYWNrUGxheWVyQmFzZSBpbml0Ci0gICAgaW5pdChtQXVkaW9UcmFjay5nZXQoKSwgUExBWUVSX1RZUEVfQUFVRElPLCBBVURJT19VU0FHRV9NRURJQSk7CisgICAgZG9TZXRWb2x1bWUoKTsKIAogICAgIC8vIEdldCB0aGUgYWN0dWFsIHZhbHVlcyBmcm9tIHRoZSBBdWRpb1RyYWNrLgogICAgIHNldFNhbXBsZXNQZXJGcmFtZShtQXVkaW9UcmFjay0+Y2hhbm5lbENvdW50KCkpOwpAQCAtMTcxLDE4ICsxNzAsMjAgQEAKICAgICBzZXREZXZpY2VJZChtQXVkaW9UcmFjay0+Z2V0Um91dGVkRGV2aWNlSWQoKSk7CiAgICAgbUF1ZGlvVHJhY2stPmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrKTsKIAotICAgIC8vIFVwZGF0ZSBwZXJmb3JtYW5jZSBtb2RlIGJhc2VkIG9uIHRoZSBhY3R1YWwgc3RyZWFtLgorICAgIC8vIFVwZGF0ZSBwZXJmb3JtYW5jZSBtb2RlIGJhc2VkIG9uIHRoZSBhY3R1YWwgc3RyZWFtIGZsYWdzLgogICAgIC8vIEZvciBleGFtcGxlLCBpZiB0aGUgc2FtcGxlIHJhdGUgaXMgbm90IGFsbG93ZWQgdGhlbiB5b3Ugd29uJ3QgZ2V0IGEgRkFTVCB0cmFjay4KICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBhY3R1YWxGbGFncyA9IG1BdWRpb1RyYWNrLT5nZXRGbGFncygpOwogICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgYWN0dWFsUGVyZm9ybWFuY2VNb2RlID0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORTsKLSAgICBpZiAoKGFjdHVhbEZsYWdzICYgKEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgfCBBVURJT19PVVRQVVRfRkxBR19SQVcpKQotICAgICAgICA9PSAoQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCB8IEFVRElPX09VVFBVVF9GTEFHX1JBVykpIHsKKyAgICAvLyBXZSBtYXkgbm90IGdldCB0aGUgUkFXIGZsYWcuIEJ1dCBhcyBsb25nIGFzIHdlIGdldCB0aGUgRkFTVCBmbGFnIHdlIGNhbiBjYWxsIGl0IExPV19MQVRFTkNZLgorICAgIGlmICgoYWN0dWFsRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSAhPSAwKSB7CiAgICAgICAgIGFjdHVhbFBlcmZvcm1hbmNlTW9kZSA9IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZOwotCiAgICAgfSBlbHNlIGlmICgoYWN0dWFsRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUikgIT0gMCkgewogICAgICAgICBhY3R1YWxQZXJmb3JtYW5jZU1vZGUgPSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9QT1dFUl9TQVZJTkc7CiAgICAgfQogICAgIHNldFBlcmZvcm1hbmNlTW9kZShhY3R1YWxQZXJmb3JtYW5jZU1vZGUpOworCisgICAgc2V0U2hhcmluZ01vZGUoQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQpOyAvLyBFWENMVVNJVkUgbW9kZSBub3Qgc3VwcG9ydGVkIGluIGxlZ2FjeQorCiAgICAgLy8gTG9nIHdhcm5pbmcgaWYgd2UgZGlkIG5vdCBnZXQgd2hhdCB3ZSBhc2tlZCBmb3IuCiAgICAgQUxPR1dfSUYoYWN0dWFsRmxhZ3MgIT0gZmxhZ3MsCiAgICAgICAgICAgICAgIkF1ZGlvU3RyZWFtVHJhY2s6Om9wZW4oKSBmbGFncyBjaGFuZ2VkIGZyb20gMHglMDhYIHRvIDB4JTA4WCIsCkBAIC0xOTcsNyArMTk4LDcgQEAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVRyYWNrOjpjbG9zZSgpCiB7CiAgICAgaWYgKGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQpIHsKLSAgICAgICAgZGVzdHJveSgpOworICAgICAgICBtQXVkaW9UcmFjay0+cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2spOwogICAgICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRCk7CiAgICAgfQogICAgIG1GaXhlZEJsb2NrUmVhZGVyLmNsb3NlKCk7CkBAIC0yMjIsMTEgKzIyMywxMSBAQAogICAgIHJldHVybjsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RTdGFydCgpCi17CithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdFN0YXJ0KCkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1NdXRleCk7CiAKICAgICBpZiAobUF1ZGlvVHJhY2suZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdFN0YXJ0KCkgbm8gQXVkaW9UcmFjayIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogICAgIC8vIEdldCBjdXJyZW50IHBvc2l0aW9uIHNvIHdlIGNhbiBkZXRlY3Qgd2hlbiB0aGUgdHJhY2sgaXMgcGxheWluZy4KQEAgLTIzNSw3ICsyMzYsNyBAQAogICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKICAgICB9CiAKLSAgICBlcnIgPSBzdGFydFdpdGhTdGF0dXMoKTsKKyAgICBlcnIgPSBtQXVkaW9UcmFjay0+c3RhcnQoKTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwogICAgIH0gZWxzZSB7CkBAIC0yNDUsMTEgKzI0NiwxMSBAQAogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVRyYWNrOjpyZXF1ZXN0UGF1c2UoKQoteworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RQYXVzZSgpIHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RyZWFtTXV0ZXgpOwogCiAgICAgaWYgKG1BdWRpb1RyYWNrLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoInJlcXVlc3RQYXVzZSgpIG5vIEF1ZGlvVHJhY2siKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0gZWxzZSBpZiAoZ2V0U3RhdGUoKSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJUSU5HCiAgICAgICAgICAgICAmJiBnZXRTdGF0ZSgpICE9IEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRCkgewpAQCAtMjU5LDcgKzI2MCw4IEBACiAgICAgfQogICAgIG9uU3RvcCgpOwogICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0lORyk7Ci0gICAgcGF1c2UoKTsKKyAgICBtQXVkaW9UcmFjay0+cGF1c2UoKTsKKyAgICBjaGVja0ZvckRpc2Nvbm5lY3RSZXF1ZXN0KCk7CiAgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvVHJhY2stPmdldFBvc2l0aW9uKCZtUG9zaXRpb25XaGVuUGF1c2luZyk7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKQEAgLTI3MSwxNCArMjczLDE3IEBACiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbU11dGV4KTsKIAogICAgIGlmIChtQXVkaW9UcmFjay5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbVRyYWNrOjpyZXF1ZXN0Rmx1c2goKSBubyBBdWRpb1RyYWNrIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9IGVsc2UgaWYgKGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTRUQpIHsKKyAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RGbHVzaCgpIG5vdCBwYXVzZWQiKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNISU5HKTsKICAgICBpbmNyZW1lbnRGcmFtZXNSZWFkKGdldEZyYW1lc1dyaXR0ZW4oKSAtIGdldEZyYW1lc1JlYWQoKSk7CiAgICAgbUF1ZGlvVHJhY2stPmZsdXNoKCk7CiAgICAgbUZyYW1lc1dyaXR0ZW4ucmVzZXQzMigpOworICAgIG1UaW1lc3RhbXBQb3NpdGlvbi5yZXNldDMyKCk7CiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIApAQCAtMjg2LDE3ICsyOTEsMjEgQEAKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RyZWFtTXV0ZXgpOwogCiAgICAgaWYgKG1BdWRpb1RyYWNrLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RTdG9wKCkgbm8gQXVkaW9UcmFjayIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogICAgIG9uU3RvcCgpOwogICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkcpOwogICAgIGluY3JlbWVudEZyYW1lc1JlYWQoZ2V0RnJhbWVzV3JpdHRlbigpIC0gZ2V0RnJhbWVzUmVhZCgpKTsgLy8gVE9ETyByZXZpZXcKLSAgICBzdG9wKCk7CisgICAgbVRpbWVzdGFtcFBvc2l0aW9uLnNldChnZXRGcmFtZXNXcml0dGVuKCkpOwogICAgIG1GcmFtZXNXcml0dGVuLnJlc2V0MzIoKTsKKyAgICBtVGltZXN0YW1wUG9zaXRpb24ucmVzZXQzMigpOworICAgIG1BdWRpb1RyYWNrLT5zdG9wKCk7CisgICAgY2hlY2tGb3JEaXNjb25uZWN0UmVxdWVzdCgpOwogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVRyYWNrOjp1cGRhdGVTdGF0ZVdoaWxlV2FpdGluZygpCithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1UcmFjazo6dXBkYXRlU3RhdGVNYWNoaW5lKCkKIHsKICAgICBzdGF0dXNfdCBlcnI7CiAgICAgYWF1ZGlvX3dyYXBwaW5nX2ZyYW1lc190IHBvc2l0aW9uOwpAQCAtMzczLDYgKzM4MiwxMiBAQAogICAgIH0KICAgICBpbnQzMl90IGZyYW1lc1dyaXR0ZW4gPSAoaW50MzJfdCkoYnl0ZXNXcml0dGVuIC8gYnl0ZXNQZXJGcmFtZSk7CiAgICAgaW5jcmVtZW50RnJhbWVzV3JpdHRlbihmcmFtZXNXcml0dGVuKTsKKworICAgIHJlc3VsdCA9IHVwZGF0ZVN0YXRlTWFjaGluZSgpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCiAgICAgcmV0dXJuIGZyYW1lc1dyaXR0ZW47CiB9CiAKQEAgLTQzMSw4ICs0NDYsNTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3NlY29uZHMpIHsKICAgICBFeHRlbmRlZFRpbWVzdGFtcCBleHRlbmRlZFRpbWVzdGFtcDsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9UcmFjay0+Z2V0VGltZXN0YW1wKCZleHRlbmRlZFRpbWVzdGFtcCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgIGlmIChzdGF0dXMgPT0gV09VTERfQkxPQ0spIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgIH0gaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzKTsKICAgICB9Ci0gICAgcmV0dXJuIGdldEJlc3RUaW1lc3RhbXAoY2xvY2tJZCwgZnJhbWVQb3NpdGlvbiwgdGltZU5hbm9zZWNvbmRzLCAmZXh0ZW5kZWRUaW1lc3RhbXApOworICAgIGludDY0X3QgcG9zaXRpb24gPSAwOworICAgIGludDY0X3QgbmFub3NlY29uZHMgPSAwOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBnZXRCZXN0VGltZXN0YW1wKGNsb2NrSWQsICZwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFub3NlY29uZHMsICZleHRlbmRlZFRpbWVzdGFtcCk7CisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgaWYgKHBvc2l0aW9uIDwgZ2V0RnJhbWVzV3JpdHRlbigpKSB7CisgICAgICAgICAgICAqZnJhbWVQb3NpdGlvbiA9IHBvc2l0aW9uOworICAgICAgICAgICAgKnRpbWVOYW5vc2Vjb25kcyA9IG5hbm9zZWNvbmRzOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsgLy8gVE9ETyByZXZpZXcsIGRvY3VtZW50ZWQgYnV0IG5vdCBjb25zaXN0ZW50CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KKworc3RhdHVzX3QgQXVkaW9TdHJlYW1UcmFjazo6ZG9TZXRWb2x1bWUoKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fSU5JVDsKKyAgICBpZiAobUF1ZGlvVHJhY2suZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBmbG9hdCB2b2x1bWUgPSBnZXREdWNrQW5kTXV0ZVZvbHVtZSgpOworICAgICAgICBtQXVkaW9UcmFjay0+c2V0Vm9sdW1lKHZvbHVtZSwgdm9sdW1lKTsKKyAgICAgICAgc3RhdHVzID0gTk9fRVJST1I7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKyNpZiBBQVVESU9fVVNFX1ZPTFVNRV9TSEFQRVIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhOjpWb2x1bWVTaGFwZXI7CisKK2JpbmRlcjo6U3RhdHVzIEF1ZGlvU3RyZWFtVHJhY2s6OmFwcGx5Vm9sdW1lU2hhcGVyKAorICAgICAgICBjb25zdCBWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24sCisgICAgICAgIGNvbnN0IFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uJiBvcGVyYXRpb24pIHsKKworICAgIHNwPFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4gc3BDb25maWd1cmF0aW9uID0gbmV3IFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKTsKKyAgICBzcDxWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4gc3BPcGVyYXRpb24gPSBuZXcgVm9sdW1lU2hhcGVyOjpPcGVyYXRpb24ob3BlcmF0aW9uKTsKKworICAgIGlmIChtQXVkaW9UcmFjay5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJhcHBseVZvbHVtZVNoYXBlcigpIGZyb20gSVBsYXllciIpOworICAgICAgICBiaW5kZXI6OlN0YXR1cyBzdGF0dXMgPSBtQXVkaW9UcmFjay0+YXBwbHlWb2x1bWVTaGFwZXIoc3BDb25maWd1cmF0aW9uLCBzcE9wZXJhdGlvbik7CisgICAgICAgIGlmIChzdGF0dXMgPCAwKSB7IC8vIGEgbm9uLW5lZ2F0aXZlIHZhbHVlIGlzIHRoZSB2b2x1bWUgc2hhcGVyIGlkLgorICAgICAgICAgICAgQUxPR0UoImFwcGx5Vm9sdW1lU2hhcGVyKCkgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgc3RhdHVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0QoImFwcGx5Vm9sdW1lU2hhcGVyKCkiCisgICAgICAgICAgICAgICAgICAgICAgIiBubyBBdWRpb1RyYWNrIGZvciB2b2x1bWUgY29udHJvbCBmcm9tIElQbGF5ZXIiKTsKKyAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworICAgIH0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5oCmluZGV4IGZmNDI5ZWEuLmE4NzFkYjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmgKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxtZWRpYS9UcmFja1BsYXllckJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogCiAjaW5jbHVkZSAiQXVkaW9TdHJlYW1CdWlsZGVyLmgiCkBAIC0zMiw3ICszMyw3IEBACiAvKioKICAqIEludGVybmFsIHN0cmVhbSB0aGF0IHVzZXMgdGhlIGxlZ2FjeSBBdWRpb1RyYWNrIHBhdGguCiAgKi8KLWNsYXNzIEF1ZGlvU3RyZWFtVHJhY2sgOiBwdWJsaWMgQXVkaW9TdHJlYW1MZWdhY3ksIHB1YmxpYyBhbmRyb2lkOjpUcmFja1BsYXllckJhc2UgeworY2xhc3MgQXVkaW9TdHJlYW1UcmFjayA6IHB1YmxpYyBBdWRpb1N0cmVhbUxlZ2FjeSB7CiBwdWJsaWM6CiAgICAgQXVkaW9TdHJlYW1UcmFjaygpOwogCkBAIC02Nyw3ICs2OCw3IEBACiAgICAgICAgIHJldHVybiBBQVVESU9fRElSRUNUSU9OX09VVFBVVDsKICAgICB9CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgdXBkYXRlU3RhdGVXaGlsZVdhaXRpbmcoKSBvdmVycmlkZTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgdXBkYXRlU3RhdGVNYWNoaW5lKCkgb3ZlcnJpZGU7CiAKICAgICAvLyBUaGlzIGlzIHB1YmxpYyBzbyBpdCBjYW4gYmUgY2FsbGVkIGZyb20gdGhlIEMgY2FsbGJhY2sgZnVuY3Rpb24uCiAgICAgdm9pZCBwcm9jZXNzQ2FsbGJhY2soaW50IGV2ZW50LCB2b2lkICppbmZvKSBvdmVycmlkZTsKQEAgLTc2LDEzICs3NywyMiBAQAogICAgICAgICByZXR1cm4gaW5jcmVtZW50RnJhbWVzV3JpdHRlbihmcmFtZXMpOwogICAgIH0KIAorICAgIGFuZHJvaWQ6OnN0YXR1c190IGRvU2V0Vm9sdW1lKCkgb3ZlcnJpZGU7CisKKyNpZiBBQVVESU9fVVNFX1ZPTFVNRV9TSEFQRVIKKyAgICB2aXJ0dWFsIGFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAorICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6bWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6Om1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbiYgb3BlcmF0aW9uKSBvdmVycmlkZTsKKyNlbmRpZgorCiBwcml2YXRlOgogCisgICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6QXVkaW9UcmFjaz4gbUF1ZGlvVHJhY2s7CisKICAgICAvLyBhZGFwdHMgYmV0d2VlbiB2YXJpYWJsZSBzaXplZCBibG9ja3MgYW5kIGZpeGVkIHNpemUgYmxvY2tzCiAgICAgRml4ZWRCbG9ja1JlYWRlciAgICAgICAgICAgICAgICAgbUZpeGVkQmxvY2tSZWFkZXI7CiAKLSAgICAvLyBUT0RPIGFkZCA2NC1iaXQgcG9zaXRpb24gcmVwb3J0aW5nIHRvIEF1ZGlvUmVjb3JkIGFuZCB1c2UgaXQuCi0gICAgYWF1ZGlvX3dyYXBwaW5nX2ZyYW1lc190ICAgICAgICAgbVBvc2l0aW9uV2hlblN0YXJ0aW5nID0gMDsKKyAgICAvLyBUT0RPIGFkZCA2NC1iaXQgcG9zaXRpb24gcmVwb3J0aW5nIHRvIEF1ZGlvVHJhY2sgYW5kIHVzZSBpdC4KICAgICBhYXVkaW9fd3JhcHBpbmdfZnJhbWVzX3QgICAgICAgICBtUG9zaXRpb25XaGVuUGF1c2luZyA9IDA7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgKaW5kZXggYWNkMzE5Yi4uM2FmYTk3NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaApAQCAtMjU4LDQgKzI1OCwxMTIgQEAKICAgICB9CiB9CiAKKworLyoqCisgKiBTaW1wbGUgZG91YmxlIGJ1ZmZlciBmb3IgYSBzdHJ1Y3R1cmUgdGhhdCBjYW4gYmUgd3JpdHRlbiBvY2Nhc2lvbmFsbHkgYW5kIHJlYWQgb2NjYXNpb25hbGx5LgorICogVGhpcyBhbGxvd3MgYSBTSU5HTEUgd3JpdGVyIHdpdGggbXVsdGlwbGUgcmVhZGVycy4KKyAqCisgKiBJdCBpcyBPSyBpZiB0aGUgRklGTyBvdmVyZmxvd3MgYW5kIHdlIGxvc2Ugb2xkIHZhbHVlcy4KKyAqIEl0IGlzIGFsc28gT0sgaWYgd2UgcmVhZCBhbiBvbGQgdmFsdWUuCisgKiBUaHJlYWQgbWF5IHJldHVybiBhIG5vbi1hdG9taWMgcmVzdWx0IGlmIHRoZSBvdGhlciB0aHJlYWQgaXMgcmFwaWRseSB3cml0aW5nCisgKiBuZXcgdmFsdWVzIG9uIGFub3RoZXIgY29yZS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFQ+CitjbGFzcyBTaW1wbGVEb3VibGVCdWZmZXIgeworcHVibGljOgorICAgIFNpbXBsZURvdWJsZUJ1ZmZlcigpCisgICAgICAgICAgICA6IG1WYWx1ZXMoKSB7fQorCisgICAgX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoImludGVnZXIiKSkpCisgICAgdm9pZCB3cml0ZShUIHZhbHVlKSB7CisgICAgICAgIGludCBpbmRleCA9IG1Db3VudGVyLmxvYWQoKSAmIDE7CisgICAgICAgIG1WYWx1ZXNbaW5kZXhdID0gdmFsdWU7CisgICAgICAgIG1Db3VudGVyKys7IC8vIEluY3JlbWVudCBBRlRFUiB1cGRhdGluZyBzdG9yYWdlLCBPSyBpZiBpdCB3cmFwcy4KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSB0aGUgc2FtZSB0aHJlYWQgdGhhdCBjYWxscyB3cml0ZSgpIG9yIHdoZW4KKyAgICAgKiBubyBvdGhlciB0aHJlYWQgaXMgY2FsbGluZyB3cml0ZS4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgICBtQ291bnRlci5zdG9yZSgwKTsKKyAgICB9CisKKyAgICBUIHJlYWQoKSBjb25zdCB7CisgICAgICAgIFQgcmVzdWx0OworICAgICAgICBpbnQgYmVmb3JlOworICAgICAgICBpbnQgYWZ0ZXI7CisgICAgICAgIGludCB0aW1lb3V0ID0gMzsKKyAgICAgICAgZG8geworICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGEgd3JpdGUgb2NjdXJyZWQgd2hpbGUgd2VyZSByZWFkaW5nLgorICAgICAgICAgICAgYmVmb3JlID0gbUNvdW50ZXIubG9hZCgpOworICAgICAgICAgICAgaW50IGluZGV4ID0gKGJlZm9yZSAmIDEpIF4gMTsKKyAgICAgICAgICAgIHJlc3VsdCA9IG1WYWx1ZXNbaW5kZXhdOworICAgICAgICAgICAgYWZ0ZXIgPSBtQ291bnRlci5sb2FkKCk7CisgICAgICAgIH0gd2hpbGUgKChhZnRlciAhPSBiZWZvcmUpICYmIChhZnRlciA+IDApICYmICgtLXRpbWVvdXQgPiAwKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIGF0IGxlYXN0IG9uZSB2YWx1ZSBoYXMgYmVlbiB3cml0dGVuCisgICAgICovCisgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNvdW50ZXIubG9hZCgpID4gMDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgVCAgICAgICAgICAgICAgICAgICAgbVZhbHVlc1syXTsKKyAgICBzdGQ6OmF0b21pYzxpbnQ+ICAgICBtQ291bnRlcnswfTsKK307CisKK2NsYXNzIFRpbWVzdGFtcCB7CitwdWJsaWM6CisgICAgVGltZXN0YW1wKCkKKyAgICAgICAgICAgIDogbVBvc2l0aW9uKDApCisgICAgICAgICAgICAsIG1OYW5vc2Vjb25kcygwKSB7fQorICAgIFRpbWVzdGFtcChpbnQ2NF90IHBvc2l0aW9uLCBpbnQ2NF90IG5hbm9zZWNvbmRzKQorICAgICAgICAgICAgOiBtUG9zaXRpb24ocG9zaXRpb24pCisgICAgICAgICAgICAsIG1OYW5vc2Vjb25kcyhuYW5vc2Vjb25kcykge30KKworICAgIGludDY0X3QgZ2V0UG9zaXRpb24oKSBjb25zdCB7IHJldHVybiBtUG9zaXRpb247IH0KKworICAgIGludDY0X3QgZ2V0TmFub3NlY29uZHMoKSBjb25zdCB7IHJldHVybiBtTmFub3NlY29uZHM7IH0KKworcHJpdmF0ZToKKyAgICAvLyBUaGVzZSBjYW5ub3QgYmUgY29uc3QgYmVjYXVzZSB3ZSBuZWVkIHRvIGltcGxlbWVudCB0aGUgY29weSBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgIGludDY0X3QgbVBvc2l0aW9uOworICAgIGludDY0X3QgbU5hbm9zZWNvbmRzOworfTsKKworCisvKioKKyAqIFBhc3MgYSByZXF1ZXN0IHRvIGFub3RoZXIgdGhyZWFkLgorICogVGhpcyBpcyB1c2VkIHdoZW4gb25lIHRocmVhZCwgQSwgd2FudHMgYW5vdGhlciB0aHJlYWQsIEIsIHRvIGRvIHNvbWV0aGluZy4KKyAqIEEgbmFpdmUgYXBwcm9hY2ggd291bGQgYmUgZm9yIEEgdG8gc2V0IGEgZmxhZyBhbmQgZm9yIEIgdG8gY2xlYXIgaXQgd2hlbiBkb25lLgorICogQnV0IHRoYXQgY3JlYXRlcyBhIHJhY2UgY29uZGl0aW9uLiBUaGlzIHRlY2huaXF1ZSBhdm9pZHMgdGhlIHJhY2UgY29uZGl0aW9uLgorICoKKyAqIEFzc3VtZXMgb25seSBvbmUgcmVxdWVzdGVyIGFuZCBvbmUgYWNrbm93bGVkZ2VyLgorICovCitjbGFzcyBBdG9taWNSZXF1ZXN0b3IgeworcHVibGljOgorCisgICAgX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoImludGVnZXIiKSkpCisgICAgdm9pZCByZXF1ZXN0KCkgeworICAgICAgICBtUmVxdWVzdGVkKys7CisgICAgfQorCisgICAgX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoImludGVnZXIiKSkpCisgICAgYm9vbCBpc1JlcXVlc3RlZCgpIHsKKyAgICAgICAgcmV0dXJuIChtUmVxdWVzdGVkLmxvYWQoKSAtIG1BY2tub3dsZWRnZWQubG9hZCgpKSA+IDA7CisgICAgfQorCisgICAgX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoImludGVnZXIiKSkpCisgICAgdm9pZCBhY2tub3dsZWRnZSgpIHsKKyAgICAgICAgbUFja25vd2xlZGdlZCsrOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OmF0b21pYzxpbnQ+IG1SZXF1ZXN0ZWR7MH07CisgICAgc3RkOjphdG9taWM8aW50PiBtQWNrbm93bGVkZ2VkezB9OworfTsKICNlbmRpZiAvL1VUSUxJVFlfQUFVRElPX1VUSUxJVElFU19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvSGFuZGxlVHJhY2tlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvSGFuZGxlVHJhY2tlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1Y2U5NWEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0hhbmRsZVRyYWNrZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBQXVkaW8iCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPGlvbWFuaXA+Ci0jaW5jbHVkZSA8bmV3PgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KLQotI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KLSNpbmNsdWRlICJBQXVkaW9VdGlsaXRpZXMuaCIKLSNpbmNsdWRlICJIYW5kbGVUcmFja2VyLmgiCi0KLXVzaW5nIGFuZHJvaWQ6Ok11dGV4OwotCi0vLyBIYW5kbGUgZm9ybWF0IGlzOiB0Z2dnaWlpaQotLy8gd2hlcmUgZWFjaCBsZXR0ZXIgaXMgNCBiaXRzLCB0PXR5cGUsIGc9Z2VuZXJhdGlvbiwgaT1pbmRleAotCi0jZGVmaW5lIFRZUEVfU0laRSAgICAgICAgICAgNAotI2RlZmluZSBHRU5FUkFUSU9OX1NJWkUgICAgMTIKLSNkZWZpbmUgSU5ERVhfU0laRSAgICAgICAgIDE2Ci0KLSNkZWZpbmUgR0VORVJBVElPTl9JTlZBTElEICAwCi0jZGVmaW5lIEdFTkVSQVRJT05fU0hJRlQgICAgSU5ERVhfU0laRQotCi0jZGVmaW5lIFRZUEVfTUFTSyAgICAgICAgICAgKCgxIDw8IFRZUEVfU0laRSkgLSAxKQotI2RlZmluZSBHRU5FUkFUSU9OX01BU0sgICAgICgoMSA8PCBHRU5FUkFUSU9OX1NJWkUpIC0gMSkKLSNkZWZpbmUgSU5ERVhfTUFTSyAgICAgICAgICAoKDEgPDwgSU5ERVhfU0laRSkgLSAxKQotCi0jZGVmaW5lIFNMT1RfVU5BVkFJTEFCTEUgICAgKC0xKQotCi0vLyBFcnJvciBpZiBoYW5kbGUgaXMgbmVnYXRpdmUgc28gdHlwZSBpcyBsaW1pdGVkIHRvIGJvdHRvbSBoYWxmLgotI2RlZmluZSBIQU5ETEVfSU5WQUxJRF9UWVBFIFRZUEVfTUFTSwotCi1zdGF0aWNfYXNzZXJ0KEhBTkRMRV9UUkFDS0VSX01BWF9UWVBFUyA9PSAoMSA8PCAoVFlQRV9TSVpFIC0gMSkpLAotICAgICJNaXNtYXRjaCBiZXR3ZWVuIGhlYWRlciBhbmQgY3BwLiIpOwotc3RhdGljX2Fzc2VydChIQU5ETEVfVFJBQ0tFUl9NQVhfSEFORExFUyA9PSAoMSA8PCAoSU5ERVhfU0laRSkpLAotICAgICJNaXNtYXRjaCBiZXR3ZWVuIGhlYWRlciBhbmQgY3BwLiIpOwotCi1IYW5kbGVUcmFja2VyOjpIYW5kbGVUcmFja2VyKHVpbnQzMl90IG1heEhhbmRsZXMpCi0gICAgICAgIDogbU1heEhhbmRsZUNvdW50KG1heEhhbmRsZXMpCi0gICAgICAgICwgbUhhbmRsZUhlYWRlcnMobnVsbHB0cikKLXsKLSAgICBhc3NlcnQobWF4SGFuZGxlcyA8PSBIQU5ETEVfVFJBQ0tFUl9NQVhfSEFORExFUyk7Ci0gICAgLy8gQWxsb2NhdGUgYXJyYXlzIHRvIGhvbGQgYWRkcmVzc2VzIGFuZCB2YWxpZGF0aW9uIGluZm8uCi0gICAgbUhhbmRsZUFkZHJlc3NlcyA9IChoYW5kbGVfdHJhY2tlcl9hZGRyZXNzX3QgKikKLSAgICAgICAgICAgIG5ldyhzdGQ6Om5vdGhyb3cpIGhhbmRsZV90cmFja2VyX2FkZHJlc3NfdFttYXhIYW5kbGVzXTsKLSAgICBpZiAobUhhbmRsZUFkZHJlc3NlcyAhPSBudWxscHRyKSB7Ci0gICAgICAgIG1IYW5kbGVIZWFkZXJzID0gbmV3KHN0ZDo6bm90aHJvdykgaGFuZGxlX3RyYWNrZXJfaGVhZGVyX3RbbWF4SGFuZGxlc107Ci0KLSAgICAgICAgaWYgKG1IYW5kbGVIZWFkZXJzICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGhhbmRsZV90cmFja2VyX2hlYWRlcl90IGluaXRpYWxIZWFkZXIgPSBidWlsZEhlYWRlcigwLCAxKTsKLSAgICAgICAgICAgIC8vIEluaXRpYWxpemUgbGlua2VkIGxpc3Qgb2YgZnJlZSBub2Rlcy4gbnVsbHB0ciB0ZXJtaW5hdGVkLgotICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IChtYXhIYW5kbGVzIC0gMSk7IGkrKykgewotICAgICAgICAgICAgICAgIG1IYW5kbGVBZGRyZXNzZXNbaV0gPSAmbUhhbmRsZUFkZHJlc3Nlc1tpICsgMV07IC8vIHBvaW50IHRvIG5leHQgbm9kZQotICAgICAgICAgICAgICAgIG1IYW5kbGVIZWFkZXJzW2ldID0gaW5pdGlhbEhlYWRlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1OZXh0RnJlZUFkZHJlc3MgPSAmbUhhbmRsZUFkZHJlc3Nlc1swXTsKLSAgICAgICAgICAgIG1IYW5kbGVBZGRyZXNzZXNbbWF4SGFuZGxlcyAtIDFdID0gbnVsbHB0cjsKLSAgICAgICAgICAgIG1IYW5kbGVIZWFkZXJzW21heEhhbmRsZXMgLSAxXSA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZWxldGVbXSBtSGFuZGxlQWRkcmVzc2VzOyAvLyBzbyB0aGUgY2xhc3MgYXBwZWFycyB1bmluaXRpYWxpemVkCi0gICAgICAgICAgICBtSGFuZGxlQWRkcmVzc2VzID0gbnVsbHB0cjsKLSAgICAgICAgfQotICAgIH0KLX0KLQotSGFuZGxlVHJhY2tlcjo6fkhhbmRsZVRyYWNrZXIoKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgZGVsZXRlW10gbUhhbmRsZUFkZHJlc3NlczsKLSAgICBkZWxldGVbXSBtSGFuZGxlSGVhZGVyczsKLSAgICBtSGFuZGxlQWRkcmVzc2VzID0gbnVsbHB0cjsKLX0KLQotYm9vbCBIYW5kbGVUcmFja2VyOjppc0luaXRpYWxpemVkKCkgY29uc3QgewotICAgIHJldHVybiBtSGFuZGxlQWRkcmVzc2VzICE9IG51bGxwdHI7Ci19Ci0KLQotCi1zdGQ6OnN0cmluZyBIYW5kbGVUcmFja2VyOjpkdW1wKCkgY29uc3QgewotICAgIGlmICghaXNJbml0aWFsaXplZCgpKSB7Ci0gICAgICAgIHJldHVybiAiSGFuZGxlVHJhY2tlciBpcyBub3QgaW5pdGlhbGl6ZWRcbiI7Ci0gICAgfQotCi0gICAgc3RkOjpzdHJpbmdzdHJlYW0gcmVzdWx0OwotICAgIGNvbnN0IGJvb2wgaXNMb2NrZWQgPSBBQXVkaW9fdHJ5VW50aWxUcnVlKAotICAgICAgICAgICAgW3RoaXNdKCktPmJvb2wgeyByZXR1cm4gbUxvY2sudHJ5TG9jaygpOyB9IC8qIGYgKi8sCi0gICAgICAgICAgICA1MCAvKiB0aW1lcyAqLywKLSAgICAgICAgICAgIDIwIC8qIHNsZWVwTXMgKi8pOwotICAgIGlmICghaXNMb2NrZWQpIHsKLSAgICAgICAgcmVzdWx0IDw8ICJIYW5kbGVUcmFja2VyIG1heSBiZSBkZWFkbG9ja2VkXG4iOwotICAgIH0KLQotICAgIHJlc3VsdCA8PCAiSGFuZGxlVHJhY2tlcjpcbiI7Ci0gICAgcmVzdWx0IDw8ICIgIEhhbmRsZUhlYWRlcnM6XG4iOwotICAgIC8vIGF0TGluZVN0YXJ0KCkgY2FuIGJlIGNoYW5nZWQgdG8gc3VwcG9ydCBhbiBhcmJpdHJhcnkgbGluZSBicmVha2luZyBhbGdvcml0aG07Ci0gICAgLy8gaXQgc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gYSBuZXcgbGluZSBzdGFydHMuCi0gICAgLy8gRm9yIHNpbXBsaWNpdHksIHdlIHdpbGwgdXNlIGEgY29uc3RhbnQgMTYgaXRlbXMgcGVyIGxpbmUuCi0gICAgY29uc3QgYXV0byBhdExpbmVTdGFydCA9IFtdKGludCBpbmRleCkgLT4gYm9vbCB7Ci0gICAgICAgIC8vIE1hZ2ljIGNvbnN0YW50IG9mIDB4ZiB1c2VkIGZvciBtYXNrIHRvIGRldGVjdCBzdGFydCBldmVyeSAxNiBpdGVtcy4KLSAgICAgICAgcmV0dXJuIChpbmRleCAmIDB4ZikgPT0gMDsgfTsKLSAgICBjb25zdCBhdXRvIGF0TGluZUVuZCA9IFt0aGlzLCAmYXRMaW5lU3RhcnRdKGludCBpbmRleCkgLT4gYm9vbCB7Ci0gICAgICAgIHJldHVybiBhdExpbmVTdGFydChpbmRleCArIDEpIHx8IGluZGV4ID09IG1NYXhIYW5kbGVDb3VudCAtIDE7IH07Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1NYXhIYW5kbGVDb3VudDsgKytpKSB7Ci0gICAgICAgIGlmIChhdExpbmVTdGFydChpKSkgewotICAgICAgICAgICAgcmVzdWx0IDw8ICIgICAgIjsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQgPDwgc3RkOjpoZXggPDwgc3RkOjpzZXR3KDQpIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IG1IYW5kbGVIZWFkZXJzW2ldCi0gICAgICAgICAgICAgICA8PCAoYXRMaW5lRW5kKGkpID8gIlxuIiA6ICIgIik7Ci0gICAgfQotCi0gICAgaWYgKGlzTG9ja2VkKSB7Ci0gICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0LnN0cigpOwotfQotCi1oYW5kbGVfdHJhY2tlcl9zbG90X3QgSGFuZGxlVHJhY2tlcjo6YWxsb2NhdGVTbG90X2woKSB7Ci0gICAgdm9pZCAqKmFsbG9jYXRlZCA9IG1OZXh0RnJlZUFkZHJlc3M7Ci0gICAgaWYgKGFsbG9jYXRlZCA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBTTE9UX1VOQVZBSUxBQkxFOwotICAgIH0KLSAgICAvLyBSZW1vdmUgdGhpcyBzbG90IGZyb20gdGhlIGhlYWQgb2YgdGhlIGxpbmtlZCBsaXN0LgotICAgIG1OZXh0RnJlZUFkZHJlc3MgPSAodm9pZCAqKikgKmFsbG9jYXRlZDsKLSAgICByZXR1cm4gKGFsbG9jYXRlZCAtIG1IYW5kbGVBZGRyZXNzZXMpOwotfQotCi1oYW5kbGVfdHJhY2tlcl9nZW5lcmF0aW9uX3QgSGFuZGxlVHJhY2tlcjo6bmV4dEdlbmVyYXRpb25fbChoYW5kbGVfdHJhY2tlcl9zbG90X3QgaW5kZXgpIHsKLSAgICBoYW5kbGVfdHJhY2tlcl9nZW5lcmF0aW9uX3QgZ2VuZXJhdGlvbiA9IChtSGFuZGxlSGVhZGVyc1tpbmRleF0gKyAxKSAmIEdFTkVSQVRJT05fTUFTSzsKLSAgICAvLyBBdm9pZCBnZW5lcmF0aW9uIHplcm8gc28gdGhhdCAweDAgaXMgbm90IGEgdmFsaWQgaGFuZGxlLgotICAgIGlmIChnZW5lcmF0aW9uID09IEdFTkVSQVRJT05fSU5WQUxJRCkgewotICAgICAgICBnZW5lcmF0aW9uKys7Ci0gICAgfQotICAgIHJldHVybiBnZW5lcmF0aW9uOwotfQotCi1hYXVkaW9faGFuZGxlX3QgSGFuZGxlVHJhY2tlcjo6cHV0KGhhbmRsZV90cmFja2VyX3R5cGVfdCB0eXBlLCB2b2lkICphZGRyZXNzKQotewotICAgIGlmICh0eXBlIDwgMCB8fCB0eXBlID49IEhBTkRMRV9UUkFDS0VSX01BWF9UWVBFUykgewotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YWF1ZGlvX2hhbmRsZV90PihBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFKTsKLSAgICB9Ci0gICAgaWYgKCFpc0luaXRpYWxpemVkKCkpIHsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGFhdWRpb19oYW5kbGVfdD4oQUFVRElPX0VSUk9SX05PX01FTU9SWSk7Ci0gICAgfQotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLQotICAgIC8vIEZpbmQgYW4gZW1wdHkgc2xvdC4KLSAgICBoYW5kbGVfdHJhY2tlcl9zbG90X3QgaW5kZXggPSBhbGxvY2F0ZVNsb3RfbCgpOwotICAgIGlmIChpbmRleCA9PSBTTE9UX1VOQVZBSUxBQkxFKSB7Ci0gICAgICAgIEFMT0dFKCJIYW5kbGVUcmFja2VyOjpwdXQoKSBubyByb29tIGZvciBtb3JlIGhhbmRsZXMiKTsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGFhdWRpb19oYW5kbGVfdD4oQUFVRElPX0VSUk9SX05PX0ZSRUVfSEFORExFUyk7Ci0gICAgfQotCi0gICAgLy8gQ3ljbGUgdGhlIGdlbmVyYXRpb24gY291bnRlciBzbyBzdGFsZSBoYW5kbGVzIGNhbiBiZSBkZXRlY3RlZC4KLSAgICBoYW5kbGVfdHJhY2tlcl9nZW5lcmF0aW9uX3QgZ2VuZXJhdGlvbiA9IG5leHRHZW5lcmF0aW9uX2woaW5kZXgpOyAvLyByZWFkcyBoZWFkZXIgdGFibGUKLSAgICBoYW5kbGVfdHJhY2tlcl9oZWFkZXJfdCBpbnB1dEhlYWRlciA9IGJ1aWxkSGVhZGVyKHR5cGUsIGdlbmVyYXRpb24pOwotCi0gICAgLy8gVGhlc2UgdHdvIHdyaXRlcyBtYXkgbmVlZCB0byBiZSBvYnNlcnZlZCBieSBvdGhlciB0aHJlYWRzIG9yIGNvcmVzIGR1cmluZyBnZXQoKS4KLSAgICBtSGFuZGxlSGVhZGVyc1tpbmRleF0gPSBpbnB1dEhlYWRlcjsKLSAgICBtSGFuZGxlQWRkcmVzc2VzW2luZGV4XSA9IGFkZHJlc3M7Ci0gICAgLy8gVE9ETyB1c2Ugc3RvcmUgcmVsZWFzZSB0byBlbmZvcmNlIG1lbW9yeSBvcmRlciB3aXRoIGdldCgpCi0KLSAgICAvLyBHZW5lcmF0ZSBhIGhhbmRsZS4KLSAgICBhYXVkaW9faGFuZGxlX3QgaGFuZGxlID0gYnVpbGRIYW5kbGUoaW5wdXRIZWFkZXIsIGluZGV4KTsKLQotICAgIEFMT0dWKCJIYW5kbGVUcmFja2VyOjpwdXQoJXApIHJldHVybnMgMHglMDh4IiwgYWRkcmVzcywgaGFuZGxlKTsKLSAgICByZXR1cm4gaGFuZGxlOwotfQotCi1oYW5kbGVfdHJhY2tlcl9zbG90X3QgSGFuZGxlVHJhY2tlcjo6aGFuZGxlVG9JbmRleChoYW5kbGVfdHJhY2tlcl90eXBlX3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19oYW5kbGVfdCBoYW5kbGUpIGNvbnN0Ci17Ci0gICAgLy8gVmFsaWRhdGUgdGhlIGhhbmRsZS4KLSAgICBoYW5kbGVfdHJhY2tlcl9zbG90X3QgaW5kZXggPSBleHRyYWN0SW5kZXgoaGFuZGxlKTsKLSAgICBpZiAoaW5kZXggPj0gbU1heEhhbmRsZUNvdW50KSB7Ci0gICAgICAgIEFMT0dFKCJIYW5kbGVUcmFja2VyOjpoYW5kbGVUb0luZGV4KCkgaW52YWxpZCBoYW5kbGUgPSAweCUwOFgiLCBoYW5kbGUpOwotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YWF1ZGlvX2hhbmRsZV90PihBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEUpOwotICAgIH0KLSAgICBoYW5kbGVfdHJhY2tlcl9nZW5lcmF0aW9uX3QgaGFuZGxlR2VuZXJhdGlvbiA9IGV4dHJhY3RHZW5lcmF0aW9uKGhhbmRsZSk7Ci0gICAgaGFuZGxlX3RyYWNrZXJfaGVhZGVyX3QgaW5wdXRIZWFkZXIgPSBidWlsZEhlYWRlcih0eXBlLCBoYW5kbGVHZW5lcmF0aW9uKTsKLSAgICAvLyBXZSBkbyBub3QgbmVlZCB0byBzeW5jaHJvbml6ZSB0aGlzIGFjY2VzcyB0byBtSGFuZGxlSGVhZGVycyBiZWNhdXNlIGl0IGlzIGNvbnN0YW50IGZvcgotICAgIC8vIHRoZSBsaWZldGltZSBvZiB0aGUgaGFuZGxlLgotICAgIGlmIChpbnB1dEhlYWRlciAhPSBtSGFuZGxlSGVhZGVyc1tpbmRleF0pIHsKLSAgICAgICAgQUxPR0UoIkhhbmRsZVRyYWNrZXI6OmhhbmRsZVRvSW5kZXgoKSBpbnB1dEhlYWRlciA9IDB4JTA4eCAhPSBtSGFuZGxlSGVhZGVyc1slZF0gPSAweCUwOHgiLAotICAgICAgICAgICAgIGlucHV0SGVhZGVyLCBpbmRleCwgbUhhbmRsZUhlYWRlcnNbaW5kZXhdKTsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGFhdWRpb19oYW5kbGVfdD4oQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluZGV4OwotfQotCi1oYW5kbGVfdHJhY2tlcl9hZGRyZXNzX3QgSGFuZGxlVHJhY2tlcjo6Z2V0KGhhbmRsZV90cmFja2VyX3R5cGVfdCB0eXBlLCBhYXVkaW9faGFuZGxlX3QgaGFuZGxlKSBjb25zdAotewotICAgIGlmICghaXNJbml0aWFsaXplZCgpKSB7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgICBoYW5kbGVfdHJhY2tlcl9zbG90X3QgaW5kZXggPSBoYW5kbGVUb0luZGV4KHR5cGUsIGhhbmRsZSk7Ci0gICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgLy8gV2UgZG8gbm90IG5lZWQgdG8gc3luY2hyb25pemUgdGhpcyBhY2Nlc3MgdG8gbUhhbmRsZUhlYWRlcnMgYmVjYXVzZSB0aGlzIHNsb3QKLSAgICAgICAgLy8gaXMgYWxsb2NhdGVkIGFuZCwgdGhlcmVmb3JlLCBub3QgcGFydCBvZiB0aGUgbGlua2VkIGxpc3Qgb2YgZnJlZSBzbG90cy4KLSAgICAgICAgcmV0dXJuIG1IYW5kbGVBZGRyZXNzZXNbaW5kZXhdOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLX0KLQotaGFuZGxlX3RyYWNrZXJfYWRkcmVzc190IEhhbmRsZVRyYWNrZXI6OnJlbW92ZShoYW5kbGVfdHJhY2tlcl90eXBlX3QgdHlwZSwgYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSkgewotICAgIGlmICghaXNJbml0aWFsaXplZCgpKSB7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0KLSAgICBoYW5kbGVfdHJhY2tlcl9zbG90X3QgaW5kZXggPSBoYW5kbGVUb0luZGV4KHR5cGUsaGFuZGxlKTsKLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICBoYW5kbGVfdHJhY2tlcl9hZGRyZXNzX3QgYWRkcmVzcyA9IG1IYW5kbGVBZGRyZXNzZXNbaW5kZXhdOwotCi0gICAgICAgIC8vIEludmFsaWRhdGUgdGhlIGhlYWRlciB0eXBlIGJ1dCBwcmVzZXJ2ZSB0aGUgZ2VuZXJhdGlvbiBjb3VudC4KLSAgICAgICAgaGFuZGxlX3RyYWNrZXJfZ2VuZXJhdGlvbl90IGdlbmVyYXRpb24gPSBtSGFuZGxlSGVhZGVyc1tpbmRleF0gJiBHRU5FUkFUSU9OX01BU0s7Ci0gICAgICAgIGhhbmRsZV90cmFja2VyX2hlYWRlcl90IGlucHV0SGVhZGVyID0gYnVpbGRIZWFkZXIoCi0gICAgICAgICAgICAgICAgKGhhbmRsZV90cmFja2VyX3R5cGVfdCkgSEFORExFX0lOVkFMSURfVFlQRSwgZ2VuZXJhdGlvbik7Ci0gICAgICAgIG1IYW5kbGVIZWFkZXJzW2luZGV4XSA9IGlucHV0SGVhZGVyOwotCi0gICAgICAgIC8vIEFkZCB0aGlzIHNsb3QgdG8gdGhlIGhlYWQgb2YgdGhlIGxpbmtlZCBsaXN0LgotICAgICAgICBtSGFuZGxlQWRkcmVzc2VzW2luZGV4XSA9IG1OZXh0RnJlZUFkZHJlc3M7Ci0gICAgICAgIG1OZXh0RnJlZUFkZHJlc3MgPSAoaGFuZGxlX3RyYWNrZXJfYWRkcmVzc190ICopICZtSGFuZGxlQWRkcmVzc2VzW2luZGV4XTsKLSAgICAgICAgcmV0dXJuIGFkZHJlc3M7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotfQotCi1hYXVkaW9faGFuZGxlX3QgSGFuZGxlVHJhY2tlcjo6YnVpbGRIYW5kbGUoaGFuZGxlX3RyYWNrZXJfaGVhZGVyX3QgdHlwZUdlbmVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV90cmFja2VyX3Nsb3RfdCBpbmRleCkgewotICAgIHJldHVybiAoYWF1ZGlvX2hhbmRsZV90KSgodHlwZUdlbmVyYXRpb24gPDwgR0VORVJBVElPTl9TSElGVCkgfCAoaW5kZXggJiBJTkRFWF9NQVNLKSk7Ci19Ci0KLWhhbmRsZV90cmFja2VyX2hlYWRlcl90IEhhbmRsZVRyYWNrZXI6OmJ1aWxkSGVhZGVyKGhhbmRsZV90cmFja2VyX3R5cGVfdCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlX3RyYWNrZXJfZ2VuZXJhdGlvbl90IGdlbmVyYXRpb24pCi17Ci0gICAgcmV0dXJuIChoYW5kbGVfdHJhY2tlcl9oZWFkZXJfdCkgKCgodHlwZSAmIFRZUEVfTUFTSykgPDwgR0VORVJBVElPTl9TSVpFKQotICAgICAgICB8IChnZW5lcmF0aW9uICYgR0VORVJBVElPTl9NQVNLKSk7Ci19Ci0KLWhhbmRsZV90cmFja2VyX3Nsb3RfdCBIYW5kbGVUcmFja2VyOjpleHRyYWN0SW5kZXgoYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSkKLXsKLSAgICByZXR1cm4gaGFuZGxlICYgSU5ERVhfTUFTSzsKLX0KLQotaGFuZGxlX3RyYWNrZXJfZ2VuZXJhdGlvbl90IEhhbmRsZVRyYWNrZXI6OmV4dHJhY3RHZW5lcmF0aW9uKGFhdWRpb19oYW5kbGVfdCBoYW5kbGUpCi17Ci0gICAgcmV0dXJuIChoYW5kbGUgPj4gR0VORVJBVElPTl9TSElGVCkgJiBHRU5FUkFUSU9OX01BU0s7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvSGFuZGxlVHJhY2tlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0hhbmRsZVRyYWNrZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRjNTFjMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvSGFuZGxlVHJhY2tlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVVRJTElUWV9IQU5ETEVfVFJBQ0tFUl9ICi0jZGVmaW5lIFVUSUxJVFlfSEFORExFX1RSQUNLRVJfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+Ci0KLXR5cGVkZWYgaW50MzJfdCAgYWF1ZGlvX2hhbmRsZV90OwotdHlwZWRlZiBpbnQzMl90ICBoYW5kbGVfdHJhY2tlcl90eXBlX3Q7ICAgICAgIC8vIHdoYXQga2luZCBvZiBoYW5kbGUKLXR5cGVkZWYgaW50MzJfdCAgaGFuZGxlX3RyYWNrZXJfc2xvdF90OyAgICAgICAvLyBpbmRleCBpbiBhbGxvY2F0aW9uIHRhYmxlCi10eXBlZGVmIGludDMyX3QgIGhhbmRsZV90cmFja2VyX2dlbmVyYXRpb25fdDsgLy8gaW5jcmVtZW50ZWQgd2hlbiBzbG90IHVzZWQKLXR5cGVkZWYgdWludDE2X3QgaGFuZGxlX3RyYWNrZXJfaGVhZGVyX3Q7ICAgICAvLyBjb21iaW5lcyB0eXBlIGFuZCBnZW5lcmF0aW9uCi10eXBlZGVmIHZvaWQgICAgKmhhbmRsZV90cmFja2VyX2FkZHJlc3NfdDsgICAgLy8gYWRkcmVzcyBvZiBzb21ldGhpbmcgdGhhdCBpcyBzdG9yZWQgaGVyZQotCi0jZGVmaW5lIEhBTkRMRV9UUkFDS0VSX01BWF9UWVBFUyAgICAoMSA8PCAzKQotI2RlZmluZSBIQU5ETEVfVFJBQ0tFUl9NQVhfSEFORExFUyAgKDEgPDwgMTYpCi0KLS8qKgotICogUmVwcmVzZW50IE9iamVjdHMgdXNpbmcgYW4gaW50ZWdlciBoYW5kbGUgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIEphdmEuCi0gKiBUaGlzIGFsc28gbWFrZXMgdGhlICdDJyBBQkkgbW9yZSByb2J1c3QuCi0gKgotICogTm90ZSB0aGF0IHRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gYSBzaW5nbGUgdGhyZWFkLgotICogSWYgeW91IGNhbGwgaXQgZnJvbSBtb3JlIHRoYW4gb25lIHRocmVhZCB0aGVuIHlvdSBuZWVkIHRvIHVzZSB5b3VyIG93biBtdXRleC4KLSAqLwotY2xhc3MgSGFuZGxlVHJhY2tlciB7Ci0KLXB1YmxpYzoKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbWF4SGFuZGxlcyBjYW5ub3QgZXhjZWVkIEhBTkRMRV9UUkFDS0VSX01BWF9IQU5ETEVTCi0gICAgICovCi0gICAgSGFuZGxlVHJhY2tlcih1aW50MzJfdCBtYXhIYW5kbGVzID0gMjU2KTsKLSAgICB2aXJ0dWFsIH5IYW5kbGVUcmFja2VyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBEb24ndCB1c2UgaWYgdGhpcyByZXR1cm5zIGZhbHNlOwotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgaW50ZXJuYWwgYWxsb2NhdGlvbiBzdWNjZWVkZWQKLSAgICAgKi8KLSAgICBib29sIGlzSW5pdGlhbGl6ZWQoKSBjb25zdDsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgSGFuZGxlVHJhY2tlciBpbmZvcm1hdGlvbi4KLSAgICAgKgotICAgICAqIFdpbGwgYXR0ZW1wdCB0byBnZXQgdGhlIG9iamVjdCBsb2NrLCBidXQgd2lsbCBwcm9jZWVkCi0gICAgICogZXZlbiBpZiBpdCBjYW5ub3QuCi0gICAgICoKLSAgICAgKiBFYWNoIGxpbmUgb2YgaW5mb3JtYXRpb24gZW5kcyB3aXRoIGEgbmV3bGluZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBIYW5kbGVUcmFja2VyIGluZm8uCi0gICAgICovCi0gICAgc3RkOjpzdHJpbmcgZHVtcCgpIGNvbnN0OwotCi0gICAgLyoqCi0gICAgICogU3RvcmUgYSBwb2ludGVyIGFuZCByZXR1cm4gYSBoYW5kbGUgdGhhdCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSB0aGUgcG9pbnRlci4KLSAgICAgKgotICAgICAqIEl0IGlzIHNhZmUgdG8gY2FsbCBwdXQoKSBvciByZW1vdmUoKSBmcm9tIG11bHRpcGxlIHRocmVhZHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXhwZWN0ZWRUeXBlIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgdG8gYmUgdHJhY2tlZAotICAgICAqIEBwYXJhbSBhZGRyZXNzIHBvaW50ZXIgdG8gYmUgY29udmVydGVkIHRvIGEgaGFuZGxlCi0gICAgICogQHJldHVybiBhIHZhbGlkIGhhbmRsZSBvciBhIG5lZ2F0aXZlIGVycm9yCi0gICAgICovCi0gICAgYWF1ZGlvX2hhbmRsZV90IHB1dChoYW5kbGVfdHJhY2tlcl90eXBlX3QgZXhwZWN0ZWRUeXBlLCBoYW5kbGVfdHJhY2tlcl9hZGRyZXNzX3QgYWRkcmVzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG9yaWdpbmFsIHBvaW50ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBoYW5kbGUuCi0gICAgICogVGhlIGhhbmRsZSB3aWxsIGJlIHZhbGlkYXRlZCB0byBwcmV2ZW50IHN0YWxlIGhhbmRsZXMgZnJvbSBiZWluZyByZXVzZWQuCi0gICAgICogTm90ZSB0aGF0IHRoZSB2YWxpZGF0aW9uIGlzIGRlc2lnbmVkIHRvIHByZXZlbnQgY29tbW9uIGNvZGluZyBlcnJvcnMgYW5kIG5vdAotICAgICAqIHRvIHByZXZlbnQgZGVsaWJlcmF0ZSBoYWNraW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIGV4cGVjdGVkVHlwZSBzaG91bGRtYXRjaCB0aGUgdHlwZSB3ZSBwYXNzZWQgdG8gcHV0KCkKLSAgICAgKiBAcGFyYW0gaGFuZGxlIHRvIGJlIGNvbnZlcnRlZCB0byBhIHBvaW50ZXIKLSAgICAgKiBAcmV0dXJuIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIGhhbmRsZSBvciBudWxscHRyCi0gICAgICovCi0gICAgaGFuZGxlX3RyYWNrZXJfYWRkcmVzc190IGdldChoYW5kbGVfdHJhY2tlcl90eXBlX3QgZXhwZWN0ZWRUeXBlLCBhYXVkaW9faGFuZGxlX3QgaGFuZGxlKSBjb25zdDsKLQotICAgIC8qKgotICAgICAqIEZyZWUgdXAgdGhlIHN0b3JhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBoYW5kbGUuCi0gICAgICogU3Vic2VxdWVudCBhdHRlbXB0cyB0byB1c2UgdGhlIGhhbmRsZSB3aWxsIGZhaWwuCi0gICAgICoKLSAgICAgKiBEbyBOT1QgcmVtb3ZlKCkgYSBoYW5kbGUgd2hpbGUgZ2V0KCkgaXMgYmVpbmcgY2FsbGVkIGZvciB0aGUgc2FtZSBoYW5kbGUgZnJvbSBhbm90aGVyIHRocmVhZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHBlY3RlZFR5cGUgc2hvdWxkbWF0Y2ggdGhlIHR5cGUgd2UgcGFzc2VkIHRvIHB1dCgpCi0gICAgICogQHBhcmFtIGhhbmRsZSB0byBiZSByZW1vdmVkIGZyb20gdHJhY2tpbmcKLSAgICAgKiBAcmV0dXJuIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIGhhbmRsZSBvciBudWxscHRyIGlmIG5vdCBmb3VuZAotICAgICAqLwotICAgIGhhbmRsZV90cmFja2VyX2FkZHJlc3NfdCByZW1vdmUoaGFuZGxlX3RyYWNrZXJfdHlwZV90IGV4cGVjdGVkVHlwZSwgYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSk7Ci0KLXByaXZhdGU6Ci0gICAgY29uc3QgaW50MzJfdCAgICAgICAgICAgICAgIG1NYXhIYW5kbGVDb3VudDsgICAvLyBzaXplIG9mIGFycmF5Ci0gICAgLy8gVGhpcyBhZGRyZXNzIGlzIGNvbnN0IGFmdGVyIGluaXRpYWxpemF0aW9uLgotICAgIGhhbmRsZV90cmFja2VyX2FkZHJlc3NfdCAgKiBtSGFuZGxlQWRkcmVzc2VzOyAgLy8gYWRkcmVzcyBvZiBvYmplY3RzIG9yIGEgZnJlZSBsaW5rZWQgbGlzdCBub2RlCi0gICAgLy8gVGhpcyBhZGRyZXNzIGlzIGNvbnN0IGFmdGVyIGluaXRpYWxpemF0aW9uLgotICAgIGhhbmRsZV90cmFja2VyX2hlYWRlcl90ICAgKiBtSGFuZGxlSGVhZGVyczsgICAgLy8gY29tYmluYXRpb24gb2YgdHlwZSBhbmQgZ2VuZXJhdGlvbgotICAgIC8vIGhlYWQgb2YgdGhlIGxpbmtlZCBsaXN0IG9mIGZyZWUgbm9kZXMgaW4gbUhhbmRsZUFkZHJlc3NlcwotICAgIGhhbmRsZV90cmFja2VyX2FkZHJlc3NfdCAgKiBtTmV4dEZyZWVBZGRyZXNzOwotCi0gICAgLy8gVGhpcyBNdXRleCBwcm90ZWN0cyB0aGUgbGlua2VkIGxpc3Qgb2YgZnJlZSBub2Rlcy4KLSAgICAvLyBUaGUgbGlzdCBpcyBtYW5hZ2VkIHVzaW5nIG1IYW5kbGVBZGRyZXNzZXMgYW5kIG1OZXh0RnJlZUFkZHJlc3MuCi0gICAgLy8gVGhlIGRhdGEgaW4gbUhhbmRsZUhlYWRlcnMgaXMgb25seSBjaGFuZ2VkIGJ5IHB1dCgpIGFuZCByZW1vdmUoKS4KLSAgICBtdXRhYmxlIGFuZHJvaWQ6Ok11dGV4ICAgICAgbUxvY2s7Ci0KLSAgICAvKioKLSAgICAgKiBQdWxsIHNsb3Qgb2ZmIG9mIGEgbGlzdCBvZiBlbXB0eSBzbG90cy4KLSAgICAgKiBAcmV0dXJuIGluZGV4IG9yIGEgbmVnYXRpdmUgZXJyb3IKLSAgICAgKi8KLSAgICBoYW5kbGVfdHJhY2tlcl9zbG90X3QgYWxsb2NhdGVTbG90X2woKTsKLQotICAgIC8qKgotICAgICAqIEluY3JlbWVudCB0aGUgZ2VuZXJhdGlvbiBmb3IgdGhlIHNsb3QsIGF2b2lkaW5nIHplcm8uCi0gICAgICovCi0gICAgaGFuZGxlX3RyYWNrZXJfZ2VuZXJhdGlvbl90IG5leHRHZW5lcmF0aW9uX2woaGFuZGxlX3RyYWNrZXJfc2xvdF90IGluZGV4KTsKLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIHRoZSBoYW5kbGUgYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBpbmRleC4KLSAgICAgKiBAcmV0dXJuIHNsb3QgaW5kZXggb3IgYSBuZWdhdGl2ZSBlcnJvcgotICAgICAqLwotICAgIGhhbmRsZV90cmFja2VyX3Nsb3RfdCBoYW5kbGVUb0luZGV4KGFhdWRpb19oYW5kbGVfdCBoYW5kbGUsIGhhbmRsZV90cmFja2VyX3R5cGVfdCB0eXBlKSBjb25zdDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIGhhbmRsZSBmcm9tIGEgaGVhZGVyIGFuZCBhbiBpbmRleC4KLSAgICAgKiBAcGFyYW0gaGVhZGVyIGNvbWJpbmF0aW9uIG9mIGEgdHlwZSBhbmQgYSBnZW5lcmF0aW9uCi0gICAgICogQHBhcmFtIGluZGV4IHNsb3QgaW5kZXggcmV0dXJuZWQgZnJvbSBhbGxvY2F0ZVNsb3QKLSAgICAgKiBAcmV0dXJuIGhhbmRsZSBvciBhIG5lZ2F0aXZlIGVycm9yCi0gICAgICovCi0gICAgc3RhdGljIGFhdWRpb19oYW5kbGVfdCBidWlsZEhhbmRsZShoYW5kbGVfdHJhY2tlcl9oZWFkZXJfdCBoZWFkZXIsIGhhbmRsZV90cmFja2VyX3Nsb3RfdCBpbmRleCk7Ci0KLSAgICAvKioKLSAgICAgKiBDb21iaW5lIGEgdHlwZSBhbmQgYSBnZW5lcmF0aW9uIGZpZWxkIGludG8gYSBoZWFkZXIuCi0gICAgICovCi0gICAgc3RhdGljIGhhbmRsZV90cmFja2VyX2hlYWRlcl90IGJ1aWxkSGVhZGVyKGhhbmRsZV90cmFja2VyX3R5cGVfdCB0eXBlLAotICAgICAgICAgICAgICAgIGhhbmRsZV90cmFja2VyX2dlbmVyYXRpb25fdCBnZW5lcmF0aW9uKTsKLQotICAgIC8qKgotICAgICAqIEV4dHJhY3QgdGhlIGluZGV4IGZyb20gYSBoYW5kbGUuCi0gICAgICogRG9lcyBub3QgdmFsaWRhdGUgdGhlIGhhbmRsZS4KLSAgICAgKiBAcmV0dXJuIGluZGV4IGFzc29jaWF0ZWQgd2l0aCBhIGhhbmRsZQotICAgICAqLwotICAgIHN0YXRpYyBoYW5kbGVfdHJhY2tlcl9zbG90X3QgZXh0cmFjdEluZGV4KGFhdWRpb19oYW5kbGVfdCBoYW5kbGUpOwotCi0gICAgLyoqCi0gICAgICogRXh0cmFjdCB0aGUgZ2VuZXJhdGlvbiBmcm9tIGEgaGFuZGxlLgotICAgICAqIERvZXMgbm90IHZhbGlkYXRlIHRoZSBoYW5kbGUuCi0gICAgICogQHJldHVybiBnZW5lcmF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIGhhbmRsZQotICAgICAqLwotICAgIHN0YXRpYyBoYW5kbGVfdHJhY2tlcl9nZW5lcmF0aW9uX3QgZXh0cmFjdEdlbmVyYXRpb24oYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSk7Ci0KLX07Ci0KLSNlbmRpZiAvL1VUSUxJVFlfSEFORExFX1RSQUNLRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L01vbm90b25pY0NvdW50ZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9Nb25vdG9uaWNDb3VudGVyLmgKaW5kZXggODFkN2Y4OS4uMTNjOTJhMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L01vbm90b25pY0NvdW50ZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTW9ub3RvbmljQ291bnRlci5oCkBAIC00MSw2ICs0MSwxMyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIHNldCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgY291bnRlcgorICAgICAqLworICAgIHZvaWQgc2V0KGludDY0X3QgY291bnRlcikgeworICAgICAgICBtQ291bnRlcjY0ID0gY291bnRlcjsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBBZHZhbmNlIHRoZSBjb3VudGVyIGlmIGRlbHRhIGlzIHBvc2l0aXZlLgogICAgICAqIEByZXR1cm4gY3VycmVudCB2YWx1ZSBvZiB0aGUgY291bnRlcgogICAgICAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5icAppbmRleCAwNTEzNWRmLi4xOWM1NmQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5icApAQCAtNywxMyArNyw2IEBACiB9CiAKIGNjX3Rlc3QgewotICAgIG5hbWU6ICJ0ZXN0X2hhbmRsZV90cmFja2VyIiwKLSAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKLSAgICBzcmNzOiBbInRlc3RfaGFuZGxlX3RyYWNrZXIuY3BwIl0sCi0gICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvIl0sCi19Ci0KLWNjX3Rlc3QgewogICAgIG5hbWU6ICJ0ZXN0X2FhdWRpb19tYXJzaGFsbGluZyIsCiAgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCiAgICAgc3JjczogWyJ0ZXN0X21hcnNoYWxsaW5nLmNwcCJdLApAQCAtMzMsNiArMjYsMTMgQEAKIH0KIAogY2NfdGVzdCB7CisgICAgbmFtZTogInRlc3RfdGltZXN0YW1wcyIsCisgICAgc3JjczogWyJ0ZXN0X3RpbWVzdGFtcHMuY3BwIl0sCisgICAgaGVhZGVyX2xpYnM6IFsibGliYWF1ZGlvX2V4YW1wbGVfdXRpbHMiXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKK30KKworY2NfdGVzdCB7CiAgICAgbmFtZTogInRlc3RfbGluZWFyX3JhbXAiLAogICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsidGVzdF9saW5lYXJfcmFtcC5jcHAiXSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2hhbmRsZV90cmFja2VyLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2hhbmRsZV90cmFja2VyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRkYjQ3YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9oYW5kbGVfdHJhY2tlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFVuaXQgdGVzdHMgZm9yIEFBdWRpbyBIYW5kbGUgVHJhY2tlcgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KLSNpbmNsdWRlICJ1dGlsaXR5L0hhbmRsZVRyYWNrZXIuaCIKLQotLy8gVGVzdCBhZGRpbmcgb25lIGFkZHJlc3MuCi1URVNUKHRlc3RfaGFuZGxlX3RyYWNrZXIsIGFhdWRpb19oYW5kbGVfdHJhY2tlcikgewotICAgIGNvbnN0IGludCBNQVhfSEFORExFUyA9IDQ7Ci0gICAgSGFuZGxlVHJhY2tlciB0cmFja2VyKE1BWF9IQU5ETEVTKTsKLSAgICBoYW5kbGVfdHJhY2tlcl90eXBlX3QgdHlwZSA9IDM7IC8vIGFyYml0cmFyeSBnZW5lcmljIHR5cGUKLSAgICBpbnQgZGF0YTsgLy8gc29tZXRoaW5nIHRoYXQgaGFzIGFuIGFkZHJlc3Mgd2UgY2FuIHVzZQotICAgIGhhbmRsZV90cmFja2VyX2FkZHJlc3NfdCBmb3VuZDsKLQotICAgIC8vIHJlcGVhdCB0aGUgdGVzdCBzZXZlcmFsIHRpbWVzIHRvIHNlZSBpZiBpdCBicmVha3MKLSAgICBjb25zdCBpbnQgU0VWRVJBTCA9IDU7IC8vIGFyYml0cmFyeQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0VWRVJBTDsgaSsrKSB7Ci0gICAgICAgIC8vIHNob3VsZCBmYWlsIHRvIGZpbmQgYSBib2d1cyBoYW5kbGUKLSAgICAgICAgZm91bmQgPSB0cmFja2VyLmdldCh0eXBlLCAwKTsgIC8vIGJhZCBoYW5kbGUKLSAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIGZvdW5kKTsKLQotICAgICAgICAvLyBjcmVhdGUgYSB2YWxpZCBoYW5kbGUgYW5kIHVzZSBpdCB0byBsb29rdXAgdGhlIG9iamVjdCBhZ2FpbgotICAgICAgICBhYXVkaW9faGFuZGxlX3QgZGF0YUhhbmRsZSA9IHRyYWNrZXIucHV0KHR5cGUsICZkYXRhKTsKLSAgICAgICAgQVNTRVJUX1RSVUUoZGF0YUhhbmRsZSA+IDApOwotICAgICAgICBmb3VuZCA9IHRyYWNrZXIuZ2V0KHR5cGUsIGRhdGFIYW5kbGUpOwotICAgICAgICBFWFBFQ1RfRVEoJmRhdGEsIGZvdW5kKTsKLSAgICAgICAgZm91bmQgPSB0cmFja2VyLmdldCh0eXBlLCAwKTsgLy8gYmFkIGhhbmRsZQotICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgZm91bmQpOwotCi0gICAgICAgIC8vIHdyb25nIHR5cGUKLSAgICAgICAgZm91bmQgPSB0cmFja2VyLmdldCh0eXBlKzEsIGRhdGFIYW5kbGUpOwotICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgZm91bmQpOwotCi0gICAgICAgIC8vIHJlbW92ZSBmcm9tIHN0b3JhZ2UKLSAgICAgICAgZm91bmQgPSB0cmFja2VyLnJlbW92ZSh0eXBlLCBkYXRhSGFuZGxlKTsKLSAgICAgICAgRVhQRUNUX0VRKCZkYXRhLCBmb3VuZCk7Ci0gICAgICAgIC8vIHNob3VsZCBmYWlsIHRoZSBzZWNvbmQgdGltZQotICAgICAgICBmb3VuZCA9IHRyYWNrZXIucmVtb3ZlKHR5cGUsIGRhdGFIYW5kbGUpOwotICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgZm91bmQpOwotICAgIH0KLX0KLQotLy8gVGVzdCBmaWxsaW5nIHRoZSB0cmFja2VyLgotVEVTVCh0ZXN0X2hhbmRsZV90cmFja2VyLCBhYXVkaW9fZnVsbF91cCkgewotICAgIGNvbnN0IGludCBNQVhfSEFORExFUyA9IDU7Ci0gICAgSGFuZGxlVHJhY2tlciB0cmFja2VyKE1BWF9IQU5ETEVTKTsKLSAgICBoYW5kbGVfdHJhY2tlcl90eXBlX3QgdHlwZSA9IDQ7IC8vIGFyYml0cmFyeSBnZW5lcmljIHR5cGUKLSAgICBpbnQgZGF0YVtNQVhfSEFORExFU107Ci0gICAgYWF1ZGlvX2hhbmRsZV90IGhhbmRsZXNbTUFYX0hBTkRMRVNdOwotICAgIGhhbmRsZV90cmFja2VyX2FkZHJlc3NfdCBmb3VuZDsKLQotICAgIC8vIHJlcGVhdCB0aGUgdGVzdCBzZXZlcmFsIHRpbWVzIHRvIHNlZSBpZiBpdCBicmVha3MKLSAgICBjb25zdCBpbnQgU0VWRVJBTCA9IDU7IC8vIGFyYml0cmFyeQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0VWRVJBTDsgaSsrKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0hBTkRMRVM7IGkrKykgewotICAgICAgICAgICAgLy8gYWRkIGEgaGFuZGxlCi0gICAgICAgICAgICBoYW5kbGVzW2ldID0gdHJhY2tlci5wdXQodHlwZSwgJmRhdGFbaV0pOwotICAgICAgICAgICAgQVNTRVJUX1RSVUUoaGFuZGxlc1tpXSA+IDApOwotICAgICAgICAgICAgZm91bmQgPSB0cmFja2VyLmdldCh0eXBlLCBoYW5kbGVzW2ldKTsKLSAgICAgICAgICAgIEVYUEVDVF9FUSgmZGF0YVtpXSwgZm91bmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm93IHRoYXQgaXQgaXMgZnVsbCwgdHJ5IHRvIGFkZCBvbmUgbW9yZS4KLSAgICAgICAgYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSA9IHRyYWNrZXIucHV0KHR5cGUsICZkYXRhWzBdKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoaGFuZGxlIDwgMCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSEFORExFUzsgaSsrKSB7Ci0gICAgICAgICAgICAvLyBsb29rIHVwIGVhY2ggaGFuZGxlCi0gICAgICAgICAgICBmb3VuZCA9IHRyYWNrZXIuZ2V0KHR5cGUsIGhhbmRsZXNbaV0pOwotICAgICAgICAgICAgRVhQRUNUX0VRKCZkYXRhW2ldLCBmb3VuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZW1vdmUgb25lIGZyb20gc3RvcmFnZQotICAgICAgICBmb3VuZCA9IHRyYWNrZXIucmVtb3ZlKHR5cGUsIGhhbmRsZXNbMl0pOwotICAgICAgICBFWFBFQ1RfRVEoJmRhdGFbMl0sIGZvdW5kKTsKLSAgICAgICAgLy8gbm93IHRyeSB0byBsb29rIHVwIHRoZSBzYW1lIGhhbmRsZSBhbmQgZmFpbAotICAgICAgICBmb3VuZCA9IHRyYWNrZXIuZ2V0KHR5cGUsIGhhbmRsZXNbMl0pOwotICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgZm91bmQpOwotCi0gICAgICAgIC8vIGFkZCB0aGF0IHNhbWUgb25lIGJhY2sKLSAgICAgICAgaGFuZGxlID0gdHJhY2tlci5wdXQodHlwZSwgJmRhdGFbMl0pOwotICAgICAgICBBU1NFUlRfVFJVRShoYW5kbGUgPiAwKTsKLSAgICAgICAgZm91bmQgPSB0cmFja2VyLmdldCh0eXBlLCBoYW5kbGUpOwotICAgICAgICBFWFBFQ1RfRVEoJmRhdGFbMl0sIGZvdW5kKTsKLSAgICAgICAgLy8gbm93IHVzZSBhIHN0YWxlIGhhbmRsZSBhZ2FpbiB3aXRoIGEgdmFsaWQgaW5kZXggYW5kIGZhaWwKLSAgICAgICAgZm91bmQgPSB0cmFja2VyLmdldCh0eXBlLCBoYW5kbGVzWzJdKTsKLSAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIGZvdW5kKTsKLQotICAgICAgICAvLyByZW1vdmUgdGhlbSBhbGwKLSAgICAgICAgaGFuZGxlc1syXSA9IGhhbmRsZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSEFORExFUzsgaSsrKSB7Ci0gICAgICAgICAgICAvLyBsb29rIHVwIGVhY2ggaGFuZGxlCi0gICAgICAgICAgICBmb3VuZCA9IHRyYWNrZXIucmVtb3ZlKHR5cGUsIGhhbmRsZXNbaV0pOwotICAgICAgICAgICAgRVhQRUNUX0VRKCZkYXRhW2ldLCBmb3VuZCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF90aW1lc3RhbXBzLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3RpbWVzdGFtcHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1N2YwYTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF90aW1lc3RhbXBzLmNwcApAQCAtMCwwICsxLDMzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFBsYXkgc2lsZW5jZSBhbmQgcmVjb3ZlciBmcm9tIGRlYWQgc2VydmVycyBvciBkaXNjb25uZWN0ZWQgZGV2aWNlcy4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpb1Rlc3RpbmcuaD4KKyNpbmNsdWRlICJ1dGlscy9BQXVkaW9FeGFtcGxlVXRpbHMuaCIKKyNpbmNsdWRlICIuLi9leGFtcGxlcy91dGlscy9BQXVkaW9FeGFtcGxlVXRpbHMuaCIKKworLy8gQXJiaXRyYXJ5IHBlcmlvZCBmb3IgZ2xpdGNoZXMsIG9uY2UgcGVyIHNlY29uZCBhdCA0ODAwMCBIei4KKyNkZWZpbmUgRk9SQ0VEX1VOREVSUlVOX1BFUklPRF9GUkFNRVMgICAgNDgwMDAKKy8vIEhvdyBsb25nIHRvIHNsZWVwIGluIGEgY2FsbGJhY2sgdG8gY2F1c2UgYW4gaW50ZW50aW9uYWwgZ2xpdGNoLiBGb3IgdGVzdGluZy4KKyNkZWZpbmUgRk9SQ0VEX1VOREVSUlVOX1NMRUVQX01JQ1JPUyAgICAgKDEwICogMTAwMCkKKworI2RlZmluZSBNQVhfVElNRVNUQU1QUyAgICAgICAgICAxMDAwCisKKyNkZWZpbmUgREVGQVVMVF9USU1FT1VUX05BTk9TICAgKChpbnQ2NF90KTEwMDAwMDAwMDApCisKKyNkZWZpbmUgTlVNX1NFQ09ORFMgICAgICAgICAgICAgMQorI2RlZmluZSBOVU1fTE9PUFMgICAgICAgICAgICAgICA0CisKK3R5cGVkZWYgc3RydWN0IFRpbWVzdGFtcEluZm8geworICAgIGludDY0X3QgICAgICAgICBmcmFtZXNUb3RhbDsKKyAgICBpbnQ2NF90ICAgICAgICAgYXBwUG9zaXRpb247IC8vIGZyYW1lcworICAgIGludDY0X3QgICAgICAgICBhcHBOYW5vc2Vjb25kczsKKyAgICBpbnQ2NF90ICAgICAgICAgdGltZXN0YW1wUG9zaXRpb247ICAvLyBmcmFtZXMKKyAgICBpbnQ2NF90ICAgICAgICAgdGltZXN0YW1wTmFub3M7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdDsKK30gVGltZXN0YW1wSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgVGltZXN0YW1wQ2FsbGJhY2tEYXRhX3MgeworICAgIFRpbWVzdGFtcEluZm8gIHRpbWVzdGFtcHNbTUFYX1RJTUVTVEFNUFNdOworICAgIGludDY0X3QgICAgICAgIGZyYW1lc1RvdGFsID0gMDsKKyAgICBpbnQ2NF90ICAgICAgICBuZXh0RnJhbWVUb0dsaXRjaCA9IEZPUkNFRF9VTkRFUlJVTl9QRVJJT0RfRlJBTUVTOworICAgIGludDMyX3QgICAgICAgIHRpbWVzdGFtcENvdW50ID0gMDsgLy8gaW4gdGltZXN0YW1wcworICAgIGJvb2wgICAgICAgICAgIGZvcmNlVW5kZXJydW5zID0gZmFsc2U7Cit9IFRpbWVzdGFtcENhbGxiYWNrRGF0YV90OworCisvLyBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGZpbGxzIHRoZSBhdWRpbyBvdXRwdXQgYnVmZmVyLgorYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgdGltZXN0YW1wRGF0YUNhbGxiYWNrUHJvYygKKyAgICAgICAgQUF1ZGlvU3RyZWFtICpzdHJlYW0sCisgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICB2b2lkICphdWRpb0RhdGEgX191bnVzZWQsCisgICAgICAgIGludDMyX3QgbnVtRnJhbWVzCispIHsKKworICAgIC8vIHNob3VsZCBub3QgaGFwcGVuIGJ1dCBqdXN0IGluIGNhc2UuLi4KKyAgICBpZiAodXNlckRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICBwcmludGYoIkVSUk9SIC0gU2ltcGxlUGxheWVyRGF0YUNhbGxiYWNrUHJvYyBuZWVkcyB1c2VyRGF0YVxuIik7CisgICAgICAgIHJldHVybiBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1A7CisgICAgfQorICAgIFRpbWVzdGFtcENhbGxiYWNrRGF0YV90ICp0aW1lc3RhbXBEYXRhID0gKFRpbWVzdGFtcENhbGxiYWNrRGF0YV90ICopIHVzZXJEYXRhOworCisgICAgYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiA9IEFBdWRpb1N0cmVhbV9nZXREaXJlY3Rpb24oc3RyZWFtKTsKKyAgICBpZiAoZGlyZWN0aW9uID09IEFBVURJT19ESVJFQ1RJT05fSU5QVVQpIHsKKyAgICAgICAgdGltZXN0YW1wRGF0YS0+ZnJhbWVzVG90YWwgKz0gbnVtRnJhbWVzOworICAgIH0KKworICAgIGlmICh0aW1lc3RhbXBEYXRhLT5mb3JjZVVuZGVycnVucykgeworICAgICAgICBpZiAodGltZXN0YW1wRGF0YS0+ZnJhbWVzVG90YWwgPiB0aW1lc3RhbXBEYXRhLT5uZXh0RnJhbWVUb0dsaXRjaCkgeworICAgICAgICAgICAgdXNsZWVwKEZPUkNFRF9VTkRFUlJVTl9TTEVFUF9NSUNST1MpOworICAgICAgICAgICAgcHJpbnRmKCJTaW11bGF0ZSBnbGl0Y2ggYXQgJWxsZFxuIiwgKGxvbmcgbG9uZykgdGltZXN0YW1wRGF0YS0+ZnJhbWVzVG90YWwpOworICAgICAgICAgICAgdGltZXN0YW1wRGF0YS0+bmV4dEZyYW1lVG9HbGl0Y2ggKz0gRk9SQ0VEX1VOREVSUlVOX1BFUklPRF9GUkFNRVM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodGltZXN0YW1wRGF0YS0+dGltZXN0YW1wQ291bnQgPCBNQVhfVElNRVNUQU1QUykgeworICAgICAgICBUaW1lc3RhbXBJbmZvICp0aW1lc3RhbXAgPSAmdGltZXN0YW1wRGF0YS0+dGltZXN0YW1wc1t0aW1lc3RhbXBEYXRhLT50aW1lc3RhbXBDb3VudF07CisgICAgICAgIHRpbWVzdGFtcC0+cmVzdWx0ID0gQUF1ZGlvU3RyZWFtX2dldFRpbWVzdGFtcChzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTE9DS19NT05PVE9OSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZXN0YW1wLT50aW1lc3RhbXBQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lc3RhbXAtPnRpbWVzdGFtcE5hbm9zKTsKKyAgICAgICAgdGltZXN0YW1wLT5mcmFtZXNUb3RhbCA9IHRpbWVzdGFtcERhdGEtPmZyYW1lc1RvdGFsOworICAgICAgICB0aW1lc3RhbXAtPmFwcFBvc2l0aW9uID0gKGRpcmVjdGlvbiA9PSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCkKKyAgICAgICAgICAgICAgICA/IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKHN0cmVhbSkKKyAgICAgICAgICAgICAgICA6IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKHN0cmVhbSk7CisgICAgICAgIHRpbWVzdGFtcC0+YXBwTmFub3NlY29uZHMgPSBnZXROYW5vc2Vjb25kcygpOworICAgICAgICB0aW1lc3RhbXBEYXRhLT50aW1lc3RhbXBDb3VudCsrOworICAgIH0KKworICAgIGlmIChkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpIHsKKyAgICAgICAgdGltZXN0YW1wRGF0YS0+ZnJhbWVzVG90YWwgKz0gbnVtRnJhbWVzOworICAgIH0KKyAgICByZXR1cm4gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9DT05USU5VRTsKK30KKworc3RhdGljIFRpbWVzdGFtcENhbGxiYWNrRGF0YV90IHNUaW1lc3RhbXBEYXRhOworCitzdGF0aWMgYWF1ZGlvX3Jlc3VsdF90IHRlc3RUaW1lU3RhbXBzKGFhdWRpb19wb2xpY3lfdCBtbWFwUG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmb3JtYW5jZU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSB7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKKworICAgIGludDMyX3QgZnJhbWVzUGVyQnVyc3QgPSAwOworICAgIGludDMyX3QgYWN0dWFsQ2hhbm5lbENvdW50ID0gMDsKKyAgICBpbnQzMl90IGFjdHVhbFNhbXBsZVJhdGUgPSAwOworICAgIGludDMyX3Qgb3JpZ2luYWxCdWZmZXJTaXplID0gMDsKKyAgICBpbnQzMl90IHJlcXVlc3RlZEJ1ZmZlclNpemUgPSAwOworICAgIGludDMyX3QgZmluYWxCdWZmZXJTaXplID0gMDsKKyAgICBhYXVkaW9fZm9ybWF0X3QgYWN0dWFsRGF0YUZvcm1hdCA9IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUOworICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBhY3R1YWxTaGFyaW5nTW9kZSA9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOworICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBhY3R1YWxQZXJmb3JtYW5jZU1vZGUgPSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FOworCisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlciAqYWF1ZGlvQnVpbGRlciA9IG51bGxwdHI7CisgICAgQUF1ZGlvU3RyZWFtICphYXVkaW9TdHJlYW0gPSBudWxscHRyOworCisgICAgbWVtc2V0KCZzVGltZXN0YW1wRGF0YSwgMCwgc2l6ZW9mKHNUaW1lc3RhbXBEYXRhKSk7CisKKyAgICBwcmludGYoIi0tLS0tLS0tLS0tLSB0ZXN0VGltZVN0YW1wcyhwb2xpY3kgPSAlZCwgc2hhcmluZyA9ICVzLCBwZXJmID0gJXMsIGRpciA9ICVzKSAtLS0tLS0tLS0tLVxuIiwKKyAgICAgICAgICAgbW1hcFBvbGljeSwKKyAgICAgICAgICAgZ2V0U2hhcmluZ01vZGVUZXh0KHNoYXJpbmdNb2RlKSwKKyAgICAgICAgICAgZ2V0UGVyZm9ybWFuY2VNb2RlVGV4dChwZXJmb3JtYW5jZU1vZGUpLAorICAgICAgICAgICBnZXREaXJlY3Rpb25UZXh0KGRpcmVjdGlvbikpOworCisgICAgQUF1ZGlvX3NldE1NYXBQb2xpY3kobW1hcFBvbGljeSk7CisKKyAgICAvLyBVc2UgYW4gQUF1ZGlvU3RyZWFtQnVpbGRlciB0byBjb250YWluIHJlcXVlc3RlZCBwYXJhbWV0ZXJzLgorICAgIHJlc3VsdCA9IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCZhYXVkaW9CdWlsZGVyKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICBwcmludGYoIkFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyIHJldHVybmVkICVzIiwKKyAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9CisKKyAgICAvLyBSZXF1ZXN0IHN0cmVhbSBwcm9wZXJ0aWVzLgorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Rm9ybWF0KGFhdWRpb0J1aWxkZXIsIEFBVURJT19GT1JNQVRfUENNX0kxNik7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTaGFyaW5nTW9kZShhYXVkaW9CdWlsZGVyLCBzaGFyaW5nTW9kZSk7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRQZXJmb3JtYW5jZU1vZGUoYWF1ZGlvQnVpbGRlciwgcGVyZm9ybWFuY2VNb2RlKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERpcmVjdGlvbihhYXVkaW9CdWlsZGVyLCBkaXJlY3Rpb24pOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGF0YUNhbGxiYWNrKGFhdWRpb0J1aWxkZXIsIHRpbWVzdGFtcERhdGFDYWxsYmFja1Byb2MsICZzVGltZXN0YW1wRGF0YSk7CisKKyAgICAvLyBDcmVhdGUgYW4gQUF1ZGlvU3RyZWFtIHVzaW5nIHRoZSBCdWlsZGVyLgorICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbShhYXVkaW9CdWlsZGVyLCAmYWF1ZGlvU3RyZWFtKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICBwcmludGYoIkFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSByZXR1cm5lZCAlcyIsCisgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICAgICAgZ290byBmaW5pc2g7CisgICAgfQorCisgICAgLy8gQ2hlY2sgdG8gc2VlIHdoYXQga2luZCBvZiBzdHJlYW0gd2UgYWN0dWFsbHkgZ290LgorICAgIGFjdHVhbFNhbXBsZVJhdGUgPSBBQXVkaW9TdHJlYW1fZ2V0U2FtcGxlUmF0ZShhYXVkaW9TdHJlYW0pOworICAgIGFjdHVhbENoYW5uZWxDb3VudCA9IEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQoYWF1ZGlvU3RyZWFtKTsKKyAgICBhY3R1YWxEYXRhRm9ybWF0ID0gQUF1ZGlvU3RyZWFtX2dldEZvcm1hdChhYXVkaW9TdHJlYW0pOworCisgICAgYWN0dWFsU2hhcmluZ01vZGUgPSBBQXVkaW9TdHJlYW1fZ2V0U2hhcmluZ01vZGUoYWF1ZGlvU3RyZWFtKTsKKyAgICBpZiAoYWN0dWFsU2hhcmluZ01vZGUgIT0gc2hhcmluZ01vZGUpIHsKKyAgICAgICAgcHJpbnRmKCJkaWQgbm90IGdldCBleHBlY3RlZCBzaGFyaW5nTW9kZSwgZ290ICUzZCwgc2tpcHBpbmcgdGVzdFxuIiwKKyAgICAgICAgICAgICAgIGFjdHVhbFNoYXJpbmdNb2RlKTsKKyAgICAgICAgcmVzdWx0ID0gQUFVRElPX09LOworICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9CisgICAgYWN0dWFsUGVyZm9ybWFuY2VNb2RlID0gQUF1ZGlvU3RyZWFtX2dldFBlcmZvcm1hbmNlTW9kZShhYXVkaW9TdHJlYW0pOworICAgIGlmIChhY3R1YWxQZXJmb3JtYW5jZU1vZGUgIT0gcGVyZm9ybWFuY2VNb2RlKSB7CisgICAgICAgIHByaW50ZigiZGlkIG5vdCBnZXQgZXhwZWN0ZWQgcGVyZm9ybWFuY2VNb2RlLCBnb3QgJTNkLCBza2lwcGluZyB0ZXN0XG4iLAorICAgICAgICAgICAgICAgYWN0dWFsUGVyZm9ybWFuY2VNb2RlKTsKKyAgICAgICAgcmVzdWx0ID0gQUFVRElPX09LOworICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9CisKKyAgICBwcmludGYoIiAgICBjaGFucyA9ICUzZCwgcmF0ZSA9ICU2ZCBmb3JtYXQgPSAlZFxuIiwKKyAgICAgICAgICAgYWN0dWFsQ2hhbm5lbENvdW50LCBhY3R1YWxTYW1wbGVSYXRlLCBhY3R1YWxEYXRhRm9ybWF0KTsKKyAgICBwcmludGYoIiAgICBJcyBNTUFQIHVzZWQ/ICVzXG4iLCBBQXVkaW9TdHJlYW1faXNNTWFwVXNlZChhYXVkaW9TdHJlYW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAieWVzIiA6ICJubyIpOworCisgICAgLy8gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0aGF0IGFyZSByZWFkIGluIG9uZSBjaHVuayBieSBhIERNQSBjb250cm9sbGVyCisgICAgLy8gb3IgYSBEU1Agb3IgYSBtaXhlci4KKyAgICBmcmFtZXNQZXJCdXJzdCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNQZXJCdXJzdChhYXVkaW9TdHJlYW0pOworICAgIHByaW50ZigiICAgIGZyYW1lc1BlckJ1cnN0ID0gJTNkXG4iLCBmcmFtZXNQZXJCdXJzdCk7CisKKyAgICBvcmlnaW5hbEJ1ZmZlclNpemUgPSBBQXVkaW9TdHJlYW1fZ2V0QnVmZmVyU2l6ZUluRnJhbWVzKGFhdWRpb1N0cmVhbSk7CisgICAgcmVxdWVzdGVkQnVmZmVyU2l6ZSA9IDQgKiBmcmFtZXNQZXJCdXJzdDsKKyAgICBmaW5hbEJ1ZmZlclNpemUgPSBBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzKGFhdWRpb1N0cmVhbSwgcmVxdWVzdGVkQnVmZmVyU2l6ZSk7CisKKyAgICBwcmludGYoIiAgICBCdWZmZXJTaXplOiBvcmlnaW5hbCA9ICU0ZCwgcmVxdWVzdGVkID0gJTRkLCBmaW5hbCA9ICU0ZFxuIiwKKyAgICAgICAgICAgb3JpZ2luYWxCdWZmZXJTaXplLCByZXF1ZXN0ZWRCdWZmZXJTaXplLCBmaW5hbEJ1ZmZlclNpemUpOworCisgICAgeworICAgICAgICBpbnQ2NF90IHBvc2l0aW9uOworICAgICAgICBpbnQ2NF90IG5hbm9zZWNvbmRzOworICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1fZ2V0VGltZXN0YW1wKGFhdWRpb1N0cmVhbSwgQ0xPQ0tfTU9OT1RPTklDLCAmcG9zaXRpb24sICZuYW5vc2Vjb25kcyk7CisgICAgICAgIHByaW50ZigiYmVmb3JlIHN0YXJ0LCBBQXVkaW9TdHJlYW1fZ2V0VGltZXN0YW1wKCkgcmV0dXJucyAlc1xuIiwKKyAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgIH0KKworICAgIGZvciAoaW50IHJ1bnMgPSAwOyBydW5zIDwgTlVNX0xPT1BTOyBydW5zKyspIHsKKyAgICAgICAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0gbG9vcCAjJWRcbiIsIHJ1bnMpOworCisgICAgICAgIGludDY0X3QgdGVtcCA9IHNUaW1lc3RhbXBEYXRhLmZyYW1lc1RvdGFsOworICAgICAgICBtZW1zZXQoJnNUaW1lc3RhbXBEYXRhLCAwLCBzaXplb2Yoc1RpbWVzdGFtcERhdGEpKTsKKyAgICAgICAgc1RpbWVzdGFtcERhdGEuZnJhbWVzVG90YWwgPSB0ZW1wOworCisgICAgICAgIHNUaW1lc3RhbXBEYXRhLmZvcmNlVW5kZXJydW5zID0gZmFsc2U7CisKKyAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChhYXVkaW9TdHJlYW0pOworICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0IHJldHVybmVkICVzIiwKKyAgICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICAgICAgICAgIGdvdG8gZmluaXNoOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgc2Vjb25kID0gMDsgc2Vjb25kIDwgTlVNX1NFQ09ORFM7IHNlY29uZCsrKSB7CisgICAgICAgICAgICAvLyBHaXZlIEFBdWRpbyBjYWxsYmFjayB0aW1lIHRvIHJ1biBpbiB0aGUgYmFja2dyb3VuZC4KKyAgICAgICAgICAgIHNsZWVwKDEpOworCisgICAgICAgICAgICAvLyBQZXJpb2RpY2FsbHkgcHJpbnQgdGhlIHByb2dyZXNzIHNvIHdlIGtub3cgaXQgaGFzbid0IGRpZWQuCisgICAgICAgICAgICBwcmludGYoImZyYW1lc1dyaXR0ZW4gPSAlZCwgWFJ1bnMgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAoaW50KSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihhYXVkaW9TdHJlYW0pLAorICAgICAgICAgICAgICAgICAgIChpbnQpIEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQoYWF1ZGlvU3RyZWFtKQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcChhYXVkaW9TdHJlYW0pOworICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AgcmV0dXJuZWQgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgIH0KKworICAgICAgICBwcmludGYoInRpbWVzdGFtcENvdW50ID0gJWRcbiIsIHNUaW1lc3RhbXBEYXRhLnRpbWVzdGFtcENvdW50KTsKKyAgICAgICAgaW50IHByaW50ZWQgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNUaW1lc3RhbXBEYXRhLnRpbWVzdGFtcENvdW50OyBpKyspIHsKKyAgICAgICAgICAgIFRpbWVzdGFtcEluZm8gKnRpbWVzdGFtcCA9ICZzVGltZXN0YW1wRGF0YS50aW1lc3RhbXBzW2ldOworICAgICAgICAgICAgYm9vbCBwb3NDaGFuZ2VkID0gKHRpbWVzdGFtcC0+dGltZXN0YW1wUG9zaXRpb24gIT0gKHRpbWVzdGFtcCAtIDEpLT50aW1lc3RhbXBQb3NpdGlvbik7CisgICAgICAgICAgICBib29sIHRpbWVDaGFuZ2VkID0gKHRpbWVzdGFtcC0+dGltZXN0YW1wTmFub3MgIT0gKHRpbWVzdGFtcCAtIDEpLT50aW1lc3RhbXBOYW5vcyk7CisgICAgICAgICAgICBpZiAoKHByaW50ZWQgPCAyMCkgJiYgKChpIDwgMTApIHx8IHBvc0NoYW5nZWQgfHwgdGltZUNoYW5nZWQpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgICUzZCA6IGZyYW1lcyAlOGxsZCwgeGZlcmQgJThsbGQiLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSB0aW1lc3RhbXAtPmZyYW1lc1RvdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSB0aW1lc3RhbXAtPmFwcFBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAodGltZXN0YW1wLT5yZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCByZXN1bHQgPSAlc1xuIiwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQodGltZXN0YW1wLT5yZXN1bHQpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBib29sIG5lZ2F0aXZlID0gdGltZXN0YW1wLT50aW1lc3RhbXBQb3NpdGlvbiA8IDA7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgcmV0cm8gPSAoaSA+IDAgJiYgKHRpbWVzdGFtcC0+dGltZXN0YW1wUG9zaXRpb24gPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGltZXN0YW1wIC0gMSktPnRpbWVzdGFtcFBvc2l0aW9uKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UgPSBuZWdhdGl2ZSA/ICIgPD1ORUdBVElWRSEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChyZXRybyA/ICIgIDw9IFJFVFJPR1JBREUhIiA6ICIiKTsKKworICAgICAgICAgICAgICAgICAgICBkb3VibGUgbGF0ZW5jeSA9IGNhbGN1bGF0ZUxhdGVuY3lNaWxsaXModGltZXN0YW1wLT50aW1lc3RhbXBQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dGltZXN0YW1wTmFub3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPmFwcFBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT5hcHBOYW5vc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgU1RBTVA6IHBvcyA9ICU4bGxkLCBuYW5vcyA9ICU4bGxkLCBsYXQgPSAlNy4xZiBtc2VjICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgdGltZXN0YW1wLT50aW1lc3RhbXBQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIHRpbWVzdGFtcC0+dGltZXN0YW1wTmFub3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByaW50ZWQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEF2b2lkIHJhY2UgY29uZGl0aW9ucyBpbiBBdWRpb0ZsaW5nZXIuCisgICAgICAgIC8vIFRoZXJlIGlzIG5vcm1hbGx5IGEgZGVsYXkgYmV0d2VlbiBhIHJlYWwgdXNlciBzdG9wcGluZyBhbmQgcmVzdGFydGluZyBhIHN0cmVhbS4KKyAgICAgICAgc2xlZXAoMSk7CisgICAgfQorCitmaW5pc2g6CisgICAgaWYgKGFhdWRpb1N0cmVhbSAhPSBudWxscHRyKSB7CisgICAgICAgIEFBdWRpb1N0cmVhbV9jbG9zZShhYXVkaW9TdHJlYW0pOworICAgIH0KKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZShhYXVkaW9CdWlsZGVyKTsKKyAgICBwcmludGYoInJlc3VsdCA9ICVkID0gJXNcbiIsIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICAodm9pZCkgYXJnYzsKKyAgICAodm9pZCkgYXJndjsKKworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CisKKyAgICAvLyBNYWtlIHByaW50ZiBwcmludCBpbW1lZGlhdGVseSBzbyB0aGF0IGRlYnVnIGluZm8gaXMgbm90IHN0dWNrCisgICAgLy8gaW4gYSBidWZmZXIgaWYgd2UgaGFuZyBvciBjcmFzaC4KKyAgICBzZXR2YnVmKHN0ZG91dCwgbnVsbHB0ciwgX0lPTkJGLCAoc2l6ZV90KSAwKTsKKworICAgIHByaW50ZigiVGVzdCBUaW1lc3RhbXBzIFYwLjEuM1xuIik7CisKKyAgICAvLyBMZWdhY3kKKyAgICBhYXVkaW9fcG9saWN5X3QgcG9saWN5ID0gQUFVRElPX1BPTElDWV9ORVZFUjsKKyAgICByZXN1bHQgPSB0ZXN0VGltZVN0YW1wcyhwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fRElSRUNUSU9OX0lOUFVUKTsKKyAgICByZXN1bHQgPSB0ZXN0VGltZVN0YW1wcyhwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0RJUkVDVElPTl9JTlBVVCk7CisgICAgcmVzdWx0ID0gdGVzdFRpbWVTdGFtcHMocG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpOworICAgIHJlc3VsdCA9IHRlc3RUaW1lU3RhbXBzKHBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fRElSRUNUSU9OX09VVFBVVCk7CisKKyAgICAvLyBNTUFQCisgICAgcG9saWN5ID0gQUFVRElPX1BPTElDWV9BTFdBWVM7CisgICAgcmVzdWx0ID0gdGVzdFRpbWVTdGFtcHMocG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19ESVJFQ1RJT05fSU5QVVQpOworICAgIHJlc3VsdCA9IHRlc3RUaW1lU3RhbXBzKHBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fRElSRUNUSU9OX09VVFBVVCk7CisgICAgcmVzdWx0ID0gdGVzdFRpbWVTdGFtcHMocG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19ESVJFQ1RJT05fSU5QVVQpOworICAgIHJlc3VsdCA9IHRlc3RUaW1lU3RhbXBzKHBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fRElSRUNUSU9OX09VVFBVVCk7CisKKyAgICByZXR1cm4gKHJlc3VsdCA9PSBBQVVESU9fT0spID8gRVhJVF9TVUNDRVNTIDogRVhJVF9GQUlMVVJFOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9FZmZlY3QuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9FZmZlY3QuY3BwCmluZGV4IGE1ZjlhYjYuLmIxY2IwZTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvRWZmZWN0LmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0VmZmVjdC5jcHAKQEAgLTEzNSw3ICsxMzUsMTEgQEAKICAgICAgICAgICAgICZtU3RhdHVzLCAmbUlkLCAmZW5hYmxlZCk7CiAKICAgICBpZiAoaUVmZmVjdCA9PSAwIHx8IChtU3RhdHVzICE9IE5PX0VSUk9SICYmIG1TdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpKSB7Ci0gICAgICAgIEFMT0dFKCJzZXQoKTogQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgZWZmZWN0LCBzdGF0dXM6ICVkIiwgbVN0YXR1cyk7CisgICAgICAgIGNoYXIgdHlwZUJ1ZmZlcls2NF0sIHV1aWRCdWZmZXJbNjRdOworICAgICAgICBndWlkVG9TdHJpbmcodHlwZSwgdHlwZUJ1ZmZlciwgc2l6ZW9mKHR5cGVCdWZmZXIpKTsKKyAgICAgICAgZ3VpZFRvU3RyaW5nKHV1aWQsIHV1aWRCdWZmZXIsIHNpemVvZih1dWlkQnVmZmVyKSk7CisgICAgICAgIEFMT0dFKCJzZXQoKTogQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgZWZmZWN0ICVzIC8gJXMsIHN0YXR1czogJWQiLAorICAgICAgICAgICAgICAgIHR5cGVCdWZmZXIsIHV1aWRCdWZmZXIsIG1TdGF0dXMpOwogICAgICAgICBpZiAoaUVmZmVjdCA9PSAwKSB7CiAgICAgICAgICAgICBtU3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwCmluZGV4IDYxMWNkZTcuLmJhNGFjYzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAKQEAgLTEyMCw3ICsxMjAsNyBAQAogICAgICAgICB9CiAgICAgICAgIC8vIE5vIGxvY2sgaGVyZTogd29yc3QgY2FzZSB3ZSByZW1vdmUgYSBOVUxMIGNhbGxiYWNrIHdoaWNoIHdpbGwgYmUgYSBub3AKICAgICAgICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwICYmIG1JbnB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrLCBtSW5wdXQpOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbUlucHV0KTsKICAgICAgICAgfQogICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQXVkaW9SZWNvcmQpLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKICAgICAgICAgbUF1ZGlvUmVjb3JkLmNsZWFyKCk7CkBAIC0yNzQsNyArMjc0LDcgQEAKICAgICBtU3RhdHVzID0gTk9fRVJST1I7CiAgICAgbVVzZXJEYXRhID0gdXNlcjsKICAgICAvLyBUT0RPOiBhZGQgYXVkaW8gaGFyZHdhcmUgaW5wdXQgbGF0ZW5jeSBoZXJlCi0gICAgbUxhdGVuY3kgPSAoMTAwMCAqIG1GcmFtZUNvdW50KSAvIG1TYW1wbGVSYXRlOworICAgIG1MYXRlbmN5ID0gKDEwMDBMTCAqIG1GcmFtZUNvdW50KSAvIG1TYW1wbGVSYXRlOwogICAgIG1NYXJrZXJQb3NpdGlvbiA9IDA7CiAgICAgbU1hcmtlclJlYWNoZWQgPSBmYWxzZTsKICAgICBtTmV3UG9zaXRpb24gPSAwOwpAQCAtNDk5LDE5ICs0OTksMjYgQEAKICAgICByZXR1cm4gbVNlbGVjdGVkRGV2aWNlSWQ7CiB9CiAKKy8vIG11c3QgYmUgY2FsbGVkIHdpdGggbUxvY2sgaGVsZAordm9pZCBBdWRpb1JlY29yZDo6dXBkYXRlUm91dGVkRGV2aWNlSWRfbCgpCit7CisgICAgLy8gaWYgdGhlIHJlY29yZCBpcyBpbmFjdGl2ZSwgZG8gbm90IHVwZGF0ZSBhY3R1YWwgZGV2aWNlIGFzIHRoZSBpbnB1dCBzdHJlYW0gbWF5YmUgcm91dGVkCisgICAgLy8gZnJvbSBhIGRldmljZSBub3QgcmVsZXZhbnQgdG8gdGhpcyBjbGllbnQgYmVjYXVzZSBvZiBvdGhlciBhY3RpdmUgdXNlIGNhc2VzLgorICAgIGlmICghbUFjdGl2ZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChtSW5wdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCA9IEF1ZGlvU3lzdGVtOjpnZXREZXZpY2VJZEZvcklvKG1JbnB1dCk7CisgICAgICAgIGlmIChkZXZpY2VJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICBtUm91dGVkRGV2aWNlSWQgPSBkZXZpY2VJZDsKKyAgICAgICAgfQorICAgICB9Cit9CisKIGF1ZGlvX3BvcnRfaGFuZGxlX3QgQXVkaW9SZWNvcmQ6OmdldFJvdXRlZERldmljZUlkKCkgewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobUlucHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19QT1JUX0hBTkRMRV9OT05FOwotICAgIH0KLSAgICAvLyBpZiB0aGUgaW5wdXQgc3RyZWFtIGRvZXMgbm90IGhhdmUgYW4gYWN0aXZlIGF1ZGlvIHBhdGNoLCB1c2UgZWl0aGVyIHRoZSBkZXZpY2UgaW5pdGlhbGx5Ci0gICAgLy8gc2VsZWN0ZWQgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIgb3IgdGhlIGxhc3Qgcm91dGVkIGRldmljZQotICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQgPSBBdWRpb1N5c3RlbTo6Z2V0RGV2aWNlSWRGb3JJbyhtSW5wdXQpOwotICAgIGlmIChkZXZpY2VJZCA9PSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIGRldmljZUlkID0gbVJvdXRlZERldmljZUlkOwotICAgIH0KLSAgICBtUm91dGVkRGV2aWNlSWQgPSBkZXZpY2VJZDsKLSAgICByZXR1cm4gZGV2aWNlSWQ7CisgICAgdXBkYXRlUm91dGVkRGV2aWNlSWRfbCgpOworICAgIHJldHVybiBtUm91dGVkRGV2aWNlSWQ7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTUzNyw5ICs1NDQsNiBAQAogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAKLSAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDAgJiYgbUlucHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjaywgbUlucHV0KTsKLSAgICB9CiAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQ7CiAKICAgICAvLyBtRmxhZ3MgKG5vdCBtT3JpZ0ZsYWdzKSBpcyBtb2RpZmllZCBkZXBlbmRpbmcgb24gd2hldGhlciBmYXN0IHJlcXVlc3QgaXMgYWNjZXB0ZWQuCkBAIC03NDQsNiArNzQ4LDE1IEBACiAgICAgfQogICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSAodWludDMyX3QpIG5vdGlmaWNhdGlvbkZyYW1lczsKIAorCisgICAgLy9tSW5wdXQgIT0gaW5wdXQgaW5jbHVkZXMgdGhlIGNhc2Ugd2hlcmUgbUlucHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FIGZvciBmaXJzdCBjcmVhdGlvbgorICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCAmJiBtSW5wdXQgIT0gaW5wdXQpIHsKKyAgICAgICAgaWYgKG1JbnB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbUlucHV0KTsKKyAgICAgICAgfQorICAgICAgICBBdWRpb1N5c3RlbTo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBpbnB1dCk7CisgICAgfQorCiAgICAgLy8gV2UgcmV0YWluIGEgY29weSBvZiB0aGUgSS9PIGhhbmRsZSwgYnV0IGRvbid0IG93biB0aGUgcmVmZXJlbmNlCiAgICAgbUlucHV0ID0gaW5wdXQ7CiAgICAgbVJlZnJlc2hSZW1haW5pbmcgPSB0cnVlOwpAQCAtNzYzLDEwICs3NzYsNiBAQAogICAgIG1EZWF0aE5vdGlmaWVyID0gbmV3IERlYXRoTm90aWZpZXIodGhpcyk7CiAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUF1ZGlvUmVjb3JkKS0+bGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOwogCi0gICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwKSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjaywgbUlucHV0KTsKLSAgICB9Ci0KICAgICByZXR1cm4gTk9fRVJST1I7CiAKICAgICAvLyBFbmQgb2YgcmV0cnkgbG9vcC4KQEAgLTEyMzgsNyArMTI0Nyw3IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobURldmljZUNhbGxiYWNrID09IGNhbGxiYWNrKSB7CisgICAgaWYgKG1EZXZpY2VDYWxsYmFjay51bnNhZmVfZ2V0KCkgPT0gY2FsbGJhY2suZ2V0KCkpIHsKICAgICAgICAgQUxPR1coIiVzIGFkZGluZyBzYW1lIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CkBAIC0xMjQ2LDkgKzEyNTUsOSBAQAogICAgIGlmIChtSW5wdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwKSB7CiAgICAgICAgICAgICBBTE9HVygiJXMgY2FsbGJhY2sgYWxyZWFkeSBwcmVzZW50ISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2ssIG1JbnB1dCk7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtSW5wdXQpOwogICAgICAgICB9Ci0gICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKGNhbGxiYWNrLCBtSW5wdXQpOworICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtSW5wdXQpOwogICAgIH0KICAgICBtRGV2aWNlQ2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICByZXR1cm4gc3RhdHVzOwpAQCAtMTI2MiwxNyArMTI3MSwzOCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSBjYWxsYmFjaykgeworICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sudW5zYWZlX2dldCgpICE9IGNhbGxiYWNrLmdldCgpKSB7CiAgICAgICAgIEFMT0dXKCIlcyByZW1vdmluZyBkaWZmZXJlbnQgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KKyAgICBtRGV2aWNlQ2FsbGJhY2suY2xlYXIoKTsKICAgICBpZiAobUlucHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjaywgbUlucHV0KTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbUlucHV0KTsKICAgICB9Ci0gICAgbURldmljZUNhbGxiYWNrID0gMDsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3ZvaWQgQXVkaW9SZWNvcmQ6Om9uQXVkaW9EZXZpY2VVcGRhdGUoYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpCit7CisgICAgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+IGNhbGxiYWNrOworICAgIHsKKyAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgICAgICBpZiAoYXVkaW9JbyAhPSBtSW5wdXQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjYWxsYmFjayA9IG1EZXZpY2VDYWxsYmFjay5wcm9tb3RlKCk7CisgICAgICAgIC8vIG9ubHkgdXBkYXRlIGRldmljZSBpZiB0aGUgcmVjb3JkIGlzIGFjdGl2ZSBhcyByb3V0ZSBjaGFuZ2VzIGR1ZSB0byBvdGhlciB1c2UgY2FzZXMgYXJlCisgICAgICAgIC8vIGlycmVsZXZhbnQgZm9yIHRoaXMgY2xpZW50CisgICAgICAgIGlmIChtQWN0aXZlKSB7CisgICAgICAgICAgICBtUm91dGVkRGV2aWNlSWQgPSBkZXZpY2VJZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY2FsbGJhY2suZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBjYWxsYmFjay0+b25BdWRpb0RldmljZVVwZGF0ZShtSW5wdXQsIG1Sb3V0ZWREZXZpY2VJZCk7CisgICAgfQorfQorCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIHZvaWQgQXVkaW9SZWNvcmQ6OkRlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcAppbmRleCAyZjcxMGJkLi5jZGM3NWFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwCkBAIC00OTMsMTQgKzQ5MywxNiBAQAogICAgIGlmIChpb0Rlc2MgPT0gMCB8fCBpb0Rlc2MtPm1Jb0hhbmRsZSA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgcmV0dXJuOwogCiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7Ci0gICAgVmVjdG9yIDwgc3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gPiBjYWxsYmFja3M7CisgICAgVmVjdG9yIDwgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gPiBjYWxsYmFja3M7CiAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKICAgICAgICAgc3dpdGNoIChldmVudCkgewogICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9PUEVORUQ6Ci0gICAgICAgIGNhc2UgQVVESU9fSU5QVVRfT1BFTkVEOiB7CisgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX1JFR0lTVEVSRUQ6CisgICAgICAgIGNhc2UgQVVESU9fSU5QVVRfT1BFTkVEOgorICAgICAgICBjYXNlIEFVRElPX0lOUFVUX1JFR0lTVEVSRUQ6IHsKICAgICAgICAgICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBvbGREZXNjID0gZ2V0SW9EZXNjcmlwdG9yX2woaW9EZXNjLT5tSW9IYW5kbGUpOwogICAgICAgICAgICAgaWYgKG9sZERlc2MgPT0gMCkgewogICAgICAgICAgICAgICAgIG1Jb0Rlc2NyaXB0b3JzLmFkZChpb0Rlc2MtPm1Jb0hhbmRsZSwgaW9EZXNjKTsKQEAgLTUxMSwxMyArNTEzLDE5IEBACiAKICAgICAgICAgICAgIGlmIChpb0Rlc2MtPmdldERldmljZUlkKCkgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgewogICAgICAgICAgICAgICAgIGRldmljZUlkID0gaW9EZXNjLT5nZXREZXZpY2VJZCgpOwotICAgICAgICAgICAgICAgIHNzaXplX3QgaW9JbmRleCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5pbmRleE9mS2V5KGlvRGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgICAgICBpZiAoaW9JbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcyA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy52YWx1ZUF0KGlvSW5kZXgpOworICAgICAgICAgICAgICAgIGlmIChldmVudCA9PSBBVURJT19PVVRQVVRfT1BFTkVEIHx8IGV2ZW50ID09IEFVRElPX0lOUFVUX09QRU5FRCkgeworICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGlvSW5kZXggPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MuaW5kZXhPZktleShpb0Rlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpb0luZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcyA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy52YWx1ZUF0KGlvSW5kZXgpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpIG5ldyAlcyBvcGVuZWQgJWQgc2FtcGxpbmdSYXRlICV1LCBmb3JtYXQgJSN4IGNoYW5uZWwgbWFzayAlI3ggIgotICAgICAgICAgICAgICAgICAgICAiZnJhbWVDb3VudCAlenUgZGV2aWNlSWQgJWQiLCBldmVudCA9PSBBVURJT19PVVRQVVRfT1BFTkVEID8gIm91dHB1dCIgOiAiaW5wdXQiLAorICAgICAgICAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpIG5ldyAlcyAlcyAlZCBzYW1wbGluZ1JhdGUgJXUsIGZvcm1hdCAlI3ggY2hhbm5lbCBtYXNrICUjeCAiCisgICAgICAgICAgICAgICAgICAgICJmcmFtZUNvdW50ICV6dSBkZXZpY2VJZCAlZCIsCisgICAgICAgICAgICAgICAgICAgIGV2ZW50ID09IEFVRElPX09VVFBVVF9PUEVORUQgfHwgZXZlbnQgPT0gQVVESU9fT1VUUFVUX1JFR0lTVEVSRUQgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXQiIDogImlucHV0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9PSBBVURJT19PVVRQVVRfT1BFTkVEIHx8IGV2ZW50ID09IEFVRElPX0lOUFVUX09QRU5FRCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wZW5lZCIgOiAicmVnaXN0ZXJlZCIsCiAgICAgICAgICAgICAgICAgICAgIGlvRGVzYy0+bUlvSGFuZGxlLCBpb0Rlc2MtPm1TYW1wbGluZ1JhdGUsIGlvRGVzYy0+bUZvcm1hdCwgaW9EZXNjLT5tQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgIGlvRGVzYy0+bUZyYW1lQ291bnQsIGlvRGVzYy0+Z2V0RGV2aWNlSWQoKSk7CiAgICAgICAgICAgICB9IGJyZWFrOwpAQCAtNTYzLDkgKzU3MSwyMyBAQAogICAgICAgICB9IGJyZWFrOwogICAgICAgICB9CiAgICAgfQorICAgIGJvb2wgY2FsbGJhY2tSZW1vdmVkID0gZmFsc2U7CiAgICAgLy8gY2FsbGJhY2tzLnNpemUoKSAhPSAwID0+ICBpb0Rlc2MtPm1Jb0hhbmRsZSBhbmQgZGV2aWNlSWQgYXJlIHZhbGlkCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYWxsYmFja3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY2FsbGJhY2tzW2ldLT5vbkF1ZGlvRGV2aWNlVXBkYXRlKGlvRGVzYy0+bUlvSGFuZGxlLCBkZXZpY2VJZCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYWxsYmFja3Muc2l6ZSgpOyApIHsKKyAgICAgICAgc3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBjYWxsYmFja3NbaV0ucHJvbW90ZSgpOworICAgICAgICBpZiAoY2FsbGJhY2suZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY2FsbGJhY2stPm9uQXVkaW9EZXZpY2VVcGRhdGUoaW9EZXNjLT5tSW9IYW5kbGUsIGRldmljZUlkKTsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNhbGxiYWNrcy5yZW1vdmVBdChpKTsKKyAgICAgICAgICAgIGNhbGxiYWNrUmVtb3ZlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gY2xlYW4gdXAgY2FsbGJhY2sgbGlzdCB3aGlsZSB3ZSBhcmUgaGVyZSBpZiBzb21lIGNsaWVudHMgaGF2ZSBkaXNhcHBlYXJlZCB3aXRob3V0CisgICAgLy8gdW5yZWdpc3RlcmluZyB0aGVpciBjYWxsYmFjaworICAgIGlmIChjYWxsYmFja1JlbW92ZWQpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLnJlcGxhY2VWYWx1ZUZvcihpb0Rlc2MtPm1Jb0hhbmRsZSwgY2FsbGJhY2tzKTsKICAgICB9CiB9CiAKQEAgLTYxOCwxNyArNjQwLDE3IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpBdWRpb0ZsaW5nZXJDbGllbnQ6OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soCi0gICAgICAgIGNvbnN0IHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbykKKyAgICAgICAgY29uc3Qgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLCBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgVmVjdG9yIDwgc3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gPiBjYWxsYmFja3M7CisgICAgVmVjdG9yIDwgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gPiBjYWxsYmFja3M7CiAgICAgc3NpemVfdCBpb0luZGV4ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmluZGV4T2ZLZXkoYXVkaW9Jbyk7CiAgICAgaWYgKGlvSW5kZXggPj0gMCkgewogICAgICAgICBjYWxsYmFja3MgPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MudmFsdWVBdChpb0luZGV4KTsKICAgICB9CiAKICAgICBmb3IgKHNpemVfdCBjYkluZGV4ID0gMDsgY2JJbmRleCA8IGNhbGxiYWNrcy5zaXplKCk7IGNiSW5kZXgrKykgewotICAgICAgICBpZiAoY2FsbGJhY2tzW2NiSW5kZXhdID09IGNhbGxiYWNrKSB7CisgICAgICAgIGlmIChjYWxsYmFja3NbY2JJbmRleF0udW5zYWZlX2dldCgpID09IGNhbGxiYWNrLnVuc2FmZV9nZXQoKSkgewogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CiAgICAgfQpAQCAtNjM5LDE4ICs2NjEsMTggQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OkF1ZGlvRmxpbmdlckNsaWVudDo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjaygKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLCBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKQorICAgICAgICBjb25zdCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBzc2l6ZV90IGlvSW5kZXggPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MuaW5kZXhPZktleShhdWRpb0lvKTsKICAgICBpZiAoaW9JbmRleCA8IDApIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBWZWN0b3IgPCBzcDxBdWRpb0RldmljZUNhbGxiYWNrPiA+IGNhbGxiYWNrcyA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy52YWx1ZUF0KGlvSW5kZXgpOworICAgIFZlY3RvciA8IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+ID4gY2FsbGJhY2tzID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLnZhbHVlQXQoaW9JbmRleCk7CiAKICAgICBzaXplX3QgY2JJbmRleDsKICAgICBmb3IgKGNiSW5kZXggPSAwOyBjYkluZGV4IDwgY2FsbGJhY2tzLnNpemUoKTsgY2JJbmRleCsrKSB7Ci0gICAgICAgIGlmIChjYWxsYmFja3NbY2JJbmRleF0gPT0gY2FsbGJhY2spIHsKKyAgICAgICAgaWYgKGNhbGxiYWNrc1tjYkluZGV4XS51bnNhZmVfZ2V0KCkgPT0gY2FsbGJhY2sudW5zYWZlX2dldCgpKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KQEAgLTExMjgsNyArMTE1MCw3IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKAotICAgICAgICBjb25zdCBzcDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pCisgICAgICAgIGNvbnN0IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbykKIHsKICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXJDbGllbnQ+IGFmYyA9IGdldEF1ZGlvRmxpbmdlckNsaWVudCgpOwogICAgIGlmIChhZmMgPT0gMCkgewpAQCAtMTE0NSw3ICsxMTY3LDcgQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soCi0gICAgICAgIGNvbnN0IHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbykKKyAgICAgICAgY29uc3Qgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLCBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKQogewogICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlckNsaWVudD4gYWZjID0gZ2V0QXVkaW9GbGluZ2VyQ2xpZW50KCk7CiAgICAgaWYgKGFmYyA9PSAwKSB7CkBAIC0xMjk3LDcgKzEzMTksNyBAQAogfQogCiB2b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKLSAgICAgICAgaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpIHsKICAgICByZWNvcmRfY29uZmlnX2NhbGxiYWNrIGNiID0gTlVMTDsKQEAgLTEzMDcsNyArMTMyOSw3IEBACiAgICAgfQogCiAgICAgaWYgKGNiICE9IE5VTEwpIHsKLSAgICAgICAgY2IoZXZlbnQsIHNlc3Npb24sIHNvdXJjZSwgY2xpZW50Q29uZmlnLCBkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKKyAgICAgICAgY2IoZXZlbnQsIGNsaWVudEluZm8sIGNsaWVudENvbmZpZywgZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCmluZGV4IGFjZjVhNDUuLmM2NjIyY2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgogCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgpAQCAtNjIsOSArNjMsMTIgQEAKICAgICByZXR1cm4gdHYudHZfc2VjICogMTAwMDAwMGxsICsgdHYudHZfbnNlYyAvIDEwMDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgbnNlY3NfdCBjb252ZXJ0VGltZXNwZWNUb05zKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAmdHYpCi17Ci0gICAgcmV0dXJuIHR2LnR2X3NlYyAqIChsb25nIGxvbmcpTkFOT1NfUEVSX1NFQ09ORCArIHR2LnR2X25zZWM7CisvLyBUT0RPIG1vdmUgdG8gYXVkaW9fdXRpbHMuCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0aW1lc3BlYyBjb252ZXJ0TnNUb1RpbWVzcGVjKGludDY0X3QgbnMpIHsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdHY7CisgICAgdHYudHZfc2VjID0gc3RhdGljX2Nhc3Q8dGltZV90PihucyAvIE5BTk9TX1BFUl9TRUNPTkQpOworICAgIHR2LnR2X25zZWMgPSBzdGF0aWNfY2FzdDxsb25nPihucyAlIE5BTk9TX1BFUl9TRUNPTkQpOworICAgIHJldHVybiB0djsKIH0KIAogLy8gY3VycmVudCBtb25vdG9uaWMgdGltZSBpbiBtaWNyb3NlY29uZHMuCkBAIC0yNzIsNyArMjc2LDcgQEAKICAgICAgICAgfQogICAgICAgICAvLyBObyBsb2NrIGhlcmU6IHdvcnN0IGNhc2Ugd2UgcmVtb3ZlIGEgTlVMTCBjYWxsYmFjayB3aGljaCB3aWxsIGJlIGEgbm9wCiAgICAgICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCAmJiBtT3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2ssIG1PdXRwdXQpOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbU91dHB1dCk7CiAgICAgICAgIH0KICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUF1ZGlvVHJhY2spLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKICAgICAgICAgbUF1ZGlvVHJhY2suY2xlYXIoKTsKQEAgLTU0Myw3ICs1NDcsOCBAQAogICAgIG1VcGRhdGVQZXJpb2QgPSAwOwogICAgIG1Qb3NpdGlvbiA9IDA7CiAgICAgbVJlbGVhc2VkID0gMDsKLSAgICBtU3RhcnRVcyA9IDA7CisgICAgbVN0YXJ0TnMgPSAwOworICAgIG1TdGFydEZyb21aZXJvVXMgPSAwOwogICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCwgbUNsaWVudFBpZCk7CiAgICAgbVNlcXVlbmNlID0gMTsKICAgICBtT2JzZXJ2ZWRTZXF1ZW5jZSA9IG1TZXF1ZW5jZTsKQEAgLTU5MSw2ICs1OTYsNyBAQAogICAgICAgICAgICAgbVN0YXJ0RXRzLmNsZWFyKCk7CiAgICAgICAgIH0KICAgICB9CisgICAgbVN0YXJ0TnMgPSBzeXN0ZW1UaW1lKCk7IC8vIHNhdmUgdGhpcyBmb3IgdGltZXN0YW1wIGFkanVzdG1lbnQgYWZ0ZXIgc3RhcnRpbmcuCiAgICAgaWYgKHByZXZpb3VzU3RhdGUgPT0gU1RBVEVfU1RPUFBFRCB8fCBwcmV2aW91c1N0YXRlID09IFNUQVRFX0ZMVVNIRUQpIHsKICAgICAgICAgLy8gcmVzZXQgY3VycmVudCBwb3NpdGlvbiBhcyBzZWVuIGJ5IGNsaWVudCB0byAwCiAgICAgICAgIG1Qb3NpdGlvbiA9IDA7CkBAIC02MDksNyArNjE1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1TdGFydEV0cy5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl0pLAogICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1TdGFydEV0cy5tRmx1c2hlZCwKICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltRnJhbWVzV3JpdHRlbik7Ci0gICAgICAgICAgICBtRnJhbWVzV3JpdHRlblNlcnZlck9mZnNldCA9IC1tU3RhcnRFdHMubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdOworICAgICAgICAgICAgLy8gbVN0YXJ0RXRzIGlzIGFscmVhZHkgYWRqdXN0ZWQgYnkgbUZyYW1lc1dyaXR0ZW5TZXJ2ZXJPZmZzZXQsIHNvIHdlIGRlbHRhIGFkanVzdC4KKyAgICAgICAgICAgIG1GcmFtZXNXcml0dGVuU2VydmVyT2Zmc2V0IC09IG1TdGFydEV0cy5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl07CiAgICAgICAgIH0KICAgICAgICAgbUZyYW1lc1dyaXR0ZW4gPSAwOwogICAgICAgICBtUHJveHktPmNsZWFyVGltZXN0YW1wKCk7IC8vIG5lZWQgbmV3IHNlcnZlciBwdXNoIGZvciB2YWxpZCB0aW1lc3RhbXAKQEAgLTYxOSw3ICs2MjYsNyBAQAogICAgICAgICAvLyBzaW5jZSB0aGUgZmx1c2ggaXMgYXN5bmNocm9ub3VzIGFuZCBzdG9wIG1heSBub3QgZnVsbHkgZHJhaW4uCiAgICAgICAgIC8vIFdlIHNhdmUgdGhlIHRpbWUgd2hlbiB0aGUgdHJhY2sgaXMgc3RhcnRlZCB0byBsYXRlciB2ZXJpZnkgd2hldGhlcgogICAgICAgICAvLyB0aGUgY291bnRlcnMgYXJlIHJlYWxpc3RpYyAoaS5lLiBzdGFydCBmcm9tIHplcm8gYWZ0ZXIgdGhpcyB0aW1lKS4KLSAgICAgICAgbVN0YXJ0VXMgPSBnZXROb3dVcygpOworICAgICAgICBtU3RhcnRGcm9tWmVyb1VzID0gbVN0YXJ0TnMgLyAxMDAwOwogCiAgICAgICAgIC8vIGZvcmNlIHJlZnJlc2ggb2YgcmVtYWluaW5nIGZyYW1lcyBieSBwcm9jZXNzQXVkaW9CdWZmZXIoKSBhcyBsYXN0CiAgICAgICAgIC8vIHdyaXRlIGJlZm9yZSBzdG9wIGNvdWxkIGJlIHBhcnRpYWwuCkBAIC0xMjIyLDE5ICsxMjI5LDI2IEBACiAgICAgcmV0dXJuIG1TZWxlY3RlZERldmljZUlkOwogfQogCisvLyBtdXN0IGJlIGNhbGxlZCB3aXRoIG1Mb2NrIGhlbGQKK3ZvaWQgQXVkaW9UcmFjazo6dXBkYXRlUm91dGVkRGV2aWNlSWRfbCgpCit7CisgICAgLy8gaWYgdGhlIHRyYWNrIGlzIGluYWN0aXZlLCBkbyBub3QgdXBkYXRlIGFjdHVhbCBkZXZpY2UgYXMgdGhlIG91dHB1dCBzdHJlYW0gbWF5YmUgcm91dGVkCisgICAgLy8gdG8gYSBkZXZpY2Ugbm90IHJlbGV2YW50IHRvIHRoaXMgY2xpZW50IGJlY2F1c2Ugb2Ygb3RoZXIgYWN0aXZlIHVzZSBjYXNlcy4KKyAgICBpZiAobVN0YXRlICE9IFNUQVRFX0FDVElWRSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChtT3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQgPSBBdWRpb1N5c3RlbTo6Z2V0RGV2aWNlSWRGb3JJbyhtT3V0cHV0KTsKKyAgICAgICAgaWYgKGRldmljZUlkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgIG1Sb3V0ZWREZXZpY2VJZCA9IGRldmljZUlkOworICAgICAgICB9CisgICAgfQorfQorCiBhdWRpb19wb3J0X2hhbmRsZV90IEF1ZGlvVHJhY2s6OmdldFJvdXRlZERldmljZUlkKCkgewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobU91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKLSAgICB9Ci0gICAgLy8gaWYgdGhlIG91dHB1dCBzdHJlYW0gZG9lcyBub3QgaGF2ZSBhbiBhY3RpdmUgYXVkaW8gcGF0Y2gsIHVzZSBlaXRoZXIgdGhlIGRldmljZSBpbml0aWFsbHkKLSAgICAvLyBzZWxlY3RlZCBieSBhdWRpbyBwb2xpY3kgbWFuYWdlciBvciB0aGUgbGFzdCByb3V0ZWQgZGV2aWNlCi0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCA9IEF1ZGlvU3lzdGVtOjpnZXREZXZpY2VJZEZvcklvKG1PdXRwdXQpOwotICAgIGlmIChkZXZpY2VJZCA9PSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIGRldmljZUlkID0gbVJvdXRlZERldmljZUlkOwotICAgIH0KLSAgICBtUm91dGVkRGV2aWNlSWQgPSBkZXZpY2VJZDsKLSAgICByZXR1cm4gZGV2aWNlSWQ7CisgICAgdXBkYXRlUm91dGVkRGV2aWNlSWRfbCgpOworICAgIHJldHVybiBtUm91dGVkRGV2aWNlSWQ7CiB9CiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OmF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpCkBAIC0xMjcyLDcgKzEyODYsNyBAQAogICAgICAgICBBTE9HVygiZ2V0TGF0ZW5jeSglZCkgZmFpbGVkIHN0YXR1cyAlZCIsIG1PdXRwdXQsIHN0YXR1cyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gRklYTUUgZG9uJ3QgYmVsaWV2ZSB0aGlzIGxpZQotICAgICAgICBtTGF0ZW5jeSA9IG1BZkxhdGVuY3kgKyAoMTAwMCAqIG1GcmFtZUNvdW50KSAvIG1TYW1wbGVSYXRlOworICAgICAgICBtTGF0ZW5jeSA9IG1BZkxhdGVuY3kgKyAoMTAwMExMICogbUZyYW1lQ291bnQpIC8gbVNhbXBsZVJhdGU7CiAgICAgfQogfQogCkBAIC0xMjk4LDEyICsxMzEyLDEwIEBACiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KIAotICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCAmJiBtT3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjaywgbU91dHB1dCk7Ci0gICAgfQogICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBtU3RyZWFtVHlwZTsKICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIgPSAobVN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpID8gJm1BdHRyaWJ1dGVzIDogTlVMTDsKKyAgICBib29sIGNhbGxiYWNrQWRkZWQgPSBmYWxzZTsKIAogICAgIC8vIG1GbGFncyAobm90IG1PcmlnRmxhZ3MpIGlzIG1vZGlmaWVkIGRlcGVuZGluZyBvbiB3aGV0aGVyIGZhc3QgcmVxdWVzdCBpcyBhY2NlcHRlZC4KICAgICAvLyBBZnRlciBmYXN0IHJlcXVlc3QgaXMgZGVuaWVkLCB3ZSB3aWxsIHJlcXVlc3QgYWdhaW4gaWYgSUF1ZGlvVHJhY2sgaXMgcmUtY3JlYXRlZC4KQEAgLTE1MDgsMTIgKzE1MjAsMTQgQEAKICAgICBzcDxJTWVtb3J5PiBpTWVtID0gdHJhY2stPmdldENibGsoKTsKICAgICBpZiAoaU1lbSA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2siKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CisgICAgICAgIGdvdG8gcmVsZWFzZTsKICAgICB9CiAgICAgdm9pZCAqaU1lbVBvaW50ZXIgPSBpTWVtLT5wb2ludGVyKCk7CiAgICAgaWYgKGlNZW1Qb2ludGVyID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayBwb2ludGVyIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICBzdGF0dXMgPSBOT19JTklUOworICAgICAgICBnb3RvIHJlbGVhc2U7CiAgICAgfQogICAgIC8vIGludmFyaWFudCB0aGF0IG1BdWRpb1RyYWNrICE9IDAgaXMgdHJ1ZSBvbmx5IGFmdGVyIHNldCgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5CiAgICAgaWYgKG1BdWRpb1RyYWNrICE9IDApIHsKQEAgLTE1ODQsNiArMTU5OCwxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy9tT3V0cHV0ICE9IG91dHB1dCBpbmNsdWRlcyB0aGUgY2FzZSB3aGVyZSBtT3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FIGZvciBmaXJzdCBjcmVhdGlvbgorICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCAmJiBtT3V0cHV0ICE9IG91dHB1dCkgeworICAgICAgICBpZiAobU91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbU91dHB1dCk7CisgICAgICAgIH0KKyAgICAgICAgQXVkaW9TeXN0ZW06OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgb3V0cHV0KTsKKyAgICAgICAgY2FsbGJhY2tBZGRlZCA9IHRydWU7CisgICAgfQorCiAgICAgLy8gV2UgcmV0YWluIGEgY29weSBvZiB0aGUgSS9PIGhhbmRsZSwgYnV0IGRvbid0IG93biB0aGUgcmVmZXJlbmNlCiAgICAgbU91dHB1dCA9IG91dHB1dDsKICAgICBtUmVmcmVzaFJlbWFpbmluZyA9IHRydWU7CkBAIC0xNTk5LDcgKzE2MjIsOCBAQAogICAgICAgICBidWZmZXJzID0gbVNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpOwogICAgICAgICBpZiAoYnVmZmVycyA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBidWZmZXIgcG9pbnRlciIpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgICAgICBzdGF0dXMgPSBOT19JTklUOworICAgICAgICAgICAgZ290byByZWxlYXNlOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNjQ0LDE1ICsxNjY4LDE1IEBACiAgICAgbURlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcih0aGlzKTsKICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQXVkaW9UcmFjayktPmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKIAotICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCkgewotICAgICAgICBBdWRpb1N5c3RlbTo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2ssIG1PdXRwdXQpOwotICAgIH0KLQogICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKIHJlbGVhc2U6CiAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQob3V0cHV0LCBzdHJlYW1UeXBlLCBtU2Vzc2lvbklkKTsKKyAgICBpZiAoY2FsbGJhY2tBZGRlZCkgeworICAgICAgICAvLyBub3RlOiBtT3V0cHV0IGlzIGFsd2F5cyB2YWxpZCBpcyBjYWxsYmFja0FkZGVkIGlzIHRydWUKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbU91dHB1dCk7CisgICAgfQogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICB9CkBAIC0yMDk5LDcgKzIxMjMsMTQgQEAKICAgICAvLyBDb252ZXJ0IGZyYW1lIHVuaXRzIHRvIHRpbWUgdW5pdHMKICAgICBuc2Vjc190IG5zID0gTlNfV0hFTkVWRVI7CiAgICAgaWYgKG1pbkZyYW1lcyAhPSAodWludDMyX3QpIH4wKSB7Ci0gICAgICAgIG5zID0gZnJhbWVzVG9OYW5vc2Vjb25kcyhtaW5GcmFtZXMsIHNhbXBsZVJhdGUsIHNwZWVkKSArIGtXYWl0UGVyaW9kTnM7CisgICAgICAgIC8vIEF1ZGlvRmxpbmdlciBjb25zdW1wdGlvbiBvZiBjbGllbnQgZGF0YSBtYXkgYmUgaXJyZWd1bGFyIHdoZW4gY29taW5nIG91dCBvZiBkZXZpY2UKKyAgICAgICAgLy8gc3RhbmRieSBzaW5jZSB0aGUga2VybmVsIGJ1ZmZlcnMgcmVxdWlyZSBmaWxsaW5nLiBUaGlzIGlzIHRocm90dGxlZCB0byBubyBtb3JlIHRoYW4gMngKKyAgICAgICAgLy8gdGhlIGV4cGVjdGVkIHJhdGUgaW4gdGhlIE1peGVyVGhyZWFkLiBIZW5jZSwgd2UgcmVkdWNlIHRoZSBlc3RpbWF0ZWQgdGltZSB0byB3YWl0IGJ5IG9uZQorICAgICAgICAvLyBoYWxmIChidXQgbm8gbW9yZSB0aGFuIGhhbGYgYSBzZWNvbmQpIHRvIGltcHJvdmUgY2FsbGJhY2sgYWNjdXJhY3kgZHVyaW5nIHRoZXNlIHRlbXBvcmFyeQorICAgICAgICAvLyBkYXRhIHN1cmdlcy4KKyAgICAgICAgY29uc3QgbnNlY3NfdCBlc3RpbWF0ZWROcyA9IGZyYW1lc1RvTmFub3NlY29uZHMobWluRnJhbWVzLCBzYW1wbGVSYXRlLCBzcGVlZCk7CisgICAgICAgIGNvbnN0ZXhwciBuc2Vjc190IG1heFRocm90dGxlQ29tcGVuc2F0aW9uTnMgPSA1MDAwMDAwMDBMTDsKKyAgICAgICAgbnMgPSBlc3RpbWF0ZWROcyAtIG1pbihlc3RpbWF0ZWROcyAvIDIsIG1heFRocm90dGxlQ29tcGVuc2F0aW9uTnMpICsga1dhaXRQZXJpb2ROczsKICAgICAgICAgbnMgLT0gKHRpbWVBZnRlckNhbGxiYWNrcyAtIHRpbWVCZWZvcmVDYWxsYmFja3MpOyAgLy8gYWNjb3VudCBmb3IgY2FsbGJhY2sgdGltZQogICAgICAgICAvLyBUT0RPOiBTaG91bGQgd2Ugd2FybiBpZiB0aGUgY2FsbGJhY2sgdGltZSBpcyB0b28gbG9uZz8KICAgICAgICAgaWYgKG5zIDwgMCkgbnMgPSAwOwpAQCAtMjU3Miw3ICsyNjAzLDcgQEAKICAgICAgICAgICAgICAgICAvLyBXZSB1cGRhdGUgdGhlIHRpbWVzdGFtcCB0aW1lIGV2ZW4gd2hlbiBwYXVzZWQuCiAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9QQVVTRUQgLyogbm90IG5lZWRlZDogU1RBVEVfUEFVU0VEX1NUT1BQSU5HICovKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3Qgbm93ID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGF0ID0gY29udmVydFRpbWVzcGVjVG9Ocyh0aW1lc3RhbXAubVRpbWUpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGF0ID0gYXVkaW9fdXRpbHNfbnNfZnJvbV90aW1lc3BlYygmdGltZXN0YW1wLm1UaW1lKTsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBsYWcgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChldHMubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSX0xBU1RLRVJORUxPS10gPCAwIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0cy5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxfTEFTVEtFUk5FTE9LXSA8IDApCkBAIC0yNTg0LDggKzI2MTUsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoYXQgPCBsaW1pdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInRpbWVzdGFtcCBwYXVzZSBsYWc6JWxsZCBhZGp1c3RpbmcgZnJvbSAlbGxkIHRvICVsbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWxhZywgKGxvbmcgbG9uZylhdCwgKGxvbmcgbG9uZylsaW1pdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWUudHZfc2VjID0gbGltaXQgLyBOQU5PU19QRVJfU0VDT05EOwotICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lLnR2X25zZWMgPSBsaW1pdCAlIE5BTk9TX1BFUl9TRUNPTkQ7IC8vIGNvbXBpbGVyIG9wdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZSA9IGNvbnZlcnROc1RvVGltZXNwZWMobGltaXQpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1QcmV2aW91c0xvY2F0aW9uID0gbG9jYXRpb247CkBAIC0yNjI4LDE4ICsyNjU4LDE4IEBACiAgICAgICAgIC8vIHRoZSBwcmV2aW91cyBzb25nIHVuZGVyIGdhcGxlc3MgcGxheWJhY2suCiAgICAgICAgIC8vIEhvd2V2ZXIsIHdlIHNvbWV0aW1lcyBzZWUgemVybyB0aW1lc3RhbXBzLCB0aGVuIGEgZ2xpdGNoIG9mCiAgICAgICAgIC8vIHRoZSBwcmV2aW91cyBzb25nJ3MgcG9zaXRpb24sIGFuZCB0aGVuIGNvcnJlY3QgdGltZXN0YW1wcyBhZnRlcndhcmRzLgotICAgICAgICBpZiAobVN0YXJ0VXMgIT0gMCAmJiBtU2FtcGxlUmF0ZSAhPSAwKSB7CisgICAgICAgIGlmIChtU3RhcnRGcm9tWmVyb1VzICE9IDAgJiYgbVNhbXBsZVJhdGUgIT0gMCkgewogICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCBrVGltZUppdHRlclVzID0gMTAwMDAwOyAvLyAxMDAgbXMKICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgazFTZWNVcyA9IDEwMDAwMDA7CiAKICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgdGltZU5vdyA9IGdldE5vd1VzKCk7CiAKLSAgICAgICAgICAgIGlmICh0aW1lTm93IDwgbVN0YXJ0VXMgKyBrMVNlY1VzKSB7IC8vIHdpdGhpbiBmaXJzdCBzZWNvbmQgb2Ygc3RhcnRpbmcKKyAgICAgICAgICAgIGlmICh0aW1lTm93IDwgbVN0YXJ0RnJvbVplcm9VcyArIGsxU2VjVXMpIHsgLy8gd2l0aGluIGZpcnN0IHNlY29uZCBvZiBzdGFydGluZwogICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgdGltZXN0YW1wVGltZVVzID0gY29udmVydFRpbWVzcGVjVG9Vcyh0aW1lc3RhbXAubVRpbWUpOwotICAgICAgICAgICAgICAgIGlmICh0aW1lc3RhbXBUaW1lVXMgPCBtU3RhcnRVcykgeworICAgICAgICAgICAgICAgIGlmICh0aW1lc3RhbXBUaW1lVXMgPCBtU3RhcnRGcm9tWmVyb1VzKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsgIC8vIHN0YWxlIHRpbWVzdGFtcCB0aW1lLCBvY2N1cnMgYmVmb3JlIHN0YXJ0LgogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGRlbHRhVGltZVVzID0gdGltZXN0YW1wVGltZVVzIC0gbVN0YXJ0VXM7CisgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBkZWx0YVRpbWVVcyA9IHRpbWVzdGFtcFRpbWVVcyAtIG1TdGFydEZyb21aZXJvVXM7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBkZWx0YVBvc2l0aW9uQnlVcyA9IChkb3VibGUpdGltZXN0YW1wLm1Qb3NpdGlvbiAqIDEwMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgIC8gKChkb3VibGUpbVNhbXBsZVJhdGUgKiBtUGxheWJhY2tSYXRlLm1TcGVlZCk7CiAKQEAgLTI2NjIsMTAgKzI2OTIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoZGVsdGFQb3NpdGlvbkJ5VXMgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtU3RhcnRVcyA9IDA7IC8vIGRvbid0IGNoZWNrIGFnYWluLCB3ZSBnb3QgdmFsaWQgbm9uemVybyBwb3NpdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgbVN0YXJ0RnJvbVplcm9VcyA9IDA7IC8vIGRvbid0IGNoZWNrIGFnYWluLCB3ZSBnb3QgdmFsaWQgbm9uemVybyBwb3NpdGlvbi4KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TdGFydFVzID0gMDsgLy8gZG9uJ3QgY2hlY2sgYWdhaW4sIHN0YXJ0IHRpbWUgZXhwaXJlZC4KKyAgICAgICAgICAgICAgICBtU3RhcnRGcm9tWmVyb1VzID0gMDsgLy8gZG9uJ3QgY2hlY2sgYWdhaW4sIHN0YXJ0IHRpbWUgZXhwaXJlZC4KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1UaW1lc3RhbXBTdGFydHVwR2xpdGNoUmVwb3J0ZWQgPSBmYWxzZTsKICAgICAgICAgfQpAQCAtMjcwMywxMyArMjczMywzMyBAQAogICAgIC8vIFByZXZlbnQgcmV0cm9ncmFkZSBtb3Rpb24gaW4gdGltZXN0YW1wLgogICAgIC8vIFRoaXMgaXMgc29tZXRpbWVzIGNhdXNlZCBieSBlcnJhdGljIHJlcG9ydHMgb2YgdGhlIGF2YWlsYWJsZSBzcGFjZSBpbiB0aGUgQUxTQSBkcml2ZXJzLgogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gcHJldmlvdXNUaW1lc3RhbXBWYWxpZCBpcyBzZXQgdG8gZmFsc2Ugd2hlbiBzdGFydGluZyBhZnRlciBhIHN0b3Agb3IgZmx1c2guCiAgICAgICAgIGlmIChwcmV2aW91c1RpbWVzdGFtcFZhbGlkKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQ2NF90IHByZXZpb3VzVGltZU5hbm9zID0gY29udmVydFRpbWVzcGVjVG9OcyhtUHJldmlvdXNUaW1lc3RhbXAubVRpbWUpOwotICAgICAgICAgICAgY29uc3QgaW50NjRfdCBjdXJyZW50VGltZU5hbm9zID0gY29udmVydFRpbWVzcGVjVG9Ocyh0aW1lc3RhbXAubVRpbWUpOworICAgICAgICAgICAgY29uc3QgaW50NjRfdCBwcmV2aW91c1RpbWVOYW5vcyA9CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3V0aWxzX25zX2Zyb21fdGltZXNwZWMoJm1QcmV2aW91c1RpbWVzdGFtcC5tVGltZSk7CisgICAgICAgICAgICBpbnQ2NF90IGN1cnJlbnRUaW1lTmFub3MgPSBhdWRpb191dGlsc19uc19mcm9tX3RpbWVzcGVjKCZ0aW1lc3RhbXAubVRpbWUpOworCisgICAgICAgICAgICAvLyBGaXggc3RhbGUgdGltZSB3aGVuIGNoZWNraW5nIHRpbWVzdGFtcCByaWdodCBhZnRlciBzdGFydCgpLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEZvciBvZmZsb2FkIGNvbXBhdGliaWxpdHksIHVzZSBhIGRlZmF1bHQgbGFnIHZhbHVlIGhlcmUuCisgICAgICAgICAgICAvLyBBbnkgdGltZSBkaXNjcmVwYW5jeSBiZXR3ZWVuIHRoaXMgdXBkYXRlIGFuZCB0aGUgcGF1c2UgdGltZXN0YW1wIGlzIGhhbmRsZWQKKyAgICAgICAgICAgIC8vIGJ5IHRoZSByZXRyb2dyYWRlIGNoZWNrIGFmdGVyd2FyZHMuCisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGxhZ05zID0gaW50NjRfdChtQWZMYXRlbmN5ICogMTAwMDAwMExMKTsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgbGltaXROcyA9IG1TdGFydE5zIC0gbGFnTnM7CisgICAgICAgICAgICBpZiAoY3VycmVudFRpbWVOYW5vcyA8IGxpbWl0TnMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiY29ycmVjdGluZyB0aW1lc3RhbXAgdGltZSBmb3IgcGF1c2UsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdXJyZW50VGltZU5hbm9zOiAlbGxkIDwgbGltaXROczogJWxsZCA8IG1TdGFydE5zOiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpY3VycmVudFRpbWVOYW5vcywgKGxvbmcgbG9uZylsaW1pdE5zLCAobG9uZyBsb25nKW1TdGFydE5zKTsKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWUgPSBjb252ZXJ0TnNUb1RpbWVzcGVjKGxpbWl0TnMpOworICAgICAgICAgICAgICAgIGN1cnJlbnRUaW1lTmFub3MgPSBsaW1pdE5zOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyByZXRyb2dyYWRlIGNoZWNrCiAgICAgICAgICAgICBpZiAoY3VycmVudFRpbWVOYW5vcyA8IHByZXZpb3VzVGltZU5hbm9zKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coInJldHJvZ3JhZGUgdGltZXN0YW1wIHRpbWUgY29ycmVjdGVkLCAlbGxkIDwgJWxsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWN1cnJlbnRUaW1lTmFub3MsIChsb25nIGxvbmcpcHJldmlvdXNUaW1lTmFub3MpOwogICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZSA9IG1QcmV2aW91c1RpbWVzdGFtcC5tVGltZTsKKyAgICAgICAgICAgICAgICAvLyBjdXJyZW50VGltZU5hbm9zIG5vdCB1c2VkIGJlbG93LgogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBMb29raW5nIGF0IHNpZ25lZCBkZWx0YSB3aWxsIHdvcmsgZXZlbiB3aGVuIHRoZSB0aW1lc3RhbXBzCkBAIC0yNzM1LDcgKzI3ODUsNyBAQAogI2lmIDAKICAgICAgICAgICAgIC8vIFVuY29tbWVudCB0aGlzIHRvIHZlcmlmeSBhdWRpbyB0aW1lc3RhbXAgcmF0ZS4KICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgZGVsdGFUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgY29udmVydFRpbWVzcGVjVG9Ocyh0aW1lc3RhbXAubVRpbWUpIC0gcHJldmlvdXNUaW1lTmFub3M7CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3V0aWxzX25zX2Zyb21fdGltZXNwZWMoJnRpbWVzdGFtcC5tVGltZSkgLSBwcmV2aW91c1RpbWVOYW5vczsKICAgICAgICAgICAgIGlmIChkZWx0YVRpbWUgIT0gMCkgewogICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgY29tcHV0ZWRTYW1wbGVSYXRlID0KICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhUG9zaXRpb24gKiAobG9uZyBsb25nKU5BTk9TX1BFUl9TRUNPTkQgLyBkZWx0YVRpbWU7CkBAIC0yODI3LDcgKzI4NzcsNyBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgaWYgKG1EZXZpY2VDYWxsYmFjayA9PSBjYWxsYmFjaykgeworICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sudW5zYWZlX2dldCgpID09IGNhbGxiYWNrLmdldCgpKSB7CiAgICAgICAgIEFMT0dXKCIlcyBhZGRpbmcgc2FtZSBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQpAQCAtMjgzNSw5ICsyODg1LDkgQEAKICAgICBpZiAobU91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDApIHsKICAgICAgICAgICAgIEFMT0dXKCIlcyBjYWxsYmFjayBhbHJlYWR5IHByZXNlbnQhIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjaywgbU91dHB1dCk7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtT3V0cHV0KTsKICAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhjYWxsYmFjaywgbU91dHB1dCk7CisgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1PdXRwdXQpOwogICAgIH0KICAgICBtRGV2aWNlQ2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICByZXR1cm4gc3RhdHVzOwpAQCAtMjg1MSwxNyArMjkwMSwzOSBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSBjYWxsYmFjaykgeworICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sudW5zYWZlX2dldCgpICE9IGNhbGxiYWNrLmdldCgpKSB7CiAgICAgICAgIEFMT0dXKCIlcyByZW1vdmluZyBkaWZmZXJlbnQgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KKyAgICBtRGV2aWNlQ2FsbGJhY2suY2xlYXIoKTsKICAgICBpZiAobU91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2ssIG1PdXRwdXQpOworICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtT3V0cHV0KTsKICAgICB9Ci0gICAgbURldmljZUNhbGxiYWNrID0gMDsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKKwordm9pZCBBdWRpb1RyYWNrOjpvbkF1ZGlvRGV2aWNlVXBkYXRlKGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKQoreworICAgIHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiBjYWxsYmFjazsKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKGF1ZGlvSW8gIT0gbU91dHB1dCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNhbGxiYWNrID0gbURldmljZUNhbGxiYWNrLnByb21vdGUoKTsKKyAgICAgICAgLy8gb25seSB1cGRhdGUgZGV2aWNlIGlmIHRoZSB0cmFjayBpcyBhY3RpdmUgYXMgcm91dGUgY2hhbmdlcyBkdWUgdG8gb3RoZXIgdXNlIGNhc2VzIGFyZQorICAgICAgICAvLyBpcnJlbGV2YW50IGZvciB0aGlzIGNsaWVudAorICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX0FDVElWRSkgeworICAgICAgICAgICAgbVJvdXRlZERldmljZUlkID0gZGV2aWNlSWQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGNhbGxiYWNrLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgY2FsbGJhY2stPm9uQXVkaW9EZXZpY2VVcGRhdGUobU91dHB1dCwgbVJvdXRlZERldmljZUlkKTsKKyAgICB9Cit9CisKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnBlbmRpbmdEdXJhdGlvbihpbnQzMl90ICptc2VjLCBFeHRlbmRlZFRpbWVzdGFtcDo6TG9jYXRpb24gbG9jYXRpb24pCiB7CiAgICAgaWYgKG1zZWMgPT0gbnVsbHB0ciB8fApAQCAtMjkxOSw3ICsyOTkxLDcgQEAKICAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6CiAgICAgICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0X2woKSkgewogICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2UgaGF2ZSBzdGFydGVkIGluIHRoZSBwYXN0IHRvIHJldHVybiB0cnVlLgotICAgICAgICAgICAgcmV0dXJuIG1TdGFydFVzID4gMDsKKyAgICAgICAgICAgIHJldHVybiBtU3RhcnRGcm9tWmVyb1VzID4gMDsKICAgICAgICAgfQogICAgICAgICAvLyBBIG5vcm1hbCBhdWRpbyB0cmFjayBtYXkgc3RpbGwgYmUgZHJhaW5pbmcsIHNvCiAgICAgICAgIC8vIGNoZWNrIGlmIHN0cmVhbSBoYXMgZW5kZWQuICBUaGlzIGNvdmVycyBmYXN0dHJhY2sgcG9zaXRpb24KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2tTaGFyZWQuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAKaW5kZXggMDhjMzdmOC4uN2JmNGY5OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAKQEAgLTM2LDcgKzM2LDcgQEAKIC8vIGEgdmFsdWUgYmV0d2VlbiAib3RoZXIiICsgMSBhbmQgIm90aGVyIiArIElOVDMyX01BWCwgdGhlIGNob2ljZSBvZgogLy8gd2hpY2ggbmVlZHMgdG8gYmUgdGhlICJsZWFzdCByZWNlbnRseSB1c2VkIiBzZXF1ZW5jZSB2YWx1ZSBmb3IgInNlbGYiLgogLy8gSW4gZ2VuZXJhbCwgdGhpcyBtZWFucyAobmV3X3NlbGYpIHJldHVybmVkIGlzIG1heChzZWxmLCBvdGhlcikgKyAxLgotCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKIHN0YXRpYyB1aW50MzJfdCBpbmNyZW1lbnRTZXF1ZW5jZSh1aW50MzJfdCBzZWxmLCB1aW50MzJfdCBvdGhlcikgewogICAgIGludDMyX3QgZGlmZiA9IChpbnQzMl90KSBzZWxmIC0gKGludDMyX3QpIG90aGVyOwogICAgIGlmIChkaWZmID49IDAgJiYgZGlmZiA8IElOVDMyX01BWCkgewpAQCAtMzkzLDYgKzM5Myw3IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKIHZvaWQgQXVkaW9UcmFja0NsaWVudFByb3h5OjpmbHVzaCgpCiB7CiAgICAgLy8gVGhpcyB3b3JrcyBmb3IgbUZyYW1lQ291bnRQMiA8PSAyXjMwCkBAIC04NDAsNiArODQxLDI1IEBACiAgICAgcmV0dXJuIGZpbGxlZDsKIH0KIAorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoImludGVnZXIiKSkpCitzaXplX3QgQXVkaW9UcmFja1NlcnZlclByb3h5OjpmcmFtZXNSZWFkeVNhZmUoKSBjb25zdAoreworICAgIGlmIChtSXNTaHV0ZG93bikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgY29uc3QgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gbUNibGs7CisgICAgY29uc3QgaW50MzJfdCBmbHVzaCA9IGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgmY2Jsay0+dS5tU3RyZWFtaW5nLm1GbHVzaCk7CisgICAgaWYgKGZsdXNoICE9IG1GbHVzaCkgeworICAgICAgICByZXR1cm4gbUZyYW1lQ291bnQ7CisgICAgfQorICAgIGNvbnN0IGludDMyX3QgcmVhciA9IGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgmY2Jsay0+dS5tU3RyZWFtaW5nLm1SZWFyKTsKKyAgICBjb25zdCBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBjYmxrLT51Lm1TdHJlYW1pbmcubUZyb250OworICAgIGlmICghKDAgPD0gZmlsbGVkICYmIChzaXplX3QpIGZpbGxlZCA8PSBtRnJhbWVDb3VudCkpIHsKKyAgICAgICAgcmV0dXJuIDA7IC8vIGVycm9yIGNvbmRpdGlvbiwgc2lsZW50bHkgcmV0dXJuIDAuCisgICAgfQorICAgIHJldHVybiBmaWxsZWQ7Cit9CisKIGJvb2wgIEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6c2V0U3RyZWFtRW5kRG9uZSgpIHsKICAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSBtQ2JsazsKICAgICBib29sIG9sZCA9CkBAIC04NTEsNiArODcxLDcgQEAKICAgICByZXR1cm4gb2xkOwogfQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKIHZvaWQgQXVkaW9UcmFja1NlcnZlclByb3h5Ojp0YWxseVVuZGVycnVuRnJhbWVzKHVpbnQzMl90IGZyYW1lQ291bnQpCiB7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gbUNibGs7CkBAIC05MDgsNiArOTI5LDExIEBACiAgICAgcmV0dXJuIG1GcmFtZXNSZWFkeVNhZmU7CiB9CiAKK3NpemVfdCBTdGF0aWNBdWRpb1RyYWNrU2VydmVyUHJveHk6OmZyYW1lc1JlYWR5U2FmZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1GcmFtZXNSZWFkeVNhZmU7Cit9CisKIHN0YXR1c190IFN0YXRpY0F1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6dXBkYXRlU3RhdGVXaXRoTG9vcCgKICAgICAgICAgU3RhdGljQXVkaW9UcmFja1N0YXRlICpsb2NhbFN0YXRlLCBjb25zdCBTdGF0aWNBdWRpb1RyYWNrU3RhdGUgJnVwZGF0ZSkgY29uc3QKIHsKQEAgLTEwMDEsNiArMTAyNyw3IEBACiAgICAgcmV0dXJuIChzc2l6ZV90KSBtU3RhdGUubVBvc2l0aW9uOwogfQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKIHN0YXR1c190IFN0YXRpY0F1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6b2J0YWluQnVmZmVyKEJ1ZmZlciogYnVmZmVyLCBib29sIGFja0ZsdXNoKQogewogICAgIGlmIChtSXNTaHV0ZG93bikgewpAQCAtMTA0Nyw2ICsxMDc0LDcgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJpbnRlZ2VyIikpKQogdm9pZCBTdGF0aWNBdWRpb1RyYWNrU2VydmVyUHJveHk6OnJlbGVhc2VCdWZmZXIoQnVmZmVyKiBidWZmZXIpCiB7CiAgICAgc2l6ZV90IHN0ZXBDb3VudCA9IGJ1ZmZlci0+bUZyYW1lQ291bnQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwCmluZGV4IDk4YTA1MjEuLmFkN2YxZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwCkBAIC00OCw2ICs0OCwxOCBAQAogICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgY29uZmlnLT5mb3JtYXQpOwogfQogCitpbmxpbmUgdm9pZCByZWFkUmVjb3JkQ2xpZW50SW5mb0Zyb21QYXJjZWwoY29uc3QgUGFyY2VsJiBkYXRhLCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbykgeworICAgIGNsaWVudEluZm8tPnVpZCA9ICh1aWRfdCkgZGF0YS5yZWFkVWludDMyKCk7CisgICAgY2xpZW50SW5mby0+c2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgY2xpZW50SW5mby0+c291cmNlID0gKGF1ZGlvX3NvdXJjZV90KSBkYXRhLnJlYWRJbnQzMigpOworfQorCitpbmxpbmUgdm9pZCB3cml0ZVJlY29yZENsaWVudEluZm9Gcm9tUGFyY2VsKFBhcmNlbCYgZGF0YSwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8pIHsKKyAgICBkYXRhLndyaXRlVWludDMyKCh1aW50MzJfdCkgY2xpZW50SW5mby0+dWlkKTsKKyAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGNsaWVudEluZm8tPnNlc3Npb24pOworICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgY2xpZW50SW5mby0+c291cmNlKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogY2xhc3MgQnBBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4KIHsKQEAgLTgwLDE0ICs5MiwxMyBAQAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoTUlYX1NUQVRFX1VQREFURSwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CiAgICAgfQogCi0gICAgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCiAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihldmVudCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNvdXJjZSk7CisgICAgICAgIHdyaXRlUmVjb3JkQ2xpZW50SW5mb0Zyb21QYXJjZWwoZGF0YSwgY2xpZW50SW5mbyk7CiAgICAgICAgIHdyaXRlQXVkaW9Db25maWdCYXNlVG9QYXJjZWwoZGF0YSwgY2xpZW50Q29uZmlnKTsKICAgICAgICAgd3JpdGVBdWRpb0NvbmZpZ0Jhc2VUb1BhcmNlbChkYXRhLCBkZXZpY2VDb25maWcpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocGF0Y2hIYW5kbGUpOwpAQCAtMTIzLDE0ICsxMzQsMTQgQEAKICAgICBjYXNlIFJFQ09SRElOR19DT05GSUdVUkFUSU9OX1VQREFURTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGludCBldmVudCA9IChpbnQpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICByZWNvcmRfY2xpZW50X2luZm9fdCBjbGllbnRJbmZvOwogICAgICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjbGllbnRDb25maWc7CiAgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IGRldmljZUNvbmZpZzsKKyAgICAgICAgICAgIHJlYWRSZWNvcmRDbGllbnRJbmZvRnJvbVBhcmNlbChkYXRhLCAmY2xpZW50SW5mbyk7CiAgICAgICAgICAgICByZWFkQXVkaW9Db25maWdCYXNlRnJvbVBhcmNlbChkYXRhLCAmY2xpZW50Q29uZmlnKTsKICAgICAgICAgICAgIHJlYWRBdWRpb0NvbmZpZ0Jhc2VGcm9tUGFyY2VsKGRhdGEsICZkZXZpY2VDb25maWcpOwogICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUgPSAoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsIHNlc3Npb24sIHNvdXJjZSwgJmNsaWVudENvbmZpZywgJmRldmljZUNvbmZpZywKKyAgICAgICAgICAgIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgJmNsaWVudEluZm8sICZjbGllbnRDb25maWcsICZkZXZpY2VDb25maWcsCiAgICAgICAgICAgICAgICAgICAgIHBhdGNoSGFuZGxlKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L09XTkVSUyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODJiOWZiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvT1dORVJTCkBAIC0wLDAgKzEsMyBAQAorZ2thc3RlbkBnb29nbGUuY29tCitqbXRyaXZpQGdvb2dsZS5jb20KK21uYWdhbm92QGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Jb0Rlc2NyaXB0b3IuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Jb0Rlc2NyaXB0b3IuaAppbmRleCBmZWQ4NmM5Li44NTlmMWE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvSW9EZXNjcmlwdG9yLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5oCkBAIC0yMCw5ICsyMCwxMSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBlbnVtIGF1ZGlvX2lvX2NvbmZpZ19ldmVudCB7CisgICAgQVVESU9fT1VUUFVUX1JFR0lTVEVSRUQsCiAgICAgQVVESU9fT1VUUFVUX09QRU5FRCwKICAgICBBVURJT19PVVRQVVRfQ0xPU0VELAogICAgIEFVRElPX09VVFBVVF9DT05GSUdfQ0hBTkdFRCwKKyAgICBBVURJT19JTlBVVF9SRUdJU1RFUkVELAogICAgIEFVRElPX0lOUFVUX09QRU5FRCwKICAgICBBVURJT19JTlBVVF9DTE9TRUQsCiAgICAgQVVESU9fSU5QVVRfQ09ORklHX0NIQU5HRUQsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKaW5kZXggZTZhNWVmYi4uZGQ3MjE3MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaApAQCAtMzMsNyArMzMsNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWNsYXNzIEF1ZGlvUmVjb3JkIDogcHVibGljIFJlZkJhc2UKK2NsYXNzIEF1ZGlvUmVjb3JkIDogcHVibGljIEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrCiB7CiBwdWJsaWM6CiAKQEAgLTQyNCw3ICs0MjQsMTIgQEAKIAogICAgICAvKiBSZXR1cm5zIHRoZSBJRCBvZiB0aGUgYXVkaW8gZGV2aWNlIGFjdHVhbGx5IHVzZWQgYnkgdGhlIGlucHV0IHRvIHdoaWNoIHRoaXMgQXVkaW9SZWNvcmQKICAgICAgICogaXMgYXR0YWNoZWQuCi0gICAgICAqIEEgdmFsdWUgb2YgQVVESU9fUE9SVF9IQU5ETEVfTk9ORSBpbmRpY2F0ZXMgdGhlIEF1ZGlvUmVjb3JkIGlzIG5vdCBhdHRhY2hlZCB0byBhbnkgaW5wdXQuCisgICAgICAqIFRoZSBkZXZpY2UgSUQgaXMgcmVsZXZhbnQgb25seSBpZiB0aGUgQXVkaW9SZWNvcmQgaXMgYWN0aXZlLgorICAgICAgKiBXaGVuIHRoZSBBdWRpb1JlY29yZCBpcyBpbmFjdGl2ZSwgdGhlIGRldmljZSBJRCByZXR1cm5lZCBjYW4gYmUgZWl0aGVyOgorICAgICAgKiAtIEFVRElPX1BPUlRfSEFORExFX05PTkUgaWYgdGhlIEF1ZGlvUmVjb3JkIGlzIG5vdCBhdHRhY2hlZCB0byBhbnkgb3V0cHV0LgorICAgICAgKiAtIFRoZSBkZXZpY2UgSUQgdXNlZCBiZWZvcmUgcGF1c2VkIG9yIHN0b3BwZWQuCisgICAgICAqIC0gVGhlIGRldmljZSBJRCBzZWxlY3RlZCBieSBhdWRpbyBwb2xpY3kgbWFuYWdlciBvZiBzZXRPdXRwdXREZXZpY2UoKSBpZiB0aGUgQXVkaW9SZWNvcmQKKyAgICAgICogaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgeWV0LgogICAgICAgKgogICAgICAgKiBQYXJhbWV0ZXJzOgogICAgICAgKiAgbm9uZS4KQEAgLTQ1NCw2ICs0NTksMTAgQEAKICAgICAgICAgICAgIHN0YXR1c190IHJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spOwogCisgICAgICAgICAgICAvLyBBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4gdmlydHVhbHMKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvRGV2aWNlVXBkYXRlKGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKKwogcHJpdmF0ZToKICAgICAvKiBJZiBub25Db250aWcgaXMgbm9uLU5VTEwsIGl0IGlzIGFuIG91dHB1dCBwYXJhbWV0ZXIgdGhhdCB3aWxsIGJlIHNldCB0byB0aGUgbnVtYmVyIG9mCiAgICAgICogYWRkaXRpb25hbCBub24tY29udGlndW91cyBmcmFtZXMgdGhhdCBhcmUgcHJlZGljdGVkIHRvIGJlIGF2YWlsYWJsZSBpbW1lZGlhdGVseSwKQEAgLTU2MSw2ICs1NzAsOCBAQAogICAgICAgICAgICAgLy8gRklYTUUgZW51bSBpcyBmYXN0ZXIgdGhhbiBzdHJjbXAoKSBmb3IgcGFyYW1ldGVyICdmcm9tJwogICAgICAgICAgICAgc3RhdHVzX3QgcmVzdG9yZVJlY29yZF9sKGNvbnN0IGNoYXIgKmZyb20pOwogCisgICAgICAgICAgICB2b2lkICAgICB1cGRhdGVSb3V0ZWREZXZpY2VJZF9sKCk7CisKICAgICBzcDxBdWRpb1JlY29yZFRocmVhZD4gICBtQXVkaW9SZWNvcmRUaHJlYWQ7CiAgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgbUxvY2s7CiAKQEAgLTY2NSw3ICs2NzYsNyBAQAogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1Sb3V0ZWREZXZpY2VJZDsgICAvLyBEZXZpY2UgYWN0dWFsbHkgc2VsZWN0ZWQgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF5IG5vdCBtYXRjaCB0aGUgYXBwIHNlbGVjdGlvbiBkZXBlbmRpbmcgb24gb3RoZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY3Rpdml0eSBhbmQgY29ubmVjdGVkIGRldmljZXMKLSAgICBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4gbURldmljZUNhbGxiYWNrOworICAgIHdwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiBtRGV2aWNlQ2FsbGJhY2s7CiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICBtUG9ydElkOyAgLy8gdW5pcXVlIElEIGFsbG9jYXRlZCBieSBhdWRpbyBwb2xpY3kKIAogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaAppbmRleCAyZTM5ZDIzLi41YTgxZDgzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCkBAIC0zMyw3ICszMyw3IEBACiAKIHR5cGVkZWYgdm9pZCAoKmF1ZGlvX2Vycm9yX2NhbGxiYWNrKShzdGF0dXNfdCBlcnIpOwogdHlwZWRlZiB2b2lkICgqZHluYW1pY19wb2xpY3lfY2FsbGJhY2spKGludCBldmVudCwgU3RyaW5nOCByZWdJZCwgaW50IHZhbCk7Ci10eXBlZGVmIHZvaWQgKCpyZWNvcmRfY29uZmlnX2NhbGxiYWNrKShpbnQgZXZlbnQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBpbnQgc291cmNlLAordHlwZWRlZiB2b2lkICgqcmVjb3JkX2NvbmZpZ19jYWxsYmFjaykoaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CiAKQEAgLTM3MCw5ICszNzAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSA9IDA7CiAgICAgfTsKIAotICAgIHN0YXRpYyBzdGF0dXNfdCBhZGRBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICBzdGF0aWMgc3RhdHVzX3QgYWRkQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9Jbyk7Ci0gICAgc3RhdGljIHN0YXR1c190IHJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAorICAgIHN0YXRpYyBzdGF0dXNfdCByZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKTsKIAogICAgIHN0YXRpYyBhdWRpb19wb3J0X2hhbmRsZV90IGdldERldmljZUlkRm9ySW8oYXVkaW9faW9faGFuZGxlX3QgYXVkaW9Jbyk7CkBAIC00MDMsOSArNDAzLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb0lvRGVzY3JpcHRvcj4mIGlvRGVzYyk7CiAKIAotICAgICAgICBzdGF0dXNfdCBhZGRBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgc3RhdHVzX3QgYWRkQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pOwotICAgICAgICBzdGF0dXNfdCByZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgc3RhdHVzX3QgcmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9Jbyk7CiAKICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXREZXZpY2VJZEZvcklvKGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pOwpAQCAtNDEzLDcgKzQxMyw3IEBACiAgICAgcHJpdmF0ZToKICAgICAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CiAgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+ID4gICBtSW9EZXNjcmlwdG9yczsKLSAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBWZWN0b3IgPCBzcDxBdWRpb0RldmljZUNhbGxiYWNrPiA+ID4KKyAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBWZWN0b3IgPCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiA+ID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrczsKICAgICAgICAgLy8gY2FjaGVkIHZhbHVlcyBmb3IgcmVjb3JkaW5nIGdldElucHV0QnVmZmVyU2l6ZSgpIHF1ZXJpZXMKICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluQnVmZlNpemU7ICAgIC8vIHplcm8gaW5kaWNhdGVzIGNhY2hlIGlzIGludmFsaWQKQEAgLTQ0MCw4ICs0NDAsOSBAQAogICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShTdHJpbmc4IHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKIAogICAgIHByaXZhdGU6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCmluZGV4IGIxNjhmYzkuLjQ3ZDg3ZTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCkBAIC0zNSw3ICszNSw3IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotY2xhc3MgQXVkaW9UcmFjayA6IHB1YmxpYyBSZWZCYXNlCitjbGFzcyBBdWRpb1RyYWNrIDogcHVibGljIEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrCiB7CiBwdWJsaWM6CiAKQEAgLTYwNSw3ICs2MDUsMTEgQEAKIAogICAgICAvKiBSZXR1cm5zIHRoZSBJRCBvZiB0aGUgYXVkaW8gZGV2aWNlIGFjdHVhbGx5IHVzZWQgYnkgdGhlIG91dHB1dCB0byB3aGljaCB0aGlzIEF1ZGlvVHJhY2sgaXMKICAgICAgICogYXR0YWNoZWQuCi0gICAgICAqIEEgdmFsdWUgb2YgQVVESU9fUE9SVF9IQU5ETEVfTk9ORSBpbmRpY2F0ZXMgdGhlIGF1ZGlvIHRyYWNrIGlzIG5vdCBhdHRhY2hlZCB0byBhbnkgb3V0cHV0LgorICAgICAgKiBXaGVuIHRoZSBBdWRpb1RyYWNrIGlzIGluYWN0aXZlLCB0aGUgZGV2aWNlIElEIHJldHVybmVkIGNhbiBiZSBlaXRoZXI6CisgICAgICAqIC0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSBpZiB0aGUgQXVkaW9UcmFjayBpcyBub3QgYXR0YWNoZWQgdG8gYW55IG91dHB1dC4KKyAgICAgICogLSBUaGUgZGV2aWNlIElEIHVzZWQgYmVmb3JlIHBhdXNlZCBvciBzdG9wcGVkLgorICAgICAgKiAtIFRoZSBkZXZpY2UgSUQgc2VsZWN0ZWQgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIgb2Ygc2V0T3V0cHV0RGV2aWNlKCkgaWYgdGhlIEF1ZGlvVHJhY2sKKyAgICAgICogaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgeWV0LgogICAgICAgKgogICAgICAgKiBQYXJhbWV0ZXJzOgogICAgICAgKiAgbm9uZS4KQEAgLTg0NSw2ICs4NDksMTIgQEAKICAgICAgICAgICAgIHN0YXR1c190IHJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spOwogCisgICAgICAgICAgICAvLyBBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4gdmlydHVhbHMKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvRGV2aWNlVXBkYXRlKGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKKworCisKICAgICAvKiBPYnRhaW4gdGhlIHBlbmRpbmcgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIGZvciBwbGF5YmFjayBvZiBwdXJlIFBDTQogICAgICAqIChtaXhhYmxlIHdpdGhvdXQgZW1iZWRkZWQgdGltaW5nKSBkYXRhIHJlbWFpbmluZyBpbiBBdWRpb1RyYWNrLgogICAgICAqCkBAIC05NzQsNiArOTg0LDggQEAKIAogICAgICAgICAgICAgdm9pZCAgICAgcmVzdGFydElmRGlzYWJsZWQoKTsKIAorICAgICAgICAgICAgdm9pZCAgICAgdXBkYXRlUm91dGVkRGV2aWNlSWRfbCgpOworCiAgICAgLy8gTmV4dCA0IGZpZWxkcyBtYXkgYmUgY2hhbmdlZCBpZiBJQXVkaW9UcmFjayBpcyByZS1jcmVhdGVkLCBidXQgYWx3YXlzICE9IDAKICAgICBzcDxJQXVkaW9UcmFjaz4gICAgICAgICBtQXVkaW9UcmFjazsKICAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICBtQ2Jsa01lbW9yeTsKQEAgLTEwODUsOCArMTA5NywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IGJ5IHN0b3AoKSBidXQgY29udGludWVzIG1vbm90b25pY2FsbHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZnRlciBuZXcgSUF1ZGlvVHJhY2sgdG8gcmVzdG9yZSBtUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGNvdWxkIGJlIGVhc2lseSB3aWRlbmVkIHRvIHVpbnQ2NF90Ci0gICAgaW50NjRfdCAgICAgICAgICAgICAgICAgbVN0YXJ0VXM7ICAgICAgICAgICAgICAgLy8gdGhlIHN0YXJ0IHRpbWUgYWZ0ZXIgZmx1c2ggb3Igc3RvcC4KKyAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICBtU3RhcnRGcm9tWmVyb1VzOyAgICAgICAvLyB0aGUgc3RhcnQgdGltZSBhZnRlciBmbHVzaCBvciBzdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gcG9zaXRpb24gc2hvdWxkIGJlIDAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSB1c2VkIGZvciBvZmZsb2FkZWQgYW5kIGRpcmVjdCB0cmFja3MuCisgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgbVN0YXJ0TnM7ICAgICAgICAgICAgICAgLy8gdGhlIHRpbWUgd2hlbiBzdGFydCgpIGlzIGNhbGxlZC4KICAgICBFeHRlbmRlZFRpbWVzdGFtcCAgICAgICBtU3RhcnRFdHM7ICAgICAgICAgICAgICAvLyBFeHRlbmRlZCB0aW1lc3RhbXAgYXQgc3RhcnQgZm9yIG5vcm1hbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvVHJhY2tzLgogICAgIEF1ZGlvVGltZXN0YW1wICAgICAgICAgIG1TdGFydFRzOyAgICAgICAgICAgICAgIC8vIFRpbWVzdGFtcCBhdCBzdGFydCBmb3Igb2ZmbG9hZGVkIG9yIGRpcmVjdApAQCAtMTE2Myw3ICsxMTc3LDcgQEAKICAgICB1aWRfdCAgICAgICAgICAgICAgICAgICBtQ2xpZW50VWlkOwogICAgIHBpZF90ICAgICAgICAgICAgICAgICAgIG1DbGllbnRQaWQ7CiAKLSAgICBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4gbURldmljZUNhbGxiYWNrOworICAgIHdwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiBtRGV2aWNlQ2FsbGJhY2s7CiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbVBvcnRJZDsgIC8vIHVuaXF1ZSBJRCBhbGxvY2F0ZWQgYnkgYXVkaW8gcG9saWN5CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oCmluZGV4IGQ5NGFkMDAuLmUwZDI0OTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oCkBAIC0yNiw2ICsyNiwxNiBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK3N0cnVjdCByZWNvcmRfY2xpZW50X2luZm8geworICAgIHVpZF90IHVpZDsKKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbjsKKyAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2U7Cit9OworCit0eXBlZGVmIHN0cnVjdCByZWNvcmRfY2xpZW50X2luZm8gcmVjb3JkX2NsaWVudF9pbmZvX3Q7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogY2xhc3MgSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCA6IHB1YmxpYyBJSW50ZXJmYWNlCiB7CiBwdWJsaWM6CkBAIC0zOCw4ICs0OCw4IEBACiAgICAgLy8gTm90aWZpZXMgYSBjaGFuZ2UgaW4gdGhlIG1peGluZyBzdGF0ZSBvZiBhIHNwZWNpZmljIG1peCBpbiBhIGR5bmFtaWMgYXVkaW8gcG9saWN5CiAgICAgdmlydHVhbCB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpID0gMDsKICAgICAvLyBOb3RpZmllcyBhIGNoYW5nZSBvZiBhdWRpbyByZWNvcmRpbmcgY29uZmlndXJhdGlvbgotICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKKyAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAogICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAogICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQubWsgYi9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLm1rCmluZGV4IGU1OTIxNjkuLjgyNzkwOGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5tawpAQCAtMyw2ICszLDcgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3V0aWxzIFwKICAgICBsaWJjdXRpbHMgICBcCiAgICAgbGlibG9nICAgICAgXAogICAgIGxpYnV0aWxzICAgIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlSGFsSGlkbC5jcHAKaW5kZXggNzFmYmQ5OC4uNDllZjk5MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlSGFsSGlkbC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlSGFsSGlkbC5jcHAKQEAgLTk4LDcgKzk4LDggQEAKIH0gIC8vIG5hbWVzcGFjZQogCiBEZXZpY2VIYWxIaWRsOjpEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPElEZXZpY2U+JiBkZXZpY2UpCi0gICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIkRldmljZSIpLCBtRGV2aWNlKGRldmljZSkgeworICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJEZXZpY2UiKSwgbURldmljZShkZXZpY2UpLAorICAgICAgICAgIG1QcmltYXJ5RGV2aWNlKElQcmltYXJ5RGV2aWNlOjpjYXN0RnJvbShkZXZpY2UpKSB7CiB9CiAKIERldmljZUhhbEhpZGw6On5EZXZpY2VIYWxIaWRsKCkgewpAQCAtMTIwLDI0ICsxMjEsMjEgQEAKIAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3A8SVByaW1hcnlEZXZpY2U+IHByaW1hcnlEZXYgPSBJUHJpbWFyeURldmljZTo6Y2FzdEZyb20obURldmljZSk7Ci0gICAgaWYgKHByaW1hcnlEZXYgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2ljZVZvbHVtZSIsIHByaW1hcnlEZXYtPnNldFZvaWNlVm9sdW1lKHZvbHVtZSkpOworICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFZvaWNlVm9sdW1lIiwgbVByaW1hcnlEZXZpY2UtPnNldFZvaWNlVm9sdW1lKHZvbHVtZSkpOwogfQogCiBzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3A8SVByaW1hcnlEZXZpY2U+IHByaW1hcnlEZXYgPSBJUHJpbWFyeURldmljZTo6Y2FzdEZyb20obURldmljZSk7Ci0gICAgaWYgKHByaW1hcnlEZXYgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNYXN0ZXJWb2x1bWUiLCBwcmltYXJ5RGV2LT5zZXRNYXN0ZXJWb2x1bWUodm9sdW1lKSk7CisgICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyVm9sdW1lIiwgbVByaW1hcnlEZXZpY2UtPnNldE1hc3RlclZvbHVtZSh2b2x1bWUpKTsKIH0KIAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpIHsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBzcDxJUHJpbWFyeURldmljZT4gcHJpbWFyeURldiA9IElQcmltYXJ5RGV2aWNlOjpjYXN0RnJvbShtRGV2aWNlKTsKLSAgICBpZiAocHJpbWFyeURldiA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBwcmltYXJ5RGV2LT5nZXRNYXN0ZXJWb2x1bWUoCisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1QcmltYXJ5RGV2aWNlLT5nZXRNYXN0ZXJWb2x1bWUoCiAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGZsb2F0IHYpIHsKICAgICAgICAgICAgICAgICByZXR2YWwgPSByOwogICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewpAQCAtMTQ5LDkgKzE0Nyw4IEBACiAKIHN0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpIHsKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBzcDxJUHJpbWFyeURldmljZT4gcHJpbWFyeURldiA9IElQcmltYXJ5RGV2aWNlOjpjYXN0RnJvbShtRGV2aWNlKTsKLSAgICBpZiAocHJpbWFyeURldiA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1vZGUiLCBwcmltYXJ5RGV2LT5zZXRNb2RlKEF1ZGlvTW9kZShtb2RlKSkpOworICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1vZGUiLCBtUHJpbWFyeURldmljZS0+c2V0TW9kZShBdWRpb01vZGUobW9kZSkpKTsKIH0KIAogc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VIYWxIaWRsLmgKaW5kZXggOWRhMDJhNC4uODY1MWI1MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlSGFsSGlkbC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZUhhbEhpZGwuaApAQCAtMTgsMTEgKzE4LDEzIEBACiAjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMX0gKIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lEZXZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JUHJpbWFyeURldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oPgogCiAjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklEZXZpY2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVByaW1hcnlEZXZpY2U7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTExMCw2ICsxMTIsNyBAQAogICBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEhpZGw7CiAgICAgc3A8SURldmljZT4gbURldmljZTsKKyAgICBzcDxJUHJpbWFyeURldmljZT4gbVByaW1hcnlEZXZpY2U7ICAvLyBOdWxsIGlmIGl0J3Mgbm90IGEgcHJpbWFyeSBkZXZpY2UuCiAKICAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCiAgICAgZXhwbGljaXQgRGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdEhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0SGFsSGlkbC5jcHAKaW5kZXggYjQ5Yjk3NS4uNjFmYjZiYWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdEhhbEhpZGwuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdEhhbEhpZGwuY3BwCkBAIC00MCw3ICs0MCw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIEVmZmVjdEhhbEhpZGw6OkVmZmVjdEhhbEhpZGwoY29uc3Qgc3A8SUVmZmVjdD4mIGVmZmVjdCwgdWludDY0X3QgZWZmZWN0SWQpCi0gICAgICAgIDogbUVmZmVjdChlZmZlY3QpLCBtRWZmZWN0SWQoZWZmZWN0SWQpLCBtQnVmZmVyc0NoYW5nZWQodHJ1ZSkgeworICAgICAgICA6IG1FZmZlY3QoZWZmZWN0KSwgbUVmZmVjdElkKGVmZmVjdElkKSwgbUJ1ZmZlcnNDaGFuZ2VkKHRydWUpLCBtRWZHcm91cChudWxscHRyKSB7CiB9CiAKIEVmZmVjdEhhbEhpZGw6On5FZmZlY3RIYWxIaWRsKCkgewpAQCAtNDksNiArNDksOSBAQAogICAgICAgICBtRWZmZWN0LmNsZWFyKCk7CiAgICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CiAgICAgfQorICAgIGlmIChtRWZHcm91cCkgeworICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOworICAgIH0KIH0KIAogLy8gc3RhdGljCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9PV05FUlMgYi9tZWRpYS9saWJhdWRpb2hhbC9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ1NmFiNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL09XTkVSUwpAQCAtMCwwICsxLDIgQEAKK2tyb2NhcmRAZ29vZ2xlLmNvbQorbW5hZ2Fub3ZAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxIaWRsLmNwcAppbmRleCA0Mjc4NWQ1Li4wY2FmYTM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxIaWRsLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxIaWRsLmNwcApAQCAtNDcsNyArNDcsMjAgQEAKIFN0cmVhbUhhbEhpZGw6OlN0cmVhbUhhbEhpZGwoSVN0cmVhbSAqc3RyZWFtKQogICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJTdHJlYW0iKSwKICAgICAgICAgICBtU3RyZWFtKHN0cmVhbSksCi0gICAgICAgICAgbUhhbFRocmVhZFByaW9yaXR5KEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCkgeworICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eShIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQpLAorICAgICAgICAgIG1DYWNoZWRCdWZmZXJTaXplKDApeworCisgICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgorICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpKSB7CisgICAgICAgIC8vIE9idGFpbiBhdWRpbyBwcm9wZXJ0aWVzIChzZWUgU3RyZWFtSGFsSGlkbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKCkgYmVsb3cpLgorICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKAorICAgICAgICAgICAgICAgIFsmXSh1aW50MzJfdCBzciwgQXVkaW9DaGFubmVsTWFzayBtLCBBdWRpb0Zvcm1hdCBmKSB7CisgICAgICAgICAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmluaXQoc3IsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4obSksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4oZikpOworICAgICAgICAgICAgfSk7CisgICAgfQogfQogCiBTdHJlYW1IYWxIaWRsOjp+U3RyZWFtSGFsSGlkbCgpIHsKQEAgLTYxLDcgKzc0LDExIEBACiAKIHN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7CiAgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QnVmZmVyU2l6ZSIsIG1TdHJlYW0tPmdldEJ1ZmZlclNpemUoKSwgc2l6ZSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcHJvY2Vzc1JldHVybigiZ2V0QnVmZmVyU2l6ZSIsIG1TdHJlYW0tPmdldEJ1ZmZlclNpemUoKSwgc2l6ZSk7CisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICBtQ2FjaGVkQnVmZmVyU2l6ZSA9ICpzaXplOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaykgewpAQCAtMTM1LDYgKzE1Miw3IEBACiAgICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwogICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5kZWJ1Z0R1bXAoaGlkbEhhbmRsZSk7CiAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJkdW1wIiwgcmV0KTsKIH0KIApAQCAtMTg5LDYgKzIwNywxNCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Q2FjaGVkQnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICBpZiAobUNhY2hlZEJ1ZmZlclNpemUgIT0gMCkgeworICAgICAgICAqc2l6ZSA9IG1DYWNoZWRCdWZmZXJTaXplOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHJldHVybiBnZXRCdWZmZXJTaXplKHNpemUpOworfQorCiBib29sIFN0cmVhbUhhbEhpZGw6OnJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShwaWRfdCB0aHJlYWRQaWQsIHBpZF90IHRocmVhZElkKSB7CiAgICAgaWYgKG1IYWxUaHJlYWRQcmlvcml0eSA9PSBIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0zMDcsMTEgKzMzMywyMiBAQAogICAgIH0KIAogICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAoIW1EYXRhTVEgJiYgKHN0YXR1cyA9IHByZXBhcmVGb3JXcml0aW5nKGJ5dGVzKSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoIW1EYXRhTVEpIHsKKyAgICAgICAgLy8gSW4gY2FzZSBpZiBwbGF5YmFjayBzdGFydHMgY2xvc2UgdG8gdGhlIGVuZCBvZiBhIGNvbXByZXNzZWQgdHJhY2ssIHRoZSBieXRlcworICAgICAgICAvLyB0aGF0IG5lZWQgdG8gYmUgd3JpdHRlbiBpcyBsZXNzIHRoYW4gdGhlIGFjdHVhbCBidWZmZXIgc2l6ZS4gTmVlZCB0byB1c2UKKyAgICAgICAgLy8gZnVsbCBidWZmZXIgc2l6ZSBmb3IgdGhlIE1RIHNpbmNlIG90aGVyd2lzZSBhZnRlciBzZWVraW5nIGJhY2sgdG8gdGhlIG1pZGRsZQorICAgICAgICAvLyBkYXRhIHdpbGwgYmUgdHJ1bmNhdGVkLgorICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZTsKKyAgICAgICAgaWYgKChzdGF0dXMgPSBnZXRDYWNoZWRCdWZmZXJTaXplKCZidWZmZXJTaXplKSkgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ5dGVzID4gYnVmZmVyU2l6ZSkgYnVmZmVyU2l6ZSA9IGJ5dGVzOworICAgICAgICBpZiAoKHN0YXR1cyA9IHByZXBhcmVGb3JXcml0aW5nKGJ1ZmZlclNpemUpKSAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBjYWxsV3JpdGVyVGhyZWFkKAorICAgIHN0YXR1cyA9IGNhbGxXcml0ZXJUaHJlYWQoCiAgICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OldSSVRFLCAid3JpdGUiLCBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90Kj4oYnVmZmVyKSwgYnl0ZXMsCiAgICAgICAgICAgICBbJl0gKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgewogICAgICAgICAgICAgICAgICp3cml0dGVuID0gd3JpdGVTdGF0dXMucmVwbHkud3JpdHRlbjsKQEAgLTMyMCw2ICszNTcsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgImhhbCByZXBvcnRzIG1vcmUgYnl0ZXMgd3JpdHRlbiB0aGFuIGFza2VkIGZvcjogJWxsZCA+ICVsbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykqd3JpdHRlbiwgKGxvbmcgbG9uZylieXRlcyk7CiAgICAgICAgICAgICB9KTsKKyAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKndyaXR0ZW4pOworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmNhbGxXcml0ZXJUaHJlYWQoCkBAIC01ODAsNyArNjE5LDcgQEAKICAgICBSZWFkUGFyYW1ldGVycyBwYXJhbXM7CiAgICAgcGFyYW1zLmNvbW1hbmQgPSBSZWFkQ29tbWFuZDo6UkVBRDsKICAgICBwYXJhbXMucGFyYW1zLnJlYWQgPSBieXRlczsKLSAgICByZXR1cm4gY2FsbFJlYWRlclRocmVhZChwYXJhbXMsICJyZWFkIiwKKyAgICBzdGF0dXMgPSBjYWxsUmVhZGVyVGhyZWFkKHBhcmFtcywgInJlYWQiLAogICAgICAgICAgICAgWyZdKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpIHsKICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgYXZhaWxUb1JlYWQgPSBtRGF0YU1RLT5hdmFpbGFibGVUb1JlYWQoKTsKICAgICAgICAgICAgICAgICBpZiAoIW1EYXRhTVEtPnJlYWQoc3RhdGljX2Nhc3Q8dWludDhfdCo+KGJ1ZmZlciksIHN0ZDo6bWluKGJ5dGVzLCBhdmFpbFRvUmVhZCkpKSB7CkBAIC01OTEsNiArNjMwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KWF2YWlsVG9SZWFkLCAoaW50MzJfdClyZWFkU3RhdHVzLnJlcGx5LnJlYWQpOwogICAgICAgICAgICAgICAgICpyZWFkID0gcmVhZFN0YXR1cy5yZXBseS5yZWFkOwogICAgICAgICAgICAgfSk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICpyZWFkKTsKKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmNhbGxSZWFkZXJUaHJlYWQoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxIaWRsLmgKaW5kZXggYTdkZjI3Ni4uZDRhYjk0MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsSGlkbC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbEhpZGwuaApAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oPgogCiAjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKyNpbmNsdWRlICJTdHJlYW1Qb3dlckxvZy5oIgogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtSW47CkBAIC0xMDEsMTIgKzEwMiwxOCBAQAogICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBzdHJlYW0uCiAgICAgdmlydHVhbCB+U3RyZWFtSGFsSGlkbCgpOwogCisgICAgc3RhdHVzX3QgZ2V0Q2FjaGVkQnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOworCiAgICAgYm9vbCByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkocGlkX3QgdGhyZWFkUGlkLCBwaWRfdCB0aHJlYWRJZCk7CiAKKyAgICAvLyBtU3RyZWFtUG93ZXJMb2cgaXMgdXNlZCBmb3IgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCisgICAgU3RyZWFtUG93ZXJMb2cgbVN0cmVhbVBvd2VyTG9nOworCiAgIHByaXZhdGU6CiAgICAgY29uc3QgaW50IEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCA9IC0xOwogICAgIElTdHJlYW0gKm1TdHJlYW07CiAgICAgaW50IG1IYWxUaHJlYWRQcmlvcml0eTsKKyAgICBzaXplX3QgbUNhY2hlZEJ1ZmZlclNpemU7CiB9OwogCiBjbGFzcyBTdHJlYW1PdXRIYWxIaWRsIDogcHVibGljIFN0cmVhbU91dEhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbEhpZGwgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsTG9jYWwuY3BwCmluZGV4IDA1ODAwYTAuLmRjMTdmNWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbExvY2FsLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxMb2NhbC5jcHAKQEAgLTI3LDcgKzI3LDE1IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIFN0cmVhbUhhbExvY2FsOjpTdHJlYW1IYWxMb2NhbChhdWRpb19zdHJlYW1fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQotICAgICAgICA6IG1EZXZpY2UoZGV2aWNlKSwgbVN0cmVhbShzdHJlYW0pIHsKKyAgICAgICAgOiBtRGV2aWNlKGRldmljZSksCisgICAgICAgICAgbVN0cmVhbShzdHJlYW0pIHsKKyAgICAvLyBJbnN0cnVtZW50IGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgorICAgIC8vIE5vdGU6IFRoaXMgYXNzdW1lcyBjaGFubmVsIG1hc2ssIGZvcm1hdCwgYW5kIHNhbXBsZSByYXRlIGRvIG5vdCBjaGFuZ2UgYWZ0ZXIgY3JlYXRpb24uCisgICAgaWYgKG1TdHJlYW0gIT0gbnVsbHB0ciAmJiBtU3RyZWFtUG93ZXJMb2cuaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkpIHsKKyAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmluaXQobVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pLAorICAgICAgICAgICAgICAgIG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKSwKKyAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pKTsKKyAgICB9CiB9CiAKIFN0cmVhbUhhbExvY2FsOjp+U3RyZWFtSGFsTG9jYWwoKSB7CkBAIC05NSw3ICsxMDMsOSBAQAogfQogCiBzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6ZHVtcChpbnQgZmQpIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+ZHVtcChtU3RyZWFtLCBmZCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0cmVhbS0+ZHVtcChtU3RyZWFtLCBmZCk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQpIHsKQEAgLTEzMyw2ICsxNDMsNyBAQAogICAgIHNzaXplX3Qgd3JpdGVSZXN1bHQgPSBtU3RyZWFtLT53cml0ZShtU3RyZWFtLCBidWZmZXIsIGJ5dGVzKTsKICAgICBpZiAod3JpdGVSZXN1bHQgPiAwKSB7CiAgICAgICAgICp3cml0dGVuID0gd3JpdGVSZXN1bHQ7CisgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqd3JpdHRlbik7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9IGVsc2UgewogICAgICAgICAqd3JpdHRlbiA9IDA7CkBAIC0yNjYsNiArMjc3LDcgQEAKICAgICBzc2l6ZV90IHJlYWRSZXN1bHQgPSBtU3RyZWFtLT5yZWFkKG1TdHJlYW0sIGJ1ZmZlciwgYnl0ZXMpOwogICAgIGlmIChyZWFkUmVzdWx0ID4gMCkgewogICAgICAgICAqcmVhZCA9IHJlYWRSZXN1bHQ7CisgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coIGJ1ZmZlciwgKnJlYWQpOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfSBlbHNlIHsKICAgICAgICAgKnJlYWQgPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbExvY2FsLmgKaW5kZXggOGM5NmMxZi4uYzcxMzZkZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsTG9jYWwuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxMb2NhbC5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICiAKICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlICJTdHJlYW1Qb3dlckxvZy5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTgzLDYgKzg0LDkgQEAKIAogICAgIHNwPERldmljZUhhbExvY2FsPiBtRGV2aWNlOwogCisgICAgLy8gbVN0cmVhbVBvd2VyTG9nIGlzIHVzZWQgZm9yIGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgorICAgIFN0cmVhbVBvd2VyTG9nIG1TdHJlYW1Qb3dlckxvZzsKKwogICBwcml2YXRlOgogICAgIGF1ZGlvX3N0cmVhbV90ICptU3RyZWFtOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbVBvd2VyTG9nLmggYi9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1Qb3dlckxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3OGIxYWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1Qb3dlckxvZy5oCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfSAorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9Qb3dlckxvZy5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgU3RyZWFtUG93ZXJMb2cgeworcHVibGljOgorICAgIFN0cmVhbVBvd2VyTG9nKCkgOgorICAgICAgICBtSXNVc2VyRGVidWdPckVuZ0J1aWxkKGlzX3VzZXJkZWJ1Z19vcl9lbmdfYnVpbGQoKSksCisgICAgICAgIG1Qb3dlckxvZyhudWxscHRyKSwKKyAgICAgICAgbUZyYW1lU2l6ZSgwKSB7CisgICAgICAgIC8vIHVzZSBpbml0KCkgdG8gc2V0IHVwIHRoZSBwb3dlciBsb2cuCisgICAgfQorCisgICAgflN0cmVhbVBvd2VyTG9nKCkgeworICAgICAgICBwb3dlcl9sb2dfZGVzdHJveShtUG93ZXJMb2cpOyAvLyBPSyBmb3IgbnVsbCBtUG93ZXJMb2cKKyAgICAgICAgbVBvd2VyTG9nID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICAvLyBBIG9uZS10aW1lIGluaXRpYWxpemF0aW9uIChkbyBub3QgY2FsbCB0d2ljZSkgYmVmb3JlIHVzaW5nIFN0cmVhbVBvd2VyTG9nLgorICAgIHZvaWQgaW5pdCh1aW50MzJfdCBzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CisgICAgICAgIGlmIChtUG93ZXJMb2cgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gTm90ZTogQSB3YXkgdG8gZ2V0IGNoYW5uZWwgY291bnQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCBjaGFubmVsIG1hc2tzCisgICAgICAgICAgICAvLyBidXQgZG9lcyBub3QgY2hlY2sgdmFsaWRpdHkgb2YgdGhlIGNoYW5uZWwgbWFzay4KKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhjaGFubmVsTWFzaykpOworICAgICAgICAgICAgbUZyYW1lU2l6ZSA9IGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KTsKKyAgICAgICAgICAgIGlmIChtRnJhbWVTaXplID4gMCkgeworICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dGcmFtZXNQZXJFbnRyeSA9CisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXNhbXBsZVJhdGUgKiBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMgLyAxMDAwOworICAgICAgICAgICAgICAgIG1Qb3dlckxvZyA9IHBvd2VyX2xvZ19jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAga1Bvd2VyTG9nRW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGtQb3dlckxvZ0ZyYW1lc1BlckVudHJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBtUG93ZXJMb2cgbWF5IGJlIE5VTEwgKG5vdCB0aGUgcmlnaHQgYnVpbGQsIGZvcm1hdCBub3QgYWNjZXB0ZWQsIGV0Yy4pLgorICAgIH0KKworICAgIC8vIER1bXAgdGhlIHBvd2VyIGxvZyB0byBmZC4KKyAgICB2b2lkIGR1bXAoaW50IGZkKSBjb25zdCB7CisgICAgICAgIC8vIE9LIGZvciBudWxsIG1Qb3dlckxvZworICAgICAgICAodm9pZClwb3dlcl9sb2dfZHVtcCgKKyAgICAgICAgICAgICAgICBtUG93ZXJMb2csIGZkLCAiICAgICAgIiAvKiBwcmVmaXggKi8sIGtQb3dlckxvZ0xpbmVzLCAwIC8qIGxpbWl0X25zICovKTsKKyAgICB9CisKKyAgICAvLyBMb2cgdGhlIGF1ZGlvIGRhdGEgY29udGFpbmVkIGluIGJ1ZmZlci4KKyAgICB2b2lkIGxvZyhjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplSW5CeXRlcykgY29uc3QgeworICAgICAgICBpZiAobVBvd2VyTG9nICE9IG51bGxwdHIpIHsgLy8gbUZyYW1lU2l6ZSBpcyBhbHdheXMgbm9uemVybyBpZiBtUG93ZXJMb2cgZXhpc3RzLgorICAgICAgICAgICAgcG93ZXJfbG9nX2xvZygKKyAgICAgICAgICAgICAgICAgICAgbVBvd2VyTG9nLCBidWZmZXIsIHNpemVJbkJ5dGVzIC8gbUZyYW1lU2l6ZSwgYXVkaW9fdXRpbHNfZ2V0X3JlYWxfdGltZV9ucygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUlzVXNlckRlYnVnT3JFbmdCdWlsZDsKKyAgICB9CisKK3ByaXZhdGU6CisKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgaXNfdXNlcmRlYnVnX29yX2VuZ19idWlsZCgpIHsKKyAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgICAgICAodm9pZClwcm9wZXJ0eV9nZXQoInJvLmJ1aWxkLnR5cGUiLCB2YWx1ZSwgInVua25vd24iKTsgLy8gaWdub3JlIGFjdHVhbCBsZW5ndGgKKyAgICAgICAgcmV0dXJuIHN0cmNtcCh2YWx1ZSwgInVzZXJkZWJ1ZyIpID09IDAgfHwgc3RyY21wKHZhbHVlLCAiZW5nIikgPT0gMDsKKyAgICB9CisKKyAgICAvLyBBdWRpbyBzaWduYWwgcG93ZXIgbG9nIGNvbmZpZ3VyYXRpb24uCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dMaW5lcyA9IDQwOworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zID0gNTA7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dFbnRyaWVzID0gKDEgLyogbWludXRlcyAqLyAqIDYwIC8qIHNlY29uZHMgKi8gKiAxMDAwIC8qIG1zZWMgKi8KKyAgICAgICAgICAgIC8ga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zKTsKKworICAgIGNvbnN0IGJvb2wgbUlzVXNlckRlYnVnT3JFbmdCdWlsZDsKKyAgICBwb3dlcl9sb2dfdCAqbVBvd2VyTG9nOworICAgIHNpemVfdCBtRnJhbWVTaXplOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvRGV2aWNlSGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL0RldmljZUhhbEludGVyZmFjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL0VmZmVjdEJ1ZmZlckhhbEludGVyZmFjZS5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9FZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UuaApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9FZmZlY3RIYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvRWZmZWN0SGFsSW50ZXJmYWNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvU3RyZWFtSGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL1N0cmVhbUhhbEludGVyZmFjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL2hpZGwvSGFsRGVhdGhIYW5kbGVyLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL2hpZGwvSGFsRGVhdGhIYW5kbGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvaGlkbC9IYWxEZWF0aEhhbmRsZXIuaApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9oaWRsL0hhbERlYXRoSGFuZGxlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9BdWRpb1Jlc2FtcGxlci5oIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvQXVkaW9SZXNhbXBsZXIuaApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvQW5kcm9pZC5icAppbmRleCBjY2FhMmI0Li4wZGQzZjE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9BbmRyb2lkLmJwCkBAIC0xICsxIEBACi1zdWJkaXJzID0gWyJmYWN0b3J5Il0KK3N1YmRpcnMgPSBbImZhY3RvcnkiLCAiY29uZmlnIl0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvT1dORVJTIGIvbWVkaWEvbGliZWZmZWN0cy9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UzZGUxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvT1dORVJTCkBAIC0wLDAgKzEsMyBAQAora3JvY2FyZEBnb29nbGUuY29tCittbmFnYW5vdkBnb29nbGUuY29tCityYWdvQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzOThhOTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTcgQEAKKy8vIEVmZmVjdCBjb25maWd1cmF0aW9uCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmVmZmVjdHNjb25maWciLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisKKyAgICBzcmNzOiBbInNyYy9FZmZlY3RzQ29uZmlnLmNwcCJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ0aW55eG1sMiIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbImxpYmF1ZGlvX3N5c3RlbV9oZWFkZXJzIl0sCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWyJsaWJhdWRpb19zeXN0ZW1faGVhZGVycyJdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9pbmNsdWRlL21lZGlhL0VmZmVjdHNDb25maWcuaCBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL2luY2x1ZGUvbWVkaWEvRWZmZWN0c0NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMTczMGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9pbmNsdWRlL21lZGlhL0VmZmVjdHNDb25maWcuaApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2lmbmRlZiBBTkRST0lEX01FRElBX0VGRkVDVFNDT05GSUdfSAorI2RlZmluZSBBTkRST0lEX01FRElBX0VGRkVDVFNDT05GSUdfSAorCisvKiogQGZpbGUgUGFyc2VzIGF1ZGlvIGVmZmVjdHMgY29uZmlndXJhdGlvbiBmaWxlIHRvIEMgYW5kIEMrKyBzdHJ1Y3R1cmUuCisgKiBAc2VlIGF1ZGlvX2VmZmVjdHNfY29uZl9WMl8wLnhzZCBmb3IgZG9jdW1lbnRhdGlvbiBvbiBlYWNoIHN0cnVjdHVyZQorICovCisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+CisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlZmZlY3RzQ29uZmlnIHsKKworLyoqIERlZmF1bHQgcGF0aCBvZiBlZmZlY3QgY29uZmlndXJhdGlvbiBmaWxlLiAqLworY29uc3RleHByIGNoYXIgREVGQVVMVF9QQVRIW10gPSAiL3ZlbmRvci9ldGMvYXVkaW9fZWZmZWN0cy54bWwiOworCisvKiogRGlyZWN0b3JpZXMgd2hlcmUgdGhlIGVmZmVjdCBsaWJyYXJpZXMgd2lsbCBiZSBzZWFyY2ggZm9yLiAqLworY29uc3RleHByIGNvbnN0IGNoYXIqIExEX0VGRkVDVF9MSUJSQVJZX1BBVEhbXSA9CisjaWZkZWYgX19MUDY0X18KKyAgICAgICAgeyIvb2RtL2xpYjY0L3NvdW5kZngiLCAiL3ZlbmRvci9saWI2NC9zb3VuZGZ4IiwgIi9zeXN0ZW0vbGliNjQvc291bmRmeCJ9OworI2Vsc2UKKyAgICAgICAgeyIvb2RtL2xpYi9zb3VuZGZ4IiwgIi92ZW5kb3IvbGliL3NvdW5kZngiLCAiL3N5c3RlbS9saWIvc291bmRmeCJ9OworI2VuZGlmCisKK3N0cnVjdCBMaWJyYXJ5IHsKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIHN0ZDo6c3RyaW5nIHBhdGg7Cit9OwordXNpbmcgTGlicmFyaWVzID0gc3RkOjp2ZWN0b3I8TGlicmFyeT47CisKK3N0cnVjdCBFZmZlY3RJbXBsIHsKKyAgICBMaWJyYXJ5KiBsaWJyYXJ5OyAvLzwgT25seSB2YWxpZCBhcyBsb25nIGFzIHRoZSBhc3NvY2lhdGVkIGxpYnJhcnkgdmVjdG9yIGlzIHVubW9kaWZpZWQKKyAgICBlZmZlY3RfdXVpZF90IHV1aWQ7Cit9OworCitzdHJ1Y3QgRWZmZWN0IDogcHVibGljIEVmZmVjdEltcGwgeworICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgYm9vbCBpc1Byb3h5OworICAgIEVmZmVjdEltcGwgbGliU3c7IC8vPCBPbmx5IHZhbGlkIGlmIGlzUHJveHkKKyAgICBFZmZlY3RJbXBsIGxpYkh3OyAvLzwgT25seSB2YWxpZCBpZiBpc1Byb3h5Cit9OworCit1c2luZyBFZmZlY3RzID0gc3RkOjp2ZWN0b3I8RWZmZWN0PjsKKwordGVtcGxhdGUgPGNsYXNzIFR5cGU+CitzdHJ1Y3QgU3RyZWFtIHsKKyAgICBUeXBlIHR5cGU7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxFZmZlY3Q+PiBlZmZlY3RzOworfTsKK3VzaW5nIE91dHB1dFN0cmVhbSA9IFN0cmVhbTxhdWRpb19zdHJlYW1fdHlwZV90PjsKK3VzaW5nIElucHV0U3RyZWFtID0gU3RyZWFtPGF1ZGlvX3NvdXJjZV90PjsKKworLyoqIFBhcnNlZCBjb25maWd1cmF0aW9uLgorICogSW50ZW5kZWQgdG8gYmUgYSB0cmFuc2llbnQgc3RydWN0dXJlIG9ubHkgdXNlZCBmb3IgZGVzZXJpYWxpemF0aW9uLgorICogTm90ZTogRXZlcnl0aGluZyBpcyBjb3BpZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgeG1sIGRvbS4KKyAqICAgICAgIElmIGNvcGllcyBuZWVkZWQgdG8gYmUgYXZvaWRlZCBkdWUgdG8gcGVyZm9ybWFuY2UgaXNzdWUsCisgKiAgICAgICBjb25zaWRlciBrZWVwaW5nIGEgcHJpdmF0ZSBoYW5kbGUgb24gdGhlIHhtbCBkb20gYW5kIHJlcGxhY2UgYWxsIHN0cmluZ3MgYnkgZG9tIHBvaW50ZXJzLgorICogICAgICAgT3IgZXZlbiBiZXR0ZXIsIHVzZSBTQVggcGFyc2luZyB0byBhdm9pZCB0aGUgYWxsb2NhdGlvbnMgYWxsIHRvZ2V0aGVyLgorICovCitzdHJ1Y3QgQ29uZmlnIHsKKyAgICBmbG9hdCB2ZXJzaW9uOworICAgIExpYnJhcmllcyBsaWJyYXJpZXM7CisgICAgRWZmZWN0cyBlZmZlY3RzOworICAgIHN0ZDo6dmVjdG9yPE91dHB1dFN0cmVhbT4gcG9zdHByb2Nlc3M7CisgICAgc3RkOjp2ZWN0b3I8SW5wdXRTdHJlYW0+IHByZXByb2Nlc3M7Cit9OworCisvKiogUmVzdWx0IG9mIGBwYXJzZShjb25zdCBjaGFyKilgICovCitzdHJ1Y3QgUGFyc2luZ1Jlc3VsdCB7CisgICAgLyoqIFBhcnNlZCBjb25maWcsIG51bGxwdHIgaWYgdGhlIHhtbCBsaWIgY291bGQgbm90IGxvYWQgdGhlIGZpbGUgKi8KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlnPiBwYXJzZWRDb25maWc7CisgICAgc2l6ZV90IG5iU2tpcHBlZEVsZW1lbnQ7IC8vPCBOdW1iZXIgb2Ygc2tpcHBlZCBpbnZhbGlkIGxpYnJhcnksIGVmZmVjdCBvciBwcm9jZXNzaW5nIGNoYWluCit9OworCisvKiogUGFyc2VzIHRoZSBwcm92aWRlZCBlZmZlY3QgY29uZmlndXJhdGlvbi4KKyAqIFBhcnNpbmcgZG8gbm90IHN0b3Agb2YgZmlyc3QgaW52YWxpZCBlbGVtZW50LCBidXQgY29udGludWVzIHRvIHRoZSBuZXh0LgorICogQHNlZSBQYXJzaW5nUmVzdWx0OjpuYlNraXBwZWRFbGVtZW50CisgKi8KK1BhcnNpbmdSZXN1bHQgcGFyc2UoY29uc3QgY2hhciogcGF0aCA9IERFRkFVTFRfUEFUSCk7CisKK30gLy8gbmFtZXNwYWNlIGVmZmVjdHNDb25maWcKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9FRkZFQ1RTQ09ORklHX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL3NyYy9FZmZlY3RzQ29uZmlnLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL3NyYy9FZmZlY3RzQ29uZmlnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzQ2MmY4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvc3JjL0VmZmVjdHNDb25maWcuY3BwCkBAIC0wLDAgKzEsMzAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJFZmZlY3RzQ29uZmlnIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDx0aW55eG1sMi5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNDb25maWcuaD4KKwordXNpbmcgbmFtZXNwYWNlIHRpbnl4bWwyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZWZmZWN0c0NvbmZpZyB7CisKKy8qKiBBbGwgZnVuY3Rpb25zIGV4Y2VwdCBgcGFyc2UoY29uc3QgY2hhciopYCBhcmUgc3RhdGljLiAqLworbmFtZXNwYWNlIHsKKworLyoqIEByZXR1cm4gYWxsIGBub2RlYHMgY2hpbGRyZW4gdGhhdCBhcmUgZWxlbWVudHMgYW5kIG1hdGNoIHRoZSB0YWcgaWYgcHJvdmlkZWQuICovCitzdGQ6OnZlY3RvcjxzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPGNvbnN0IFhNTEVsZW1lbnQ+PiBnZXRDaGlsZHJlbihjb25zdCBYTUxOb2RlJiBub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY2hpbGRUYWcgPSBudWxscHRyKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxjb25zdCBYTUxFbGVtZW50Pj4gY2hpbGRyZW47CisgICAgZm9yIChhdXRvKiBjaGlsZCA9IG5vZGUuRmlyc3RDaGlsZEVsZW1lbnQoY2hpbGRUYWcpOyBjaGlsZCAhPSBudWxscHRyOworICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC0+TmV4dFNpYmxpbmdFbGVtZW50KGNoaWxkVGFnKSkgeworICAgICAgICBjaGlsZHJlbi5lbXBsYWNlX2JhY2soKmNoaWxkKTsKKyAgICB9CisgICAgcmV0dXJuIGNoaWxkcmVuOworfQorCisvKiogQHJldHVybiB4bWwgZHVtcCBvZiB0aGUgcHJvdmlkZWQgZWxlbWVudC4KKyAqIEJ5IG5vdCBwcm92aWRpbmcgYSBwcmludGVyLCBpdCBpcyBpbXBsaWNpdGx5IGNyZWF0ZWQgaW4gdGhlIGNhbGxlciBjb250ZXh0LgorICogSW4gc3VjaCBjYXNlIHRoZSByZXR1cm4gcG9pbnRlciBoYXMgdGhlIHNhbWUgbGlmZXRpbWUgYXMgdGhlIGV4cHJlc3Npb24gY29udGFpbmluZyBkdW1wKCkuCisgKi8KK2NvbnN0IGNoYXIqIGR1bXAoY29uc3QgWE1MRWxlbWVudCYgZWxlbWVudCwgWE1MUHJpbnRlciYmIHByaW50ZXIgPSB7fSkgeworICAgIGVsZW1lbnQuQWNjZXB0KCZwcmludGVyKTsKKyAgICByZXR1cm4gcHJpbnRlci5DU3RyKCk7Cit9CisKKworYm9vbCBzdHJpbmdUb1V1aWQoY29uc3QgY2hhciAqc3RyLCBlZmZlY3RfdXVpZF90ICp1dWlkKQoreworICAgIHVpbnQzMl90IHRtcFsxMF07CisKKyAgICBpZiAoc3NjYW5mKHN0ciwgIiUwOHgtJTA0eC0lMDR4LSUwNHgtJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKKyAgICAgICAgICAgIHRtcCwgdG1wKzEsIHRtcCsyLCB0bXArMywgdG1wKzQsIHRtcCs1LCB0bXArNiwgdG1wKzcsIHRtcCs4LCB0bXArOSkgPCAxMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHV1aWQtPnRpbWVMb3cgPSAodWludDMyX3QpdG1wWzBdOworICAgIHV1aWQtPnRpbWVNaWQgPSAodWludDE2X3QpdG1wWzFdOworICAgIHV1aWQtPnRpbWVIaUFuZFZlcnNpb24gPSAodWludDE2X3QpdG1wWzJdOworICAgIHV1aWQtPmNsb2NrU2VxID0gKHVpbnQxNl90KXRtcFszXTsKKyAgICB1dWlkLT5ub2RlWzBdID0gKHVpbnQ4X3QpdG1wWzRdOworICAgIHV1aWQtPm5vZGVbMV0gPSAodWludDhfdCl0bXBbNV07CisgICAgdXVpZC0+bm9kZVsyXSA9ICh1aW50OF90KXRtcFs2XTsKKyAgICB1dWlkLT5ub2RlWzNdID0gKHVpbnQ4X3QpdG1wWzddOworICAgIHV1aWQtPm5vZGVbNF0gPSAodWludDhfdCl0bXBbOF07CisgICAgdXVpZC0+bm9kZVs1XSA9ICh1aW50OF90KXRtcFs5XTsKKworICAgIHJldHVybiB0cnVlOworfQorCisvKiogTWFwIHRoZSBlbnVtIGFuZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBzdHJpbmcgdHlwZS4KKyAqICBJbnRlbmRlZCB0byBiZSBzcGVjaWFsaXplZCBmb3IgZWFjaCBlbnVtIHRvIGRlc2VyaWFsaXplLgorICogIFRoZSBnZW5lcmFsIHRlbXBsYXRlIGlzIGRpc2FibGVkLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgRW51bT4KK2NvbnN0ZXhwciBzdGQ6OmVuYWJsZV9pZjxmYWxzZSwgRW51bT4gU1RSRUFNX05BTUVfTUFQOworCisvKiogQWxsIG91dHB1dCBzdHJlYW0gdHlwZXMgd2hpY2ggc3VwcG9ydCBlZmZlY3RzLgorICogVGhpcyBuZWVkIHRvIGJlIGtlcHQgaW4gc2luayB3aXRoIHRoZSB4c2Qgc3RyZWFtT3V0cHV0VHlwZS4KKyAqLwordGVtcGxhdGUgPD4KK2NvbnN0ZXhwciBzdGQ6OnBhaXI8YXVkaW9fc3RyZWFtX3R5cGVfdCwgY29uc3QgY2hhcio+IFNUUkVBTV9OQU1FX01BUDxhdWRpb19zdHJlYW1fdHlwZV90PltdID0geworICAgICAgICB7QVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsICJ2b2ljZV9jYWxsIn0sCisgICAgICAgIHtBVURJT19TVFJFQU1fU1lTVEVNLCAic3lzdGVtIn0sCisgICAgICAgIHtBVURJT19TVFJFQU1fUklORywgInJpbmcifSwKKyAgICAgICAge0FVRElPX1NUUkVBTV9NVVNJQywgIm11c2ljIn0sCisgICAgICAgIHtBVURJT19TVFJFQU1fQUxBUk0sICJhbGFybSJ9LAorICAgICAgICB7QVVESU9fU1RSRUFNX05PVElGSUNBVElPTiwgIm5vdGlmaWNhdGlvbiJ9LAorICAgICAgICB7QVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08sICJibHVldG9vdGhfc2NvIn0sCisgICAgICAgIHtBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSwgImVuZm9yY2VkX2F1ZGlibGUifSwKKyAgICAgICAge0FVRElPX1NUUkVBTV9EVE1GLCAiZHRtZiJ9LAorICAgICAgICB7QVVESU9fU1RSRUFNX1RUUywgInR0cyJ9LAorfTsKKworLyoqIEFsbCBpbnB1dCBzdHJlYW0gdHlwZXMgd2hpY2ggc3VwcG9ydCBlZmZlY3RzLgorICogVGhpcyBuZWVkIHRvIGJlIGtlcHQgaW4gc2luayB3aXRoIHRoZSB4c2Qgc3RyZWFtT3V0cHV0VHlwZS4KKyAqLwordGVtcGxhdGUgPD4KK2NvbnN0ZXhwciBzdGQ6OnBhaXI8YXVkaW9fc291cmNlX3QsIGNvbnN0IGNoYXIqPiBTVFJFQU1fTkFNRV9NQVA8YXVkaW9fc291cmNlX3Q+W10gPSB7CisgICAgICAgIHtBVURJT19TT1VSQ0VfTUlDLCAibWljIn0sCisgICAgICAgIHtBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LLCAidm9pY2VfdXBsaW5rIn0sCisgICAgICAgIHtBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTkssICJ2b2ljZV9kb3dubGluayJ9LAorICAgICAgICB7QVVESU9fU09VUkNFX1ZPSUNFX0NBTEwsICJ2b2ljZV9jYWxsIn0sCisgICAgICAgIHtBVURJT19TT1VSQ0VfQ0FNQ09SREVSLCAiY2FtY29yZGVyIn0sCisgICAgICAgIHtBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04sICJ2b2ljZV9yZWNvZ25pdGlvbiJ9LAorICAgICAgICB7QVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04sICJ2b2ljZV9jb21tdW5pY2F0aW9uIn0sCisgICAgICAgIHtBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQsICJ1bnByb2Nlc3NlZCJ9LAorfTsKKworLyoqIEZpbmQgdGhlIHN0cmVhbSB0eXBlIGVudW0gY29ycmVzcG9uZGluZyB0byB0aGUgc3RyZWFtIHR5cGUgbmFtZSBvciByZXR1cm4gZmFsc2UgKi8KK3RlbXBsYXRlIDxjbGFzcyBUeXBlPgorYm9vbCBzdHJpbmdUb1N0cmVhbVR5cGUoY29uc3QgY2hhciAqc3RyZWFtTmFtZSwgVHlwZSogdHlwZSkKK3sKKyAgICBmb3IgKGF1dG8mIHN0cmVhbU5hbWVQYWlyIDogU1RSRUFNX05BTUVfTUFQPFR5cGU+KSB7CisgICAgICAgIGlmIChzdHJjbXAoc3RyZWFtTmFtZVBhaXIuc2Vjb25kLCBzdHJlYW1OYW1lKSA9PSAwKSB7CisgICAgICAgICAgICAqdHlwZSA9IHN0cmVhbU5hbWVQYWlyLmZpcnN0OworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKiogUGFyc2UgYSBsaWJyYXJ5IHhtbCBub3RlIGFuZCBwdXNoIHRoZSByZXN1bHQgaW4gbGlicmFyaWVzIG9yIHJldHVybiBmYWxzZSBvbiBmYWlsdXJlLiAqLworYm9vbCBwYXJzZUxpYnJhcnkoY29uc3QgWE1MRWxlbWVudCYgeG1sTGlicmFyeSwgTGlicmFyaWVzKiBsaWJyYXJpZXMpIHsKKyAgICBjb25zdCBjaGFyKiBuYW1lID0geG1sTGlicmFyeS5BdHRyaWJ1dGUoIm5hbWUiKTsKKyAgICBjb25zdCBjaGFyKiBwYXRoID0geG1sTGlicmFyeS5BdHRyaWJ1dGUoInBhdGgiKTsKKyAgICBpZiAobmFtZSA9PSBudWxscHRyIHx8IHBhdGggPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgibGlicmFyeSBtdXN0IGhhdmUgYSBuYW1lIGFuZCBhIHBhdGg6ICVzIiwgZHVtcCh4bWxMaWJyYXJ5KSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbGlicmFyaWVzLT5wdXNoX2JhY2soe25hbWUsIHBhdGh9KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqIEZpbmQgYW4gZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24gYnkgaXRzIG5hbWUuCisgKiBAcmV0dXJuIG51bGxwdHIgaWYgbm90IGZvdW5kLCB0aGUgZWxsZW1lbnRzIGFkZHJlc3MgaWYgZm91bmQuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUPgorVCogZmluZEJ5TmFtZShjb25zdCBjaGFyKiBuYW1lLCBzdGQ6OnZlY3RvcjxUPiYgY29sbGVjdGlvbikgeworICAgIGF1dG8gaXQgPSBmaW5kX2lmKGJlZ2luKGNvbGxlY3Rpb24pLCBlbmQoY29sbGVjdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdIChhdXRvJiBpdGVtKSB7IHJldHVybiBpdGVtLm5hbWUgPT0gbmFtZTsgfSk7CisgICAgcmV0dXJuIGl0ICE9IGVuZChjb2xsZWN0aW9uKSA/ICYqaXQgOiBudWxscHRyOworfQorCisvKiogUGFyc2UgYW4gZWZmZWN0IGZyb20gYW4geG1sIGVsZW1lbnQgZGVzY3JpYmluZyBpdC4KKyAqIEByZXR1cm4gdHJ1ZSBhbmQgcHVzaGVzIHRoZSBlZmZlY3QgaW4gZWZmZWN0cyBvbiBzdWNjZXNzLAorICogICAgICAgICBmYWxzZSBvbiBmYWlsdXJlLiAqLworYm9vbCBwYXJzZUVmZmVjdChjb25zdCBYTUxFbGVtZW50JiB4bWxFZmZlY3QsIExpYnJhcmllcyYgbGlicmFyaWVzLCBFZmZlY3RzKiBlZmZlY3RzKSB7CisgICAgRWZmZWN0IGVmZmVjdHt9OworCisgICAgY29uc3QgY2hhciogbmFtZSA9IHhtbEVmZmVjdC5BdHRyaWJ1dGUoIm5hbWUiKTsKKyAgICBpZiAobmFtZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcyBtdXN0IGhhdmUgYSBuYW1lOiAlcyIsIHhtbEVmZmVjdC5WYWx1ZSgpLCBkdW1wKHhtbEVmZmVjdCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGVmZmVjdC5uYW1lID0gbmFtZTsKKworICAgIC8vIEZ1bmN0aW9uIHRvIHBhcnNlIGVmZmVjdC5saWJyYXJ5IGFuZCBlZmZlY3QudXVpZCBmcm9tIHhtbAorICAgIGF1dG8gcGFyc2VJbXBsID0gWyZsaWJyYXJpZXNdKGNvbnN0IFhNTEVsZW1lbnQmIHhtbEltcGwsIEVmZmVjdEltcGwmIGVmZmVjdCkgeworICAgICAgICAvLyBSZXRyaWV2ZSBsaWJyYXJ5IG5hbWUgYW5kIHV1aWQgZnJvbSB4bWwKKyAgICAgICAgY29uc3QgY2hhciogbGlicmFyeU5hbWUgPSB4bWxJbXBsLkF0dHJpYnV0ZSgibGlicmFyeSIpOworICAgICAgICBjb25zdCBjaGFyKiB1dWlkID0geG1sSW1wbC5BdHRyaWJ1dGUoInV1aWQiKTsKKyAgICAgICAgaWYgKGxpYnJhcnlOYW1lID09IG51bGxwdHIgfHwgdXVpZCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiZWZmZWN0IG11c3QgaGF2ZSBhIGxpYnJhcnkgbmFtZSBhbmQgYSB1dWlkOiAlcyIsIGR1bXAoeG1sSW1wbCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29udmVydCBsaWJyYXJ5IG5hbWUgdG8gYSBwb2ludGVyIHRvIHRoZSBwcmV2aW91c2x5IGxvYWRlZCBsaWJyYXJ5CisgICAgICAgIGF1dG8qIGxpYnJhcnkgPSBmaW5kQnlOYW1lKGxpYnJhcnlOYW1lLCBsaWJyYXJpZXMpOworICAgICAgICBpZiAobGlicmFyeSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IGZpbmQgbGlicmFyeSByZWZlcmVuY2VkIGluOiAlcyIsIGR1bXAoeG1sSW1wbCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGVmZmVjdC5saWJyYXJ5ID0gbGlicmFyeTsKKworICAgICAgICBpZiAoIXN0cmluZ1RvVXVpZCh1dWlkLCAmZWZmZWN0LnV1aWQpKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCB1dWlkIGluOiAlcyIsIGR1bXAoeG1sSW1wbCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH07CisKKyAgICBpZiAoIXBhcnNlSW1wbCh4bWxFZmZlY3QsIGVmZmVjdCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIEhhbmRsZSBwcm94eSBlZmZlY3RzCisgICAgZWZmZWN0LmlzUHJveHkgPSBmYWxzZTsKKyAgICBpZiAoc3RkOjpzdHJjbXAoeG1sRWZmZWN0Lk5hbWUoKSwgImVmZmVjdFByb3h5IikgPT0gMCkgeworICAgICAgICBlZmZlY3QuaXNQcm94eSA9IHRydWU7CisKKyAgICAgICAgLy8gRnVuY3Rpb24gdG8gcGFyc2UgbGliaHcgYW5kIGxpYnN3CisgICAgICAgIGF1dG8gcGFyc2VQcm94eSA9IFsmeG1sRWZmZWN0LCAmcGFyc2VJbXBsXShjb25zdCBjaGFyKiB0YWcsIEVmZmVjdEltcGwmIHByb3h5TGliKSB7CisgICAgICAgICAgICBhdXRvKiB4bWxQcm94eUxpYiA9IHhtbEVmZmVjdC5GaXJzdENoaWxkRWxlbWVudCh0YWcpOworICAgICAgICAgICAgaWYgKHhtbFByb3h5TGliID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZWZmZWN0UHJveHkgbXVzdCBjb250YWluIGEgPCVzPjogJXMiLCB0YWcsIGR1bXAoKnhtbFByb3h5TGliKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW1wbCgqeG1sUHJveHlMaWIsIHByb3h5TGliKTsKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKCFwYXJzZVByb3h5KCJsaWJodyIsIGVmZmVjdC5saWJIdykgfHwgIXBhcnNlUHJveHkoImxpYnN3IiwgZWZmZWN0LmxpYlN3KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgZWZmZWN0cy0+cHVzaF9iYWNrKHN0ZDo6bW92ZShlZmZlY3QpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqIFBhcnNlIGFuIHN0cmVhbSBmcm9tIGFuIHhtbCBlbGVtZW50IGRlc2NyaWJpbmcgaXQuCisgKiBAcmV0dXJuIHRydWUgYW5kIHB1c2hlcyB0aGUgc3RyZWFtIGluIHN0cmVhbXMgb24gc3VjY2VzcywKKyAqICAgICAgICAgZmFsc2Ugb24gZmFpbHVyZS4gKi8KK3RlbXBsYXRlIDxjbGFzcyBTdHJlYW0+Citib29sIHBhcnNlU3RyZWFtKGNvbnN0IFhNTEVsZW1lbnQmIHhtbFN0cmVhbSwgRWZmZWN0cyYgZWZmZWN0cywgc3RkOjp2ZWN0b3I8U3RyZWFtPiogc3RyZWFtcykgeworICAgIGNvbnN0IGNoYXIqIHN0cmVhbVR5cGUgPSB4bWxTdHJlYW0uQXR0cmlidXRlKCJ0eXBlIik7CisgICAgaWYgKHN0cmVhbVR5cGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgic3RyZWFtIG11c3QgaGF2ZSBhIHR5cGU6ICVzIiwgZHVtcCh4bWxTdHJlYW0pKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBTdHJlYW0gc3RyZWFtOworICAgIGlmICghc3RyaW5nVG9TdHJlYW1UeXBlKHN0cmVhbVR5cGUsICZzdHJlYW0udHlwZSkpIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgc3RyZWFtIHR5cGUgJXM6ICVzIiwgc3RyZWFtVHlwZSwgZHVtcCh4bWxTdHJlYW0pKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZvciAoYXV0byYgeG1sQXBwbHkgOiBnZXRDaGlsZHJlbih4bWxTdHJlYW0sICJhcHBseSIpKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIGVmZmVjdE5hbWUgPSB4bWxBcHBseS5nZXQoKS5BdHRyaWJ1dGUoImVmZmVjdCIpOworICAgICAgICBpZiAoZWZmZWN0TmFtZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgic3RyZWFtL2FwcGx5IG11c3QgaGF2ZSByZWZlcmVuY2UgYW4gZWZmZWN0OiAlcyIsIGR1bXAoeG1sQXBwbHkpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBhdXRvKiBlZmZlY3QgPSBmaW5kQnlOYW1lKGVmZmVjdE5hbWUsIGVmZmVjdHMpOworICAgICAgICBpZiAoZWZmZWN0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZmluZCBlZmZlY3QgcmVmZXJlbmNlZCBpbjogJXMiLCBkdW1wKHhtbEFwcGx5KSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RyZWFtLmVmZmVjdHMuZW1wbGFjZV9iYWNrKCplZmZlY3QpOworICAgIH0KKyAgICBzdHJlYW1zLT5wdXNoX2JhY2soc3RkOjptb3ZlKHN0cmVhbSkpOworICAgIHJldHVybiB0cnVlOworfQorCit9OyAvLyBuYW1lc3BhY2UKKworUGFyc2luZ1Jlc3VsdCBwYXJzZShjb25zdCBjaGFyKiBwYXRoKSB7CisgICAgWE1MRG9jdW1lbnQgZG9jOworICAgIGRvYy5Mb2FkRmlsZShwYXRoKTsKKyAgICBpZiAoZG9jLkVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBwYXJzZSAlczogVGlueXhtbDIgZXJyb3IgKCVkKTogJXMgJXMiLCBwYXRoLAorICAgICAgICAgICAgICBkb2MuRXJyb3JJRCgpLCBkb2MuR2V0RXJyb3JTdHIxKCksIGRvYy5HZXRFcnJvclN0cjIoKSk7CisgICAgICAgIHJldHVybiB7bnVsbHB0ciwgMH07CisgICAgfQorCisgICAgYXV0byBjb25maWcgPSBzdGQ6Om1ha2VfdW5pcXVlPENvbmZpZz4oKTsKKyAgICBzaXplX3QgbmJTa2lwcGVkRWxlbWVudHMgPSAwOworICAgIGF1dG8gcmVnaXN0ZXJGYWlsdXJlID0gWyZuYlNraXBwZWRFbGVtZW50c10oYm9vbCByZXN1bHQpIHsKKyAgICAgICAgbmJTa2lwcGVkRWxlbWVudHMgKz0gcmVzdWx0ID8gMCA6IDE7CisgICAgfTsKKyAgICBmb3IgKGF1dG8mIHhtbENvbmZpZyA6IGdldENoaWxkcmVuKGRvYywgImF1ZGlvX2VmZmVjdHNfY29uZiIpKSB7CisKKyAgICAgICAgLy8gUGFyc2UgbGlicmFyeQorICAgICAgICBmb3IgKGF1dG8mIHhtbExpYnJhcmllcyA6IGdldENoaWxkcmVuKHhtbENvbmZpZywgImxpYnJhcmllcyIpKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8mIHhtbExpYnJhcnkgOiBnZXRDaGlsZHJlbih4bWxMaWJyYXJpZXMsICJsaWJyYXJ5IikpIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlckZhaWx1cmUocGFyc2VMaWJyYXJ5KHhtbExpYnJhcnksICZjb25maWctPmxpYnJhcmllcykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUGFyc2UgZWZmZWN0cworICAgICAgICBmb3IgKGF1dG8mIHhtbEVmZmVjdHMgOiBnZXRDaGlsZHJlbih4bWxDb25maWcsICJlZmZlY3RzIikpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgeG1sRWZmZWN0IDogZ2V0Q2hpbGRyZW4oeG1sRWZmZWN0cykpIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlckZhaWx1cmUocGFyc2VFZmZlY3QoeG1sRWZmZWN0LCBjb25maWctPmxpYnJhcmllcywgJmNvbmZpZy0+ZWZmZWN0cykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUGFyc2UgcHJlIHByb2Nlc3NpbmcgY2hhaW5zCisgICAgICAgIGZvciAoYXV0byYgeG1sUHJlcHJvY2VzcyA6IGdldENoaWxkcmVuKHhtbENvbmZpZywgInByZXByb2Nlc3MiKSkgeworICAgICAgICAgICAgZm9yIChhdXRvJiB4bWxTdHJlYW0gOiBnZXRDaGlsZHJlbih4bWxQcmVwcm9jZXNzLCAic3RyZWFtIikpIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlckZhaWx1cmUocGFyc2VTdHJlYW0oeG1sU3RyZWFtLCBjb25maWctPmVmZmVjdHMsICZjb25maWctPnByZXByb2Nlc3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFBhcnNlIHBvc3QgcHJvY2Vzc2luZyBjaGFpbnMKKyAgICAgICAgZm9yIChhdXRvJiB4bWxQb3N0cHJvY2VzcyA6IGdldENoaWxkcmVuKHhtbENvbmZpZywgInBvc3Rwcm9jZXNzIikpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgeG1sU3RyZWFtIDogZ2V0Q2hpbGRyZW4oeG1sUG9zdHByb2Nlc3MsICJzdHJlYW0iKSkgeworICAgICAgICAgICAgICAgIHJlZ2lzdGVyRmFpbHVyZShwYXJzZVN0cmVhbSh4bWxTdHJlYW0sIGNvbmZpZy0+ZWZmZWN0cywgJmNvbmZpZy0+cG9zdHByb2Nlc3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4ge3N0ZDo6bW92ZShjb25maWcpLCBuYlNraXBwZWRFbGVtZW50c307Cit9CisKK30gLy8gbmFtZXNwYWNlIGVmZmVjdHNDb25maWcKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQubWsKaW5kZXggNzNmNmVmNS4uYTVmYmYxNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQubWsKQEAgLTIwLDYgKzIwLDcgQEAKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykgXAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKIAorIy1EQlVJTERfRkxPQVQKIExPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCiBMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguYwppbmRleCA3YzY4NWVjLi5iNGExZDc3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmMKQEAgLTMzLDYgKzMzLDEwIEBACiAKICNkZWZpbmUgTUlOVVNfM19EQl9JTl9RMTlfMTIgMjg5NiAvLyAtM2RCID0gMC43MDcgKiAyXjEyID0gMjg5NgogCisjaWZkZWYgQlVJTERfRkxPQVQKKyNkZWZpbmUgTUlOVVNfM19EQl9JTl9GTE9BVCAwLjcwNzEwNjc4ZiAvLyAtM2RCID0gMC43MDcxMDY3OGYKKyNlbmRpZgorCiAvLyBzdWJzZXQgb2YgcG9zc2libGUgYXVkaW9fY2hhbm5lbF9tYXNrX3QgdmFsdWVzLCBhbmQgQVVESU9fQ0hBTk5FTF9PVVRfKiByZW5hbWVkIHRvIENIQU5ORUxfTUFTS18qCiB0eXBlZGVmIGVudW0gewogICAgIENIQU5ORUxfTUFTS19RVUFEX0JBQ0sgPSBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0ssCkBAIC04Miw4ICs4NiwxOSBAQAogCiAvLyBudW1iZXIgb2YgZWZmZWN0cyBpbiB0aGlzIGxpYnJhcnkKIGNvbnN0IGludCBrTmJFZmZlY3RzID0gc2l6ZW9mKGdEZXNjcmlwdG9ycykgLyBzaXplb2YoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKTsKLQotCisjaWZkZWYgQlVJTERfRkxPQVQKK3N0YXRpYyBMVk1fRkxPQVQgY2xhbXBfZmxvYXQoTFZNX0ZMT0FUIGEpIHsKKyAgICBpZiAoYSA+IDEuMGYpIHsKKyAgICAgICAgcmV0dXJuIDEuMGY7CisgICAgfQorICAgIGVsc2UgaWYgKGEgPCAtMS4wZikgeworICAgICAgICByZXR1cm4gLTEuMGY7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gYTsKKyAgICB9Cit9CisjZW5kaWYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogVGVzdCBjb2RlCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTI4Niw3ICszMDEsNyBAQAogICAgIHJldHVybiAtRUlOVkFMOwogfQogCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKIC8qLS0tIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbiAtLS0qLwogCiBzdGF0aWMgaW50IERvd25taXhfUHJvY2VzcyhlZmZlY3RfaGFuZGxlX3Qgc2VsZiwKQEAgLTM4NSw3ICs0MDAsMTA4IEBACiAKICAgICByZXR1cm4gMDsKIH0KKyNlbHNlIC8qQlVJTERfRkxPQVQqLworLyotLS0gRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uIC0tLSovCiAKK3N0YXRpYyBpbnQgRG93bm1peF9Qcm9jZXNzKGVmZmVjdF9oYW5kbGVfdCBzZWxmLAorICAgICAgICBhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpIHsKKworICAgIGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXI7CisgICAgTFZNX0ZMT0FUICpwU3JjLCAqcERzdDsKKyAgICBkb3dubWl4X21vZHVsZV90ICpwRHdtTW9kdWxlID0gKGRvd25taXhfbW9kdWxlX3QgKilzZWxmOworCisgICAgaWYgKHBEd21Nb2R1bGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAoaW5CdWZmZXIgPT0gTlVMTCB8fCBpbkJ1ZmZlci0+cmF3ID09IE5VTEwgfHwKKyAgICAgICAgb3V0QnVmZmVyID09IE5VTEwgfHwgb3V0QnVmZmVyLT5yYXcgPT0gTlVMTCB8fAorICAgICAgICBpbkJ1ZmZlci0+ZnJhbWVDb3VudCAhPSBvdXRCdWZmZXItPmZyYW1lQ291bnQpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcERvd25taXhlciA9IChkb3dubWl4X29iamVjdF90KikgJnBEd21Nb2R1bGUtPmNvbnRleHQ7CisKKyAgICBpZiAocERvd25taXhlci0+c3RhdGUgPT0gRE9XTk1JWF9TVEFURV9VTklOSVRJQUxJWkVEKSB7CisgICAgICAgIEFMT0dFKCJEb3dubWl4X1Byb2Nlc3MgZXJyb3I6IHRyeWluZyB0byB1c2UgYW4gdW5pbml0aWFsaXplZCBkb3dubWl4ZXIiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfSBlbHNlIGlmIChwRG93bm1peGVyLT5zdGF0ZSA9PSBET1dOTUlYX1NUQVRFX0lOSVRJQUxJWkVEKSB7CisgICAgICAgIEFMT0dFKCJEb3dubWl4X1Byb2Nlc3MgZXJyb3I6IHRyeWluZyB0byB1c2UgYSBub24tY29uZmlndXJlZCBkb3dubWl4ZXIiKTsKKyAgICAgICAgcmV0dXJuIC1FTk9EQVRBOworICAgIH0KKworICAgIHBTcmMgPSAoTFZNX0ZMT0FUICopIGluQnVmZmVyLT5zMTY7CisgICAgcERzdCA9IChMVk1fRkxPQVQgKikgb3V0QnVmZmVyLT5zMTY7CisgICAgc2l6ZV90IG51bUZyYW1lcyA9IG91dEJ1ZmZlci0+ZnJhbWVDb3VudDsKKworICAgIGNvbnN0IGJvb2wgYWNjdW11bGF0ZSA9CisgICAgICAgICAgICAocER3bU1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpOworICAgIGNvbnN0IHVpbnQzMl90IGRvd25taXhJbnB1dENoYW5uZWxNYXNrID0gcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzOworCisgICAgc3dpdGNoKHBEb3dubWl4ZXItPnR5cGUpIHsKKworICAgICAgY2FzZSBET1dOTUlYX1RZUEVfU1RSSVA6CisgICAgICAgICAgaWYgKGFjY3VtdWxhdGUpIHsKKyAgICAgICAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgeworICAgICAgICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wX2Zsb2F0KHBEc3RbMF0gKyBwU3JjWzBdKTsKKyAgICAgICAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChwRHN0WzFdICsgcFNyY1sxXSk7CisgICAgICAgICAgICAgICAgICBwU3JjICs9IHBEb3dubWl4ZXItPmlucHV0X2NoYW5uZWxfY291bnQ7CisgICAgICAgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKKyAgICAgICAgICAgICAgICAgIHBEc3RbMF0gPSBwU3JjWzBdOworICAgICAgICAgICAgICAgICAgcERzdFsxXSA9IHBTcmNbMV07CisgICAgICAgICAgICAgICAgICBwU3JjICs9IHBEb3dubWl4ZXItPmlucHV0X2NoYW5uZWxfY291bnQ7CisgICAgICAgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBET1dOTUlYX1RZUEVfRk9MRDoKKyNpZmRlZiBET1dOTUlYX0FMV0FZU19VU0VfR0VORVJJQ19ET1dOTUlYRVIKKyAgICAgICAgICAvLyBieXBhc3MgdGhlIG9wdGltaXplZCBkb3dubWl4IHJvdXRpbmVzIGZvciB0aGUgY29tbW9uIGZvcm1hdHMKKyAgICAgICAgICBpZiAoIURvd25taXhfZm9sZEdlbmVyaWMoCisgICAgICAgICAgICAgICAgICBkb3dubWl4SW5wdXRDaGFubmVsTWFzaywgcFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKSkgeworICAgICAgICAgICAgICBBTE9HRSgiTXVsdGljaGFubmVsIGNvbmZpZ3VyYXRpb24gMHglIiBQUkl4MzIgIiBpcyBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgZG93bm1peElucHV0Q2hhbm5lbE1hc2spOworICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgLy8gb3B0aW1pemUgZm9yIHRoZSBjb21tb24gZm9ybWF0cworICAgICAgICBzd2l0Y2goKGRvd25taXhfaW5wdXRfY2hhbm5lbF9tYXNrX3QpZG93bm1peElucHV0Q2hhbm5lbE1hc2spIHsKKyAgICAgICAgY2FzZSBDSEFOTkVMX01BU0tfUVVBRF9CQUNLOgorICAgICAgICBjYXNlIENIQU5ORUxfTUFTS19RVUFEX1NJREU6CisgICAgICAgICAgICBEb3dubWl4X2ZvbGRGcm9tUXVhZChwU3JjLCBwRHN0LCBudW1GcmFtZXMsIGFjY3VtdWxhdGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLXzVQT0lOVDFfQkFDSzoKKyAgICAgICAgY2FzZSBDSEFOTkVMX01BU0tfNVBPSU5UMV9TSURFOgorICAgICAgICAgICAgRG93bm1peF9mb2xkRnJvbTVQb2ludDEocFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENIQU5ORUxfTUFTS183UE9JTlQxOgorICAgICAgICAgICAgRG93bm1peF9mb2xkRnJvbTdQb2ludDEocFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKCFEb3dubWl4X2ZvbGRHZW5lcmljKAorICAgICAgICAgICAgICAgICAgICBkb3dubWl4SW5wdXRDaGFubmVsTWFzaywgcFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJNdWx0aWNoYW5uZWwgY29uZmlndXJhdGlvbiAweCUiIFBSSXgzMiAiIGlzIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgIGRvd25taXhJbnB1dENoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgogCiBzdGF0aWMgaW50IERvd25taXhfQ29tbWFuZChlZmZlY3RfaGFuZGxlX3Qgc2VsZiwgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwKICAgICAgICAgdm9pZCAqcENtZERhdGEsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKQEAgLTgyMiw2ICs5MzgsNyBAQAogICoKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIERvd25taXhfZm9sZEZyb21RdWFkKGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKSB7CiAgICAgLy8gc2FtcGxlIGF0IGluZGV4IDAgaXMgRkwKICAgICAvLyBzYW1wbGUgYXQgaW5kZXggMSBpcyBGUgpAQCAtODQ5LDcgKzk2NiwzNSBAQAogICAgICAgICB9CiAgICAgfQogfQotCisjZWxzZQordm9pZCBEb3dubWl4X2ZvbGRGcm9tUXVhZChMVk1fRkxPQVQgKnBTcmMsIExWTV9GTE9BVCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKSB7CisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDAgaXMgRkwKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMSBpcyBGUgorICAgIC8vIHNhbXBsZSBhdCBpbmRleCAyIGlzIFJMCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDMgaXMgUlIKKyAgICBpZiAoYWNjdW11bGF0ZSkgeworICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CisgICAgICAgICAgICAvLyBGTCArIFJMCisgICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQocERzdFswXSArICgocFNyY1swXSArIHBTcmNbMl0pIC8gMi4wZikpOworICAgICAgICAgICAgLy8gRlIgKyBSUgorICAgICAgICAgICAgcERzdFsxXSA9IGNsYW1wX2Zsb2F0KHBEc3RbMV0gKyAoKHBTcmNbMV0gKyBwU3JjWzNdKSAvIDIuMGYpKTsKKyAgICAgICAgICAgIHBTcmMgKz0gNDsKKyAgICAgICAgICAgIHBEc3QgKz0gMjsKKyAgICAgICAgICAgIG51bUZyYW1lcy0tOworICAgICAgICB9CisgICAgfSBlbHNlIHsgLy8gc2FtZSBjb2RlIGFzIGFib3ZlIGJ1dCB3aXRob3V0IGFkZGluZyBhbmQgY2xhbXBpbmcgcERzdFtpXSB0byBpdHNlbGYKKyAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgeworICAgICAgICAgICAgLy8gRkwgKyBSTAorICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wX2Zsb2F0KChwU3JjWzBdICsgcFNyY1syXSkgLyAyLjBmKTsKKyAgICAgICAgICAgIC8vIEZSICsgUlIKKyAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdCgocFNyY1sxXSArIHBTcmNbM10pIC8gMi4wZik7CisgICAgICAgICAgICBwU3JjICs9IDQ7CisgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIERvd25taXhfZm9sZEZyb201UG9pbnQxKCkKQEAgLTg2OCw2ICsxMDEzLDcgQEAKICAqCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCBEb3dubWl4X2ZvbGRGcm9tNVBvaW50MShpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgewogICAgIGludDMyX3QgbHQsIHJ0LCBjZW50ZXJQbHVzTGZlQ29udHJpYjsgLy8gc2FtcGxlcyBpbiBRMTkuMTIgZm9ybWF0CiAgICAgLy8gc2FtcGxlIGF0IGluZGV4IDAgaXMgRkwKQEAgLTkxMiw3ICsxMDU4LDUyIEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0KKyNlbHNlCit2b2lkIERvd25taXhfZm9sZEZyb201UG9pbnQxKExWTV9GTE9BVCAqcFNyYywgTFZNX0ZMT0FUICpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpIHsKKyAgICBMVk1fRkxPQVQgbHQsIHJ0LCBjZW50ZXJQbHVzTGZlQ29udHJpYjsgLy8gc2FtcGxlcyBpbiBRMTkuMTIgZm9ybWF0CisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDAgaXMgRkwKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMSBpcyBGUgorICAgIC8vIHNhbXBsZSBhdCBpbmRleCAyIGlzIEZDCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDMgaXMgTEZFCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDQgaXMgUkwKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggNSBpcyBSUgorICAgIC8vIGNvZGUgaXMgbW9zdGx5IGR1cGxpY2F0ZWQgYmV0d2VlbiB0aGUgdHdvIHZhbHVlcyBvZiBhY2N1bXVsYXRlIHRvIGF2b2lkIHJlcGVhdGluZyB0aGUgdGVzdAorICAgIC8vIGZvciBldmVyeSBzYW1wbGUKKyAgICBpZiAoYWNjdW11bGF0ZSkgeworICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CisgICAgICAgICAgICAvLyBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IEZDKC0zZEIpICsgTEZFKC0zZEIpCisgICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9GTE9BVCkKKyAgICAgICAgICAgICAgICAgICAgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpOworICAgICAgICAgICAgLy8gRkwgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFJMCisgICAgICAgICAgICBsdCA9IHBTcmNbMF0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbNF07CisgICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNMZmVDb250cmliICsgUlIKKyAgICAgICAgICAgIHJ0ID0gcFNyY1sxXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s1XTsKKyAgICAgICAgICAgIC8vIGFjY3VtdWxhdGUgaW4gZGVzdGluYXRpb24KKyAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdChwRHN0WzBdICsgKGx0IC8gMi4wZikpOworICAgICAgICAgICAgcERzdFsxXSA9IGNsYW1wX2Zsb2F0KHBEc3RbMV0gKyAocnQgLyAyLjBmKSk7CisgICAgICAgICAgICBwU3JjICs9IDY7CisgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8vIHNhbWUgY29kZSBhcyBhYm92ZSBidXQgd2l0aG91dCBhZGRpbmcgYW5kIGNsYW1waW5nIHBEc3RbaV0gdG8gaXRzZWxmCisgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKKyAgICAgICAgICAgIC8vIGNlbnRlclBsdXNMZmVDb250cmliID0gRkMoLTNkQikgKyBMRkUoLTNkQikKKyAgICAgICAgICAgIGNlbnRlclBsdXNMZmVDb250cmliID0gKHBTcmNbMl0gKiBNSU5VU18zX0RCX0lOX0ZMT0FUKQorICAgICAgICAgICAgICAgICAgICArIChwU3JjWzNdICogTUlOVVNfM19EQl9JTl9GTE9BVCk7CisgICAgICAgICAgICAvLyBGTCArIGNlbnRlclBsdXNMZmVDb250cmliICsgUkwKKyAgICAgICAgICAgIGx0ID0gcFNyY1swXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s0XTsKKyAgICAgICAgICAgIC8vIEZSICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBSUgorICAgICAgICAgICAgcnQgPSBwU3JjWzFdICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBwU3JjWzVdOworICAgICAgICAgICAgLy8gc3RvcmUgaW4gZGVzdGluYXRpb24KKyAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdChsdCAvIDIuMGYpOyAvLyBkaWZmZXJzIGZyb20gd2hlbiBhY2N1bXVsYXRlIGlzIHRydWUgYWJvdmUKKyAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChydCAvIDIuMGYpOyAvLyBkaWZmZXJzIGZyb20gd2hlbiBhY2N1bXVsYXRlIGlzIHRydWUgYWJvdmUKKyAgICAgICAgICAgIHBTcmMgKz0gNjsKKyAgICAgICAgICAgIHBEc3QgKz0gMjsKKyAgICAgICAgICAgIG51bUZyYW1lcy0tOworICAgICAgICB9CisgICAgfQorfQorI2VuZGlmCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRG93bm1peF9mb2xkRnJvbTdQb2ludDEoKQpAQCAtOTMxLDYgKzExMjIsNyBAQAogICoKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIERvd25taXhfZm9sZEZyb203UG9pbnQxKGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKSB7CiAgICAgaW50MzJfdCBsdCwgcnQsIGNlbnRlclBsdXNMZmVDb250cmliOyAvLyBzYW1wbGVzIGluIFExOS4xMiBmb3JtYXQKICAgICAvLyBzYW1wbGUgYXQgaW5kZXggMCBpcyBGTApAQCAtOTc3LDggKzExNjksNTQgQEAKICAgICAgICAgfQogICAgIH0KIH0KLQotCisjZWxzZQordm9pZCBEb3dubWl4X2ZvbGRGcm9tN1BvaW50MShMVk1fRkxPQVQgKnBTcmMsIExWTV9GTE9BVCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKSB7CisgICAgTFZNX0ZMT0FUIGx0LCBydCwgY2VudGVyUGx1c0xmZUNvbnRyaWI7IC8vIHNhbXBsZXMgaW4gUTE5LjEyIGZvcm1hdAorICAgIC8vIHNhbXBsZSBhdCBpbmRleCAwIGlzIEZMCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDEgaXMgRlIKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMiBpcyBGQworICAgIC8vIHNhbXBsZSBhdCBpbmRleCAzIGlzIExGRQorICAgIC8vIHNhbXBsZSBhdCBpbmRleCA0IGlzIFJMCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDUgaXMgUlIKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggNiBpcyBTTAorICAgIC8vIHNhbXBsZSBhdCBpbmRleCA3IGlzIFNSCisgICAgLy8gY29kZSBpcyBtb3N0bHkgZHVwbGljYXRlZCBiZXR3ZWVuIHRoZSB0d28gdmFsdWVzIG9mIGFjY3VtdWxhdGUgdG8gYXZvaWQgcmVwZWF0aW5nIHRoZSB0ZXN0CisgICAgLy8gZm9yIGV2ZXJ5IHNhbXBsZQorICAgIGlmIChhY2N1bXVsYXRlKSB7CisgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKKyAgICAgICAgICAgIC8vIGNlbnRlclBsdXNMZmVDb250cmliID0gRkMoLTNkQikgKyBMRkUoLTNkQikKKyAgICAgICAgICAgIGNlbnRlclBsdXNMZmVDb250cmliID0gKHBTcmNbMl0gKiBNSU5VU18zX0RCX0lOX1ExOV8xMikKKyAgICAgICAgICAgICAgICAgICAgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fUTE5XzEyKTsKKyAgICAgICAgICAgIC8vIEZMICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBTTCArIFJMCisgICAgICAgICAgICBsdCA9IHBTcmNbMF0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbNl0gKyBwU3JjWzRdOworICAgICAgICAgICAgLy8gRlIgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFNSICsgUlIKKyAgICAgICAgICAgIHJ0ID0gcFNyY1sxXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s3XSArIHBTcmNbNV07CisgICAgICAgICAgICAvL2FjY3VtdWxhdGUgaW4gZGVzdGluYXRpb24KKyAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdChwRHN0WzBdICsgKGx0IC8gMi4wZikpOworICAgICAgICAgICAgcERzdFsxXSA9IGNsYW1wX2Zsb2F0KHBEc3RbMV0gKyAocnQgLyAyLjBmKSk7CisgICAgICAgICAgICBwU3JjICs9IDg7CisgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8vIHNhbWUgY29kZSBhcyBhYm92ZSBidXQgd2l0aG91dCBhZGRpbmcgYW5kIGNsYW1waW5nIHBEc3RbaV0gdG8gaXRzZWxmCisgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKKyAgICAgICAgICAgIC8vIGNlbnRlclBsdXNMZmVDb250cmliID0gRkMoLTNkQikgKyBMRkUoLTNkQikKKyAgICAgICAgICAgIGNlbnRlclBsdXNMZmVDb250cmliID0gKHBTcmNbMl0gKiBNSU5VU18zX0RCX0lOX0ZMT0FUKQorICAgICAgICAgICAgICAgICAgICArIChwU3JjWzNdICogTUlOVVNfM19EQl9JTl9GTE9BVCk7CisgICAgICAgICAgICAvLyBGTCArIGNlbnRlclBsdXNMZmVDb250cmliICsgU0wgKyBSTAorICAgICAgICAgICAgbHQgPSBwU3JjWzBdICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBwU3JjWzZdICsgcFNyY1s0XTsKKyAgICAgICAgICAgIC8vIEZSICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBTUiArIFJSCisgICAgICAgICAgICBydCA9IHBTcmNbMV0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbN10gKyBwU3JjWzVdOworICAgICAgICAgICAgLy8gc3RvcmUgaW4gZGVzdGluYXRpb24KKyAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdChsdCAvIDIuMGYpOyAvLyBkaWZmZXJzIGZyb20gd2hlbiBhY2N1bXVsYXRlIGlzIHRydWUgYWJvdmUKKyAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChydCAvIDIuMGYpOyAvLyBkaWZmZXJzIGZyb20gd2hlbiBhY2N1bXVsYXRlIGlzIHRydWUgYWJvdmUKKyAgICAgICAgICAgIHBTcmMgKz0gODsKKyAgICAgICAgICAgIHBEc3QgKz0gMjsKKyAgICAgICAgICAgIG51bUZyYW1lcy0tOworICAgICAgICB9CisgICAgfQorfQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIERvd25taXhfZm9sZEdlbmVyaWMoKQogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMDA1LDYgKzEyNDMsNyBAQAogICoKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBib29sIERvd25taXhfZm9sZEdlbmVyaWMoCiAgICAgICAgIHVpbnQzMl90IG1hc2ssIGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKSB7CiAKQEAgLTEwOTYsMyArMTMzNSw5NiBAQAogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KKyNlbHNlCitib29sIERvd25taXhfZm9sZEdlbmVyaWMoCisgICAgICAgIHVpbnQzMl90IG1hc2ssIExWTV9GTE9BVCAqcFNyYywgTFZNX0ZMT0FUICpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpIHsKKworICAgIGlmICghRG93bm1peF92YWxpZENoYW5uZWxNYXNrKG1hc2spKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBib29sIGhhc1NpZGVzID0gKG1hc2sgJiBrU2lkZXMpICE9IDA7CisgICAgY29uc3QgYm9vbCBoYXNCYWNrcyA9IChtYXNrICYga0JhY2tzKSAhPSAwOworCisgICAgY29uc3QgaW50IG51bUNoYW4gPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobWFzayk7CisgICAgY29uc3QgYm9vbCBoYXNGQyA9ICgobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUikgPT0gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSKTsKKyAgICBjb25zdCBib29sIGhhc0xGRSA9CisgICAgICAgICAgICAoKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZKSA9PSBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZKTsKKyAgICBjb25zdCBib29sIGhhc0JDID0gKChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19DRU5URVIpID09IEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfQ0VOVEVSKTsKKyAgICAvLyBjb21wdXRlIGF0IHdoYXQgaW5kZXggZWFjaCBjaGFubmVsIGlzOiBzYW1wbGVzIHdpbGwgYmUgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKKyAgICAvLyAgIEZMIEZSIEZDIExGRSBCTCBCUiBCQyBTTCBTUgorICAgIC8vIHdoZW4gYSBjaGFubmVsIGlzIG5vdCBwcmVzZW50LCBpdHMgaW5kZXggaXMgc2V0IHRvIHRoZSBzYW1lIGFzIHRoZSBpbmRleCBvZiB0aGUgcHJlY2VkaW5nCisgICAgLy8gY2hhbm5lbAorICAgIGNvbnN0IGludCBpbmRleEZDICA9IGhhc0ZDICAgID8gMiAgICAgICAgICAgIDogMTsgICAgICAgIC8vIGZyb250IGNlbnRlcgorICAgIGNvbnN0IGludCBpbmRleExGRSA9IGhhc0xGRSAgID8gaW5kZXhGQyArIDEgIDogaW5kZXhGQzsgIC8vIGxvdyBmcmVxdWVuY3kKKyAgICBjb25zdCBpbnQgaW5kZXhCTCAgPSBoYXNCYWNrcyA/IGluZGV4TEZFICsgMSA6IGluZGV4TEZFOyAvLyBiYWNrIGxlZnQKKyAgICBjb25zdCBpbnQgaW5kZXhCUiAgPSBoYXNCYWNrcyA/IGluZGV4QkwgKyAxICA6IGluZGV4Qkw7ICAvLyBiYWNrIHJpZ2h0CisgICAgY29uc3QgaW50IGluZGV4QkMgID0gaGFzQkMgICAgPyBpbmRleEJSICsgMSAgOiBpbmRleEJSOyAgLy8gYmFjayBjZW50ZXIKKyAgICBjb25zdCBpbnQgaW5kZXhTTCAgPSBoYXNTaWRlcyA/IGluZGV4QkMgKyAxICA6IGluZGV4QkM7ICAvLyBzaWRlIGxlZnQKKyAgICBjb25zdCBpbnQgaW5kZXhTUiAgPSBoYXNTaWRlcyA/IGluZGV4U0wgKyAxICA6IGluZGV4U0w7ICAvLyBzaWRlIHJpZ2h0CisKKyAgICBMVk1fRkxPQVQgbHQsIHJ0LCBjZW50ZXJzTGZlQ29udHJpYjsKKyAgICAvLyBjb2RlIGlzIG1vc3RseSBkdXBsaWNhdGVkIGJldHdlZW4gdGhlIHR3byB2YWx1ZXMgb2YgYWNjdW11bGF0ZSB0byBhdm9pZCByZXBlYXRpbmcgdGhlIHRlc3QKKyAgICAvLyBmb3IgZXZlcnkgc2FtcGxlCisgICAgaWYgKGFjY3VtdWxhdGUpIHsKKyAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgeworICAgICAgICAgICAgLy8gY29tcHV0ZSBjb250cmlidXRpb24gb2YgRkMsIEJDIGFuZCBMRkUKKyAgICAgICAgICAgIGNlbnRlcnNMZmVDb250cmliID0gMDsKKyAgICAgICAgICAgIGlmIChoYXNGQykgIHsgY2VudGVyc0xmZUNvbnRyaWIgKz0gcFNyY1tpbmRleEZDXTsgfQorICAgICAgICAgICAgaWYgKGhhc0xGRSkgeyBjZW50ZXJzTGZlQ29udHJpYiArPSBwU3JjW2luZGV4TEZFXTsgfQorICAgICAgICAgICAgaWYgKGhhc0JDKSAgeyBjZW50ZXJzTGZlQ29udHJpYiArPSBwU3JjW2luZGV4QkNdOyB9CisgICAgICAgICAgICBjZW50ZXJzTGZlQ29udHJpYiAqPSBNSU5VU18zX0RCX0lOX0ZMT0FUOworICAgICAgICAgICAgLy8gYWx3YXlzIGhhcyBGTC9GUgorICAgICAgICAgICAgbHQgPSBwU3JjWzBdOworICAgICAgICAgICAgcnQgPSBwU3JjWzFdOworICAgICAgICAgICAgLy8gbWl4IGluIHNpZGVzIGFuZCBiYWNrcworICAgICAgICAgICAgaWYgKGhhc1NpZGVzKSB7CisgICAgICAgICAgICAgICAgbHQgKz0gcFNyY1tpbmRleFNMXTsKKyAgICAgICAgICAgICAgICBydCArPSBwU3JjW2luZGV4U1JdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhhc0JhY2tzKSB7CisgICAgICAgICAgICAgICAgbHQgKz0gcFNyY1tpbmRleEJMXTsKKyAgICAgICAgICAgICAgICBydCArPSBwU3JjW2luZGV4QlJdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbHQgKz0gY2VudGVyc0xmZUNvbnRyaWI7CisgICAgICAgICAgICBydCArPSBjZW50ZXJzTGZlQ29udHJpYjsKKyAgICAgICAgICAgIC8vIGFjY3VtdWxhdGUgaW4gZGVzdGluYXRpb24KKyAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdChwRHN0WzBdICsgKGx0IC8gMi4wZikpOworICAgICAgICAgICAgcERzdFsxXSA9IGNsYW1wX2Zsb2F0KHBEc3RbMV0gKyAocnQgLyAyLjBmKSk7CisgICAgICAgICAgICBwU3JjICs9IG51bUNoYW47CisgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKKyAgICAgICAgICAgIC8vIGNvbXB1dGUgY29udHJpYnV0aW9uIG9mIEZDLCBCQyBhbmQgTEZFCisgICAgICAgICAgICBjZW50ZXJzTGZlQ29udHJpYiA9IDA7CisgICAgICAgICAgICBpZiAoaGFzRkMpICB7IGNlbnRlcnNMZmVDb250cmliICs9IHBTcmNbaW5kZXhGQ107IH0KKyAgICAgICAgICAgIGlmIChoYXNMRkUpIHsgY2VudGVyc0xmZUNvbnRyaWIgKz0gcFNyY1tpbmRleExGRV07IH0KKyAgICAgICAgICAgIGlmIChoYXNCQykgIHsgY2VudGVyc0xmZUNvbnRyaWIgKz0gcFNyY1tpbmRleEJDXTsgfQorICAgICAgICAgICAgY2VudGVyc0xmZUNvbnRyaWIgKj0gTUlOVVNfM19EQl9JTl9GTE9BVDsKKyAgICAgICAgICAgIC8vIGFsd2F5cyBoYXMgRkwvRlIKKyAgICAgICAgICAgIGx0ID0gcFNyY1swXTsKKyAgICAgICAgICAgIHJ0ID0gcFNyY1sxXTsKKyAgICAgICAgICAgIC8vIG1peCBpbiBzaWRlcyBhbmQgYmFja3MKKyAgICAgICAgICAgIGlmIChoYXNTaWRlcykgeworICAgICAgICAgICAgICAgIGx0ICs9IHBTcmNbaW5kZXhTTF07CisgICAgICAgICAgICAgICAgcnQgKz0gcFNyY1tpbmRleFNSXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoYXNCYWNrcykgeworICAgICAgICAgICAgICAgIGx0ICs9IHBTcmNbaW5kZXhCTF07CisgICAgICAgICAgICAgICAgcnQgKz0gcFNyY1tpbmRleEJSXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGx0ICs9IGNlbnRlcnNMZmVDb250cmliOworICAgICAgICAgICAgcnQgKz0gY2VudGVyc0xmZUNvbnRyaWI7CisgICAgICAgICAgICAvLyBzdG9yZSBpbiBkZXN0aW5hdGlvbgorICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wX2Zsb2F0KGx0IC8gMi4wZik7IC8vIGRpZmZlcnMgZnJvbSB3aGVuIGFjY3VtdWxhdGUgaXMgdHJ1ZSBhYm92ZQorICAgICAgICAgICAgcERzdFsxXSA9IGNsYW1wX2Zsb2F0KHJ0IC8gMi4wZik7IC8vIGRpZmZlcnMgZnJvbSB3aGVuIGFjY3VtdWxhdGUgaXMgdHJ1ZSBhYm92ZQorICAgICAgICAgICAgcFNyYyArPSBudW1DaGFuOworICAgICAgICAgICAgcERzdCArPSAyOworICAgICAgICAgICAgbnVtRnJhbWVzLS07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5oIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguaAppbmRleCAyMzk5YWJkLi5jMWJlMGYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmgKQEAgLTI3LDcgKzI3LDkgQEAKICovCiAKICNkZWZpbmUgRE9XTk1JWF9PVVRQVVRfQ0hBTk5FTFMgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorI2RlZmluZSBMVk1fRkxPQVQgZmxvYXQKKyNlbmRpZgogdHlwZWRlZiBlbnVtIHsKICAgICBET1dOTUlYX1NUQVRFX1VOSU5JVElBTElaRUQsCiAgICAgRE9XTk1JWF9TVEFURV9JTklUSUFMSVpFRCwKQEAgLTk1LDExICs5NywxOCBAQAogaW50IERvd25taXhfUmVzZXQoZG93bm1peF9vYmplY3RfdCAqcERvd25taXhlciwgYm9vbCBpbml0KTsKIGludCBEb3dubWl4X3NldFBhcmFtZXRlcihkb3dubWl4X29iamVjdF90ICpwRG93bm1peGVyLCBpbnQzMl90IHBhcmFtLCB1aW50MzJfdCBzaXplLCB2b2lkICpwVmFsdWUpOwogaW50IERvd25taXhfZ2V0UGFyYW1ldGVyKGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIsIGludDMyX3QgcGFyYW0sIHVpbnQzMl90ICpwU2l6ZSwgdm9pZCAqcFZhbHVlKTsKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIERvd25taXhfZm9sZEZyb21RdWFkKExWTV9GTE9BVCAqcFNyYywgTFZNX0ZMT0FUICpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpOwordm9pZCBEb3dubWl4X2ZvbGRGcm9tNVBvaW50MShMVk1fRkxPQVQgKnBTcmMsIExWTV9GTE9BVCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKK3ZvaWQgRG93bm1peF9mb2xkRnJvbTdQb2ludDEoTFZNX0ZMT0FUICpwU3JjLCBMVk1fRkxPQVQgKnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7Citib29sIERvd25taXhfZm9sZEdlbmVyaWMoCisgICAgICAgIHVpbnQzMl90IG1hc2ssIExWTV9GTE9BVCAqcFNyYywgTFZNX0ZMT0FUICpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpOworI2Vsc2UKIHZvaWQgRG93bm1peF9mb2xkRnJvbVF1YWQoaW50MTZfdCAqcFNyYywgaW50MTZfdCpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpOwogdm9pZCBEb3dubWl4X2ZvbGRGcm9tNVBvaW50MShpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7CiB2b2lkIERvd25taXhfZm9sZEZyb203UG9pbnQxKGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKIGJvb2wgRG93bm1peF9mb2xkR2VuZXJpYygKICAgICAgICAgdWludDMyX3QgbWFzaywgaW50MTZfdCAqcFNyYywgaW50MTZfdCpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpOworI2VuZGlmCiAKICNlbmRpZiAvKkFORFJPSURfRUZGRUNURE9XTk1JWF9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9BbmRyb2lkLmJwCmluZGV4IDE2NjgwYmQuLmRkYmZkZDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9BbmRyb2lkLmJwCkBAIC0xMCwxOCArMTAsNDcgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGliZWZmZWN0cyIsCiAgICAgdmVuZG9yOiB0cnVlLAotICAgIHNyY3M6IFsiRWZmZWN0c0ZhY3RvcnkuYyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgICJFZmZlY3RzRmFjdG9yeS5jIiwKKyAgICAgICAgICJFZmZlY3RzQ29uZmlnTG9hZGVyLmMiLAorICAgICAgICAgIkVmZmVjdHNGYWN0b3J5U3RhdGUuYyIsCisgICAgICAgICAiRWZmZWN0c1htbENvbmZpZ0xvYWRlci5jcHAiLAorICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJkbCIsCisgICAgICAgICJsaWJlZmZlY3RzY29uZmlnIiwKICAgICBdLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbInN5c3RlbS9tZWRpYS9hdWRpb19lZmZlY3RzL2luY2x1ZGUiXSwKKyAgICBjZmxhZ3M6IFsiLWZ2aXNpYmlsaXR5PWhpZGRlbiJdLAogCiAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOlsiaW5jbHVkZS9tZWRpYSJdLAogCi0gICAgaGVhZGVyX2xpYnM6IFsibGliZWZmZWN0c19oZWFkZXJzIl0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCisgICAgICAgICJsaWJlZmZlY3RzX2hlYWRlcnMiLAorICAgIF0sCiAgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWyJsaWJlZmZlY3RzX2hlYWRlcnMiXSwKIH0KKworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiZHVtcEVmZmVjdENvbmZpZ0ZpbGUiLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmNzOiBbInRlc3QvRHVtcENvbmZpZy5jcHAiXSwKKworICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmVmZmVjdHNjb25maWciLAorICAgICAgICAibGliZWZmZWN0cyIsCisgICAgXSwKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6WyIuIiwgImluY2x1ZGUiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzQ29uZmlnTG9hZGVyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0NvbmZpZ0xvYWRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZWYzNmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0NvbmZpZ0xvYWRlci5jCkBAIC0wLDAgKzEsNDM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJFZmZlY3RzRmFjdG9yeUNvbmZpZ0xvYWRlciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9hdWRpb19lZmZlY3RzX2NvbmYuaD4KKworI2luY2x1ZGUgIkVmZmVjdHNDb25maWdMb2FkZXIuaCIKKyNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeVN0YXRlLmgiCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgICAgTG9jYWwgZnVuY3Rpb25zIHByb3RvdHlwZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIGludCBsb2FkRWZmZWN0Q29uZmlnRmlsZShjb25zdCBjaGFyICpwYXRoKTsKK3N0YXRpYyBpbnQgbG9hZExpYnJhcmllcyhjbm9kZSAqcm9vdCk7CitzdGF0aWMgaW50IGxvYWRMaWJyYXJ5KGNub2RlICpyb290LCBjb25zdCBjaGFyICpuYW1lKTsKK3N0YXRpYyBpbnQgbG9hZEVmZmVjdHMoY25vZGUgKnJvb3QpOworc3RhdGljIGludCBsb2FkRWZmZWN0KGNub2RlICpub2RlKTsKKy8vIFRvIGdldCBhbmQgYWRkIHRoZSBlZmZlY3QgcG9pbnRlZCBieSB0aGUgcGFzc2VkIG5vZGUgdG8gdGhlIGdTdWJFZmZlY3RMaXN0CitzdGF0aWMgaW50IGFkZFN1YkVmZmVjdChjbm9kZSAqcm9vdCk7CitzdGF0aWMgbGliX2VudHJ5X3QgKmdldExpYnJhcnkoY29uc3QgY2hhciAqcGF0aCk7CisKK3N0YXRpYyBsaWJfZW50cnlfdCAqZ0NhY2hlZExpYnJhcnk7ICAvLyBsYXN0IGxpYnJhcnkgYWNjZXNzZWQgYnkgZ2V0TGlicmFyeSgpCisKK2ludCBFZmZlY3RMb2FkRWZmZWN0Q29uZmlnKCkKK3sKKyAgICBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKKyAgICAgICAgcmV0dXJuIGxvYWRFZmZlY3RDb25maWdGaWxlKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUpOworICAgIH0gZWxzZSBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFLCBSX09LKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBsb2FkRWZmZWN0Q29uZmlnRmlsZShBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgbG9hZEVmZmVjdENvbmZpZ0ZpbGUoY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgICBjbm9kZSAqcm9vdDsKKyAgICBjaGFyICpkYXRhOworCisgICAgZGF0YSA9IGxvYWRfZmlsZShwYXRoLCBOVUxMKTsKKyAgICBpZiAoZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKyAgICByb290ID0gY29uZmlnX25vZGUoIiIsICIiKTsKKyAgICBjb25maWdfbG9hZChyb290LCBkYXRhKTsKKyAgICBsb2FkTGlicmFyaWVzKHJvb3QpOworICAgIGxvYWRFZmZlY3RzKHJvb3QpOworICAgIGNvbmZpZ19mcmVlKHJvb3QpOworICAgIGZyZWUocm9vdCk7CisgICAgZnJlZShkYXRhKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgbG9hZExpYnJhcmllcyhjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqbm9kZTsKKworICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBMSUJSQVJJRVNfVEFHKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKyAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgbG9hZExpYnJhcnkobm9kZSwgbm9kZS0+bmFtZSk7CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2lmZGVmIF9fTFA2NF9fCisvLyBhdWRpb19lZmZlY3RzLmNvbmYgYWx3YXlzIHNwZWNpZmllcyAzMiBiaXQgbGliIHBhdGg6IGNvbnZlcnQgdG8gNjQgYml0IHBhdGggaWYgbmVlZGVkCitzdGF0aWMgY29uc3QgY2hhciAqa0xpYnJhcnlQYXRoUm9vdFtdID0KKyAgICAgICAgeyIvb2RtL2xpYjY0L3NvdW5kZngiLCAiL3ZlbmRvci9saWI2NC9zb3VuZGZ4IiwgIi9zeXN0ZW0vbGliNjQvc291bmRmeCJ9OworI2Vsc2UKK3N0YXRpYyBjb25zdCBjaGFyICprTGlicmFyeVBhdGhSb290W10gPQorICAgICAgICB7Ii9vZG0vbGliL3NvdW5kZngiLCAiL3ZlbmRvci9saWIvc291bmRmeCIsICIvc3lzdGVtL2xpYi9zb3VuZGZ4In07CisjZW5kaWYKKworc3RhdGljIGNvbnN0IGludCBrTGlicmFyeVBhdGhSb290U2l6ZSA9CisgICAgICAgIChzaXplb2Yoa0xpYnJhcnlQYXRoUm9vdCkgLyBzaXplb2Yoa0xpYnJhcnlQYXRoUm9vdFswXSkpOworCisvLyBDaGVja3MgaWYgdGhlIGxpYnJhcnkgcGF0aCBwYXNzZWQgYXMgbGliX3BhdGhfaW4gY2FuIGJlIG9wZW5lZCBhbmQgaWYgbm90CisvLyB0cmllcyBpbiBzdGFuZGFyZCBlZmZlY3QgbGlicmFyeSBkaXJlY3RvcmllcyB3aXRoIGp1c3QgdGhlIGxpYnJhcnkgbmFtZSBhbmQgcmV0dXJucyBjb3JyZWN0IHBhdGgKKy8vIGluIGxpYl9wYXRoX291dAoraW50IGNoZWNrTGlicmFyeVBhdGgoY29uc3QgY2hhciAqbGliX3BhdGhfaW4sIGNoYXIgKmxpYl9wYXRoX291dCkgeworICAgIGNoYXIgKnN0cjsKKyAgICBjb25zdCBjaGFyICpsaWJfbmFtZTsKKyAgICBzaXplX3QgbGVuOworCisgICAgaWYgKGxpYl9wYXRoX2luID09IE5VTEwgfHwgbGliX3BhdGhfb3V0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgc3RybGNweShsaWJfcGF0aF9vdXQsIGxpYl9wYXRoX2luLCBQQVRIX01BWCk7CisKKyAgICAvLyBUcnkgZXhhY3QgcGF0aCBmaXJzdAorICAgIHN0ciA9IHN0cnN0cihsaWJfcGF0aF9vdXQsICIvbGliL3NvdW5kZngvIik7CisgICAgaWYgKHN0ciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIC8vIEV4dHJhY3QgbGlicmFyeSBuYW1lIGZyb20gaW5wdXQgcGF0aAorICAgIGxlbiA9IHN0ciAtIGxpYl9wYXRoX291dDsKKyAgICBsaWJfbmFtZSA9IGxpYl9wYXRoX2luICsgbGVuICsgc3RybGVuKCIvbGliL3NvdW5kZngvIik7CisKKyAgICAvLyBUaGVuIHRyeSB3aXRoIGxpYnJhcnkgbmFtZSBhbmQgc3RhbmRhcmQgcGF0aCBuYW1lcyBpbiBvcmRlciBvZiBwcmVmZXJlbmNlCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTGlicmFyeVBhdGhSb290U2l6ZTsgaSsrKSB7CisgICAgICAgIGNoYXIgcGF0aFtQQVRIX01BWF07CisKKyAgICAgICAgc25wcmludGYocGF0aCwKKyAgICAgICAgICAgICAgICAgUEFUSF9NQVgsCisgICAgICAgICAgICAgICAgICIlcy8lcyIsCisgICAgICAgICAgICAgICAgIGtMaWJyYXJ5UGF0aFJvb3RbaV0sCisgICAgICAgICAgICAgICAgIGxpYl9uYW1lKTsKKyAgICAgICAgaWYgKEZfT0sgPT0gYWNjZXNzKHBhdGgsIDApKSB7CisgICAgICAgICAgICBzdHJjcHkobGliX3BhdGhfb3V0LCBwYXRoKTsKKyAgICAgICAgICAgIEFMT0dXX0lGKHN0cm5jbXAobGliX3BhdGhfb3V0LCBsaWJfcGF0aF9pbiwgUEFUSF9NQVgpICE9IDAsCisgICAgICAgICAgICAgICAgImNoZWNrTGlicmFyeVBhdGgoKSBjb3JyZWN0ZWQgbGlicmFyeSBwYXRoICVzIHRvICVzIiwgbGliX3BhdGhfaW4sIGxpYl9wYXRoX291dCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLUVJTlZBTDsKK30KKworCisKK2ludCBsb2FkTGlicmFyeShjbm9kZSAqcm9vdCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBjbm9kZSAqbm9kZTsKKyAgICB2b2lkICpoZGwgPSBOVUxMOworICAgIGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgKmRlc2M7CisgICAgbGlzdF9lbGVtX3QgKmU7CisgICAgbGliX2VudHJ5X3QgKmw7CisgICAgY2hhciBwYXRoW1BBVEhfTUFYXTsKKworICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBQQVRIX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAoY2hlY2tMaWJyYXJ5UGF0aCgoY29uc3QgY2hhciAqKW5vZGUtPnZhbHVlLCBwYXRoKSAhPSAwKSB7CisgICAgICAgIEFMT0dXKCJsb2FkTGlicmFyeSgpIGNvdWxkIG5vdCBmaW5kIGxpYnJhcnkgJXMiLCBwYXRoKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBoZGwgPSBkbG9wZW4ocGF0aCwgUlRMRF9OT1cpOworICAgIGlmIChoZGwgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygibG9hZExpYnJhcnkoKSBmYWlsZWQgdG8gb3BlbiAlcyIsIHBhdGgpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGRlc2MgPSAoYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCAqKWRsc3ltKGhkbCwgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU1fQVNfU1RSKTsKKyAgICBpZiAoZGVzYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJsb2FkTGlicmFyeSgpIGNvdWxkIG5vdCBmaW5kIHN5bWJvbCAlcyIsIEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNX0FTX1NUUik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaWYgKEFVRElPX0VGRkVDVF9MSUJSQVJZX1RBRyAhPSBkZXNjLT50YWcpIHsKKyAgICAgICAgQUxPR1coImdldExpYnJhcnkoKSBiYWQgdGFnICUwOHggaW4gbGliIGluZm8gc3RydWN0IiwgZGVzYy0+dGFnKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBpZiAoRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKGRlc2MtPnZlcnNpb24pICE9CisgICAgICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoRUZGRUNUX0xJQlJBUllfQVBJX1ZFUlNJT04pKSB7CisgICAgICAgIEFMT0dXKCJsb2FkTGlicmFyeSgpIGJhZCBsaWIgdmVyc2lvbiAlMDh4IiwgZGVzYy0+dmVyc2lvbik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLy8gYWRkIGVudHJ5IGZvciBsaWJyYXJ5IGluIGdMaWJyYXJ5TGlzdAorICAgIGwgPSBtYWxsb2Moc2l6ZW9mKGxpYl9lbnRyeV90KSk7CisgICAgbC0+bmFtZSA9IHN0cm5kdXAobmFtZSwgUEFUSF9NQVgpOworICAgIGwtPnBhdGggPSBzdHJuZHVwKHBhdGgsIFBBVEhfTUFYKTsKKyAgICBsLT5oYW5kbGUgPSBoZGw7CisgICAgbC0+ZGVzYyA9IGRlc2M7CisgICAgbC0+ZWZmZWN0cyA9IE5VTEw7CisgICAgcHRocmVhZF9tdXRleF9pbml0KCZsLT5sb2NrLCBOVUxMKTsKKworICAgIGUgPSBtYWxsb2Moc2l6ZW9mKGxpc3RfZWxlbV90KSk7CisgICAgZS0+b2JqZWN0ID0gbDsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmdMaWJMb2NrKTsKKyAgICBlLT5uZXh0ID0gZ0xpYnJhcnlMaXN0OworICAgIGdMaWJyYXJ5TGlzdCA9IGU7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdMaWJMb2NrKTsKKyAgICBBTE9HVigiZ2V0TGlicmFyeSgpIGxpbmtlZCBsaWJyYXJ5ICVwIGZvciBwYXRoICVzIiwgbCwgcGF0aCk7CisKKyAgICByZXR1cm4gMDsKKworZXJyb3I6CisgICAgaWYgKGhkbCAhPSBOVUxMKSB7CisgICAgICAgIGRsY2xvc2UoaGRsKTsKKyAgICB9CisgICAgLy9hZGQgZW50cnkgZm9yIGxpYnJhcnkgZXJyb3JzIGluIGdMaWJyYXJ5RmFpbGVkTGlzdAorICAgIGxpYl9mYWlsZWRfZW50cnlfdCAqZmwgPSBtYWxsb2Moc2l6ZW9mKGxpYl9mYWlsZWRfZW50cnlfdCkpOworICAgIGZsLT5uYW1lID0gc3RybmR1cChuYW1lLCBQQVRIX01BWCk7CisgICAgZmwtPnBhdGggPSBzdHJuZHVwKHBhdGgsIFBBVEhfTUFYKTsKKworICAgIGxpc3RfZWxlbV90ICpmZSA9IG1hbGxvYyhzaXplb2YobGlzdF9lbGVtX3QpKTsKKyAgICBmZS0+b2JqZWN0ID0gZmw7CisgICAgZmUtPm5leHQgPSBnTGlicmFyeUZhaWxlZExpc3Q7CisgICAgZ0xpYnJhcnlGYWlsZWRMaXN0ID0gZmU7CisgICAgQUxPR1YoImdldExpYnJhcnkoKSBsaW5rZWQgZXJyb3IgaW4gbGlicmFyeSAlcCBmb3IgcGF0aCAlcyIsIGZsLCBwYXRoKTsKKworICAgIHJldHVybiAtRUlOVkFMOworfQorCisvLyBUaGlzIHdpbGwgZmluZCB0aGUgbGlicmFyeSBhbmQgVVVJRCB0YWdzIG9mIHRoZSBzdWIgZWZmZWN0IHBvaW50ZWQgYnkgdGhlCisvLyBub2RlLCBnZXRzIHRoZSBlZmZlY3QgZGVzY3JpcHRvciBhbmQgbGliX2VudHJ5X3QgYW5kIGFkZHMgdGhlIHN1YmVmZmVjdCAtCisvLyBzdWJfZW50cnlfdCB0byB0aGUgZ1N1YkVmZmVjdExpc3QKK2ludCBhZGRTdWJFZmZlY3QoY25vZGUgKnJvb3QpCit7CisgICAgQUxPR1YoImFkZFN1YkVmZmVjdCIpOworICAgIGNub2RlICpub2RlOworICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKKyAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkOworICAgIGxpYl9lbnRyeV90ICpsOworICAgIGxpc3RfZWxlbV90ICplOworICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBMSUJSQVJZX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgbCA9IGdldExpYnJhcnkobm9kZS0+dmFsdWUpOworICAgIGlmIChsID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coImFkZFN1YkVmZmVjdCgpIGNvdWxkIG5vdCBnZXQgbGlicmFyeSAlcyIsIG5vZGUtPnZhbHVlKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBVVUlEX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgaWYgKHN0cmluZ1RvVXVpZChub2RlLT52YWx1ZSwgJnV1aWQpICE9IDApIHsKKyAgICAgICAgQUxPR1coImFkZFN1YkVmZmVjdCgpIGludmFsaWQgdXVpZCAlcyIsIG5vZGUtPnZhbHVlKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGQgPSBtYWxsb2Moc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICBpZiAobC0+ZGVzYy0+Z2V0X2Rlc2NyaXB0b3IoJnV1aWQsIGQpICE9IDApIHsKKyAgICAgICAgY2hhciBzWzQwXTsKKyAgICAgICAgdXVpZFRvU3RyaW5nKCZ1dWlkLCBzLCA0MCk7CisgICAgICAgIEFMT0dXKCJFcnJvciBxdWVyeWluZyBlZmZlY3QgJXMgb24gbGliICVzIiwgcywgbC0+bmFtZSk7CisgICAgICAgIGZyZWUoZCk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyNpZiAoTE9HX05ERUJVRz09MCkKKyAgICBjaGFyIHNbNTEyXTsKKyAgICBkdW1wRWZmZWN0RGVzY3JpcHRvcihkLCBzLCBzaXplb2YocyksIDAgLyogaW5kZW50ICovKTsKKyAgICBBTE9HVigiYWRkU3ViRWZmZWN0KCkgcmVhZCBkZXNjcmlwdG9yICVwOiVzIixkLCBzKTsKKyNlbmRpZgorICAgIGlmIChFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoZC0+YXBpVmVyc2lvbikgIT0KKyAgICAgICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTikpIHsKKyAgICAgICAgQUxPR1coIkJhZCBBUEkgdmVyc2lvbiAlMDh4IG9uIGxpYiAlcyIsIGQtPmFwaVZlcnNpb24sIGwtPm5hbWUpOworICAgICAgICBmcmVlKGQpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgc3ViX2VmZmVjdF9lbnRyeV90ICpzdWJfZWZmZWN0ID0gbWFsbG9jKHNpemVvZihzdWJfZWZmZWN0X2VudHJ5X3QpKTsKKyAgICBzdWJfZWZmZWN0LT5vYmplY3QgPSBkOworICAgIC8vIGxpYl9lbnRyeV90IGlzIHN0b3JlZCBzaW5jZSB0aGUgc3ViIGVmZmVjdHMgYXJlIG5vdCBsaW5rZWQgdG8gdGhlIGxpYnJhcnkKKyAgICBzdWJfZWZmZWN0LT5saWIgPSBsOworICAgIGUgPSBtYWxsb2Moc2l6ZW9mKGxpc3RfZWxlbV90KSk7CisgICAgZS0+b2JqZWN0ID0gc3ViX2VmZmVjdDsKKyAgICBlLT5uZXh0ID0gZ1N1YkVmZmVjdExpc3QtPnN1Yl9lbGVtOworICAgIGdTdWJFZmZlY3RMaXN0LT5zdWJfZWxlbSA9IGU7CisgICAgQUxPR1YoImFkZFN1YkVmZmVjdCBlbmQiKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGxvYWRFZmZlY3RzKGNub2RlICpyb290KQoreworICAgIGNub2RlICpub2RlOworCisgICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIEVGRkVDVFNfVEFHKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKyAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgbG9hZEVmZmVjdChub2RlKTsKKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgbG9hZEVmZmVjdChjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqbm9kZTsKKyAgICBlZmZlY3RfdXVpZF90IHV1aWQ7CisgICAgbGliX2VudHJ5X3QgKmw7CisgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZDsKKyAgICBsaXN0X2VsZW1fdCAqZTsKKworICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBMSUJSQVJZX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBsID0gZ2V0TGlicmFyeShub2RlLT52YWx1ZSk7CisgICAgaWYgKGwgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygibG9hZEVmZmVjdCgpIGNvdWxkIG5vdCBnZXQgbGlicmFyeSAlcyIsIG5vZGUtPnZhbHVlKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIFVVSURfVEFHKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAoc3RyaW5nVG9VdWlkKG5vZGUtPnZhbHVlLCAmdXVpZCkgIT0gMCkgeworICAgICAgICBBTE9HVygibG9hZEVmZmVjdCgpIGludmFsaWQgdXVpZCAlcyIsIG5vZGUtPnZhbHVlKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGxpYl9lbnRyeV90ICp0bXA7CisgICAgYm9vbCBza2lwID0gZmFsc2U7CisgICAgaWYgKGZpbmRFZmZlY3QoTlVMTCwgJnV1aWQsICZ0bXAsIE5VTEwpID09IDApIHsKKyAgICAgICAgQUxPR1coInNraXBwaW5nIGR1cGxpY2F0ZSB1dWlkICVzICVzIiwgbm9kZS0+dmFsdWUsCisgICAgICAgICAgICAgICAgbm9kZS0+bmV4dCA/ICJhbmQgaXRzIHN1Yi1lZmZlY3RzIiA6ICIiKTsKKyAgICAgICAgc2tpcCA9IHRydWU7CisgICAgfQorCisgICAgZCA9IG1hbGxvYyhzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgIGlmIChsLT5kZXNjLT5nZXRfZGVzY3JpcHRvcigmdXVpZCwgZCkgIT0gMCkgeworICAgICAgICBjaGFyIHNbNDBdOworICAgICAgICB1dWlkVG9TdHJpbmcoJnV1aWQsIHMsIDQwKTsKKyAgICAgICAgQUxPR1coIkVycm9yIHF1ZXJ5aW5nIGVmZmVjdCAlcyBvbiBsaWIgJXMiLCBzLCBsLT5uYW1lKTsKKyAgICAgICAgZnJlZShkKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorI2lmIChMT0dfTkRFQlVHPT0wKQorICAgIGNoYXIgc1s1MTJdOworICAgIGR1bXBFZmZlY3REZXNjcmlwdG9yKGQsIHMsIHNpemVvZihzKSwgMCAvKiBpbmRlbnQgKi8pOworICAgIEFMT0dWKCJsb2FkRWZmZWN0KCkgcmVhZCBkZXNjcmlwdG9yICVwOiVzIixkLCBzKTsKKyNlbmRpZgorICAgIGlmIChFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoZC0+YXBpVmVyc2lvbikgIT0KKyAgICAgICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTikpIHsKKyAgICAgICAgQUxPR1coIkJhZCBBUEkgdmVyc2lvbiAlMDh4IG9uIGxpYiAlcyIsIGQtPmFwaVZlcnNpb24sIGwtPm5hbWUpOworICAgICAgICBmcmVlKGQpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgZSA9IG1hbGxvYyhzaXplb2YobGlzdF9lbGVtX3QpKTsKKyAgICBlLT5vYmplY3QgPSBkOworICAgIGlmIChza2lwKSB7CisgICAgICAgIGUtPm5leHQgPSBnU2tpcHBlZEVmZmVjdHM7CisgICAgICAgIGdTa2lwcGVkRWZmZWN0cyA9IGU7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0gZWxzZSB7CisgICAgICAgIGUtPm5leHQgPSBsLT5lZmZlY3RzOworICAgICAgICBsLT5lZmZlY3RzID0gZTsKKyAgICB9CisKKyAgICAvLyBBZnRlciB0aGUgVVVJRCBub2RlIGluIHRoZSBjb25maWdfdHJlZSwgaWYgbm9kZS0+bmV4dCBpcyB2YWxpZCwKKyAgICAvLyB0aGF0IHdvdWxkIGJlIHN1YiBlZmZlY3Qgbm9kZS4KKyAgICAvLyBGaW5kIHRoZSBzdWIgZWZmZWN0cyBhbmQgYWRkIHRoZW0gdG8gdGhlIGdTdWJFZmZlY3RMaXN0CisgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgaW50IGNvdW50ID0gMjsKKyAgICBib29sIGh3U3ViZWZ4ID0gZmFsc2UsIHN3U3ViZWZ4ID0gZmFsc2U7CisgICAgbGlzdF9zdWJfZWxlbV90ICpzdWJlID0gTlVMTDsKKyAgICBpZiAobm9kZSAhPSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJBZGRpbmcgdGhlIGVmZmVjdCB0byBnRWZmZWN0U3ViTGlzdCBhcyB0aGVyZSBhcmUgc3ViIGVmZmVjdHMiKTsKKyAgICAgICAgc3ViZSA9IG1hbGxvYyhzaXplb2YobGlzdF9zdWJfZWxlbV90KSk7CisgICAgICAgIHN1YmUtPm9iamVjdCA9IGQ7CisgICAgICAgIHN1YmUtPnN1Yl9lbGVtID0gTlVMTDsKKyAgICAgICAgc3ViZS0+bmV4dCA9IGdTdWJFZmZlY3RMaXN0OworICAgICAgICBnU3ViRWZmZWN0TGlzdCA9IHN1YmU7CisgICAgfQorICAgIHdoaWxlIChub2RlICE9IE5VTEwgJiYgY291bnQpIHsKKyAgICAgICBpZiAoYWRkU3ViRWZmZWN0KG5vZGUpKSB7CisgICAgICAgICAgIEFMT0dXKCJsb2FkRWZmZWN0KCkgY291bGQgbm90IGFkZCBzdWJFZmZlY3QgJXMiLCBub2RlLT52YWx1ZSk7CisgICAgICAgICAgIC8vIENoYW5nZSB0aGUgZ1N1YkVmZmVjdExpc3QgdG8gcG9pbnQgdG8gb2xkZXIgbGlzdDsKKyAgICAgICAgICAgZ1N1YkVmZmVjdExpc3QgPSBzdWJlLT5uZXh0OworICAgICAgICAgICBmcmVlKHN1YmUtPnN1Yl9lbGVtKTsvLyBGcmVlIGFuIGFscmVhZHkgYWRkZWQgc3ViIGVmZmVjdAorICAgICAgICAgICBzdWJlLT5zdWJfZWxlbSA9IE5VTEw7CisgICAgICAgICAgIGZyZWUoc3ViZSk7CisgICAgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgICAgIH0KKyAgICAgICBzdWJfZWZmZWN0X2VudHJ5X3QgKnN1YkVudHJ5ID0gKHN1Yl9lZmZlY3RfZW50cnlfdCopZ1N1YkVmZmVjdExpc3QtPnN1Yl9lbGVtLT5vYmplY3Q7CisgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqc3ViRWZmZWN0RGVzYyA9IChlZmZlY3RfZGVzY3JpcHRvcl90Kikoc3ViRW50cnktPm9iamVjdCk7CisgICAgICAgLy8gU2luY2Ugd2UgcmV0dXJuIGEgZHVtbXkgZGVzY3JpcHRvciBmb3IgdGhlIHByb3h5IGR1cmluZworICAgICAgIC8vIGdldF9kZXNjcmlwdG9yIGNhbGwsd2UgcmVwbGFjZSBpdCB3aXRoIHRoZSBjb3JyZXNwb2RpbmcKKyAgICAgICAvLyBzdyBlZmZlY3QgZGVzY3JpcHRvciwgYnV0IHdpdGggUHJveHkgVVVJRAorICAgICAgIC8vIGNoZWNrIGZvciBTdyBkZXNjCisgICAgICAgIGlmICghKChzdWJFZmZlY3REZXNjLT5mbGFncyAmIEVGRkVDVF9GTEFHX0hXX0FDQ19NQVNLKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9GTEFHX0hXX0FDQ19UVU5ORUwpKSB7CisgICAgICAgICAgICAgc3dTdWJlZnggPSB0cnVlOworICAgICAgICAgICAgICpkID0gKnN1YkVmZmVjdERlc2M7CisgICAgICAgICAgICAgZC0+dXVpZCA9IHV1aWQ7CisgICAgICAgICAgICAgQUxPR1YoImxvYWRFZmZlY3QoKSBDaGFuZ2VkIHRoZSBQcm94eSBkZXNjIik7CisgICAgICAgfSBlbHNlCisgICAgICAgICAgIGh3U3ViZWZ4ID0gdHJ1ZTsKKyAgICAgICBjb3VudC0tOworICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKyAgICAvLyAxIEhXIGFuZCAxIFNXIHN1YiBlZmZlY3QgZm91bmQuIFNldCB0aGUgb2ZmbG9hZCBmbGFnIGluIHRoZSBQcm94eSBkZXNjCisgICAgaWYgKGh3U3ViZWZ4ICYmIHN3U3ViZWZ4KSB7CisgICAgICAgIGQtPmZsYWdzIHw9IEVGRkVDVF9GTEFHX09GRkxPQURfU1VQUE9SVEVEOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworbGliX2VudHJ5X3QgKmdldExpYnJhcnkoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBsaXN0X2VsZW1fdCAqZTsKKworICAgIGlmIChnQ2FjaGVkTGlicmFyeSAmJgorICAgICAgICAgICAgIXN0cm5jbXAoZ0NhY2hlZExpYnJhcnktPm5hbWUsIG5hbWUsIFBBVEhfTUFYKSkgeworICAgICAgICByZXR1cm4gZ0NhY2hlZExpYnJhcnk7CisgICAgfQorCisgICAgZSA9IGdMaWJyYXJ5TGlzdDsKKyAgICB3aGlsZSAoZSkgeworICAgICAgICBsaWJfZW50cnlfdCAqbCA9IChsaWJfZW50cnlfdCAqKWUtPm9iamVjdDsKKyAgICAgICAgaWYgKCFzdHJjbXAobC0+bmFtZSwgbmFtZSkpIHsKKyAgICAgICAgICAgIGdDYWNoZWRMaWJyYXJ5ID0gbDsKKyAgICAgICAgICAgIHJldHVybiBsOworICAgICAgICB9CisgICAgICAgIGUgPSBlLT5uZXh0OworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNDb25maWdMb2FkZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzQ29uZmlnTG9hZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y4MjYwOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzQ29uZmlnTG9hZGVyLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RTQ09ORklHTE9BREVSX0gKKyNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RTQ09ORklHTE9BREVSX0gKKworI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorI2luY2x1ZGUgIkVmZmVjdHNGYWN0b3J5U3RhdGUuaCIKKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiogUGFyc2VzIHRoZSBwbGF0Zm9ybSBlZmZlY3QgY29uZmlndXJhdGlvbgorICogYW5kIHN0b3JlcyBpdHMgY29udGVudCBpbiB0aGUgZ2xvYmFsIEVmZmVjdEZhY3RvcnlTdGF0ZS4gKi8KK0FORFJPSURfQVBJCitpbnQgRWZmZWN0TG9hZEVmZmVjdENvbmZpZygpOworCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9FRkZFQ1RTQ09ORklHTE9BREVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5jIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmMKaW5kZXggMzdjMGJiNy4uY2QwZTc2NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmMKQEAgLTE3LDY1ICsxNyw0NiBAQAogI2RlZmluZSBMT0dfVEFHICJFZmZlY3RzRmFjdG9yeSIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAotI2luY2x1ZGUgIkVmZmVjdHNGYWN0b3J5LmgiCi0KLSNpbmNsdWRlIDxkbGZjbi5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCi0jaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgotI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9hdWRpb19lZmZlY3RzX2NvbmYuaD4KKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgorCisjaW5jbHVkZSAiRWZmZWN0c0NvbmZpZ0xvYWRlci5oIgorI2luY2x1ZGUgIkVmZmVjdHNGYWN0b3J5U3RhdGUuaCIKKyNpbmNsdWRlICJFZmZlY3RzWG1sQ29uZmlnTG9hZGVyLmgiCisKKyNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeS5oIgogCiBzdGF0aWMgbGlzdF9lbGVtX3QgKmdFZmZlY3RMaXN0OyAvLyBsaXN0IG9mIGVmZmVjdF9lbnRyeV90OiBhbGwgY3VycmVudGx5IGNyZWF0ZWQgZWZmZWN0cwotc3RhdGljIGxpc3RfZWxlbV90ICpnTGlicmFyeUxpc3Q7IC8vIGxpc3Qgb2YgbGliX2VudHJ5X3Q6IGFsbCBjdXJyZW50bHkgbG9hZGVkIGxpYnJhcmllcwotc3RhdGljIGxpc3RfZWxlbV90ICpnU2tpcHBlZEVmZmVjdHM7IC8vIGxpc3Qgb2YgZWZmZWN0cyBza2lwcGVkIGJlY2F1c2Ugb2YgZHVwbGljYXRlIHV1aWQKLS8vIGxpc3Qgb2YgZWZmZWN0X2Rlc2NyaXB0b3IgYW5kIGxpc3Qgb2Ygc3ViIGVmZmVjdHMgOiBhbGwgY3VycmVudGx5IGxvYWRlZAotLy8gSXQgZG9lcyBub3QgY29udGFpbiBlZmZlY3RzIHdpdGhvdXQgc3ViIGVmZmVjdHMuCi1zdGF0aWMgbGlzdF9zdWJfZWxlbV90ICpnU3ViRWZmZWN0TGlzdDsKLXN0YXRpYyBwdGhyZWFkX211dGV4X3QgZ0xpYkxvY2sgPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOyAvLyBjb250cm9scyBhY2Nlc3MgdG8gZ0xpYnJhcnlMaXN0CiBzdGF0aWMgdWludDMyX3QgZ051bUVmZmVjdHM7ICAgICAgICAgLy8gdG90YWwgbnVtYmVyIG51bWJlciBvZiBlZmZlY3RzCiBzdGF0aWMgbGlzdF9lbGVtX3QgKmdDdXJMaWI7ICAgIC8vIGN1cnJlbnQgbGlicmFyeSBpbiBlbnVtZXJhdGlvbiBwcm9jZXNzCiBzdGF0aWMgbGlzdF9lbGVtX3QgKmdDdXJFZmZlY3Q7IC8vIGN1cnJlbnQgZWZmZWN0IGluIGVudW1lcmF0aW9uIHByb2Nlc3MKIHN0YXRpYyB1aW50MzJfdCBnQ3VyRWZmZWN0SWR4OyAgICAgICAvLyBjdXJyZW50IGVmZmVjdCBpbmRleCBpbiBlbnVtZXJhdGlvbiBwcm9jZXNzCi1zdGF0aWMgbGliX2VudHJ5X3QgKmdDYWNoZWRMaWJyYXJ5OyAgLy8gbGFzdCBsaWJyYXJ5IGFjY2Vzc2VkIGJ5IGdldExpYnJhcnkoKQorLyoqIE51bWJlciBvZiBlbGVtZW50cyBza2lwcGVkIGR1cmluZyB0aGUgZWZmZWN0cyBjb25maWd1cmF0aW9uIGxvYWRpbmcuCisgKiAgLTEgaWYgdGhlIGNvbmZpZyBsb2FkZXIgZmFpbGVkCisgKiAgLTIgaWYgY29uZmlnIGxvYWQgd2FzIHNraXBwZWQKKyAqLworc3RhdGljIHNzaXplX3QgZ0NvbmZpZ05iRWxlbVNraXBwZWQgPSAtMjsKIAogc3RhdGljIGludCBnSW5pdERvbmU7IC8vIHRydWUgaXMgZ2xvYmFsIGluaXRpYWxpemF0aW9uIGhhcyBiZWVuIHByZWZvcm1lZAogc3RhdGljIGludCBnQ2FuUXVlcnlFZmZlY3Q7IC8vIGluZGljYXRlcyB0aGF0IGNhbGwgdG8gRWZmZWN0UXVlcnlFZmZlY3QoKSBpcyB2YWxpZCwgaS5lLiB0aGF0IHRoZSBsaXN0IG9mIGVmZmVjdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FzIG5vdCBtb2RpZmllZCBzaW5jZSBsYXN0IGNhbGwgdG8gRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKCkKLQotc3RhdGljIGxpc3RfZWxlbV90ICpnTGlicmFyeUZhaWxlZExpc3Q7ICAvL2xpc3Qgb2YgbGliX2ZhaWxlZF9lbnRyeV90OiBsaWJyYXJpZXMgZmFpbGVkIHRvIGxvYWQKLQogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gICAgICBMb2NhbCBmdW5jdGlvbnMgcHJvdG90eXBlcwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBzdGF0aWMgaW50IGluaXQoKTsKLXN0YXRpYyBpbnQgbG9hZEVmZmVjdENvbmZpZ0ZpbGUoY29uc3QgY2hhciAqcGF0aCk7Ci1zdGF0aWMgaW50IGxvYWRMaWJyYXJpZXMoY25vZGUgKnJvb3QpOwotc3RhdGljIGludCBsb2FkTGlicmFyeShjbm9kZSAqcm9vdCwgY29uc3QgY2hhciAqbmFtZSk7Ci1zdGF0aWMgaW50IGxvYWRFZmZlY3RzKGNub2RlICpyb290KTsKLXN0YXRpYyBpbnQgbG9hZEVmZmVjdChjbm9kZSAqbm9kZSk7Ci0vLyBUbyBnZXQgYW5kIGFkZCB0aGUgZWZmZWN0IHBvaW50ZWQgYnkgdGhlIHBhc3NlZCBub2RlIHRvIHRoZSBnU3ViRWZmZWN0TGlzdAotc3RhdGljIGludCBhZGRTdWJFZmZlY3QoY25vZGUgKnJvb3QpOwotc3RhdGljIGxpYl9lbnRyeV90ICpnZXRMaWJyYXJ5KGNvbnN0IGNoYXIgKnBhdGgpOwogc3RhdGljIHZvaWQgcmVzZXRFZmZlY3RFbnVtZXJhdGlvbigpOwogc3RhdGljIHVpbnQzMl90IHVwZGF0ZU51bUVmZmVjdHMoKTsKLXN0YXRpYyBpbnQgZmluZEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAotICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKLSAgICAgICAgICAgICAgIGxpYl9lbnRyeV90ICoqbGliLAotICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKmRlc2MpOwogLy8gVG8gc2VhcmNoIGEgc3ViZWZmZWN0IGluIHRoZSBnU3ViRWZmZWN0TGlzdAogc3RhdGljIGludCBmaW5kU3ViRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCiAgICAgICAgICAgICAgICBsaWJfZW50cnlfdCAqKmxpYiwKICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKipkZXNjKTsKLXN0YXRpYyB2b2lkIGR1bXBFZmZlY3REZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsIGNoYXIgKnN0ciwgc2l6ZV90IGxlbiwgaW50IGluZGVudCk7Ci1zdGF0aWMgaW50IHN0cmluZ1RvVXVpZChjb25zdCBjaGFyICpzdHIsIGVmZmVjdF91dWlkX3QgKnV1aWQpOwotc3RhdGljIGludCB1dWlkVG9TdHJpbmcoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwgY2hhciAqc3RyLCBzaXplX3QgbWF4TGVuKTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gICAgICBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgZnVuY3Rpb25zCkBAIC00NjEsMTAgKzQ0MiwxMiBAQAogICAgIGlmIChpZ25vcmVGeENvbmZGaWxlcykgewogICAgICAgICBBTE9HSSgiQXVkaW8gZWZmZWN0cyBpbiBjb25maWd1cmF0aW9uIGZpbGVzIHdpbGwgYmUgaWdub3JlZCIpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgewotICAgICAgICAgICAgbG9hZEVmZmVjdENvbmZpZ0ZpbGUoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFLCBSX09LKSA9PSAwKSB7Ci0gICAgICAgICAgICBsb2FkRWZmZWN0Q29uZmlnRmlsZShBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSk7CisgICAgICAgIGdDb25maWdOYkVsZW1Ta2lwcGVkID0gRWZmZWN0TG9hZFhtbEVmZmVjdENvbmZpZyhOVUxMKTsKKyAgICAgICAgaWYgKGdDb25maWdOYkVsZW1Ta2lwcGVkIDwgMCkgeworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBsb2FkIFhNTCBlZmZlY3QgY29uZmlndXJhdGlvbiwgZmFsbGJhY2sgdG8gLmNvbmYiKTsKKyAgICAgICAgICAgIEVmZmVjdExvYWRFZmZlY3RDb25maWcoKTsKKyAgICAgICAgfSBlbHNlIGlmIChnQ29uZmlnTmJFbGVtU2tpcHBlZCA+IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJFZmZlY3QgY29uZmlnIGlzIHBhcnRpYWxseSBpbnZhbGlkLCBza2lwcGVkICV6ZCBlbGVtZW50cyIsIGdDb25maWdOYkVsZW1Ta2lwcGVkKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDc0LDM2NyArNDU3LDYgQEAKICAgICByZXR1cm4gMDsKIH0KIAotaW50IGxvYWRFZmZlY3RDb25maWdGaWxlKGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0gICAgY25vZGUgKnJvb3Q7Ci0gICAgY2hhciAqZGF0YTsKLQotICAgIGRhdGEgPSBsb2FkX2ZpbGUocGF0aCwgTlVMTCk7Ci0gICAgaWYgKGRhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcm9vdCA9IGNvbmZpZ19ub2RlKCIiLCAiIik7Ci0gICAgY29uZmlnX2xvYWQocm9vdCwgZGF0YSk7Ci0gICAgbG9hZExpYnJhcmllcyhyb290KTsKLSAgICBsb2FkRWZmZWN0cyhyb290KTsKLSAgICBjb25maWdfZnJlZShyb290KTsKLSAgICBmcmVlKHJvb3QpOwotICAgIGZyZWUoZGF0YSk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGxvYWRMaWJyYXJpZXMoY25vZGUgKnJvb3QpCi17Ci0gICAgY25vZGUgKm5vZGU7Ci0KLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgTElCUkFSSUVTX1RBRyk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9Ci0gICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGxvYWRMaWJyYXJ5KG5vZGUsIG5vZGUtPm5hbWUpOwotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBfX0xQNjRfXwotLy8gYXVkaW9fZWZmZWN0cy5jb25mIGFsd2F5cyBzcGVjaWZpZXMgMzIgYml0IGxpYiBwYXRoOiBjb252ZXJ0IHRvIDY0IGJpdCBwYXRoIGlmIG5lZWRlZAotc3RhdGljIGNvbnN0IGNoYXIgKmtMaWJyYXJ5UGF0aFJvb3RbXSA9Ci0gICAgICAgIHsiL29kbS9saWI2NC9zb3VuZGZ4IiwgIi92ZW5kb3IvbGliNjQvc291bmRmeCIsICIvc3lzdGVtL2xpYjY0L3NvdW5kZngifTsKLSNlbHNlCi1zdGF0aWMgY29uc3QgY2hhciAqa0xpYnJhcnlQYXRoUm9vdFtdID0KLSAgICAgICAgeyIvb2RtL2xpYi9zb3VuZGZ4IiwgIi92ZW5kb3IvbGliL3NvdW5kZngiLCAiL3N5c3RlbS9saWIvc291bmRmeCJ9OwotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBpbnQga0xpYnJhcnlQYXRoUm9vdFNpemUgPQotICAgICAgICAoc2l6ZW9mKGtMaWJyYXJ5UGF0aFJvb3QpIC8gc2l6ZW9mKGtMaWJyYXJ5UGF0aFJvb3RbMF0pKTsKLQotLy8gQ2hlY2tzIGlmIHRoZSBsaWJyYXJ5IHBhdGggcGFzc2VkIGFzIGxpYl9wYXRoX2luIGNhbiBiZSBvcGVuZWQgYW5kIGlmIG5vdAotLy8gdHJpZXMgaW4gc3RhbmRhcmQgZWZmZWN0IGxpYnJhcnkgZGlyZWN0b3JpZXMgd2l0aCBqdXN0IHRoZSBsaWJyYXJ5IG5hbWUgYW5kIHJldHVybnMgY29ycmVjdCBwYXRoCi0vLyBpbiBsaWJfcGF0aF9vdXQKLWludCBjaGVja0xpYnJhcnlQYXRoKGNvbnN0IGNoYXIgKmxpYl9wYXRoX2luLCBjaGFyICpsaWJfcGF0aF9vdXQpIHsKLSAgICBjaGFyICpzdHI7Ci0gICAgY29uc3QgY2hhciAqbGliX25hbWU7Ci0gICAgc2l6ZV90IGxlbjsKLQotICAgIGlmIChsaWJfcGF0aF9pbiA9PSBOVUxMIHx8IGxpYl9wYXRoX291dCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHN0cmxjcHkobGliX3BhdGhfb3V0LCBsaWJfcGF0aF9pbiwgUEFUSF9NQVgpOwotCi0gICAgLy8gVHJ5IGV4YWN0IHBhdGggZmlyc3QKLSAgICBzdHIgPSBzdHJzdHIobGliX3BhdGhfb3V0LCAiL2xpYi9zb3VuZGZ4LyIpOwotICAgIGlmIChzdHIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICAvLyBFeHRyYWN0IGxpYnJhcnkgbmFtZSBmcm9tIGlucHV0IHBhdGgKLSAgICBsZW4gPSBzdHIgLSBsaWJfcGF0aF9vdXQ7Ci0gICAgbGliX25hbWUgPSBsaWJfcGF0aF9pbiArIGxlbiArIHN0cmxlbigiL2xpYi9zb3VuZGZ4LyIpOwotCi0gICAgLy8gVGhlbiB0cnkgd2l0aCBsaWJyYXJ5IG5hbWUgYW5kIHN0YW5kYXJkIHBhdGggbmFtZXMgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0xpYnJhcnlQYXRoUm9vdFNpemU7IGkrKykgewotICAgICAgICBjaGFyIHBhdGhbUEFUSF9NQVhdOwotCi0gICAgICAgIHNucHJpbnRmKHBhdGgsCi0gICAgICAgICAgICAgICAgIFBBVEhfTUFYLAotICAgICAgICAgICAgICAgICAiJXMvJXMiLAotICAgICAgICAgICAgICAgICBrTGlicmFyeVBhdGhSb290W2ldLAotICAgICAgICAgICAgICAgICBsaWJfbmFtZSk7Ci0gICAgICAgIGlmIChGX09LID09IGFjY2VzcyhwYXRoLCAwKSkgewotICAgICAgICAgICAgc3RyY3B5KGxpYl9wYXRoX291dCwgcGF0aCk7Ci0gICAgICAgICAgICBBTE9HV19JRihzdHJuY21wKGxpYl9wYXRoX291dCwgbGliX3BhdGhfaW4sIFBBVEhfTUFYKSAhPSAwLAotICAgICAgICAgICAgICAgICJjaGVja0xpYnJhcnlQYXRoKCkgY29ycmVjdGVkIGxpYnJhcnkgcGF0aCAlcyB0byAlcyIsIGxpYl9wYXRoX2luLCBsaWJfcGF0aF9vdXQpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLQotCi1pbnQgbG9hZExpYnJhcnkoY25vZGUgKnJvb3QsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgY25vZGUgKm5vZGU7Ci0gICAgdm9pZCAqaGRsID0gTlVMTDsKLSAgICBhdWRpb19lZmZlY3RfbGlicmFyeV90ICpkZXNjOwotICAgIGxpc3RfZWxlbV90ICplOwotICAgIGxpYl9lbnRyeV90ICpsOwotICAgIGNoYXIgcGF0aFtQQVRIX01BWF07Ci0KLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgUEFUSF9UQUcpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgaWYgKGNoZWNrTGlicmFyeVBhdGgoKGNvbnN0IGNoYXIgKilub2RlLT52YWx1ZSwgcGF0aCkgIT0gMCkgewotICAgICAgICBBTE9HVygibG9hZExpYnJhcnkoKSBjb3VsZCBub3QgZmluZCBsaWJyYXJ5ICVzIiwgcGF0aCk7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgaGRsID0gZGxvcGVuKHBhdGgsIFJUTERfTk9XKTsKLSAgICBpZiAoaGRsID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coImxvYWRMaWJyYXJ5KCkgZmFpbGVkIHRvIG9wZW4gJXMiLCBwYXRoKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBkZXNjID0gKGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgKilkbHN5bShoZGwsIEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNX0FTX1NUUik7Ci0gICAgaWYgKGRlc2MgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygibG9hZExpYnJhcnkoKSBjb3VsZCBub3QgZmluZCBzeW1ib2wgJXMiLCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTV9BU19TVFIpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIGlmIChBVURJT19FRkZFQ1RfTElCUkFSWV9UQUcgIT0gZGVzYy0+dGFnKSB7Ci0gICAgICAgIEFMT0dXKCJnZXRMaWJyYXJ5KCkgYmFkIHRhZyAlMDh4IGluIGxpYiBpbmZvIHN0cnVjdCIsIGRlc2MtPnRhZyk7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgaWYgKEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihkZXNjLT52ZXJzaW9uKSAhPQotICAgICAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKEVGRkVDVF9MSUJSQVJZX0FQSV9WRVJTSU9OKSkgewotICAgICAgICBBTE9HVygibG9hZExpYnJhcnkoKSBiYWQgbGliIHZlcnNpb24gJTA4eCIsIGRlc2MtPnZlcnNpb24pOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIC8vIGFkZCBlbnRyeSBmb3IgbGlicmFyeSBpbiBnTGlicmFyeUxpc3QKLSAgICBsID0gbWFsbG9jKHNpemVvZihsaWJfZW50cnlfdCkpOwotICAgIGwtPm5hbWUgPSBzdHJuZHVwKG5hbWUsIFBBVEhfTUFYKTsKLSAgICBsLT5wYXRoID0gc3RybmR1cChwYXRoLCBQQVRIX01BWCk7Ci0gICAgbC0+aGFuZGxlID0gaGRsOwotICAgIGwtPmRlc2MgPSBkZXNjOwotICAgIGwtPmVmZmVjdHMgPSBOVUxMOwotICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbC0+bG9jaywgTlVMTCk7Ci0KLSAgICBlID0gbWFsbG9jKHNpemVvZihsaXN0X2VsZW1fdCkpOwotICAgIGUtPm9iamVjdCA9IGw7Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZnTGliTG9jayk7Ci0gICAgZS0+bmV4dCA9IGdMaWJyYXJ5TGlzdDsKLSAgICBnTGlicmFyeUxpc3QgPSBlOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnTGliTG9jayk7Ci0gICAgQUxPR1YoImdldExpYnJhcnkoKSBsaW5rZWQgbGlicmFyeSAlcCBmb3IgcGF0aCAlcyIsIGwsIHBhdGgpOwotCi0gICAgcmV0dXJuIDA7Ci0KLWVycm9yOgotICAgIGlmIChoZGwgIT0gTlVMTCkgewotICAgICAgICBkbGNsb3NlKGhkbCk7Ci0gICAgfQotICAgIC8vYWRkIGVudHJ5IGZvciBsaWJyYXJ5IGVycm9ycyBpbiBnTGlicmFyeUZhaWxlZExpc3QKLSAgICBsaWJfZmFpbGVkX2VudHJ5X3QgKmZsID0gbWFsbG9jKHNpemVvZihsaWJfZmFpbGVkX2VudHJ5X3QpKTsKLSAgICBmbC0+bmFtZSA9IHN0cm5kdXAobmFtZSwgUEFUSF9NQVgpOwotICAgIGZsLT5wYXRoID0gc3RybmR1cChwYXRoLCBQQVRIX01BWCk7Ci0KLSAgICBsaXN0X2VsZW1fdCAqZmUgPSBtYWxsb2Moc2l6ZW9mKGxpc3RfZWxlbV90KSk7Ci0gICAgZmUtPm9iamVjdCA9IGZsOwotICAgIGZlLT5uZXh0ID0gZ0xpYnJhcnlGYWlsZWRMaXN0OwotICAgIGdMaWJyYXJ5RmFpbGVkTGlzdCA9IGZlOwotICAgIEFMT0dWKCJnZXRMaWJyYXJ5KCkgbGlua2VkIGVycm9yIGluIGxpYnJhcnkgJXAgZm9yIHBhdGggJXMiLCBmbCwgcGF0aCk7Ci0KLSAgICByZXR1cm4gLUVJTlZBTDsKLX0KLQotLy8gVGhpcyB3aWxsIGZpbmQgdGhlIGxpYnJhcnkgYW5kIFVVSUQgdGFncyBvZiB0aGUgc3ViIGVmZmVjdCBwb2ludGVkIGJ5IHRoZQotLy8gbm9kZSwgZ2V0cyB0aGUgZWZmZWN0IGRlc2NyaXB0b3IgYW5kIGxpYl9lbnRyeV90IGFuZCBhZGRzIHRoZSBzdWJlZmZlY3QgLQotLy8gc3ViX2VudHJ5X3QgdG8gdGhlIGdTdWJFZmZlY3RMaXN0Ci1pbnQgYWRkU3ViRWZmZWN0KGNub2RlICpyb290KQotewotICAgIEFMT0dWKCJhZGRTdWJFZmZlY3QiKTsKLSAgICBjbm9kZSAqbm9kZTsKLSAgICBlZmZlY3RfdXVpZF90IHV1aWQ7Ci0gICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZDsKLSAgICBsaWJfZW50cnlfdCAqbDsKLSAgICBsaXN0X2VsZW1fdCAqZTsKLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgTElCUkFSWV9UQUcpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIGwgPSBnZXRMaWJyYXJ5KG5vZGUtPnZhbHVlKTsKLSAgICBpZiAobCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJhZGRTdWJFZmZlY3QoKSBjb3VsZCBub3QgZ2V0IGxpYnJhcnkgJXMiLCBub2RlLT52YWx1ZSk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgVVVJRF9UQUcpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIGlmIChzdHJpbmdUb1V1aWQobm9kZS0+dmFsdWUsICZ1dWlkKSAhPSAwKSB7Ci0gICAgICAgIEFMT0dXKCJhZGRTdWJFZmZlY3QoKSBpbnZhbGlkIHV1aWQgJXMiLCBub2RlLT52YWx1ZSk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBkID0gbWFsbG9jKHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7Ci0gICAgaWYgKGwtPmRlc2MtPmdldF9kZXNjcmlwdG9yKCZ1dWlkLCBkKSAhPSAwKSB7Ci0gICAgICAgIGNoYXIgc1s0MF07Ci0gICAgICAgIHV1aWRUb1N0cmluZygmdXVpZCwgcywgNDApOwotICAgICAgICBBTE9HVygiRXJyb3IgcXVlcnlpbmcgZWZmZWN0ICVzIG9uIGxpYiAlcyIsIHMsIGwtPm5hbWUpOwotICAgICAgICBmcmVlKGQpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0jaWYgKExPR19OREVCVUc9PTApCi0gICAgY2hhciBzWzUxMl07Ci0gICAgZHVtcEVmZmVjdERlc2NyaXB0b3IoZCwgcywgc2l6ZW9mKHMpLCAwIC8qIGluZGVudCAqLyk7Ci0gICAgQUxPR1YoImFkZFN1YkVmZmVjdCgpIHJlYWQgZGVzY3JpcHRvciAlcDolcyIsZCwgcyk7Ci0jZW5kaWYKLSAgICBpZiAoRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKGQtPmFwaVZlcnNpb24pICE9Ci0gICAgICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04pKSB7Ci0gICAgICAgIEFMT0dXKCJCYWQgQVBJIHZlcnNpb24gJTA4eCBvbiBsaWIgJXMiLCBkLT5hcGlWZXJzaW9uLCBsLT5uYW1lKTsKLSAgICAgICAgZnJlZShkKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIHN1Yl9lZmZlY3RfZW50cnlfdCAqc3ViX2VmZmVjdCA9IG1hbGxvYyhzaXplb2Yoc3ViX2VmZmVjdF9lbnRyeV90KSk7Ci0gICAgc3ViX2VmZmVjdC0+b2JqZWN0ID0gZDsKLSAgICAvLyBsaWJfZW50cnlfdCBpcyBzdG9yZWQgc2luY2UgdGhlIHN1YiBlZmZlY3RzIGFyZSBub3QgbGlua2VkIHRvIHRoZSBsaWJyYXJ5Ci0gICAgc3ViX2VmZmVjdC0+bGliID0gbDsKLSAgICBlID0gbWFsbG9jKHNpemVvZihsaXN0X2VsZW1fdCkpOwotICAgIGUtPm9iamVjdCA9IHN1Yl9lZmZlY3Q7Ci0gICAgZS0+bmV4dCA9IGdTdWJFZmZlY3RMaXN0LT5zdWJfZWxlbTsKLSAgICBnU3ViRWZmZWN0TGlzdC0+c3ViX2VsZW0gPSBlOwotICAgIEFMT0dWKCJhZGRTdWJFZmZlY3QgZW5kIik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBsb2FkRWZmZWN0cyhjbm9kZSAqcm9vdCkKLXsKLSAgICBjbm9kZSAqbm9kZTsKLQotICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBFRkZFQ1RTX1RBRyk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9Ci0gICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGxvYWRFZmZlY3Qobm9kZSk7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGxvYWRFZmZlY3QoY25vZGUgKnJvb3QpCi17Ci0gICAgY25vZGUgKm5vZGU7Ci0gICAgZWZmZWN0X3V1aWRfdCB1dWlkOwotICAgIGxpYl9lbnRyeV90ICpsOwotICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmQ7Ci0gICAgbGlzdF9lbGVtX3QgKmU7Ci0KLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgTElCUkFSWV9UQUcpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgbCA9IGdldExpYnJhcnkobm9kZS0+dmFsdWUpOwotICAgIGlmIChsID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coImxvYWRFZmZlY3QoKSBjb3VsZCBub3QgZ2V0IGxpYnJhcnkgJXMiLCBub2RlLT52YWx1ZSk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBVVUlEX1RBRyk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgaWYgKHN0cmluZ1RvVXVpZChub2RlLT52YWx1ZSwgJnV1aWQpICE9IDApIHsKLSAgICAgICAgQUxPR1coImxvYWRFZmZlY3QoKSBpbnZhbGlkIHV1aWQgJXMiLCBub2RlLT52YWx1ZSk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBsaWJfZW50cnlfdCAqdG1wOwotICAgIGJvb2wgc2tpcCA9IGZhbHNlOwotICAgIGlmIChmaW5kRWZmZWN0KE5VTEwsICZ1dWlkLCAmdG1wLCBOVUxMKSA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJza2lwcGluZyBkdXBsaWNhdGUgdXVpZCAlcyAlcyIsIG5vZGUtPnZhbHVlLAotICAgICAgICAgICAgICAgIG5vZGUtPm5leHQgPyAiYW5kIGl0cyBzdWItZWZmZWN0cyIgOiAiIik7Ci0gICAgICAgIHNraXAgPSB0cnVlOwotICAgIH0KLQotICAgIGQgPSBtYWxsb2Moc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKLSAgICBpZiAobC0+ZGVzYy0+Z2V0X2Rlc2NyaXB0b3IoJnV1aWQsIGQpICE9IDApIHsKLSAgICAgICAgY2hhciBzWzQwXTsKLSAgICAgICAgdXVpZFRvU3RyaW5nKCZ1dWlkLCBzLCA0MCk7Ci0gICAgICAgIEFMT0dXKCJFcnJvciBxdWVyeWluZyBlZmZlY3QgJXMgb24gbGliICVzIiwgcywgbC0+bmFtZSk7Ci0gICAgICAgIGZyZWUoZCk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSNpZiAoTE9HX05ERUJVRz09MCkKLSAgICBjaGFyIHNbNTEyXTsKLSAgICBkdW1wRWZmZWN0RGVzY3JpcHRvcihkLCBzLCBzaXplb2YocyksIDAgLyogaW5kZW50ICovKTsKLSAgICBBTE9HVigibG9hZEVmZmVjdCgpIHJlYWQgZGVzY3JpcHRvciAlcDolcyIsZCwgcyk7Ci0jZW5kaWYKLSAgICBpZiAoRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKGQtPmFwaVZlcnNpb24pICE9Ci0gICAgICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04pKSB7Ci0gICAgICAgIEFMT0dXKCJCYWQgQVBJIHZlcnNpb24gJTA4eCBvbiBsaWIgJXMiLCBkLT5hcGlWZXJzaW9uLCBsLT5uYW1lKTsKLSAgICAgICAgZnJlZShkKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIGUgPSBtYWxsb2Moc2l6ZW9mKGxpc3RfZWxlbV90KSk7Ci0gICAgZS0+b2JqZWN0ID0gZDsKLSAgICBpZiAoc2tpcCkgewotICAgICAgICBlLT5uZXh0ID0gZ1NraXBwZWRFZmZlY3RzOwotICAgICAgICBnU2tpcHBlZEVmZmVjdHMgPSBlOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9IGVsc2UgewotICAgICAgICBlLT5uZXh0ID0gbC0+ZWZmZWN0czsKLSAgICAgICAgbC0+ZWZmZWN0cyA9IGU7Ci0gICAgfQotCi0gICAgLy8gQWZ0ZXIgdGhlIFVVSUQgbm9kZSBpbiB0aGUgY29uZmlnX3RyZWUsIGlmIG5vZGUtPm5leHQgaXMgdmFsaWQsCi0gICAgLy8gdGhhdCB3b3VsZCBiZSBzdWIgZWZmZWN0IG5vZGUuCi0gICAgLy8gRmluZCB0aGUgc3ViIGVmZmVjdHMgYW5kIGFkZCB0aGVtIHRvIHRoZSBnU3ViRWZmZWN0TGlzdAotICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIGludCBjb3VudCA9IDI7Ci0gICAgYm9vbCBod1N1YmVmeCA9IGZhbHNlLCBzd1N1YmVmeCA9IGZhbHNlOwotICAgIGxpc3Rfc3ViX2VsZW1fdCAqc3ViZSA9IE5VTEw7Ci0gICAgaWYgKG5vZGUgIT0gTlVMTCkgewotICAgICAgICBBTE9HVigiQWRkaW5nIHRoZSBlZmZlY3QgdG8gZ0VmZmVjdFN1Ykxpc3QgYXMgdGhlcmUgYXJlIHN1YiBlZmZlY3RzIik7Ci0gICAgICAgIHN1YmUgPSBtYWxsb2Moc2l6ZW9mKGxpc3Rfc3ViX2VsZW1fdCkpOwotICAgICAgICBzdWJlLT5vYmplY3QgPSBkOwotICAgICAgICBzdWJlLT5zdWJfZWxlbSA9IE5VTEw7Ci0gICAgICAgIHN1YmUtPm5leHQgPSBnU3ViRWZmZWN0TGlzdDsKLSAgICAgICAgZ1N1YkVmZmVjdExpc3QgPSBzdWJlOwotICAgIH0KLSAgICB3aGlsZSAobm9kZSAhPSBOVUxMICYmIGNvdW50KSB7Ci0gICAgICAgaWYgKGFkZFN1YkVmZmVjdChub2RlKSkgewotICAgICAgICAgICBBTE9HVygibG9hZEVmZmVjdCgpIGNvdWxkIG5vdCBhZGQgc3ViRWZmZWN0ICVzIiwgbm9kZS0+dmFsdWUpOwotICAgICAgICAgICAvLyBDaGFuZ2UgdGhlIGdTdWJFZmZlY3RMaXN0IHRvIHBvaW50IHRvIG9sZGVyIGxpc3Q7Ci0gICAgICAgICAgIGdTdWJFZmZlY3RMaXN0ID0gc3ViZS0+bmV4dDsKLSAgICAgICAgICAgZnJlZShzdWJlLT5zdWJfZWxlbSk7Ly8gRnJlZSBhbiBhbHJlYWR5IGFkZGVkIHN1YiBlZmZlY3QKLSAgICAgICAgICAgc3ViZS0+c3ViX2VsZW0gPSBOVUxMOwotICAgICAgICAgICBmcmVlKHN1YmUpOwotICAgICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICAgICB9Ci0gICAgICAgc3ViX2VmZmVjdF9lbnRyeV90ICpzdWJFbnRyeSA9IChzdWJfZWZmZWN0X2VudHJ5X3QqKWdTdWJFZmZlY3RMaXN0LT5zdWJfZWxlbS0+b2JqZWN0OwotICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnN1YkVmZmVjdERlc2MgPSAoZWZmZWN0X2Rlc2NyaXB0b3JfdCopKHN1YkVudHJ5LT5vYmplY3QpOwotICAgICAgIC8vIFNpbmNlIHdlIHJldHVybiBhIGR1bW15IGRlc2NyaXB0b3IgZm9yIHRoZSBwcm94eSBkdXJpbmcKLSAgICAgICAvLyBnZXRfZGVzY3JpcHRvciBjYWxsLHdlIHJlcGxhY2UgaXQgd2l0aCB0aGUgY29ycmVzcG9kaW5nCi0gICAgICAgLy8gc3cgZWZmZWN0IGRlc2NyaXB0b3IsIGJ1dCB3aXRoIFByb3h5IFVVSUQKLSAgICAgICAvLyBjaGVjayBmb3IgU3cgZGVzYwotICAgICAgICBpZiAoISgoc3ViRWZmZWN0RGVzYy0+ZmxhZ3MgJiBFRkZFQ1RfRkxBR19IV19BQ0NfTUFTSykgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfRkxBR19IV19BQ0NfVFVOTkVMKSkgewotICAgICAgICAgICAgIHN3U3ViZWZ4ID0gdHJ1ZTsKLSAgICAgICAgICAgICAqZCA9ICpzdWJFZmZlY3REZXNjOwotICAgICAgICAgICAgIGQtPnV1aWQgPSB1dWlkOwotICAgICAgICAgICAgIEFMT0dWKCJsb2FkRWZmZWN0KCkgQ2hhbmdlZCB0aGUgUHJveHkgZGVzYyIpOwotICAgICAgIH0gZWxzZQotICAgICAgICAgICBod1N1YmVmeCA9IHRydWU7Ci0gICAgICAgY291bnQtLTsKLSAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0gICAgLy8gMSBIVyBhbmQgMSBTVyBzdWIgZWZmZWN0IGZvdW5kLiBTZXQgdGhlIG9mZmxvYWQgZmxhZyBpbiB0aGUgUHJveHkgZGVzYwotICAgIGlmIChod1N1YmVmeCAmJiBzd1N1YmVmeCkgewotICAgICAgICBkLT5mbGFncyB8PSBFRkZFQ1RfRkxBR19PRkZMT0FEX1NVUFBPUlRFRDsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KIC8vIFNlYXJjaGVzIHRoZSBzdWIgZWZmZWN0IG1hdGNoaW5nIHRvIHRoZSBzcGVjaWZpZWQgdXVpZAogLy8gaW4gdGhlIGdTdWJFZmZlY3RMaXN0LiBJdCBnZXRzIHRoZSBsaWJfZW50cnlfdCBmb3IKIC8vIHRoZSBtYXRjaGVkIHN1Yl9lZmZlY3QgLiBVc2VkIGluIEVmZmVjdENyZWF0ZSBvZiBzdWIgZWZmZWN0cwpAQCAtODgxLDI5ICs1MDMsNiBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLWxpYl9lbnRyeV90ICpnZXRMaWJyYXJ5KGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgbGlzdF9lbGVtX3QgKmU7Ci0KLSAgICBpZiAoZ0NhY2hlZExpYnJhcnkgJiYKLSAgICAgICAgICAgICFzdHJuY21wKGdDYWNoZWRMaWJyYXJ5LT5uYW1lLCBuYW1lLCBQQVRIX01BWCkpIHsKLSAgICAgICAgcmV0dXJuIGdDYWNoZWRMaWJyYXJ5OwotICAgIH0KLQotICAgIGUgPSBnTGlicmFyeUxpc3Q7Ci0gICAgd2hpbGUgKGUpIHsKLSAgICAgICAgbGliX2VudHJ5X3QgKmwgPSAobGliX2VudHJ5X3QgKillLT5vYmplY3Q7Ci0gICAgICAgIGlmICghc3RyY21wKGwtPm5hbWUsIG5hbWUpKSB7Ci0gICAgICAgICAgICBnQ2FjaGVkTGlicmFyeSA9IGw7Ci0gICAgICAgICAgICByZXR1cm4gbDsKLSAgICAgICAgfQotICAgICAgICBlID0gZS0+bmV4dDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotCiB2b2lkIHJlc2V0RWZmZWN0RW51bWVyYXRpb24oKQogewogICAgIGdDdXJMaWIgPSBnTGlicmFyeUxpc3Q7CkBAIC05MzUsMTE0ICs1MzQsNiBAQAogICAgIHJldHVybiBjbnQ7CiB9CiAKLWludCBmaW5kRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCi0gICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAotICAgICAgICAgICAgICAgbGliX2VudHJ5X3QgKipsaWIsCi0gICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICoqZGVzYykKLXsKLSAgICBsaXN0X2VsZW1fdCAqZSA9IGdMaWJyYXJ5TGlzdDsKLSAgICBsaWJfZW50cnlfdCAqbCA9IE5VTEw7Ci0gICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZCA9IE5VTEw7Ci0gICAgaW50IGZvdW5kID0gMDsKLSAgICBpbnQgcmV0ID0gMDsKLQotICAgIHdoaWxlIChlICYmICFmb3VuZCkgewotICAgICAgICBsID0gKGxpYl9lbnRyeV90ICopZS0+b2JqZWN0OwotICAgICAgICBsaXN0X2VsZW1fdCAqZWZ4ID0gbC0+ZWZmZWN0czsKLSAgICAgICAgd2hpbGUgKGVmeCkgewotICAgICAgICAgICAgZCA9IChlZmZlY3RfZGVzY3JpcHRvcl90ICopZWZ4LT5vYmplY3Q7Ci0gICAgICAgICAgICBpZiAodHlwZSAhPSBOVUxMICYmIG1lbWNtcCgmZC0+dHlwZSwgdHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZm91bmQgPSAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHV1aWQgIT0gTlVMTCAmJiBtZW1jbXAoJmQtPnV1aWQsIHV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgewotICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVmeCA9IGVmeC0+bmV4dDsKLSAgICAgICAgfQotICAgICAgICBlID0gZS0+bmV4dDsKLSAgICB9Ci0gICAgaWYgKCFmb3VuZCkgewotICAgICAgICBBTE9HVigiZmluZEVmZmVjdCgpIGVmZmVjdCBub3QgZm91bmQiKTsKLSAgICAgICAgcmV0ID0gLUVOT0VOVDsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiZmluZEVmZmVjdCgpIGZvdW5kIGVmZmVjdDogJXMgaW4gbGliICVzIiwgZC0+bmFtZSwgbC0+bmFtZSk7Ci0gICAgICAgICpsaWIgPSBsOwotICAgICAgICBpZiAoZGVzYykgewotICAgICAgICAgICAgKmRlc2MgPSBkOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotdm9pZCBkdW1wRWZmZWN0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLCBjaGFyICpzdHIsIHNpemVfdCBsZW4sIGludCBpbmRlbnQpIHsKLSAgICBjaGFyIHNbMjU2XTsKLSAgICBjaGFyIHNzWzI1Nl07Ci0gICAgY2hhciBpZHRbaW5kZW50ICsgMV07Ci0KLSAgICBtZW1zZXQoaWR0LCAnICcsIGluZGVudCk7Ci0gICAgaWR0W2luZGVudF0gPSAwOwotCi0gICAgc3RyWzBdID0gMDsKLQotICAgIHNucHJpbnRmKHMsIHNpemVvZihzKSwgIiVzJXMgLyAlc1xuIiwgaWR0LCBkZXNjLT5uYW1lLCBkZXNjLT5pbXBsZW1lbnRvcik7Ci0gICAgc3RybGNhdChzdHIsIHMsIGxlbik7Ci0KLSAgICB1dWlkVG9TdHJpbmcoJmRlc2MtPnV1aWQsIHMsIHNpemVvZihzKSk7Ci0gICAgc25wcmludGYoc3MsIHNpemVvZihzcyksICIlcyAgVVVJRDogJXNcbiIsIGlkdCwgcyk7Ci0gICAgc3RybGNhdChzdHIsIHNzLCBsZW4pOwotCi0gICAgdXVpZFRvU3RyaW5nKCZkZXNjLT50eXBlLCBzLCBzaXplb2YocykpOwotICAgIHNucHJpbnRmKHNzLCBzaXplb2Yoc3MpLCAiJXMgIFRZUEU6ICVzXG4iLCBpZHQsIHMpOwotICAgIHN0cmxjYXQoc3RyLCBzcywgbGVuKTsKLQotICAgIHNwcmludGYocywgIiVzICBhcGlWZXJzaW9uOiAlMDhYXG4lcyAgZmxhZ3M6ICUwOFhcbiIsIGlkdCwKLSAgICAgICAgICAgIGRlc2MtPmFwaVZlcnNpb24sIGlkdCwgZGVzYy0+ZmxhZ3MpOwotICAgIHN0cmxjYXQoc3RyLCBzLCBsZW4pOwotfQotCi1pbnQgc3RyaW5nVG9VdWlkKGNvbnN0IGNoYXIgKnN0ciwgZWZmZWN0X3V1aWRfdCAqdXVpZCkKLXsKLSAgICBpbnQgdG1wWzEwXTsKLQotICAgIGlmIChzc2NhbmYoc3RyLCAiJTA4eC0lMDR4LSUwNHgtJTA0eC0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAotICAgICAgICAgICAgdG1wLCB0bXArMSwgdG1wKzIsIHRtcCszLCB0bXArNCwgdG1wKzUsIHRtcCs2LCB0bXArNywgdG1wKzgsIHRtcCs5KSA8IDEwKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICB1dWlkLT50aW1lTG93ID0gKHVpbnQzMl90KXRtcFswXTsKLSAgICB1dWlkLT50aW1lTWlkID0gKHVpbnQxNl90KXRtcFsxXTsKLSAgICB1dWlkLT50aW1lSGlBbmRWZXJzaW9uID0gKHVpbnQxNl90KXRtcFsyXTsKLSAgICB1dWlkLT5jbG9ja1NlcSA9ICh1aW50MTZfdCl0bXBbM107Ci0gICAgdXVpZC0+bm9kZVswXSA9ICh1aW50OF90KXRtcFs0XTsKLSAgICB1dWlkLT5ub2RlWzFdID0gKHVpbnQ4X3QpdG1wWzVdOwotICAgIHV1aWQtPm5vZGVbMl0gPSAodWludDhfdCl0bXBbNl07Ci0gICAgdXVpZC0+bm9kZVszXSA9ICh1aW50OF90KXRtcFs3XTsKLSAgICB1dWlkLT5ub2RlWzRdID0gKHVpbnQ4X3QpdG1wWzhdOwotICAgIHV1aWQtPm5vZGVbNV0gPSAodWludDhfdCl0bXBbOV07Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IHV1aWRUb1N0cmluZyhjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLCBjaGFyICpzdHIsIHNpemVfdCBtYXhMZW4pCi17Ci0KLSAgICBzbnByaW50ZihzdHIsIG1heExlbiwgIiUwOHgtJTA0eC0lMDR4LSUwNHgtJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKLSAgICAgICAgICAgIHV1aWQtPnRpbWVMb3csCi0gICAgICAgICAgICB1dWlkLT50aW1lTWlkLAotICAgICAgICAgICAgdXVpZC0+dGltZUhpQW5kVmVyc2lvbiwKLSAgICAgICAgICAgIHV1aWQtPmNsb2NrU2VxLAotICAgICAgICAgICAgdXVpZC0+bm9kZVswXSwKLSAgICAgICAgICAgIHV1aWQtPm5vZGVbMV0sCi0gICAgICAgICAgICB1dWlkLT5ub2RlWzJdLAotICAgICAgICAgICAgdXVpZC0+bm9kZVszXSwKLSAgICAgICAgICAgIHV1aWQtPm5vZGVbNF0sCi0gICAgICAgICAgICB1dWlkLT5ub2RlWzVdKTsKLQotICAgIHJldHVybiAwOwotfQotCiBpbnQgRWZmZWN0RHVtcEVmZmVjdHMoaW50IGZkKSB7CiAgICAgY2hhciBzWzUxMl07CiAKQEAgLTEwOTIsNiArNTgzLDIwIEBACiAgICAgICAgICAgICBlID0gZS0+bmV4dDsKICAgICAgICAgfQogICAgIH0KKyAgICBzd2l0Y2ggKGdDb25maWdOYkVsZW1Ta2lwcGVkKSB7CisgICAgY2FzZSAtMjoKKyAgICAgICAgZHByaW50ZihmZCwgIkVmZmVjdCBjb25maWd1cmF0aW9uIGxvYWRpbmcgc2tpcHBlZC5cbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIC0xOgorICAgICAgICBkcHJpbnRmKGZkLCAiWE1MIGVmZmVjdCBjb25maWd1cmF0aW9uIGZhaWxlZCB0byBsb2FkLlxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMDoKKyAgICAgICAgZHByaW50ZihmZCwgIlhNTCBlZmZlY3QgY29uZmlndXJhdGlvbiBsb2FkZWQgc3VjY2Vzc2Z1bGx5LlxuIik7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGRwcmludGYoZmQsICJYTUwgZWZmZWN0IGNvbmZpZ3VyYXRpb24gcGFydGlhbGx5IGxvYWRlZCwgc2tpcHBlZCAlemQgZWxlbWVudHMuXG4iLAorICAgICAgICAgICAgICAgIGdDb25maWdOYkVsZW1Ta2lwcGVkKTsKKyAgICB9CiAgICAgcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmggYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuaAppbmRleCA3MmUwOTMxLi4yOWRiYzljIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuaApAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPGRpcmVudC5oPgogI2luY2x1ZGUgPHB0aHJlYWQuaD4KIAotI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CiAKICNpZiBfX2NwbHVzcGx1cwpAQCAtOTYsNiArOTYsNyBAQAogLy8gICAgICAgICpwRGVzY3JpcHRvcjogICAgIHVwZGF0ZWQgd2l0aCB0aGUgc3ViIGVmZmVjdCBkZXNjcmlwdG9ycy4KIC8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworQU5EUk9JRF9BUEkKIGludCBFZmZlY3RHZXRTdWJFZmZlY3RzKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgc3ViX2VmZmVjdF9lbnRyeV90ICoqcFN1YmUsCiAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnlTdGF0ZS5jIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5U3RhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzY0MDA0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5U3RhdGUuYwpAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0c0ZhY3RvcnlTdGF0ZSIKKworI2luY2x1ZGUgIkVmZmVjdHNGYWN0b3J5U3RhdGUuaCIKKworI2luY2x1ZGUgImxvZy9sb2cuaCIKKworbGlzdF9lbGVtX3QgKmdMaWJyYXJ5TGlzdDsKK2xpc3RfZWxlbV90ICpnU2tpcHBlZEVmZmVjdHM7CitsaXN0X3N1Yl9lbGVtX3QgKmdTdWJFZmZlY3RMaXN0OworcHRocmVhZF9tdXRleF90IGdMaWJMb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKworbGlzdF9lbGVtX3QgKmdMaWJyYXJ5RmFpbGVkTGlzdDsgIC8vbGlzdCBvZiBsaWJfZmFpbGVkX2VudHJ5X3Q6IGxpYnJhcmllcyBmYWlsZWQgdG8gbG9hZAorCisKK2ludCBmaW5kRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgbGliX2VudHJ5X3QgKipsaWIsCisgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICoqZGVzYykKK3sKKyAgICBsaXN0X2VsZW1fdCAqZSA9IGdMaWJyYXJ5TGlzdDsKKyAgICBsaWJfZW50cnlfdCAqbCA9IE5VTEw7CisgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZCA9IE5VTEw7CisgICAgaW50IGZvdW5kID0gMDsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIHdoaWxlIChlICYmICFmb3VuZCkgeworICAgICAgICBsID0gKGxpYl9lbnRyeV90ICopZS0+b2JqZWN0OworICAgICAgICBsaXN0X2VsZW1fdCAqZWZ4ID0gbC0+ZWZmZWN0czsKKyAgICAgICAgd2hpbGUgKGVmeCkgeworICAgICAgICAgICAgZCA9IChlZmZlY3RfZGVzY3JpcHRvcl90ICopZWZ4LT5vYmplY3Q7CisgICAgICAgICAgICBpZiAodHlwZSAhPSBOVUxMICYmIG1lbWNtcCgmZC0+dHlwZSwgdHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZm91bmQgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHV1aWQgIT0gTlVMTCAmJiBtZW1jbXAoJmQtPnV1aWQsIHV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVmeCA9IGVmeC0+bmV4dDsKKyAgICAgICAgfQorICAgICAgICBlID0gZS0+bmV4dDsKKyAgICB9CisgICAgaWYgKCFmb3VuZCkgeworICAgICAgICBBTE9HVigiZmluZEVmZmVjdCgpIGVmZmVjdCBub3QgZm91bmQiKTsKKyAgICAgICAgcmV0ID0gLUVOT0VOVDsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiZmluZEVmZmVjdCgpIGZvdW5kIGVmZmVjdDogJXMgaW4gbGliICVzIiwgZC0+bmFtZSwgbC0+bmFtZSk7CisgICAgICAgICpsaWIgPSBsOworICAgICAgICBpZiAoZGVzYykgeworICAgICAgICAgICAgKmRlc2MgPSBkOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IHN0cmluZ1RvVXVpZChjb25zdCBjaGFyICpzdHIsIGVmZmVjdF91dWlkX3QgKnV1aWQpCit7CisgICAgaW50IHRtcFsxMF07CisKKyAgICBpZiAoc3NjYW5mKHN0ciwgIiUwOHgtJTA0eC0lMDR4LSUwNHgtJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKKyAgICAgICAgICAgIHRtcCwgdG1wKzEsIHRtcCsyLCB0bXArMywgdG1wKzQsIHRtcCs1LCB0bXArNiwgdG1wKzcsIHRtcCs4LCB0bXArOSkgPCAxMCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgdXVpZC0+dGltZUxvdyA9ICh1aW50MzJfdCl0bXBbMF07CisgICAgdXVpZC0+dGltZU1pZCA9ICh1aW50MTZfdCl0bXBbMV07CisgICAgdXVpZC0+dGltZUhpQW5kVmVyc2lvbiA9ICh1aW50MTZfdCl0bXBbMl07CisgICAgdXVpZC0+Y2xvY2tTZXEgPSAodWludDE2X3QpdG1wWzNdOworICAgIHV1aWQtPm5vZGVbMF0gPSAodWludDhfdCl0bXBbNF07CisgICAgdXVpZC0+bm9kZVsxXSA9ICh1aW50OF90KXRtcFs1XTsKKyAgICB1dWlkLT5ub2RlWzJdID0gKHVpbnQ4X3QpdG1wWzZdOworICAgIHV1aWQtPm5vZGVbM10gPSAodWludDhfdCl0bXBbN107CisgICAgdXVpZC0+bm9kZVs0XSA9ICh1aW50OF90KXRtcFs4XTsKKyAgICB1dWlkLT5ub2RlWzVdID0gKHVpbnQ4X3QpdG1wWzldOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1dWlkVG9TdHJpbmcoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwgY2hhciAqc3RyLCBzaXplX3QgbWF4TGVuKQoreworCisgICAgc25wcmludGYoc3RyLCBtYXhMZW4sICIlMDh4LSUwNHgtJTA0eC0lMDR4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisgICAgICAgICAgICB1dWlkLT50aW1lTG93LAorICAgICAgICAgICAgdXVpZC0+dGltZU1pZCwKKyAgICAgICAgICAgIHV1aWQtPnRpbWVIaUFuZFZlcnNpb24sCisgICAgICAgICAgICB1dWlkLT5jbG9ja1NlcSwKKyAgICAgICAgICAgIHV1aWQtPm5vZGVbMF0sCisgICAgICAgICAgICB1dWlkLT5ub2RlWzFdLAorICAgICAgICAgICAgdXVpZC0+bm9kZVsyXSwKKyAgICAgICAgICAgIHV1aWQtPm5vZGVbM10sCisgICAgICAgICAgICB1dWlkLT5ub2RlWzRdLAorICAgICAgICAgICAgdXVpZC0+bm9kZVs1XSk7CisKKyAgICByZXR1cm4gMDsKK30KKworCit2b2lkIGR1bXBFZmZlY3REZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsIGNoYXIgKnN0ciwgc2l6ZV90IGxlbiwgaW50IGluZGVudCkgeworICAgIGNoYXIgc1syNTZdOworICAgIGNoYXIgc3NbMjU2XTsKKyAgICBjaGFyIGlkdFtpbmRlbnQgKyAxXTsKKworICAgIG1lbXNldChpZHQsICcgJywgaW5kZW50KTsKKyAgICBpZHRbaW5kZW50XSA9IDA7CisKKyAgICBzdHJbMF0gPSAwOworCisgICAgc25wcmludGYocywgc2l6ZW9mKHMpLCAiJXMlcyAvICVzXG4iLCBpZHQsIGRlc2MtPm5hbWUsIGRlc2MtPmltcGxlbWVudG9yKTsKKyAgICBzdHJsY2F0KHN0ciwgcywgbGVuKTsKKworICAgIHV1aWRUb1N0cmluZygmZGVzYy0+dXVpZCwgcywgc2l6ZW9mKHMpKTsKKyAgICBzbnByaW50Zihzcywgc2l6ZW9mKHNzKSwgIiVzICBVVUlEOiAlc1xuIiwgaWR0LCBzKTsKKyAgICBzdHJsY2F0KHN0ciwgc3MsIGxlbik7CisKKyAgICB1dWlkVG9TdHJpbmcoJmRlc2MtPnR5cGUsIHMsIHNpemVvZihzKSk7CisgICAgc25wcmludGYoc3MsIHNpemVvZihzcyksICIlcyAgVFlQRTogJXNcbiIsIGlkdCwgcyk7CisgICAgc3RybGNhdChzdHIsIHNzLCBsZW4pOworCisgICAgc3ByaW50ZihzLCAiJXMgIGFwaVZlcnNpb246ICUwOFhcbiVzICBmbGFnczogJTA4WFxuIiwgaWR0LAorICAgICAgICAgICAgZGVzYy0+YXBpVmVyc2lvbiwgaWR0LCBkZXNjLT5mbGFncyk7CisgICAgc3RybGNhdChzdHIsIHMsIGxlbik7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnlTdGF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5U3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWY5NDVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5U3RhdGUuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0VGRkVDVFNGQUNUT1JZU1RBVEVfSF8KKyNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RTRkFDVE9SWVNUQVRFX0hfCisKKyNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeS5oIgorCisjaWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKiBAZmlsZSBDb250YWlucyB0aGUgc3RhdGUgc2hhcmVkIHdpdGggY29uZmlndXJhdGlvbiBsb2FkZXIgb2YgdGhlIEVmZmVjdCBmYWN0b3J5LgorICogICAgICAgIFRoaXMgZ2xvYmFsIHN0YXRlIHNob3VsZCBwcm9iYWJseSBiZSByZWZhY3RvciBpbiBhIHN0cnVjdHVyZQorICogICAgICAgIHByb3ZpZGVkIGJ5IHRoZSBjb25maWcgbG9hZGVyIG9uIEVmZmVjdHNGYWN0b3J5IGluaXQuCisgKiAgICAgICAgVGhpcyBoZWFkZXIgYWxzbyBjb250YWlucyBzb21lIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayBvbiB0aGUgc3RhdGUuCisgKi8KKworZXh0ZXJuIGxpc3RfZWxlbV90ICpnTGlicmFyeUxpc3Q7IC8vIGxpc3Qgb2YgbGliX2VudHJ5X3Q6IGFsbCBjdXJyZW50bHkgbG9hZGVkIGxpYnJhcmllcworLy8gbGlzdCBvZiBlZmZlY3RzIHNraXBwZWQgYmVjYXVzZSBvZiBkdXBsaWNhdGUgdXVpZCBvciBpbnZhbGlkIHZlcnNpb24KK2V4dGVybiBsaXN0X2VsZW1fdCAqZ1NraXBwZWRFZmZlY3RzOworLy8gbGlzdCBvZiBlZmZlY3RfZGVzY3JpcHRvciBhbmQgbGlzdCBvZiBzdWIgZWZmZWN0cyA6IGFsbCBjdXJyZW50bHkgbG9hZGVkCisvLyBJdCBkb2VzIG5vdCBjb250YWluIGVmZmVjdHMgd2l0aG91dCBzdWIgZWZmZWN0cy4KK2V4dGVybiBsaXN0X3N1Yl9lbGVtX3QgKmdTdWJFZmZlY3RMaXN0OworZXh0ZXJuIHB0aHJlYWRfbXV0ZXhfdCBnTGliTG9jazsgLy8gY29udHJvbHMgYWNjZXNzIHRvIGdMaWJyYXJ5TGlzdAorCitleHRlcm4gbGlzdF9lbGVtX3QgKmdMaWJyYXJ5RmFpbGVkTGlzdDsgIC8vbGlzdCBvZiBsaWJfZmFpbGVkX2VudHJ5X3Q6IGxpYnJhcmllcyBmYWlsZWQgdG8gbG9hZAorCisKKworaW50IGZpbmRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICBsaWJfZW50cnlfdCAqKmxpYiwKKyAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKipkZXNjKTsKKworaW50IHN0cmluZ1RvVXVpZChjb25zdCBjaGFyICpzdHIsIGVmZmVjdF91dWlkX3QgKnV1aWQpOworLyoqIFVzZWQgdG8gbG9nIFVVSURzICovCitpbnQgdXVpZFRvU3RyaW5nKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsIGNoYXIgKnN0ciwgc2l6ZV90IG1heExlbik7CisKKy8qKiBVc2VkIGZvciBkZWJ1Z2luZy4gKi8KK3ZvaWQgZHVtcEVmZmVjdERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywgY2hhciAqc3RyLCBzaXplX3QgbGVuLCBpbnQgaW5kZW50KTsKKworI2lmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgLy8gQU5EUk9JRF9FRkZFQ1RTRkFDVE9SWVNUQVRFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c1htbENvbmZpZ0xvYWRlci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c1htbENvbmZpZ0xvYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4Yjc4NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzWG1sQ29uZmlnTG9hZGVyLmNwcApAQCAtMCwwICsxLDMzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0c0ZhY3RvcnlDb25maWdMb2FkZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzQ29uZmlnLmg+CisKKyNpbmNsdWRlICJFZmZlY3RzQ29uZmlnTG9hZGVyLmgiCisjaW5jbHVkZSAiRWZmZWN0c0ZhY3RvcnlTdGF0ZS5oIgorI2luY2x1ZGUgIkVmZmVjdHNYbWxDb25maWdMb2FkZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBuYW1lc3BhY2UgZWZmZWN0c0NvbmZpZzsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICBMb2NhbCBmdW5jdGlvbnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworbmFtZXNwYWNlIHsKKworLyoqIFNpbWlsYXJseSB0byBkbG9wZW4sIGxvb2tzIGZvciB0aGUgcHJvdmlkZWQgcGF0aCBpbiBMRF9FRkZFQ1RfTElCUkFSWV9QQVRILgorICogQHJldHVybiB0cnVlIGlmIHRoZSBsaWJyYXJ5IGlzIGZvdW5kIGFuZCBzZXQgcmVzb2x2ZWRQYXRoIHRvIGl0cyBhYnNvbHV0ZSBwYXRoLgorICogICAgICAgICBmYWxzZSBpZiBub3QgZm91bmQKKyAqLworYm9vbCByZXNvbHZlTGlicmFyeShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgc3RkOjpzdHJpbmcqIHJlc29sdmVkUGF0aCkgeworICAgIGZvciAoYXV0byogbGlicmFyeURpcmVjdG9yeSA6IExEX0VGRkVDVF9MSUJSQVJZX1BBVEgpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgY2FuZGlkYXRlUGF0aCA9IHN0ZDo6c3RyaW5nKGxpYnJhcnlEaXJlY3RvcnkpICsgJy8nICsgcGF0aDsKKyAgICAgICAgaWYgKGFjY2VzcyhjYW5kaWRhdGVQYXRoLmNfc3RyKCksIFJfT0spID09IDApIHsKKyAgICAgICAgICAgICpyZXNvbHZlZFBhdGggPSBzdGQ6Om1vdmUoY2FuZGlkYXRlUGF0aCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKiBMb2FkcyBhIGxpYnJhcnkgZ2l2ZW4gaXRzIHJlbGF0aXZlIHBhdGggYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluIGxpYkVudHJ5LgorICogQHJldHVybiB0cnVlIG9uIHN1Y2Nlc3Mgd2l0aCBsaWJFbnRyeSdzIHBhdGgsIGhhbmRsZSBhbmQgZGVzYyBmaWxsZWQKKyAqICAgICAgICAgZmFsc2Ugb24gc3VjY2VzcyB3aXRoIGxpYkVudHJ5J3MgcGF0aCBmaWxsZWQgd2l0aCB0aGUgcGF0aCBvZiB0aGUgZmFpbGVkIGxpYgorICogVGhlIGNhbGxlciBNVVNUIGZyZWUgdGhlIHJlc291cmNlcyBwYXRoIChmcmVlKSBhbmQgaGFuZGxlIChkbGNsb3NlKSBpZiBmaWxsZWQuCisgKi8KK2Jvb2wgbG9hZExpYnJhcnkoY29uc3QgY2hhciogcmVsYXRpdmVQYXRoLCBsaWJfZW50cnlfdCogbGliRW50cnkpIG5vZXhjZXB0IHsKKworICAgIHN0ZDo6c3RyaW5nIGFic29sdXRlUGF0aDsKKyAgICBpZiAoIXJlc29sdmVMaWJyYXJ5KHJlbGF0aXZlUGF0aCwgJmFic29sdXRlUGF0aCkpIHsKKyAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBmaW5kIGxpYnJhcnkgaW4gZWZmZWN0IGRpcmVjdG9yaWVzOiAlcyIsIHJlbGF0aXZlUGF0aCk7CisgICAgICAgIGxpYkVudHJ5LT5wYXRoID0gc3RyZHVwKHJlbGF0aXZlUGF0aCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY29uc3QgY2hhciogcGF0aCA9IGFic29sdXRlUGF0aC5jX3N0cigpOworICAgIGxpYkVudHJ5LT5wYXRoID0gc3RyZHVwKHBhdGgpOworCisgICAgLy8gTWFrZSBzdXJlIHRoZSBsaWIgaXMgY2xvc2VkIG9uIGVhcmx5IHJldHVybgorICAgIHN0ZDo6dW5pcXVlX3B0cjx2b2lkLCBkZWNsdHlwZShkbGNsb3NlKSo+IGxpYkhhbmRsZShkbG9wZW4ocGF0aCwgUlRMRF9OT1cpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRsY2xvc2UpOworICAgIGlmIChsaWJIYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGRsb3BlbiBsaWJyYXJ5ICVzOiAlcyIsIHBhdGgsIGRsZXJyb3IoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBhdXRvKiBkZXNjcmlwdGlvbiA9IHN0YXRpY19jYXN0PGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QqPigKKyAgICAgICAgICBkbHN5bShsaWJIYW5kbGUuZ2V0KCksIEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNX0FTX1NUUikpOworICAgIGlmIChkZXNjcmlwdGlvbiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGVmZmVjdCBsaWJyYXJ5LCBmYWlsZWQgbm90IGZpbmQgc3ltYm9sICclcycgaW4gJXM6ICVzIiwKKyAgICAgICAgICAgICAgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU1fQVNfU1RSLCBwYXRoLCBkbGVycm9yKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGRlc2NyaXB0aW9uLT50YWcgIT0gQVVESU9fRUZGRUNUX0xJQlJBUllfVEFHKSB7CisgICAgICAgIEFMT0dFKCJCYWQgdGFnICUjMDh4IGluIGRlc2NyaXB0aW9uIHN0cnVjdHVyZSwgZXhwZWN0ZWQgJSMwOHggZm9yIGxpYnJhcnkgJXMiLAorICAgICAgICAgICAgICBkZXNjcmlwdGlvbi0+dGFnLCBBVURJT19FRkZFQ1RfTElCUkFSWV9UQUcsIHBhdGgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdWludDMyX3QgbWFqb3JWZXJzaW9uID0gRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKGRlc2NyaXB0aW9uLT52ZXJzaW9uKTsKKyAgICB1aW50MzJfdCBleHBlY3RlZE1ham9yVmVyc2lvbiA9IEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihFRkZFQ1RfTElCUkFSWV9BUElfVkVSU0lPTik7CisgICAgaWYgKG1ham9yVmVyc2lvbiAhPSBleHBlY3RlZE1ham9yVmVyc2lvbikgeworICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgbWFqb3IgdmVyc2lvbiAlIzA4eCwgZXhwZWN0ZWQgJSMwOHggZm9yIGxpYnJhcnkgJXMiLAorICAgICAgICAgICAgICBtYWpvclZlcnNpb24sIGV4cGVjdGVkTWFqb3JWZXJzaW9uLCBwYXRoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGxpYkVudHJ5LT5oYW5kbGUgPSBsaWJIYW5kbGUucmVsZWFzZSgpOworICAgIGxpYkVudHJ5LT5kZXNjID0gZGVzY3JpcHRpb247CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKiBCZWNhdXNlIHRoZSBzdHJ1Y3R1cmVzIHdpbGwgYmUgZGVzdHJveWVkIGJ5IGMgY29kZSwgdXNpbmcgbmV3IHRvIGFsbG9jYXRlIHNoYXJlZCBzdHJ1Y3R1cmUKKyAqIGlzIG5vdCBwb3NzaWJsZS4gUHJvdmlkZSBhIGVxdWl2YWxlbnQgb2YgdW5pcXVlX3B0ciBmb3IgbWFsbG9jL2ZyZWVkIHN0cnVjdHVyZSB0byBtYWtlIHN1cmUKKyAqIHRoZXkgYXJlIG5vdCBsZWFrZWQgaW4gdGhlIGMrKyBjb2RlLgorIEB7ICovCitzdHJ1Y3QgRnJlZURlbGV0ZXIgeworICAgIHZvaWQgb3BlcmF0b3IoKSh2b2lkKiBwKSB7CisgICAgICAgIGZyZWUocCk7CisgICAgfQorfTsKKy8qKiB1bmlxdWVfcHRyIGZvciBvYmplY3QgY3JlYXRlZCB3aXRoIG1hbGxvYy4gKi8KK3RlbXBsYXRlIDxjbGFzcyBUPgordXNpbmcgVW5pcXVlQ1B0ciA9IHN0ZDo6dW5pcXVlX3B0cjxULCBGcmVlRGVsZXRlcj47CisKKy8qKiBjIHZlcnNpb24gb2Ygc3RkOjptYWtlX3VuaXF1ZS4gVXNlcyBtYWxsb2MgYW5kIGZyZWUuICovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK1VuaXF1ZUNQdHI8VD4gbWFrZVVuaXF1ZUMoKSB7CisgICAgVCogcHRyID0gbmV3IChtYWxsb2Moc2l6ZW9mKFQpKSkgVHt9OyAvLyBVc2UgcGxhY2VtZW50IG5ldyB0byBpbml0aWFsaXplIHRoZSBzdHJ1Y3R1cmUKKyAgICByZXR1cm4gVW5pcXVlQ1B0cjxUPntwdHJ9OworfQorCisvKiogQH0gKi8KKworLyoqIFB1c2ggYW4gbm90IG93bmVkIGVsZW1lbnQgaW4gYSBsaXN0X2VsZW0gbGluayBsaXN0IHdpdGggYW4gb3B0aW9uYWwgbG9jay4gKi8KK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBMaXN0RWxlbT4KK3ZvaWQgbGlzdFB1c2goVCogb2JqZWN0LCBMaXN0RWxlbSoqIGxpc3QsIHB0aHJlYWRfbXV0ZXhfdCogbXV0ZXggPSBudWxscHRyKSBub2V4Y2VwdCB7CisgICAgYXV0byBsaXN0RWxlbSA9IG1ha2VVbmlxdWVDPExpc3RFbGVtPigpOworICAgIGxpc3RFbGVtLT5vYmplY3QgPSBvYmplY3Q7CisgICAgaWYgKG11dGV4ICE9IG51bGxwdHIpIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKG11dGV4KTsKKyAgICB9CisgICAgbGlzdEVsZW0tPm5leHQgPSAqbGlzdDsKKyAgICAqbGlzdCA9IGxpc3RFbGVtLnJlbGVhc2UoKTsKKyAgICBpZiAobXV0ZXggIT0gbnVsbHB0cikgeworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jayhtdXRleCk7CisgICAgfQorfQorCisvKiogUHVzaCBhbiBvd25lZCBlbGVtZW50IGluIGEgbGlzdF9lbGVtIGxpbmsgbGlzdCB3aXRoIGFuIG9wdGlvbmFsIGxvY2suICovCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgTGlzdEVsZW0+Cit2b2lkIGxpc3RQdXNoKFVuaXF1ZUNQdHI8VD4mJiBvYmplY3QsIExpc3RFbGVtKiogbGlzdCwgcHRocmVhZF9tdXRleF90KiBtdXRleCA9IG51bGxwdHIpIG5vZXhjZXB0IHsKKyAgICBsaXN0UHVzaChvYmplY3QucmVsZWFzZSgpLCBsaXN0LCBtdXRleCk7Cit9CisKK3NpemVfdCBsb2FkTGlicmFyaWVzKGNvbnN0IGVmZmVjdHNDb25maWc6OkxpYnJhcmllcyYgbGlicywKKyAgICAgICAgICAgICAgICAgICAgIGxpc3RfZWxlbV90KiogbGliTGlzdCwgcHRocmVhZF9tdXRleF90KiBsaWJMaXN0TG9jaywKKyAgICAgICAgICAgICAgICAgICAgIGxpc3RfZWxlbV90KiogbGliRmFpbGVkTGlzdCkKK3sKKyAgICBzaXplX3QgbmJTa2lwcGVkRWxlbWVudCA9IDA7CisgICAgZm9yIChhdXRvJiBsaWJyYXJ5IDogbGlicykgeworCisgICAgICAgIC8vIENvbnN0cnVjdCBhIGxpYiBlbnRyeQorICAgICAgICBhdXRvIGxpYkVudHJ5ID0gbWFrZVVuaXF1ZUM8bGliX2VudHJ5X3Q+KCk7CisgICAgICAgIGxpYkVudHJ5LT5uYW1lID0gc3RyZHVwKGxpYnJhcnkubmFtZS5jX3N0cigpKTsKKyAgICAgICAgbGliRW50cnktPmVmZmVjdHMgPSBudWxscHRyOworICAgICAgICBwdGhyZWFkX211dGV4X2luaXQoJmxpYkVudHJ5LT5sb2NrLCBudWxscHRyKTsKKworICAgICAgICBpZiAoIWxvYWRMaWJyYXJ5KGxpYnJhcnkucGF0aC5jX3N0cigpLCBsaWJFbnRyeS5nZXQoKSkpIHsKKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGxpYnJhcnkgbG9hZCBmYWlsdXJlCisgICAgICAgICAgICBsaXN0UHVzaChzdGQ6Om1vdmUobGliRW50cnkpLCBsaWJGYWlsZWRMaXN0KTsKKyAgICAgICAgICAgICsrbmJTa2lwcGVkRWxlbWVudDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGxpc3RQdXNoKHN0ZDo6bW92ZShsaWJFbnRyeSksIGxpYkxpc3QsIGxpYkxpc3RMb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIG5iU2tpcHBlZEVsZW1lbnQ7Cit9CisKKy8qKiBGaW5kIGEgbGlicmFyeSB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHRoZSBnaXZlbiBsaXN0LiAqLworbGliX2VudHJ5X3QqIGZpbmRMaWJyYXJ5KGNvbnN0IGNoYXIqIG5hbWUsIGxpc3RfZWxlbV90KiBsaXN0KSB7CisKKyAgICB3aGlsZSAobGlzdCAhPSBudWxscHRyKSB7CisgICAgICAgIGF1dG8qIG9iamVjdCA9IHN0YXRpY19jYXN0PGxpYl9lbnRyeV90Kj4obGlzdC0+b2JqZWN0KTsKKyAgICAgICAgaWYgKHN0cmNtcChvYmplY3QtPm5hbWUsIG5hbWUpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBvYmplY3Q7CisgICAgICAgIH0KKyAgICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCitzdHJ1Y3QgVXVpZFN0ciB7CisgICAgLyoqIExlbmd0aCBvZiBhbiB1dWlkIHJlcHJlc2VudGVkIGFzIHN0cmluZy4gQFRPRE86IHVzZSBhIGNvbnN0YW50IGluc3RlYWQgb2YgNDAuICovCisgICAgY2hhciBidWZmWzQwXTsKK307CisKKy8qKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcHJvdmlkZWQgdXVpZC4KKyAqIEJ5IG5vdCBwcm92aWRpbmcgYW4gb3V0cHV0IGJ1ZmZlciwgaXQgaXMgaW1wbGljaXRseSBjcmVhdGVkIGluIHRoZSBjYWxsZXIgY29udGV4dC4KKyAqIEluIHN1Y2ggY2FzZSB0aGUgcmV0dXJuIHBvaW50ZXIgaGFzIHRoZSBzYW1lIGxpZmV0aW1lIGFzIHRoZSBleHByZXNzaW9uIGNvbnRhaW5pbmcgdXVpZFRvU3RyaW5nKCkKKyAqLworY2hhciogdXVpZFRvU3RyaW5nKGNvbnN0IGVmZmVjdF91dWlkX3QmIHV1aWQsIFV1aWRTdHImJiBzdHIgPSB7fSkgeworICAgIHV1aWRUb1N0cmluZygmdXVpZCwgc3RyLmJ1ZmYsIHNpemVvZihzdHIuYnVmZikpOworICAgIHJldHVybiBzdHIuYnVmZjsKK30KKworc3RydWN0IExvYWRFZmZlY3RSZXN1bHQgeworICAgIC8qKiB0cnVlIGlmIHRoZSBlZmZlY3QgaXMgdXNhYmxlIChha2EsIGV4aXN0aW5nIGxpYiwgZGVzYywgcmlnaHQgdmVyc2lvbiwgdW5pcXVlIHV1aWQpICovCisgICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CisgICAgLyoqIFNldCBpZiB0aGUgZWZmZWN0IGxpYiB3YXMgZm91bmQqLworICAgIGxpYl9lbnRyeV90KiBsaWIgPSBudWxscHRyOworICAgIC8vKiBTZXQgaWYgdGhlIGRlc2NyaXB0aW9uIHdhcyBzdWNjZXNzZnVseSByZXRyaWV2ZWQgZnJvbSB0aGUgbGliICovCisgICAgVW5pcXVlQ1B0cjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3REZXNjOworfTsKKworTG9hZEVmZmVjdFJlc3VsdCBsb2FkRWZmZWN0KGNvbnN0IEVmZmVjdEltcGwmIGVmZmVjdCwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9lbGVtX3QqIGxpYkxpc3QpIHsKKyAgICBMb2FkRWZmZWN0UmVzdWx0IHJlc3VsdDsKKworICAgIC8vIEZpbmQgdGhlIGVmZmVjdCBsaWJyYXJ5CisgICAgcmVzdWx0LmxpYiA9IGZpbmRMaWJyYXJ5KGVmZmVjdC5saWJyYXJ5LT5uYW1lLmNfc3RyKCksIGxpYkxpc3QpOworICAgIGlmIChyZXN1bHQubGliID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBmaW5kIGxpYnJhcnkgJXMgdG8gbG9hZCBlZmZlY3QgJXMiLAorICAgICAgICAgICAgICBlZmZlY3QubGlicmFyeS0+bmFtZS5jX3N0cigpLCBuYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHJlc3VsdC5lZmZlY3REZXNjID0gbWFrZVVuaXF1ZUM8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4oKTsKKworICAgIC8vIEdldCB0aGUgZWZmZWN0IGRlc2NyaXB0b3IKKyAgICBpZiAocmVzdWx0LmxpYi0+ZGVzYy0+Z2V0X2Rlc2NyaXB0b3IoJmVmZmVjdC51dWlkLCByZXN1bHQuZWZmZWN0RGVzYy5nZXQoKSkgIT0gMCkgeworICAgICAgICBBTE9HRSgiRXJyb3IgcXVlcnlpbmcgZWZmZWN0ICVzIG9uIGxpYiAlcyIsCisgICAgICAgICAgICAgIHV1aWRUb1N0cmluZyhlZmZlY3QudXVpZCksIHJlc3VsdC5saWItPm5hbWUpOworICAgICAgICByZXN1bHQuZWZmZWN0RGVzYy5yZXNldCgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8vIER1bXAgZWZmZWN0IGZvciBkZWJ1ZworI2lmIChMT0dfTkRFQlVHPT0wKQorICAgIGNoYXIgc1s1MTJdOworICAgIGR1bXBFZmZlY3REZXNjcmlwdG9yKHJlc3VsdC5lZmZlY3REZXNjLmdldCgpLCBzLCBzaXplb2YocyksIDAgLyogaW5kZW50ICovKTsKKyAgICBBTE9HVigibG9hZEVmZmVjdCgpIHJlYWQgZGVzY3JpcHRvciAlcDolcyIsIHJlc3VsdC5lZmZlY3REZXNjLmdldCgpLCBzKTsKKyNlbmRpZgorCisgICAgLy8gQ2hlY2sgZWZmZWN0IGlzIHN1cHBvcnRlZAorICAgIHVpbnQzMl90IGV4cGVjdGVkTWFqb3JWZXJzaW9uID0gRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OKTsKKyAgICBpZiAoRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKHJlc3VsdC5lZmZlY3REZXNjLT5hcGlWZXJzaW9uKSAhPSBleHBlY3RlZE1ham9yVmVyc2lvbikgeworICAgICAgICBBTE9HRSgiQmFkIEFQSSB2ZXJzaW9uICUjMDh4IGZvciBlZmZlY3QgJXMgaW4gbGliICVzLCBleHBlY3RlZCBtYWpvciAlIzA4eCIsCisgICAgICAgICAgICAgIHJlc3VsdC5lZmZlY3REZXNjLT5hcGlWZXJzaW9uLCBuYW1lLmNfc3RyKCksIHJlc3VsdC5saWItPm5hbWUsIGV4cGVjdGVkTWFqb3JWZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBsaWJfZW50cnlfdCAqXzsKKyAgICBpZiAoZmluZEVmZmVjdChudWxscHRyLCAmZWZmZWN0LnV1aWQsICZfLCBudWxscHRyKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJFZmZlY3QgJXMgdXVpZCAlcyBhbHJlYWR5IGV4aXN0IiwgdXVpZFRvU3RyaW5nKGVmZmVjdC51dWlkKSwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICByZXN1bHQuc3VjY2VzcyA9IHRydWU7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc2l6ZV90IGxvYWRFZmZlY3RzKGNvbnN0IEVmZmVjdHMmIGVmZmVjdHMsIGxpc3RfZWxlbV90KiBsaWJMaXN0LCBsaXN0X2VsZW1fdCoqIHNraXBwZWRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgIGxpc3Rfc3ViX2VsZW1fdCoqIHN1YkVmZmVjdExpc3QpIHsKKyAgICBzaXplX3QgbmJTa2lwcGVkRWxlbWVudCA9IDA7CisKKyAgICBmb3IgKGF1dG8mIGVmZmVjdCA6IGVmZmVjdHMpIHsKKworICAgICAgICBhdXRvIGVmZmVjdExvYWRSZXN1bHQgPSBsb2FkRWZmZWN0KGVmZmVjdCwgZWZmZWN0Lm5hbWUsIGxpYkxpc3QpOworICAgICAgICBpZiAoIWVmZmVjdExvYWRSZXN1bHQuc3VjY2VzcykgeworICAgICAgICAgICAgaWYgKGVmZmVjdExvYWRSZXN1bHQuZWZmZWN0RGVzYyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgbGlzdFB1c2goc3RkOjptb3ZlKGVmZmVjdExvYWRSZXN1bHQuZWZmZWN0RGVzYyksIHNraXBwZWRFZmZlY3RzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrbmJTa2lwcGVkRWxlbWVudDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVmZmVjdC5pc1Byb3h5KSB7CisgICAgICAgICAgICBhdXRvIHN3RWZmZWN0TG9hZFJlc3VsdCA9IGxvYWRFZmZlY3QoZWZmZWN0LmxpYlN3LCBlZmZlY3QubmFtZSArICIgbGlic3ciLCBsaWJMaXN0KTsKKyAgICAgICAgICAgIGF1dG8gaHdFZmZlY3RMb2FkUmVzdWx0ID0gbG9hZEVmZmVjdChlZmZlY3QubGliSHcsIGVmZmVjdC5uYW1lICsgIiBsaWJodyIsIGxpYkxpc3QpOworICAgICAgICAgICAgaWYgKCFzd0VmZmVjdExvYWRSZXN1bHQuc3VjY2VzcyB8fCAhaHdFZmZlY3RMb2FkUmVzdWx0LnN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAvLyBQdXNoIHRoZSBtYWluIGVmZmVjdCBpbiB0aGUgc2tpcHBlZCBsaXN0IGV2ZW4gaWYgb25seSBhIHN1YmVmZmVjdCBpcyBpbnZhbGlkCisgICAgICAgICAgICAgICAgLy8gYXMgdGhlIG1haW4gZWZmZWN0IGlzIG5vdCB1c2FibGUgd2l0aG91dCBpdHMgc3ViZWZmZWN0cy4KKyAgICAgICAgICAgICAgICBsaXN0UHVzaChzdGQ6Om1vdmUoZWZmZWN0TG9hZFJlc3VsdC5lZmZlY3REZXNjKSwgc2tpcHBlZEVmZmVjdHMpOworICAgICAgICAgICAgICAgICsrbmJTa2lwcGVkRWxlbWVudDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpc3RQdXNoKGVmZmVjdExvYWRSZXN1bHQuZWZmZWN0RGVzYy5nZXQoKSwgc3ViRWZmZWN0TGlzdCk7CisKKyAgICAgICAgICAgIC8vIFNpbmNlIHdlIHJldHVybiBhIGR1bW15IGRlc2NyaXB0b3IgZm9yIHRoZSBwcm94eSBkdXJpbmcKKyAgICAgICAgICAgIC8vIGdldF9kZXNjcmlwdG9yIGNhbGwsIHdlIHJlcGxhY2UgaXQgd2l0aCB0aGUgY29ycmVzcG9uZGluZworICAgICAgICAgICAgLy8gc3cgZWZmZWN0IGRlc2NyaXB0b3IsIGJ1dCBrZWVwIHRoZSBQcm94eSBVVUlECisgICAgICAgICAgICAqZWZmZWN0TG9hZFJlc3VsdC5lZmZlY3REZXNjID0gKnN3RWZmZWN0TG9hZFJlc3VsdC5lZmZlY3REZXNjOworICAgICAgICAgICAgZWZmZWN0TG9hZFJlc3VsdC5lZmZlY3REZXNjLT51dWlkID0gZWZmZWN0LnV1aWQ7CisKKyAgICAgICAgICAgIGVmZmVjdExvYWRSZXN1bHQuZWZmZWN0RGVzYy0+ZmxhZ3MgfD0gRUZGRUNUX0ZMQUdfT0ZGTE9BRF9TVVBQT1JURUQ7CisKKyAgICAgICAgICAgIGF1dG8gcmVnaXN0ZXJTdWJFZmZlY3QgPSBbc3ViRWZmZWN0TGlzdF0oYXV0byYmIHJlc3VsdCkgeworICAgICAgICAgICAgICAgIGF1dG8gZW50cnkgPSBtYWtlVW5pcXVlQzxzdWJfZWZmZWN0X2VudHJ5X3Q+KCk7CisgICAgICAgICAgICAgICAgZW50cnktPm9iamVjdCA9IHJlc3VsdC5lZmZlY3REZXNjLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAvLyBsaWJfZW50cnlfdCBpcyBzdG9yZWQgc2luY2UgdGhlIHN1YiBlZmZlY3RzIGFyZSBub3QgbGlua2VkIHRvIHRoZSBsaWJyYXJ5CisgICAgICAgICAgICAgICAgZW50cnktPmxpYiA9IHJlc3VsdC5saWI7CisgICAgICAgICAgICAgICAgbGlzdFB1c2goc3RkOjptb3ZlKGVudHJ5KSwgJigqc3ViRWZmZWN0TGlzdCktPnN1Yl9lbGVtKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICByZWdpc3RlclN1YkVmZmVjdChzdGQ6Om1vdmUoc3dFZmZlY3RMb2FkUmVzdWx0KSk7CisgICAgICAgICAgICByZWdpc3RlclN1YkVmZmVjdChzdGQ6Om1vdmUoaHdFZmZlY3RMb2FkUmVzdWx0KSk7CisgICAgICAgIH0KKworICAgICAgICBsaXN0UHVzaChzdGQ6Om1vdmUoZWZmZWN0TG9hZFJlc3VsdC5lZmZlY3REZXNjKSwgJmVmZmVjdExvYWRSZXN1bHQubGliLT5lZmZlY3RzKTsKKyAgICB9CisgICAgcmV0dXJuIG5iU2tpcHBlZEVsZW1lbnQ7Cit9CisKK30gLy8gbmFtZXNwYWNlCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgICAgSW50ZXJmYWNlIGZ1bmN0aW9uCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2V4dGVybiAiQyIgc3NpemVfdCBFZmZlY3RMb2FkWG1sRWZmZWN0Q29uZmlnKGNvbnN0IGNoYXIqIHBhdGgpCit7CisgICAgdXNpbmcgZWZmZWN0c0NvbmZpZzo6cGFyc2U7CisgICAgYXV0byByZXN1bHQgPSBwYXRoID8gcGFyc2UocGF0aCkgOiBwYXJzZSgpOworICAgIGlmIChyZXN1bHQucGFyc2VkQ29uZmlnID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBwYXJzZSBYTUwgY29uZmlndXJhdGlvbiBmaWxlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmVzdWx0Lm5iU2tpcHBlZEVsZW1lbnQgKz0gbG9hZExpYnJhcmllcyhyZXN1bHQucGFyc2VkQ29uZmlnLT5saWJyYXJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ0xpYnJhcnlMaXN0LCAmZ0xpYkxvY2ssICZnTGlicmFyeUZhaWxlZExpc3QpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkRWZmZWN0cyhyZXN1bHQucGFyc2VkQ29uZmlnLT5lZmZlY3RzLCBnTGlicmFyeUxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdTa2lwcGVkRWZmZWN0cywgJmdTdWJFZmZlY3RMaXN0KTsKKworICAgIEFMT0dFX0lGKHJlc3VsdC5uYlNraXBwZWRFbGVtZW50ICE9IDAsICIlenUgZXJyb3JzIGR1cmluZyBsb2FkaW5nIG9mIGNvbmZpZ3VyYXRpb246ICVzIiwKKyAgICAgICAgICAgICByZXN1bHQubmJTa2lwcGVkRWxlbWVudCwgcGF0aCA/OiBlZmZlY3RzQ29uZmlnOjpERUZBVUxUX1BBVEgpOworCisgICAgcmV0dXJuIHJlc3VsdC5uYlNraXBwZWRFbGVtZW50OworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c1htbENvbmZpZ0xvYWRlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNYbWxDb25maWdMb2FkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2ZlOWEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNYbWxDb25maWdMb2FkZXIuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0VGRkVDVFNYTUxDT05GSUdMT0FERVJfSAorI2RlZmluZSBBTkRST0lEX0VGRkVDVFNYTUxDT05GSUdMT0FERVJfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KKworI2luY2x1ZGUgIkVmZmVjdHNGYWN0b3J5U3RhdGUuaCIKKworI2lmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiogUGFyc2VzIHRoZSBwbGF0Zm9ybSBlZmZlY3QgeG1sIGNvbmZpZ3VyYXRpb24gYW5kIHN0b3JlcyBpdHMgY29udGVudCBpbiBFZmZlY3RGYWN0b3J5U3RhdGUuCisgKiBAcGFyYW1baW5dIHBhdGggb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBvciBOVUxMwqB0byBsb2FkIHRoZSBkZWZhdWx0IG9uZQorICogQHJldHVybiAtMcKgb24gdW5yZWNvdmVyYWJsZSBlcnJvciAoZWc6IG5vIGNvbmZpZ3VyYXRpb24gZmlsZSkKKyAqICAgICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgICAgIHRoZSBudW1iZXIgb2YgaW52YWxpZCBlbGVtZW50cyAobGliICYgZWZmZWN0KSBza2lwcGVkIGlmIHRoZSBjb25maWcgaXMgcGFydGlhbGx5IGludmFsaWQKKyAqIEBub3RlIHRoaXMgZnVuY3Rpb24gaXMgZXhwb3J0ZWQgZm9yIHRlc3QgcHVycG9zZSBvbmx5LiBEbyBub3QgY2FsbCBmcm9tIG91dHNpZGUgdGhpcyBsaWJyYXJ5LgorICovCitBTkRST0lEX0FQSQorc3NpemVfdCBFZmZlY3RMb2FkWG1sRWZmZWN0Q29uZmlnKGNvbnN0IGNoYXIqIHBhdGgpOworCisjaWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9FRkZFQ1RTWE1MQ09ORklHTE9BREVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9pbmNsdWRlL21lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmggYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvaW5jbHVkZS9tZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oCmluZGV4IDY0YTMyMTIuLmE1YTEyZWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9pbmNsdWRlL21lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L2luY2x1ZGUvbWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaApAQCAtMTcsNiArMTcsNyBAQAogI2lmbmRlZiBBTkRST0lEX0VGRkVDVFNGQUNUT1JZQVBJX0hfCiAjZGVmaW5lIEFORFJPSURfRUZGRUNUU0ZBQ1RPUllBUElfSF8KIAorI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CkBAIC01Miw2ICs1Myw3IEBACiAvLyAgICAgICAgKnBOdW1FZmZlY3RzOiAgICAgdXBkYXRlZCB3aXRoIG51bWJlciBvZiBlZmZlY3RzIGluIGZhY3RvcnkKIC8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworQU5EUk9JRF9BUEkKIGludCBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTc5LDYgKzgxLDcgQEAKIC8vICAgICAgICAqcERlc2NyaXB0b3I6ICAgICB1cGRhdGVkIHdpdGggdGhlIGVmZmVjdCBkZXNjcmlwdG9yLgogLy8KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitBTkRST0lEX0FQSQogaW50IEVmZmVjdFF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0xMTAsNiArMTEzLDcgQEAKIC8vICAgICAgICAqcEhhbmRsZTogICAgICAgICB1cGRhdGVkIHdpdGggdGhlIGVmZmVjdCBoYW5kbGUuCiAvLwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK0FORFJPSURfQVBJCiBpbnQgRWZmZWN0Q3JlYXRlKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLAogICAgICAgICBlZmZlY3RfaGFuZGxlX3QgKnBIYW5kbGUpOwogCkBAIC0xMzAsNiArMTM0LDcgQEAKIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRUlOVkFMICAgICBpbnZhbGlkIGludGVyZmFjZSBoYW5kbGUKIC8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworQU5EUk9JRF9BUEkKIGludCBFZmZlY3RSZWxlYXNlKGVmZmVjdF9oYW5kbGVfdCBoYW5kbGUpOwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtMTUzLDYgKzE1OCw3IEBACiAvLyAgICAgICAgKnBEZXNjcmlwdG9yOiAgICAgdXBkYXRlZCB3aXRoIHRoZSBlZmZlY3QgZGVzY3JpcHRvci4KIC8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworQU5EUk9JRF9BUEkKIGludCBFZmZlY3RHZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0xNjksOCArMTc1LDEwIEBACiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgaWYgdXVpZCBpcyBlcXVhbCB0byBFRkZFQ1RfVVVJRF9OVUxMLgogLy8KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitBTkRST0lEX0FQSQogaW50IEVmZmVjdElzTnVsbFV1aWQoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQpOwogCitBTkRST0lEX0FQSQogaW50IEVmZmVjdER1bXBFZmZlY3RzKGludCBmZCk7CiAKICNpZiBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L3Rlc3QvRHVtcENvbmZpZy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvdGVzdC9EdW1wQ29uZmlnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTE1NmI0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L3Rlc3QvRHVtcENvbmZpZy5jcHAKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgIkVmZmVjdHNYbWxDb25maWdMb2FkZXIuaCIKKyNpbmNsdWRlICJFZmZlY3RzQ29uZmlnTG9hZGVyLmgiCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgICBjb25zdCBjaGFyKiBwYXRoID0gbnVsbHB0cjsKKyAgICBib29sIGxlZ2FjeUZvcm1hdDsKKworICAgIGlmIChhcmdjID09IDIgJiYgc3RyY21wKGFyZ3ZbMV0sICItLWxlZ2FjeSIpID09IDApIHsKKyAgICAgICAgbGVnYWN5Rm9ybWF0ID0gdHJ1ZTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJEdW1waW5nIGxlZ2FjeSBlZmZlY3QgY29uZmlnIGZpbGVcbiIpOworICAgIH0gZWxzZSBpZiAoKGFyZ2MgPT0gMiB8fCBhcmdjID09IDMpICYmIHN0cmNtcChhcmd2WzFdLCAiLS14bWwiKSA9PSAwKSB7CisgICAgICAgIGxlZ2FjeUZvcm1hdCA9IGZhbHNlOworICAgICAgICBpZiAoYXJnYyA9PSAzKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkR1bXBpbmcgWE1MIGVmZmVjdCBjb25maWcgZmlsZTogJXNcbiIsIHBhdGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJEdW1waW5nIGRlZmF1bHQgWE1MIGVmZmVjdCBjb25maWcgZmlsZS5cbiIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGFyZ3VtZW50cy5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJVc2FnZTogJXMgWy0tbGVnYWN5fC0teG1sIFtGSUxFXV1cbiIsIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoIWxlZ2FjeUZvcm1hdCkgeworICAgICAgICBzc2l6ZV90IHJldCA9IEVmZmVjdExvYWRYbWxFZmZlY3RDb25maWcocGF0aCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImxvYWRYbWxFZmZlY3RDb25maWcgZmFpbGVkLCBzZWUgbG9nY2F0IGZvciBkZXRhaWwuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9CisgICAgICAgIGlmIChyZXQgPiAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlBhcnRpYWxseSBmYWlsZWQgdG8gbG9hZCBjb25maWcuIFNraXBwZWQgJXp1IGVsZW1lbnRzLCAiCisgICAgICAgICAgICAgICAgICAgICJzZWUgbG9nY2F0IGZvciBkZXRhaWwuXG4iLCAoc2l6ZV90KXJldCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobGVnYWN5Rm9ybWF0KSB7CisgICAgICAgIGF1dG8gcmV0ID0gRWZmZWN0TG9hZEVmZmVjdENvbmZpZygpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJsb2FkRWZmZWN0Q29uZmlnIGZhaWxlZCwgc2VlIGxvZ2NhdCBmb3IgZGV0YWlsLlxuIik7CisgICAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgfQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImxlZ2FjeSBsb2FkRWZmZWN0Q29uZmlnIGhhcyBwcm9iYWJseSBzdWNjZWVkLCBzZWUgbG9nY2F0IHRvIG1ha2Ugc3VyZS5cbiIpOworICAgIH0KKworICAgIGlmIChFZmZlY3REdW1wRWZmZWN0cyhTVERPVVRfRklMRU5PKSAhPSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRWZmZWN0IGR1bXAgZmFpbGVkLCBzZWUgbG9nY2F0IGZvciBkZXRhaWwuXG4iKTsKKyAgICAgICAgcmV0dXJuIDQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5tawppbmRleCA4M2U4Mjg4Li45NDFlYjNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5tawpAQCAtNzIsMTkgKzcyLDI1IEBACiAgICAgQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMTYuYyBcCiAgICAgQ29tbW9uL3NyYy9Db3B5XzE2LmMgXAogICAgIENvbW1vbi9zcmMvTW9ub1RvMklfMTYuYyBcCisgICAgQ29tbW9uL3NyYy9Nb25vVG8ySV8zMi5jIFwKICAgICBDb21tb24vc3JjL0xvYWRDb25zdF8xNi5jIFwKKyAgICBDb21tb24vc3JjL0xvYWRDb25zdF8zMi5jIFwKICAgICBDb21tb24vc3JjL2RCX3RvX0xpbjMyLmMgXAogICAgIENvbW1vbi9zcmMvU2hpZnRfU2F0X3YxNnh2MTYuYyBcCisgICAgQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjMyeHYzMi5jIFwKICAgICBDb21tb24vc3JjL0Fic18zMi5jIFwKICAgICBDb21tb24vc3JjL0ludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYuYyBcCiAgICAgQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuYyBcCiAgICAgQ29tbW9uL3NyYy9tdWx0M3NfMTZ4MTYuYyBcCisgICAgQ29tbW9uL3NyYy9NdWx0M3NfMzJ4MTYuYyBcCiAgICAgQ29tbW9uL3NyYy9Ob25MaW5Db21wX0QxNi5jIFwKICAgICBDb21tb24vc3JjL0RlbGF5TWl4XzE2eDE2LmMgXAogICAgIENvbW1vbi9zcmMvTVNUbzJpX1NhdF8xNngxNi5jIFwKICAgICBDb21tb24vc3JjL0Zyb20yaVRvTVNfMTZ4MTYuYyBcCiAgICAgQ29tbW9uL3NyYy9NYWMzc19TYXRfMTZ4MTYuYyBcCisgICAgQ29tbW9uL3NyYy9NYWMzc19TYXRfMzJ4MTYuYyBcCiAgICAgQ29tbW9uL3NyYy9BZGQyX1NhdF8xNngxNi5jIFwKKyAgICBDb21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmMgXAogICAgIENvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQuYyBcCiAgICAgQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jIFwKICAgICBDb21tb24vc3JjL0xWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQuYyBcCkBAIC0xMjAsNyArMTI2LDcgQEAKICAgICAkKExPQ0FMX1BBVEgpL1N0ZXJlb1dpZGVuaW5nL3NyYyBcCiAgICAgJChMT0NBTF9QQVRIKS9TdGVyZW9XaWRlbmluZy9saWIKIAotTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KK0xPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuIC1EQlVJTERfRkxPQVQgLURISUdIRVJfRlMKIExPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2Vycm9yCiAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKQEAgLTE3OSw2ICsxODUsNyBAQAogICAgICQoTE9DQUxfUEFUSCkvQ29tbW9uL2xpYiBcCiAgICAgJChMT0NBTF9QQVRIKS9Db21tb24vc3JjCiAKLUxPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCitMT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbiAtREJVSUxEX0ZMT0FUIC1ESElHSEVSX0ZTCiBMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oCmluZGV4IDIyODk3N2QuLjRjMmI5NTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oCkBAIC0xOTgsNiArMTk4LDEwIEBACiAjZGVmaW5lIExWREJFX0NBUF9GU18zMjAwMCAgICAgICAgICAgICAgIDY0CiAjZGVmaW5lIExWREJFX0NBUF9GU180NDEwMCAgICAgICAgICAgICAgIDEyOAogI2RlZmluZSBMVkRCRV9DQVBfRlNfNDgwMDAgICAgICAgICAgICAgICAyNTYKKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzk2MDAwICAgICAgICAgICAgICAgNTEyCisjZGVmaW5lIExWREJFX0NBUF9GU18xOTIwMDAgICAgICAgICAgICAgIDEwMjQKKyNlbmRpZgogCiB0eXBlZGVmIGVudW0KIHsKQEAgLTIxMCw2ICsyMTQsMTAgQEAKICAgICBMVkRCRV9GU18zMjAwMCA9IDYsCiAgICAgTFZEQkVfRlNfNDQxMDAgPSA3LAogICAgIExWREJFX0ZTXzQ4MDAwID0gOCwKKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyAgICBMVkRCRV9GU185NjAwMCA9IDksCisgICAgTFZEQkVfRlNfMTkyMDAwID0gMTAsCisjZW5kaWYKICAgICBMVkRCRV9GU19NQVggICA9IExWTV9NQVhJTlRfMzIKIH0gTFZEQkVfRnNfZW47CiAKQEAgLTQ1MCwxMiArNDU4LDE3IEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX1Byb2Nlc3MoTFZEQkVfSGFuZGxlX3QgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICBOdW1TYW1wbGVzKTsKKyNlbHNlCiBMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfUHJvY2VzcyhMVkRCRV9IYW5kbGVfdCAgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICpwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgIE51bVNhbXBsZXMpOwotCisjZW5kaWYKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmgKaW5kZXggYjFlYmFkZi4uZjMyZWQzMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db2VmZnMuaApAQCAtMTksNiArMTksNyBAQAogI2RlZmluZSBfX0xWREJFX0NPRUZGU19IX18KIAogCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEdlbmVyYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01MTQsNSArNTE1LDYzMiBAQAogI2RlZmluZSBNSVhfVENfRnM0NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjA5NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc5NTE1ICovCiAjZGVmaW5lIE1JWF9UQ19GczQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMTUwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODExNTAgKi8KIAorI2Vsc2UgLypCVUlMRF9GTE9BVCovCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogR2VuZXJhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExWREJFX1NDQUxFU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogSGlnaCBQYXNzIEZpbHRlciBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDU1SHogKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgMC45NTg4NDlmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgIC0xLjkxNzY5OGYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAgMC45NTg4NDlmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0xLjkzOTAwMWYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAgMC45NDA4MDdmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTY2OTA5ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45MzM4MThmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTY2OTA5ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NTU3MzJmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTU2NjkwZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk2ODY1MGYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTM3MzAwZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk2ODY1MGYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTU5MzI3ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk2MDEzOGYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NzM1ODhmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk0NzE3NmYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzM1ODhmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2OTQ5NGYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45Njk5NTJmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTc3NjcxZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NTUzNDNmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc3NjcxZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45Nzc4NjNmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc4MTA1ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3ODU1MWYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTU3MTAyZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3ODU1MWYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTc5NjYyZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk3OTg2NmYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODEwNDJmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2MjA4NGYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODEwNDJmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk4NDc0NmYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ4NjFmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTgzMDk3ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NjYxOTRmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgzMDk3ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45ODg5MzFmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg4OTkyZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4MzUzOWYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTY3MDc5ZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4MzUzOWYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTg5ODMxZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4OTg4MmYKKworI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NjA0MGYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTcyMDgwZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NjA0MGYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTk0OTE1ZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5NDkyOGYKKworI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NzI5NGYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTc0NTg4ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NzI5NGYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTk3NDU4ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NzQ2MWYKICNlbmRpZgorCisKKyAvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgNjZIeiAqLworI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAwLjk1MzAxNmYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAgLTEuOTA2MDMyZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAwLjk1MzAxNmYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAgLTEuOTI2ODEwZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAwLjkyOTM5NmYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NjI2MzhmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjkyNTI3NWYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjI2MzhmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk0Njg4MWYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NDgyNTZmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTY0NzE4ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45Mjk0MzVmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTY0NzE4ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NTExOTZmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTUyMzU5ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3MDYyMmYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTQxMjQ0ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3MDYyMmYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTYzMzk0ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk2NDA1MmYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NzU1MDlmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk1MTAxOWYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzU1MDlmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk3MzQzNmYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzM3ODRmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTc2NTYzZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NTMxMjVmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc2NTYzZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NzU1OTRmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc1ODg5ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3OTU0N2YKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTU5MDkzZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3OTU0N2YKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTgxNjk1ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4MTg2MWYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODIwMTBmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2NDAxOWYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODIwMTBmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk4NjcxOGYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODY4MDVmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTgyNTQwZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NjUwNzlmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgyNTQwZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45ODc3OTdmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg3ODcxZgorCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1NTM5ZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NzEwNzdmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1NTM5ZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45OTM4OThmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkzOTE3ZgorCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg3MDQzZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45NzQwODZmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg3MDQzZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTY5NDlmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2OTU0ZgorI2VuZGlmCisKKy8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA3OEh6ICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDAuOTQ2NjkzZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMS44OTMzODdmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTQ2NjkzZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICAtMS45MTM1MTdmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTE3MTA1ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk1Nzk5OWYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTE1OTk4ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk1Nzk5OWYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTM3MjI5ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjkzOTE0MGYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NjA0NDZmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjkyMDg5MmYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjA0NDZmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk0MjMyNmYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NDM5NDRmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTY3Mzk3ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45MzQ3OTRmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTY3Mzk3ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NTY3NDBmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTU3NjU2ZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3MzE1NmYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTQ2MzEzZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3MzE1NmYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTY4NjA3ZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk2OTA5MmYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NzQzOThmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk0ODc5N2YKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzQzOThmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk3MTE1N2YKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzE1NjhmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTc3OTE4ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NTU4MzZmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc3OTE4ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NzgzNjdmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc4NTk5ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4MDgyNGYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTYxNjQ5ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4MDgyNGYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTg0MzAzZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDQyNWYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODE0NTBmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2MjkwMGYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODE0NTBmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk4NTU3OGYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODU2ODFmCisKKyNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ5OTJmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2OTk4NGYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ5OTJmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk5Mjc4OWYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTI4MTVmCisKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODY3NjlmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjk3MzUzOWYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODY3NjlmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5NjM5NGYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTY0MDFmCisjZW5kaWYKKworLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDkwSHogKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk0MDQxMmYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAtMS44ODA4MjVmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NDA0MTJmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTAwMjMxZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTA0OTc3ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTUzMzgzZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjkwNjc2NmYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk1MzM4M2YKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45Mjc1NzlmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45MzAxMTFmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45NTYxOTNmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTEyMzg3ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTU2MTkzZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjkzMzQ1OWYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjkzNTYwM2YKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk2NDE4M2YKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45MjgzNjVmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45NjQxODNmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTUwMDg3ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTUxMzAzZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTcwODA5ZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjk0MTYxOGYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk3MDgwOWYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45NjM3NzhmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NjQ0MjNmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45NzIyMzlmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTQ0NDc3ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTcyMjM5ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk2NjcyMWYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk2NzI2NmYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk3NjI5MmYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45NTI1ODRmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45NzYyOTJmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTc1MDQwZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTc1MzQ3ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTc5NjQxZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjk1OTI4MmYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk3OTY0MWYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45ODE4ODhmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45ODIwNTBmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODAzNjJmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTYwNzI0ZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTgwMzYyZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk4MzM1OWYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk4MzQ5N2YKKworI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDQ0NmYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTY4ODkyZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDQ0NmYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTkxNjgwZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MTcxNGYKKworI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NjQ5NmYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTcyOTkyZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NjQ5NmYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTk1ODQwZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NTg0OGYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEJhbmQgUGFzcyBGaWx0ZXIgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDU1SHogKi8KKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjAwOTE5N2YKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDkxOTdmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTc5NTQ1ZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgxMzkzZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDA2NjkxZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwNjY5MWYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45ODU0ODhmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45ODY0NjRmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDYxNTBmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDA2MTUwZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk4NjczM2YKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NzU1N2YKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwNDYyMGYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDQ2MjBmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTkwMTg5ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTkwNjUzZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAzMzU3ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMzM1N2YKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTI5NjRmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTMyMDlmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDMwODVmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDAzMDg1ZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5MzU1MmYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5Mzc1OWYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMjMxNWYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDIzMTVmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTk1MTk5ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk1MzE2ZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAxNjgxZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMTY4MWYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTY1MzdmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTY1OTlmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDE1NDVmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDAxNTQ1ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5NjgyM2YKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5Njg3NWYKKworI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAwNzYyZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDc2MmYKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTg0NjFmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTg0NzdmCisKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMDM4MWYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDAzODFmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTk5MjM0ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk5MjM4ZgorI2VuZGlmCisKKy8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA2Nkh6ICovCisjZGVmaW5lIEJQRl9GczgwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAxMjY0OGYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDEyNjQ4ZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTcxNzYwZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NzQ0MTJmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwOTIwOWYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDA5MjA5ZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTc5OTY2ZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45ODEzNjhmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwODQ2OGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDA4NDY4ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTgxNjg1ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45ODI4NjlmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwNjM2NGYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDA2MzY0ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTg2NDU3ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45ODcxMjRmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwNDYyNmYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDA0NjI2ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTkwMjg4ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTA2NDFmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwNDI1MmYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDA0MjUyZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTkxMTAwZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTEzOThmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMzE5MmYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDAzMTkyZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTkzMzc0ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTM1NDFmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMjMxOGYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDAyMzE4ZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTk1MjIxZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTUzMDlmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMjEzMWYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDAyMTMxZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTk1NjE1ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTU2OTBmCisKKyNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAxMDU1ZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDEwNTVmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAtMS45OTc4NjhmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5Nzg5MWYKKworI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgMC4wMDA1MjhmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgLTAuMDAwNTI4ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAtMS45OTg5MzlmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAwLjk5ODk0NWYKKyNlbmRpZgorCisvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgNzhIeiAqLworI2RlZmluZSBCUEZfRnM4MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMTg1NzJmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAxODU3MmYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk1ODc0NWYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTYyNDI3ZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMTM1NDVmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAxMzU0NWYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk3MDY0N2YKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTcyNTk2ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMTI0NThmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAxMjQ1OGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk3MzE0OGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTc0Nzk1ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDkzNzNmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwOTM3M2YKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk4MDEwOGYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTgxMDM3ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDY4MTlmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwNjgxOWYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk4NTcxNGYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTg2MjA0ZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDYyNjhmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwNjI2OGYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk4NjkwNGYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTg3MzE4ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDQ3MDlmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwNDcwOWYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5MDI0MGYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTkwNDczZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDM0MjFmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwMzQyMWYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5Mjk1NWYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTkzMDc4ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDMxNDRmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwMzE0NGYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5MzUzNWYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTkzNjM5ZgorCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMTU1NWYKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAtMC4wMDE1NTU1ZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAtMS45OTY4NjBmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5Njg5MWYKKworI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgMC4wMDA3NzhmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgLTAuMDAwNzc4ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAtMS45OTg0MzdmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAwLjk5ODQ0NGYKKyNlbmRpZgorCisvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgOTBIeiAqLworI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMDIyNzYwZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgIC0wLjAyMjc2MGYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45NDkwNzNmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NTM5NTNmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMTY2MTlmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDE2NjE5ZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk2Mzc5MWYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk2NjM3N2YKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAxNTI4OWYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMTUyODlmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTY2ODgyZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTY5MDY3ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDExNTExZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAxMTUxMWYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45NzU0NzdmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NzY3MTFmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDgzNzlmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDA4Mzc5ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk4MjM5NWYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk4MzA0N2YKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwNzcwNGYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDc3MDRmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTgzODYzZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTg0NDE0ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDA1Nzg5ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwNTc4OWYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45ODc5NzdmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45ODgyODhmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDQyMDdmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDA0MjA3ZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5MTMyNGYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5MTQ4OGYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMzg2N2YKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDM4NjdmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTkyMDM4ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTkyMTc3ZgorCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDE5MTNmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDE5MTNmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAtMS45OTYxMzRmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTYxNzRmCisKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMDk1OGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgIC0wLjAwMDk1OGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgIC0xLjk5ODA3NWYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5ODA4NWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEF1dG9tYXRpYyBHYWluIENvbnRyb2wgdGltZSBjb25zdGFudHMgYW5kIGdhaW4gc2V0dGluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQUdDIFRpbWUgY29uc3RhbnRzICovCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnM4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjg0MTM5NWYKKyNkZWZpbmUgQUdDX0FUVEFDS19GczExMDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuODgyMjIzZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzMTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC44OTEyNTFmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMxNjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjkxNzI3NmYKKyNkZWZpbmUgQUdDX0FUVEFDS19GczIyMDUwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTM5MjY3ZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzMjQwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45NDQwNjFmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMzMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk1Nzc0NWYKKyNkZWZpbmUgQUdDX0FUVEFDS19GczQ0MTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTY5MTU4ZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45NzE2MjhmCisKKyNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQUdDX0FUVEFDS19Gczk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTcxMmYKKyNkZWZpbmUgQUdDX0FUVEFDS19GczE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5MjgzMGYKKyNlbmRpZgorCisjZGVmaW5lIERFQ0FZX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMAorCisjZGVmaW5lIEFHQ19ERUNBWV9GczgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDA0MmYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzMTEwMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDMwZgorI2RlZmluZSBBR0NfREVDQVlfRnMxMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMjhmCisjZGVmaW5lIEFHQ19ERUNBWV9GczE2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAyMWYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzMjIwNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDE1ZgorI2RlZmluZSBBR0NfREVDQVlfRnMyNDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMTRmCisjZGVmaW5lIEFHQ19ERUNBWV9GczMyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAxMGYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzNDQxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDA4ZgorI2RlZmluZSBBR0NfREVDQVlfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDdmCisKKyNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZTOTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDM1ZgorI2RlZmluZSBBR0NfREVDQVlfRlMxOTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAxNzVmCisjZW5kaWYKKworLyogQUdDIEdhaW4gc2V0dGluZ3MgKi8KKyNkZWZpbmUgQUdDX0dBSU5fU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgQUdDX0dBSU5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgQUdDX1RBUkdFVExFVkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg4NTUzZgorI2RlZmluZSBBR0NfSFBGR0FJTl8wZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40MTI1MzhmCisjZGVmaW5lIEFHQ19HQUlOXzBkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fMWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTg0ODkzZgorI2RlZmluZSBBR0NfR0FJTl8xZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjIwMThmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzJkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjc3ODI3OWYKKyNkZWZpbmUgQUdDX0dBSU5fMmRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjU4OTI1ZgorI2RlZmluZSBBR0NfSFBGR0FJTl8zZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTUyNjJmCisjZGVmaW5lIEFHQ19HQUlOXzNkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjQxMjUzOGYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fNGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjM4NzIxZgorI2RlZmluZSBBR0NfR0FJTl80ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41ODQ4OTNmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzVkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjUxMTg4NmYKKyNkZWZpbmUgQUdDX0dBSU5fNWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNzc4Mjc5ZgorI2RlZmluZSBBR0NfSFBGR0FJTl82ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS44MTgzODNmCisjZGVmaW5lIEFHQ19HQUlOXzZkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5NTI2MmYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fN2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMTYyMjc4ZgorI2RlZmluZSBBR0NfR0FJTl83ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMzg3MjFmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzhkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjU0ODEzNGYKKyNkZWZpbmUgQUdDX0dBSU5fOGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNTExODg2ZgorI2RlZmluZSBBR0NfSFBGR0FJTl85ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi45ODEwNzJmCisjZGVmaW5lIEFHQ19HQUlOXzlkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjgxODM4M2YKKyNkZWZpbmUgQUdDX0hQRkdBSU5fMTBkQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNDY2ODM2ZgorI2RlZmluZSBBR0NfR0FJTl8xMGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4xNjIyNzhmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzExZEIgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjAxMTg3MmYKKyNkZWZpbmUgQUdDX0dBSU5fMTFkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNTQ4MTM0ZgorI2RlZmluZSBBR0NfSFBGR0FJTl8xMmRCICAgICAgICAgICAgICAgICAgICAgICAgICAgNC42MjM0MTNmCisjZGVmaW5lIEFHQ19HQUlOXzEyZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjk4MTA3MmYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fMTNkQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDUuMzA5NTczZgorI2RlZmluZSBBR0NfR0FJTl8xM2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy40NjY4MzZmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzE0ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICA2LjA3OTQ1OGYKKyNkZWZpbmUgQUdDX0dBSU5fMTRkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuMDExODcyZgorI2RlZmluZSBBR0NfSFBGR0FJTl8xNWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgNi45NDMyODJmCisjZGVmaW5lIEFHQ19HQUlOXzE1ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjYyMzQxM2YKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBWb2x1bWUgY29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFZvbHVtZSBjb250cm9sIGdhaW4gKi8KKyNkZWZpbmUgVk9MVU1FX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBJbiBkQnMgKi8KKyNkZWZpbmUgVk9MVU1FX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBJbiBkQnMgKi8KKworLyogVm9sdW1lIGNvbnRyb2wgdGltZSBjb25zdGFudHMgKi8KKyNkZWZpbmUgVk9MX1RDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgVk9MX1RDX0ZzODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMjQ2OTBmCisjZGVmaW5lIFZPTF9UQ19GczExMDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDE3OTc3ZgorI2RlZmluZSBWT0xfVENfRnMxMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAxNjUyOWYKKyNkZWZpbmUgVk9MX1RDX0ZzMTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMTI0MjJmCisjZGVmaW5lIFZPTF9UQ19GczIyMDUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA5MDI5ZgorI2RlZmluZSBWT0xfVENfRnMyNDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwODI5OWYKKyNkZWZpbmUgVk9MX1RDX0ZzMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDYyMzFmCisjZGVmaW5lIFZPTF9UQ19GczQ0MTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA0NTI1ZgorI2RlZmluZSBWT0xfVENfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwNDE1OGYKKyNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgVk9MX1RDX0ZzOTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDIwNzlmCisjZGVmaW5lIFZPTF9UQ19GczE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAxMDM5ZgorI2VuZGlmCisjZGVmaW5lIE1JWF9UQ19GczgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5MzY1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC44OTYxNTEgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMTEwMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAyMzAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjkyMjU0OCAqLworI2RlZmluZSBNSVhfVENfRnMxMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDQyMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTI4NDE1ICovCisjZGVmaW5lIE1JWF9UQ19GczE2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwOTc4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NDUzODcgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMjIwNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE0NTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk1OTgwNCAqLworI2RlZmluZSBNSVhfVENfRnMyNDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTU1NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTYyOTU2ICovCisjZGVmaW5lIE1JWF9UQ19GczMyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxODUwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzE5NzMgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzNDQxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwOTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3OTUxNSAqLworI2RlZmluZSBNSVhfVENfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjE1MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgxMTUwICovCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIE1JWF9UQ19Gczk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyNDU2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTA1MzAgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMTkyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzI2MTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5MjUyNCAqLworI2VuZGlmCisKKyNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db250cm9sLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29udHJvbC5jCmluZGV4IGI2NjMyYTMuLmZkNDAxNmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db250cm9sLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvbnRyb2wuYwpAQCAtMTA3LDM1ICsxMDcsNjggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKIHsKIAorI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQogICAgIC8qCiAgICAgICogQ2FsY3VsYXRlIHRoZSB0YWJsZSBvZmZzZXRzCiAgICAgICovCi0gICAgTFZNX1VJTlQxNiBPZmZzZXQgPSAoTFZNX1VJTlQxNikoKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZSArIChMVk1fVUlOVDE2KShwUGFyYW1zLT5DZW50cmVGcmVxdWVuY3kgKiAoMStMVkRCRV9GU180ODAwMCkpKTsKLQorICAgIExWTV9VSU5UMTYgT2Zmc2V0ID0gKExWTV9VSU5UMTYpKChMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGUgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikocFBhcmFtcy0+Q2VudHJlRnJlcXVlbmN5ICogKDErTFZEQkVfRlNfMTkyMDAwKSkpOworI2Vsc2UKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgdGFibGUgb2Zmc2V0cworICAgICAqLworICAgIExWTV9VSU5UMTYgT2Zmc2V0ID0gKExWTV9VSU5UMTYpKChMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGUgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikocFBhcmFtcy0+Q2VudHJlRnJlcXVlbmN5ICogKDErTFZEQkVfRlNfNDgwMDApKSk7ICAgIAorI2VuZGlmCiAKICAgICAvKgogICAgICAqIFNldHVwIHRoZSBoaWdoIHBhc3MgZmlsdGVyCiAgICAgICovCi0gICAgTG9hZENvbnN0XzE2KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBoaXN0b3J5LCB2YWx1ZSAwICovCi0gICAgICAgICAgICAgICAgICh2b2lkICopJnBJbnN0YW5jZS0+cERhdGEtPkhQRlRhcHMsICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCisgICAgTG9hZENvbnN0XzE2KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBoaXN0b3J5LCB2YWx1ZSAwICovCisgICAgICAgICAgICAgICAgICh2b2lkICopJnBJbnN0YW5jZS0+cERhdGEtPkhQRlRhcHMsICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBJbnN0YW5jZS0+cERhdGEtPkhQRlRhcHMpL3NpemVvZihMVk1fSU5UMTYpKTsgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KLSAgICBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPnBDb2VmLT5IUEZJbnN0YW5jZSwgICAgICAgICAvKiBJbml0aWFsaXNlIHRoZSBmaWx0ZXIgKi8KKyNlbHNlCisgICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIGhpc3RvcnksIHZhbHVlIDAgKi8KKyAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZwSW5zdGFuY2UtPnBEYXRhLT5IUEZUYXBzLCAgICAgICAgICAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICAgICBzaXplb2YocEluc3RhbmNlLT5wRGF0YS0+SFBGVGFwcykgLyBzaXplb2YoTFZNX0ZMT0FUKSk7IC8qIE51bWJlciBvZiB3b3JkcyAqLworI2VuZGlmCisjaWZuZGVmIEJVSUxEX0ZMT0FUCisgICAgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5wQ29lZi0+SFBGSW5zdGFuY2UsICAgIC8qIEluaXRpYWxpc2UgdGhlIGZpbHRlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cERhdGEtPkhQRlRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQlFfQzMyX0NvZWZzX3QgKikmTFZEQkVfSFBGX1RhYmxlW09mZnNldF0pOworI2Vsc2UKKyAgICBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPnBDb2VmLT5IUEZJbnN0YW5jZSwgICAgLyogSW5pdGlhbGlzZSB0aGUgZmlsdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wRGF0YS0+SFBGVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCUV9GTE9BVF9Db2Vmc190ICopJkxWREJFX0hQRl9UYWJsZVtPZmZzZXRdKTsKKyNlbmRpZgogCiAKICAgICAvKgogICAgICAqIFNldHVwIHRoZSBiYW5kIHBhc3MgZmlsdGVyCiAgICAgICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgTG9hZENvbnN0XzE2KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBoaXN0b3J5LCB2YWx1ZSAwICovCi0gICAgICAgICAgICAgICAgICh2b2lkICopJnBJbnN0YW5jZS0+cERhdGEtPkJQRlRhcHMsICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDpcCisgICAgICAgICAgICAgICAgICh2b2lkICopJnBJbnN0YW5jZS0+cERhdGEtPkJQRlRhcHMsICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCiAgICAgICAgICAgICAgICAgIHNpemVvZihwSW5zdGFuY2UtPnBEYXRhLT5CUEZUYXBzKS9zaXplb2YoTFZNX0lOVDE2KSk7ICAgLyogTnVtYmVyIG9mIHdvcmRzICovCisjZWxzZQorICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaGlzdG9yeSwgdmFsdWUgMCAqLworICAgICAgICAgICAgICAgICAodm9pZCAqKSZwSW5zdGFuY2UtPnBEYXRhLT5CUEZUYXBzLCAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICAgICAgIHNpemVvZihwSW5zdGFuY2UtPnBEYXRhLT5CUEZUYXBzKSAvIHNpemVvZihMVk1fRkxPQVQpKTsgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKyNlbmRpZgorI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQoJnBJbnN0YW5jZS0+cENvZWYtPkJQRkluc3RhbmNlLCAgICAgICAgIC8qIEluaXRpYWxpc2UgdGhlIGZpbHRlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cERhdGEtPkJQRlRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQlBfQzMyX0NvZWZzX3QgKikmTFZEQkVfQlBGX1RhYmxlW09mZnNldF0pOwotCisjZWxzZQorICAgIEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQoJnBJbnN0YW5jZS0+cENvZWYtPkJQRkluc3RhbmNlLCAgICAvKiBJbml0aWFsaXNlIHRoZSBmaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBEYXRhLT5CUEZUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJQX0ZMT0FUX0NvZWZzX3QgKikmTFZEQkVfQlBGX1RhYmxlW09mZnNldF0pOworI2VuZGlmCiB9CiAKIApAQCAtMTc1LDcgKzIwOCw5IEBACiAgICAgewogICAgICAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5BR0NfTWF4R2FpbiAgID0gTFZEQkVfQUdDX0dBSU5fVGFibGVbKExWTV9VSU5UMTYpcFBhcmFtcy0+RWZmZWN0TGV2ZWxdOyAgICAgLyogSGlnaCBwYXNzIGZpbHRlciBvZmYgKi8KICAgICB9CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX0dhaW5TaGlmdCA9IEFHQ19HQUlOX1NISUZUOworI2VuZGlmCiAgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX1RhcmdldCA9IEFHQ19UQVJHRVRMRVZFTDsKIAogfQpAQCAtMjEyLDYgKzI0Nyw5IEBACiAgICAgTFZNX1VJTlQxNiAgICAgIGRCT2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGFibGUgb2Zmc2V0ICovCiAgICAgTFZNX0lOVDE2ICAgICAgIFZvbHVtZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVxdWlyZWQgdm9sdW1lIGluIGRCcyAqLwogCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVk1fRkxPQVQgICAgICAgIGRCU2hpZnRzX2ZhYzsKKyNlbmRpZgogICAgIC8qCiAgICAgICogQXBwbHkgdGhlIHZvbHVtZSBpZiBlbmFibGVkCiAgICAgICovCkBAIC0yMzcsMzMgKzI3NSw1OCBAQAogICAgIGRCT2Zmc2V0ID0gKExWTV9VSU5UMTYpKDYgKyBWb2x1bWUgJSA2KTsgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgZEJzIDAtNSAqLwogICAgIGRCU2hpZnRzID0gKExWTV9VSU5UMTYpKFZvbHVtZSAvIC02KTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgNmRCIHNoaWZ0cyAqLwogCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIGRCU2hpZnRzX2ZhYyA9IChMVk1fRkxPQVQpKDEgPDwgZEJTaGlmdHMpOworI2VuZGlmCiAgICAgLyoKICAgICAgKiBXaGVuIERCRSBpcyBlbmFibGVkIHVzZSBBR0Mgdm9sdW1lCiAgICAgICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0ID0gKChMVk1fSU5UMzIpTFZEQkVfVm9sdW1lVGFibGVbZEJPZmZzZXRdIDw8IDE2KTsKICAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5UYXJnZXQgPSBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5UYXJnZXQgPj4gZEJTaGlmdHM7Ci0KKyNlbHNlCisgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0ID0gKExWREJFX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSk7CisgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0ID0gcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0IC8gZEJTaGlmdHNfZmFjOworI2VuZGlmCiAgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVm9sdW1lVEMgICAgPSBMVkRCRV9Wb2x1bWVUQ1RhYmxlWyhMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGVdOyAgIC8qIFZvbHVtZSB1cGRhdGUgdGltZSBjb25zdGFudCAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlZvbHVtZVNoaWZ0ID0gVk9MVU1FX1NISUZUKzE7CisjZW5kaWYKIAogICAgIC8qCiAgICAgICogV2hlbiBEQkUgaXMgZGlzYWJsZWQgdXNlIHRoZSBieXBhc3Mgdm9sdW1lIGNvbnRyb2wKICAgICAgKi8KICAgICBpZihkQlNoaWZ0cyA+IDApCiAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUuTWl4ZXJTdHJlYW1bMF0sKCgoTFZNX0lOVDMyKUxWREJFX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSkgPj4gZEJTaGlmdHMpKTsKKyNlbHNlCisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9Wb2x1bWVUYWJsZVtkQk9mZnNldF0gLyBkQlNoaWZ0c19mYWMpOworI2VuZGlmCiAgICAgfQogICAgIGVsc2UKICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZS5NaXhlclN0cmVhbVswXSwoTFZNX0lOVDMyKUxWREJFX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSk7CisjZWxzZQorICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUuTWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfVm9sdW1lVGFibGVbZEJPZmZzZXRdKTsKKyNlbmRpZgogICAgIH0KIAogICAgIHBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZS5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IDE7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLk1peGVyU3RyZWFtWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9NSVhFUl9UQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9Gc19lbilwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsKKyNlbHNlCisgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9NSVhFUl9UQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9Gc19lbilwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsKKyNlbmRpZgogfQogCiAKQEAgLTMwOSw3ICszNzIsMTEgQEAKIHsKIAogICAgIExWREJFX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9KExWREJFX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIExWTWl4ZXIzXzJTdF9zdCAgICAgKnBCeXBhc3NNaXhlcl9JbnN0YW5jZSA9ICZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlcjsKKyNlbHNlCisgICAgTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICAgICAqcEJ5cGFzc01peGVyX0luc3RhbmNlID0gJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyOworI2VuZGlmCiAKIAogICAgIC8qCkBAIC0zMzIsMTIgKzM5OSwxOSBAQAogICAgIHsKICAgICAgICAgTFZEQkVfU2V0QUdDKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLwogICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOZXcgcGFyYW1ldGVycyAqLwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sCiAgICAgICAgICAgICBMVkRCRV9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOwogCiAgICAgICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sCiAgICAgICAgICAgICBMVkRCRV9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOworI2Vsc2UKKyAgICAgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgIExWREJFX0JZUEFTU19NSVhFUl9UQywoTFZNX0ZzX2VuKXBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOworCisgICAgICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sCisgICAgICAgICAgICBMVkRCRV9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKKyNlbmRpZgogCiAKICAgICB9CkBAIC0zNTcsMTMgKzQzMSwyMyBAQAogCiAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGU9PUxWREJFX09OICYmIHBQYXJhbXMtPk9wZXJhdGluZ01vZGU9PUxWREJFX09GRikKICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLDApOwogICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwweDAwMDA3RkZGKTsKKyNlbHNlCisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLCAwKTsKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sIDEuMGYpOworI2VuZGlmCiAgICAgfQogICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlPT1MVkRCRV9PRkYgJiYgcFBhcmFtcy0+T3BlcmF0aW5nTW9kZT09TFZEQkVfT04pCiAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwweDAwMDA3RkZGKTsKICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sMCk7CisjZWxzZQorICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwgMS4wZik7CisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLCAwKTsKKyNlbmRpZgogICAgIH0KIAogICAgIC8qCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuYwppbmRleCBhMzYyM2JjLi4zZmZmMmEyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmMKQEAgLTgwLDcgKzgwLDExIEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIERhdGEgbWVtb3J5CiAgICAgICAgICAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlNpemUgICA9IHNpemVvZihMVkRCRV9EYXRhX0ZMT0FUX3QpOworI2Vsc2UKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uU2l6ZSAgICAgICAgID0gc2l6ZW9mKExWREJFX0RhdGFfdCk7CisjZW5kaWYKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uQWxpZ25tZW50ICAgID0gTFZEQkVfUEVSU0lTVEVOVF9EQVRBX0FMSUdOOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVkRCRV9QRVJTSVNURU5UX0RBVEE7CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwpAQCAtODgsNyArOTIsMTEgQEAKICAgICAgICAgLyoKICAgICAgICAgICogQ29lZiBtZW1vcnkKICAgICAgICAgICovCi0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUgICAgICAgICA9IHNpemVvZihMVkRCRV9Db2VmX3QpOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUgICA9IHNpemVvZihMVkRCRV9Db2VmX0ZMT0FUX3QpOworI2Vsc2UKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgICAgICAgID0gc2l6ZW9mKExWREJFX0NvZWZfdCk7ICAgCisjZW5kaWYKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uQWxpZ25tZW50ICAgID0gTFZEQkVfUEVSU0lTVEVOVF9DT0VGX0FMSUdOOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5UeXBlICAgICAgICAgPSBMVkRCRV9QRVJTSVNURU5UX0NPRUY7CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwpAQCAtOTYsNyArMTA0LDEyIEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIFNjcmF0Y2ggbWVtb3J5CiAgICAgICAgICAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIFNjcmF0Y2hTaXplID0gKExWTV9VSU5UMzIpKExWREJFX1NDUkFUQ0hCVUZGRVJTX0lOUExBQ0Uqc2l6ZW9mKExWTV9GTE9BVCkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKTsKKyNlbHNlIC8qQlVJTERfRkxPQVQqLwogICAgICAgICBTY3JhdGNoU2l6ZSA9IChMVk1fVUlOVDMyKShMVkRCRV9TQ1JBVENIQlVGRkVSU19JTlBMQUNFKnNpemVvZihMVk1fSU5UMTYpKnBDYXBhYmlsaXRpZXMtPk1heEJsb2NrU2l6ZSk7CisjZW5kaWYKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLlNpemUgICAgICAgICA9IFNjcmF0Y2hTaXplOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0uQWxpZ25tZW50ICAgID0gTFZEQkVfU0NSQVRDSF9BTElHTjsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLlR5cGUgICAgICAgICA9IExWREJFX1NDUkFUQ0g7CkBAIC0xNTEsMTAgKzE2NCwxNiBAQAogewogCiAgICAgTFZEQkVfSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2U7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVk1peGVyM18xU3RfRkxPQVRfc3QgICAgICAgKnBNaXhlcl9JbnN0YW5jZTsKKyAgICBMVk1peGVyM18yU3RfRkxPQVRfc3QgICAgICAgKnBCeXBhc3NNaXhlcl9JbnN0YW5jZTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgTWl4R2FpbjsKKyNlbHNlCiAgICAgTFZNaXhlcjNfMVN0X3N0ICAgICAgICpwTWl4ZXJfSW5zdGFuY2U7CiAgICAgTFZNaXhlcjNfMlN0X3N0ICAgICAgICpwQnlwYXNzTWl4ZXJfSW5zdGFuY2U7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgIGk7CiAgICAgTFZNX0lOVDMyICAgICAgICAgICAgIE1peEdhaW47CisjZW5kaWYKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgaTsKIAogCiAgICAgLyoKQEAgLTIzNSw3ICsyNTQsMTEgQEAKICAgICAvLyBpbml0aWFsaXplIHRoZSBtaXhlciB3aXRoIHNvbWUgZml4ZXMgdmFsdWVzIHNpbmNlIG90aGVyd2lzZSBMVkRCRV9TZXRWb2x1bWUgZW5kcyB1cAogICAgIC8vIHJlYWRpbmcgdW5pbml0aWFsaXplZCBkYXRhCiAgICAgcE1peGVyX0luc3RhbmNlID0gJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZTsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBMVkNfTWl4ZXJfSW5pdCgmcE1peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSwweDAwMDA3RkZGLDB4MDAwMDdGRkYpOworI2Vsc2UKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcE1peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSwgMS4wLCAxLjApOworI2VuZGlmCiAKICAgICAvKgogICAgICAqIEluaXRpYWxpc2UgdGhlIHZvbHVtZQpAQCAtMjQ1LDkgKzI2OCwxMyBAQAogCiAgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVm9sdW1lID0gcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSBhcyB0aGUgdGFyZ2V0ICovCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBNaXhHYWluID0gTFZDX01peGVyX0dldFRhcmdldCgmcE1peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSk7CiAgICAgTFZDX01peGVyX0luaXQoJnBNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sTWl4R2FpbixNaXhHYWluKTsKKyNlbHNlCisgICAgTWl4R2FpbiA9IExWQ19NaXhlcl9HZXRUYXJnZXQoJnBNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pOworICAgIExWQ19NaXhlcl9Jbml0KCZwTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLCBNaXhHYWluLCBNaXhHYWluKTsKKyNlbmRpZgogCiAgICAgLyogQ29uZmlndXJlIHRoZSBtaXhlciBwcm9jZXNzIHBhdGggKi8KICAgICBwTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gPSAwOwpAQCAtMjY4LDkgKzI5NSwxMSBAQAogICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlID0gTFZNX05VTEw7CiAgICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgPSBMVk1fTlVMTDsKICAgICBwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0PTA7CisKICAgICBMVkNfTWl4ZXJfSW5pdCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSwwLDApOwogICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sCiAgICAgICAgIExWREJFX0JZUEFTU19NSVhFUl9UQywoTFZNX0ZzX2VuKXBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsMik7CisKICAgICAvKgogICAgICAqIFNldHVwIHRoZSBtaXhlciBnYWluIGZvciB0aGUgdW5wcm9jZXNzZWQgcGF0aAogICAgICAqLwpAQCAtMjc4LDkgKzMwNywxNSBAQAogICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucENhbGxiYWNrSGFuZGxlID0gTFZNX05VTEw7CiAgICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2sgPSBMVk1fTlVMTDsKICAgICBwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0PTA7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgTFZDX01peGVyX0luaXQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sMHgwMDAwN0ZGRiwweDAwMDA3RkZGKTsKICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLAogICAgICAgICBMVkRCRV9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLDIpOworI2Vsc2UKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwgMS4wLCAxLjApOworICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sCisgICAgICAgIExWREJFX0JZUEFTU19NSVhFUl9UQywoTFZNX0ZzX2VuKXBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsIDIpOworI2VuZGlmCiAKICAgICByZXR1cm4oTFZEQkVfU1VDQ0VTUyk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1ByaXZhdGUuaAppbmRleCA4MzM5ZDNjLi40ZTUyMDdmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcml2YXRlLmgKQEAgLTc3LDYgKzc3LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBEYXRhIHN0cnVjdHVyZSAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICAvKiBBR0MgcGFyYW1ldGVycyAqLwpAQCAtOTgsNyArOTksMjkgQEAKICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICAgQlBGSW5zdGFuY2U7ICAgICAgICAvKiBCYW5kIHBhc3MgZmlsdGVyIGluc3RhbmNlICovCiAKIH0gTFZEQkVfQ29lZl90OworI2Vsc2UKKy8qIERhdGEgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIEFHQyBwYXJhbWV0ZXJzICovCisgICAgQUdDX01JWF9WT0xfMlN0MU1vbl9GTE9BVF90ICAgQUdDSW5zdGFuY2U7ICAgICAgICAvKiBBR0MgaW5zdGFuY2UgcGFyYW1ldGVycyAqLwogCisgICAgLyogUHJvY2VzcyB2YXJpYWJsZXMgKi8KKyAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICAgSFBGVGFwczsgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyIHRhcHMgKi8KKyAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICAgQlBGVGFwczsgICAgICAgICAgICAvKiBCYW5kIHBhc3MgZmlsdGVyIHRhcHMgKi8KKyAgICBMVk1peGVyM18xU3RfRkxPQVRfc3QgICAgICAgICAgICAgQnlwYXNzVm9sdW1lOyAgICAgICAvKiBCeXBhc3Mgdm9sdW1lIHNjYWxlciAqLworICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgICAgICAgICAgICBCeXBhc3NNaXhlcjsgICAgICAgIC8qIEJ5cGFzcyBNaXhlciBmb3IgQ2xpY2sgUmVtb3ZhbCAqLworCit9IExWREJFX0RhdGFfRkxPQVRfdDsKKworLyogQ29lZnMgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIFByb2Nlc3MgdmFyaWFibGVzICovCisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAgIEhQRkluc3RhbmNlOyAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciBpbnN0YW5jZSAqLworICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgICBCUEZJbnN0YW5jZTsgICAgICAgIC8qIEJhbmQgcGFzcyBmaWx0ZXIgaW5zdGFuY2UgKi8KK30gTFZEQkVfQ29lZl9GTE9BVF90OworI2VuZGlmCiAvKiBJbnN0YW5jZSBzdHJ1Y3R1cmUgKi8KIHR5cGVkZWYgc3RydWN0CiB7CkBAIC0xMDgsOCArMTMxLDEzIEBACiAgICAgTFZEQkVfQ2FwYWJpbGl0aWVzX3QgICAgICAgIENhcGFiaWxpdGllczsgICAgICAgICAvKiBJbnN0YW5jZSBjYXBhYmlsaXRpZXMgKi8KIAogICAgIC8qIERhdGEgYW5kIGNvZWZmaWNpZW50IHBvaW50ZXJzICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgTFZEQkVfRGF0YV90ICAgICAgICAgICAgICAgICpwRGF0YTsgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgZGF0YSAqLwogICAgIExWREJFX0NvZWZfdCAgICAgICAgICAgICAgICAqcENvZWY7ICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGNvZWZmaWNpZW50cyAqLworI2Vsc2UKKyAgICBMVkRCRV9EYXRhX0ZMT0FUX3QgICAgICAgICAgICAgICAgKnBEYXRhOyAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBkYXRhICovCisgICAgTFZEQkVfQ29lZl9GTE9BVF90ICAgICAgICAgICAgICAgICpwQ29lZjsgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgY29lZmZpY2llbnRzICovCisjZW5kaWYKIH0gTFZEQkVfSW5zdGFuY2VfdDsKIAogCkBAIC0xMzYsNSArMTY0LDMgQEAKICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwogCiAjZW5kaWYgICAgICAvKiBfX0xWREJFX1BSSVZBVEVfSF9fICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmMKaW5kZXggNjlkNzlkMi4uMTBlYTcwMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1Byb2Nlc3MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSAiQUdDLmgiCiAjaW5jbHVkZSAiTFZEQkVfQ29lZmZzLmgiICAgICAgICAgICAgICAgLyogRmlsdGVyIGNvZWZmaWNpZW50cyAqLwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZEQkVfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTcyLDEzNiArNzEsMjM2IEBACiAvKiAgICAgb3ZlcmFsbCBlbmQgdG8gZW5kIGdhaW4gaXMgb2RCLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCitMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfUHJvY2VzcyhMVkRCRV9IYW5kbGVfdCBoSW5zdGFuY2UsCisgICAgY29uc3QgTFZNX0lOVDE2ICpwSW5EYXRhLCBMVk1fSU5UMTYgKnBPdXREYXRhLCBMVk1fVUlOVDE2IE51bVNhbXBsZXMpIHsKIAotTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX1Byb2Nlc3MoTFZEQkVfSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAqcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcykKKyAgTFZEQkVfSW5zdGFuY2VfdCAqcEluc3RhbmNlID0gKExWREJFX0luc3RhbmNlX3QgKikgaEluc3RhbmNlOworICBMVk1fSU5UMzIgKnBTY3JhdGNoID0KKyAgICAgIChMVk1fSU5UMzIgKikgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzczsKKyAgTFZNX0lOVDMyICpwTW9ubzsKKyAgTFZNX0lOVDE2ICpwSW5wdXQgPSAoTFZNX0lOVDE2ICopIHBJbkRhdGE7CisKKyAgLyogU2NyYXRjaCBmb3IgVm9sdW1lIENvbnRyb2wgc3RhcnRzIGF0IG9mZnNldCBvZiAyKk51bVNhbXBsZXMgc2hvcnQgdmFsdWVzIGZyb20gcFNjcmF0Y2ggKi8KKyAgTFZNX0lOVDE2ICpwU2NyYXRjaFZvbCA9IChMVk1fSU5UMTYgKikgKCZwU2NyYXRjaFtOdW1TYW1wbGVzXSk7CisKKyAgLyogU2NyYXRjaCBmb3IgTW9ubyBwYXRoIHN0YXJ0cyBhdCBvZmZzZXQgb2YgMipOdW1TYW1wbGVzIDMyLWJpdCB2YWx1ZXMgZnJvbSBwU2NyYXRjaCAqLworICBwTW9ubyA9ICZwU2NyYXRjaFsyICogTnVtU2FtcGxlc107CisKKyAgLyoKKyAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vdCB0b28gbGFyZ2UKKyAgICovCisgIGlmIChOdW1TYW1wbGVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKSB7CisgICAgcmV0dXJuIChMVkRCRV9UT09NQU5ZU0FNUExFUyk7CisgIH0KKworICAvKgorICAgKiBDaGVjayBpZiB0aGUgYWxnb3JpdGhtIGlzIGVuYWJsZWQKKyAgICovCisgIC8qIERCRSBwYXRoIGlzIHByb2Nlc3NlZCB3aGVuIERCRSBpcyBPTiBvciBkdXJpbmcgT24vT2ZmIHRyYW5zaXRpb25zICovCisgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVkRCRV9PTikKKyAgICAgIHx8IChMVkNfTWl4ZXJfR2V0Q3VycmVudCgKKyAgICAgICAgICAmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pCisgICAgICAgICAgIT0gTFZDX01peGVyX0dldFRhcmdldCgKKyAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKSkpIHsKKworICAgIC8qCisgICAgICogQ29udmVydCAxNi1iaXQgc2FtcGxlcyB0byAzMi1iaXQgYW5kIHNjYWxlCisgICAgICogKEZvciBhIDE2LWJpdCBpbXBsZW1lbnRhdGlvbiBhcHBseSBoZWFkcm9vbSBsb3NzIGhlcmUpCisgICAgICovCisgICAgSW50MTZMU2hpZnRUb0ludDMyXzE2eDMyKHBJbnB1dCwgLyogU291cmNlIDE2LWJpdCBkYXRhICAgICovCisgICAgcFNjcmF0Y2gsIC8qIERlc3QuIDMyLWJpdCBkYXRhICAgICAqLworICAgIChMVk1fSU5UMTYpICgyICogTnVtU2FtcGxlcyksIC8qIExlZnQgYW5kIHJpZ2h0ICAgICAgICAqLworICAgIExWREJFX1NDQUxFU0hJRlQpOyAvKiBTaGlmdCBzY2FsZSAgICAgICAgICAgKi8KKworICAgIC8qCisgICAgICogQXBwbHkgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgaWYgc2VsZWN0ZWQKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuSFBGU2VsZWN0ID09IExWREJFX0hQRl9PTikgeworICAgICAgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cENvZWYtPkhQRkluc3RhbmNlLC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICovCisgICAgICAoTFZNX0lOVDMyICopIHBTY3JhdGNoLCAvKiBTb3VyY2UgICAgICAgICAgICAgICAqLworICAgICAgKExWTV9JTlQzMiAqKSBwU2NyYXRjaCwgLyogRGVzdGluYXRpb24gICAgICAgICAgKi8KKyAgICAgIChMVk1fSU5UMTYpIE51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAqLworICAgIH0KKworICAgIC8qCisgICAgICogQ3JlYXRlIHRoZSBtb25vIHN0cmVhbQorICAgICAqLworICAgIEZyb20yaVRvTW9ub18zMihwU2NyYXRjaCwgLyogU3RlcmVvIHNvdXJjZSAgICAgICAgICovCisgICAgcE1vbm8sIC8qIE1vbm8gZGVzdGluYXRpb24gICAgICAqLworICAgIChMVk1fSU5UMTYpIE51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KKworICAgIC8qCisgICAgICogQXBwbHkgdGhlIGJhbmQgcGFzcyBmaWx0ZXIKKyAgICAgKi8KKyAgICBCUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMigmcEluc3RhbmNlLT5wQ29lZi0+QlBGSW5zdGFuY2UsIC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICAqLworICAgIChMVk1fSU5UMzIgKikgcE1vbm8sIC8qIFNvdXJjZSAgICAgICAgICAgICAgICAqLworICAgIChMVk1fSU5UMzIgKikgcE1vbm8sIC8qIERlc3RpbmF0aW9uICAgICAgICAgICAqLworICAgIChMVk1fSU5UMTYpIE51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KKworICAgIC8qCisgICAgICogQXBwbHkgdGhlIEFHQyBhbmQgbWl4CisgICAgICovCisgICAgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKCZwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZSwgLyogSW5zdGFuY2UgcG9pbnRlciAgICAgICovCisgICAgcFNjcmF0Y2gsIC8qIFN0ZXJlbyBzb3VyY2UgICAgICAgICAqLworICAgIHBNb25vLCAvKiBNb25vIGJhbmQgcGFzcyBzb3VyY2UgKi8KKyAgICBwU2NyYXRjaCwgLyogU3RlcmVvIGRlc3RpbmF0aW9uICAgICovCisgICAgTnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBzYW1wbGVzICAgICAqLworCisgICAgLyoKKyAgICAgKiBDb252ZXJ0IDMyLWJpdCBzYW1wbGVzIHRvIDE2LWJpdCBhbmQgc2F0dXJhdGUKKyAgICAgKiAoTm90IHJlcXVpcmVkIGZvciAxNi1iaXQgaW1wbGVtZW5hdGlvbnMpCisgICAgICovCisgICAgSW50MzJSU2hpZnRUb0ludDE2X1NhdF8zMngxNihwU2NyYXRjaCwgLyogU291cmNlIDMyLWJpdCBkYXRhICAgICovCisgICAgKExWTV9JTlQxNiAqKSBwU2NyYXRjaCwgLyogRGVzdC4gMTYtYml0IGRhdGEgICAgICovCisgICAgKExWTV9JTlQxNikgKDIgKiBOdW1TYW1wbGVzKSwgLyogTGVmdCBhbmQgcmlnaHQgICAgICAgICovCisgICAgTFZEQkVfU0NBTEVTSElGVCk7IC8qIFNoaWZ0IHNjYWxlICAgICAgICAgICAqLworCisgIH0KKworICAvKiBCeXBhc3MgVm9sdW1lIHBhdGggaXMgcHJvY2Vzc2VkIHdoZW4gREJFIGlzIE9GRiBvciBkdXJpbmcgT24vT2ZmIHRyYW5zaXRpb25zICovCisgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVkRCRV9PRkYpCisgICAgICB8fCAoTFZDX01peGVyX0dldEN1cnJlbnQoCisgICAgICAgICAgJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdKQorICAgICAgICAgICE9IExWQ19NaXhlcl9HZXRUYXJnZXQoCisgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSkpKSB7CisKKyAgICAvKgorICAgICAqIFRoZSBhbGdvcml0aG0gaXMgZGlzYWJsZWQgYnV0IHZvbHVtZSBtYW5hZ2VtZW50IGlzIHJlcXVpcmVkIHRvIGNvbXBlbnNhdGUgZm9yCisgICAgICogaGVhZHJvb20gYW5kIHZvbHVtZSAoaWYgZW5hYmxlZCkKKyAgICAgKi8KKyAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLCBwSW5EYXRhLAorICAgICAgICBwU2NyYXRjaFZvbCwgKExWTV9JTlQxNikgKDIgKiBOdW1TYW1wbGVzKSk7IC8qIExlZnQgYW5kIHJpZ2h0ICAgICAgICAgICovCisKKyAgfQorCisgIC8qCisgICAqIE1peCBEQkUgcHJvY2Vzc2VkIHBhdGggYW5kIGJ5cGFzcyB2b2x1bWUgcGF0aAorICAgKi8KKyAgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLAorICAgICAgKExWTV9JTlQxNiAqKSBwU2NyYXRjaCwgcFNjcmF0Y2hWb2wsIHBPdXREYXRhLAorICAgICAgKExWTV9JTlQxNikgKDIgKiBOdW1TYW1wbGVzKSk7CisKKyAgcmV0dXJuIChMVkRCRV9TVUNDRVNTKTsKK30KKyNlbHNlIC8qQlVJTERfRkxPQVQqLworTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX1Byb2Nlc3MoTFZEQkVfSGFuZGxlX3QgaEluc3RhbmNlLAorICAgIGNvbnN0IExWTV9GTE9BVCAqcEluRGF0YSwKKyAgICBMVk1fRkxPQVQgKnBPdXREYXRhLAorICAgIExWTV9VSU5UMTYgTnVtU2FtcGxlcykKIHsKIAotICAgIExWREJFX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9KExWREJFX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgKnBTY3JhdGNoICA9IChMVk1fSU5UMzIgKilwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgKnBNb25vOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgKnBJbnB1dCAgICA9IChMVk1fSU5UMTYgKilwSW5EYXRhOworICBMVkRCRV9JbnN0YW5jZV90ICpwSW5zdGFuY2UgPShMVkRCRV9JbnN0YW5jZV90ICopaEluc3RhbmNlOworICBMVk1fRkxPQVQgKnBTY3JhdGNoX2luID0gKExWTV9GTE9BVCAqKXBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uCisgIFtMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzOworICBMVk1fRkxPQVQgKnBTY3JhdGNoID0gcFNjcmF0Y2hfaW4gKyAyICogTnVtU2FtcGxlczsKKyAgTFZNX0ZMT0FUICpwTW9ubzsKKyAgTFZNX0lOVDMyIGlpID0gMDsKIAorICAvKiBTY3JhdGNoIGZvciBWb2x1bWUgQ29udHJvbCBzdGFydHMgYXQgb2Zmc2V0IG9mIDQqTnVtU2FtcGxlcyBmbG9hdCB2YWx1ZXMgZnJvbSBwU2NyYXRjaCAqLworICBMVk1fRkxPQVQgICAgICAgICAgICpwU2NyYXRjaFZvbCA9IChMVk1fRkxPQVQgKikoJnBTY3JhdGNoX2luWzQgKiBOdW1TYW1wbGVzXSk7CisvLyAgTFZNX0lOVDE2ICpwU2NyYXRjaFZvbF9pbnQgPSAoTFZNX0lOVDE2ICopKHBTY3JhdGNoVm9sKTsKIAotICAgIC8qIFNjcmF0Y2ggZm9yIFZvbHVtZSBDb250cm9sIHN0YXJ0cyBhdCBvZmZzZXQgb2YgMipOdW1TYW1wbGVzIHNob3J0IHZhbHVlcyBmcm9tIHBTY3JhdGNoICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAqcFNjcmF0Y2hWb2wgPSAoTFZNX0lOVDE2ICopKCZwU2NyYXRjaFtOdW1TYW1wbGVzXSk7CisgIC8qIFNjcmF0Y2ggZm9yIE1vbm8gcGF0aCBzdGFydHMgYXQgb2Zmc2V0IG9mIDYqTnVtU2FtcGxlcyAzMi1iaXQgdmFsdWVzIGZyb20gcFNjcmF0Y2ggKi8KKyAgcE1vbm8gPSAmcFNjcmF0Y2hfaW5bNCAqIE51bVNhbXBsZXNdOwogCi0gICAgLyogU2NyYXRjaCBmb3IgTW9ubyBwYXRoIHN0YXJ0cyBhdCBvZmZzZXQgb2YgMipOdW1TYW1wbGVzIDMyLWJpdCB2YWx1ZXMgZnJvbSBwU2NyYXRjaCAqLwotICAgIHBNb25vICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJnBTY3JhdGNoWzIqTnVtU2FtcGxlc107CisgIC8qCisgICAqIENoZWNrIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBub3QgdG9vIGxhcmdlCisgICAqLworICBpZiAoTnVtU2FtcGxlcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKKyAgeworICAgIHJldHVybihMVkRCRV9UT09NQU5ZU0FNUExFUyk7CisgIH0KKworICAvKgorICAgKiBDb252ZXJ0IDE2LWJpdCBzYW1wbGVzIHRvIEZsb2F0CisgICAqLworICBDb3B5X0Zsb2F0KHBJbkRhdGEsIC8qIFNvdXJjZSAxNi1iaXQgZGF0YSAgICAqLworICAgICAgcFNjcmF0Y2hfaW4sIC8qIERlc3QuIDMyLWJpdCBkYXRhICAgICAqLworICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgLyogTGVmdCBhbmQgcmlnaHQgICAgICAgICovCisKKyAgZm9yIChpaSA9IDA7IGlpIDwgMiAqIE51bVNhbXBsZXM7IGlpKyspIHsKKyAgICBwU2NyYXRjaFtpaV0gPSBwU2NyYXRjaF9pbltpaV07CisgIH0KKyAgLyoKKyAgICogQ2hlY2sgaWYgdGhlIGFsZ29yaXRobSBpcyBlbmFibGVkCisgICAqLworICAvKiBEQkUgcGF0aCBpcyBwcm9jZXNzZWQgd2hlbiBEQkUgaXMgT04gb3IgZHVyaW5nIE9uL09mZiB0cmFuc2l0aW9ucyAqLworICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZEQkVfT04pfHwKKyAgICAgIChMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pCisgICAgICAgICAgIT1MVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkpKQorICB7CiAKICAgICAvKgotICAgICAqIENoZWNrIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBub3QgdG9vIGxhcmdlCisgICAgICogQXBwbHkgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgaWYgc2VsZWN0ZWQKICAgICAgKi8KLSAgICBpZiAoTnVtU2FtcGxlcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKKyAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuSFBGU2VsZWN0ID09IExWREJFX0hQRl9PTikKICAgICB7Ci0gICAgICAgIHJldHVybihMVkRCRV9UT09NQU5ZU0FNUExFUyk7CisgICAgICBCUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5wQ29lZi0+SFBGSW5zdGFuY2UsLyogRmlsdGVyIGluc3RhbmNlICAgICAgKi8KKyAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsIC8qIFNvdXJjZSAgICAgICAgICAgICAgICovCisgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLCAvKiBEZXN0aW5hdGlvbiAgICAgICAgICAqLworICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBzYW1wbGVzICAgICovCiAgICAgfQogCiAgICAgLyoKLSAgICAgKiBDaGVjayBpZiB0aGUgYWxnb3JpdGhtIGlzIGVuYWJsZWQKKyAgICAgKiBDcmVhdGUgdGhlIG1vbm8gc3RyZWFtCiAgICAgICovCi0gICAgLyogREJFIHBhdGggaXMgcHJvY2Vzc2VkIHdoZW4gREJFIGlzIE9OIG9yIGR1cmluZyBPbi9PZmYgdHJhbnNpdGlvbnMgKi8KLSAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZEQkVfT04pfHwKLSAgICAgICAgKExWQ19NaXhlcl9HZXRDdXJyZW50KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkKLSAgICAgICAgICE9TFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pKSkKLSAgICB7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ29udmVydCAxNi1iaXQgc2FtcGxlcyB0byAzMi1iaXQgYW5kIHNjYWxlCi0gICAgICAgICAqIChGb3IgYSAxNi1iaXQgaW1wbGVtZW50YXRpb24gYXBwbHkgaGVhZHJvb20gbG9zcyBoZXJlKQotICAgICAgICAgKi8KLSAgICAgICAgSW50MTZMU2hpZnRUb0ludDMyXzE2eDMyKHBJbnB1dCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlIDE2LWJpdCBkYXRhICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3QuIDMyLWJpdCBkYXRhICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSwgICAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1NDQUxFU0hJRlQpOyAgICAgICAgICAgICAgICAgICAgLyogU2hpZnQgc2NhbGUgICAgICAgICAgICovCi0KLQotICAgICAgICAvKgotICAgICAgICAgKiBBcHBseSB0aGUgaGlnaCBwYXNzIGZpbHRlciBpZiBzZWxlY3RlZAotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLkhQRlNlbGVjdCA9PSBMVkRCRV9IUEZfT04pCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cENvZWYtPkhQRkluc3RhbmNlLC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyICopcFNjcmF0Y2gsICAgICAgICAgICAvKiBTb3VyY2UgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMiAqKXBTY3JhdGNoLCAgICAgICAgICAgLyogRGVzdGluYXRpb24gICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7ICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICAgICovCi0gICAgICAgIH0KLQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIENyZWF0ZSB0aGUgbW9ubyBzdHJlYW0KLSAgICAgICAgICovCi0gICAgICAgIEZyb20yaVRvTW9ub18zMihwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0ZXJlbyBzb3VyY2UgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcE1vbm8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb25vIGRlc3RpbmF0aW9uICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgICovCi0KLQotICAgICAgICAvKgotICAgICAgICAgKiBBcHBseSB0aGUgYmFuZCBwYXNzIGZpbHRlcgotICAgICAgICAgKi8KLSAgICAgICAgQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIoJnBJbnN0YW5jZS0+cENvZWYtPkJQRkluc3RhbmNlLCAgICAgLyogRmlsdGVyIGluc3RhbmNlICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIgKilwTW9ubywgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyICopcE1vbm8sICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgICovCi0KLQotICAgICAgICAvKgotICAgICAgICAgKiBBcHBseSB0aGUgQUdDIGFuZCBtaXgKLSAgICAgICAgICovCi0gICAgICAgIEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQSgmcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UsICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNb25vLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTW9ubyBiYW5kIHBhc3Mgc291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0ZXJlbyBkZXN0aW5hdGlvbiAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KLQotICAgICAgICAvKgotICAgICAgICAgKiBDb252ZXJ0IDMyLWJpdCBzYW1wbGVzIHRvIDE2LWJpdCBhbmQgc2F0dXJhdGUKLSAgICAgICAgICogKE5vdCByZXF1aXJlZCBmb3IgMTYtYml0IGltcGxlbWVuYXRpb25zKQotICAgICAgICAgKi8KLSAgICAgICAgSW50MzJSU2hpZnRUb0ludDE2X1NhdF8zMngxNihwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlIDMyLWJpdCBkYXRhICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKXBTY3JhdGNoLCAgICAgICAgICAgIC8qIERlc3QuIDE2LWJpdCBkYXRhICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcyksICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9TQ0FMRVNISUZUKTsgICAgICAgICAgICAgICAgLyogU2hpZnQgc2NhbGUgICAgICAgICAgICovCi0KLSAgICB9Ci0KLSAgICAvKiBCeXBhc3MgVm9sdW1lIHBhdGggaXMgcHJvY2Vzc2VkIHdoZW4gREJFIGlzIE9GRiBvciBkdXJpbmcgT24vT2ZmIHRyYW5zaXRpb25zICovCi0gICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWREJFX09GRil8fAotICAgICAgICAoTFZDX01peGVyX0dldEN1cnJlbnQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdKQotICAgICAgICAgIT1MVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSkpKQotICAgIHsKLQotICAgICAgICAvKgotICAgICAgICAgKiBUaGUgYWxnb3JpdGhtIGlzIGRpc2FibGVkIGJ1dCB2b2x1bWUgbWFuYWdlbWVudCBpcyByZXF1aXJlZCB0byBjb21wZW5zYXRlIGZvcgotICAgICAgICAgKiBoZWFkcm9vbSBhbmQgdm9sdW1lIChpZiBlbmFibGVkKQotICAgICAgICAgKi8KLSAgICAgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoVm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcykpOyAgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgICAgICAgICAgKi8KLQotICAgIH0KKyAgICBGcm9tMmlUb01vbm9fRmxvYXQoKExWTV9GTE9BVCAqKXBTY3JhdGNoLCAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KKyAgICAgICAgcE1vbm8sIC8qIE1vbm8gZGVzdGluYXRpb24gICAgICAqLworICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KIAogICAgIC8qCi0gICAgICogTWl4IERCRSBwcm9jZXNzZWQgcGF0aCBhbmQgYnlwYXNzIHZvbHVtZSBwYXRoCisgICAgICogQXBwbHkgdGhlIGJhbmQgcGFzcyBmaWx0ZXIKICAgICAgKi8KLSAgICBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopIHBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2hWb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcykpOworICAgIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyKCZwSW5zdGFuY2UtPnBDb2VmLT5CUEZJbnN0YW5jZSwgLyogRmlsdGVyIGluc3RhbmNlICAgICAgICovCisgICAgICAgIChMVk1fRkxPQVQgKilwTW9ubywgLyogU291cmNlICAgICAgICAgICAgICAgICovCisgICAgICAgIChMVk1fRkxPQVQgKilwTW9ubywgLyogRGVzdGluYXRpb24gICAgICAgICAgICovCisgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBzYW1wbGVzICAgICAqLwogCi0gICAgcmV0dXJuKExWREJFX1NVQ0NFU1MpOworICAgIC8qCisgICAgICogQXBwbHkgdGhlIEFHQyBhbmQgbWl4CisgICAgICovCisgICAgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKCZwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZSwgLyogSW5zdGFuY2UgcG9pbnRlciAgICAgICovCisgICAgICAgIHBTY3JhdGNoLCAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KKyAgICAgICAgcE1vbm8sIC8qIE1vbm8gYmFuZCBwYXNzIHNvdXJjZSAqLworICAgICAgICBwU2NyYXRjaCwgLyogU3RlcmVvIGRlc3RpbmF0aW9uICAgICovCisgICAgICAgIE51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KKworICAgIGZvciAoaWkgPSAwOyBpaSA8IDIgKiBOdW1TYW1wbGVzOyBpaSsrKSB7CisgICAgICAvL1RPRE86IHJlcGxhY2Ugd2l0aCBleGlzdGluZyBjbGFtcGluZyBmdW5jdGlvbgorICAgICAgaWYocFNjcmF0Y2hbaWldIDwgLTEuMCkgeworICAgICAgICBwU2NyYXRjaFtpaV0gPSAtMS4wOworICAgICAgfSBlbHNlIGlmKHBTY3JhdGNoW2lpXSA+IDEuMCkgeworICAgICAgICBwU2NyYXRjaFtpaV0gPSAxLjA7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogQnlwYXNzIFZvbHVtZSBwYXRoIGlzIHByb2Nlc3NlZCB3aGVuIERCRSBpcyBPRkYgb3IgZHVyaW5nIE9uL09mZiB0cmFuc2l0aW9ucyAqLworICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZEQkVfT0ZGKXx8CisgICAgICAoTFZDX01peGVyX0dldEN1cnJlbnQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdKQorICAgICAgICAgICE9TFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0pKSkKKyAgeworCisgICAgLyoKKyAgICAgKiBUaGUgYWxnb3JpdGhtIGlzIGRpc2FibGVkIGJ1dCB2b2x1bWUgbWFuYWdlbWVudCBpcyByZXF1aXJlZCB0byBjb21wZW5zYXRlIGZvcgorICAgICAqIGhlYWRyb29tIGFuZCB2b2x1bWUgKGlmIGVuYWJsZWQpCisgICAgICovCisgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZSwKKyAgICAgICAgcFNjcmF0Y2hfaW4sCisgICAgICAgIHBTY3JhdGNoVm9sLAorICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAvKiBMZWZ0IGFuZCByaWdodCAqLworICB9CisKKyAgLyoKKyAgICogTWl4IERCRSBwcm9jZXNzZWQgcGF0aCBhbmQgYnlwYXNzIHZvbHVtZSBwYXRoCisgICAqLworICBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIsCisgICAgICBwU2NyYXRjaCwKKyAgICAgIHBTY3JhdGNoVm9sLAorICAgICAgcE91dERhdGEsCisgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOworCisgIHJldHVybihMVkRCRV9TVUNDRVNTKTsKIH0KLQotCi0KLQotCi0KLQotCi0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmMKaW5kZXggZjVkMjI5ZS4uYzRhOWIxNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuYwpAQCAtMzYsNyArMzYsMTEgQEAKIC8qCiAgKiBIaWdoIFBhc3MgRmlsdGVyIENvZWZmaWNpZW50IHRhYmxlCiAgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIGNvbnN0IEJRX0MzMl9Db2Vmc190IExWREJFX0hQRl9UYWJsZVtdID0geworI2Vsc2UgLypCVUlMRF9GTE9BVCovCitjb25zdCBCUV9GTE9BVF9Db2Vmc190IExWREJFX0hQRl9UYWJsZVtdID0geworI2VuZGlmIC8qQlVJTERfRkxPQVQqLwogICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNTVIeiBjZW50cmUgZnJlcXVlbmN5ICovCiAgICAge0hQRl9GczgwMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIEhQRl9GczgwMDBfRmM1NV9BMSwKQEAgLTgzLDYgKzg3LDE4IEBACiAgICAgIEhQRl9GczQ4MDAwX0ZjNTVfQTAsCiAgICAgIC1IUEZfRnM0ODAwMF9GYzU1X0IyLAogICAgICAtSFBGX0ZzNDgwMDBfRmM1NV9CMX0sCisjaWZkZWYgSElHSEVSX0ZTCisgICAge0hQRl9Gczk2MDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzOTYwMDBfRmM1NV9BMSwKKyAgICAgSFBGX0ZzOTYwMDBfRmM1NV9BMCwKKyAgICAgLUhQRl9Gczk2MDAwX0ZjNTVfQjIsCisgICAgIC1IUEZfRnM5NjAwMF9GYzU1X0IxfSwKKyAgICB7SFBGX0ZzMTkyMDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczE5MjAwMF9GYzU1X0ExLAorICAgICBIUEZfRnMxOTIwMDBfRmM1NV9BMCwKKyAgICAgLUhQRl9GczE5MjAwMF9GYzU1X0IyLAorICAgICAtSFBGX0ZzMTkyMDAwX0ZjNTVfQjF9LAorI2VuZGlmCiAKICAgICAvKiBDb2VmZmljaWVudHMgZm9yIDY2SHogY2VudHJlIGZyZXF1ZW5jeSAqLwogICAgIHtIUEZfRnM4MDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwpAQCAtMTMwLDYgKzE0NiwxOSBAQAogICAgICBIUEZfRnM0ODAwMF9GYzY2X0EwLAogICAgICAtSFBGX0ZzNDgwMDBfRmM2Nl9CMiwKICAgICAgLUhQRl9GczQ4MDAwX0ZjNjZfQjF9LAorI2lmZGVmIEhJR0hFUl9GUworICAgIHtIUEZfRnM5NjAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9Gczk2MDAwX0ZjNjZfQTEsCisgICAgIEhQRl9Gczk2MDAwX0ZjNjZfQTAsCisgICAgIC1IUEZfRnM5NjAwMF9GYzY2X0IyLAorICAgICAtSFBGX0ZzOTYwMDBfRmM2Nl9CMX0sCisgICAge0hQRl9GczE5MjAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxOTIwMDBfRmM2Nl9BMSwKKyAgICAgSFBGX0ZzMTkyMDAwX0ZjNjZfQTAsCisgICAgIC1IUEZfRnMxOTIwMDBfRmM2Nl9CMiwKKyAgICAgLUhQRl9GczE5MjAwMF9GYzY2X0IxfSwKKyNlbmRpZgorCiAKICAgICAvKiBDb2VmZmljaWVudHMgZm9yIDc4SHogY2VudHJlIGZyZXF1ZW5jeSAqLwogICAgIHtIUEZfRnM4MDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwpAQCAtMTc3LDYgKzIwNiwxOSBAQAogICAgICBIUEZfRnM0ODAwMF9GYzc4X0EwLAogICAgICAtSFBGX0ZzNDgwMDBfRmM3OF9CMiwKICAgICAgLUhQRl9GczQ4MDAwX0ZjNzhfQjF9LAorI2lmZGVmIEhJR0hFUl9GUworICAgIHtIUEZfRnM5NjAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9Gczk2MDAwX0ZjNzhfQTEsCisgICAgIEhQRl9Gczk2MDAwX0ZjNzhfQTAsCisgICAgIC1IUEZfRnM5NjAwMF9GYzc4X0IyLAorICAgICAtSFBGX0ZzOTYwMDBfRmM3OF9CMX0sCisgICAge0hQRl9GczE5MjAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxOTIwMDBfRmM3OF9BMSwKKyAgICAgSFBGX0ZzMTkyMDAwX0ZjNzhfQTAsCisgICAgIC1IUEZfRnMxOTIwMDBfRmM3OF9CMiwKKyAgICAgLUhQRl9GczE5MjAwMF9GYzc4X0IxfSwKKyNlbmRpZgorCiAKICAgICAvKiBDb2VmZmljaWVudHMgZm9yIDkwSHogY2VudHJlIGZyZXF1ZW5jeSAqLwogICAgIHtIUEZfRnM4MDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwpAQCAtMjIzLDEyICsyNjUsMzIgQEAKICAgICAgSFBGX0ZzNDgwMDBfRmM5MF9BMSwKICAgICAgSFBGX0ZzNDgwMDBfRmM5MF9BMCwKICAgICAgLUhQRl9GczQ4MDAwX0ZjOTBfQjIsCi0gICAgIC1IUEZfRnM0ODAwMF9GYzkwX0IxfX07CisgICAgIC1IUEZfRnM0ODAwMF9GYzkwX0IxfQorCisjaWZkZWYgSElHSEVSX0ZTCisgICAgLAorICAgIHtIUEZfRnM5NjAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9Gczk2MDAwX0ZjOTBfQTEsCisgICAgIEhQRl9Gczk2MDAwX0ZjOTBfQTAsCisgICAgIC1IUEZfRnM5NjAwMF9GYzkwX0IyLAorICAgICAtSFBGX0ZzOTYwMDBfRmM5MF9CMX0sCisgICAge0hQRl9GczE5MjAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxOTIwMDBfRmM5MF9BMSwKKyAgICAgSFBGX0ZzMTkyMDAwX0ZjOTBfQTAsCisgICAgIC1IUEZfRnMxOTIwMDBfRmM5MF9CMiwKKyAgICAgLUhQRl9GczE5MjAwMF9GYzkwX0IxfQorI2VuZGlmCisKK307CiAKIC8qCiAgKiBCYW5kIFBhc3MgRmlsdGVyIGNvZWZmaWNpZW50IHRhYmxlCiAgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIGNvbnN0IEJQX0MzMl9Db2Vmc190IExWREJFX0JQRl9UYWJsZVtdID0geworI2Vsc2UgLypCVUlMRF9GTE9BVCovCitjb25zdCBCUF9GTE9BVF9Db2Vmc190IExWREJFX0JQRl9UYWJsZVtdID0geworI2VuZGlmIC8qQlVJTERfRkxPQVQqLwogICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNTVIeiBjZW50cmUgZnJlcXVlbmN5ICovCiAgICAge0JQRl9GczgwMDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnM4MDAwX0ZjNTVfQjIsCkBAIC0yNTcsNiArMzE5LDE0IEBACiAgICAge0JQRl9GczQ4MDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9GczQ4MDAwX0ZjNTVfQjIsCiAgICAgIC1CUEZfRnM0ODAwMF9GYzU1X0IxfSwKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAge0JQRl9Gczk2MDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9Gczk2MDAwX0ZjNTVfQjIsCisgICAgIC1CUEZfRnM5NjAwMF9GYzU1X0IxfSwKKyAgICAge0JQRl9GczE5MjAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTkyMDAwX0ZjNTVfQjIsCisgICAgIC1CUEZfRnMxOTIwMDBfRmM1NV9CMX0sCisjZW5kaWYKIAogICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNjZIeiBjZW50cmUgZnJlcXVlbmN5ICovCiAgICAge0JQRl9GczgwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCkBAIC0yODYsNiArMzU2LDE0IEBACiAgICAge0JQRl9GczQ4MDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9GczQ4MDAwX0ZjNjZfQjIsCiAgICAgIC1CUEZfRnM0ODAwMF9GYzY2X0IxfSwKKyNpZmRlZiBISUdIRVJfRlMKKyAgICB7QlBGX0ZzOTYwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzOTYwMDBfRmM2Nl9CMiwKKyAgICAgLUJQRl9Gczk2MDAwX0ZjNjZfQjF9LAorICAgIHtCUEZfRnMxOTIwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczE5MjAwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzMTkyMDAwX0ZjNjZfQjF9LAorI2VuZGlmCiAKICAgICAvKiBDb2VmZmljaWVudHMgZm9yIDc4SHogY2VudHJlIGZyZXF1ZW5jeSAqLwogICAgIHtCUEZfRnM4MDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwpAQCAtMzE1LDYgKzM5MywxNCBAQAogICAgIHtCUEZfRnM0ODAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnM0ODAwMF9GYzc4X0IyLAogICAgICAtQlBGX0ZzNDgwMDBfRmM3OF9CMX0sCisjaWZkZWYgSElHSEVSX0ZTCisgICAge0JQRl9Gczk2MDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9Gczk2MDAwX0ZjNzhfQjIsCisgICAgIC1CUEZfRnM5NjAwMF9GYzc4X0IxfSwKKyAgICB7QlBGX0ZzMTkyMDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxOTIwMDBfRmM3OF9CMiwKKyAgICAgLUJQRl9GczE5MjAwMF9GYzc4X0IxfSwKKyNlbmRpZgogCiAgICAgLyogQ29lZmZpY2llbnRzIGZvciA5MEh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KICAgICB7QlBGX0ZzODAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KQEAgLTM0Myw3ICs0MjksMTkgQEAKICAgICAgLUJQRl9GczQ0MTAwX0ZjOTBfQjF9LAogICAgIHtCUEZfRnM0ODAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnM0ODAwMF9GYzkwX0IyLAotICAgICAtQlBGX0ZzNDgwMDBfRmM5MF9CMX19OworICAgICAtQlBGX0ZzNDgwMDBfRmM5MF9CMX0KKyNpZmRlZiBISUdIRVJfRlMKKyAgICAsCisgICAge0JQRl9Gczk2MDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9Gczk2MDAwX0ZjOTBfQjIsCisgICAgIC1CUEZfRnM5NjAwMF9GYzkwX0IxfSwKKyAgICB7QlBGX0ZzMTkyMDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxOTIwMDBfRmM5MF9CMiwKKyAgICAgLUJQRl9GczE5MjAwMF9GYzkwX0IxfQorI2VuZGlmCisKKworfTsKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzUzLDcgKzQ1MSwxMSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogQXR0YWNrIHRpbWUgKHNpZ25hbCB0b28gbGFyZ2UpICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBjb25zdCBMVk1fSU5UMTYgTFZEQkVfQUdDX0FUVEFDS19UYWJsZVtdID0geworI2Vsc2UgLypCVUlMRF9GTE9BVCovCitjb25zdCBMVk1fRkxPQVQgTFZEQkVfQUdDX0FUVEFDS19UYWJsZVtdID0geworI2VuZGlmIC8qQlVJTERfRkxPQVQqLwogICAgIEFHQ19BVFRBQ0tfRnM4MDAwLAogICAgIEFHQ19BVFRBQ0tfRnMxMTAyNSwKICAgICBBR0NfQVRUQUNLX0ZzMTIwMDAsCkBAIC0zNjIsMTAgKzQ2NCwyMCBAQAogICAgIEFHQ19BVFRBQ0tfRnMyNDAwMCwKICAgICBBR0NfQVRUQUNLX0ZzMzIwMDAsCiAgICAgQUdDX0FUVEFDS19GczQ0MTAwLAotICAgIEFHQ19BVFRBQ0tfRnM0ODAwMH07CisgICAgQUdDX0FUVEFDS19GczQ4MDAwCisjaWZkZWYgSElHSEVSX0ZTCisgICAgLEFHQ19BVFRBQ0tfRnM5NjAwMAorICAgICxBR0NfQVRUQUNLX0ZzMTkyMDAwCisjZW5kaWYKKworfTsKIAogLyogRGVjYXkgdGltZSAoc2lnbmFsIHRvbyBzbWFsbCkgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIGNvbnN0IExWTV9JTlQxNiBMVkRCRV9BR0NfREVDQVlfVGFibGVbXSA9IHsKKyNlbHNlIC8qQlVJTERfRkxPQVQqLworY29uc3QgTFZNX0ZMT0FUIExWREJFX0FHQ19ERUNBWV9UYWJsZVtdID0geworI2VuZGlmIC8qQlVJTERfRkxPQVQqLwogICAgIEFHQ19ERUNBWV9GczgwMDAsCiAgICAgQUdDX0RFQ0FZX0ZzMTEwMjUsCiAgICAgQUdDX0RFQ0FZX0ZzMTIwMDAsCkBAIC0zNzQsMTAgKzQ4NiwyMCBAQAogICAgIEFHQ19ERUNBWV9GczI0MDAwLAogICAgIEFHQ19ERUNBWV9GczMyMDAwLAogICAgIEFHQ19ERUNBWV9GczQ0MTAwLAotICAgIEFHQ19ERUNBWV9GczQ4MDAwfTsKKyAgICBBR0NfREVDQVlfRnM0ODAwMAorI2lmZGVmIEhJR0hFUl9GUworICAgICxBR0NfREVDQVlfRlM5NjAwMAorICAgICxBR0NfREVDQVlfRlMxOTIwMDAKKyNlbmRpZgorCit9OwogCiAvKiBHYWluIGZvciB1c2Ugd2l0aG91dCB0aGUgaGlnaCBwYXNzIGZpbHRlciAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogY29uc3QgTFZNX0lOVDMyIExWREJFX0FHQ19HQUlOX1RhYmxlW10gPSB7CisjZWxzZSAvKkJVSUxEX0ZMT0FUKi8KK2NvbnN0IExWTV9GTE9BVCBMVkRCRV9BR0NfR0FJTl9UYWJsZVtdID0geworI2VuZGlmIC8qQlVJTERfRkxPQVQqLwogICAgIEFHQ19HQUlOXzBkQiwKICAgICBBR0NfR0FJTl8xZEIsCiAgICAgQUdDX0dBSU5fMmRCLApAQCAtMzk2LDcgKzUxOCwxMSBAQAogICAgIEFHQ19HQUlOXzE1ZEJ9OwogCiAvKiBHYWluIGZvciB1c2Ugd2l0aCB0aGUgaGlnaCBwYXNzIGZpbHRlciAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogY29uc3QgTFZNX0lOVDMyIExWREJFX0FHQ19IUEZHQUlOX1RhYmxlW10gPSB7CisjZWxzZSAvKkJVSUxEX0ZMT0FUKi8KK2NvbnN0IExWTV9GTE9BVCBMVkRCRV9BR0NfSFBGR0FJTl9UYWJsZVtdID0geworI2VuZGlmIC8qQlVJTERfRkxPQVQqLwogICAgIEFHQ19IUEZHQUlOXzBkQiwKICAgICBBR0NfSFBGR0FJTl8xZEIsCiAgICAgQUdDX0hQRkdBSU5fMmRCLApAQCAtNDIyLDYgKzU0OCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBkQiB0byBsaW5lYXIgY29udmVyc2lvbiB0YWJsZSAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogY29uc3QgTFZNX0lOVDE2IExWREJFX1ZvbHVtZVRhYmxlW10gPSB7CiAgICAgMHg0MDAwLCAgICAgICAgICAgICAvKiAtNmRCICovCiAgICAgMHg0N0ZCLCAgICAgICAgICAgICAvKiAtNWRCICovCkBAIC00MzAsOCArNTU3LDIyIEBACiAgICAgMHg2NUFELCAgICAgICAgICAgICAvKiAtMmRCICovCiAgICAgMHg3MjE1LCAgICAgICAgICAgICAvKiAtMWRCICovCiAgICAgMHg3RkZGfTsgICAgICAgICAgICAvKiAgMGRCICovCisjZWxzZSAvKkJVSUxEX0ZMT0FUKi8KK2NvbnN0IExWTV9GTE9BVCBMVkRCRV9Wb2x1bWVUYWJsZVtdID0geworICAgIDAuNTAwMDAwZiwgICAgICAgICAvKiAtNmRCICovCisgICAgMC41NjIzNDFmLCAgICAgICAgIC8qIC01ZEIgKi8KKyAgICAwLjYzMDk1N2YsICAgICAgICAgLyogLTRkQiAqLworICAgIDAuNzA3OTQ2ZiwgICAgICAgICAvKiAtM2RCICovCisgICAgMC43OTQzMjhmLCAgICAgICAgIC8qIC0yZEIgKi8KKyAgICAwLjg5MTI1MWYsICAgICAgICAgLyogLTFkQiAqLworICAgIDEuMDAwMDAwZn07ICAgICAgICAvKiAgMGRCICovCisjZW5kaWYgLypCVUlMRF9GTE9BVCovCiAKKyNpZm5kZWYgQlVJTERfRkxPQVQKIGNvbnN0IExWTV9JTlQxNiBMVkRCRV9Wb2x1bWVUQ1RhYmxlW10gPSB7CisjZWxzZSAvKkJVSUxEX0ZMT0FUKi8KK2NvbnN0IExWTV9GTE9BVCBMVkRCRV9Wb2x1bWVUQ1RhYmxlW10gPSB7CisjZW5kaWYgLypCVUlMRF9GTE9BVCovCiAgICAgVk9MX1RDX0ZzODAwMCwKICAgICBWT0xfVENfRnMxMTAyNSwKICAgICBWT0xfVENfRnMxMjAwMCwKQEAgLTQ0MCw5ICs1ODEsMTcgQEAKICAgICBWT0xfVENfRnMyNDAwMCwKICAgICBWT0xfVENfRnMzMjAwMCwKICAgICBWT0xfVENfRnM0NDEwMCwKLSAgICBWT0xfVENfRnM0ODAwMH07CisgICAgVk9MX1RDX0ZzNDgwMDAKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAsVk9MX1RDX0ZzOTYwMDAKKyAgICAsVk9MX1RDX0ZzMTkyMDAwCisjZW5kaWYKK307CisKKwogCiBjb25zdCBMVk1fSU5UMTYgTFZEQkVfTWl4ZXJUQ1RhYmxlW10gPSB7CisKICAgICBNSVhfVENfRnM4MDAwLAogICAgIE1JWF9UQ19GczExMDI1LAogICAgIE1JWF9UQ19GczEyMDAwLApAQCAtNDUxLDYgKzYwMCwxMCBAQAogICAgIE1JWF9UQ19GczI0MDAwLAogICAgIE1JWF9UQ19GczMyMDAwLAogICAgIE1JWF9UQ19GczQ0MTAwLAotICAgIE1JWF9UQ19GczQ4MDAwfTsKKyAgICBNSVhfVENfRnM0ODAwMAorI2lmZGVmIEhJR0hFUl9GUworICAgICxNSVhfVENfRnM5NjAwMAorICAgICxNSVhfVENfRnMxOTIwMDAKKyNlbmRpZgogCi0KK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmgKaW5kZXggNDc2ZTZhMC4uY2E0NmUzNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuaApAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgIkJJUVVBRC5oIgogI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgogCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIENvZWZmaWNpZW50cyBjb25zdGFudCB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC03Niw4ICs3Nyw1NyBAQAogCiBleHRlcm4gY29uc3QgTFZNX0lOVDE2IExWREJFX1ZvbHVtZVRDVGFibGVbXTsKIAorI2Vsc2UgLypCVUlMRF9GTE9BVCovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQ29lZmZpY2llbnRzIGNvbnN0YW50IHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogSGlnaCBQYXNzIEZpbHRlciBDb2VmZmljaWVudCB0YWJsZQorICovCitleHRlcm4gY29uc3QgQlFfRkxPQVRfQ29lZnNfdCBMVkRCRV9IUEZfVGFibGVbXTsKKworLyoKKyAqIEJhbmQgUGFzcyBGaWx0ZXIgY29lZmZpY2llbnQgdGFibGUKKyAqLworZXh0ZXJuIGNvbnN0IEJQX0ZMT0FUX0NvZWZzX3QgTFZEQkVfQlBGX1RhYmxlW107CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQUdDIGNvbnN0YW50IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBBdHRhY2sgdGltZSAoc2lnbmFsIHRvbyBsYXJnZSkgKi8KK2V4dGVybiBjb25zdCBMVk1fRkxPQVQgTFZEQkVfQUdDX0FUVEFDS19UYWJsZVtdOworCisvKiBEZWNheSB0aW1lIChzaWduYWwgdG9vIHNtYWxsKSAqLworZXh0ZXJuIGNvbnN0IExWTV9GTE9BVCBMVkRCRV9BR0NfREVDQVlfVGFibGVbXTsKKworLyogR2FpbiBmb3IgdXNlIHdpdGhvdXQgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgKi8KK2V4dGVybiBjb25zdCBMVk1fRkxPQVQgTFZEQkVfQUdDX0dBSU5fVGFibGVbXTsKKworLyogR2FpbiBmb3IgdXNlIHdpdGggdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgKi8KK2V4dGVybiBjb25zdCBMVk1fRkxPQVQgTFZEQkVfQUdDX0hQRkdBSU5fVGFibGVbXTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBWb2x1bWUgY29udHJvbCBnYWluIGFuZCB0aW1lIGNvbnN0YW50IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGRCIHRvIGxpbmVhciBjb252ZXJzaW9uIHRhYmxlICovCitleHRlcm4gY29uc3QgTFZNX0ZMT0FUIExWREJFX1ZvbHVtZVRhYmxlW107CitleHRlcm4gY29uc3QgTFZNX0ZMT0FUIExWREJFX1ZvbHVtZVRDVGFibGVbXTsKKworI2VuZGlmIC8qQlVJTERfRkxPQVQqLworCiBleHRlcm4gY29uc3QgTFZNX0lOVDE2IExWREJFX01peGVyVENUYWJsZVtdOwogCisKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL2xpYi9MVk0uaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oCmluZGV4IDFmZjJhMmMuLjliNmRhMzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oCkBAIC01MTQsMTEgKzUxNCwxOSBAQAogLyogICAgICBTVEVSRU8gICAgICAgICAgICAgIHRoZSBudW1iZXIgb2Ygc2FtcGxlIHBhaXJzIGluIHRoZSBibG9jayAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9Qcm9jZXNzKExWTV9IYW5kbGVfdCAgICAgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBBdWRpb1RpbWUpOworI2Vsc2UKIExWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1Byb2Nlc3MoTFZNX0hhbmRsZV90ICAgICAgICAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZSk7CisjZW5kaWYKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQnVmZmVycy5jCmluZGV4IDZjYmVlN2QuLjBhM2MzMGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuYwpAQCAtNDgsNyArNDgsMTUyIEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZNX0J1ZmZlck1hbmFnZWRJbihMVk1fSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgKipwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAqKnBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICpwTnVtU2FtcGxlcykKK3sKIAorICAgIExWTV9JTlQxNiAgICAgICAgU2FtcGxlQ291bnQ7ICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBiZSBwcm9jZXNzZWQgdGhpcyBjYWxsICovCisgICAgTFZNX0lOVDE2ICAgICAgICBOdW1TYW1wbGVzOyAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIGluIHNjcmF0Y2ggYnVmZmVyICovCisgICAgTFZNX0ZMT0FUICAgICAgICAqcFN0YXJ0OworICAgIExWTV9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX0J1ZmZlcl90ICAgICAqcEJ1ZmZlcjsKKyAgICBMVk1fRkxPQVQgICAgICAgICpwRGVzdDsKKyAgICBMVk1fSU5UMTYgICAgICAgIE51bUNoYW5uZWxzID0gMjsKKworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIHByb2Nlc3NpbmcgYWRkcmVzcyBwb2ludGVycworICAgICAqLworICAgIHBCdWZmZXIgICAgID0gcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudDsKKyAgICBwRGVzdCAgICAgICA9IHBCdWZmZXItPnBTY3JhdGNoOworICAgICpwVG9Qcm9jZXNzID0gcEJ1ZmZlci0+cFNjcmF0Y2g7CisgICAgKnBQcm9jZXNzZWQgPSBwQnVmZmVyLT5wU2NyYXRjaDsKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgaXQgaXMgdGhlIGZpcnN0IGNhbGwgb2YgYSBibG9jaworICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPT0gMCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIEZpcnN0IGNhbGwgZm9yIGEgbmV3IGJsb2NrIG9mIHNhbXBsZXMKKyAgICAgICAgICovCisgICAgICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IChMVk1fSU5UMTYpKCpwTnVtU2FtcGxlcyArIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzKTsKKyAgICAgICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzICAgID0gKExWTV9GTE9BVCAqKXBJbkRhdGE7CisgICAgICAgIHBCdWZmZXItPkJ1ZmZlclN0YXRlICAgICAgICA9IExWTV9GSVJTVENBTEw7CisgICAgfQorICAgIHBTdGFydCA9IHBJbnN0YW5jZS0+cElucHV0U2FtcGxlczsgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IHNhbXBsZXMgKi8KKyAgICBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGVzIHRvIG91dHB1dCBpcyBzYW1lIGFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIHJlYWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLworCisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyB0aGlzIGNhbGwgYW5kIHVwZGF0ZSB0aGUgYnVmZmVyIHN0YXRlCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA+IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemUpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBQcm9jZXNzIHRoZSBtYXhpbXVtIGJvY2sgc2l6ZSBvZiBzYW1wbGVzLgorICAgICAgICAgKi8KKyAgICAgICAgU2FtcGxlQ291bnQgPSBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplOworICAgICAgICBOdW1TYW1wbGVzICA9IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIExhc3QgY2FsbCBmb3IgdGhlIGJsb2NrLCBzbyBjYWxjdWxhdGUgaG93IG1hbnkgZnJhbWVzIGFuZCBzYW1wbGVzIHRvIHByb2Nlc3MKKyAgICAgICAgICAqLworICAgICAgICBMVk1fSU5UMTYgICBOdW1GcmFtZXM7CisKKyAgICAgICAgTnVtU2FtcGxlcyAgPSBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3M7CisgICAgICAgIE51bUZyYW1lcyAgICA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgPj4gTUlOX0lOVEVSTkFMX0JMT0NLU0hJRlQpOworICAgICAgICBTYW1wbGVDb3VudCA9IChMVk1fSU5UMTYpKE51bUZyYW1lcyA8PCBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVXBkYXRlIHRoZSBidWZmZXIgc3RhdGUKKyAgICAgICAgICovCisgICAgICAgIGlmIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RDQUxMKQorICAgICAgICB7CisgICAgICAgICAgICBwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9IExWTV9GSVJTVExBU1RDQUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgPSBMVk1fTEFTVENBTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpU2FtcGxlQ291bnQ7ICAvKiBTZXQgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgdGhpcyBjYWxsICovCisKKworICAgIC8qCisgICAgICogQ29weSBzYW1wbGVzIGZyb20gdGhlIGRlbGF5IGJ1ZmZlciBhcyByZXF1aXJlZAorICAgICAqLworICAgIGlmICgoKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVENBTEwpIHx8CisgICAgICAgIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RMQVNUQ0FMTCkpICYmCisgICAgICAgIChwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcyAhPSAwKSkKKyAgICB7CisgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPkluRGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtQ2hhbm5lbHMgKiBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcykpOyAgICAvKiBOdW1iZXIgb2YgZGVsYXkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzLCBsZWZ0IGFuZCByaWdodCAqLworICAgICAgICBOdW1TYW1wbGVzID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyAtIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzKTsgLyogVXBkYXRlIHNhbXBsZSBjb3VudCAqLworICAgICAgICBwRGVzdCArPSBOdW1DaGFubmVscyAqIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzOyAgICAgIC8qIFVwZGF0ZSB0aGUgZGVzdGluYXRpb24gcG9pbnRlciAqLworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBDb3B5IHRoZSByZXN0IG9mIHRoZSBzYW1wbGVzIGZvciB0aGlzIGNhbGwgZnJvbSB0aGUgaW5wdXQgYnVmZmVyCisgICAgICovCisgICAgaWYgKE51bVNhbXBsZXMgPiAwKQorICAgIHsKKyAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bUNoYW5uZWxzICogTnVtU2FtcGxlcykpOyAgICAgIC8qIE51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCisgICAgICAgIHBTdGFydCArPSBOdW1DaGFubmVscyAqIE51bVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBpbnB1dCBwb2ludGVyICovCisKKyAgICAgICAgLyoKKyAgICAgICAgICogVXBkYXRlIHRoZSBpbnB1dCBkYXRhIHBvaW50ZXIgYW5kIHNhbXBsZXMgdG8gb3V0cHV0CisgICAgICAgICAqLworICAgICAgICAvKiBVcGRhdGUgc2FtcGxlcyB0byBvdXRwdXQgKi8KKyAgICAgICAgcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0ID0gKExWTV9JTlQxNikocEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0ICsgTnVtU2FtcGxlcyk7CisgICAgfQorCisKKyAgICAvKgorICAgICAgKiBVcGRhdGUgdGhlIHNhbXBsZSBjb3VudCBhbmQgaW5wdXQgcG9pbnRlcgorICAgICAqLworICAgIC8qIFVwZGF0ZSB0aGUgY291bnQgb2Ygc2FtcGxlcyAqLworICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyAgPSAoTFZNX0lOVDE2KShwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgLSBTYW1wbGVDb3VudCk7CisgICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzICAgICA9IHBTdGFydDsgLyogVXBkYXRlIGlucHV0IHNhbXBsZSBwb2ludGVyICovCisKKworICAgIC8qCisgICAgICogU2F2ZSBzYW1wbGVzIHRvIHRoZSBkZWxheSBidWZmZXIgaWYgYW55IGxlZnQgdW5wcm9jZXNzZWQKKyAgICAgKi8KKyAgICBpZiAoKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVExBU1RDQUxMKSB8fAorICAgICAgICAocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0xBU1RDQUxMKSkKKyAgICB7CisgICAgICAgIE51bVNhbXBsZXMgPSBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3M7CisgICAgICAgIHBTdGFydCAgICAgPSBwQnVmZmVyLT5wU2NyYXRjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0YXJ0IG9mIHRoZSBidWZmZXIgKi8KKyAgICAgICAgcFN0YXJ0ICAgICs9IE51bUNoYW5uZWxzICogU2FtcGxlQ291bnQ7IC8qIE9mZnNldCBieSB0aGUgbnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisgICAgICAgIGlmIChOdW1TYW1wbGVzICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5JbkRlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bUNoYW5uZWxzICogTnVtU2FtcGxlcykpOyAgIC8qIE51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCisgICAgICAgIH0KKworCisgICAgICAgIC8qCisgICAgICAgICAqIFVwZGF0ZSB0aGUgZGVsYXkgc2FtcGxlIGNvdW50CisgICAgICAgICAqLworICAgICAgICBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcyAgICAgPSBOdW1TYW1wbGVzOyAgICAgICAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlIHBhaXJzICovCisgICAgICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsbCBTYW1wbGVzIHVzZWQgKi8KKyAgICB9Cit9CisjZWxzZQogdm9pZCBMVk1fQnVmZmVyTWFuYWdlZEluKExWTV9IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAqKnBUb1Byb2Nlc3MsCkBAIC0xODksNyArMzM0LDcgQEAKICAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWxsIFNhbXBsZXMgdXNlZCAqLwogICAgIH0KIH0KLQorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yMTMsNyArMzU4LDQ3IEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZNX0J1ZmZlclVubWFuYWdlZEluKExWTV9IYW5kbGVfdCAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAqKnBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICoqcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgKnBOdW1TYW1wbGVzKQorewogCisgICAgTFZNX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCBvZiBhIGJsb2NrCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9PSAwKQorICAgIHsKKyAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gKExWTV9JTlQxNikqcE51bVNhbXBsZXM7ICAgIC8qIEdldCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBmaXJzdCBjYWxsICovCisgICAgICAgIHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcyAgICA9ICpwVG9Qcm9jZXNzOyAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIEkvTyBwb2ludGVycyAqLworICAgICAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzICAgID0gKnBQcm9jZXNzZWQ7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGUgYmxvY2sgc2l6ZSB0byBwcm9jZXNzCisgICAgICAgICAqLworICAgICAgICBpZiAocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID4gcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICpwTnVtU2FtcGxlcyA9IChMVk1fVUlOVDE2KXBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogU2V0IHRoZSBwcm9jZXNzIHBvaW50ZXJzCisgICAgICovCisgICAgKnBUb1Byb2Nlc3MgPSBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXM7CisgICAgKnBQcm9jZXNzZWQgPSBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzOworfQorI2Vsc2UKIHZvaWQgTFZNX0J1ZmZlclVubWFuYWdlZEluKExWTV9IYW5kbGVfdCAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqKnBUb1Byb2Nlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICoqcFByb2Nlc3NlZCwKQEAgLTI1Miw3ICs0MzcsNyBAQAogICAgICpwVG9Qcm9jZXNzID0gcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzOwogICAgICpwUHJvY2Vzc2VkID0gcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlczsKIH0KLQorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yNzgsNiArNDYzLDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgTFZNX0J1ZmZlck9wdGltaXNlZEluKExWTV9IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgKipwVG9Qcm9jZXNzLApAQCAtNDE2LDcgKzYwMiw3IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZNX0J1ZmZlckluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDcxLDcgKzY1NywzNyBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWTV9CdWZmZXJJbihMVk1fSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICoqcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICoqcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICpwTnVtU2FtcGxlcykKK3sKIAorICAgIExWTV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworCisKKyAgICAvKgorICAgICAqIENoZWNrIHdoaWNoIG1vZGUsIG1hbmFnZWQgb3IgdW5tYW5hZ2VkCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5CdWZmZXJNb2RlID09IExWTV9NQU5BR0VEX0JVRkZFUlMpCisgICAgeworICAgICAgICBMVk1fQnVmZmVyTWFuYWdlZEluKGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtU2FtcGxlcyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIExWTV9CdWZmZXJVbm1hbmFnZWRJbihoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOdW1TYW1wbGVzKTsKKyAgICB9Cit9CisjZWxzZQogdm9pZCBMVk1fQnVmZmVySW4oTFZNX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAqKnBUb1Byb2Nlc3MsCkBAIC01MDEsNyArNzE3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOdW1TYW1wbGVzKTsKICAgICB9CiB9Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZNX0J1ZmZlck1hbmFnZWRPdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTIyLDcgKzczOCwxNTYgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVk1fQnVmZmVyTWFuYWdlZE91dChMVk1fSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAqcE51bVNhbXBsZXMpCit7CiAKKyAgICBMVk1fSW5zdGFuY2VfdCAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9CdWZmZXJfdCAgICAqcEJ1ZmZlciAgICA9IHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQ7CisgICAgTFZNX0lOVDE2ICAgICAgIFNhbXBsZUNvdW50ID0gKExWTV9JTlQxNikqcE51bVNhbXBsZXM7CisgICAgTFZNX0lOVDE2ICAgICAgIE51bVNhbXBsZXM7CisgICAgTFZNX0ZMT0FUICAgICAgICpwU3RhcnQ7CisgICAgTFZNX0ZMT0FUICAgICAgICpwRGVzdDsKKworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIHBvaW50ZXJzCisgICAgICovCisgICAgTnVtU2FtcGxlcyA9IHBCdWZmZXItPlNhbXBsZXNUb091dHB1dDsKKyAgICBwU3RhcnQgICAgID0gcEJ1ZmZlci0+cFNjcmF0Y2g7CisKKworICAgIC8qCisgICAgICogY2hlY2sgaWYgaXQgaXMgdGhlIGZpcnN0IGNhbGwgb2YgYSBibG9jaworICAgICAgKi8KKyAgICBpZiAoKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVENBTEwpIHx8CisgICAgICAgIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RMQVNUQ0FMTCkpCisgICAgeworICAgICAgICAvKiBGaXJzdCBjYWxsIGZvciBhIG5ldyBibG9jayAqLworICAgICAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzID0gcE91dERhdGE7ICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXNlIHRoZSBkZXN0aW5hdGlvbiAqLworICAgIH0KKyAgICBwRGVzdCA9IHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBvdXRwdXQgYWRkcmVzcyAqLworCisKKyAgICAvKgorICAgICAqIElmIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBub24temVybyB0aGVuIHRoZXJlIGFyZSBzdGlsbCBzYW1wbGVzIHRvIHNlbmQgdG8KKyAgICAgKiB0aGUgb3V0cHV0IGJ1ZmZlcgorICAgICAqLworICAgIGlmICgoTnVtU2FtcGxlcyAhPSAwKSAmJgorICAgICAgICAocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzICE9IDApKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29weSB0aGUgZGVsYXllZCBvdXRwdXQgYnVmZmVyIHNhbXBsZXMgdG8gdGhlIG91dHB1dAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA8PSBOdW1TYW1wbGVzKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ29weSBhbGwgb3V0cHV0IGRlbGF5IHNhbXBsZXMgdG8gdGhlIG91dHB1dAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGV0c2luYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcykpOyAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVXBkYXRlIHRoZSBwb2ludGVyIGFuZCBzYW1wbGUgY291bnRzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHBEZXN0ICs9IDIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXM7IC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworICAgICAgICAgICAgTnVtU2FtcGxlcyA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgLSBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpOyAvKiBTYW1wbGVzIGxlZnQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzZW5kICovCisgICAgICAgICAgICBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgPSAwOyAvKiBObyBzYW1wbGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENvcHkgb25seSBzb21lIG9mIHRoZSBvdXB1dCBkZWxheSBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGV0c2luYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50cworICAgICAgICAgICAgICovCisgICAgICAgICAgICBwRGVzdCArPSAyICogTnVtU2FtcGxlczsgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisgICAgICAgICAgICAvKiBObyBzYW1wbGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLworICAgICAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gKExWTV9JTlQxNikocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzIC0gTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBSZWFsaWduIHRoZSBkZWxheSBidWZmZXIgZGF0YSB0byBhdm9pZCB1c2luZyBjaXJjdWxhciBidWZmZXIgbWFuYWdlbWVudAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclsyICogTnVtU2FtcGxlc10sICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gbW92ZSAqLworICAgICAgICAgICAgTnVtU2FtcGxlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGVzIGxlZnQgdG8gc2VuZCAqLworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKgorICAgICAqIENvcHkgdGhlIHByb2Nlc3NlZCByZXN1bHRzIHRvIHRoZSBvdXRwdXQKKyAgICAgKi8KKyAgICBpZiAoKE51bVNhbXBsZXMgIT0gMCkgJiYKKyAgICAgICAgKFNhbXBsZUNvdW50ICE9IDApKQorICAgIHsKKyAgICAgICAgaWYgKFNhbXBsZUNvdW50IDw9IE51bVNhbXBsZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDb3B5IGFsbCBwcm9jZXNzZWQgc2FtcGxlcyB0byB0aGUgb3V0cHV0CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERldHNpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBTYW1wbGVDb3VudCkpOyAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIHBvaW50ZXIgYW5kIHNhbXBsZSBjb3VudHMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcERlc3QgICAgICArPSAyICogU2FtcGxlQ291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIE51bVNhbXBsZXMgID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyAtIFNhbXBsZUNvdW50KTsgICAgLyogU2FtcGxlcyBsZWZ0IHRvIHNlbmQgKi8KKyAgICAgICAgICAgIFNhbXBsZUNvdW50ID0gMDsgLyogTm8gc2FtcGxlcyBsZWZ0IGluIHRoZSBidWZmZXIgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDb3B5IG9ubHkgc29tZSBwcm9jZXNzZWQgc2FtcGxlcyB0byB0aGUgb3V0cHV0CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIHBvaW50ZXJzIGFuZCBzYW1wbGUgY291bnRzCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgcFN0YXJ0ICAgICAgKz0gMiAqIE51bVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJvY2Vzc2VkIHNhbXBsZSBwb2ludGVyICovCisgICAgICAgICAgICBwRGVzdCAgICAgICArPSAyICogTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIFNhbXBsZUNvdW50ICA9IChMVk1fSU5UMTYpKFNhbXBsZUNvdW50IC0gTnVtU2FtcGxlcyk7IC8qIFByb2Nlc3NlZCBzYW1wbGVzIGxlZnQgKi8KKyAgICAgICAgICAgIE51bVNhbXBsZXMgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBzYW1wbGUgY291bnQgKi8KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBDb3B5IHRoZSByZW1haW5pbmcgcHJvY2Vzc2VkIGRhdGEgdG8gdGhlIG91dHB1dCBkZWxheSBidWZmZXIKKyAgICAgKi8KKyAgICBpZiAoU2FtcGxlQ291bnQgIT0gMCkKKyAgICB7CisgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlc10sIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIFNhbXBsZUNvdW50KSk7ICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisgICAgICAgIC8qIFVwZGF0ZSB0aGUgYnVmZmVyIGNvdW50ICovCisgICAgICAgIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA9IChMVk1fSU5UMTYpKHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyArIFNhbXBsZUNvdW50KTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHBvaW50ZXJzLCBjb3VudHMgYW5kIHNldCBkZWZhdWx0IGJ1ZmZlciBwcm9jZXNzaW5nCisgICAgICovCisgICAgcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0ICA9IE51bVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZXMgbGVmdCB0byBzZW5kICovCisgICAgcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlcyA9IHBEZXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworICAgIHBCdWZmZXItPkJ1ZmZlclN0YXRlICAgICAgPSBMVk1fTUFYQkxPQ0tDQUxMOyAgICAgICAgICAgICAgICAgICAvKiBTZXQgZm9yIHRoZSBkZWZhdWx0IGNhbGwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrIHNpemUgKi8KKyAgICAvKiBUaGlzIHdpbGwgdGVybWluYXRlIHRoZSBsb29wIHdoZW4gYWxsIHNhbXBsZXMgcHJvY2Vzc2VkICovCisgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOworfQorI2Vsc2UKIHZvaWQgTFZNX0J1ZmZlck1hbmFnZWRPdXQoTFZNX0hhbmRsZV90ICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICpwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgKnBOdW1TYW1wbGVzKQpAQCAtNjcyLDcgKzEwMzcsNyBAQAogICAgIHBCdWZmZXItPkJ1ZmZlclN0YXRlICAgICAgPSBMVk1fTUFYQkxPQ0tDQUxMOyAgICAgICAgICAgICAgICAgICAvKiBTZXQgZm9yIHRoZSBkZWZhdWx0IGNhbGwgYmxvY2sgc2l6ZSAqLwogICAgICpwTnVtU2FtcGxlcyA9IChMVk1fVUlOVDE2KXBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzczsgICAgICAgICAvKiBUaGlzIHdpbGwgdGVybWluYXRlIHRoZSBsb29wIHdoZW4gYWxsIHNhbXBsZXMgcHJvY2Vzc2VkICovCiB9Ci0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNzQxLDYgKzExMDYsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCBMVk1fQnVmZmVyT3B0aW1pc2VkT3V0KExWTV9IYW5kbGVfdCAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgKnBOdW1TYW1wbGVzKQogewpAQCAtODA1LDcgKzExNzEsNyBAQAogICAgICAgICB9CiAgICAgfQogfQotCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTg0Myw3ICsxMjA5LDMxIEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZNX0J1ZmZlck91dChMVk1fSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICpwTnVtU2FtcGxlcykKK3sKIAorICAgIExWTV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKworCisgICAgLyoKKyAgICAgKiBDaGVjayB3aGljaCBtb2RlLCBtYW5hZ2VkIG9yIHVubWFuYWdlZAorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuQnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQorICAgIHsKKyAgICAgICAgTFZNX0J1ZmZlck1hbmFnZWRPdXQoaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVNhbXBsZXMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBMVk1fQnVmZmVyVW5tYW5hZ2VkT3V0KGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtU2FtcGxlcyk7CisgICAgfQorfQorI2Vsc2UKIHZvaWQgTFZNX0J1ZmZlck91dChMVk1fSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICpwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICpwTnVtU2FtcGxlcykKQEAgLTg2Nyw0ICsxMjU3LDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtU2FtcGxlcyk7CiAgICAgfQogfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db2VmZnMuaAppbmRleCAyNzEyYjJjLi4zNTM1NjBjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvZWZmcy5oCkBAIC0yNiwxMCArMjYsNjU1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjZGVmaW5lIFRyZWJsZUJvb3N0Q29ybmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwMDAKLSNkZWZpbmUgVHJlYmxlQm9vc3RNaW5SYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgVHJlYmxlQm9vc3RTdGVwcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIFRyZWJsZUJvb3N0TWluUmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgVHJlYmxlQm9vc3RTdGVwcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNQogCisjaWZkZWYgQlVJTERfRkxPQVQKKy8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgMjIwNTBIeiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDM4NDM0CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzMxNTk5CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wODE1NTcKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yODg0NzUKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjEyOTk0MworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI0MDA5MAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTg0MjMyCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTg1ODAxCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yNDUxNDUKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjQ4ODcKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjMxMzQ5MQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA1NjU0MQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzkwMTc3CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAyMDE0NAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDc2MjE5CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjEwNjE4NworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNTcyNzYxCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIwMjcyOAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjY4MTA4MgorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4zMTEwNDkKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS44MDI2MjAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNDMyNTg4CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTM4OTg5CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU2ODk1NgorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjA5MTk5NworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43MjE5NjQKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4yNjM2NzQKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuODkzNjQxCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNDU2MzAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjA4NjI2NworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSAyNDAwMEh6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wNDQ2NjIKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMjMyODcKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA5NDc3MworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE3MzE3NgorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTUwOTk5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTE2OTUwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMTQwODYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNTM4NjMKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjI4NDg3MAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMTY5MjEKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzY0MjkxCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDk2MzQyCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40NTM0MDMKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTg1NDU0CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS41NTMzODkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjg1NDQwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS42NjU1NzQKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMzk3NjI1CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNzkxNDQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjUyMzQ5OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjkzMjY4MgorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42NjQ3MzMKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wOTExNDgKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuODIzMTk5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMjY4OTUwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjAwMTAwMQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjQ2ODQ0NworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4yMDA0OTgKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi42OTIyODcKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuNDI0MzM4CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDMyMDAwSHogKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA2MTAwOQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wNjEwMDkKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTI5NDYzCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4xMjk0NjMKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjA2MjY3CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMDYyNjcKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yOTI0NDcKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjkyNDQ3CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzg5MTQwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjM4OTE0MAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40OTc2MzEKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjQ5NzYzMQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS42MTkzNjEKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjYxOTM2MQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS43NTU5NDMKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc1NTk0MworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS45MDkxOTEKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjkwOTE5MQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDgxMTM5CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4wODExMzkKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMjc0MDY3CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjI3NDA2NworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjQ5MDUzNgorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjQ5MDUzNgorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi43MzM0MTgKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuNzMzNDE4CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjAwNTkzNgorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMi4wMDU5MzYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy4zMTE3MDcKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMi4zMTE3MDcKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDQ0MTAwSHogKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA3NDM2NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yOTMyNTcKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xNTc4MDEKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMzc2Njk1CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4zX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yNTE0MjAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC40NzAzMTMKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zNTY0NjEKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc1MzU1CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDc0MzIwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjY5MzIxMworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjA2NTU5CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuODI1NDUzCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS43NTQ5MzUKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC45NzM4MjgKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS45MjE0MTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMTQwMzA4CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMTA4MjA4CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjMyNzEwMQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjMxNzc5MworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjUzNjY4NworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjU1Mjk1MgorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjc3MTg0NgorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjgxNjgwNQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjAzNTY5OAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4xMTI4NTIKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuMzMxNzQ2CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNDQ1MDIzCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuNjYzOTE2CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuODE3NzI0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTMuMDM2NjE4CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA0ODAwMEh6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDc3MzU3CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4zNDUzMDYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTY0MTUyCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC40MzIxMDEKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjYxNTM4CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41Mjk0ODgKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjM3MDgwNworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjYzODc1NworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDkzNDA5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzYxMzU5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjMwOTcxCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjg5ODkyMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc4NTMxOAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4wNTMyNjcKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjk1ODQ5OAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjIyNjQ0NworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi4xNTI4MDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjQyMDc1OAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDIuMzcwODI5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAtMS42Mzg3NzgKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi42MTU0NTIKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMS44ODM0MDEKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi44ODk5MjQKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMi4xNTc4NzMKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMTk3ODg2CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjQ2NTgzNQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjU0MzQyNQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjgxMTM3NAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgIDMuOTMxMTI3CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAtMy4xOTkwNzYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAKKyNpZmRlZiBISUdIRVJfRlMKKworLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA5NjAwMEh6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDk2MjMzCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42NzM1ODMKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjA0MjA4CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43ODE1NTgKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzI1MzU4CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC45MDI3MDgKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQ2MTI5MQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjAzODY0MQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjEzODEwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMTkxMTYwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNzg0OTM5CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjM2MjI4OQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTc2OTQ5CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjU1NDI5OQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMTkyMzg3CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuNzY5NzM4CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW44X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNDM0MTEzCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMi4wMTE0NjQKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAyLjcwNTMzNQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMi4yODI2ODUKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy4wMDk2NTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMi41ODcwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NzM1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMzUxMDk3CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuOTI4NDQ3CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNzM0MjA3CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zLjMxMTU1OAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgIDQuMTY0MDY0CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAtMy43NDE0MTQKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NzM1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICA0LjY0NjM3MQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgLTQuMjIzNzIxCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorCisvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDE5MjAwMEh6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMDc4MjMKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC44NzUxNTAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMjg4MDMKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC45OTYxMzAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzY0NTQ0CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMTMxODcxCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjUxNjg0OQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjI4NDE3NgorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjg3NzM3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjQ1NTA2NAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW41X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjg3OTQ3NworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuNjQ2ODA0CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjA5NDYxMworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuODYxOTQwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4zMzU5OTkKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuMTAzMzI2CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjYwNjgzOQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjM3NDE2NgorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDIuOTEwNzI2CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMi42NzgwNTMKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjI1MTY5MworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMy4wMTkwMjAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjYzNDI2NAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMy40MDE1OTEKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuMDYzNTE2CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMy44MzA4NDMKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgNC41NDUxNDUKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTQuMzEyNDcyCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICA1LjA4NTU0MgorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgIC00Ljg1Mjg2OAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKworI2VuZGlmCisKKyNlbHNlCiAvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDIyMDUwSHogKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTM4MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMTY0MjkxICovCkBAIC01NzEsMyArMTIxNiw0IEBACiAKIAogI2VuZGlmCisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuYwppbmRleCA3MjU2NGQ0Li5jZmU1M2I4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db250cm9sLmMKQEAgLTY1LDkgKzY1LDE2IEBACiAgICAgaWYoCiAgICAgICAgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLwogICAgICAgICAoKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT0ZGKSAmJiAocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVk1fTU9ERV9PTikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorICAgICgocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzExMDI1KSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTIwMDApICAgICAgICYmCisgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xNjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzIyMDUwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjQwMDApICAgICAgJiYKKyAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkgICAgICAmJgorICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfOTYwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xOTIwMDApKSAgICAgIHx8CisjZWxzZQogICAgICAgICAoKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzgwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMTAyNSkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzEyMDAwKSAgICAgICAmJgogICAgICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTYwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yMjA1MCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzI0MDAwKSAgICAgICAmJgogICAgICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMzIwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180NDEwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ4MDAwKSkgICAgICB8fAorI2VuZGlmCiAgICAgICAgICgocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICYmIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk9JTlNURVJFTykgJiYgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykpIHx8CiAgICAgICAgIChwUGFyYW1zLT5TcGVha2VyVHlwZSA+IExWTV9FWF9IRUFEUEhPTkVTKSkKICAgICB7CkBAIC0yNjgsNyArMjc1LDEyIEBACiB2b2lkIExWTV9TZXRUcmVibGVCb29zdChMVk1fSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKQogeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgZXh0ZXJuIEZPX0ZMT0FUX0xTaHhfQ29lZnNfdCAgTFZNX1RyZWJsZUJvb3N0Q29lZnNbXTsKKyNlbHNlCiAgICAgZXh0ZXJuIEZPX0MxNl9MU2h4X0NvZWZzX3QgIExWTV9UcmVibGVCb29zdENvZWZzW107CisjZW5kaWYKKwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE9mZnNldDsKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBFZmZlY3RMZXZlbCA9IDA7CiAKQEAgLTI5OCw2ICszMTAsMjAgQEAKICAgICAgICAgICAgICAqIExvYWQgdGhlIGNvZWZmaWNpZW50cyBhbmQgZW5hYmxlZCB0aGUgdHJlYmxlIGJvb3N0CiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIE9mZnNldCA9IChMVk1fSU5UMTYpKEVmZmVjdExldmVsIC0gMSArIFRyZWJsZUJvb3N0U3RlcHMgKiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAtIFRyZWJsZUJvb3N0TWluUmF0ZSkpOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgICAgICBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+cFRFX1N0YXRlLT5UcmVibGVCb29zdF9TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cFRFX1RhcHMtPlRyZWJsZUJvb3N0X1RhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZMVk1fVHJlYmxlQm9vc3RDb2Vmc1tPZmZzZXRdKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENsZWFyIHRoZSB0YXBzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIExvYWRDb25zdF9GbG9hdCgoTFZNX0ZMT0FUKTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcEluc3RhbmNlLT5wVEVfVGFwcy0+VHJlYmxlQm9vc3RfVGFwcywgIC8qIERlc3RpbmF0aW9uLlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FzdCB0byB2b2lkOiBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHNpemVvZihwSW5zdGFuY2UtPnBURV9UYXBzLT5UcmVibGVCb29zdF9UYXBzKSAvIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpKTsgLyogTnVtYmVyIG9mIHdvcmRzICovCisjZWxzZQogICAgICAgICAgICAgRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPnBURV9TdGF0ZS0+VHJlYmxlQm9vc3RfU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBURV9UYXBzLT5UcmVibGVCb29zdF9UYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTFZNX1RyZWJsZUJvb3N0Q29lZnNbT2Zmc2V0XSk7CkBAIC0zMDksNiArMzM1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZwSW5zdGFuY2UtPnBURV9UYXBzLT5UcmVibGVCb29zdF9UYXBzLCAgLyogRGVzdGluYXRpb24uXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXN0IHRvIHZvaWQ6IG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBJbnN0YW5jZS0+cFRFX1RhcHMtPlRyZWJsZUJvb3N0X1RhcHMpL3NpemVvZihMVk1fSU5UMTYpKSk7IC8qIE51bWJlciBvZiB3b3JkcyAqLworI2VuZGlmCiAgICAgICAgIH0KICAgICB9CiAgICAgZWxzZQpAQCAtMzQyLDYgKzM2OSw5IEBACiAgICAgTFZNX1VJTlQxNiAgICAgIGRCU2hpZnRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNmRCIHNoaWZ0cyAqLwogICAgIExWTV9VSU5UMTYgICAgICBkQk9mZnNldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRhYmxlIG9mZnNldCAqLwogICAgIExWTV9JTlQxNiAgICAgICBWb2x1bWUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlcXVpcmVkIHZvbHVtZSBpbiBkQnMgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWTV9GTE9BVCAgICAgICAgVGVtcDsKKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBMaW1pdCB0aGUgZ2FpbiB0byB0aGUgbWF4aW11bSBhbGxvd2VkCkBAIC00MDEsMjIgKzQzMSw0NiBAQAogICAgICAqLwogICAgIGlmKGRCU2hpZnRzID09IDApCiAgICAgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKUxWTV9Wb2x1bWVUYWJsZVtkQk9mZnNldF0pOworI2Vsc2UKICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpTFZNX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSk7Ci0gICAgfQorI2VuZGlmCisgICAgICAgIH0KICAgICBlbHNlCiAgICAgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIFRlbXAgPSBMVk1fVm9sdW1lVGFibGVbZEJPZmZzZXRdOworICAgICAgICB3aGlsZShkQlNoaWZ0cykgeworICAgICAgICAgICAgVGVtcCA9IFRlbXAgLyAyLjBmOworICAgICAgICAgICAgZEJTaGlmdHMtLTsKKyAgICAgICAgfQorICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwgVGVtcCk7CisjZWxzZQogICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTFZNX0lOVDMyKUxWTV9Wb2x1bWVUYWJsZVtkQk9mZnNldF0pPj5kQlNoaWZ0cykpOworI2VuZGlmCiAgICAgfQogICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gMTsKICAgICBpZihwSW5zdGFuY2UtPk5vU21vb3RoVm9sdW1lID09IExWTV9UUlVFKQogICAgIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLCAyKTsKKyNlbHNlCiAgICAgICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLDAscEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwyKTsKKyNlbmRpZgogICAgIH0KICAgICBlbHNlCiAgICAgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9WQ19NSVhFUl9USU1FLCBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLCAyKTsKKyNlbHNlCiAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLExWTV9WQ19NSVhFUl9USU1FLHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsMik7CisjZW5kaWYKICAgICB9CiB9CiAKQEAgLTU1NCw4ICs2MDgsMjMgQEAKICAgICAgICAgLyogQ29uZmlndXJlIE1peGVyIG1vZHVsZSBmb3IgZ3JhZHVhbCBjaGFuZ2VzIHRvIHZvbHVtZSovCiAgICAgICAgIGlmKExvY2FsUGFyYW1zLlZDX0JhbGFuY2UgPCAwKQogICAgICAgICB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgIExWTV9GTE9BVCBUYXJnZXRfRmxvYXQ7CisjZWxzZQogICAgICAgICAgICAgTFZNX0lOVDMyIFRhcmdldDsKKyNlbmRpZgogICAgICAgICAgICAgLyogRHJvcCBpbiByaWdodCBjaGFubmVsIHZvbHVtZSovCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgIFRhcmdldF9GbG9hdCA9IExWTV9NQVhGTE9BVDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSwgVGFyZ2V0X0Zsb2F0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1ZDX01JWEVSX1RJTUUsIExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsIDEpOworCisgICAgICAgICAgICBUYXJnZXRfRmxvYXQgPSBkQl90b19MaW5GbG9hdCgoTFZNX0lOVDE2KShMb2NhbFBhcmFtcy5WQ19CYWxhbmNlIDw8IDQpKTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSwgVGFyZ2V0X0Zsb2F0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1ZDX01JWEVSX1RJTUUsIExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsIDEpOworI2Vsc2UKICAgICAgICAgICAgIFRhcmdldCA9IExWTV9NQVhJTlRfMTY7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sVGFyZ2V0KTsKICAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOwpAQCAtNTYzLDExICs2MzIsMjcgQEAKICAgICAgICAgICAgIFRhcmdldCA9IGRCX3RvX0xpbjMyKChMVk1fSU5UMTYpKExvY2FsUGFyYW1zLlZDX0JhbGFuY2U8PDQpKTsKICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxUYXJnZXQpOwogICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLExWTV9WQ19NSVhFUl9USU1FLExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsMSk7CisjZW5kaWYKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmKExvY2FsUGFyYW1zLlZDX0JhbGFuY2UgPjApCiAgICAgICAgIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICAgICAgTFZNX0ZMT0FUIFRhcmdldF9GbG9hdDsKKyNlbHNlCiAgICAgICAgICAgICBMVk1fSU5UMzIgVGFyZ2V0OworI2VuZGlmCiAgICAgICAgICAgICAvKiBEcm9wIGluIGxlZnQgY2hhbm5lbCB2b2x1bWUqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgICAgICBUYXJnZXRfRmxvYXQgPSBkQl90b19MaW5GbG9hdCgoTFZNX0lOVDE2KSgoLUxvY2FsUGFyYW1zLlZDX0JhbGFuY2UpIDw8IDQpKTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSwgVGFyZ2V0X0Zsb2F0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1ZDX01JWEVSX1RJTUUsIExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsIDEpOworCisgICAgICAgICAgICBUYXJnZXRfRmxvYXQgPSBMVk1fTUFYRkxPQVQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sIFRhcmdldF9GbG9hdCk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9WQ19NSVhFUl9USU1FLCBMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLCAxKTsKKyNlbHNlCiAgICAgICAgICAgICBUYXJnZXQgPSBkQl90b19MaW4zMigoTFZNX0lOVDE2KSgoLUxvY2FsUGFyYW1zLlZDX0JhbGFuY2UpPDw0KSk7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sVGFyZ2V0KTsKICAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOwpAQCAtNTc1LDE3ICs2NjAsMzYgQEAKICAgICAgICAgICAgIFRhcmdldCA9IExWTV9NQVhJTlRfMTY7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sVGFyZ2V0KTsKICAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOworI2VuZGlmCiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgIExWTV9GTE9BVCBUYXJnZXRfRmxvYXQ7CisjZWxzZQogICAgICAgICAgICAgTFZNX0lOVDMyIFRhcmdldDsKKyNlbmRpZgogICAgICAgICAgICAgLyogTm8gZHJvcCovCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgIFRhcmdldF9GbG9hdCA9IExWTV9NQVhGTE9BVDsKKyNlbHNlCiAgICAgICAgICAgICBUYXJnZXQgPSBMVk1fTUFYSU5UXzE2OworI2VuZGlmCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxUYXJnZXRfRmxvYXQpOworICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLCAxKTsKKworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLFRhcmdldF9GbG9hdCk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9WQ19NSVhFUl9USU1FLExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsIDEpOworI2Vsc2UKICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxUYXJnZXQpOwogICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLExWTV9WQ19NSVhFUl9USU1FLExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsMSk7CiAKICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxUYXJnZXQpOwogICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLExWTV9WQ19NSVhFUl9USU1FLExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsMSk7CisjZW5kaWYKICAgICAgICAgfQogICAgIH0KICAgICAvKgpAQCAtMTAwOCwxOCArMTExMiwzMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICAgQ2FsbEJhY2tQYXJhbSkKIHsKICAgICBMVk1fSW5zdGFuY2VfdCAqcEluc3RhbmNlID0oTFZNX0luc3RhbmNlX3QgICopcEJ1bmRsZUhhbmRsZTsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWTV9GTE9BVCAgICBUYXJnZXQ7CisjZWxzZQogICAgIExWTV9JTlQzMiAgICBUYXJnZXQ7CisjZW5kaWYKIAogICAgICh2b2lkKSBwR2VuZXJhbFB1cnBvc2U7CiAgICAgKHZvaWQpIENhbGxCYWNrUGFyYW07CiAKICAgICAvKiBXaGVuIHZvbHVtZSBtaXhlciBoYXMgcmVhY2hlZCAwIGRCIHRhcmdldCB0aGVuIHN0b3AgaXQgdG8gYXZvaWQKICAgICAgICB1bm5lY2Vzc2FyeSBwcm9jZXNzaW5nLiAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgVGFyZ2V0ID0gTFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0pOworICAgIGlmKFRhcmdldCA9PSAxLjBmKQorICAgIHsKKyAgICAgICAgcEluc3RhbmNlLT5WQ19BY3RpdmUgPSBMVk1fRkFMU0U7CisgICAgfQorI2Vsc2UKICAgICBUYXJnZXQgPSBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSk7CiAKICAgICBpZihUYXJnZXQgPT0gMHg3RkZGKQogICAgIHsKICAgICAgICAgcEluc3RhbmNlLT5WQ19BY3RpdmUgPSBMVk1fRkFMU0U7CiAgICAgfQorI2VuZGlmCiAgICAgcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0luaXQuYwppbmRleCA1NDJjM2M4Li4yNmMxYzRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Jbml0LmMKQEAgLTIzMiw3ICsyMzIsMTEgQEAKICAgICAgICAgLyoKICAgICAgICAgICogU2V0IHRoZSBjYXBhYmlsaXRpZXMKICAgICAgICAgICovCisjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZEQkVfQ0FQX0ZTXzgwMDAgfCBMVkRCRV9DQVBfRlNfMTEwMjUgfCBMVkRCRV9DQVBfRlNfMTIwMDAgfCBMVkRCRV9DQVBfRlNfMTYwMDAgfCBMVkRCRV9DQVBfRlNfMjIwNTAgfCBMVkRCRV9DQVBfRlNfMjQwMDAgfCBMVkRCRV9DQVBfRlNfMzIwMDAgfCBMVkRCRV9DQVBfRlNfNDQxMDAgfCBMVkRCRV9DQVBfRlNfNDgwMDAgfCBMVkRCRV9DQVBfRlNfOTYwMDAgfCBMVkRCRV9DQVBfRlNfMTkyMDAwOworI2Vsc2UKICAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8IExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8IExWREJFX0NBUF9GU18yMjA1MCB8IExWREJFX0NBUF9GU18yNDAwMCB8IExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8IExWREJFX0NBUF9GU180ODAwMDsKKyNlbmRpZgogICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLkNlbnRyZUZyZXF1ZW5jeSA9IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNjZIeiB8IExWREJFX0NBUF9DRU5UUkVfNzhIeiB8IExWREJFX0NBUF9DRU5UUkVfOTBIejsKICAgICAgICAgREJFX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgICAgPSBJbnRlcm5hbEJsb2NrU2l6ZTsKIApAQCAtMjY1LDcgKzI2OSwxMSBAQAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIGNhcGFiaWxpdGllcwogICAgICAgICAgKi8KKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8IExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfCBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8IExWRVFOQl9DQVBfRlNfNDgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzk2MDAwIHwgTFZFUU5CX0NBUF9GU18xOTIwMDA7CisjZWxzZQogICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgPSBMVkVRTkJfQ0FQX0ZTXzgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzExMDI1IHwgTFZFUU5CX0NBUF9GU18xMjAwMCB8IExWRVFOQl9DQVBfRlNfMTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzIyMDUwIHwgTFZFUU5CX0NBUF9GU18yNDAwMCB8IExWRVFOQl9DQVBfRlNfMzIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ0MTAwIHwgTFZFUU5CX0NBUF9GU180ODAwMDsKKyNlbmRpZgogICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5Tb3VyY2VGb3JtYXQgPSBMVkVRTkJfQ0FQX1NURVJFTyB8IExWRVFOQl9DQVBfTU9OT0lOU1RFUkVPOwogICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgPSBJbnRlcm5hbEJsb2NrU2l6ZTsKICAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuTWF4QmFuZHMgICAgID0gcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHM7CkBAIC01NDIsMTAgKzU1MCwxNSBAQAogICAgICAgICBCdW5kbGVTY3JhdGNoU2l6ZSA9IChMVk1fSU5UMzIpKDYgKiAoTUlOX0lOVEVSTkFMX0JMT0NLU0laRSArIEludGVybmFsQmxvY2tTaXplKSAqIHNpemVvZihMVk1fSU5UMTYpKTsKICAgICAgICAgcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+cFNjcmF0Y2ggPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXSwgICAvKiBTY3JhdGNoIDEgYnVmZmVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQzMilCdW5kbGVTY3JhdGNoU2l6ZSk7Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBpbnB1dCBkZWxheSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikmcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+SW5EZWxheUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFKSk7CisjZWxzZQogICAgICAgICBMb2FkQ29uc3RfMTYoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBpbnB1dCBkZWxheSBidWZmZXIgKi8KICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKikmcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+SW5EZWxheUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFKSk7CisjZW5kaWYKICAgICAgICAgcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+SW5EZWxheVNhbXBsZXMgPSBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFOyAvKiBTZXQgdGhlIG51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCiAgICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPk91dERlbGF5U2FtcGxlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogTm8gc2FtcGxlcyBpbiB0aGUgb3V0cHV0IGJ1ZmZlciAqLwogICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5CdWZmZXJTdGF0ZSA9IExWTV9GSVJTVENBTEw7ICAgICAgICAgICAgIC8qIFNldCB0aGUgc3RhdGUgcmVhZHkgZm9yIHRoZSBmaXJzdCBjYWxsICovCkBAIC01OTgsMTQgKzYxMSwyNiBAQAogICAgIC8qIEluIG1hbmFnZWQgYnVmZmVyaW5nLCBzdGFydCB3aXRoIGxvdyBzaWduYWwgbGV2ZWwgYXMgZGVsYXkgaW4gYnVmZmVyIG1hbmFnZW1lbnQgY2F1c2VzIGEgY2xpY2sqLwogICAgIGlmIChwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQogICAgIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sIDAsIDApOworI2Vsc2UKICAgICAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLDAsMCk7CisjZW5kaWYKICAgICB9CiAgICAgZWxzZQogICAgIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sIExWTV9NQVhGTE9BVCwgTFZNX01BWEZMT0FUKTsKKyNlbHNlCiAgICAgICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSxMVk1fTUFYSU5UXzE2LExWTV9NQVhJTlRfMTYpOworI2VuZGlmCiAgICAgfQogCisjaWZkZWYgQlVJTERfRkxPQVQKICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwwLExWTV9GU184MDAwLDIpOworI2Vsc2UKKyAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwgMCwgTFZNX0ZTXzgwMDAsIDIpOworI2VuZGlmCiAKICAgICBwSW5zdGFuY2UtPlZDX1ZvbHVtZWRCICAgICAgICAgICAgICAgICAgPSAwOwogICAgIHBJbnN0YW5jZS0+VkNfQVZMRml4ZWRWb2x1bWUgICAgICAgICAgICA9IDA7CkBAIC02MTUsMTUgKzY0MCwyNCBAQAogICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCAgICAgICAgPSAwOwogICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgICAgPSBwSW5zdGFuY2U7CiAgICAgcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAgICAgICAgICA9IExWTV9WQ0NhbGxCYWNrOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSwgTFZNX01BWEZMT0FULCBMVk1fTUFYRkxPQVQpOworI2Vsc2UKICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLExWTV9NQVhJTlRfMTYsTFZNX01BWElOVF8xNik7CisjZW5kaWYKICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sTFZNX1ZDX01JWEVSX1RJTUUsTFZNX0ZTXzgwMDAsMik7CiAKICAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSAgICAgID0gMDsKICAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgICAgICAgID0gMDsKICAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0ucENhbGxiYWNrSGFuZGxlICAgID0gcEluc3RhbmNlOwogICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2sgICAgICAgICAgPSBMVk1fVkNDYWxsQmFjazsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sIExWTV9NQVhGTE9BVCwgTFZNX01BWEZMT0FUKTsKKyNlbHNlCiAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxMVk1fTUFYSU5UXzE2LExWTV9NQVhJTlRfMTYpOworI2VuZGlmCiAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLExWTV9WQ19NSVhFUl9USU1FLExWTV9GU184MDAwLDIpOworCiAgICAgLyoKICAgICAgKiBTZXQgdGhlIGRlZmF1bHQgRVFOQiBwcmUtZ2FpbiBhbmQgcG9pbnRlciB0byB0aGUgYmFuZCBkZWZpbml0aW9ucwogICAgICAqLwpAQCAtNzA5LDcgKzc0MywxMSBAQAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcwogICAgICAgICAgKi8KKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8IExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8IExWREJFX0NBUF9GU18yMjA1MCB8IExWREJFX0NBUF9GU18yNDAwMCB8IExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8IExWREJFX0NBUF9GU180ODAwMCB8IExWREJFX0NBUF9GU185NjAwMCB8IExWREJFX0NBUF9GU18xOTIwMDA7CisjZWxzZQogICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWREJFX0NBUF9GU184MDAwIHwgTFZEQkVfQ0FQX0ZTXzExMDI1IHwgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwgTFZEQkVfQ0FQX0ZTXzMyMDAwIHwgTFZEQkVfQ0FQX0ZTXzQ0MTAwIHwgTFZEQkVfQ0FQX0ZTXzQ4MDAwOworI2VuZGlmCiAgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuQ2VudHJlRnJlcXVlbmN5ID0gTFZEQkVfQ0FQX0NFTlRSRV81NUh6IHwgTFZEQkVfQ0FQX0NFTlRSRV81NUh6IHwgTFZEQkVfQ0FQX0NFTlRSRV82Nkh6IHwgTFZEQkVfQ0FQX0NFTlRSRV83OEh6IHwgTFZEQkVfQ0FQX0NFTlRSRV85MEh6OwogICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSAgICA9IChMVk1fVUlOVDE2KUludGVybmFsQmxvY2tTaXplOwogCkBAIC03NjMsNyArODAxLDExIEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCB0aGUgaW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzCiAgICAgICAgICAqLworI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkVRTkJfQ0FQX0ZTXzgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzExMDI1IHwgTFZFUU5CX0NBUF9GU18xMjAwMCB8IExWRVFOQl9DQVBfRlNfMTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzIyMDUwIHwgTFZFUU5CX0NBUF9GU18yNDAwMCB8IExWRVFOQl9DQVBfRlNfMzIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ0MTAwIHwgTFZFUU5CX0NBUF9GU180ODAwMCB8IExWRVFOQl9DQVBfRlNfOTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE5MjAwMDsKKyNlbHNlCiAgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfCBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8IExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ4MDAwOworI2VuZGlmCiAgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSAgICA9IChMVk1fVUlOVDE2KUludGVybmFsQmxvY2tTaXplOwogICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5NYXhCYW5kcyAgICAgICAgPSBwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kczsKICAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU291cmNlRm9ybWF0ICAgID0gTFZFUU5CX0NBUF9TVEVSRU8gfCBMVkVRTkJfQ0FQX01PTk9JTlNURVJFTzsKQEAgLTg2OCw5ICs5MTAsMTQgQEAKICAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUpOwogCiAgICAgICAgICAgICAvKiBGYXN0IFRlbXBvcmFyeSAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9URU1QT1JBUllfRkFTVF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQzMikgTUFYX0lOVEVSTkFMX0JMT0NLU0laRSAqIHNpemVvZihMVk1fSU5UMTYpKTsKLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDMyKSBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKKyNlbHNlCisgICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9URU1QT1JBUllfRkFTVF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMzIpIE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUgKiBzaXplb2YoTFZNX0lOVDE2KSk7CisjZW5kaWYKICAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzICAgICAgID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXSwwKTsKIAogCkBAIC05OTQsNyArMTA0MSw2IEBACiAgICAgLyogREMgcmVtb3ZhbCBmaWx0ZXIgKi8KICAgICBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSk7CiAKLQogICAgIHJldHVybiBMVk1fU1VDQ0VTUzsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmgKaW5kZXggMmU4NWY3Ny4uYjQ1MzIyMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJpdmF0ZS5oCkBAIC0xMzgsNiArMTM4LDIzIEBACiAKIAogLyogQnVmZmVyIE1hbmFnZW1lbnQgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2g7ICAgICAgICAgIC8qIEJ1bmRsZSBzY3JhdGNoIGJ1ZmZlciAqLworCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgQnVmZmVyU3RhdGU7ICAgICAgICAvKiBCdWZmZXIgc3RhdHVzICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgSW5EZWxheUJ1ZmZlcls2ICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRV07IC8qIElucHV0IGJ1ZmZlciBkZWxheSBsaW5lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGFuZCByaWdodCAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEluRGVsYXlTYW1wbGVzOyAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGlucHV0IGRlbGF5IGJ1ZmZlciAqLworCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgT3V0RGVsYXlCdWZmZXJbMiAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkVdOyAvKiBPdXRwdXQgYnVmZmVyIGRlbGF5IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE91dERlbGF5U2FtcGxlczsgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIG91dHB1dCBkZWxheSBidWZmZXIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBhbmQgcmlnaHQgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBTYW1wbGVzVG9PdXRwdXQ7ICAgIC8qIFNhbXBsZXMgdG8gd3JpdGUgdG8gdGhlIG91dHB1dCAqLworfSBMVk1fQnVmZmVyX3Q7CisjZWxzZQogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcFNjcmF0Y2g7ICAgICAgICAgIC8qIEJ1bmRsZSBzY3JhdGNoIGJ1ZmZlciAqLwpAQCAtMTUwLDIyICsxNjcsMjggQEAKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBPdXREZWxheVNhbXBsZXM7ICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBvdXRwdXQgZGVsYXkgYnVmZmVyLCBsZWZ0IGFuZCByaWdodCAqLwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFNhbXBsZXNUb091dHB1dDsgICAgLyogU2FtcGxlcyB0byB3cml0ZSB0byB0aGUgb3V0cHV0ICovCiB9IExWTV9CdWZmZXJfdDsKLQorI2VuZGlmCiAKIC8qIEZpbHRlciB0YXBzICovCiB0eXBlZGVmIHN0cnVjdAogeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgQmlxdWFkXzJJX09yZGVyMV9GTE9BVF9UYXBzX3QgVHJlYmxlQm9vc3RfVGFwczsgICAvKiBUcmVibGUgYm9vc3QgVGFwcyAqLworI2Vsc2UKICAgICBCaXF1YWRfMklfT3JkZXIxX1RhcHNfdCBUcmVibGVCb29zdF9UYXBzOyAgIC8qIFRyZWJsZSBib29zdCBUYXBzICovCisjZW5kaWYKIH0gTFZNX1RFX0RhdGFfdDsKIAotCiAvKiBDb2VmZmljaWVudHMgKi8KIHR5cGVkZWYgc3RydWN0CiB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICBUcmVibGVCb29zdF9TdGF0ZTsgIC8qIFN0YXRlIGZvciB0aGUgdHJlYmxlIGJvb3N0IGZpbHRlciAqLworI2Vsc2UKICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICBUcmVibGVCb29zdF9TdGF0ZTsgIC8qIFN0YXRlIGZvciB0aGUgdHJlYmxlIGJvb3N0IGZpbHRlciAqLworI2VuZGlmCiB9IExWTV9URV9Db2Vmc190OwogCi0KIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgLyogUHVibGljIHBhcmFtZXRlcnMgKi8KQEAgLTE4MSwxNSArMjA0LDI0IEBACiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgSW50ZXJuYWxCbG9ja1NpemU7ICAvKiBNYXhpbXVtIGludGVybmFsIGJsb2NrIHNpemUgKi8KICAgICBMVk1fQnVmZmVyX3QgICAgICAgICAgICAqcEJ1ZmZlck1hbmFnZW1lbnQ7IC8qIEJ1ZmZlciBtYW5hZ2VtZW50IHZhcmlhYmxlcyAqLwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFNhbXBsZXNUb1Byb2Nlc3M7ICAgLyogSW5wdXQgc2FtcGxlcyBsZWZ0IHRvIHByb2Nlc3MgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwSW5wdXRTYW1wbGVzOyAgICAgLyogRXh0ZXJuYWwgaW5wdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcE91dHB1dFNhbXBsZXM7ICAgIC8qIEV4dGVybmFsIG91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworI2Vsc2UKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcElucHV0U2FtcGxlczsgICAgIC8qIEV4dGVybmFsIGlucHV0IHNhbXBsZSBwb2ludGVyICovCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBPdXRwdXRTYW1wbGVzOyAgICAvKiBFeHRlcm5hbCBvdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyNlbmRpZgogCiAgICAgLyogQ29uZmlndXJhdGlvbiBudW1iZXIgKi8KICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uTnVtYmVyOwogICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIEJsaWNrU2l6ZU11bHRpcGxlOwogCiAgICAgLyogREMgcmVtb3ZhbCAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgRENfUmVtb3ZhbEluc3RhbmNlOyAvKiBEQyByZW1vdmFsIGZpbHRlciBpbnN0YW5jZSAqLworI2Vsc2UKICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICBEQ19SZW1vdmFsSW5zdGFuY2U7IC8qIERDIHJlbW92YWwgZmlsdGVyIGluc3RhbmNlICovCisjZW5kaWYKIAogICAgIC8qIENvbmNlcnQgU291bmQgKi8KICAgICBMVkNTX0hhbmRsZV90ICAgICAgICAgICBoQ1NJbnN0YW5jZTsgICAgICAgIC8qIENvbmNlcnQgU291bmQgaW5zdGFuY2UgaGFuZGxlICovCkBAIC0yMDksOCArMjQxLDE2IEBACiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgREJFX0FjdGl2ZTsgICAgICAgICAvKiBDb250cm9sIGZsYWcgKi8KIAogICAgIC8qIFZvbHVtZSBDb250cm9sICovCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVk1peGVyM18xU3RfRkxPQVRfc3QgICBWQ19Wb2x1bWU7ICAgICAgICAgIC8qIFZvbHVtZSBzY2FsZXIgKi8KKyNlbHNlCiAgICAgTFZNaXhlcjNfMVN0X3N0ICAgICAgICAgVkNfVm9sdW1lOyAgICAgICAgICAvKiBWb2x1bWUgc2NhbGVyICovCisjZW5kaWYKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgICAgICAgIFZDX0JhbGFuY2VNaXg7ICAgICAgLyogVkMgYmFsYW5jZSBtaXhlciAqLworI2Vsc2UKICAgICBMVk1peGVyM18yU3Rfc3QgICAgICAgICBWQ19CYWxhbmNlTWl4OyAgICAgIC8qIFZDIGJhbGFuY2UgbWl4ZXIgKi8KKyNlbmRpZgogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFZDX1ZvbHVtZWRCOyAgICAgICAgLyogR2FpbiBpbiBkQiAqLwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFZDX0FjdGl2ZTsgICAgICAgICAgLyogQ29udHJvbCBmbGFnICovCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVkNfQVZMRml4ZWRWb2x1bWU7ICAvKiBBVkwgZml4ZWQgdm9sdW1lICovCkBAIC0yMzQsNyArMjc0LDExIEBACiAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgUFNBX0NvbnRyb2xQYXJhbXM7ICAvKiBTcGVjdHJ1bSBBbmFseXplciBjb250cm9sIHBhcmFtZXRlcnMgKi8KICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBQU0FfR2Fpbk9mZnNldDsgICAgIC8qIFRvbmUgY29udHJvbCBmbGFnICovCiAgICAgTFZNX0NhbGxiYWNrICAgICAgICAgICAgQ2FsbEJhY2s7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFBTQUlucHV0OyAgICAgICAgIC8qIFBTQSBpbnB1dCBwb2ludGVyICovCisjZWxzZQogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwUFNBSW5wdXQ7ICAgICAgICAgLyogUFNBIGlucHV0IHBvaW50ZXIgKi8KKyNlbmRpZgogCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICBOb1Ntb290aFZvbHVtZTsgICAgICAvKiBFbmFibGUgb3IgZGlzYWJsZSBzbW9vdGggdm9sdW1lIGNoYW5nZXMqLwogCkBAIC0yNjEsMTYgKzMwNSwyOCBAQAogCiB2b2lkICAgIExWTV9TZXRIZWFkcm9vbSggICAgTFZNX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpOwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgICAgTFZNX0J1ZmZlckluKCAgIExWTV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgKipwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgKipwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgKnBOdW1TYW1wbGVzKTsKKyNlbHNlCiB2b2lkICAgIExWTV9CdWZmZXJJbiggICBMVk1fSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICoqcFRvUHJvY2VzcywKICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICoqcFByb2Nlc3NlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICpwTnVtU2FtcGxlcyk7Ci0KKyNlbmRpZgorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkICAgIExWTV9CdWZmZXJPdXQoICBMVk1fSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAqcE51bVNhbXBsZXMpOworI2Vsc2UKIHZvaWQgICAgTFZNX0J1ZmZlck91dCggIExWTV9IYW5kbGVfdCAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICpwTnVtU2FtcGxlcyk7CisjZW5kaWYKIAogTFZNX0lOVDMyIExWTV9BbGdvQ2FsbEJhY2soICAgICB2b2lkICAgICAgICAgICpwQnVuZGxlSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwRGF0YSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJvY2Vzcy5jCmluZGV4IGY1YTAxZjMuLjRhMTlhMTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYwpAQCAtNTEsNyArNTEsMjMxIEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1Byb2Nlc3MoTFZNX0hhbmRsZV90ICAgICAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZSkKK3sKIAorICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9VSU5UMTYgICAgICAgICAgU2FtcGxlQ291bnQgPSBOdW1TYW1wbGVzOworICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBJbnB1dCAgICAgPSAoTFZNX0ZMT0FUICopcEluRGF0YTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICpwVG9Qcm9jZXNzID0gKExWTV9GTE9BVCAqKXBJbkRhdGE7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcFByb2Nlc3NlZCA9IHBPdXREYXRhOworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gIFN0YXR1czsKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIHplcm8KKyAgICAgKi8KKyAgICBpZiAoTnVtU2FtcGxlcyA9PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogQ2hlY2sgdmFsaWQgcG9pbnRzIGhhdmUgYmVlbiBnaXZlbgorICAgICAqLworICAgIGlmICgoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEluRGF0YSA9PSBMVk1fTlVMTCkgfHwgKHBPdXREYXRhID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEZvciB1bm1hbmFnZWQgbW9kZSBvbmx5CisgICAgICovCisgICAgaWYocEluc3RhbmNlLT5JbnN0UGFyYW1zLkJ1ZmZlck1vZGUgPT0gTFZNX1VOTUFOQUdFRF9CVUZGRVJTKQorICAgIHsKKyAgICAgICAgIC8qCisgICAgICAgICAqIENoZWNrIGlmIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBhIGdvb2QgbXVsdGlwbGUgKHVubWFuYWdlZCBtb2RlIG9ubHkpCisgICAgICAgICAqLworICAgICAgICBpZigoTnVtU2FtcGxlcyAlIHBJbnN0YW5jZS0+QmxpY2tTaXplTXVsdGlwbGUpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybihMVk1fSU5WQUxJRE5VTVNBTVBMRVMpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2hlY2sgdGhlIGJ1ZmZlciBhbGlnbm1lbnQKKyAgICAgICAgICovCisgICAgICAgIGlmKCgoKHVpbnRwdHJfdClwSW5EYXRhICUgNCkgIT0gMCkgfHwgKCgodWludHB0cl90KXBPdXREYXRhICUgNCkgIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybihMVk1fQUxJR05NRU5URVJST1IpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSBuZXcgcGFyYW1ldGVycyBpZiBuZWNlc3NhcnkKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5Db250cm9sUGVuZGluZyA9PSBMVk1fVFJVRSkKKyAgICB7CisgICAgICAgIFN0YXR1cyA9IExWTV9BcHBseU5ld1NldHRpbmdzKGhJbnN0YW5jZSk7CisKKyAgICAgICAgaWYoU3RhdHVzICE9IExWTV9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKgorICAgICAqIENvbnZlcnQgZnJvbSBNb25vIGlmIG5lY2Vzc2FyeQorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX01PTk8pCisgICAgeworICAgICAgICBNb25vVG8ySV9GbG9hdChwSW5EYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KKyAgICAgICAgcElucHV0ICAgICA9IHBPdXREYXRhOworICAgICAgICBwVG9Qcm9jZXNzID0gcE91dERhdGE7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFByb2Nlc3MgdGhlIGRhdGEgd2l0aCBtYW5hZ2VkIGJ1ZmZlcnMKKyAgICAgKi8KKyAgICB3aGlsZSAoU2FtcGxlQ291bnQgIT0gMCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIE1hbmFnZSB0aGUgaW5wdXQgYnVmZmVyIGFuZCBmcmFtZSBwcm9jZXNzaW5nCisgICAgICAgICAqLworICAgICAgICBMVk1fQnVmZmVySW4oaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgcElucHV0LAorICAgICAgICAgICAgICAgICAgICAgJnBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAmcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICZTYW1wbGVDb3VudCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogT25seSBwcm9jZXNzIGRhdGEgd2hlbiBTYW1wbGVDb3VudCBpcyBub25lIHplcm8sIGEgemVybyBjb3VudCBjYW4gb2NjdXIgd2hlbgorICAgICAgICAgKiB0aGUgQnVmZmVySW4gcm91dGluZSBpcyB3b3JraW5nIGluIG1hbmFnZWQgbW9kZS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChTYW1wbGVDb3VudCAhPSAwKQorICAgICAgICB7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBcHBseSBDb25jZXJ0U291bmQgaWYgcmVxdWlyZWQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+Q1NfQWN0aXZlID09IExWTV9UUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICh2b2lkKUxWQ1NfUHJvY2VzcyhwSW5zdGFuY2UtPmhDU0luc3RhbmNlLCAgICAgLyogQ29uY2VydCBTb3VuZCBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlQ291bnQpOworICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MgPSBwUHJvY2Vzc2VkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQXBwbHkgdm9sdW1lIGlmIHJlcXVpcmVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPlZDX0FjdGl2ZSE9MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBTYW1wbGVDb3VudCkpOyAgICAgLyogTGVmdCBhbmQgcmlnaHQqLworICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MgPSBwUHJvY2Vzc2VkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ2FsbCBOLUJhbmQgZXF1YWxpc2VyIGlmIGVuYWJsZWQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+RVFOQl9BY3RpdmUgPT0gTFZNX1RSVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTFZFUU5CX1Byb2Nlc3MocEluc3RhbmNlLT5oRVFOQkluc3RhbmNlLCAgICAvKiBOLUJhbmQgZXF1YWxpc2VyIGluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVDb3VudCk7CisgICAgICAgICAgICAgICAgcFRvUHJvY2VzcyA9IHBQcm9jZXNzZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDYWxsIGJhc3MgZW5oYW5jZW1lbnQgaWYgZW5hYmxlZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5EQkVfQWN0aXZlID09IExWTV9UUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExWREJFX1Byb2Nlc3MocEluc3RhbmNlLT5oREJFSW5zdGFuY2UsICAgICAgIC8qIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZUNvdW50KTsKKyAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzID0gcFByb2Nlc3NlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEJ5cGFzcyBtb2RlIG9yIGV2ZXJ5dGhpbmcgb2ZmLCBzbyBjb3B5IHRoZSBpbnB1dCB0byB0aGUgb3V0cHV0CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwVG9Qcm9jZXNzICE9IHBQcm9jZXNzZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29weV9GbG9hdChwVG9Qcm9jZXNzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBTYW1wbGVDb3VudCkpOyAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQXBwbHkgdHJlYmxlIGJvb3N0IGlmIHJlcXVpcmVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPlRFX0FjdGl2ZSA9PSBMVk1fVFJVRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIEFwcGx5IHRoZSBmaWx0ZXIKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBGT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPnBURV9TdGF0ZS0+VHJlYmxlQm9vc3RfU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpU2FtcGxlQ291bnQpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBWb2x1bWUgYmFsYW5jZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVDb3VudCk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBQZXJmb3JtIFBhcmFtZXRyaWMgU3BlY3R1bSBBbmFseXNpcworICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLlBTQV9FbmFibGUgPT0gTFZNX1BTQV9PTikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQgPT0gTFZNX1BTQV9PTikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZyb20yaVRvTW9ub19GbG9hdChwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShTYW1wbGVDb3VudCkpOworCisgICAgICAgICAgICAgICAgICAgIExWUFNBX1Byb2Nlc3MocEluc3RhbmNlLT5oUFNBSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKFNhbXBsZUNvdW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RpbWUpOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBEQyByZW1vdmFsCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIERDXzJJX0QxNl9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilTYW1wbGVDb3VudCk7CisKKworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFuYWdlIHRoZSBvdXRwdXQgYnVmZmVyCisgICAgICAgICAqLworICAgICAgICBMVk1fQnVmZmVyT3V0KGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAmU2FtcGxlQ291bnQpOworCisgICAgfQorCisgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKK30KKyNlbHNlCiBMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9Qcm9jZXNzKExWTV9IYW5kbGVfdCAgICAgICAgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwT3V0RGF0YSwKQEAgLTI3MywzICs0OTcsNCBAQAogCiAgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKIH0KKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuYwppbmRleCBlMTRmOTA5Li4xOTlkZGRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5jCkBAIC0yOSw3ICsyOSwzNDIgQEAKIC8qICAgIFRyZWJsZSBCb29zdCBGaWx0ZXIgQ29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAogCitGT19GTE9BVF9MU2h4X0NvZWZzX3QgICAgTFZNX1RyZWJsZUJvb3N0Q29lZnNbXSA9IHsKKworICAgICAgICAgICAgICAgICAgICAvKiAyMmtIeiBzYW1wbGluZyByYXRlICovCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW40X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW40X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjVfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA2ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluNl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluNl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDcgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW43X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW43X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjhfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjhfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA5ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluOV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluOV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjEwX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xMF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjExX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjEyX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjEzX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjE0X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjE1X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xNV9CMX0sCisKKyAgICAgICAgICAgICAgICAgICAgLyogMjRrSHogc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4yX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW4yX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW41X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW41X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjZfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjZfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluN19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluN19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW44X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW44X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjlfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjlfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xMF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTBfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTVfQjF9LAorCisgICAgICAgICAgICAgICAgICAgIC8qIDMya0h6IHNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4zX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4zX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluNV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW42X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW42X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjdfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluOF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluOF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW45X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW45X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjEwX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjExX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjEyX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjEzX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjE0X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjE1X0IxfSwKKworICAgICAgICAgICAgICAgICAgICAvKiA0NGtIeiBzYW1wbGluZyByYXRlICovCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4xX0IxLH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4yX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4yX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW41X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW41X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjZfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjZfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluN19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluN19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW44X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW44X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjlfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjlfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xMF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTBfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTVfQjF9LAorCisgICAgICAgICAgICAgICAgICAgIC8qIDQ4a0h6IHNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4zX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4zX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluNV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW42X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW42X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjdfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluOF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluOF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW45X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW45X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjEwX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjExX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjEyX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjEzX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjE0X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjE1X0IxfQorI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICAgIC8qIDk2a0h6IHNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4xX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4yX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluM19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4zX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW40X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW41X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluNl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW42X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluN19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW43X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluOF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW44X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluOV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW45X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xMF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4xMF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMTFfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMTFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjEyX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjEyX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xM19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4xM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMTRfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMTRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjE1X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjE1X0IxfSwKKworICAgICAgICAgICAgICAgICAgICAvKiAxOTJrSHogc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjJfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjNfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjVfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjVfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjZfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjZfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjdfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjhfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjhfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjlfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjlfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjEwX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjExX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4xMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluMTJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjEzX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjE0X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4xNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluMTVfQjF9CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgfTsKKyNlbHNlCiBGT19DMTZfTFNoeF9Db2Vmc190ICAgIExWTV9UcmVibGVCb29zdENvZWZzW10gPSB7CiAKICAgICAgICAgICAgICAgICAgICAgLyogMjJrSHogc2FtcGxpbmcgcmF0ZSAqLwpAQCAtMzQwLDggKzY3NSw5IEBACiAgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNSAqLwogICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjE1X0EwLAogICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xNV9CMSwKLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xNV9TaGlmdH19OwotCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTVfU2hpZnR9CisgICAgICAgICAgICAgICAgICAgIH07CisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM1MCw2ICs2ODYsMTYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIGRCIHRvIGxpbmVhciBjb252ZXJzaW9uIHRhYmxlICovCisjaWZkZWYgQlVJTERfRkxPQVQKK2NvbnN0IExWTV9GTE9BVCBMVk1fVm9sdW1lVGFibGVbXSA9IHsKKyAgICAxLjAwMGYsICAgICAgICAgICAgIC8qICAwZEIgKi8KKyAgICAwLjg5MWYsICAgICAgICAgICAgIC8qIC0xZEIgKi8KKyAgICAwLjc5NGYsICAgICAgICAgICAgIC8qIC0yZEIgKi8KKyAgICAwLjcwOGYsICAgICAgICAgICAgIC8qIC0zZEIgKi8KKyAgICAwLjYzMWYsICAgICAgICAgICAgIC8qIC00ZEIgKi8KKyAgICAwLjU2MmYsICAgICAgICAgICAgIC8qIC01ZEIgKi8KKyAgICAwLjUwMWZ9OyAgICAgICAgICAgIC8qIC02ZEIgKi8KKyNlbHNlCiBjb25zdCBMVk1fSU5UMTYgTFZNX1ZvbHVtZVRhYmxlW10gPSB7CiAgICAgMHg3RkZGLCAgICAgICAgICAgICAvKiAgMGRCICovCiAgICAgMHg3MjE1LCAgICAgICAgICAgICAvKiAtMWRCICovCkBAIC0zNTgsNiArNzA0LDcgQEAKICAgICAweDUwQzMsICAgICAgICAgICAgIC8qIC00ZEIgKi8KICAgICAweDQ3RkIsICAgICAgICAgICAgIC8qIC01ZEIgKi8KICAgICAweDQwMDB9OyAgICAgICAgICAgIC8qIC02ZEIgKi8KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuaAppbmRleCBhNzYwMWZmLi40Y2Y3MTE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5oCkBAIC0zNywxNiArMzcsMjMgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZkZWYgQlVJTERfRkxPQVQKK2V4dGVybiBGT19GTE9BVF9MU2h4X0NvZWZzX3QgICAgIExWTV9UcmVibGVCb29zdENvZWZzW107CisjZWxzZQogZXh0ZXJuIEZPX0MxNl9MU2h4X0NvZWZzX3QgICAgIExWTV9UcmVibGVCb29zdENvZWZzW107Ci0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFZvbHVtZSBjb250cm9sIGdhaW4gYW5kIHRpbWUgY29uc3RhbnQgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitleHRlcm4gY29uc3QgTFZNX0ZMT0FUIExWTV9Wb2x1bWVUYWJsZVtdOworI2Vsc2UKIGV4dGVybiBjb25zdCBMVk1fSU5UMTYgTFZNX1ZvbHVtZVRhYmxlW107CisjZW5kaWYKKwogZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiBMVk1fTWl4ZXJUQ1RhYmxlW107CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQUdDLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9BR0MuaAppbmRleCAyMDgwZDY0Li45YTNkMzVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9BR0MuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9BR0MuaApAQCAtMzcsNyArMzcsNyBAQAogLyogICAgVHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9JTlQzMiAgQUdDX0dhaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGN1cnJlbnQgQUdDIGdhaW4gKi8KQEAgLTUyLDIwICs1MiwzOSBAQAogICAgIExWTV9JTlQxNiAgVm9sdW1lVEM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogVm9sdW1lIHVwZGF0ZSB0aW1lIGNvbnN0YW50ICovCiAKIH0gQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfdDsKKyNlbHNlCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9GTE9BVCAgQUdDX0dhaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGN1cnJlbnQgQUdDIGdhaW4gKi8KKyAgICBMVk1fRkxPQVQgIEFHQ19NYXhHYWluOyAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBtYXhpbXVtIEFHQyBnYWluICovCisgICAgTFZNX0ZMT0FUICBWb2x1bWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgY3VycmVudCB2b2x1bWUgc2V0dGluZyAqLworICAgIExWTV9GTE9BVCAgVGFyZ2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIHRhcmdldCB2b2x1bWUgc2V0dGluZyAqLworICAgIExWTV9GTE9BVCAgQUdDX1RhcmdldDsgICAgICAgICAgICAgICAgICAgICAgLyogQUdDIHRhcmdldCBsZXZlbCAqLworICAgIExWTV9GTE9BVCAgQUdDX0F0dGFjazsgICAgICAgICAgICAgICAgICAgICAgLyogQUdDIGF0dGFjayBzY2FsZXIgKi8KKyAgICBMVk1fRkxPQVQgIEFHQ19EZWNheTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEFHQyBkZWNheSBzY2FsZXIgKi8KKyAgICBMVk1fRkxPQVQgIFZvbHVtZVRDOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZvbHVtZSB1cGRhdGUgdGltZSBjb25zdGFudCAqLwogCit9IEFHQ19NSVhfVk9MXzJTdDFNb25fRkxPQVRfdDsKKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEoQUdDX01JWF9WT0xfMlN0MU1vbl9GTE9BVF90ICAqcEluc3RhbmNlLCAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBTdFNyYywgICAgICAgIC8qIFN0ZXJlbyBzb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwTW9ub1NyYywgICAgICAvKiBNb25vIHNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBEc3QsICAgICAgICAgIC8qIFN0ZXJlbyBkZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgbik7ICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICovCisjZWxzZQogdm9pZCBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEoQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfdCAgKnBJbnN0YW5jZSwgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgICAgICAgICpwU3RTcmMsICAgICAgICAvKiBTdGVyZW8gc291cmNlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICAgICAgICAqcE1vbm9TcmMsICAgICAgLyogTW9ubyBzb3VyY2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICpwRHN0LCAgICAgICAgICAvKiBTdGVyZW8gZGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIG4pOyAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAqLwotCisjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9CSVFVQUQuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oCmluZGV4IDdhYzdmYmQuLjNlZTdmNjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oCkBAIC0yNywxOSArMjcsMzQgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBJTlNUQU5DRSBNRU1PUlkgVFlQRSBERUZJTklUSU9OCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgU3RvcmFnZVs2XTsKIAorfSBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdDsKKyNlbHNlCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9JTlQzMiBTdG9yYWdlWzZdOwogCiB9IEJpcXVhZF9JbnN0YW5jZV90OwotCi0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIENPRUZGSUNJRU5UIFRZUEUgREVGSU5JVElPTlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioqIEJpcXVhZCBjb2VmZmljaWVudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgIEEyOyAgIC8qICBhMiAgKi8KKyAgICBMVk1fRkxPQVQgIEExOyAgIC8qICBhMSAgKi8KKyAgICBMVk1fRkxPQVQgIEEwOyAgIC8qICBhMCAgKi8KKyAgICBMVk1fRkxPQVQgIEIyOyAgIC8qIC1iMiEgKi8KKyAgICBMVk1fRkxPQVQgIEIxOyAgIC8qIC1iMSEgKi8KK30gQlFfRkxPQVRfQ29lZnNfdDsKKyNlbHNlCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9JTlQxNiBBMjsgICAvKiAgYTIgICovCkBAIC01Nyw4ICs3MiwxNyBAQAogICAgIExWTV9JTlQzMiAgQjI7ICAgLyogLWIyISAqLwogICAgIExWTV9JTlQzMiAgQjE7ICAgLyogLWIxISAqLwogfSBCUV9DMzJfQ29lZnNfdDsKKyNlbmRpZgogCiAvKioqIEZpcnN0IG9yZGVyIGNvZWZmaWNpZW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgQTE7ICAgLyogIGExICAqLworICAgIExWTV9GTE9BVCBBMDsgICAvKiAgYTAgICovCisgICAgTFZNX0ZMT0FUIEIxOyAgIC8qIC1iMSEgKi8KK30gRk9fRkxPQVRfQ29lZnNfdDsKKyNlbHNlCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9JTlQxNiBBMTsgICAvKiAgYTEgICovCkBAIC03Miw4ICs5NiwxNyBAQAogICAgIExWTV9JTlQzMiAgQTA7ICAgLyogIGEwICAqLwogICAgIExWTV9JTlQzMiAgQjE7ICAgLyogLWIxISAqLwogfSBGT19DMzJfQ29lZnNfdDsKKyNlbmRpZgogCiAvKioqIEZpcnN0IG9yZGVyIGNvZWZmaWNpZW50cyB3aXRoIFNoaWZ0KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUIEExOyAgICAvKiAgYTEgICovCisgICAgTFZNX0ZMT0FUIEEwOyAgICAvKiAgYTAgICovCisgICAgTFZNX0ZMT0FUIEIxOyAgICAvKiAtYjEhICovCit9IEZPX0ZMT0FUX0xTaHhfQ29lZnNfdDsKKyNlbHNlCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9JTlQxNiBBMTsgICAgLyogIGExICAqLwpAQCAtODEsOCArMTE0LDE2IEBACiAgICAgTFZNX0lOVDE2IEIxOyAgICAvKiAtYjEhICovCiAgICAgTFZNX0lOVDE2IFNoaWZ0OyAvKiBTaGlmdCAqLwogfSBGT19DMTZfTFNoeF9Db2Vmc190OwotCisjZW5kaWYKIC8qKiogQmFuZCBwYXNzIGNvZWZmaWNpZW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9GTE9BVCAgQTA7ICAgLyogIGEwICAqLworICAgIExWTV9GTE9BVCAgQjI7ICAgLyogLWIyISAqLworICAgIExWTV9GTE9BVCAgQjE7ICAgLyogLWIxISAqLworfSBCUF9GTE9BVF9Db2Vmc190OworI2Vsc2UKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNX0lOVDE2IEEwOyAgIC8qICBhMCAgKi8KQEAgLTk2LDggKzEzNywxOCBAQAogICAgIExWTV9JTlQzMiAgQjI7ICAgLyogLWIyISAqLwogICAgIExWTV9JTlQzMiAgQjE7ICAgLyogLWIxISAqLwogfSBCUF9DMzJfQ29lZnNfdDsKKyNlbmRpZgogCiAvKioqIFBlYWtpbmcgY29lZmZpY2llbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgQTA7ICAgLyogIGEwICAqLworICAgIExWTV9GTE9BVCBCMjsgICAvKiAtYjIhICovCisgICAgTFZNX0ZMT0FUIEIxOyAgIC8qIC1iMSEgKi8KKyAgICBMVk1fRkxPQVQgIEc7ICAgLyogR2FpbiAqLworfSBQS19GTE9BVF9Db2Vmc190OworI2Vsc2UKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNX0lOVDE2IEEwOyAgIC8qICBhMCAgKi8KQEAgLTExMywxNiArMTY0LDI2IEBACiAgICAgTFZNX0lOVDMyICBCMTsgICAvKiAtYjEhICovCiAgICAgTFZNX0lOVDE2ICBHOyAgIC8qIEdhaW4gKi8KIH0gUEtfQzMyX0NvZWZzX3Q7Ci0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgVEFQUyBUWVBFIERFRklOSVRJT05TCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqKiBUeXBlcyB1c2VkIGZvciBmaXJzdCBvcmRlciBhbmQgc2hlbHZpbmcgZmlsdGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgxICogMikgXTsgIC8qIE9uZSBjaGFubmVsLCB0d28gdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLworfSBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdDsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKKyAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDIgKiAyKSBdOyAgLyogVHdvIGNoYW5uZWxzLCB0d28gdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLworfSBCaXF1YWRfMklfT3JkZXIxX0ZMT0FUX1RhcHNfdDsKKyNlbHNlCit0eXBlZGVmIHN0cnVjdAorewogICAgIExWTV9JTlQzMiBTdG9yYWdlWyAoMSoyKSBdOyAgLyogT25lIGNoYW5uZWwsIHR3byB0YXBzIG9mIHNpemUgTFZNX0lOVDMyICovCiB9IEJpcXVhZF8xSV9PcmRlcjFfVGFwc190OwogCkBAIC0xMzAsMTIgKzE5MSwyMiBAQAogewogICAgIExWTV9JTlQzMiBTdG9yYWdlWyAoMioyKSBdOyAgLyogVHdvIGNoYW5uZWxzLCB0d28gdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLwogfSBCaXF1YWRfMklfT3JkZXIxX1RhcHNfdDsKLQorI2VuZGlmCiAKIC8qKiogVHlwZXMgdXNlZCBmb3IgYmlxdWFkLCBiYW5kIHBhc3MgYW5kIHBlYWtpbmcgZmlsdGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoMSAqIDQpIF07ICAvKiBPbmUgY2hhbm5lbCwgZm91ciB0YXBzIG9mIHNpemUgTFZNX0lOVDMyICovCit9IEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190OwogCiB0eXBlZGVmIHN0cnVjdAogeworICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoMiAqIDQpIF07ICAvKiBUd28gY2hhbm5lbHMsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLworfSBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdDsKKyNlbHNlCit0eXBlZGVmIHN0cnVjdAorewogICAgIExWTV9JTlQzMiBTdG9yYWdlWyAoMSo0KSBdOyAgLyogT25lIGNoYW5uZWwsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLwogfSBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdDsKIApAQCAtMTQzLDcgKzIxNCw3IEBACiB7CiAgICAgTFZNX0lOVDMyIFN0b3JhZ2VbICgyKjQpIF07ICAvKiBUd28gY2hhbm5lbHMsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLwogfSBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdDsKLQorI2VuZGlmCiAvKiBUaGUgbmFtZXMgb2YgdGhlIGZ1bmN0aW9ucyBhcmUgY2hhbmdlZCB0byBzYXRpc2Z5IFFBQyBydWxlczogTmFtZSBzaG91bGQgYmUgVW5pcXVlIHdpdGhpbmcgMTYgY2hhcmFjdGVycyovCiAjZGVmaW5lIEJRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgIEluaXRfQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDEKICNkZWZpbmUgQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIgICAgICAgVFdPX0JQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyCkBAIC0xNTQsNTkgKzIyNSwxNDggQEAKIAogLyoqKiAxNiBiaXQgZGF0YSBwYXRoICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpOworI2Vsc2UKIHZvaWQgQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOworI2VuZGlmCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDE2RjMyQzE0X1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CiAKKyNlbmRpZgorCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CiAKKyNlbmRpZgorCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZik7CisjZWxzZQogdm9pZCBCUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MxNl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CiAKKyNlbmRpZgorCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDEoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZWxzZQogdm9pZCBCUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMSggICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwogCisjZW5kaWYKKworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEoICAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZik7CisjZWxzZQogdm9pZCBCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MxNl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CiAKKyNlbmRpZgorCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEoICAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKIAorI2VuZGlmCisKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKTsKKyNlbHNlCiB2b2lkIEJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgKCAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzE2X0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKIAorI2VuZGlmCisKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIEJRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CiAKKyNlbmRpZgogLyoqKiAzMiBiaXQgZGF0YSBwYXRoICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKK3ZvaWQgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZWxzZQogdm9pZCBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MzMl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CkBAIC0yMTUsMzMgKzM3NSw2NiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBQUk9UT1RZUEVTOiBGSVJTVCBPUkRFUiBGSUxURVJTCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqKiAxNiBiaXQgZGF0YSBwYXRoICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBGT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKTsKKyNlbHNlCiB2b2lkIEZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQoICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfVGFwc190ICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fQzE2X0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZWxzZQogdm9pZCBGT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMSggICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2VuZGlmCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjFfRkxPQVRfVGFwc190ICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0ZMT0FUX0xTaHhfQ29lZnNfdCAgICAgKnBDb2VmKTsKKyNlbHNlCiB2b2lkIEZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMV9UYXBzX3QgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fQzE2X0xTaHhfQ29lZnNfdCAgICAgKnBDb2VmKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMShCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotCisjZW5kaWYKIC8qKiogMzIgYml0IGRhdGEgcGF0aCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAgICAgICAgICpwQ29lZik7Cit2b2lkIEZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9UYXBzX3QgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19DMzJfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOwpAQCAtMjUwLDEzICs0NDMsMjggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gUFJPVE9UWVBFUzogQkFORCBQQVNTIEZJTFRFUlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioqIDE2IGJpdCBkYXRhIHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICAgKnBDb2VmKTsKK3ZvaWQgQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEgKCAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKK3ZvaWQgQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgICAqcENvZWYpOwordm9pZCBCUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2Vsc2UKIHZvaWQgQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMTZfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOwpAQCAtMjc0LDEwICs0ODIsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLQotCisjZW5kaWYKIC8qKiogMzIgYml0IGRhdGEgcGF0aCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdCAoICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICAgICpwQ29lZik7Cit2b2lkIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyKCAgICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZWxzZQogdm9pZCBCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0ICggICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MzMl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CkBAIC0yODYsNDIgKzUwMSw1OSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotCisjZW5kaWYKIAogLyoqKiAzMiBiaXQgZGF0YSBwYXRoIFNURVJFTyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMzJfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOwotCiB2b2lkIFBLXzJJX0QzMkYzMkMzMEcxMV9UUkNfV1JBXzAxICggICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0KKyNlbmRpZgorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIFBLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfRkxPQVRfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOworI2Vsc2UKIHZvaWQgUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMTZfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOwotCisjZW5kaWYKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMSggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIFBLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxICggICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gUFJPVE9UWVBFUzogREMgUkVNT1ZBTCBGSUxURVJTCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqKiAxNiBiaXQgZGF0YSBwYXRoIFNURVJFTyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdCAgICAgKCAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSk7CiAKK3ZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDEgICAgICAgICAgKCAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbHNlCiB2b2lkIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQgICAgICggICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UpOwogCiB2b2lkIERDXzJJX0QxNl9UUkNfV1JBXzAxICAgICAgICAgICggICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0KKyNlbmRpZgogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0NvbXBMaW0uaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0NvbXBMaW0uaAppbmRleCA0Y2I4YWEyLi40OThmYWEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9Db21wTGltLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQ29tcExpbS5oCkBAIC02NiwxMyArNjYsMTcgQEAKIC8qICBGdW5jdGlvbiBQcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIE5vbkxpbkNvbXBfRmxvYXQoTFZNX0ZMT0FUICAgICAgICBHYWluLAorICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICBCbG9ja0xlbmd0aCk7CisjZWxzZQogdm9pZCBOb25MaW5Db21wX0QxNihMVk1fSU5UMTYgICAgICAgIEdhaW4sCiAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKnBTdGVyQmZJbiwKICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqcFN0ZXJCZk91dCwKICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICBCbG9ja0xlbmd0aCk7Ci0KLQorI2VuZGlmCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvRmlsdGVyLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9GaWx0ZXIuaAppbmRleCAyMjk3MDFhLi4wYzg5NTVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9GaWx0ZXIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9GaWx0ZXIuaApAQCAtMzMsMTEgKzMzLDMyIEBACiAgICBERUZJTkVTCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUgRklMVEVSX0xPU1MgICAgIDMyNzMwICAgICAgIC8qIC0wLjAxZEIgbG9zcyB0byBhdm9pZCB3cmFwcGluZyBkdWUgdG8gYmFuZCByaXBwbGUgKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisjZGVmaW5lIEZJTFRFUl9MT1NTX0ZMT0FUICAgIDAuOTk4ODQ5ZgorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gUFJPVE9UWVBFUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKIAorTFZNX0ZMT0FUIExWTV9Qb3dlcjEwKCAgIExWTV9GTE9BVCAgWCk7CisKK0xWTV9GTE9BVCBMVk1fUG9seW5vbWlhbChMVk1fVUlOVDE2IE4sCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqcENvZWZmaWNpZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgIFgpOworI2lmZGVmIEhJR0hFUl9GUworTFZNX0ZMT0FUICAgTFZNX0dldE9tZWdhKExWTV9VSU5UMzIgIEZjLAorI2Vsc2UKK0xWTV9GTE9BVCAgIExWTV9HZXRPbWVnYShMVk1fVUlOVDE2ICBGYywKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgIFNhbXBsZVJhdGUpOworCitMVk1fRkxPQVQgTFZNX0ZPX0xQRiggICAgTFZNX0ZMT0FUICB3LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgICpwQ29lZmZzKTsKKworTFZNX0ZMT0FUIExWTV9GT19IUEYoICAgIExWTV9GTE9BVCAgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAqcENvZWZmcyk7CisjZWxzZQogTFZNX0lOVDMyIExWTV9Qb2x5bm9taWFsKExWTV9VSU5UMTYgTiwKICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpwQ29lZmZpY2llbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgWCk7CkBAIC01Miw3ICs3Myw3IEBACiAKIExWTV9JTlQzMiAgIExWTV9HZXRPbWVnYShMVk1fVUlOVDE2ICBGYywKICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICBTYW1wbGVSYXRlKTsKLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1R5cGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaAppbmRleCA2OGM1NWY3Li5jYjE1YjYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaApAQCAtNDQsNiArNDQsOSBAQAogCiAjZGVmaW5lIExWTV9NQVhJTlRfOCAgICAgICAgICAgIDEyNyAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBwb3NpdGl2ZSBpbnRlZ2VyIHNpemUgKi8KICNkZWZpbmUgTFZNX01BWElOVF8xNiAgICAgICAgICAgMzI3NjcKKyNpZmRlZiBCVUlMRF9GTE9BVAorI2RlZmluZSBMVk1fTUFYRkxPQVQgICAgICAgICAgICAxLjBmCisjZW5kaWYKICNkZWZpbmUgTFZNX01BWElOVF8zMiAgICAgICAgICAgMjE0NzQ4MzY0NwogI2RlZmluZSBMVk1fTUFYRU5VTSAgICAgICAgICAgICAyMTQ3NDgzNjQ3CiAKQEAgLTk1LDcgKzk4LDkgQEAKIHR5cGVkZWYgICAgIGludDMyX3QgICAgICAgICAgICAgTFZNX0lOVDMyOyAgICAgICAgICAvKiBTaWduZWQgMzItYml0IHdvcmQgKi8KIHR5cGVkZWYgICAgIHVpbnQzMl90ICAgICAgICAgICAgTFZNX1VJTlQzMjsgICAgICAgICAvKiBVbnNpZ25lZCAzMi1iaXQgd29yZCAqLwogCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiAgICAgZmxvYXQgICAgICAgICAgICAgICBMVk1fRkxPQVQ7ICAgICAgICAgIC8qIHNpbmdsZSBwcmVjaXNzaW9uIGZsb2F0aW5nIHBvaW50Ki8KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBTdGFuZGFyZCBFbnVtZXJhdGVkIHR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTMzLDYgKzEzOCwxMCBAQAogICAgIExWTV9GU18zMjAwMCA9IDYsCiAgICAgTFZNX0ZTXzQ0MTAwID0gNywKICAgICBMVk1fRlNfNDgwMDAgPSA4LAorI2lmZGVmIEhJR0hFUl9GUworICAgIExWTV9GU185NjAwMCA9IDksCisgICAgTFZNX0ZTXzE5MjAwMCA9IDEwLAorI2VuZGlmCiAgICAgTFZNX0ZTX0lOVkFMSUQgPSBMVk1fTUFYRU5VTS0xLAogICAgIExWTV9GU19EVU1NWSA9IExWTV9NQVhFTlVNCiB9IExWTV9Gc19lbjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL01peGVyLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9NaXhlci5oCmluZGV4IDg5ZGViMGQuLjA3YzUzY2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL01peGVyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTWl4ZXIuaApAQCAtMzAsNiArMzAsNDMgQEAKICAgIElOU1RBTkNFIE1FTU9SWSBUWVBFIERFRklOSVRJT04KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZkZWYgQlVJTERfRkxPQVQgLyogQlVJTERfRkxPQVQqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgICBBbHBoYTsgICAgICAgICAgICAgICAgICAgLyogVGltZSBjb25zdGFudC4gU2V0IGJ5IGNhbGxpbmcgYXBwbGljYXRpb24uIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIGNoYW5nZWQgYXQgYW55IHRpbWUgKi8KKyAgICBMVk1fRkxPQVQgICBUYXJnZXQ7ICAgICAgICAgICAgICAgICAgLyogVGFyZ2V0IHZhbHVlLiAgU2V0IGJ5IGNhbGxpbmcgYXBwbGljYXRpb24uIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIGNoYW5nZWQgYXQgYW55IHRpbWUgKi8KKyAgICBMVk1fRkxPQVQgICBDdXJyZW50OyAgICAgICAgICAgICAgICAgLyogQ3VycmVudCB2YWx1ZS4gIFNldCBieSB0aGUgbWl4ZXIgZnVuY3Rpb24uICovCisgICAgTFZNX0lOVDE2ICAgQ2FsbGJhY2tTZXQ7ICAgICAgICAgICAgIC8qIEJvb2xlYW4uICBTaG91bGQgYmUgc2V0IGJ5IGNhbGxpbmcgYXBwbGljYXRpb24gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoIHRpbWUgdGhlIHRhcmdldCB2YWx1ZSBpcyB1cGRhdGVkICovCisgICAgTFZNX0lOVDE2ICAgQ2FsbGJhY2tQYXJhbTsgICAgICAgICAgIC8qIFBhcmFtZXRlciB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgY2FsYmFjayBmdW5jdGlvbiAqLworICAgIHZvaWQgICAgICAgICpwQ2FsbGJhY2tIYW5kbGU7ICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKyAgICB2b2lkICAgICAgICAqcEdlbmVyYWxQdXJwb3NlOyAgICAgICAgLyogUG9pbnRlciBmb3IgZ2VuZXJhbCBwdXJwb3NlIHVzYWdlICovCisgICAgTFZNX0NhbGxiYWNrIHBDYWxsQmFjazsgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCit9IE1peF8xU3RfQ2xsX0ZMT0FUX3Q7Cit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9GTE9BVCAgIEFscGhhMTsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXQxOworICAgIExWTV9GTE9BVCAgIEN1cnJlbnQxOworICAgIExWTV9JTlQxNiAgIENhbGxiYWNrU2V0MTsKKyAgICBMVk1fSU5UMTYgICBDYWxsYmFja1BhcmFtMTsKKyAgICB2b2lkICAgICAgICAqcENhbGxiYWNrSGFuZGxlMTsKKyAgICB2b2lkICAgICAgICAqcEdlbmVyYWxQdXJwb3NlMTsKKyAgICBMVk1fQ2FsbGJhY2sgcENhbGxCYWNrMTsKKworICAgIExWTV9GTE9BVCAgIEFscGhhMjsgICAgICAgICAgICAgICAgICAgLyogV2FybmluZyB0aGUgYWRkcmVzcyBvZiB0aGlzIGxvY2F0aW9uIGlzIHBhc3NlZCBhcyBhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gTWl4XzFTdF9DbGxfdCBpbiBzb21lIGZ1bmN0aW9ucyAqLworICAgIExWTV9GTE9BVCAgIFRhcmdldDI7CisgICAgTFZNX0ZMT0FUICAgQ3VycmVudDI7CisgICAgTFZNX0lOVDE2ICAgQ2FsbGJhY2tTZXQyOworICAgIExWTV9JTlQxNiAgIENhbGxiYWNrUGFyYW0yOworICAgIHZvaWQgICAgICAgICpwQ2FsbGJhY2tIYW5kbGUyOworICAgIHZvaWQgICAgICAgICpwR2VuZXJhbFB1cnBvc2UyOworICAgIExWTV9DYWxsYmFjayBwQ2FsbEJhY2syOworfSBNaXhfMlN0X0NsbF9GTE9BVF90OworI2Vsc2UKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNX0lOVDMyICAgQWxwaGE7ICAgICAgICAgICAgICAgICAgICAvKiBUaW1lIGNvbnN0YW50LiBTZXQgYnkgY2FsbGluZyBhcHBsaWNhdGlvbi4gIENhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lICovCkBAIC02NCw5ICsxMDEsMzUgQEAKIAogfSBNaXhfMlN0X0NsbF90OwogCisjZW5kaWYKIAogLyoqKiBHZW5lcmFsIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKIAorTFZNX0ZMT0FUIExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZNX1VJTlQzMiAgIHRjLAorI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgIEZzLAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICBGcywKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgIE51bUNoYW5uZWxzKTsKKwordm9pZCBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCAgICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworCit2b2lkIE1peFNvZnRfMlN0X0QzMkMzMV9TQVQoICAgIE1peF8yU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworCit2b2lkIE1peEluU29mdF9EMzJDMzFfU0FUKCAgICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisjZWxzZQogTFZNX1VJTlQzMiBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWTV9VSU5UMzIgICB0YywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgRnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgIE51bUNoYW5uZWxzKTsKQEAgLTg4LDEwICsxNTEsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOwogCisjZW5kaWYKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIFBST1RPVFlQRVMgKExPVyBMRVZFTCBTVUJGVU5DVElPTlMpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIENvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOwordm9pZCBDb3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQoICAgTWl4XzJTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOwordm9pZCBDb3JlX01peEluU29mdF9EMzJDMzFfU0FUKCAgICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKyNlbHNlCiB2b2lkIENvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggICBNaXhfMVN0X0NsbF90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCkBAIC0xMDcsNiArMTg2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCkBAIC0xMTUsMTMgKzE5NSwzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2VuZGlmIC8qIF9fTUlYRVJfSF9fICovCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1NjYWxhckFyaXRobWV0aWMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1NjYWxhckFyaXRobWV0aWMuaAppbmRleCAzZDYyNzA0Li5jZGIzODM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9TY2FsYXJBcml0aG1ldGljLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvU2NhbGFyQXJpdGhtZXRpYy5oCkBAIC0zNCw3ICszNCwxMiBAQAogLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCiAKIC8qIEFic29sdXRlIHZhbHVlIGluY2x1ZGluZyB0aGUgY29ybmVyIGNhc2UgZm9yIHRoZSBleHRyZW1lIG5lZ2F0aXZlIHZhbHVlICovCisKKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX0ZMT0FUICAgQWJzX0Zsb2F0KExWTV9GTE9BVCAgICAgaW5wdXQpOworI2Vsc2UKIExWTV9JTlQzMiAgIEFic18zMihMVk1fSU5UMzIgICAgIGlucHV0KTsKKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogIE5hbWUgICAgICAgIDogZEJfdG9fTGluMzIoKQpAQCAtNDgsOCArNTMsMTEgQEAKICAqICAgICAgICAgICAgICAgICAgKDE1LT4wMSkgPSBkZWNpbWFsIHBhcnQKICAqICBSZXR1cm5zICAgICA6IExpbiB2YWx1ZSBmb3JtYXQgMS4xNi4xNQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX0ZMT0FUIGRCX3RvX0xpbkZsb2F0KExWTV9JTlQxNiAgICBkYl9maXgpOworI2Vsc2UKIExWTV9JTlQzMiBkQl90b19MaW4zMihMVk1fSU5UMTYgIGRiX2ZpeCk7CisjZW5kaWYKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9WZWN0b3JBcml0aG1ldGljLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9WZWN0b3JBcml0aG1ldGljLmgKaW5kZXggMmI3OTFiZC4uMGJhMjBhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1ZlY3RvckFyaXRobWV0aWMuaApAQCAtMjksNiArMjksMTEgQEAKICAgICBWQVJJT1VTIEZVTkNUSU9OUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMb2FkQ29uc3RfRmxvYXQoICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKKyNlbHNlCiB2b2lkIExvYWRDb25zdF8xNiggICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOwpAQCAtMzYsMTAgKzQxLDE3IEBACiB2b2lkIExvYWRDb25zdF8zMiggICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworI2VuZGlmCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBDb3B5X0Zsb2F0KCAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CisjZWxzZQogdm9pZCBDb3B5XzE2KCAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogbm90ZTogSW4gTXVsdDNzXzE2eDE2KCkgc2F0dXJhdGlvbiBvZiByZXN1bHQgaXMgbm90IHRha2VuIGNhcmUgd2hlbiAgICAgICAgICAgKgpAQCAtNDksMTAgKzYxLDE3IEBACiAgKiAgICAgICBUaGlzIGlzIHRoZSBvbmx5IGNhc2Ugd2hpY2ggd2lsbCBnaXZlIHdyb25nIHJlc3VsdC4gICAgICAgICAgICAgICAgICAgICAqCiAgKiAgICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWZlciB0byBWZWN0b3JfQXJpdGhtZXRpYy5kb2MgaW4gL2RvYyBmb2xkZXIgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIE11bHQzc19GbG9hdCggICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKKyNlbHNlCiB2b2lkIE11bHQzc18xNngxNiggICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIG5vdGU6IEluIE11bHQzc18zMngxNigpIHNhdHVyYXRpb24gb2YgcmVzdWx0IGlzIG5vdCB0YWtlbiBjYXJlIHdoZW4gICAgICAgICAgICoKQEAgLTY2LDIwICs4NSwzMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIERlbGF5TWl4X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCAqc3JjLCAgICAgICAgICAgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkZWxheSwgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IHNpemUsICAgICAgICAgICAvKiBEZWxheSBzaXplICovCisgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LCAgICAgICAgICAgLyogU291cmNlL2Rlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqcE9mZnNldCwgICAgICAgLyogRGVsYXkgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKSAgOyAgICAgICAgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLworI2Vsc2UKIHZvaWQgRGVsYXlNaXhfMTZ4MTYoICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkZWxheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKnBPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7Ci0KKyNlbmRpZgogdm9pZCBEZWxheVdyaXRlXzMyKCAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAqc3JjLCAgICAgICAgICAgICAgIC8qIFNvdXJjZSAxLCB0byBiZSBkZWxheWVkICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkZWxheSwgICAgICAgICAgICAgLyogRGVsYXkgYnVmZmVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2IHNpemUsICAgICAgICAgICAgICAgLyogRGVsYXkgc2l6ZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAqcE9mZnNldCwgICAgICAgICAgIC8qIERlbGF5IG9mZnNldCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQWRkMl9TYXRfRmxvYXQoICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworI2Vsc2UKIHZvaWQgQWRkMl9TYXRfMTZ4MTYoICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOwpAQCAtODcsNyArMTE3LDEzIEBACiB2b2lkIEFkZDJfU2F0XzMyeDMyKCAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOwotCisjZW5kaWYKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBNYWMzc19TYXRfRmxvYXQoICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisjZWxzZQogdm9pZCBNYWMzc19TYXRfMTZ4MTYoICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCkBAIC05Nyw3ICsxMzMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLQorI2VuZGlmCiB2b2lkIERlbGF5QWxsUGFzc19TYXRfMzJ4MTZUbzMyKCAgICBMVk1fSU5UMzIgICpkZWxheSwgICAgICAgICAgICAgIC8qIERlbGF5IGJ1ZmZlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBzaXplLCAgICAgICAgICAgICAgICAvKiBEZWxheSBzaXplICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgY29lZmYsICAgICAgICAgICAgICAgIC8qIEFsbCBwYXNzIGZpbHRlciBjb2VmZmljaWVudCAqLwpAQCAtMTA5LDcgKzE0NSwxMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICBTSElGVCBGVU5DVElPTlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgU2hpZnRfU2F0X0Zsb2F0IChjb25zdCAgIExWTV9JTlQxNiAgIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9GTE9BVCAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBuKTsKKyNlbHNlCiB2b2lkIFNoaWZ0X1NhdF92MTZ4djE2ICggICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKQEAgLTExOSwxMSArMTYwLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgQVVESU8gRk9STUFUIENPTlZFUlNJT04gRlVOQ1RJT05TCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIE1vbm9UbzJJX0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisjZWxzZQogdm9pZCBNb25vVG8ySV8xNiggICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKQEAgLTEzMSwyOSArMTc2LDUyIEBACiB2b2lkIE1vbm9UbzJJXzMyKCAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7Ci0KKyNlbmRpZgorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZyb20yaVRvTW9ub19GbG9hdCggICAgICAgICBjb25zdCBMVk1fRkxPQVQgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisjZWxzZQogdm9pZCBGcm9tMmlUb01vbm9fMzIoICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwotCisjZW5kaWYKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBNU1RvMmlfU2F0X0Zsb2F0KCAgICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmNNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworI2Vsc2UKIHZvaWQgTVNUbzJpX1NhdF8xNngxNiggICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjTSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKLQorI2VuZGlmCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRnJvbTJpVG9NU19GbG9hdCggICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3RNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3RTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKKyNlbHNlCiB2b2lkIEZyb20yaVRvTVNfMTZ4MTYoICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0TSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0UywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7Ci0KKyNlbmRpZgorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEpvaW5UbzJpX0Zsb2F0KCAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICpzcmNMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAqc3JjUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CisjZWxzZQogdm9pZCBGcm9tMmlUb01vbm9fMTYoICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLQogdm9pZCBKb2luVG8yaV8zMngzMiggICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAqc3JjTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgKnNyY1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgIERBVEEgVFlQRSBDT05WRVJTSU9OIEZVTkNUSU9OUwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEuYwppbmRleCA5MjBiNTE1Li5mYTlmMDFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEuYwpAQCAtMzMsNyArMzMsMTAgQEAKIAogI2RlZmluZSBWT0xfVENfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEgICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCiAjZGVmaW5lIERFQ0FZX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwICAgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisjZGVmaW5lIFZPTF9UQ19GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wZiAgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgREVDQVlfRkFDX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0LjBmICAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02OSw3ICs3Miw3IEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX3QgICpwSW5zdGFuY2UsICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICAgICAgICAqcFN0U3JjLCAgICAgICAgLyogU3RlcmVvIHNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAgICAgICAgKnBNb25vU3JjLCAgICAgIC8qIE1vbm8gc291cmNlICovCkBAIC0xOTMsNCArMTk2LDExMyBAQAogCiAgICAgcmV0dXJuOwogfQorI2Vsc2UKK3ZvaWQgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRkxPQVRfdCAgKnBJbnN0YW5jZSwgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwU3RTcmMsICAgICAgICAvKiBTdGVyZW8gc291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcE1vbm9TcmMsICAgICAgLyogTW9ubyBzb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICpwRHN0LCAgICAgICAgICAvKiBTdGVyZW8gZGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAqLworewogCisgICAgLyoKKyAgICAgKiBHZW5lcmFsIHZhcmlhYmxlcworICAgICAqLworICAgIExWTV9VSU5UMTYgICAgICBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZSBpbmRleCAqLworICAgIExWTV9GTE9BVCAgICAgICBMZWZ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgc2FtcGxlICovCisgICAgTFZNX0ZMT0FUICAgICAgIFJpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmlnaHQgc2FtcGxlICovCisgICAgTFZNX0ZMT0FUICAgICAgIE1vbm87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTW9ubyBzYW1wbGUgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgQWJzUGVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBYnNvbHV0ZSBwZWFrIHNpZ25hbCAqLworICAgIExWTV9GTE9BVCAgICAgICBBR0NfTXVsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IEFHQyBnYWluICovCisgICAgTFZNX0ZMT0FUICAgICAgIFZvbF9NdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hvcnQgdm9sdW1lICovCisKKworICAgIC8qCisgICAgICogSW5zdGFuY2UgY29udHJvbCB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfR2FpbiAgICAgID0gcEluc3RhbmNlLT5BR0NfR2FpbjsgICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgQUdDIGdhaW4gKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfTWF4R2FpbiAgID0gcEluc3RhbmNlLT5BR0NfTWF4R2FpbjsgICAgICAvKiBHZXQgbWF4aW11bSBBR0MgZ2FpbiAqLworICAgIExWTV9GTE9BVCAgICAgIEFHQ19BdHRhY2sgICAgPSBwSW5zdGFuY2UtPkFHQ19BdHRhY2s7ICAgICAgIC8qIEF0dGFjayBzY2FsZXIgKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfRGVjYXkgICAgID0gKHBJbnN0YW5jZS0+QUdDX0RlY2F5ICogKDEgPDwgKERFQ0FZX1NISUZUKSkpOy8qIERlY2F5IHNjYWxlciAqLworICAgIExWTV9GTE9BVCAgICAgIEFHQ19UYXJnZXQgICAgPSBwSW5zdGFuY2UtPkFHQ19UYXJnZXQ7ICAgICAgIC8qIEdldCB0aGUgdGFyZ2V0IGxldmVsICovCisgICAgTFZNX0ZMT0FUICAgICAgVm9sX0N1cnJlbnQgICA9IHBJbnN0YW5jZS0+Vm9sdW1lOyAgICAgICAgICAgLyogQWN0dWFsIHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0ZMT0FUICAgICAgVm9sX1RhcmdldCAgICA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAgICAgICAgICAgLyogVGFyZ2V0IHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0ZMT0FUICAgICAgVm9sX1RDICAgICAgICA9IHBJbnN0YW5jZS0+Vm9sdW1lVEM7ICAgICAgICAgLyogVGltZSBjb25zdGFudCAqLworCisKKyAgICAvKgorICAgICAqIFByb2Nlc3Mgb24gYSBzYW1wbGUgYnkgc2FtcGxlIGJhc2lzCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IE51bVNhbXBsZXM7IGkrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIGVhY2ggc2FtcGxlICovCisgICAgeworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgc2hvcnQgc2NhbGVycworICAgICAgICAgKi8KKyAgICAgICAgQUdDX011bHQgICAgPSAoTFZNX0ZMT0FUKShBR0NfR2Fpbik7ICAgICAgICAgICAgICAvKiBHZXQgdGhlIHNob3J0IEFHQyBnYWluICovCisgICAgICAgIFZvbF9NdWx0ICAgID0gKExWTV9GTE9BVCkoVm9sX0N1cnJlbnQpOyAgICAgICAgICAgLyogR2V0IHRoZSBzaG9ydCB2b2x1bWUgZ2FpbiAqLworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSBpbnB1dCBzYW1wbGVzCisgICAgICAgICAqLworICAgICAgICBMZWZ0ICA9ICpwU3RTcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbGVmdCBzYW1wbGUgKi8KKyAgICAgICAgUmlnaHQgPSAqcFN0U3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIHJpZ2h0IHNhbXBsZSAqLworICAgICAgICBNb25vICA9ICpwTW9ub1NyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbW9ubyBzYW1wbGUgKi8KKworCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IHRoZSBBR0MgZ2FpbiB0byB0aGUgbW9ubyBpbnB1dCBhbmQgbWl4IHdpdGggdGhlIHN0ZXJlbyBzaWduYWwKKyAgICAgICAgICovCisgICAgICAgIExlZnQgICs9IChNb25vICogQUdDX011bHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNaXggaW4gdGhlIG1vbm8gc2lnbmFsICovCisgICAgICAgIFJpZ2h0ICs9IChNb25vICogQUdDX011bHQpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IHRoZSB2b2x1bWUgYW5kIHdyaXRlIHRvIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgICAgICAqLworICAgICAgICBMZWZ0ICA9IExlZnQgICogVm9sX011bHQ7CisgICAgICAgIFJpZ2h0ID0gUmlnaHQgKiBWb2xfTXVsdDsKKyAgICAgICAgKnBEc3QrKyA9IExlZnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIHRoZSByZXN1bHRzICovCisgICAgICAgICpwRHN0KysgPSBSaWdodDsKKworICAgICAgICAvKgorICAgICAgICAgKiBVcGRhdGUgdGhlIEFHQyBnYWluCisgICAgICAgICAqLworICAgICAgICBBYnNQZWFrID0gQWJzX0Zsb2F0KExlZnQpID4gQWJzX0Zsb2F0KFJpZ2h0KSA/IEFic19GbG9hdChMZWZ0KSA6IEFic19GbG9hdChSaWdodCk7CisgICAgICAgIGlmIChBYnNQZWFrID4gQUdDX1RhcmdldCkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBzaWduYWwgaXMgdG9vIGxhcmdlIHNvIGRlY3JlYXNlIHRoZSBnYWluCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEFHQ19HYWluID0gQUdDX0dhaW4gKiBBR0NfQXR0YWNrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBzaWduYWwgaXMgdG9vIHNtYWxsIHNvIGluY3JlYXNlIHRoZSBnYWluCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChBR0NfR2FpbiA+IEFHQ19NYXhHYWluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFHQ19HYWluIC09IChBR0NfRGVjYXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFHQ19HYWluICs9IChBR0NfRGVjYXkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVXBkYXRlIHRoZSBnYWluCisgICAgICAgICAqLworICAgICAgICBWb2xfQ3VycmVudCArPSAgKFZvbF9UYXJnZXQgLSBWb2xfQ3VycmVudCkgKiAoKExWTV9GTE9BVClWb2xfVEMgLyBWT0xfVENfRkxPQVQpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPlZvbHVtZSA9IFZvbF9DdXJyZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBY3R1YWwgdm9sdW1lIHNldHRpbmcgKi8KKyAgICBwSW5zdGFuY2UtPkFHQ19HYWluID0gQUdDX0dhaW47CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYgLypCVUlMRF9GTE9BVCovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BYnNfMzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Fic18zMi5jCmluZGV4IDkxMjhiODIuLjg0ZmFiZDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Fic18zMi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Fic18zMi5jCkBAIC00Nyw0ICs0NywxNCBAQAogICAgIH0KICAgICByZXR1cm4gaW5wdXQ7CiB9Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX0ZMT0FUICAgIEFic19GbG9hdChMVk1fRkxPQVQgICAgaW5wdXQpCit7CisgICAgaWYoaW5wdXQgPCAgMCkKKyAgICB7CisgICAgICAgIC8qIE5lZ2F0aXZlIGlucHV0LCBzbyBpbnZlcnQgKi8KKyAgICAgICAgaW5wdXQgPSAoTFZNX0ZMT0FUKSgtaW5wdXQpOworICAgIH0KKyAgICByZXR1cm4gaW5wdXQ7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BZGQyX1NhdF8zMngzMi5jCmluZGV4IDY5ZDM1N2UuLmUzZWRjY2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWRkMl9TYXRfMzJ4MzIuYwpAQCAtNTcsNCArNTcsMzMgQEAKICAgICByZXR1cm47CiB9CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBBZGQyX1NhdF9GbG9hdCggY29uc3QgTFZNX0ZMT0FUICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBuICkKK3sKKyAgICBMVk1fRkxPQVQgVGVtcDsKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBUZW1wID0gKChMVk1fRkxPQVQpICpzcmMpICsgKChMVk1fRkxPQVQpICpkc3QpOworICAgICAgICBzcmMrKzsKKworICAgICAgICBpZiAoVGVtcCA+IDEuMDAwMDAwZikKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IDEuMDAwMDAwZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMDAwMDAwZikKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IC0xLjAwMDAwMGY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gVGVtcDsKKyAgICAgICAgfQorICAgICAgICBkc3QrKzsKKyAgICB9CisgICAgcmV0dXJuOworfQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jCmluZGV4IGY0YzU3NTcuLjg4Zjk5ODYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYwpAQCAtMzMsNyArMzMsNTEgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKIAorCisgICAgeworICAgICAgICBMVk1fRkxPQVQgeW5MOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKworICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8vIHluTD0gKEEwICAqICh4KG4pTCAgLSB4KG4tMilMICApICkKKyAgICAgICAgICAgIHluTCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiAoKCpwRGF0YUluKS1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0pOworCisgICAgICAgICAgICAvLyB5bkwrPSAoKC1CMiAgKiB5KG4tMilMICApICkKKyAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvLyB5bkwrPSAoKC1CMSAgKiB5KG4tMSlMICApICkKKyAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07IC8vIHkobi0yKUw9eShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvLyB4KG4tMilMPXgobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQrKz15bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0CisKKyAgICAgICAgfQorCisgICAgfQorI2Vsc2UKIHZvaWQgQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTc4LDQgKzEyMiw1IEBACiAgICAgICAgIH0KIAogICAgIH0KKyNlbmRpZgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKaW5kZXggODg5MTRhZC4uMjdhYjU3YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYwpAQCAtMzgsNiArMzgsMTkgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAgICAgICAqcENvZWYpCit7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKSBwVGFwczsKKworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSBwQ29lZi0+QTA7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHBDb2VmLT5CMjsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gcENvZWYtPkIxOworfQorI2Vsc2UKIHZvaWQgQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfQzE2X0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCkBAIC00OSw2ICs2Miw3IEBACiAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV09cENvZWYtPkIyOwogICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdPXBDb2VmLT5CMTsKICAgfQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRW5kIE9mIEZpbGU6IEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCA5ODA1MzljLi5lMTk0ZjkyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0yNyw0ICsyNywxMyBAQAogCiB0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKK3sKKworICAgIExWTV9GTE9BVCAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlX0ZMT0FUOwordHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKKyNlbmRpZgogI2VuZGlmIC8qX0JQXzFJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxLmMKaW5kZXggYmExYTQyZi4uM2FiZGQ0MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMS5jCkBAIC0zMyw3ICszMyw0OCBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFExNiBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeShuLTIpTCBpbiBRMTYgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCit7CisgICAgTFZNX0ZMT0FUIHluTCx0ZW1wbDsKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVClwSW5zdGFuY2U7CiAKKyAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8vIHluTD0gKEEwICogKHgobilMIC0geChuLTIpTCApKQorICAgICAgICB0ZW1wbCA9IChMVk1fRkxPQVQpICpwRGF0YUluIC0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworICAgICAgICB5bkwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogdGVtcGw7CisKKyAgICAgICAgLy8geW5MKz0gKCgtQjIgICogeShuLTIpTCAgKSApCisgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKyAgICAgICAgeW5MICs9IHRlbXBsOworCisgICAgICAgIC8vIHluTCs9ICgoLUIxICAqIHkobi0xKUwgICkpCisgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKyAgICAgICAgeW5MICs9IHRlbXBsOworCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgLy8geShuLTIpTD15KG4tMSlMCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLy8geChuLTIpTD14KG4tMSlMCisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwgaW4gUTE2CisgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwgaW4gUTAKKworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICpwRGF0YU91dCsrID0gKHluTCk7IC8vIFdyaXRlIExlZnQgb3V0cHV0CisgICAgICAgIH0KK30KKyNlbHNlCiB2b2lkIEJQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC04MCw0ICsxMjEsNCBAQAogICAgICAgICB9CiAKICAgICB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jCmluZGV4IGU4MzMyMTguLmQ2ZTA0N2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTQ4LDYgKzQ4LDIwIEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICAgICAqcENvZWYpCit7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgICA9KExWTV9GTE9BVCAqKSBwVGFwczsKKworCisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9ICBwQ29lZi0+QTA7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9ICBwQ29lZi0+QjI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9ICBwQ29lZi0+QjE7Cit9CisjZWxzZQogdm9pZCBCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMzJfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKQEAgLTU5LDYgKzczLDcgQEAKICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9ICBwQ29lZi0+QjI7CiAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSAgcENvZWYtPkIxOwogfQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRW5kIE9mIEZpbGU6IEJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCA5Y2NhNjI3Li5hYTllNjY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0yNiw1ICsyNiwxMiBAQAogfUZpbHRlcl9TdGF0ZTsKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUCit7CisgICAgTFZNX0ZMT0FUICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgY29lZnNbM107ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31GaWx0ZXJfU3RhdGVfRmxvYXQ7Cit0eXBlZGVmIEZpbHRlcl9TdGF0ZV9GbG9hdCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOworI2VuZGlmCiAjZW5kaWYgLypfQlBfMUlfRDE2RjMyQ0xMX1RSQ19XUkFfMDFfUFJJVkFURV9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIuYwppbmRleCBiMDljMWFhLi5hYmRiMmY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyLmMKQEAgLTMzLDcgKzMzLDUyIEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgeW5MLHRlbXBsOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKIAorICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9IChBMCAgKiAoeChuKUwgIC0geChuLTIpTCAgKSApCisgICAgICAgICAgICB0ZW1wbCA9ICgqcERhdGFJbikgLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisgICAgICAgICAgICB5bkwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogdGVtcGw7CisKKyAgICAgICAgICAgIC8vIHluTCs9ICgoLUIyICAqIHkobi0yKUwgICkgKQorICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworICAgICAgICAgICAgeW5MICs9IHRlbXBsOworCisgICAgICAgICAgICAvLyB5bkwrPSAoKC1CMSAgKiB5KG4tMSlMICApICkKKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKyAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOyAvLyB5KG4tMilMPXkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLy8geChuLTIpTD14KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSB5bkw7IC8vIFVwZGF0ZSB5KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0KysgPSB5bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwCisKKyAgICAgICAgfQorCisgICAgfQorI2Vsc2UKIHZvaWQgQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTc4LDQgKzEyMyw0IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0LmMKaW5kZXggOTM2NzkxMi4uNTU5MGMzMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQuYwpAQCAtMzcsNiArMzcsMjEgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICAgPShMVk1fRkxPQVQgKikgcFRhcHM7CisKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gcENvZWYtPkEwOworCisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHBDb2VmLT5CMjsKKworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSBwQ29lZi0+QjE7Cit9CisjZWxzZQogdm9pZCBCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMzJfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKQEAgLTUwLDYgKzY1LDcgQEAKIAogICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdPXBDb2VmLT5CMTsKIH0KKyNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIEVuZCBPZiBGaWxlOiBCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Qcml2YXRlLmgKaW5kZXggNWNjMWNlMi4uODBjMzkyMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX1ByaXZhdGUuaApAQCAtMjYsNSArMjYsMTMgQEAKIH1GaWx0ZXJfU3RhdGU7CiAKIHR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKK3sKKyAgICBMVk1fRkxPQVQgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICBjb2Vmc1szXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfUZpbHRlcl9TdGF0ZV9GbG9hdDsKK3R5cGVkZWYgRmlsdGVyX1N0YXRlX0Zsb2F0KiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKKyNlbmRpZgogCiAjZW5kaWYgLypfQlBfMUlfRDMyRjMyQ0xMX1RSQ19XUkFfMDJfUFJJVkFURV9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYwppbmRleCBmMmY4YzZiLi5lZTliZjdhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMKQEAgLTMyLDcgKzMyLDU2IEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgIHluTDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CiAKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9QTIgICogeChuLTIpTAorICAgICAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworCisgICAgICAgICAgICAvLyB5bkwrPUExICogeChuLTEpTAorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMCAqIHgobilMCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKKworICAgICAgICAgICAgLy8geW5MKz0gICgtQjIgICogeShuLTIpTCApCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzNdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvLyB5bkwrPSAoLUIxICAqIHkobi0xKUwgICkKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgLy8geShuLTIpTD15KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8vIHgobi0yKUw9eChuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0geW5MOyAvLyBVcGRhdGUgeShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTAorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwCisKKworICAgICAgICB9CisKKyAgICB9CisjZWxzZQogdm9pZCBCUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMSAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtODIsNCArMTMxLDQgQEAKICAgICAgICAgfQogCiAgICAgfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYwppbmRleCBiYWYwYzFhLi4zZDViZWZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0zNyw2ICszNywyNiBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCit7CisgICAgTFZNX0ZMT0FUIHRlbXA7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKSBwVGFwcyA7CisgICAgdGVtcCA9IHBDb2VmLT5BMjsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkExOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QTA7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMjsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkIxOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gPSB0ZW1wOworfQorI2Vsc2UKIHZvaWQgQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzE2X0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCkBAIC01Niw2ICs3Niw3IEBACiAgIHRlbXA9cENvZWYtPkIxOwogICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdPXRlbXA7CiB9CisjZW5kaWYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBFbmQgT2YgRmlsZTogQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IDkwOWM2OTkuLjgxMWRhOGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTI3LDQgKzI3LDEzIEBACiAKIHR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVAoreworICAgIExWTV9GTE9BVCAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgIGNvZWZzWzVdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCisKK31GaWx0ZXJfU3RhdGVfRkxPQVQ7Cit0eXBlZGVmIEZpbHRlcl9TdGF0ZV9GTE9BVCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOworI2VuZGlmCiAjZW5kaWYgLypfQlFfMUlfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMKaW5kZXggOTJmNmNhZi4uYzc0YTEzNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jCkBAIC0zMiw3ICszMiw1NCBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFExNiBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeShuLTIpTCBpbiBRMTYgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgIHluTDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CiAKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9QTIgICogeChuLTIpTAorICAgICAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworCisgICAgICAgICAgICAvLyB5bkwrPUExICAqIHgobi0xKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisKKyAgICAgICAgICAgIC8vIHluTCs9QTAgICogeChuKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAvLyB5bkwrPSAoICgtQjIgICogeShuLTIpTCApCisgICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKKworICAgICAgICAgICAgLy8geW5MKz0gLUIxICAqIHkobi0xKUwKKyAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07ICAvLyB5KG4tMilMPXkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgIC8vIHgobi0yKUw9eChuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0geW5MOyAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgICAgICAgICAgICAgIC8vIFVwZGF0ZSB4KG4tMSlMCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKSh5bkwpOyAvLyBXcml0ZSBMZWZ0IG91dHB1dAorCisgICAgICAgIH0KKyAgICB9CisjZWxzZQogdm9pZCBCUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMSAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtODEsNCArMTI4LDQgQEAKIAogICAgICAgICB9CiAgICAgfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCBhZWExMGYwLi45ODEyMjc0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0yNyw0ICsyNywxMyBAQAogCiB0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKK3sKKyAgICBMVk1fRkxPQVQgKiAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9GTE9BVCAgICAgY29lZnNbNV07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KKworfUZpbHRlcl9TdGF0ZV9GTE9BVDsKK3R5cGVkZWYgRmlsdGVyX1N0YXRlX0ZMT0FUICogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7CisjZW5kaWYKICNlbmRpZiAvKl9CUV8xSV9EMTZGMzJDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYwppbmRleCAxZDZiZTRlLi5mZWFlMjBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jCkBAIC0zOCw2ICszOCwyNyBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCit7CisgICAgTFZNX0ZMT0FUIHRlbXA7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKXBUYXBzOworCisgICAgdGVtcCA9IHBDb2VmLT5BMjsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkExOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QTA7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMjsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkIxOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gPSB0ZW1wOworfQorI2Vsc2UKIHZvaWQgQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzE2X0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCkBAIC01Nyw2ICs3OCw3IEBACiAgIHRlbXA9cENvZWYtPkIxOwogICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdPXRlbXA7CiB9CisjZW5kaWYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBFbmQgT2YgRmlsZTogQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jCmluZGV4IDk3MmU3MDQuLjliMGZkZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYwpAQCAtMzcsNyArMzcsODEgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMCBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAgeW5MLHluUjsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CiAKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPUEyICAqIHgobi0yKUwKKyAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMSAgKiB4KG4tMSlMCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvLyB5bkwrPUEwICAqIHgobilMCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKKworICAgICAgICAgICAgLy8geW5MKz0gKCAtQjIgICogeShuLTIpTCAgKQorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XTsKKworICAgICAgICAgICAgLy8geW5MKz0oIC1CMSAgKiB5KG4tMSlMICkKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07CisKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5blI9QTIgICogeChuLTIpUgorICAgICAgICAgICAgeW5SID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvLyB5blIrPUExICAqIHgobi0xKVIKKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisKKyAgICAgICAgICAgIC8vIHluUis9QTAgICogeChuKVIKKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKihwRGF0YUluKzEpKTsKKworICAgICAgICAgICAgLy8geW5SKz0gKCAtQjIgICogeShuLTIpUiAgKQorICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XTsKKworICAgICAgICAgICAgLy8geW5SKz0oIC1CMSAgKiB5KG4tMSlSICApCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgIC8vIHkobi0yKVI9eShuLTEpUgorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAgLy8geShuLTIpTD15KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07ICAvLyB4KG4tMilSPXgobi0xKVIKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgIC8vIHgobi0yKUw9eChuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdID0geW5SOyAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHkobi0xKVIKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IHluTDsgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7ICAgICAgICAgICAgICAvLyBVcGRhdGUgeChuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gKCpwRGF0YUluKyspOyAgICAgICAgICAgICAgLy8gVXBkYXRlIHgobi0xKVIKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dAorICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluUjsgLy8gV3JpdGUgUmlnaHQgb3VwdXQKKworCisgICAgICAgIH0KKworICAgIH0KKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC0xMTIsMyArMTg2LDQgQEAKIAogICAgIH0KIAorI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMKaW5kZXggZTA1NjM3My4uZjI0ZGI4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jCkBAIC0zNyw3ICszNyw4MSBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSBpcyB5KG4tMilSIGluIFEwIGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICB5bkwseW5SOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKIAorICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8vIHluTD1BMiAgKiB4KG4tMilMCisgICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKyAgICAgICAgICAgIC8vIHluTCs9QTEgICogeChuLTEpTAorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMCAgKiB4KG4pTAorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8vIHluTCs9ICggLUIyICAqIHkobi0yKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl07CisKKyAgICAgICAgICAgIC8vIHluTCs9KCAtQjEgICogeShuLTEpTAorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsKKworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8vIHluUj1BMiAgKiB4KG4tMilSCisgICAgICAgICAgICB5blIgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisKKyAgICAgICAgICAgIC8vIHluUis9QTEgICogeChuLTEpUgorICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKworICAgICAgICAgICAgLy8geW5SKz1BMCAgKiB4KG4pUgorICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqKHBEYXRhSW4rMSkpOworCisgICAgICAgICAgICAvLyB5blIrPSAoIC1CMiAgKiB5KG4tMilSICApCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzNdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddOworCisgICAgICAgICAgICAvLyB5blIrPSggLUIxICAqIHkobi0xKVIgICkKKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAgLy8geShuLTIpUj15KG4tMSlSCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07ICAvLyB5KG4tMilMPXkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgIC8vIHgobi0yKVI9eChuLTEpUgorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLy8geChuLTIpTD14KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSB5blI7ICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpUgorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdID0geW5MOyAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgICAgICAgICAgICAgIC8vIFVwZGF0ZSB4KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSAoKnBEYXRhSW4rKyk7ICAgICAgICAgICAgICAvLyBVcGRhdGUgeChuLTEpUgorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0CisgICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5SOyAvLyBXcml0ZSBSaWdodCBvdXB1dAorCisgICAgICAgIH0KKworICAgIH0KKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC0xMTEsNCArMTg1LDQgQEAKICAgICAgICAgfQogCiAgICAgfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYwppbmRleCAwYThhYzM1Li4zOWUxYmRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0zOCw2ICszOCwyNyBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCit7CisgICAgTFZNX0ZMT0FUIHRlbXA7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKSBwVGFwcyAgICAgICAgICAgIDsKKworICAgIHRlbXAgPSBwQ29lZi0+QTI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5BMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkEwOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdID0gdGVtcDsKK30KKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgICAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MxNl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQpAQCAtNTcsNiArNzgsNyBAQAogICB0ZW1wPXBDb2VmLT5CMTsKICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XT10ZW1wOwogfQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRW5kIE9mIEZpbGU6IEJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCA3ZDQyY2VkLi4wNjkxYjhjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0yOCw0ICsyOCwxNCBAQAogCiB0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKK3sKKyAgICBMVk1fRkxPQVQgKiAgIHBEZWxheXM7ICAgICAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICovCisgICAgTFZNX0ZMT0FUICAgICBjb2Vmc1s1XTsgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KKworfUZpbHRlcl9TdGF0ZV9GTE9BVDsKK3R5cGVkZWYgRmlsdGVyX1N0YXRlX0ZMT0FUICogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7CisjZW5kaWYKKwogI2VuZGlmIC8qIF9CUV8ySV9EMTZGMTZDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEuYwppbmRleCA0YTBjY2U0Li42MWMwN2M3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxLmMKQEAgLTM3LDcgKzM3LDc5IEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTE2IGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSBpcyB5KG4tMilSIGluIFExNiBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgIHluTCx5blI7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwogCisgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiB5bkw9QTIgKiB4KG4tMilMICovCisgICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKyAgICAgICAgICAgIC8qIHluTCs9QTEqIHgobi0xKUwgKi8KKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisKKyAgICAgICAgICAgIC8qIHluTCs9QTAqIHgobilMICAgKi8KKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAvKiB5bkwrPS1CMip5KG4tMilMICovCisgICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKKworICAgICAgICAgICAgLyogeW5MKz0tQjEqeShuLTEpTCAqLworICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluUj1BMiAqIHgobi0yKVIgKi8KKyAgICAgICAgICAgIHluUiA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKworICAgICAgICAgICAgLyogeW5SKz1BMSogeChuLTEpUiAqLworICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKworICAgICAgICAgICAgLyogeW5SKz1BMCogeChuKVIgICAqLworICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqKHBEYXRhSW4rMSkpOworCisgICAgICAgICAgICAvKiB5blIrPS1CMiAqIHkobi0yKVIgKi8KKyAgICAgICAgICAgIHluUiArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOworCisgICAgICAgICAgICAvKiB5blIrPS1CMSAqIHkobi0xKVIgKi8KKyAgICAgICAgICAgIHluUiArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07ICAvKiB5KG4tMilSPXkobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAgLyogeShuLTIpTD15KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgIC8qIHgobi0yKVI9eChuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07ICAvKiB4KG4tMilMPXgobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdID0geW5SOyAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHkobi0xKVIgKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IHluTDsgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB5KG4tMSlMICovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4pOyAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeChuLTEpTCAqLworICAgICAgICAgICAgcERhdGFJbisrOworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gKCpwRGF0YUluKTsgICAgICAgICAgICAgICAgLyogVXBkYXRlIHgobi0xKVIgKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKSh5bkwpOyAvKiBXcml0ZSBMZWZ0IG91dHB1dCAqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpKHluUik7IC8qIFdyaXRlIFJpZ2h0IG91cHV0ICovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICB9CisgICAgfQorI2Vsc2UKIHZvaWQgQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC0xMTUsNCArMTg3LDQgQEAKICAgICAgICAgfQogCiAgICAgfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jCmluZGV4IDA1MmUyYTAuLmNmMTllMDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE0X1RSQ19XUkFfMDEuYwpAQCAtMzYsNyArMzYsODIgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMTYgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTE2IGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAgeW5MLHluUjsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CiAKKyAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5MPUEyICAqIHgobi0yKUwgKi8KKyAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKworICAgICAgICAgICAgLyogeW5MKz1BMSAgKiB4KG4tMSlMICovCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvKiB5bkwrPUEwICAqIHgobilMICovCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKKworICAgICAgICAgICAgLyogeW5MKz0gKCAoLUIyICAqIHkobi0yKUwgICkpKi8KKyAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOworCisKKyAgICAgICAgICAgIC8qIHluTCs9KCAoLUIxICAqIHkobi0xKUwgICkpICAqLworICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluUj1BMiAgKiB4KG4tMilSICovCisgICAgICAgICAgICB5blIgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisKKyAgICAgICAgICAgIC8qIHluUis9QTEgICogeChuLTEpUiAqLworICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKworICAgICAgICAgICAgLyogeW5SKz1BMCAgKiB4KG4pUiAqLworICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqKHBEYXRhSW4rMSkpOworCisgICAgICAgICAgICAvKiB5blIrPSAoICgtQjIgICogeShuLTIpUiAgKSkqLworICAgICAgICAgICAgeW5SICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107CisKKyAgICAgICAgICAgIC8qIHluUis9KCAoLUIxICAqIHkobi0xKVIgICkpICAqLworICAgICAgICAgICAgeW5SICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgIC8qIHkobi0yKVI9eShuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07ICAvKiB5KG4tMilMPXkobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOyAgLyogeChuLTIpUj14KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgIC8qIHgobi0yKUw9eChuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSB5blI7ICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeShuLTEpUiAqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdID0geW5MOyAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHkobi0xKUwgKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbik7ICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB4KG4tMSlMICovCisgICAgICAgICAgICBwRGF0YUluKys7CisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSAoKnBEYXRhSW4pOyAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeChuLTEpUiAqLworICAgICAgICAgICAgcERhdGFJbisrOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpKHluTCk7IC8qIFdyaXRlIExlZnQgb3V0cHV0ICovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCkoeW5SKTsgLyogV3JpdGUgUmlnaHQgb3VwdXQgKi8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgIH0KKworICAgIH0KKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtMTE0LDQgKzE4OSw0IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEuYwppbmRleCA4Yzc0MWUxLi4yNjExYjE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxLmMKQEAgLTM2LDcgKzM2LDg0IEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTE2IGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSBpcyB5KG4tMilSIGluIFExNiBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgIHluTCx5blI7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwogCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5MPUEyICAqIHgobi0yKUwgKi8KKyAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKworICAgICAgICAgICAgLyogeW5MKz1BMSAgKiB4KG4tMSlMICovCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvKiB5bkwrPUEwICAqIHgobilMICovCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKKworICAgICAgICAgICAgLyogeW5MKz0gKCAoLUIyICAqIHkobi0yKUwgKSAgKi8KKyAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOworCisKKyAgICAgICAgICAgIC8qIHluTCs9KCAoLUIxICAqIHkobi0xKUwgICkpICAqLworICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5SPUEyICAqIHgobi0yKVIgKi8KKyAgICAgICAgICAgIHluUiA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKworICAgICAgICAgICAgLyogeW5SKz1BMSAgKiB4KG4tMSlSICovCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworCisgICAgICAgICAgICAvKiB5blIrPUEwICAqIHgobilSICovCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCoocERhdGFJbisxKSk7CisKKyAgICAgICAgICAgIC8qIHluUis9ICggKC1CMiAgKiB5KG4tMilSICkgKi8KKyAgICAgICAgICAgIHluUiArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOworCisKKyAgICAgICAgICAgIC8qIHluUis9KCAoLUIxICAqIHkobi0xKVIgICkpIGluIFExNSAqLworICAgICAgICAgICAgeW5SICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgLyogeShuLTIpUj15KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgLyogeShuLTIpTD15KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgLyogeChuLTIpUj14KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLyogeChuLTIpTD14KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSA9IHluUjsgLyogVXBkYXRlIHkobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdID0geW5MOyAvKiBVcGRhdGUgeShuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpTCovCisgICAgICAgICAgICBwRGF0YUluKys7CisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpUiovCisgICAgICAgICAgICBwRGF0YUluKys7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCkoeW5MKTsgLyogV3JpdGUgTGVmdCBvdXRwdXQqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpKHluUik7IC8qIFdyaXRlIFJpZ2h0IG91cHV0Ki8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgIH0KKworICAgIH0KKyNlbHNlCiB2b2lkIEJRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtMTE0LDQgKzE5MSw0IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggNGYwY2Y2Ny4uYzAzMTljOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMjgsNCArMjgsMTQgQEAKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUCit7CisgICAgTFZNX0ZMT0FUICogICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZnNbNV07ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlX0ZMT0FUOwordHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKKyNlbmRpZgorCiAjZW5kaWYgLyogX0JRXzJJX0QxNkYzMkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYwppbmRleCA0NTkxZWUwLi40ZDliYmZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jCkBAIC0zNyw2ICszNywyNiBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEJRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCit7CisgICAgTFZNX0ZMT0FUIHRlbXA7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKSBwVGFwczsKKyAgICB0ZW1wID0gcENvZWYtPkEyOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QTE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5BMDsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkIyOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSA9IHRlbXA7Cit9CisjZWxzZQogdm9pZCBCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKQEAgLTU2LDYgKzc2LDcgQEAKICAgdGVtcD1wQ29lZi0+QjE7CiAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF09dGVtcDsKIH0KKyNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIEVuZCBPZiBGaWxlOiBCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxLmMKaW5kZXggZmQ4MjEyZTQuLjk2MGRlNzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEuYwpAQCAtMzYsNyArMzYsOTQgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMCBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpCiAKKworICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUIHluTCx5blIsdGVtcGwsdGVtcGQ7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5MPSAoIEEyICAqIHgobi0yKUwgICkgKi8KKyAgICAgICAgICAgIHluTCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKyAgICAgICAgICAgIC8qIHluTCs9ICggQTEgICogeChuLTEpTCAgKSovCisgICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisgICAgICAgICAgICB5bkwgKz0gdGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluTCs9ICggQTAgICogeChuKUwgICkgKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7CisgICAgICAgICAgICB5bkwgKz0gdGVtcGw7CisKKyAgICAgICAgICAgICAvKiB5bkwrPSAoLUIyICAqIHkobi0yKUwgICkgKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XTsKKyAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyogeW5MKz0gKC1CMSAgKiB5KG4tMSlMICApKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsKKyAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5SPSAoIEEyICAqIHgobi0yKVIgICkgKi8KKyAgICAgICAgICAgIHluUiA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisKKyAgICAgICAgICAgIC8qIHluUis9ICggQTEgICogeChuLTEpUiAgKSAqLworICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworICAgICAgICAgICAgeW5SICs9IHRlbXBsOworCisgICAgICAgICAgICAvKiB5blIrPSAoIEEwICAqIHgobilSICApICovCisgICAgICAgICAgICB0ZW1wZCA9KiAocERhdGFJbisxKTsKKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqIHRlbXBkOworICAgICAgICAgICAgeW5SICs9IHRlbXBsOworCisgICAgICAgICAgICAvKiB5blIrPSAoLUIyICAqIHkobi0yKVIgICkgKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XTsKKyAgICAgICAgICAgIHluUiArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyogeW5SKz0gKC1CMSAgKiB5KG4tMSlSICApICAqLworICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOworICAgICAgICAgICAgeW5SICs9IHRlbXBsOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07IC8qIHkobi0yKVI9eShuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07IC8qIHkobi0yKUw9eShuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07IC8qIHgobi0yKVI9eChuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8qIHgobi0yKUw9eChuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSAoTFZNX0ZMT0FUKXluUjsgLyogVXBkYXRlIHkobi0xKVIgKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IChMVk1fRkxPQVQpeW5MOyAvKiBVcGRhdGUgeShuLTEpTCAqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKUwgKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9ICgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlSICovCisgICAgICAgICAgICBwRGF0YUluKys7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCl5bkw7IC8qIFdyaXRlIExlZnQgb3V0cHV0ICovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCl5blI7IC8qIFdyaXRlIFJpZ2h0IG91cHV0ICovCisgICAgICAgICAgICBwRGF0YU91dCsrOworCisKKyAgICAgICAgfQorCisgICAgfQorI2Vsc2UKIHZvaWQgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC0xMjMsNCArMjEwLDQgQEAKICAgICAgICAgfQogCiAgICAgfQotCisjZW5kaWYgLypCVUlMRF9GTE9BVCovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMKaW5kZXggMTcwOWY3MS4uZmZmMDVlZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYwpAQCAtMzcsNiArMzcsMjYgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICAgIExWTV9GTE9BVCB0ZW1wOworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9IChMVk1fRkxPQVQgKikgcFRhcHM7CisgICAgdGVtcCA9IHBDb2VmLT5BMjsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkExOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QTA7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMjsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkIxOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gPSB0ZW1wOworfQorI2Vsc2UKIHZvaWQgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzMyX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCkBAIC01Niw2ICs3Niw3IEBACiAgIHRlbXA9cENvZWYtPkIxOwogICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdPXRlbXA7CiB9CisjZW5kaWYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBFbmQgT2YgRmlsZTogQlFfMklfRDMyRjMyQzMyX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IDc0N2FmNmEuLmMwZjBkY2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTI5LDQgKzI5LDE0IEBACiAKIHR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVAoreworICAgIExWTV9GTE9BVCAqICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZnNbNV07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31GaWx0ZXJfU3RhdGVfRkxPQVQ7Cit0eXBlZGVmIEZpbHRlcl9TdGF0ZV9GTE9BVCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOworI2VuZGlmCisKICNlbmRpZiAvKiBfQlFfMklfRDMyRjMyQ0xMX1RSQ19XUkFfMDFfUFJJVkFURV9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmMKaW5kZXggMjA0MDRhZC4uZTQ4OTAzMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcHlfMTYuYwpAQCAtNTQsNSArNTQsMzUgQEAKIAogICAgIHJldHVybjsKIH0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBDb3B5X0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCit7CisgICAgTFZNX0lOVDE2IGlpOwogCisgICAgaWYgKHNyYyA+IGRzdCkKKyAgICB7CisgICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gKnNyYzsKKyAgICAgICAgICAgIGRzdCsrOworICAgICAgICAgICAgc3JjKys7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3JjICs9IG4gLSAxOworICAgICAgICBkc3QgKz0gbiAtIDE7CisgICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gKnNyYzsKKyAgICAgICAgICAgIGRzdC0tOworICAgICAgICAgICAgc3JjLS07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQuYwppbmRleCBiZjY5ZTM1Li5lYTk4MDQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQuYwpAQCAtMjUsNyArMjUsMzcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBDT1JFX01JWEhBUkRfMlNUX0QzMkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIENvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVCggICBNaXhfMlN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKKyAgICBMVk1fRkxPQVQgIFRlbXAxLFRlbXAyLFRlbXAzOworICAgIExWTV9JTlQxNiBpaTsKKyAgICBMVk1fRkxPQVQgQ3VycmVudDFTaG9ydDsKKyAgICBMVk1fRkxPQVQgQ3VycmVudDJTaG9ydDsKIAorICAgIEN1cnJlbnQxU2hvcnQgPSAocEluc3RhbmNlLT5DdXJyZW50MSk7CisgICAgQ3VycmVudDJTaG9ydCA9IChwSW5zdGFuY2UtPkN1cnJlbnQyKTsKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgVGVtcDEgPSAqc3JjMSsrOworICAgICAgICBUZW1wMyA9IFRlbXAxICogQ3VycmVudDFTaG9ydDsKKyAgICAgICAgVGVtcDIgPSAqc3JjMisrOworICAgICAgICBUZW1wMSA9IFRlbXAyICogQ3VycmVudDJTaG9ydDsKKyAgICAgICAgVGVtcDIgPSAoVGVtcDEgLyAyLjBmKSArIChUZW1wMyAvIDIuMGYpOworICAgICAgICBpZiAoVGVtcDIgPiAwLjVmKQorICAgICAgICAgICAgVGVtcDIgPSAxLjBmOworICAgICAgICBlbHNlIGlmIChUZW1wMiA8IC0wLjVmICkKKyAgICAgICAgICAgIFRlbXAyID0gLTEuMGY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFRlbXAyID0gKFRlbXAyICogMik7CisgICAgICAgICAgICAqZHN0KysgPSBUZW1wMjsKKyAgICB9Cit9CisjZWxzZQogdm9pZCBDb3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQoICAgTWl4XzJTdF9DbGxfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYzIsCkBAIC01NSw2ICs4NSw1IEBACiAgICAgICAgICAgICAqZHN0KysgPSBUZW1wMjsKICAgICB9CiB9Ci0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYwppbmRleCAzNDcxZjA1Li4yODE0ZjE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEluU29mdF9EMzJDMzFfU0FULmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVC5jCkBAIC0yNiw2ICsyNiw3MCBAQAogICAgRlVOQ1RJT04gQ09SRV9NSVhTT0ZUXzFTVF9EMzJDMzFfV1JBCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUIC8qIEJVSUxEX0ZMT0FUICovCit2b2lkIENvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoICAgICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCit7CisgICAgTFZNX0ZMT0FUICAgIFRlbXAxLFRlbXAyLFRlbXAzOworICAgIExWTV9JTlQxNiAgICAgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgICAgIEluTG9vcDsKKyAgICBMVk1fRkxPQVQgICAgVGFyZ2V0VGltZXNPbmVNaW5BbHBoYTsKKyAgICBMVk1fRkxPQVQgICAgQ3VycmVudFRpbWVzQWxwaGE7CisgICAgTFZNX0lOVDE2ICAgICBpaSxqajsKKworCisgICAgSW5Mb29wID0gKExWTV9JTlQxNikobiA+PiAyKTsgLyogUHJvY2VzcyBwZXIgNCBzYW1wbGVzICovCisgICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKG4gLSAoSW5Mb29wIDw8IDIpKTsKKworICAgIFRhcmdldFRpbWVzT25lTWluQWxwaGEgPSAoKDEuMGYgLXBJbnN0YW5jZS0+QWxwaGEpICogcEluc3RhbmNlLT5UYXJnZXQpOworICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCA+PSBwSW5zdGFuY2UtPkN1cnJlbnQpeworICAgICAgICBUYXJnZXRUaW1lc09uZU1pbkFscGhhICs9KExWTV9GTE9BVCkoMi4wZiAvIDIxNDc0ODM2NDcuMGYpOyAvKiBDZWlsKi8KKyAgICB9CisKKyAgICBpZiAoT3V0TG9vcCl7CisKKyAgICAgICAgQ3VycmVudFRpbWVzQWxwaGEgPSBwSW5zdGFuY2UtPkN1cnJlbnQgKiBwSW5zdGFuY2UtPkFscGhhOworICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBUYXJnZXRUaW1lc09uZU1pbkFscGhhICsgQ3VycmVudFRpbWVzQWxwaGE7CisKKyAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICBUZW1wMSA9ICpzcmMrKzsKKyAgICAgICAgVGVtcDIgPSAqZHN0OworCisgICAgICAgIFRlbXAzID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKKyAgICAgICAgVGVtcDEgPSBUZW1wMiArIFRlbXAzOworCisgICAgICAgIGlmIChUZW1wMSA+IDEuMGYpCisgICAgICAgICAgICBUZW1wMSA9IDEuMGY7CisgICAgICAgIGVsc2UgaWYgKFRlbXAxIDwgLTEuMGYpCisgICAgICAgICAgICBUZW1wMSA9IC0xLjBmOworCisgICAgICAgICpkc3QrKyA9IFRlbXAxOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSl7CisKKyAgICAgICAgQ3VycmVudFRpbWVzQWxwaGEgPSBwSW5zdGFuY2UtPkN1cnJlbnQgKiBwSW5zdGFuY2UtPkFscGhhOworICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBUYXJnZXRUaW1lc09uZU1pbkFscGhhICsgQ3VycmVudFRpbWVzQWxwaGE7CisKKyAgICAgICAgZm9yIChqaiA9IDQ7IGpqIT0wIDsgamotLSl7CisgICAgICAgICAgICBUZW1wMSA9ICpzcmMrKzsKKyAgICAgICAgICAgIFRlbXAyID0gKmRzdDsKKworICAgICAgICAgICAgVGVtcDMgPSBUZW1wMSAqIChwSW5zdGFuY2UtPkN1cnJlbnQpOworICAgICAgICAgICAgVGVtcDEgPSBUZW1wMiArIFRlbXAzOworCisgICAgICAgICAgICBpZiAoVGVtcDEgPiAxLjBmKQorICAgICAgICAgICAgICAgIFRlbXAxID0gMS4wZjsKKyAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAxIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgVGVtcDEgPSAtMS4wZjsKKyAgICAgICAgICAgICpkc3QrKyA9IFRlbXAxOworICAgICAgICB9CisgICAgfQorfQorI2Vsc2UKIHZvaWQgQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVCggICAgIE1peF8xU3RfQ2xsX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKQEAgLTg5LDYgKzE1Myw1IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMKaW5kZXggNzA5YzMwNC4uODE0Y2NlZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMKQEAgLTI1LDcgKzI1LDc5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gQ09SRV9NSVhTT0ZUXzFTVF9EMzJDMzFfV1JBCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBDb3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEoICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQoreworICAgIExWTV9GTE9BVCBUZW1wMSxUZW1wMjsKKyAgICBMVk1fSU5UMTYgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgSW5Mb29wOworICAgIExWTV9GTE9BVCBUYXJnZXRUaW1lc09uZU1pbkFscGhhOworICAgIExWTV9GTE9BVCBDdXJyZW50VGltZXNBbHBoYTsKIAorICAgIExWTV9JTlQxNiBpaTsKKworICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKG4gPj4gMik7IC8qIFByb2Nlc3MgcGVyIDQgc2FtcGxlcyAqLworICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShuIC0gKEluTG9vcCA8PCAyKSk7CisKKyAgICBUYXJnZXRUaW1lc09uZU1pbkFscGhhID0gKDEuMGYgLSBwSW5zdGFuY2UtPkFscGhhKSAqIHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBmbG9hdCAqIGZsb2F0IGluIGZsb2F0ICovCisgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ID49IHBJbnN0YW5jZS0+Q3VycmVudCkKKyAgICB7CisgICAgICAgIFRhcmdldFRpbWVzT25lTWluQWxwaGEgKz0gKExWTV9GTE9BVCkoMi4wZiAvIDIxNDc0ODM2NDcuMGYpOyAvKiBDZWlsKi8KKyAgICB9CisKKyAgICBpZiAoT3V0TG9vcCAhPSAwKQorICAgIHsKKyAgICAgICAgQ3VycmVudFRpbWVzQWxwaGEgPSAocEluc3RhbmNlLT5DdXJyZW50ICogcEluc3RhbmNlLT5BbHBoYSk7CisgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IFRhcmdldFRpbWVzT25lTWluQWxwaGEgKyBDdXJyZW50VGltZXNBbHBoYTsKKworICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworICAgICAgICAgICAgVGVtcDEgPSAqc3JjOworICAgICAgICAgICAgc3JjKys7CisKKyAgICAgICAgICAgIFRlbXAyID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKKyAgICAgICAgICAgICpkc3QgPSBUZW1wMjsKKyAgICAgICAgICAgIGRzdCsrOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIEN1cnJlbnRUaW1lc0FscGhhID0gcEluc3RhbmNlLT5DdXJyZW50ICogcEluc3RhbmNlLT5BbHBoYTsKKyAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArIEN1cnJlbnRUaW1lc0FscGhhOworCisgICAgICAgICAgICBUZW1wMSA9ICpzcmM7CisgICAgICAgICAgICBzcmMrKzsKKworICAgICAgICAgICAgVGVtcDIgPSBUZW1wMSAqIChwSW5zdGFuY2UtPkN1cnJlbnQpOworICAgICAgICAgICAgKmRzdCA9IFRlbXAyOworICAgICAgICAgICAgZHN0Kys7CisKKyAgICAgICAgICAgIFRlbXAxID0gKnNyYzsKKyAgICAgICAgICAgIHNyYysrOworCisgICAgICAgICAgICBUZW1wMiA9IFRlbXAxICogKHBJbnN0YW5jZS0+Q3VycmVudCk7CisgICAgICAgICAgICAqZHN0ID0gVGVtcDI7CisgICAgICAgICAgICBkc3QrKzsKKworICAgICAgICAgICAgVGVtcDEgPSAqc3JjOworICAgICAgICAgICAgc3JjKys7CisKKyAgICAgICAgICAgIFRlbXAyID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKKyAgICAgICAgICAgICpkc3QgPSBUZW1wMjsKKyAgICAgICAgICAgIGRzdCsrOworCisgICAgICAgICAgICBUZW1wMSA9ICpzcmM7CisgICAgICAgICAgICBzcmMrKzsKKyAgICAgICAgICAgIFRlbXAyID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKKyAgICAgICAgICAgICpkc3QgPSBUZW1wMjsKKyAgICAgICAgICAgIGRzdCsrOworICAgIH0KK30KKyNlbHNlCiB2b2lkIENvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggICBNaXhfMVN0X0NsbF90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCkBAIC05OCw2ICsxNzAsNSBAQAogICAgICAgICAgICAgZHN0Kys7CiAgICAgfQogfQotCi0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuYwppbmRleCA0OWZhMTg0Li5kMjYxYzllIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmMKQEAgLTE4LDcgKzE4LDUzIEBACiAjaW5jbHVkZSAiQklRVUFELmgiCiAjaW5jbHVkZSAiRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgogI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMSggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUIExlZnREQyxSaWdodERDOworICAgICAgICBMVk1fRkxPQVQgRGlmZjsKKyAgICAgICAgTFZNX0lOVDMyIGo7CisgICAgICAgIFBGaWx0ZXJfRkxPQVRfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfRkxPQVRfU3RhdGUpIHBJbnN0YW5jZTsKIAorICAgICAgICBMZWZ0REMgPSBwQmlxdWFkU3RhdGUtPkxlZnREQzsKKyAgICAgICAgUmlnaHREQyA9IHBCaXF1YWRTdGF0ZS0+UmlnaHREQzsKKyAgICAgICAgZm9yKGogPSBOclNhbXBsZXMtMTsgaiA+PSAwOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFN1YnRyYWN0IERDIGFuIHNhdHVyYXRlICovCisgICAgICAgICAgICBEaWZmID0qIChwRGF0YUluKyspIC0gKExlZnREQyk7CisgICAgICAgICAgICBpZiAoRGlmZiA+IDEuMGYpIHsKKyAgICAgICAgICAgICAgICBEaWZmID0gMS4wZjsgfQorICAgICAgICAgICAgZWxzZSBpZiAoRGlmZiA8IC0xLjBmKSB7CisgICAgICAgICAgICAgICAgRGlmZiA9IC0xLjBmOyB9CisgICAgICAgICAgICAqKHBEYXRhT3V0KyspID0gKExWTV9GTE9BVClEaWZmOworICAgICAgICAgICAgaWYgKERpZmYgPCAwKSB7CisgICAgICAgICAgICAgICAgTGVmdERDIC09IERDX0ZMT0FUX1NURVA7IH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIExlZnREQyArPSBEQ19GTE9BVF9TVEVQOyB9CisKKworICAgICAgICAgICAgLyogU3VidHJhY3QgREMgYW4gc2F0dXJhdGUgKi8KKyAgICAgICAgICAgIERpZmYgPSogKHBEYXRhSW4rKykgLSAoUmlnaHREQyk7CisgICAgICAgICAgICBpZiAoRGlmZiA+IDEuMGYpIHsKKyAgICAgICAgICAgICAgICBEaWZmID0gMS4wZjsgfQorICAgICAgICAgICAgZWxzZSBpZiAoRGlmZiA8IC0xLjBmKSB7CisgICAgICAgICAgICAgICAgRGlmZiA9IC0xLjBmOyB9CisgICAgICAgICAgICAqKHBEYXRhT3V0KyspID0gKExWTV9GTE9BVClEaWZmOworICAgICAgICAgICAgaWYgKERpZmYgPCAwKSB7CisgICAgICAgICAgICAgICAgUmlnaHREQyAtPSBEQ19GTE9BVF9TVEVQOyB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBSaWdodERDICs9IERDX0ZMT0FUX1NURVA7IH0KKworICAgICAgICB9CisgICAgICAgIHBCaXF1YWRTdGF0ZS0+TGVmdERDID0gTGVmdERDOworICAgICAgICBwQmlxdWFkU3RhdGUtPlJpZ2h0REMgPSBSaWdodERDOworCisKKyAgICB9CisjZWxzZQogdm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMSggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtNjQsNCArMTEwLDQgQEAKIAogCiAgICAgfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuYwppbmRleCA0NjhhODhkLi40ZjRmY2Q4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0xNywxMSArMTcsMTggQEAKIAogI2luY2x1ZGUgIkJJUVVBRC5oIgogI2luY2x1ZGUgIkRDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkICBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSkKK3sKKyAgICBQRmlsdGVyX0ZMT0FUX1N0YXRlIHBCaXF1YWRTdGF0ZSAgPSAoUEZpbHRlcl9GTE9BVF9TdGF0ZSkgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+TGVmdERDICAgICAgICA9IDAuMGY7CisgICAgcEJpcXVhZFN0YXRlLT5SaWdodERDICAgICAgID0gMC4wZjsKK30KKyNlbHNlCiB2b2lkICBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSkKIHsKICAgICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSAgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOwogICAgIHBCaXF1YWRTdGF0ZS0+TGVmdERDICAgICAgICA9IDA7CiAgICAgcEJpcXVhZFN0YXRlLT5SaWdodERDICAgICAgID0gMDsKIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggODlhNGU2OC4uZmE2YjcyOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMTgsMTEgKzE4LDIzIEBACiAjaWZuZGVmIF9EQ18ySV9EMTZfVFJDX1dSQV8wMV9QUklWQVRFX0hfCiAjZGVmaW5lIF9EQ18ySV9EMTZfVFJDX1dSQV8wMV9QUklWQVRFX0hfCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorI2RlZmluZSBEQ19GTE9BVF9TVEVQICAgMC4wMDAwMDAyMzg0ZjsKKyNlbHNlCiAjZGVmaW5lIERDX0QxNl9TVEVQICAgICAweDIwMDsKKyNlbmRpZgogCiAKIC8qIFRoZSBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIGluIGEgKGZvciB0aGUgdXNlcikgIGhpZGRlbiBzdHJ1Y3R1cmUgKi8KIC8qIEluIHRoaXMgKHByaXZhdGUpIGZpbGUsIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgZnJvIHByaXZhdGUgdXNlLiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfRkxPQVRfU3RhdGVfCit7CisgICAgTFZNX0ZMT0FUICBMZWZ0REM7ICAgICAvKiBMZWZ0REMgICovCisgICAgTFZNX0ZMT0FUICBSaWdodERDOyAgICAvKiBSaWdodERDICAqLworfUZpbHRlcl9GTE9BVF9TdGF0ZTsKK3R5cGVkZWYgRmlsdGVyX0ZMT0FUX1N0YXRlICogUEZpbHRlcl9GTE9BVF9TdGF0ZSA7CisjZWxzZQogdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KIHsKICAgTFZNX0lOVDMyICBMZWZ0REM7ICAgICAvKiBMZWZ0REMgICovCkBAIC0zMCw1ICs0Miw1IEBACiB9RmlsdGVyX1N0YXRlOwogCiB0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwotCisjZW5kaWYKICNlbmRpZiAvKiBfRENfMklfRDE2X1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlNaXhfMTZ4MTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5TWl4XzE2eDE2LmMKaW5kZXggN2UzMTgyZC4uZjUwMjcxNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlNaXhfMTZ4MTYuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheU1peF8xNngxNi5jCkBAIC0zNiwxMCArMzYsNTUgQEAKICAgICBMVk1fSU5UMTYgICBPZmZzZXQgID0gKnBPZmZzZXQ7CiAgICAgTFZNX0lOVDE2ICAgdGVtcDsKIAorICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgeworICAgICAgICAvKiBMZWZ0IGNoYW5uZWwgKi8KKyAgICAgICAgdGVtcCA9IChMVk1fSU5UMTYpKChMVk1fVUlOVDMyKSgoTFZNX0lOVDMyKSgqZHN0KSArIChMVk1fSU5UMzIpZGVsYXlbT2Zmc2V0XSkgPj4gMSk7CisgICAgICAgICpkc3QgPSB0ZW1wOworICAgICAgICBkc3QrKzsKKworICAgICAgICBkZWxheVtPZmZzZXRdID0gKnNyYzsKKyAgICAgICAgT2Zmc2V0Kys7CisgICAgICAgIHNyYysrOworCisKKyAgICAgICAgLyogUmlnaHQgY2hhbm5lbCAqLworICAgICAgICB0ZW1wID0gKExWTV9JTlQxNikoKExWTV9VSU5UMzIpKChMVk1fSU5UMzIpKCpkc3QpIC0gKExWTV9JTlQzMilkZWxheVtPZmZzZXRdKSA+PiAxKTsKKyAgICAgICAgKmRzdCA9IHRlbXA7CisgICAgICAgIGRzdCsrOworCisgICAgICAgIGRlbGF5W09mZnNldF0gPSAqc3JjOworICAgICAgICBPZmZzZXQrKzsKKyAgICAgICAgc3JjKys7CisKKyAgICAgICAgLyogTWFrZSB0aGUgcmV2ZXJiIGRlbGF5IGJ1ZmZlciBhIGNpcmN1bGFyIGJ1ZmZlciAqLworICAgICAgICBpZiAoT2Zmc2V0ID49IHNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIE9mZnNldCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBVcGRhdGUgdGhlIG9mZnNldCAqLworICAgICpwT2Zmc2V0ID0gT2Zmc2V0OworCisgICAgcmV0dXJuOworfQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIERlbGF5TWl4X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCAqc3JjLCAgICAgICAgICAgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkZWxheSwgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IHNpemUsICAgICAgICAgICAvKiBEZWxheSBzaXplICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LCAgICAgICAgICAgLyogU291cmNlL2Rlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqcE9mZnNldCwgICAgICAgLyogRGVsYXkgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKSAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCit7CisgICAgTFZNX0lOVDE2ICAgaTsKKyAgICBMVk1fSU5UMTYgICBPZmZzZXQgID0gKnBPZmZzZXQ7CisgICAgTFZNX0ZMT0FUICAgdGVtcDsKKwogICAgIGZvciAoaT0wOyBpPG47IGkrKykKICAgICB7CiAgICAgICAgIC8qIExlZnQgY2hhbm5lbCAqLwotICAgICAgICB0ZW1wICAgICAgICAgICAgPSAoTFZNX0lOVDE2KSgoTFZNX1VJTlQzMikoKExWTV9JTlQzMikoKmRzdCkgKyAoTFZNX0lOVDMyKWRlbGF5W09mZnNldF0pID4+IDEpOworICAgICAgICB0ZW1wICAgICAgICAgICAgPSAoTFZNX0ZMT0FUKSgoTFZNX0ZMT0FUKSgqZHN0ICsgKExWTV9GTE9BVClkZWxheVtPZmZzZXRdKSAvIDIuMGYpOwogICAgICAgICAqZHN0ICAgICAgICAgICAgPSB0ZW1wOwogICAgICAgICBkc3QrKzsKIApAQCAtNDksNyArOTQsNyBAQAogCiAKICAgICAgICAgLyogUmlnaHQgY2hhbm5lbCAqLwotICAgICAgICB0ZW1wICAgICAgICAgICAgPSAoTFZNX0lOVDE2KSgoTFZNX1VJTlQzMikoKExWTV9JTlQzMikoKmRzdCkgLSAoTFZNX0lOVDMyKWRlbGF5W09mZnNldF0pID4+IDEpOworICAgICAgICB0ZW1wICAgICAgICAgICAgPSAoTFZNX0ZMT0FUKSgoTFZNX0ZMT0FUKSgqZHN0IC0gKExWTV9GTE9BVClkZWxheVtPZmZzZXRdKSAvIDIuMGYpOwogICAgICAgICAqZHN0ICAgICAgICAgICAgPSB0ZW1wOwogICAgICAgICBkc3QrKzsKIApAQCAtNjksNSArMTE0LDUgQEAKIAogICAgIHJldHVybjsKIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jCmluZGV4IGRlNzczNjEuLjAzOWM4OGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYwpAQCAtMzEsNiArMzEsNDYgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgIHluTDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CisKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPUExICAqIHgobi0xKUwKKyAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMCAgKiB4KG4pTAorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8vIHluTCs9ICAoLUIxICAqIHkobi0xKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dAorCisgICAgICAgIH0KKworICAgIH0KKyNlbHNlCiB2b2lkIEZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCkBAIC03MSw0ICsxMTEsNCBAQAogICAgICAgICB9CiAKICAgICB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jCmluZGV4IDk2MjUyY2MuLmIyMWI4YTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTM4LDYgKzM4LDIyIEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCggICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgICBMVk1fRkxPQVQgdGVtcDsKKyAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSAgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKXBUYXBzOworICAgIHRlbXAgPSBwQ29lZi0+QTE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5BMDsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkIxOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSB0ZW1wOworfQorI2Vsc2UKIHZvaWQgRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCggICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIxX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fQzE2X0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCkBAIC01Myw2ICs2OSw3IEBACiAgIHRlbXA9cENvZWYtPkIxOwogICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdPXRlbXA7CiB9CisjZW5kaWYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIEVuZCBPZiBGaWxlOiBGT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IDUxNmNhODMuLjZmZGIwMzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTI4LDQgKzI4LDE0IEBACiAKIHR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVAoreworICAgIExWTV9GTE9BVCAqICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZnNbM107ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31GaWx0ZXJfU3RhdGVfRkxPQVQ7CisKK3R5cGVkZWYgRmlsdGVyX1N0YXRlX0ZMT0FUICogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7CisjZW5kaWYKICNlbmRpZiAvKiBfRk9fMUlfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxLmMKaW5kZXggMGYxZDViYy4uNDE2ZThlYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMS5jCkBAIC0zMSw3ICszMSw0NyBAQAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAogIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgIHluTCx0ZW1wbDsKKyAgICAgICAgTFZNX0lOVDE2ICBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwogCisgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9QTEgICogeChuLTEpTAorICAgICAgICAgICAgeW5MID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMCAgKiB4KG4pTAorICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogKCpwRGF0YUluKTsKKyAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAgICAgLy8geW5MKz0gICgtQjEgICogeShuLTEpTAorICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworICAgICAgICAgICAgeW5MICs9IHRlbXBsOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSB5bkw7IC8vIFVwZGF0ZSB5KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQgaW4gUTAKKyAgICAgICAgfQorCisgICAgfQorI2Vsc2UKIHZvaWQgRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTcxLDQgKzExMSw0IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMKaW5kZXggMTM2ZTRmNi4uZjMzZDI0ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYwpAQCAtMzcsNiArMzcsMjMgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICAgIExWTV9GTE9BVCB0ZW1wOworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpICBwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopICAgIHBUYXBzOworCisgICAgdGVtcCA9IHBDb2VmLT5BMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkEwOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHRlbXA7Cit9CisjZWxzZQogdm9pZCBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfVGFwc190ICAgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19DMzJfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKQEAgLTUyLDYgKzY5LDcgQEAKICAgdGVtcD1wQ29lZi0+QjE7CiAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl09dGVtcDsKIH0KKyNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRW5kIE9mIEZpbGU6IEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYyAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggOTRhZDQ4Yy4uZmRiNTI4YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMjksNCArMjksMTMgQEAKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUXworeworICAgIExWTV9GTE9BVCAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlX0ZMT0FUOworCit0eXBlZGVmIEZpbHRlcl9TdGF0ZV9GTE9BVCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOworI2VuZGlmCiAjZW5kaWYgLyogX0ZPXzFJX0QzMkYzMkNMTF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuYwppbmRleCA4Mzg4MDUwLi4xOTI5MjdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jCkBAIC0zMiw3ICszMiw5MiBAQAogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHgobi0xKVIgaW4gUTE1IGZvcm1hdAogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHkobi0xKVIgaW4gUTMwIGZvcm1hdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICAgeW5MLHluUjsKKyAgICAgICAgTFZNX0ZMT0FUICAgVGVtcDsKKyAgICAgICAgTFZNX0ZMT0FUICAgTmVnU2F0VmFsdWU7CisgICAgICAgIExWTV9JTlQxNiAgIGlpOwogCisgICAgICAgIFBGaWx0ZXJfRmxvYXRfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfRmxvYXRfU3RhdGUpIHBJbnN0YW5jZTsKKworICAgICAgICBOZWdTYXRWYWx1ZSA9IC0xLjBmOworCisgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICAgIC8vIHluTCA9QTEgICogeChuLTEpTAorICAgICAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworICAgICAgICAgICAgLy8geW5SID1BMSAgKiB4KG4tMSlSCisgICAgICAgICAgICB5blIgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKworICAgICAgICAgICAgLy8geW5MKz1BMCAgKiB4KG4pTAorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqICgqcERhdGFJbik7CisgICAgICAgICAgICAvLyB5blIrPUEwICAqIHgobilMCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogKCoocERhdGFJbisxKSk7CisKKworICAgICAgICAgICAgLy8geW5MICs9ICAoLUIxICAqIHkobi0xKUwgICkKKyAgICAgICAgICAgIFRlbXAgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdOworICAgICAgICAgICAgeW5MICs9IFRlbXA7CisgICAgICAgICAgICAvLyB5blIgKz0gICgtQjEgICogeShuLTEpUiApICkKKyAgICAgICAgICAgIFRlbXAgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdOworICAgICAgICAgICAgeW5SICs9IFRlbXA7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0geW5MOyAvLyBVcGRhdGUgeShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTAorCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSB5blI7IC8vIFVwZGF0ZSB5KG4tMSlSCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlSCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICAvKlNhdHVyYXRlIHJlc3VsdHMqLworICAgICAgICAgICAgaWYoeW5MID4gMS4wZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB5bkwgPSAxLjBmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHluTCA8IE5lZ1NhdFZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeW5MID0gTmVnU2F0VmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZih5blIgPiAxLjBmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHluUiA9IDEuMGY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoeW5SIDwgTmVnU2F0VmFsdWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB5blIgPSBOZWdTYXRWYWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5bkw7CisgICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5SOworICAgICAgICB9CisKKyAgICB9CisjZWxzZQogdm9pZCBGT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtMTI1LDQgKzIxMCw0IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdC5jCmluZGV4IGExOWMzMmMuLjMzY2E2Y2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0zNyw2ICszNywyMyBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIxX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0ZMT0FUX0xTaHhfQ29lZnNfdCAgICAgICAgKnBDb2VmKQoreworICAgIExWTV9GTE9BVCB0ZW1wOworICAgIFBGaWx0ZXJfRmxvYXRfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfRmxvYXRfU3RhdGUpIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9IChMVk1fRkxPQVQgKikgcFRhcHMgICAgICAgICAgICA7CisKKyAgICB0ZW1wID0gcENvZWYtPkExOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QTA7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gdGVtcDsKK30KKyNlbHNlCiB2b2lkIEZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIxX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0MxNl9MU2h4X0NvZWZzX3QgICAgICAgICpwQ29lZikKQEAgLTU1LDYgKzcyLDcgQEAKICAgdGVtcD1wQ29lZi0+U2hpZnQ7CiAgIHBCaXF1YWRTdGF0ZS0+U2hpZnQgPSB0ZW1wOwogfQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRW5kIE9mIEZpbGU6IEZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCA0NjQwNzQzLi4zNjhiZmNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMjAsNiArMjAsMTUgQEAKIAogLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLwogLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXworeworICAgIExWTV9GTE9BVCAgICAgKnBEZWxheXM7ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0ZMT0FUICAgICBjb2Vmc1szXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfUZpbHRlcl9GbG9hdF9TdGF0ZTsKKwordHlwZWRlZiBGaWx0ZXJfRmxvYXRfU3RhdGUgKiBQRmlsdGVyX0Zsb2F0X1N0YXRlIDsKKyNlbHNlCiB0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXwogewogICBMVk1fSU5UMzIgICAgICpwRGVsYXlzOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLwpAQCAtMjgsNSArMzcsNSBAQAogfUZpbHRlcl9TdGF0ZTsKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKLQorI2VuZGlmCiAjZW5kaWYgLyogX0ZPXzJJX0QxNkYzMkNTU19MU0hYX1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRmlsdGVycy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRmlsdGVycy5oCmluZGV4IDRkMzJkZjEuLmIxZmRlMGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZpbHRlcnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GaWx0ZXJzLmgKQEAgLTM0LDYgKzM0LDcgQEAKICAqIEJpcXVhZCB3aXRoIGNvZWZmaWNpZW50cyBBMCwgQTEsIEEyLCBCMSBhbmQgQjIgY29lZmZpY2llbnRzCiAgKi8KIC8qIFNpbmdsZSBwcmVjaXNpb24gKDE2LWJpdCkgQmlxdWFkIHNlY3Rpb24gY29lZmZpY2llbnRzICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB0eXBlZGVmIHN0cnVjdAogewogICAgICAgICBMVk1fSU5UMTYgICBBMDsKQEAgLTQzLDEyICs0NCwyMiBAQAogICAgICAgICBMVk1fSU5UMTYgICBCMjsKICAgICAgICAgTFZNX1VJTlQxNiAgU2NhbGU7CiB9IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3Q7Ci0KLQorI2Vsc2UKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0ZMT0FUICAgQTA7CisgICAgTFZNX0ZMT0FUICAgQTE7CisgICAgTFZNX0ZMT0FUICAgQTI7CisgICAgTFZNX0ZMT0FUICAgQjE7CisgICAgTFZNX0ZMT0FUICAgQjI7CisgICAgTFZNX1VJTlQxNiAgU2NhbGU7Cit9IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3Q7CisjZW5kaWYKIC8qCiAgKiBCaXF1YWQgd2l0aCBjb2VmZmljaWVudHMgQTAsIEExIGFuZCBCMSBjb2VmZmljaWVudHMKICAqLwogLyogU2luZ2xlIHByZWNpc2lvbiAoMTYtYml0KSBCaXF1YWQgc2VjdGlvbiBjb2VmZmljaWVudHMgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgICAgIExWTV9JTlQxNiAgIEEwOwpAQCAtNTYsOCArNjcsMTUgQEAKICAgICAgICAgTFZNX0lOVDE2ICAgQjE7CiAgICAgICAgIExWTV9VSU5UMTYgIFNjYWxlOwogfSBCaXF1YWRBMDFCMUNvZWZzU1BfdDsKLQotCisjZWxzZQordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgICBBMDsKKyAgICBMVk1fRkxPQVQgICBBMTsKKyAgICBMVk1fRkxPQVQgICBCMTsKKyAgICBMVk1fVUlOVDE2ICBTY2FsZTsKK30gQmlxdWFkQTAxQjFDb2Vmc1NQX3Q7CisjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01TXzE2eDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01TXzE2eDE2LmMKaW5kZXggNzk3NWU4Yi4uMmM2ZTZjMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9NU18xNngxNi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTVNfMTZ4MTYuYwpAQCAtNTMsNSArNTMsMzQgQEAKIAogICAgIHJldHVybjsKIH0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBGcm9tMmlUb01TX0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCit7CisgICAgTFZNX0ZMT0FUIHRlbXAxLGxlZnQscmlnaHQ7CisgICAgTFZNX0lOVDE2IGlpOworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgbGVmdCA9IChMVk1fRkxPQVQpKnNyYzsKKyAgICAgICAgc3JjKys7CiAKKyAgICAgICAgcmlnaHQgPSAoTFZNX0ZMT0FUKSpzcmM7CisgICAgICAgIHNyYysrOworCisgICAgICAgIC8qIENvbXB1dGUgTSBzaWduYWwqLworICAgICAgICB0ZW1wMSA9ICAobGVmdCArIHJpZ2h0KSAvIDIuMGY7CisgICAgICAgICpkc3RNID0gKExWTV9GTE9BVCl0ZW1wMTsKKyAgICAgICAgZHN0TSsrOworCisgICAgICAgIC8qIENvbXB1dGUgUyBzaWduYWwqLworICAgICAgICB0ZW1wMSA9ICAobGVmdCAtIHJpZ2h0KSAvIDIuMGY7CisgICAgICAgICpkc3RTID0gKExWTV9GTE9BVCl0ZW1wMTsKKyAgICAgICAgZHN0UysrOworICAgIH0KKworICAgIHJldHVybjsKK30KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jCmluZGV4IDhiYjI5MmYuLmFjMWVlYTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jCkBAIC00Niw1ICs0NiwyNyBAQAogCiAgICAgcmV0dXJuOwogfQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEZyb20yaVRvTW9ub19GbG9hdCggY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCit7CisgICAgTFZNX0lOVDE2IGlpOworICAgIExWTV9GTE9BVCBUZW1wOwogCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBUZW1wID0gKCpzcmMpOworICAgICAgICBzcmMrKzsKKworICAgICAgICBUZW1wICs9ICgqc3JjKTsKKyAgICAgICAgc3JjKys7CisKKyAgICAgICAgKmRzdCA9IFRlbXAgLyAyLjBmOworICAgICAgICBkc3QrKzsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSm9pblRvMmlfMzJ4MzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0pvaW5UbzJpXzMyeDMyLmMKaW5kZXggOWI5MzhiZC4uZWJjNDc3ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSm9pblRvMmlfMzJ4MzIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Kb2luVG8yaV8zMngzMi5jCkBAIC00OSw2ICs0OSwzMSBAQAogCiAgICAgcmV0dXJuOwogfQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIEpvaW5UbzJpX0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgICAgKnNyY0wsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnNyY1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICBuICkKK3sKKyAgICBMVk1fSU5UMTYgaWk7CiAKKyAgICBzcmNMICs9IG4gLSAxOworICAgIHNyY1IgKz0gbiAtIDE7CisgICAgZHN0ICArPSAoKDIgKiBuKSAtIDEpOworCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICAqZHN0ID0gKnNyY1I7CisgICAgICAgIGRzdC0tOworICAgICAgICBzcmNSLS07CisKKyAgICAgICAgKmRzdCA9ICpzcmNMOworICAgICAgICBkc3QtLTsKKyAgICAgICAgc3JjTC0tOworICAgIH0KKworICAgIHJldHVybjsKK30KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQuYwppbmRleCAzZDM5YjkzLi5lYjU3NTVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FULmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVC5jCkBAIC0yNyw3ICsyNywzOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIExWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgbikKK3sKKyAgICBMVk1fRkxPQVQgIFRlbXA7CisgICAgTFZNX0lOVDE2IGlpOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZTEtPlByaXZhdGVQYXJhbXMpOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMiA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZTItPlByaXZhdGVQYXJhbXMpOworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgVGVtcCA9ICgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClwSW5zdGFuY2UxLT5DdXJyZW50KTsKKyAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpkc3QrKyA9IChMVk1fRkxPQVQpVGVtcDsKIAorICAgICAgICBUZW1wID0gKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKXBJbnN0YW5jZTItPkN1cnJlbnQpOworICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKmRzdCsrID0gKExWTV9GTE9BVClUZW1wOworICAgIH0KKworCit9CisjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfc3QgICAgICAgICpwdHJJbnN0YW5jZTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAqc3JjLApAQCAtNjYsNCArOTgsNSBAQAogCiAKIH0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FULmMKaW5kZXggMmRhZjc0YS4uZWMwYmFhZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQuYwpAQCAtMjQsNyArMjQsMzcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMVkNvcmVfTUlYSEFSRF8yU1RfRDE2QzMxX1NBVAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAgKnB0ckluc3RhbmNlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQoreworICAgIExWTV9GTE9BVCAgVGVtcDsKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgTFZNX0ZMT0FUIEN1cnJlbnQxOworICAgIExWTV9GTE9BVCBDdXJyZW50MjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTEgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UxLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTIgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UyLT5Qcml2YXRlUGFyYW1zKTsKIAorCisgICAgQ3VycmVudDEgPSAocEluc3RhbmNlMS0+Q3VycmVudCk7CisgICAgQ3VycmVudDIgPSAocEluc3RhbmNlMi0+Q3VycmVudCk7CisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgIFRlbXAgPSAoKChMVk1fRkxPQVQpKihzcmMxKyspICogKExWTV9GTE9BVClDdXJyZW50MSkpICsKKyAgICAgICAgICAgICAgICgoKExWTV9GTE9BVCkqKHNyYzIrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnQyKSk7CisgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqZHN0KysgPSBUZW1wOworICAgIH0KK30KKyNlbHNlCiB2b2lkIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX3N0ICpwdHJJbnN0YW5jZTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19zdCAgICAgICAgICpwdHJJbnN0YW5jZTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMxLApAQCAtNTQsNiArODQsNSBAQAogICAgICAgICAgICAgKmRzdCsrID0gKExWTV9JTlQxNilUZW1wOwogICAgIH0KIH0KLQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FULmMKaW5kZXggY2FhMDk1MS4uZDI2OTRjYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVC5jCkBAIC0yNSw3ICsyNSw5NiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIExWQ29yZV9NSVhTT0ZUXzFTVF9EMTZDMzFfV1JBCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQorewogCisgICAgTFZNX0lOVDE2ICAgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgICBJbkxvb3A7CisgICAgTFZNX0lOVDMyICAgaWksamo7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPlByaXZhdGVQYXJhbXMpOworICAgIExWTV9GTE9BVCAgIERlbHRhID0gcEluc3RhbmNlLT5EZWx0YTsKKyAgICBMVk1fRkxPQVQgICBDdXJyZW50ID0gcEluc3RhbmNlLT5DdXJyZW50OworICAgIExWTV9GTE9BVCAgIFRhcmdldCA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgIExWTV9GTE9BVCAgIFRlbXA7CisKKyAgICBJbkxvb3AgPSAoTFZNX0lOVDE2KShuID4+IDIpOyAvKiBQcm9jZXNzIHBlciA0IHNhbXBsZXMgKi8KKyAgICBPdXRMb29wID0gKExWTV9JTlQxNikobiAtIChJbkxvb3AgPDwgMikpOworCisgICAgaWYoQ3VycmVudCA8IFRhcmdldCl7CisgICAgICAgIGlmIChPdXRMb29wKXsKKyAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7CisgICAgICAgICAgICBDdXJyZW50ID0gVGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICAgICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkqZHN0KSArICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fRkxPQVQpVGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICAgICAgVGVtcCA9IEN1cnJlbnQgKyBEZWx0YTsKKyAgICAgICAgICAgIEN1cnJlbnQgPSBUZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChqaiA9IDQ7IGpqICE9IDAgOyBqai0tKXsKKyAgICAgICAgICAgICAgICBUZW1wID0gKChMVk1fRkxPQVQpKmRzdCkgKyAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAoTFZNX0ZMT0FUKVRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZXsKKyAgICAgICAgaWYgKE91dExvb3ApeworICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgICAgICAgICBUZW1wID0gKChMVk1fRkxPQVQpKmRzdCkgKyAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAoTFZNX0ZMT0FUKVRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGpqID0gNDsgamogIT0gMCA7IGpqLS0peworICAgICAgICAgICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkqZHN0KSArICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fRkxPQVQpVGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBDdXJyZW50OworfQorI2Vsc2UKIHZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX3N0ICpwdHJJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgKmRzdCwKQEAgLTEyMyw2ICsyMTIsNSBAQAogICAgIH0KICAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudDsKIH0KLQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQS5jCmluZGV4IDA5ZWM0MjcuLjY1NmExMTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBLmMKQEAgLTI2LDcgKzI2LDEyNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIExWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitzdGF0aWMgTFZNX0ZMT0FUIEFERDJfU0FUX0ZMT0FUKExWTV9GTE9BVCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUIGMpCit7CisgICAgTFZNX0ZMT0FUIHRlbXA7CisgICAgdGVtcCA9IGEgKyBiIDsKKyAgICBpZiAodGVtcCA8IC0xLjBmKQorICAgICAgICBjID0gLTEuMGY7CisgICAgZWxzZSBpZiAodGVtcCA+IDEuMGYpCisgICAgICAgIGMgPSAxLjBmOworICAgIGVsc2UKKyAgICAgICAgYyA9IHRlbXA7CisgICAgcmV0dXJuIGM7Cit9Cit2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEoIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgbikKK3sKKyAgICBMVk1fSU5UMTYgICBPdXRMb29wOworICAgIExWTV9JTlQxNiAgIEluTG9vcDsKKyAgICBMVk1fSU5UMzIgICBpaTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZUwgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UxLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZVIgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UyLT5Qcml2YXRlUGFyYW1zKTsKIAorICAgIExWTV9GTE9BVCAgIERlbHRhTCA9IHBJbnN0YW5jZUwtPkRlbHRhOworICAgIExWTV9GTE9BVCAgIEN1cnJlbnRMID0gcEluc3RhbmNlTC0+Q3VycmVudDsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXRMID0gcEluc3RhbmNlTC0+VGFyZ2V0OworCisgICAgTFZNX0ZMT0FUICAgRGVsdGFSID0gcEluc3RhbmNlUi0+RGVsdGE7CisgICAgTFZNX0ZMT0FUICAgQ3VycmVudFIgPSBwSW5zdGFuY2VSLT5DdXJyZW50OworICAgIExWTV9GTE9BVCAgIFRhcmdldFIgPSBwSW5zdGFuY2VSLT5UYXJnZXQ7CisKKyAgICBMVk1fRkxPQVQgICBUZW1wID0gMDsKKworICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKG4gPj4gMik7IC8qIFByb2Nlc3MgcGVyIDQgc2FtcGxlcyAqLworICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShuIC0gKEluTG9vcCA8PCAyKSk7CisKKyAgICBpZiAoT3V0TG9vcCkKKyAgICB7CisgICAgICAgIGlmKEN1cnJlbnRMIDwgVGFyZ2V0TCkKKyAgICAgICAgeworICAgICAgICAgICAgQUREMl9TQVRfRkxPQVQoQ3VycmVudEwsIERlbHRhTCwgVGVtcCk7CisgICAgICAgICAgICBDdXJyZW50TCA9IFRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudEwgPiBUYXJnZXRMKQorICAgICAgICAgICAgICAgIEN1cnJlbnRMID0gVGFyZ2V0TDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEN1cnJlbnRMIC09IERlbHRhTDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50TCA8IFRhcmdldEwpCisgICAgICAgICAgICAgICAgQ3VycmVudEwgPSBUYXJnZXRMOworICAgICAgICB9CisKKyAgICAgICAgaWYoQ3VycmVudFIgPCBUYXJnZXRSKQorICAgICAgICB7CisgICAgICAgICAgICBBREQyX1NBVF9GTE9BVChDdXJyZW50UiwgRGVsdGFSLCBUZW1wKTsKKyAgICAgICAgICAgIEN1cnJlbnRSID0gVGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50UiA+IFRhcmdldFIpCisgICAgICAgICAgICAgICAgQ3VycmVudFIgPSBUYXJnZXRSOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ3VycmVudFIgLT0gRGVsdGFSOworICAgICAgICAgICAgaWYgKEN1cnJlbnRSIDwgVGFyZ2V0UikKKyAgICAgICAgICAgICAgICBDdXJyZW50UiA9IFRhcmdldFI7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gT3V0TG9vcCAqIDI7IGlpICE9IDA7IGlpIC09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRMKSk7CisgICAgICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50UikpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpaSA9IEluTG9vcCAqIDI7IGlpICE9IDA7IGlpLT0yKQorICAgIHsKKyAgICAgICAgaWYoQ3VycmVudEwgPCBUYXJnZXRMKQorICAgICAgICB7CisgICAgICAgICAgICBBREQyX1NBVF9GTE9BVChDdXJyZW50TCwgRGVsdGFMLCBUZW1wKTsKKyAgICAgICAgICAgIEN1cnJlbnRMID0gVGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50TCA+IFRhcmdldEwpCisgICAgICAgICAgICAgICAgQ3VycmVudEwgPSBUYXJnZXRMOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ3VycmVudEwgLT0gRGVsdGFMOworICAgICAgICAgICAgaWYgKEN1cnJlbnRMIDwgVGFyZ2V0TCkKKyAgICAgICAgICAgICAgICBDdXJyZW50TCA9IFRhcmdldEw7CisgICAgICAgIH0KKworICAgICAgICBpZihDdXJyZW50UiA8IFRhcmdldFIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFERDJfU0FUX0ZMT0FUKEN1cnJlbnRSLCBEZWx0YVIsIFRlbXApOworICAgICAgICAgICAgQ3VycmVudFIgPSBUZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnRSID4gVGFyZ2V0UikKKyAgICAgICAgICAgICAgICBDdXJyZW50UiA9IFRhcmdldFI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdXJyZW50UiAtPSBEZWx0YVI7CisgICAgICAgICAgICBpZiAoQ3VycmVudFIgPCBUYXJnZXRSKQorICAgICAgICAgICAgICAgIEN1cnJlbnRSID0gVGFyZ2V0UjsKKyAgICAgICAgfQorCisgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRMKSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRSKSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRMKSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRSKSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRMKSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRSKSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRMKSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRSKSk7CisgICAgfQorICAgIHBJbnN0YW5jZUwtPkN1cnJlbnQgPSBDdXJyZW50TDsKKyAgICBwSW5zdGFuY2VSLT5DdXJyZW50ID0gQ3VycmVudFI7CisKK30KKyNlbHNlCiB2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEoIExWTWl4ZXIzX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICpzcmMsCkBAIC0xNDAsNCArMjYwLDUgQEAKICAgICBwSW5zdGFuY2VSLT5DdXJyZW50PUN1cnJlbnRSOwogCiB9CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQS5jCmluZGV4IGYxYTljYTMuLmI1ZTdmNWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmMKQEAgLTI2LDcgKzI2LDg2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gTFZDb3JlX01JWFNPRlRfMVNUX0QxNkMzMV9XUkEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKKyAgICBMVk1fSU5UMTYgICBPdXRMb29wOworICAgIExWTV9JTlQxNiAgIEluTG9vcDsKKyAgICBMVk1fSU5UMzIgICBpaTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZT0oTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPlByaXZhdGVQYXJhbXMpOworICAgIExWTV9GTE9BVCAgIERlbHRhPSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+RGVsdGE7CisgICAgTFZNX0ZMT0FUICAgQ3VycmVudCA9IChMVk1fRkxPQVQpcEluc3RhbmNlLT5DdXJyZW50OworICAgIExWTV9GTE9BVCAgIFRhcmdldD0gKExWTV9GTE9BVClwSW5zdGFuY2UtPlRhcmdldDsKKyAgICBMVk1fRkxPQVQgICBUZW1wOwogCisgICAgSW5Mb29wID0gKExWTV9JTlQxNikobiA+PiAyKTsgLyogUHJvY2VzcyBwZXIgNCBzYW1wbGVzICovCisgICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKG4gLSAoSW5Mb29wIDw8IDIpKTsKKworICAgIGlmKEN1cnJlbnQ8VGFyZ2V0KXsKKyAgICAgICAgaWYgKE91dExvb3ApeworCisgICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOworICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgIFRlbXAgPSAxLjBmOworICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgIFRlbXAgPSAtMS4wZjsKKworICAgICAgICAgICAgQ3VycmVudD1UZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKXsKKworICAgICAgICAgICAgVGVtcCA9IEN1cnJlbnQgKyBEZWx0YTsKKworICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgIFRlbXAgPSAxLjBmOworICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgIFRlbXAgPSAtMS4wZjsKKworICAgICAgICAgICAgQ3VycmVudD1UZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSApOworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSApOworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSApOworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIGlmIChPdXRMb29wKXsKKyAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudDsKK30KKyNlbHNlCiB2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoIExWTWl4ZXIzX3N0ICpwdHJJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgKmRzdCwKQEAgLTEwMSw2ICsxODAsNSBAQAogICAgIH0KICAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudDsKIH0KLQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYwppbmRleCAwMDUyZGQ3Li4xOTJmMTI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYwpAQCAtMzMsNyArMzMsODAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBNSVhJTlNPRlRfRDE2QzMxX1NBVAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKQoreworICAgIGNoYXIgICAgICAgIEhhcmRNaXhpbmcgPSBUUlVFOworICAgIExWTV9GTE9BVCAgIFRhcmdldEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7CiAKKyAgICBpZihuIDw9IDApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKHBJbnN0YW5jZS0+Q3VycmVudCAhPSBwSW5zdGFuY2UtPlRhcmdldCkKKyAgICB7CisgICAgICAgIGlmKHBJbnN0YW5jZS0+RGVsdGEgPT0gMS4wZil7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2UgaWYgKEFic19GbG9hdChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCisgICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7CisgICAgICAgICAgICBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIHNyYywgZHN0LCBuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZyl7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCAhPSAwKXsgLyogTm90aGluZyB0byBkbyBpbiBjYXNlIFRhcmdldCA9IDAgKi8KKyAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5UYXJnZXQpID09IDEuMGYpeworICAgICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHNyYywgZHN0LCBuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHNyYywgKHBJbnN0YW5jZS0+VGFyZ2V0KSwgZHN0LCBuKTsKKyAgICAgICAgICAgICAgICAvKiBJbiBjYXNlIHRoZSBMVkNvcmUgZnVuY3Rpb24gd291bGQgaGF2ZSBjaGFuZ2VkIHRoZSBDdXJyZW50IHZhbHVlICovCisgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBDQUxMIEJBQ0sKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCl7CisgICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtLCBUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgIT0gMCl7CisgICAgICAgICAgICAgICAgKCpwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrKSAoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQorI2Vsc2UKIHZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3Rfc3QgKnB0ckluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKmRzdCwKQEAgLTEwOCw1ICsxODEsNSBAQAogICAgIH0KIAogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FULmMKaW5kZXggZjQ0M2M4Zi4uYmQ1YTkyNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVC5jCkBAIC0zMyw3ICszMywxMzggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIG4pCit7CisgICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTEgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMiA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uUHJpdmF0ZVBhcmFtcyk7CiAKKyAgICBpZihuIDw9IDApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKChwSW5zdGFuY2UxLT5DdXJyZW50ICE9IHBJbnN0YW5jZTEtPlRhcmdldCkgfHwgKHBJbnN0YW5jZTItPkN1cnJlbnQgIT0gcEluc3RhbmNlMi0+VGFyZ2V0KSkKKyAgICB7CisgICAgICAgIGlmKHBJbnN0YW5jZTEtPkRlbHRhID09IDEuMGYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZTEtPkN1cnJlbnQgPSBwSW5zdGFuY2UxLT5UYXJnZXQ7CisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKEFic19GbG9hdChwSW5zdGFuY2UxLT5DdXJyZW50IC0gcEluc3RhbmNlMS0+VGFyZ2V0KSA8IHBJbnN0YW5jZTEtPkRlbHRhKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdGFuY2UxLT5DdXJyZW50ID0gcEluc3RhbmNlMS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KKyAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKEhhcmRNaXhpbmcgPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYocEluc3RhbmNlMi0+RGVsdGEgPT0gMS4wZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UyLT5DdXJyZW50ID0gcEluc3RhbmNlMi0+VGFyZ2V0OworICAgICAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UyLT5UYXJnZXQ7CisgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksIFRhcmdldEdhaW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZTItPkN1cnJlbnQgLSBwSW5zdGFuY2UyLT5UYXJnZXQpIDwgcEluc3RhbmNlMi0+RGVsdGEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEluc3RhbmNlMi0+Q3VycmVudCA9IHBJbnN0YW5jZTItPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMi0+VGFyZ2V0OworICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKEhhcmRNaXhpbmcgPT0gRkFMU0UpCisgICAgICAgIHsKKyAgICAgICAgICAgICBMVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBKCAmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywgZHN0LCBuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZykKKyAgICB7CisgICAgICAgIGlmICgocEluc3RhbmNlMS0+VGFyZ2V0ID09IDEuMGYpICYmIChwSW5zdGFuY2UyLT5UYXJnZXQgPT0gMS4wZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHNyYyAhPSBkc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29weV9GbG9hdChzcmMsIGRzdCwgbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBMVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FUKCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgQ0FMTCBCQUNLCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQpCisgICAgeworICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZTEtPkN1cnJlbnQgLSBwSW5zdGFuY2UxLT5UYXJnZXQpIDwgcEluc3RhbmNlMS0+RGVsdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZTEtPkN1cnJlbnQgPSBwSW5zdGFuY2UxLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UxLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sIFRhcmdldEdhaW4pOworICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykgKCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCkKKyAgICB7CisgICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlMi0+Q3VycmVudCAtIHBJbnN0YW5jZTItPlRhcmdldCkgPCBwSW5zdGFuY2UyLT5EZWx0YSkKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3RhbmNlMi0+Q3VycmVudCA9IHBJbnN0YW5jZTItPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UyLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sIFRhcmdldEdhaW4pOworICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjayAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjaykgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorI2Vsc2UKIHZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9zdCAqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpkc3QsCkBAIC0xNDgsNSArMjc5LDUgQEAKICAgICAgICAgfQogICAgIH0KIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jCmluZGV4IGM4ZGNhZDcuLjEwMTdkZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQuYwpAQCAtMzMsNyArMzMsNzcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMVk1peGVyM19NSVhTT0ZUXzFTVF9EMTZDMzFfU0FUCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbikKK3sKKyAgICBjaGFyICAgICAgICBIYXJkTWl4aW5nID0gVFJVRTsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXRHYWluOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOwogCisgICAgaWYobiA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCisgICAgeworICAgICAgICBpZihwSW5zdGFuY2UtPkRlbHRhID09IDEuMGYpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgIH1lbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQSgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIHNyYywgZHN0LCBuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZyl7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCA9PSAwKQorICAgICAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAuMCwgZHN0LCBuKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+VGFyZ2V0KSAhPSAxLjBmKQorICAgICAgICAgICAgICAgIE11bHQzc19GbG9hdChzcmMsIChwSW5zdGFuY2UtPlRhcmdldCksIGRzdCwgbik7CisgICAgICAgICAgICBlbHNlIGlmKHNyYyAhPSBkc3QpCisgICAgICAgICAgICAgICAgQ29weV9GbG9hdChzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBDQUxMIEJBQ0sKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCl7CisgICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtLCBUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgIT0gMCl7CisgICAgICAgICAgICAgICAgKCpwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrKSAoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKyNlbHNlCiB2b2lkIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3Rfc3QgKnB0ckluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqZHN0LApAQCAtMTA3LDUgKzE3Nyw1IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0KKyNlbmRpZi8qQlVJTERfRkxPQVQqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYwppbmRleCA3MjQwNzA1Li4zYzkwMDcxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMKQEAgLTI1LDcgKzI1LDQ5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9GTE9BVCAgICAgICAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIG4pCit7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UxID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMiA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5Qcml2YXRlUGFyYW1zKTsKIAorICAgIGlmKG4gPD0gMCkgICAgcmV0dXJuOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFNPRlQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAoKHBJbnN0YW5jZTEtPkN1cnJlbnQgPT0gcEluc3RhbmNlMS0+VGFyZ2V0KSAmJiAocEluc3RhbmNlMS0+Q3VycmVudCA9PSAwKSl7CisgICAgICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyLCBkc3QsIG4pOworICAgIH0KKyAgICBlbHNlIGlmICgocEluc3RhbmNlMi0+Q3VycmVudCA9PSBwSW5zdGFuY2UyLT5UYXJnZXQpICYmIChwSW5zdGFuY2UyLT5DdXJyZW50ID09IDApKXsKKyAgICAgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIGRzdCwgbik7CisgICAgfQorICAgIGVsc2UgaWYgKChwSW5zdGFuY2UxLT5DdXJyZW50ICE9IHBJbnN0YW5jZTEtPlRhcmdldCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0YW5jZTItPkN1cnJlbnQgIT0gcEluc3RhbmNlMi0+VGFyZ2V0KSkKKyAgICB7CisgICAgICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIGRzdCwgbik7CisgICAgICAgIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICopKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzIsIGRzdCwgbik7CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgSEFSRCBNSVhJTkcKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCggJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSwgc3JjMiwgZHN0LCBuKTsKKyAgICB9Cit9CisjZWxzZQogdm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X3N0ICpwdHJJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0lOVDE2ICAgICAgICpzcmMxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgKnNyYzIsCkBAIC02Niw1ICsxMDgsNSBAQAogICAgICAgICAgICAgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCggJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSwgJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwgc3JjMSwgc3JjMiwgZHN0LCBuKTsKICAgICB9CiB9Ci0KKyNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXIuaAppbmRleCA5ODBjNzgzLi5mOTA0OTE1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXIuaApAQCAtMzEsNiArMzEsMTkgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBMVk1peGVyM19zdCBzdHJ1Y3R1cmUgc3RvcmVzIEluc3RhbmNlIHBhcmFtZXRlcnMgZm9yIG9uZSBhdWRpbyBzdHJlYW0gKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgICAgICAgUHJpdmF0ZVBhcmFtc1szXTsgICAvKiBQcml2YXRlIEluc3RhbmNlIHBhcmFtcyBmb3IgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvIFN0cmVhbSBzaGlmdCBwYXJhbWV0ZXIgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgQ2FsbGJhY2tTZXQ7ICAgICAgICAvKiBCb29sZWFuLiAgU2hvdWxkIGJlIHNldCBieSBjYWxsaW5nIGFwcGxpY2F0aW9uIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoIHRpbWUgdGhlIHRhcmdldCB2YWx1ZSBpcyB1cGRhdGVkICovCisgICAgTFZNX0lOVDE2ICAgICAgIENhbGxiYWNrUGFyYW07ICAgICAgLyogUGFyYW1ldGVyIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBjYWxiYWNrIGZ1bmN0aW9uICovCisgICAgdm9pZCAgICAgICAgICAgICpwQ2FsbGJhY2tIYW5kbGU7ICAgLyogUG9pbnRlciB0byB0aGUgaW5zdGFuY2Ugb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCisgICAgdm9pZCAgICAgICAgICAgICpwR2VuZXJhbFB1cnBvc2U7ICAgLyogUG9pbnRlciBmb3IgZ2VuZXJhbCBwdXJwb3NlIHVzYWdlICovCisgICAgTFZNX0NhbGxiYWNrICAgIHBDYWxsQmFjazsgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KK30gTFZNaXhlcjNfRkxPQVRfc3Q7CisjZWxzZQogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1fSU5UMzIgICAgICAgUHJpdmF0ZVBhcmFtc1s0XTsgICAvKiBQcml2YXRlIEluc3RhbmNlIHBhcmFtcyBmb3IgQXVkaW8gU3RyZWFtICovCkBAIC00MCwyMiArNTMsMzUgQEAKICAgICB2b2lkICAgICAgICAgICAgKnBHZW5lcmFsUHVycG9zZTsgICAvKiBQb2ludGVyIGZvciBnZW5lcmFsIHB1cnBvc2UgdXNhZ2UgKi8KICAgICBMVk1fQ2FsbGJhY2sgICAgcENhbGxCYWNrOyAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAqLwogfSBMVk1peGVyM19zdDsKLQorI2VuZGlmCisjaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNaXhlcjNfRkxPQVRfc3QgICAgIE1peGVyU3RyZWFtWzFdOyAgICAvKiBJbnN0YW5jZSBQYXJhbXMgZm9yIG9uZSBBdWRpbyBTdHJlYW0gKi8KK30gTFZNaXhlcjNfMVN0X0ZMT0FUX3N0OworI2Vsc2UKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNaXhlcjNfc3QgICAgIE1peGVyU3RyZWFtWzFdOyAgICAvKiBJbnN0YW5jZSBQYXJhbXMgZm9yIG9uZSBBdWRpbyBTdHJlYW0gKi8KIH0gTFZNaXhlcjNfMVN0X3N0OwotCisjZW5kaWYKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgTWl4ZXJTdHJlYW1bMl07ICAgIC8qIEluc3RhbmNlIFBhcmFtcyBmb3IgdHdvIEF1ZGlvIFN0cmVhbXMgKi8KK30gTFZNaXhlcjNfMlN0X0ZMT0FUX3N0OworI2Vsc2UKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNaXhlcjNfc3QgICAgIE1peGVyU3RyZWFtWzJdOyAgICAvKiBJbnN0YW5jZSBQYXJhbXMgZm9yIHR3byBBdWRpbyBTdHJlYW1zICovCiB9IExWTWl4ZXIzXzJTdF9zdDsKLQorI2VuZGlmCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTWl4ZXIzX3N0ICAgICBNaXhlclN0cmVhbVszXTsgICAgLyogSW5zdGFuY2UgUGFyYW1zIGZvciB0aHJlZSBBdWRpbyBTdHJlYW1zICovCiB9IExWTWl4ZXIzXzNTdF9zdDsKLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gUFJPVE9UWVBFUyAoSElHSCBMRVZFTCBGVU5DVElPTlMpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTc1LDU3ICsxMDEsMTE1IEBACiAvKiB0aGVuIHRoZSBjYWxjdWxhdGlvbiB3aWxsIGdpdmUgYW4gaW5jb3JyZWN0IHZhbHVlIGZvciBhbHBoYSwgc2VlIHRoZSBtaXhlciAgICAgKi8KIC8qIGRvY3VtZW50YXRpb24gZm9yIGZ1cnRoZXIgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peGVyX1NldFRhcmdldCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgVGFyZ2V0R2Fpbik7CisjZWxzZQogdm9pZCBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCBMVk1peGVyM19zdCAqcFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUYXJnZXRHYWluKTsKLQorI2VuZGlmCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9GTE9BVCBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCBMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSk7CisjZWxzZQogTFZNX0lOVDMyIExWQ19NaXhlcl9HZXRUYXJnZXQoIExWTWl4ZXIzX3N0ICpwU3RyZWFtKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9GTE9BVCBMVkNfTWl4ZXJfR2V0Q3VycmVudCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0pOworI2Vsc2UKIExWTV9JTlQzMiBMVkNfTWl4ZXJfR2V0Q3VycmVudCggTFZNaXhlcjNfc3QgKnBTdHJlYW0pOworI2VuZGlmCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfTWl4ZXJfSW5pdCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgIFRhcmdldEdhaW4sCisgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgIEN1cnJlbnRHYWluKTsKKyNlbHNlCiB2b2lkIExWQ19NaXhlcl9Jbml0KCBMVk1peGVyM19zdCAqcFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUYXJnZXRHYWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIEN1cnJlbnRHYWluKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGNfbWlsbGlzZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMpOworI2Vsc2UKIHZvaWQgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCggTFZNaXhlcjNfc3QgKnBTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGNfbWlsbGlzZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgRnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMpOworI2VuZGlmCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCBMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUY19taWxsaXNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscyk7CisjZWxzZQogdm9pZCBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCBMVk1peGVyM19zdCAqcFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRjX21pbGxpc2VjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgRnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscyk7CisjZW5kaWYKIAogLyoqKiAxNiBiaXQgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIG4pOworI2Vsc2UKIHZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9zdCAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBuKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgbik7CisjZWxzZQogdm9pZCBMVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9zdCAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBuKTsKKyNlbmRpZgogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpkc3QsICAvKiBkc3QgY2Fubm90IGJlIGVxdWFsIHRvIHNyYzIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKTsKKyNlbHNlCiB2b2lkIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3Rfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKnNyYzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqZHN0LCAgLyogZHN0IGNhbm5vdCBiZSBlcXVhbCB0byBzcmMyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKTsKLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEZvciBhcHBseWluZyBkaWZmZXJlbnQgZ2FpbnMgdG8gTGVmdCBhbmQgcmlnaHQgY2hlbm5hbHMgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogTWl4ZXJTdHJlYW1bMF0gYXBwbGllcyB0byBMZWZ0IGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBNaXhlclN0cmVhbVsxXSBhcHBsaWVzIHRvIFJpZ2h0IGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEdhaW4gdmFsdWVzIHNob3VsZCBub3QgYmUgbW9yZSB0aGF0IDEuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9GTE9BVCAgICAgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKmRzdCwgICAvKiBkc3QgY2FuIGJlIGVxdWFsIHRvIHNyYyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBuKTsgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLworI2Vsc2UKIHZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9zdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0lOVDE2ICAgICAgICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgKmRzdCwgICAvKiBkc3QgY2FuIGJlIGVxdWFsIHRvIHNyYyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgbik7ICAgICAvKiBOdW1iZXIgb2Ygc3RlcmVvIHNhbXBsZXMgKi8KLQotCisjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0Q3VycmVudC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldEN1cnJlbnQuYwppbmRleCBiNWFlMjY0Li41OTkwNDEyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0Q3VycmVudC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRDdXJyZW50LmMKQEAgLTMxLDcgKzMxLDE1IEBACiAvKiAgQ3VycmVudEdhaW4gICAgICAtIEN1cnJlbnRHYWluIHZhbHVlIGluIFEgMTYuMTUgZm9ybWF0ICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX0ZMT0FUIExWQ19NaXhlcl9HZXRDdXJyZW50KCBMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSkKK3sKKyAgICBMVk1fRkxPQVQgICAgICAgQ3VycmVudEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOworICAgIEN1cnJlbnRHYWluID0gcEluc3RhbmNlLT5DdXJyZW50OyAgLy8gQ3VycmVudEdhaW4KKyAgICByZXR1cm4gQ3VycmVudEdhaW47Cit9CisjZWxzZQogTFZNX0lOVDMyIExWQ19NaXhlcl9HZXRDdXJyZW50KCBMVk1peGVyM19zdCAqcFN0cmVhbSkKIHsKICAgICBMVk1fSU5UMzIgICAgICAgQ3VycmVudEdhaW47CkBAIC0zOSwzICs0Nyw0IEBACiAgICAgQ3VycmVudEdhaW49cEluc3RhbmNlLT5DdXJyZW50Pj4oMTYtcEluc3RhbmNlLT5TaGlmdCk7ICAvLyBDdXJyZW50R2FpbiBpbiBRMTYuMTUgZm9ybWF0CiAgICAgcmV0dXJuIEN1cnJlbnRHYWluOwogfQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0VGFyZ2V0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0VGFyZ2V0LmMKaW5kZXggZGMyZjhlOS4uYzY3NDU1YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRUYXJnZXQuYwpAQCAtMzAsNyArMzAsMTYgQEAKIC8qICBUYXJnZXRHYWluICAgICAgLSBUYXJnZXRHYWluIHZhbHVlIGluIFEgMTYuMTUgZm9ybWF0ICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitMVk1fRkxPQVQgTFZDX01peGVyX0dldFRhcmdldCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0pCit7CisgICAgTFZNX0ZMT0FUICAgICAgIFRhcmdldEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOworICAgIAorICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsgIC8vIFRhcmdldEdhaW4KKyAgICByZXR1cm4gVGFyZ2V0R2FpbjsKK30KKyNlbHNlCiBMVk1fSU5UMzIgTFZDX01peGVyX0dldFRhcmdldCggTFZNaXhlcjNfc3QgKnBTdHJlYW0pCiB7CiAgICAgTFZNX0lOVDMyICAgICAgIFRhcmdldEdhaW47CkBAIC00MCwzICs0OSw0IEBACiAKICAgICByZXR1cm4gVGFyZ2V0R2FpbjsKIH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Jbml0LmMKaW5kZXggNDQ5ZTdiMS4uNzM3ZTI2YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfSW5pdC5jCkBAIC00NCw3ICs0NCwxOSBAQAogLyogIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX01peGVyX0luaXQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICBUYXJnZXRHYWluLAorICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICBDdXJyZW50R2FpbikKK3sKKyAgICBMVk1fRkxPQVQgTWF4R2FpbiA9IFRhcmdldEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CisgICAgaWYoQ3VycmVudEdhaW4gPiBNYXhHYWluKQorICAgICAgICBNYXhHYWluID0gQ3VycmVudEdhaW47CisgICAgcEluc3RhbmNlLT5UYXJnZXQgPSBUYXJnZXRHYWluOyAgIC8vIFVwZGF0ZSBmcmFjdGlvbmFsIGdhaW4gVGFyZ2V0CisgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gQ3VycmVudEdhaW47IC8vIFVwZGF0ZSBmcmFjdGlvbmFsIGdhaW4gQ3VycmVudAorfQorI2Vsc2UKIHZvaWQgTFZDX01peGVyX0luaXQoIExWTWl4ZXIzX3N0ICpwU3RyZWFtLAogICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRhcmdldEdhaW4sCiAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgQ3VycmVudEdhaW4pCkBAIC02NCw0ICs3Niw0IEBACiAgICAgcEluc3RhbmNlLT5DdXJyZW50PUN1cnJlbnRHYWluPDwoMTYtU2hpZnQpOyAvLyBVcGRhdGUgZnJhY3Rpb25hbCBnYWluIEN1cnJlbnQKICAgICBwSW5zdGFuY2UtPlNoaWZ0PVNoaWZ0OyAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBTaGlmdAogfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oCmluZGV4IDI5NGUwNWMuLmQwZDBlMWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ByaXZhdGUuaApAQCAtMjYsNiArMjYsMTUgQEAKICNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCiAKIC8qIEluc3RhbmNlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBHZW5lcmFsICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXQ7ICAgICAgICAgICAvKm51bWJlciBzcGVjaWZ5aW5nIHZhbHVlIG9mIFRhcmdldCBHYWluICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50OyAgICAgICAgICAvKm51bWJlciBzcGVjaWZ5aW5nIHZhbHVlIG9mIEN1cnJlbnQgR2FpbiAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgRGVsdGE7ICAgICAgICAgICAgLypudW1iZXIgc3BlY2lmeWluZyB2YWx1ZSBvZiBEZWx0YSBHYWluICovCit9IE1peF9Qcml2YXRlX0ZMT0FUX3N0OworI2Vsc2UKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgLyogR2VuZXJhbCAqLwpAQCAtMzQsOCArNDMsNyBAQAogICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgICAgU2hpZnQ7ICAgICAgICAgICAgICAgICAgLyogTGVmdCBTaGlmdCBmb3IgSW50ZWdlciBwYXJ0IG9mIEdhaW4gKi8KICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIERlbHRhOyAgICAgICAgICAgICAgICAgIC8qIDMyIGJpdCBudW1iZXIgc3BlY2lmeWluZyB0aGUgZnJhY3Rpb25hbCB2YWx1ZSBvZiBEZWx0YSBHYWluICovCiB9IE1peF9Qcml2YXRlX3N0OwotCi0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgREVGSU5JVElPTlMKQEAgLTQ5LDIzICs1Nyw0MyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKiogMTYgYml0IGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7Ci0KKyNlbmRpZgorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKCBMVk1peGVyM19zdCAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKLQorI2VuZGlmCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfRkxPQVRfc3QgKnBJbnN0YW5jZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAgKnBJbnN0YW5jZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKyNlbHNlCiB2b2lkIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX3N0ICpwSW5zdGFuY2UxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfc3QgICAgICAgICAqcEluc3RhbmNlMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEZvciBhcHBseWluZyBkaWZmZXJlbnQgZ2FpbnMgdG8gTGVmdCBhbmQgcmlnaHQgY2hlbm5hbHMgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNzMsMTIgKzEwMSwxOSBAQAogLyogcHRySW5zdGFuY2UyIGFwcGxpZXMgdG8gUmlnaHQgY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBHYWluIHZhbHVlcyBzaG91bGQgbm90IGJlIG1vcmUgdGhhdCAxLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQSggTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICBuKTsKKyNlbHNlCiB2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEoIExWTWl4ZXIzX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAqZHN0LCAgIC8qIGRzdCBjYW4gYmUgZXF1YWwgdG8gc3JjICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICBuKTsgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRm9yIGFwcGx5aW5nIGRpZmZlcmVudCBnYWlucyB0byBMZWZ0IGFuZCByaWdodCBjaGVubmFscyAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC04NiwxNiArMTIxLDIyIEBACiAvKiBwdHJJbnN0YW5jZTIgYXBwbGllcyB0byBSaWdodCBjaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEdhaW4gdmFsdWVzIHNob3VsZCBub3QgYmUgbW9yZSB0aGF0IDEuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVCggTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICBuKTsKKyNlbHNlCiB2b2lkIExWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAqZHN0LCAgICAvKiBkc3QgY2FuIGJlIGVxdWFsIHRvIHNyYyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgbik7ICAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCi0KLQorI2VuZGlmCiAKIC8qKiogMzIgYml0IGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIExWQ19Db3JlX01peEluU29mdF9EMzJDMzFfU0FUKCBMVk1peGVyM19zdCAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LApAQCAtMTEyLDcgKzE1Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2VuZGlmIC8vI2lmbmRlZiBfX0xWQ19NSVhFUl9QUklWQVRFX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRhcmdldC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRhcmdldC5jCmluZGV4IDVlZmE1MDEuLjU3NzE3OWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUYXJnZXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGFyZ2V0LmMKQEAgLTQzLDcgKzQzLDE0IEBACiAvKiAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfTWl4ZXJfU2V0VGFyZ2V0KExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgIFRhcmdldEdhaW4pCit7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CisgICAgcEluc3RhbmNlLT5UYXJnZXQgPSBUYXJnZXRHYWluOyAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBnYWluIFRhcmdldAorfQorI2Vsc2UKIHZvaWQgTFZDX01peGVyX1NldFRhcmdldChMVk1peGVyM19zdCAqcFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGFyZ2V0R2FpbikKIHsKQEAgLTY0LDMgKzcxLDQgQEAKICAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudEdhaW48PCgxNi1TaGlmdCk7ICAgICAgICAgICAgIC8vIFVwZGF0ZSBmcmFjdGlvbmFsIGdhaW4gQ3VycmVudAogICAgIHBJbnN0YW5jZS0+U2hpZnQ9U2hpZnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIFNoaWZ0CiB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQuYwppbmRleCA0YzFjOGIyLi40OGY1ZDU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRpbWVDb25zdGFudC5jCkBAIC00NCw3ICs0NCw1MSBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUY19taWxsaXNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMpCit7CisjaWZkZWYgSElHSEVSX0ZTCisgICAgTFZNX0ZMT0FUICAgRGVsdGFUYWJsZVsxMV0gPSB7MC41MDAwMDBmLC8qODAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNjI4MTJmLC8qMTEwMjUqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzMzMzMzZiwvKjEyMDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1MDAwMGYsLyoxNjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xODE0MDZmLC8qMjIwNTAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTY2NjY2ZiwvKjI0MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyNTAwMGYsLyozMjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wOTA3MDNmLC8qNDQxMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDgzMzMzZiwvKjQ4MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA0MTY2N2YsLyo5NjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMjA4MzNmfTsvKjE5MjAwMCovCisjZWxzZQorICAgIExWTV9GTE9BVCAgIERlbHRhVGFibGVbOV0gPSB7MC41MDAwMDBmLC8qODAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM2MjgxMmYsLyoxMTAyNSovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjMzMzMzM2YsLyoxMjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1MDAwMGYsLyoxNjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE4MTQwNmYsLyoyMjA1MCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE2NjY2NmYsLyoyNDAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyNTAwMGYsLyozMjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA5MDcwM2YsLyo0NDEwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4MzMzM2Z9Oy8qNDgwMDAqLworI2VuZGlmCiAKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKKyAgICBMVk1fRkxPQVQgRGVsdGEgPSBEZWx0YVRhYmxlW0ZzXTsKKyAgICBEZWx0YSA9IERlbHRhIC8gKE51bUNoYW5uZWxzKTsKKworICAgIGlmKFRjX21pbGxpc2VjID09IDApCisgICAgICAgIERlbHRhID0gMS4wMDAwMDBmOworICAgIGVsc2UKKyAgICAgICAgRGVsdGEgPSBEZWx0YSAvIFRjX21pbGxpc2VjOworCisgICAgaWYoRGVsdGEgPT0gMCkKKyAgICAgICAgRGVsdGEgPSAwLjAwMDAwMDAwMDVmOyAgLyogSWYgVGltZSBDb25zdGFudCBpcyBzbyBsYXJnZSB0aGF0IERlbHRhIGlzIDAsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ24gbWluaW11bSB2YWx1ZSB0byBEZWx0YSAqLworICAgIHBJbnN0YW5jZS0+RGVsdGEgPSBEZWx0YTsgIC8vIERlbHRhPSgyMTQ3NDgzNjQ3KjQqMTAwMCkvKE51bUNoYW5uZWxzKlNhbXBsZVJhdGUqVGNfbWlsbGlzZWMpCit9CisjZWxzZQogdm9pZCBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KExWTWl4ZXIzX3N0ICpwU3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGNfbWlsbGlzZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICBGcywKQEAgLTczLDMgKzExNyw0IEBACiAKICAgICBwSW5zdGFuY2UtPkRlbHRhPURlbHRhOyAgICAgLy8gRGVsdGE9KDIxNDc0ODM2NDcqNCoxMDAwKS8oTnVtQ2hhbm5lbHMqU2FtcGxlUmF0ZSpUY19taWxsaXNlYykgaW4gUSAwLjMxIGZvcm1hdAogfQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmMKaW5kZXggOGQ1MzA0ZS4uOWRjN2QyMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQuYwpAQCAtNDUsNyArNDUsNzIgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCBMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUY19taWxsaXNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscykKK3sKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgTFZNX0ZMT0FUICAgRGVsdGFUYWJsZVsxMV0gPSB7MC41MDAwMDBmLC8qODAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzYyODEyZiwvKjExMDI1Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMzMzMzNmLC8qMTIwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1MDAwMGYsLyoxNjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTgxNDA2ZiwvKjIyMDUwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xNjY2NjZmLC8qMjQwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyNTAwMGYsLyozMjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDkwNzAzZiwvKjQ0MTAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wODMzMzNmLC8qNDgwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA0MTY2NmYsLyo5NjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDIwODMzZn07LyoxOTIwMDAqLworI2Vsc2UKKyAgICBMVk1fRkxPQVQgICBEZWx0YVRhYmxlWzldID0gezAuNTAwMDAwZiwvKjgwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNjI4MTJmLC8qMTEwMjUqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMzMzMzNmLC8qMTIwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTAwMDBmLC8qMTYwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xODE0MDZmLC8qMjIwNTAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xNjY2NjZmLC8qMjQwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjUwMDBmLC8qMzIwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wOTA3MDNmLC8qNDQxMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wODMzMzNmfTsvKjQ4MDAwKi8KKyNlbmRpZgorICAgIExWTV9GTE9BVCBUY19taWxsaXNlY19mbG9hdDsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKKyAgICBMVk1fRkxPQVQgRGVsdGEgPSBEZWx0YVRhYmxlW0ZzXTsKIAorICAgIExWTV9GTE9BVCAgIEN1cnJlbnQ7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0OworCisgICAgRGVsdGE9RGVsdGEgLyAoTnVtQ2hhbm5lbHMpOworCisgICAgLyogIEdldCBnYWluIHZhbHVlcyAgKi8KKyAgICBDdXJyZW50ID0gcEluc3RhbmNlLT5DdXJyZW50OworICAgIFRhcmdldCA9IHBJbnN0YW5jZS0+VGFyZ2V0OworCisgICAgaWYgKEN1cnJlbnQgIT0gVGFyZ2V0KQorICAgIHsKKyAgICAgICAgVGNfbWlsbGlzZWNfZmxvYXQgPSAoTFZNX0ZMT0FUKShUY19taWxsaXNlYykgLyAoQ3VycmVudCAtIFRhcmdldCk7CisgICAgICAgIGlmIChUY19taWxsaXNlY19mbG9hdCA8IDApCisgICAgICAgICAgICBUY19taWxsaXNlY19mbG9hdCA9IC1UY19taWxsaXNlY19mbG9hdDsKKworICAgICAgICBpZihUY19taWxsaXNlYyA9PSAwKQorICAgICAgICAgICAgRGVsdGEgPSAxLjAwMDAwMGY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIERlbHRhID0gRGVsdGEgLyBUY19taWxsaXNlY19mbG9hdDsKKworICAgICAgICBpZihEZWx0YSA9PSAwKQorICAgICAgICAgICAgRGVsdGEgPSAwLjAwMDAwMDAwMDVmOyAvKiBJZiBUaW1lIENvbnN0YW50IGlzIHNvIGxhcmdlIHRoYXQgRGVsdGEgaXMgMCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ24gbWluaW11bSB2YWx1ZSB0byBEZWx0YSAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBEZWx0YSA9IDAuMDAwMDAwMDAwNWY7ICAvKiBNaW5pbXVtIHZhbHVlIGZvciBwcm9wZXIgY2FsbC1iYWNrcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXR0aW5nIGl0IHRvIHplcm8gaGFzIHNvbWUgcHJvYmxlbXMsIHRvIGJlIGNvcnJlY3RlZCkgKi8KKyAgICB9CisKKyAgICBwSW5zdGFuY2UtPkRlbHRhID0gRGVsdGE7ICAgICAvLyBEZWx0YT0oMjE0NzQ4MzY0Nyo0KjEwMDApLyhOdW1DaGFubmVscypTYW1wbGVSYXRlKlRjX21pbGxpc2VjKQorfQorI2Vsc2UKIHZvaWQgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCggTFZNaXhlcjNfc3QgKnBTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUY19taWxsaXNlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgIEZzLApAQCAtOTMsMyArMTU4LDQgQEAKIAogICAgIHBJbnN0YW5jZS0+RGVsdGE9RGVsdGE7ICAgICAvLyBEZWx0YT0oMjE0NzQ4MzY0Nyo0KjEwMDApLyhOdW1DaGFubmVscypTYW1wbGVSYXRlKlRjX21pbGxpc2VjKSBpbiBRIDAuMzEgZm9ybWF0CiB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19IUEYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19IUEYuYwppbmRleCA2ZDhmZTQ2Li45MDk0NjIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fSFBGLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0ZPX0hQRi5jCkBAIC01Myw3ICs1Myw3IEBACiAvKiAgIEE5ICAgICAgICAgICAgIDE5NDY2OTU3NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBBMTAgICAgICAgICAgICA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgWSA9IChBMCArIEExKlggKyBBMipYMiArIEEzKlgzICsghS4uICsgQU4qeE4pIDw8IEFOKzEgICAgICAgICAgICAgICAgICAqLworLyogIFkgPSAoQTAgKyBBMSpYICsgQTIqWDIgKyBBMypYMyArIO+/vS4uICsgQU4qeE4pIDw8IEFOKzEgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjgsNyArNjgsMzYgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX0ZMT0FUIExWTV9GT19IUEYoICAgTFZNX0ZMT0FUICAgICAgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAqcENvZWZmcykKK3sKKyAgICBMVk1fRkxPQVQgWSxDb2VmZmljaWVudHNbMTNdID0gey0wLjk5OTk5NmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTgwMWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC40OTc4MjRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMjI5MzdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTgwODgwZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDg3NjU4ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAzMjEwMmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwODE2M2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDEyNTJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwODlmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwfTsKKyAgICBZPUxWTV9Qb2x5bm9taWFsKChMVk1fVUlOVDE2KTksIENvZWZmaWNpZW50cywgdyk7CiAKKyAgICBwQ29lZmZzLT5CMSA9IC1ZOyAgICAgICAgIC8qIFN0b3JlIC1CMSBpbiBmaWx0ZXIgc3RydWN0dXJlIGluc3RlYWQgb2YgQjEhKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBMD0oMS1CMSkvMj0gQjEvMiAtIDAuNSovCisgICAgWSA9IFkgLyAyLjBmOyAgICAgICAgICAgICAgICAgLyogQTA9WT1CMS8yKi8KKyAgICBZID0gWSAtIDAuNWY7ICAgICAgICAgLyogQTA9WT0oQjEvMiAtIDAuNSkqLworCisgICAgcENvZWZmcy0+QTAgPSBZICogRklMVEVSX0xPU1NfRkxPQVQ7ICAgICAgICAgICAgICAgICAgLyogQXBwbHkgbG9zcyB0byBhdm9pZCBvdmVyZmxvdyovCisgICAgcENvZWZmcy0+QTEgPSAtcENvZWZmcy0+QTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RvcmUgQTE9LUEwKi8KKworICAgIHJldHVybiAxOworfQorI2Vsc2UKIExWTV9JTlQzMiBMVk1fRk9fSFBGKCAgIExWTV9JTlQzMiAgICAgICB3LAogICAgICAgICAgICAgICAgICAgICAgICAgRk9fQzMyX0NvZWZzX3QgICpwQ29lZmZzKQogewpAQCAtOTcsNCArMTI2LDQgQEAKIAogICAgIHJldHVybiAxOwogfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19MUEYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19MUEYuYwppbmRleCA4NmVjOTUxLi45ZmU2N2Y4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fTFBGLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0ZPX0xQRi5jCkBAIC01Myw3ICs1Myw3IEBACiAvKiAgIEE5ICAgICAgICAgICAgIDE5NDY2OTU3NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBBMTAgICAgICAgICAgICA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgWSA9IChBMCArIEExKlggKyBBMipYMiArIEEzKlgzICsghS4uICsgQU4qeE4pIDw8IEFOKzEgICAgICAgICAgICAgICAgICAqLworLyogIFkgPSAoQTAgKyBBMSpYICsgQTIqWDIgKyBBMypYMyArIO+/vS4uICsgQU4qeE4pIDw8IEFOKzEgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjgsNyArNjgsMzMgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX0ZMT0FUIExWTV9GT19MUEYoICAgTFZNX0ZMT0FUICAgICAgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAqcENvZWZmcykKK3sKKyAgICBMVk1fRkxPQVQgWSxDb2VmZmljaWVudHNbMTNdID0gey0wLjk5OTk5NmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTgwMWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC40OTc4MjRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMjI5MzdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTgwODgwZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDg3NjU4ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAzMjEwMmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwODE2M2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDEyNTJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwODlmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMH07CisgICAgWT1MVk1fUG9seW5vbWlhbCgoTFZNX1VJTlQxNik5LCBDb2VmZmljaWVudHMsIHcpOworICAgIHBDb2VmZnMtPkIxID0gLVk7ICAgICAvLyBTdG9yZSAtQjEgaW4gZmlsdGVyIHN0cnVjdHVyZSBpbnN0ZWFkIG9mIEIxIQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gQTA9KDErQjEpLzI9IEIxLzIgKyAwLjUKKyAgICBZID0gWSAvIDIuMGY7ICAgICAgICAgICAgIC8vIEEwPVk9QjEvMgorICAgIFkgPSBZICsgMC41ZjsgICAgIC8vIEEwPVk9KEIxLzIgKyAwLjUpCiAKKyAgICBwQ29lZmZzLT5BMCA9IFkgKiBGSUxURVJfTE9TU19GTE9BVDsKKyAgICBwQ29lZmZzLT5BMSA9IHBDb2VmZnMtPkEwOworCisgICAgcmV0dXJuIDE7Cit9CisjZWxzZQogTFZNX0lOVDMyIExWTV9GT19MUEYoICAgTFZNX0lOVDMyICAgICAgIHcsCiAgICAgICAgICAgICAgICAgICAgICAgICBGT19DMzJfQ29lZnNfdCAgKnBDb2VmZnMpCiB7CkBAIC05NCw0ICsxMjAsNCBAQAogICAgIHBDb2VmZnMtPkExPXBDb2VmZnMtPkEwOwogICAgIHJldHVybiAxOwogfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0dldE9tZWdhLmMKaW5kZXggZjNiOWIzYy4uNzg0NmNhMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0dldE9tZWdhLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0dldE9tZWdhLmMKQEAgLTMyLDE2ICszMiw0NSBAQAogI2RlZmluZSBMVlZETF8yUGlCeUZzX1NISUZUMSAgICAxMiAgICAgICAgICAvKiBRZm9ybWF0IHNoaWZ0IGZvciA4a0h6LCAxMS4wMjVrSHogYW5kIDEya0h6IGkuZS4gMTI9NDEtMjkgKi8KICNkZWZpbmUgTFZWRExfMlBpQnlGc19TSElGVDIgICAgMTMgICAgICAgICAgLyogUWZvcm1hdCBzaGlmdCBmb3IgMTZrSHosIDIyLjA1MGtIeiBhbmQgMjRrSHogaS5lLiAxMz00Mi0yOSAqLwogI2RlZmluZSBMVlZETF8yUGlCeUZzX1NISUZUMyAgICAxNCAgICAgICAgICAvKiBRZm9ybWF0IHNoaWZ0IGZvciAzMmtIeiwgNDQuMWtIeiBhbmQgNDhrSHogaS5lLiAxND00My0yOSAqLwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBjb25zdCBMVk1fSU5UMzIgICAgIExWVkRMXzJQaU9uRnNUYWJsZVtdID0gIHtMVlZETF8yUGlCeV84MDAwICwgLyogOGtIeiBpbiBRNDEsIDE2a0h6IGluIFE0MiwgMzJrSHogaW4gUTQzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzExMDI1LCAgLyogMTEwMjUgSHogaW4gUTQxLCAyMjA1MEh6IGluIFE0MiwgNDQxMDAgSHogaW4gUTQzKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfMTIwMDB9OyAvKiAxMmtIeiBpbiBRNDEsIDI0a0h6IGluIFE0MiwgNDhrSHogaW4gUTQzICovCi0KKyNlbmRpZgogCiBjb25zdCBMVk1fSU5UMzIgICAgIExWVkRMXzJQaU9uRnNTaGlmdFRhYmxlW109e0xWVkRMXzJQaUJ5RnNfU0hJRlQxICwgICAgICAgICAvKiA4a0h6LCAxMTAyNUh6LCAxMmtIeiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeUZzX1NISUZUMiwgICAgICAgICAgLyogMTZrSHosIDIyMDUwSHosIDI0a0h6Ki8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlGc19TSElGVDN9OyAgICAgICAgIC8qIDMya0h6LCA0NDEwMEh6LCA0OGtIeiAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisjZGVmaW5lIExWVkRMXzJQaUJ5XzgwMDBfZiAgICAgICAgMC4wMDA3ODUzOThmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzExMDI1X2YgICAgICAgMC4wMDA1Njk5MDNmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzEyMDAwX2YgICAgICAgMC4wMDA1MjM1OTlmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzE2MDAwX2YgICAgICAgMC4wMDAzOTI3MDBmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzIyMDUwX2YgICAgICAgMC4wMDAyODQ5NTJmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzI0MDAwX2YgICAgICAgMC4wMDAyNjE4MDBmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzMyMDAwX2YgICAgICAgMC4wMDAxOTYzNTBmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzQ0MTAwX2YgICAgICAgMC4wMDAxNDI0NzZmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzQ4MDAwX2YgICAgICAgMC4wMDAxMzA5MDBmCiAKKyNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgTFZWRExfMlBpQnlfOTYwMDBfZiAgICAgICAwLjAwMDA2NTQ1MGYKKyNkZWZpbmUgTFZWRExfMlBpQnlfMTkyMDAwX2YgICAgICAwLjAwMDAzMjcyNWYKKyNlbmRpZgorY29uc3QgTFZNX0ZMT0FUICAgICBMVlZETF8yUGlPbkZzVGFibGVbXSA9ICB7TFZWRExfMlBpQnlfODAwMF9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfMTEwMjVfZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzEyMDAwX2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV8xNjAwMF9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfMjIwNTBfZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzI0MDAwX2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV8zMjAwMF9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfNDQxMDBfZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzQ4MDAwX2YKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWVkRMXzJQaUJ5Xzk2MDAwX2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWVkRMXzJQaUJ5XzE5MjAwMF9mCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgTFZNX0dldE9tZWdhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01OSw3ICs4OCwyMCBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdz0yKnBpKkZjL0ZzIGluIFEyLjI5IGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCisjaWZkZWYgQlVJTERfRkxPQVQKKyNpZmRlZiBISUdIRVJfRlMKK0xWTV9GTE9BVCBMVk1fR2V0T21lZ2EoTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIEZjLAorICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICAgICAgRnMpCisjZWxzZQorTFZNX0ZMT0FUIExWTV9HZXRPbWVnYShMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgRmMsCisgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgICAgICAgICBGcykKKyNlbmRpZgoreworICAgIExWTV9GTE9BVCAgIHc7CisgICAgdyA9IChMVk1fRkxPQVQpRmMgKiBMVlZETF8yUGlPbkZzVGFibGVbRnNdOworICAgIHJldHVybiB3OworfQorI2Vsc2UKIExWTV9JTlQzMiBMVk1fR2V0T21lZ2EoTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIEZjLAogICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICAgICAgRnMpCiB7CkBAIC02Nyw0ICsxMDksNCBAQAogICAgIE1VTDMyeDMySU5UTzMyKChMVk1fSU5UMzIpRmMsTFZWRExfMlBpT25Gc1RhYmxlW0ZzJTNdLHcsTFZWRExfMlBpT25Gc1NoaWZ0VGFibGVbRnMvM10pCiAgICAgcmV0dXJuIHc7CiB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX0ZpbHRlckNvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX0ZpbHRlckNvZWZmcy5oCmluZGV4IDY4NDZkNDkuLmYxZTQ1ZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9GaWx0ZXJDb2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fTWl4ZXJfRmlsdGVyQ29lZmZzLmgKQEAgLTg3LDUgKzg3LDU4IEBACiAjZGVmaW5lIEFMUEhBXzQ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjAwMDAwMCAqLwogI2RlZmluZSBBTFBIQV81MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMDAwMDAgKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUIC8qIEJVSUxEX0ZMT0FUICovCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk5OWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMSAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTk4ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5OTdmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzMgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk5NmYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNCAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTk1ZgorI2RlZmluZSBBTFBIQV9GbG9hdF81ICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5OTJmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzYgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk4OWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNyAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTg1ZgorI2RlZmluZSBBTFBIQV9GbG9hdF84ICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5NzlmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzkgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk3MGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTU3ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8xMSAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5MzlmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzEyICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTkxNGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTMgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5ODc5ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8xNCAgICAgICAgICAgICAgICAgICAgICAgMC45OTk4MjlmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzE1ICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTc1OGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTYgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5NjU4ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8xNyAgICAgICAgICAgICAgICAgICAgICAgMC45OTk1MTZmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzE4ICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTMxNmYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTkgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5MDMzZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yMCAgICAgICAgICAgICAgICAgICAgICAgMC45OTg2MzNmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzIxICAgICAgICAgICAgICAgICAgICAgICAwLjk5ODA2N2YKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTk3MjY4ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yMyAgICAgICAgICAgICAgICAgICAgICAgMC45OTYxMzlmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzI0ICAgICAgICAgICAgICAgICAgICAgICAwLjk5NDU0NWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMjUgICAgICAgICAgICAgICAgICAgICAgIDAuOTkyMjk1ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yNiAgICAgICAgICAgICAgICAgICAgICAgMC45ODkxMjNmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzI3ICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDY1NGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMjggICAgICAgICAgICAgICAgICAgICAgIDAuOTc4MzcwZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yOSAgICAgICAgICAgICAgICAgICAgICAgMC45Njk1NTNmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzMwICAgICAgICAgICAgICAgICAgICAgICAwLjk1NzIyMWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMzEgICAgICAgICAgICAgICAgICAgICAgIDAuOTQwMDUxZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zMiAgICAgICAgICAgICAgICAgICAgICAgMC45MTYyOTdmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzMzICAgICAgICAgICAgICAgICAgICAgICAwLjg4MzcyOWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMzQgICAgICAgICAgICAgICAgICAgICAgIDAuODM5NjQ1ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zNSAgICAgICAgICAgICAgICAgICAgICAgMC43ODEwMzZmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzM2ICAgICAgICAgICAgICAgICAgICAgICAwLjcwNTA3OGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMzcgICAgICAgICAgICAgICAgICAgICAgIDAuNjEwMTA4ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zOCAgICAgICAgICAgICAgICAgICAgICAgMC40OTcyMzlmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzM5ICAgICAgICAgICAgICAgICAgICAgICAwLjM3MjM0M2YKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDAgICAgICAgICAgICAgICAgICAgICAgIDAuMjQ3MzUxZgorI2RlZmluZSBBTFBIQV9GbG9hdF80MSAgICAgICAgICAgICAgICAgICAgICAgMC4xMzg3MjJmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQyICAgICAgICAgICAgICAgICAgICAgICAwLjA2MTIzNGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDMgICAgICAgICAgICAgICAgICAgICAgIDAuMDE5MjY3ZgorI2RlZmluZSBBTFBIQV9GbG9hdF80NCAgICAgICAgICAgICAgICAgICAgICAgMC4wMDM3NTZmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQ1ICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDM3MmYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDYgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDE0ZgorI2RlZmluZSBBTFBIQV9GbG9hdF80NyAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQ4ICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDkgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBBTFBIQV9GbG9hdF81MCAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZW5kaWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fTWl4ZXJfVGltZUNvbnN0YW50LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fTWl4ZXJfVGltZUNvbnN0YW50LmMKaW5kZXggODA5ZDkwNC4uMThiMjc4MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX1RpbWVDb25zdGFudC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9UaW1lQ29uc3RhbnQuYwpAQCAtNTcsNyArNTcsMTEwIEBACiAvKiAgQWxwaGEgICAtIHRoZSBmaWx0ZXIgY29lZmZpY2llbnQgUTMxIGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9GTE9BVCBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWTV9VSU5UMzIgICB0YywKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDMyICAgRnMsCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICBGcywKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICBOdW1DaGFubmVscykKK3sKIAorICAgIExWTV9VSU5UMzIgIFByb2R1Y3Q7CisgICAgTFZNX0ZMT0FUICBQcm9kdWN0RmxvYXQ7CisgICAgTFZNX0lOVDE2ICAgSW50ZXJwb2xhdGVTaG9ydDsKKyAgICBMVk1fRkxPQVQgICBJbnRlcnBvbGF0ZTsKKyAgICBMVk1fVUlOVDE2ICBTaGlmdDsKKyAgICBMVk1fRkxPQVQgICBEaWZmOworICAgIExWTV9GTE9BVCAgVGFibGVbXSA9IHtBTFBIQV9GbG9hdF8wLCAgICAgICAgICAgICAvKiBMb2cgc3BhY2VkIGxvb2stdXAgdGFibGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzExLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzE0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzE3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzIzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzI2LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzI5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzM1LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzM4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzUwfTsKKworICAgIC8qIENhbGN1bGF0ZSB0aGUgcHJvZHVjdCBvZiB0aGUgdGltZSBjb25zdGFudCBhbmQgdGhlIHNhbXBsZSByYXRlICovCisgICAgUHJvZHVjdCA9ICgodGMgPj4gMTYpICogKExWTV9VSU5UMzIpRnMpIDw8IDEzOyAgLyogU3RlcmVvIHZhbHVlICovCisgICAgUHJvZHVjdCA9IFByb2R1Y3QgKyAoKCh0YyAmIDB4MDAwMEZGRkYpICogKExWTV9VSU5UMzIpRnMpID4+IDMpOworCisgICAgaWYgKE51bUNoYW5uZWxzID09IDEpCisgICAgeworICAgICAgICBQcm9kdWN0ID0gUHJvZHVjdCA+PiAxOyAgIC8qIE1vbm8gdmFsdWUgKi8KKyAgICB9CisKKyAgICAvKiBOb3JtYWxpemUgdG8gZ2V0IHRoZSB0YWJsZSBpbmRleCBhbmQgaW50ZXJwb2xhdGlvbiBmYWN0b3IgKi8KKyAgICBmb3IgKFNoaWZ0ID0gMDsgU2hpZnQgPCAoKEFscGhhX1RhYmxlU2l6ZSAtIDEpIC8gMik7IFNoaWZ0KyspCisgICAgeworICAgICAgICBpZiAoKFByb2R1Y3QgJiAweDgwMDAwMDAwKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIFByb2R1Y3QgPSBQcm9kdWN0IDw8IDE7CisgICAgfQorICAgIFNoaWZ0ID0gKExWTV9VSU5UMTYpKChTaGlmdCA8PCAxKSk7CisKKyAgICBpZiAoKFByb2R1Y3QgJiAweDQwMDAwMDAwKT09MCkKKyAgICB7CisgICAgICAgIFNoaWZ0Kys7CisgICAgfQorCisgICAgSW50ZXJwb2xhdGVTaG9ydCA9IChMVk1fSU5UMTYpKChQcm9kdWN0ID4+IDE1KSAmIDB4MDAwMDdGRkYpOworICAgIEludGVycG9sYXRlID0gKExWTV9GTE9BVClJbnRlcnBvbGF0ZVNob3J0IC8gMzI3NjguMGY7CisKKyAgICBEaWZmID0gKFRhYmxlW1NoaWZ0XSAtIFRhYmxlW1NoaWZ0ICsgMV0pOworICAgIERpZmYgPSBEaWZmICogSW50ZXJwb2xhdGU7CisgICAgUHJvZHVjdEZsb2F0ID0gVGFibGVbU2hpZnQgKyAxXSArIERpZmY7CisKKyAgICByZXR1cm4gUHJvZHVjdEZsb2F0OworfQorI2Vsc2UKIExWTV9VSU5UMzIgTFZNX01peGVyX1RpbWVDb25zdGFudChMVk1fVUlOVDMyICAgdGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgIEZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICBOdW1DaGFubmVscykKQEAgLTE1NCwzICsyNTcsNCBAQAogCiAgICAgcmV0dXJuIFByb2R1Y3Q7CiB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb2x5bm9taWFsLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fUG9seW5vbWlhbC5jCmluZGV4IGE2ZDdkYjIuLmNkNTc3NjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb2x5bm9taWFsLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1BvbHlub21pYWwuYwpAQCAtMjUsNyArMjUsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgcG9seW5vbWlhbCBleHBhbnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFkgPSAoQTAgKyBBMSpYICsgQTIqWDIgKyBBMypYMyArIIUuLiArIEFOKnhOKSA8PCBBTisxICAgICAgICAgICAgICAgICAgKi8KKy8qICBZID0gKEEwICsgQTEqWCArIEEyKlgyICsgQTMqWDMgKyDvv70uLiArIEFOKnhOKSA8PCBBTisxICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgTFZNX0lOVDMyIExWTV9Qb2x5bm9taWFsKExWTV9VSU5UMTYgICAgTiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgKnBDb2VmZmljaWVudHMsICAgICAgICAgICAgICAgICAgKi8KQEAgLTQwLDcgKzQwLDQ4IEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBUaGUgcmVzdWx0IG9mIHRoZSBwb2x5bm9taWFsIGV4cGFuc2lvbiBpbiBRMS4zMSBmb3JtYXQgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWTV9GTE9BVCBMVk1fUG9seW5vbWlhbChMVk1fVUlOVDE2ICAgIE4sCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICpwQ29lZmZpY2llbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICBYKQoreworICAgIExWTV9JTlQzMiBpOworICAgIExWTV9GTE9BVCBZLEEsWFRlbXAsVGVtcCxzaWduOwogCisgICAgWSA9ICpwQ29lZmZpY2llbnRzOyAvKiBZPUEwKi8KKyAgICBwQ29lZmZpY2llbnRzKys7CisKKyAgICBpZihYID09IC0xLjBmKQorICAgIHsKKyAgICAgICAgVGVtcCA9IC0xOworICAgICAgICBzaWduID0gVGVtcDsKKyAgICAgICAgZm9yKGkgPSAxOyBpIDw9IE47IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgWSArPSAoKCpwQ29lZmZpY2llbnRzKSAqIHNpZ24pOworICAgICAgICAgICAgcENvZWZmaWNpZW50cysrOworICAgICAgICAgICAgc2lnbiAqPSBUZW1wOworICAgICAgICB9CisKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBYVGVtcCA9IFg7CisgICAgICAgIGZvcihpID0gTi0xOyBpID49IDA7IGktLSkKKyAgICAgICAgeworICAgICAgICAgICAgQSA9ICpwQ29lZmZpY2llbnRzOworICAgICAgICAgICAgcENvZWZmaWNpZW50cysrOworCisgICAgICAgICAgICBUZW1wID0gQSAqIFhUZW1wOworICAgICAgICAgICAgWSArPSBUZW1wOworCisgICAgICAgICAgICBUZW1wID0gWFRlbXAgKiBYOworICAgICAgICAgICAgWFRlbXAgPSBUZW1wOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBZOworfQorI2Vsc2UKIExWTV9JTlQzMiBMVk1fUG9seW5vbWlhbChMVk1fVUlOVDE2ICAgIE4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICpwQ29lZmZpY2llbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICBYKQpAQCAtOTMsNCArMTM0LDQgQEAKICAgICB9CiAgICAgcmV0dXJuIFk7CiB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1Bvd2VyMTAuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb3dlcjEwLmMKaW5kZXggNmNhMTA3Ny4uODc4NTU5NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1Bvd2VyMTAuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fUG93ZXIxMC5jCkBAIC00NCw3ICs0NCw3IEBACiAvKiAgIEExMSAgICAgICAgICAgIDUwNDc3MjQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBBMTIgICAgICAgICAgICAtMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgWSA9IChBMCArIEExKlggKyBBMipYMiArIEEzKlgzICsghS4uICsgQU4qeE4pIDw8IEFOKzEgICAgICAgICAgICAgICAgICAqLworLyogIFkgPSAoQTAgKyBBMSpYICsgQTIqWDIgKyBBMypYMyArIO+/vS4uICsgQU4qeE4pIDw8IEFOKzEgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTQsNyArNTQsMjggQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIFRoZSByZXN1bHQgb2YgdGhlIDEweCBleHBhbnNpb24gaW4gUTguMjQgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitMVk1fRkxPQVQgTFZNX1Bvd2VyMTAoTFZNX0ZMT0FUICAgICBYKQoreworICAgIExWTV9GTE9BVCBZLENvZWZmaWNpZW50c1sxM109ezAuOTk5OTA2ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjMwMjQ3NWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi42NTI3NjVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDM1NDk0ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjE2NTY2N2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41Mzc2NzZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjEzMTkyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA2OTYwM2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMTY1NTNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA0MzczZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMTgxN2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAzNjdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB9OworICAgIFk9TFZNX1BvbHlub21pYWwoKExWTV9VSU5UMTYpMTEsCisgICAgICAgICAgICAgICAgICAgICBDb2VmZmljaWVudHMsCisgICAgICAgICAgICAgICAgICAgICBYKTsKKyAgICByZXR1cm4gWTsKK30KKyNlbHNlCiBMVk1fSU5UMzIgTFZNX1Bvd2VyMTAoTFZNX0lOVDMyICAgICBYKQogewogICAgIExWTV9JTlQzMiBZLENvZWZmaWNpZW50c1sxM109eyAgMTY3NzU2MzYsCkBAIC03NSw0ICs5Niw0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBYKTsKICAgICByZXR1cm4gWTsKIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xvYWRDb25zdF8zMi5jCmluZGV4IDJmMWU1OTEuLjllMTRjM2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xvYWRDb25zdF8zMi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xvYWRDb25zdF8zMi5jCkBAIC0yNCw3ICsyNCwyMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIExvYWRDb25zdF8zMgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTG9hZENvbnN0X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCAgIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICkKK3sKKyAgICBMVk1fSU5UMTYgaWk7CiAKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgICpkc3QgPSB2YWw7CisgICAgICAgIGRzdCsrOworICAgIH0KKworICAgIHJldHVybjsKK30KKyNlbHNlCiB2b2lkIExvYWRDb25zdF8zMihjb25zdCBMVk1fSU5UMzIgICB2YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApCkBAIC0zOSw1ICs1NCw2IEBACiAKICAgICByZXR1cm47CiB9CisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NU1RvMmlfU2F0XzE2eDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NU1RvMmlfU2F0XzE2eDE2LmMKaW5kZXggMjYyOTdlNy4uMDJjOTA2YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTVNUbzJpX1NhdF8xNngxNi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01TVG8yaV9TYXRfMTZ4MTYuYwpAQCAtNzcsNCArNzcsNTggQEAKIAogICAgIHJldHVybjsKIH0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBNU1RvMmlfU2F0X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCAgKnNyY00sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAqc3JjUywKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBuICkKK3sKKyAgICBMVk1fRkxPQVQgdGVtcCxtVmFsLHNWYWw7CisgICAgTFZNX0lOVDE2IGlpOworCisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIG1WYWwgPSAoTFZNX0ZMT0FUKSpzcmNNOworICAgICAgICBzcmNNKys7CisKKyAgICAgICAgc1ZhbCA9IChMVk1fRkxPQVQpKnNyY1M7CisgICAgICAgIHNyY1MrKzsKKworICAgICAgICB0ZW1wID0gbVZhbCArIHNWYWw7CisKKyAgICAgICAgaWYgKHRlbXAgPiAxLjBmKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gMS4wZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0ZW1wIDwgLTEuMGYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAtMS4wZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAoTFZNX0ZMT0FUKXRlbXA7CisgICAgICAgIH0KKyAgICAgICAgZHN0Kys7CisKKyAgICAgICAgdGVtcCA9IG1WYWwgLSBzVmFsOworCisgICAgICAgIGlmICh0ZW1wID4gMS4wZikKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IDEuMGY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodGVtcCA8IC0xLjBmKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gLSAxLjBmOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IChMVk1fRkxPQVQpdGVtcDsKKyAgICAgICAgfQorICAgICAgICBkc3QrKzsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWFjM3NfU2F0XzMyeDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMzJ4MTYuYwppbmRleCBmMjhmMzY2Li5lM2ZiNDBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMzJ4MTYuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMzJ4MTYuYwpAQCAtNjQsNyArNjQsNDQgQEAKIAogICAgIHJldHVybjsKIH0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBNYWMzc19TYXRfRmxvYXQoY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgdmFsLAorICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgTFZNX0ZMT0FUIHNyY3ZhbDsKKyAgICBMVk1fRkxPQVQgVGVtcCxkSW5WYWw7CiAKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIHNyY3ZhbCA9ICpzcmM7CisgICAgICAgIHNyYysrOworCisgICAgICAgIFRlbXAgPSBzcmN2YWwgKiB2YWw7CisKKyAgICAgICAgZEluVmFsICA9IChMVk1fRkxPQVQpKmRzdDsKKyAgICAgICAgVGVtcCA9IFRlbXAgKyBkSW5WYWw7CisKKyAgICAgICAgaWYgKFRlbXAgPiAxLjAwMDAwMGYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAxLjAwMDAwMGY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjAwMDAwMGYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAtMS4wMDAwMDBmOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IFRlbXA7CisgICAgICAgIH0KKyAgICAgICAgZHN0Kys7CisgICAgfQorCisgICAgcmV0dXJuOworfQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhJblNvZnRfRDMyQzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYwppbmRleCA3M2MyNmVkLi4xNmUzNjdiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhJblNvZnRfRDMyQzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peEluU29mdF9EMzJDMzFfU0FULmMKQEAgLTMyLDcgKzMyLDcxIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gTUlYSU5TT0ZUX0QzMkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIE1peEluU29mdF9EMzJDMzFfU0FUKCBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICBuKQoreworICAgIGNoYXIgSGFyZE1peGluZyA9IFRSVUU7CiAKKyAgICBpZihuIDw9IDApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKHBJbnN0YW5jZS0+Q3VycmVudCAhPSBwSW5zdGFuY2UtPlRhcmdldCkKKyAgICB7CisgICAgICAgIGlmKHBJbnN0YW5jZS0+QWxwaGEgPT0gMCl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgfWVsc2UgaWYgKChwSW5zdGFuY2UtPkN1cnJlbnQtcEluc3RhbmNlLT5UYXJnZXQgPCBQT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkgJiYKKyAgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+Q3VycmVudC1wSW5zdGFuY2UtPlRhcmdldCA+IC1QT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgIH1lbHNleworICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KKyAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIENvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQocEluc3RhbmNlLCBzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgSEFSRCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKEhhcmRNaXhpbmcpeworICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgIT0gMCl7IC8qIE5vdGhpbmcgdG8gZG8gaW4gY2FzZSBUYXJnZXQgPSAwICovCisgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+VGFyZ2V0KSA9PSAxLjBmKQorICAgICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHNyYywgZHN0LCBuKTsKKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVChwSW5zdGFuY2UsIHNyYywgZHN0LCBuKTsKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogSW4gY2FzZSB0aGUgY29yZSBmdW5jdGlvbiB3b3VsZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmUgY2hhbmdlZCB0aGUgQ3VycmVudCB2YWx1ZSAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogQ2FsbCBiYWNrIGJlZm9yZSB0aGUgaGFyZCBtaXhpbmcsIGJlY2F1c2UgaW4gdGhpcyBjYXNlLCBoYXJkIG1peGluZyBtYWtlcworICAgICAgIHVzZSBvZiB0aGUgY29yZSBzb2Z0IG1peCBmdW5jdGlvbiB3aGljaCBjYW4gY2hhbmdlIHRoZSBDdXJyZW50IHZhbHVlISAgICAgICovCisKKyAgICBpZiAocEluc3RhbmNlLT5DYWxsYmFja1NldCl7CisgICAgICAgIGlmICgocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPCBQT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkgJiYKKyAgICAgICAgICAgIChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCA+IC1QT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBwSW5zdGFuY2UtPkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5wQ2FsbEJhY2sgIT0gMCl7CisgICAgICAgICAgICAgICAgKCpwSW5zdGFuY2UtPnBDYWxsQmFjaykgKCBwSW5zdGFuY2UtPnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5DYWxsYmFja1BhcmFtICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisjZWxzZQogdm9pZCBNaXhJblNvZnRfRDMyQzMxX1NBVCggTWl4XzFTdF9DbGxfdCAgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAqZHN0LApAQCAtOTEsNSArMTU1LDUgQEAKICAgICAgICAgfQogICAgIH0KIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMVN0X0QzMkMzMV9XUkEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMVN0X0QzMkMzMV9XUkEuYwppbmRleCBjYTg4YjA0Li44NjkyOTNiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jCkBAIC0zNCw3ICszNCw2OCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIE1JWFNPRlRfMVNUX0QzMkMzMV9XUkEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKKyAgICBjaGFyIEhhcmRNaXhpbmcgPSBUUlVFOwogCisgICAgaWYobiA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCisgICAgeworICAgICAgICBpZihwSW5zdGFuY2UtPkFscGhhID09IDApeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgIH1lbHNlIGlmICgocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPCBQT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkgJiYKKyAgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0ID4gLVBPSU5UX1pFUk9fT05FX0RCX0ZMT0FUKSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKHBJbnN0YW5jZSwgc3JjLCBkc3QsIG4pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIEhBUkQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChIYXJkTWl4aW5nKXsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ID09IDApCisgICAgICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgZHN0LCBuKTsKKyAgICAgICAgZWxzZSBpZiAoKHBJbnN0YW5jZS0+VGFyZ2V0KSA9PSAxLjBmKXsKKyAgICAgICAgICAgIGlmIChzcmMgIT0gZHN0KQorICAgICAgICAgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCopc3JjLCAoTFZNX0ZMT0FUKilkc3QsIChMVk1fSU5UMTYpKG4pKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBNdWx0M3NfRmxvYXQoc3JjLCBwSW5zdGFuY2UtPkN1cnJlbnQsIGRzdCwgbik7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAocEluc3RhbmNlLT5DYWxsYmFja1NldCl7CisgICAgICAgIGlmICgocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPCBQT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkgJiYKKyAgICAgICAgICAgIChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCA+IC1QT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBwSW5zdGFuY2UtPkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5wQ2FsbEJhY2sgIT0gMCl7CisgICAgICAgICAgICAgICAgKCpwSW5zdGFuY2UtPnBDYWxsQmFjaykgKCBwSW5zdGFuY2UtPnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5DYWxsYmFja1BhcmFtICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisjZWxzZQogdm9pZCBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCAgICBNaXhfMVN0X0NsbF90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LApAQCAtOTEsNSArMTUyLDUgQEAKICAgICAgICAgfQogICAgIH0KIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMlN0X0QzMkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMlN0X0QzMkMzMV9TQVQuYwppbmRleCAyZTBhMDk5Li42ZmMxYjkyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhTb2Z0XzJTdF9EMzJDMzFfU0FULmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8yU3RfRDMyQzMxX1NBVC5jCkBAIC0yNiw3ICsyNiw0NCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIE1JWFNPRlRfMlNUX0QzMkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIE1peFNvZnRfMlN0X0QzMkMzMV9TQVQoICAgIE1peF8yU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCit7CiAKKyAgICBpZihuIDw9IDApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKChwSW5zdGFuY2UtPkN1cnJlbnQxICE9IHBJbnN0YW5jZS0+VGFyZ2V0MSkgfHwgKHBJbnN0YW5jZS0+Q3VycmVudDIgIT0gcEluc3RhbmNlLT5UYXJnZXQyKSkKKyAgICB7CisgICAgICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoKE1peF8xU3RfQ2xsX0ZMT0FUX3QqKXBJbnN0YW5jZSwgc3JjMSwgZHN0LCBuKTsKKyAgICAgICAgTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoKHZvaWQgKikmcEluc3RhbmNlLT5BbHBoYTIsIC8qIENhc3QgdG8gdm9pZDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzIsIGRzdCwgbik7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIEhBUkQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQxID09IDApCisgICAgICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCh2b2lkICopICZwSW5zdGFuY2UtPkFscGhhMiwgLyogQ2FzdCB0byB2b2lkOiBubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyLCBkc3QsIG4pOworICAgICAgICBlbHNlIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQyID09IDApCisgICAgICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKChNaXhfMVN0X0NsbF9GTE9BVF90KikgcEluc3RhbmNlLCBzcmMxLCBkc3QsIG4pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBDb3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQocEluc3RhbmNlLCBzcmMxLCBzcmMyLCBkc3QsIG4pOworICAgIH0KK30KKyNlbHNlCiB2b2lkIE1peFNvZnRfMlN0X0QzMkMzMV9TQVQoICAgIE1peF8yU3RfQ2xsX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjMiwKQEAgLTYxLDUgKzk4LDYgQEAKICAgICAgICAgICAgIENvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVCggcEluc3RhbmNlLCBzcmMxLCBzcmMyLCBkc3QsIG4pOwogICAgIH0KIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4ZXJfcHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4ZXJfcHJpdmF0ZS5oCmluZGV4IDYwNzA3M2MuLjAwZDU1ZWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peGVyX3ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhlcl9wcml2YXRlLmgKQEAgLTI2LDYgKzI2LDEwIEBACiAKICNkZWZpbmUgUE9JTlRfWkVST19PTkVfREIgMjQ3MzgwNSAvKiAwLjAxIGRCIG9uIGEgZnVsbCBzY2FsZSBzaWduYWwgPSAoMTBeKDAuMDEvMjApIC0xKSAqIDJeMzEgKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUCisjZGVmaW5lIFBPSU5UX1pFUk9fT05FX0RCX0ZMT0FUIDAuMDAxMTUyIC8qIDAuMDEgZEIgb24gYSBmdWxsIHNjYWxlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsID0gKDEwXigwLjAxLzIwKSAtMSkgKiAyXjMxICovCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBERUZJTklUSU9OUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Nb25vVG8ySV8zMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTW9ub1RvMklfMzIuYwppbmRleCBjMDllYzBmLi43OTZhMTVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Nb25vVG8ySV8zMi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01vbm9UbzJJXzMyLmMKQEAgLTQ1LDUgKzQ1LDI2IEBACiAKICAgICByZXR1cm47CiB9CisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTW9ub1RvMklfRmxvYXQoIGNvbnN0IExWTV9GTE9BVCAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKQoreworICAgIExWTV9JTlQxNiBpaTsKKyAgICBzcmMgKz0gKG4gLSAxKTsKKyAgICBkc3QgKz0gKChuICogMikgLSAxKTsKIAorICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgKmRzdCA9ICpzcmM7CisgICAgICAgIGRzdC0tOworCisgICAgICAgICpkc3QgPSAqc3JjOworICAgICAgICBkc3QtLTsKKyAgICAgICAgc3JjLS07CisgICAgfQorCisgICAgcmV0dXJuOworfQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL011bHQzc18zMngxNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTXVsdDNzXzMyeDE2LmMKaW5kZXggYTVkYzUwZi4uYzc1ODU2MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTXVsdDNzXzMyeDE2LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTXVsdDNzXzMyeDE2LmMKQEAgLTQ3LDUgKzQ3LDIzIEBACiAKICAgICByZXR1cm47CiB9CisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTXVsdDNzX0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgdmFsLAorICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKQoreworICAgIExWTV9JTlQxNiBpaTsKKyAgICBMVk1fRkxPQVQgdGVtcDsKIAorICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgdGVtcCA9ICgqc3JjKSAqIHZhbDsKKyAgICAgICAgc3JjKys7CisgICAgICAgICpkc3QgPSB0ZW1wOworICAgICAgICBkc3QrKzsKKyAgICB9CisgICAgcmV0dXJuOworfQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL05vbkxpbkNvbXBfRDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Ob25MaW5Db21wX0QxNi5jCmluZGV4IDczMzQzY2QuLjUxNTZlZGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL05vbkxpbkNvbXBfRDE2LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTm9uTGluQ29tcF9EMTYuYwpAQCAtMTE0LDQgKzExNCw1NCBAQAogICAgIH0KIAogfQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIE5vbkxpbkNvbXBfRmxvYXQoTFZNX0ZMT0FUICAgICAgICBHYWluLAorICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICBCbG9ja0xlbmd0aCkKK3sKIAorICAgIExWTV9GTE9BVCAgICAgICAgICAgIFNhbXBsZTsgICAgICAgICAgICAgICAgICAgIC8qIElucHV0IHNhbXBsZXMgKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgICBTYW1wbGVObzsgICAgICAgICAgICAgICAgLyogU2FtcGxlIGluZGV4ICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgVGVtcDsKKworCisgICAgLyoKKyAgICAgKiBQcm9jZXNzIGEgYmxvY2sgb2Ygc2FtcGxlcworICAgICAqLworICAgIGZvcihTYW1wbGVObyA9IDA7IFNhbXBsZU5vIDwgQmxvY2tMZW5ndGg7IFNhbXBsZU5vKyspCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBSZWFkIHRoZSBpbnB1dAorICAgICAgICAgKi8KKyAgICAgICAgU2FtcGxlID0gKnBEYXRhSW47CisgICAgICAgIHBEYXRhSW4rKzsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IHRoZSBjb21wYW5kZXIsIHRoaXMgY29tcHJlc3NlcyB0aGUgc2lnbmFsIGF0IHRoZSBleHBlbnNlIG9mCisgICAgICAgICAqIGhhcm1vbmljIGRpc3RvcnRpb24uIFRoZSBhbW91bnQgb2YgY29tcHJlc3Npb24gaXMgY29udHJvbCBieSB0aGUKKyAgICAgICAgICogZ2FpbiBmYWN0b3IKKyAgICAgICAgICovCisgICAgICAgIGlmIChTYW1wbGUgIT0gLTEuMGYpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlbXAgPSAoKFNhbXBsZSAqIFNhbXBsZSkpOworICAgICAgICAgICAgaWYoU2FtcGxlID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTYW1wbGUgPSAoU2FtcGxlICsgKChHYWluICogKFNhbXBsZSAtIFRlbXApKSApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTYW1wbGUgPSAoU2FtcGxlICsgKChHYWluICogKFNhbXBsZSArIFRlbXApKSApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2F2ZSB0aGUgb3V0cHV0CisgICAgICAgICAqLworICAgICAgICAqcERhdGFPdXQgPSBTYW1wbGU7CisgICAgICAgIHBEYXRhT3V0Kys7CisgICAgfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEuYwppbmRleCBjOGMxNTI3Li45YzE3YTA1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmMKQEAgLTM4LDYgKzM4LDg4IEBACiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CiAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTAgZm9ybWF0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgeW5MLHluUix5bkxPLHluUk8sdGVtcGw7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GbG9hdCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GbG9hdCkgcEluc3RhbmNlOworCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5MPSAoQTAgICogKHgobilMIC0geChuLTIpTCAgKSApKi8KKyAgICAgICAgICAgIHRlbXBsID0gKCpwRGF0YUluKSAtIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKyAgICAgICAgICAgIHluTCA9IHRlbXBsICogcEJpcXVhZFN0YXRlLT5jb2Vmc1swXTsKKworICAgICAgICAgICAgLyogeW5MKz0gKCgtQjIgICogeShuLTIpTCAgKSkgKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXTsKKyAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyogeW5MKz0gKCgtQjEgKiB5KG4tMSlMICApICkgKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1syXTsKKyAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyogeW5MTz0gKChHYWluICogeW5MICkpICovCisgICAgICAgICAgICB5bkxPID0geW5MICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKKworICAgICAgICAgICAgLyogeW5MTz0oIHluTE8gKyB4KG4pTCAgKSovCisgICAgICAgICAgICB5bkxPICs9ICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluUj0gKEEwICAqICh4KG4pUiAgLSB4KG4tMilSICApICkgKi8KKyAgICAgICAgICAgIHRlbXBsID0gKCoocERhdGFJbiArIDEpKSAtIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKyAgICAgICAgICAgIHluUiA9IHRlbXBsICogcEJpcXVhZFN0YXRlLT5jb2Vmc1swXTsKKworICAgICAgICAgICAgLyogeW5SKz0gKCgtQjIgICogeShuLTIpUiAgKSApICAqLworICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdOworICAgICAgICAgICAgeW5SICs9IHRlbXBsOworCisgICAgICAgICAgICAvKiB5blIrPSAoKC1CMSAgKiB5KG4tMSlSICApICkgICAqLworICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdOworICAgICAgICAgICAgeW5SICs9IHRlbXBsOworCisgICAgICAgICAgICAvKiB5blJPPSAoKEdhaW4gICogeW5SICkpICovCisgICAgICAgICAgICB5blJPID0geW5SICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKKworICAgICAgICAgICAgLyogeW5STz0oIHluUk8gKyB4KG4pUiAgKSovCisgICAgICAgICAgICB5blJPICs9ICgqKHBEYXRhSW4rMSkpOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07IC8qIHkobi0yKVI9eShuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07IC8qIHkobi0yKUw9eShuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07IC8qIHgobi0yKVI9eChuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8qIHgobi0yKUw9eChuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSB5blI7IC8qIFVwZGF0ZSB5KG4tMSlSICovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gPSB5bkw7IC8qIFVwZGF0ZSB5KG4tMSlMICovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpTCAqLworICAgICAgICAgICAgcERhdGFJbisrOworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKVIgKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQgPSB5bkxPOyAvKiBXcml0ZSBMZWZ0IG91dHB1dCovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICAgICAgKnBEYXRhT3V0ID0geW5STzsgLyogV3JpdGUgUmlnaHQgb3VwdXQqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKworICAgICAgICB9CisKKyAgICB9CisjZWxzZQogdm9pZCBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMSAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhT3V0LApAQCAtMTE4LDQgKzIwMCw0IEBACiAgICAgICAgIH0KIAogICAgIH0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzMwRzExX1RSQ19XUkFfMDEuYwppbmRleCA2N2E1NzBiLi5mNzA1Y2JmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMzMEcxMV9UUkNfV1JBXzAxLmMKQEAgLTM4LDYgKzM4LDcgQEAKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMCBmb3JtYXQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgUEtfMklfRDMyRjMyQzMwRzExX1RSQ19XUkFfMDEgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YU91dCwKQEAgLTExNiw0ICsxMTcsNCBAQAogICAgICAgICB9CiAKICAgICB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdC5jCmluZGV4IDFkNjE0MmMuLjY1NDc1YTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTE4LDcgKzE4LDcgQEAKICNpbmNsdWRlICJCSVFVQUQuaCIKICNpbmNsdWRlICJQS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCiAKLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCAgUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMzJfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKQEAgLTM1LDQgKzM1LDQgQEAKICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXT1wQ29lZi0+RzsKIAogfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQuYwppbmRleCBiOWY2NGU2Li5hMzYzMzBlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0xNyw3ICsxNywyMyBAQAogCiAjaW5jbHVkZSAiQklRVUFELmgiCiAjaW5jbHVkZSAiUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkICBQS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCit7CisgICAgUEZpbHRlcl9TdGF0ZV9GbG9hdCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GbG9hdCkgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgICA9IChMVk1fRkxPQVQgKikgcFRhcHM7CiAKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gcENvZWYtPkEwOworCisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHBDb2VmLT5CMjsKKworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSBwQ29lZi0+QjE7CisKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdID0gcENvZWYtPkc7Cit9CisjZWxzZQogdm9pZCAgUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMTZfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKQEAgLTM0LDQgKzUwLDQgQEAKICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXT1wQ29lZi0+RzsKIAogfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCBlMjA1MGUwLi4xZTMyMDYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0yMSw2ICsyMSwxNiBAQAogCiAvKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCiAvKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCisKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GbG9hdF8KK3sKKyAgICBMVk1fRkxPQVQgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICBjb2Vmc1s1XTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfUZpbHRlcl9TdGF0ZV9GbG9hdDsKKwordHlwZWRlZiBGaWx0ZXJfU3RhdGVfRmxvYXQgKiBQRmlsdGVyX1N0YXRlX0Zsb2F0IDsKKyNlbmRpZgogdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KIHsKICAgTFZNX0lOVDMyICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjE2eHYxNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvU2hpZnRfU2F0X3YxNnh2MTYuYwppbmRleCA4MzYzMjcwLi4yOGZlYTY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjE2eHYxNi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1NoaWZ0X1NhdF92MTZ4djE2LmMKQEAgLTI0LDcgKzI0LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBTaGlmdF9TYXRfdjE2eHYxNgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKIHZvaWQgU2hpZnRfU2F0X3YxNnh2MTYgKGNvbnN0ICAgTFZNX0lOVDE2ICAgdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fSU5UMTYgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgKmRzdCwKQEAgLTc3LDUgKzc3LDUgQEAKICAgICB9CiAgICAgcmV0dXJuOwogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvU2hpZnRfU2F0X3YzMnh2MzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1NoaWZ0X1NhdF92MzJ4djMyLmMKaW5kZXggZmJkMTMyZS4uZmFjOWRlNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvU2hpZnRfU2F0X3YzMnh2MzIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjMyeHYzMi5jCkBAIC0yNCw3ICsyNCw2MiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIFNoaWZ0X1NhdF92MzJ4djMyCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBTaGlmdF9TYXRfRmxvYXQgKGNvbnN0ICAgTFZNX0lOVDE2ICAgdmFsLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0ZMT0FUICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgIG4pCit7CisgICAgTFZNX0ZMT0FUICAgdGVtcDsKKyAgICBMVk1fSU5UMzIgICBpaSxpajsKKyAgICBMVk1fSU5UMTYgICBSU2hpZnQ7CiAKKyAgICBpZih2YWwgPiAwKQorICAgIHsKKyAgICAgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSAoTFZNX0ZMT0FUKSpzcmM7CisgICAgICAgICAgICBzcmMrKzsKKyAgICAgICAgICAgIGZvcihpaiA9IDA7IGlqIDwgdmFsOyBpaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wICogMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYodGVtcCA+IDEuMCkKKyAgICAgICAgICAgICAgICB0ZW1wID0gMS4wOworICAgICAgICAgICAgaWYodGVtcCA8IC0xLjApCisgICAgICAgICAgICAgICAgdGVtcCA9IC0xLjA7CisKKyAgICAgICAgICAgICpkc3QgPSAoTFZNX0ZMT0FUKXRlbXA7CisgICAgICAgICAgICBkc3QrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKHZhbCA8IDApCisgICAgeworICAgICAgICBSU2hpZnQ9KExWTV9JTlQxNikoLXZhbCk7CisKKyAgICAgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSAoTFZNX0ZMT0FUKSpzcmM7CisgICAgICAgICAgICBzcmMrKzsKKyAgICAgICAgICAgIGZvcihpaiA9IDA7IGlqIDwgUlNoaWZ0OyBpaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wIC8gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkc3QgPSAoTFZNX0ZMT0FUKXRlbXA7CisgICAgICAgICAgICBkc3QrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZihzcmMgIT0gZHN0KQorICAgICAgICB7CisgICAgICAgICAgICBDb3B5X0Zsb2F0KHNyYywgZHN0LCBuKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm47Cit9CisjZWxzZQogdm9pZCBTaGlmdF9TYXRfdjMyeHYzMiAoY29uc3QgICBMVk1fSU5UMTYgICB2YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9JTlQzMiAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAqZHN0LApAQCAtNzksNSArMTM0LDUgQEAKICAgICB9CiAgICAgcmV0dXJuOwogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvZEJfdG9fTGluMzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL2RCX3RvX0xpbjMyLmMKaW5kZXggYWMwMzQzZi4uOWE3MjZmMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvZEJfdG9fTGluMzIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9kQl90b19MaW4zMi5jCkBAIC0yOSw2ICsyOSw5IEBACiAvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KIAogI2luY2x1ZGUgIlNjYWxhckFyaXRobWV0aWMuaCIKKyNpZmRlZiBCVUlMRF9GTE9BVAorI2luY2x1ZGUgPG1hdGguaD4KKyNlbmRpZgogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC02NCw2ICs2NywxOCBAQAogI2RlZmluZSBTRUNPTkRfQ09FRiAgICAgIDM4ODM2CiAjZGVmaW5lIE1BWF9WQUxVRSAgICAgICAgMTUzNiAgICAgICAgICAgICAgICAgICAvKiA5NiAqIDE2ICovCiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZNX0ZMT0FUICAgZEJfdG9fTGluRmxvYXQoTFZNX0lOVDE2ICAgIGRiX2ZpeCkKK3sKKyAgICBMVk1fRkxPQVQgICAgZEJfRmxvYXQ7CisgICAgTFZNX0ZMT0FUICAgIExpbkZsb2F0OworCisgICAgZEJfRmxvYXQgPSAoTFZNX0ZMT0FUKSgoTFZNX0ZMT0FUKWRiX2ZpeCAvIDE2LjBmKTsKKyAgICBMaW5GbG9hdCA9IHBvdygxMCwgZEJfRmxvYXQgLyAyMC4wKTsKKworICAgIHJldHVybiBMaW5GbG9hdDsKK30KKyNlbHNlCiBMVk1fSU5UMzIgICBkQl90b19MaW4zMihMVk1fSU5UMTYgICAgZGJfZml4KQogewogICAgIExWTV9JTlQzMiBMaW5fdmFsXzMyOwpAQCAtMTA2LDQgKzEyMSw0IEBACiAKICAgICByZXR1cm4gTGluX3ZhbF8zMjsgIC8qIGZvcm1hdCAxLjE2LjE1ICovCiB9Ci0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYi9MVkVRTkIuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIvTFZFUU5CLmgKaW5kZXggZGI2YWFiZS4uOGUwYjczOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYi9MVkVRTkIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvbGliL0xWRVFOQi5oCkBAIC0yMDAsNiArMjAwLDEwIEBACiAjZGVmaW5lIExWRVFOQl9DQVBfRlNfMzIwMDAgICAgICAgICAgICAgICAgNjQKICNkZWZpbmUgTFZFUU5CX0NBUF9GU180NDEwMCAgICAgICAgICAgICAgICAxMjgKICNkZWZpbmUgTFZFUU5CX0NBUF9GU180ODAwMCAgICAgICAgICAgICAgICAyNTYKKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU185NjAwMCAgICAgICAgICAgICAgICA1MTIKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU18xOTIwMDAgICAgICAgICAgICAgICAxMDI0CisjZW5kaWYKIAogdHlwZWRlZiBlbnVtCiB7CkBAIC0yMTIsNiArMjE2LDEwIEBACiAgICAgTFZFUU5CX0ZTXzMyMDAwID0gNiwKICAgICBMVkVRTkJfRlNfNDQxMDAgPSA3LAogICAgIExWRVFOQl9GU180ODAwMCA9IDgsCisjaWZkZWYgSElHSEVSX0ZTCisgICAgTFZFUU5CX0ZTXzk2MDAwID0gOSwKKyAgICBMVkVRTkJfRlNfMTkyMDAwID0gMTAsCisjZW5kaWYKICAgICBMVkVRTkJfRlNfTUFYICAgPSBMVk1fTUFYSU5UXzMyCiB9IExWRVFOQl9Gc19lbjsKIApAQCAtMjY4LDYgKzI3Niw3IEBACiB7CiAgICAgLyogR2VuZXJhbCBwYXJhbWV0ZXJzICovCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIFNhbXBsZVJhdGU7CisKICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgU291cmNlRm9ybWF0OwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemU7CiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE1heEJhbmRzOwpAQCAtNDYwLDExICs0NjksMTcgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Qcm9jZXNzKExWRVFOQl9IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpOworI2Vsc2UKIExWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1Byb2Nlc3MoTFZFUU5CX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKnBPdXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcyk7CisjZW5kaWYKIAogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NhbGNDb2VmLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9DYWxjQ29lZi5jCmluZGV4IGZkZGVkYjkuLmZmNTJiN2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NhbGNDb2VmLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ2FsY0NvZWYuYwpAQCAtMjIsNyArMjIsOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJMVkVRTkJfUHJpdmF0ZS5oIgotCisjaWZkZWYgQlVJTERfRkxPQVQKKyNpbmNsdWRlIDxtYXRoLmg+CisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTc3LDYgKzc5LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAKKyNpZm5kZWYgQlVJTERfRkxPQVQKIExWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0RvdWJsZVByZWNDb2VmcyhMVk1fVUlOVDE2ICAgICAgICBGcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQmFuZERlZl90ICAqcEZpbHRlckRlZmluaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzMyX0NvZWZzX3QgICAgKnBDb2VmZmljaWVudHMpCkBAIC0xNjgsNyArMTcxLDcgQEAKICAgICByZXR1cm4oTFZFUU5CX1NVQ0NFU1MpOwogCiB9Ci0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjA1LDcgKzIwOCw2NyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUCitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9TaW5nbGVQcmVjQ29lZnMoTFZNX1VJTlQxNiAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0JhbmREZWZfdCAgKnBGaWx0ZXJEZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0ZMT0FUX0NvZWZzX3QgICpwQ29lZmZpY2llbnRzKQorewogCisgICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVkVRTkJfR2FpblRhYmxlW107CisgICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVkVRTkJfVHdvUGlPbkZzVGFibGVbXTsKKyAgICBleHRlcm4gTFZNX0ZMT0FUICAgIExWRVFOQl9EVGFibGVbXTsKKworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIGZpbHRlciBkZWZpbml0aW9uCisgICAgICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICBHYWluICAgICAgICA9IHBGaWx0ZXJEZWZpbml0aW9uLT5HYWluOworICAgIExWTV9VSU5UMTYgICAgICAgICAgRnJlcXVlbmN5ICAgPSBwRmlsdGVyRGVmaW5pdGlvbi0+RnJlcXVlbmN5OworICAgIC8qIEFzIG1lbnRpb25lZCBpbiBlZmZlY3RidW5kbGUuaCAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgUUZhY3RvciAgICAgPSAoTFZNX0ZMT0FUKXBGaWx0ZXJEZWZpbml0aW9uLT5RRmFjdG9yIC8gMTAwLjBmOworCisKKyAgICAvKgorICAgICAqIEludGVybWVkaWF0ZSB2YXJpYWJsZXMgYW5kIHRlbXBvcmFyeSB2YWx1ZXMKKyAgICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgIFQwOworICAgIExWTV9GTE9BVCAgICAgICAgICAgRDsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEEwOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQjE7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBCMjsKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRpbmcgdGhlIGludGVybWVkaWF0ZSB2YWx1ZXMKKyAgICAgKi8KKyAgICBUMCA9IEZyZXF1ZW5jeSAqIExWRVFOQl9Ud29QaU9uRnNUYWJsZVtGc107ICAgICAgICAvKiBUMCA9IDIgKiBQaSAqIEZjIC8gRnMgKi8KKyAgICBpZiAoR2FpbiA+PSAwKQorICAgIHsKKyAgICAgICAgRCA9IExWRVFOQl9EVGFibGVbMTVdOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEID0gMSAgICAgICAgICAgIGlmIEdhaW5kQiA+PSAwICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEQgPSBMVkVRTkJfRFRhYmxlW0dhaW4gKyAxNV07ICAgICAgICAgICAgICAgICAgICAvKiBEID0gMSAvICgxICsgRykgIGlmIEdhaW5kQiA8ICAwICovCisgICAgfQorCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIEIyLEIxLEEwIGNvZWZmaWNpZW50cworICAgICAqLworICAgIEIyID0gLTAuNSAqICgyICogUUZhY3RvciAtIEQgKiBUMCkgLyAoMiAqIFFGYWN0b3IgKyBEICogVDApOworICAgIEIxID0gKDAuNSAtIEIyKSAqIGNvcyhUMCk7CisgICAgQTAgPSAoMC41ICsgQjIpIC8gMi4wOworCisgICAgLyoKKyAgICAgKiBXcml0ZSBjb2VmZiBpbnRvIHRoZSBkYXRhIHN0cnVjdHVyZQorICAgICAqLworICAgIC8qIGFsbCB0aGUgY29lZmZpY2llbnRzIGFyZSBtdWx0aXBsaWVkIHdpdGggMiB0byBtYWtlIHRoZW0gYWxpZ24gd2l0aCBmaXhlZCBwb2ludCB2YWx1ZXMqLworICAgIHBDb2VmZmljaWVudHMtPkEwID0gMiAqIEEwOworICAgIHBDb2VmZmljaWVudHMtPkIxID0gMiAqIEIxOworICAgIHBDb2VmZmljaWVudHMtPkIyID0gMiAqIEIyOworICAgIHBDb2VmZmljaWVudHMtPkcgID0gTFZFUU5CX0dhaW5UYWJsZVtHYWluICsgMTVdOworCisgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKK30KKyNlbHNlCiBMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9TaW5nbGVQcmVjQ29lZnMoTFZNX1VJTlQxNiAgICAgICAgRnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0JhbmREZWZfdCAgKnBGaWx0ZXJEZWZpbml0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0MxNl9Db2Vmc190ICAgICpwQ29lZmZpY2llbnRzKQpAQCAtMjk2LDMgKzM1OSw0IEBACiAgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKIAogfQorI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaAppbmRleCA5NTIxMmYyLi5mMGRlYjZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaApAQCAtMjUsNyArMjUsMzkgQEAKIC8qIEdhaW4gdGFibGUgZm9yICgxMF4oR2Fpbi8yMCkgLSAxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzE1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC44MjIxNzJmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzE0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC44MDA0NzRmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzEzX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NzYxMjhmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzEyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NDg4MTFmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzExX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43MTgxNjJmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzEwX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42ODM3NzJmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzlfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42NDUxODdmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzhfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42MDE4OTNmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzdfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NTMzMTZmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzZfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC40OTg4MTNmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC40Mzc2NTlmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4zNjkwNDNmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yOTIwNTRmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzJfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMDU2NzJmCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzFfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4xMDg3NDlmCisjZGVmaW5lIExWRVFOQl9HYWluXzBfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIExWRVFOQl9HYWluXzFfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjIwMThmCisjZGVmaW5lIExWRVFOQl9HYWluXzJfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTg5MjVmCisjZGVmaW5lIExWRVFOQl9HYWluXzNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40MTI1MzhmCisjZGVmaW5lIExWRVFOQl9HYWluXzRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41ODQ4OTNmCisjZGVmaW5lIExWRVFOQl9HYWluXzVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC43NzgyNzlmCisjZGVmaW5lIExWRVFOQl9HYWluXzZfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTUyNjJmCisjZGVmaW5lIExWRVFOQl9HYWluXzdfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMzg3MjFmCisjZGVmaW5lIExWRVFOQl9HYWluXzhfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS41MTE4ODZmCisjZGVmaW5lIExWRVFOQl9HYWluXzlfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS44MTgzODNmCisjZGVmaW5lIExWRVFOQl9HYWluXzEwX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4xNjIyNzhmCisjZGVmaW5lIExWRVFOQl9HYWluXzExX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi41NDgxMzRmCisjZGVmaW5lIExWRVFOQl9HYWluXzEyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi45ODEwNzJmCisjZGVmaW5lIExWRVFOQl9HYWluXzEzX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy40NjY4MzZmCisjZGVmaW5lIExWRVFOQl9HYWluXzE0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC4wMTE4NzJmCisjZGVmaW5lIExWRVFOQl9HYWluXzE1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC42MjM0MTNmCisjZWxzZQogI2RlZmluZSBMVkVRTkJfR0FJTlNISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMSAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLwogI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMTY4NCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjgyMjE3MiAqLwogI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMTYzOSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjgwMDQ3NCAqLwpAQCAtNTgsMTQgKzkwLDMwIEBACiAjZGVmaW5lIExWRVFOQl9HYWluXzEzX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMy40NjY4MzYgKi8KICNkZWZpbmUgTFZFUU5CX0dhaW5fMTRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgyMTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSA0LjAxMTg3MiAqLwogI2RlZmluZSBMVkVRTkJfR2Fpbl8xNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTQ2OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDQuNjIzNDEzICovCi0KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZyZXF1ZW5jeSB0YWJsZSBmb3IgMipQaS9GcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorI2RlZmluZSBMVkVRTkJfMlBpT25fODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDA3ODVmCisjZGVmaW5lIExWRVFOQl8yUGlPbl8xMTAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDU3MGYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzEyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwNTI0ZgorI2RlZmluZSBMVkVRTkJfMlBpT25fMTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAzOTNmCisjZGVmaW5lIExWRVFOQl8yUGlPbl8yMjA1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDI4NWYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzI0MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMjYyZgorI2RlZmluZSBMVkVRTkJfMlBpT25fMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAxOTZmCisjZGVmaW5lIExWRVFOQl8yUGlPbl80NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDE0MmYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMTMxZgogCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIExWRVFOQl8yUGlPbl85NjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDA2NWYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDMzZgorI2VuZGlmCisKKyNlbHNlCiAjZGVmaW5lIExWRVFOQl9GUkVRU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1ICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCiAjZGVmaW5lIExWRVFOQl8yUGlPbl84MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2MzU0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDA3ODUgKi8KICNkZWZpbmUgTFZFUU5CXzJQaU9uXzExMDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkxMjMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDU3MCAqLwpAQCAtNzYsMTQgKzEyNCwzMSBAQAogI2RlZmluZSBMVkVRTkJfMlBpT25fMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjU4OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMTk2ICovCiAjZGVmaW5lIExWRVFOQl8yUGlPbl80NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NzgxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAxNDIgKi8KICNkZWZpbmUgTFZFUU5CXzJQaU9uXzQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzOTIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDEzMSAqLwotCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA1MEQgdGFibGUgZm9yIDUwIC8gKCAxICsgR2FpbiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNS42MjM0MTNmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzE0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LjAxMTg3MmYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNDY2ODM2ZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxMl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy45ODEwNzJmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzExX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjU0ODEzNGYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTBfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMTYyMjc4ZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc5X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi44MTgzODNmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzhfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjUxMTg4NmYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnN19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMjM4NzIxZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc2X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS45OTUyNjJmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc3ODI3OWYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNTg0ODkzZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWczX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40MTI1MzhmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzJfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjI1ODkyNWYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTIyMDE4ZgorI2RlZmluZSBMVkVRTkJfMTAwRF8wX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wMDAwMDBmCisjZWxzZQogI2RlZmluZSBMVkVRTkJfMTAwRFNISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLwogI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzk5NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDUuNjIzNDEzICovCiAjZGVmaW5lIExWRVFOQl8xMDBEX05lZzE0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MDM4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgNS4wMTE4NzIgKi8KQEAgLTEwMSw2ICsxNjYsNiBAQAogI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAyOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMjU4OTI1ICovCiAjZGVmaW5lIExWRVFOQl8xMDBEX05lZzFfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNTkwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4xMjIwMTggKi8KICNkZWZpbmUgTFZFUU5CXzEwMERfMF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjAwMDAwMCAqLwotCisjZW5kaWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db250cm9sLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db250cm9sLmMKaW5kZXggMTBlN2Q3NC4uYzI5MGFlYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29udHJvbC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvbnRyb2wuYwpAQCAtMTQwLDggKzE0MCwxMiBAQAogdm9pZCAgICBMVkVRTkJfU2V0RmlsdGVycyhMVkVRTkJfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQogewotCisjaWZkZWYgSElHSEVSX0ZTCisgICAgZXh0ZXJuIGNvbnN0IExWTV9VSU5UMzIgICBMVkVRTkJfU2FtcGxlUmF0ZVRhYltdOyAgICAgICAgICAgLyogU2FtcGxlIHJhdGUgdGFibGUgKi8KKyNlbHNlCiAgICAgZXh0ZXJuIGNvbnN0IExWTV9VSU5UMTYgICBMVkVRTkJfU2FtcGxlUmF0ZVRhYltdOyAgICAgICAgICAgLyogU2FtcGxlIHJhdGUgdGFibGUgKi8KKyNlbmRpZgorCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGJhbmQgaW5kZXggKi8KICAgICBMVk1fVUlOVDMyICAgICAgICAgIGZzID0gKExWTV9VSU5UMzIpTFZFUU5CX1NhbXBsZVJhdGVUYWJbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07ICAvKiBTYW1wbGUgcmF0ZSAqLwogICAgIExWTV9VSU5UMzIgICAgICAgICAgZmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBjZW50cmUgZnJlcXVlbmN5ICovCkBAIC0xNTgsMTEgKzE2MiwxNSBAQAogICAgICAgICBmYyA9IChMVk1fVUlOVDMyKXBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXS5GcmVxdWVuY3k7ICAgICAvKiBHZXQgdGhlIGJhbmQgY2VudHJlIGZyZXF1ZW5jeSAqLwogICAgICAgICBRRmFjdG9yID0gKExWTV9JTlQxNilwUGFyYW1zLT5wQmFuZERlZmluaXRpb25baV0uUUZhY3RvcjsgICAvKiBHZXQgdGhlIGJhbmQgUSBmYWN0b3IgKi8KIAotCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgcEluc3RhbmNlLT5wQmlxdWFkVHlwZVtpXSA9IExWRVFOQl9TaW5nbGVQcmVjaXNpb25fRmxvYXQ7IC8qIERlZmF1bHQgdG8gc2luZ2xlIHByZWNpc2lvbiAqLworI2Vsc2UKICAgICAgICAgLyoKICAgICAgICAgICogRm9yIGVhY2ggZmlsdGVyIHNldCB0aGUgdHlwZSBvZiBiaXF1YWQgcmVxdWlyZWQKICAgICAgICAgICovCiAgICAgICAgIHBJbnN0YW5jZS0+cEJpcXVhZFR5cGVbaV0gPSBMVkVRTkJfU2luZ2xlUHJlY2lzaW9uOyAgICAgICAgIC8qIERlZmF1bHQgdG8gc2luZ2xlIHByZWNpc2lvbiAqLworI2VuZGlmCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIGlmICgoZmMgPDwgMTUpIDw9IChMT1dfRlJFUSAqIGZzKSkKICAgICAgICAgewogICAgICAgICAgICAgLyoKQEAgLTE3Nyw3ICsxODUsNyBAQAogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBwSW5zdGFuY2UtPnBCaXF1YWRUeXBlW2ldID0gTFZFUU5CX0RvdWJsZVByZWNpc2lvbjsKICAgICAgICAgfQotCisjZW5kaWYKIAogICAgICAgICAvKgogICAgICAgICAgKiBDaGVjayBmb3Igb3V0IG9mIHJhbmdlIGZyZXF1ZW5jaWVzCkBAIC0yMzAsNiArMjM4LDI1IEBACiAgICAgICAgIEJpcXVhZFR5cGUgPSBwSW5zdGFuY2UtPnBCaXF1YWRUeXBlW2ldOwogICAgICAgICBzd2l0Y2ggIChCaXF1YWRUeXBlKQogICAgICAgICB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgIGNhc2UgICAgTFZFUU5CX1NpbmdsZVByZWNpc2lvbl9GbG9hdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQS19GTE9BVF9Db2Vmc190ICAgICAgQ29lZmZpY2llbnRzOworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBzaW5nbGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIExWRVFOQl9TaW5nbGVQcmVjQ29lZnMoKExWTV9VSU5UMTYpcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFNldCB0aGUgY29lZmZpY2llbnRzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5wRVFOQl9GaWx0ZXJTdGF0ZV9GbG9hdFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBFUU5CX1RhcHNfRmxvYXRbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyNlbHNlCiAgICAgICAgICAgICBjYXNlICAgIExWRVFOQl9Eb3VibGVQcmVjaXNpb246CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgUEtfQzMyX0NvZWZzX3QgICAgICBDb2VmZmljaWVudHM7CkBAIC0yNjksNiArMjk2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQorI2VuZGlmCiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yODgsNyArMzE2LDcgQEAKIC8qICBwSW5zdGFuY2UgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCAgICBMVkVRTkJfQ2xlYXJGaWx0ZXJIaXN0b3J5KExWRVFOQl9JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlKQogewogICAgIExWTV9JTlQxNiAgICAgICAqcFRhcEFkZHJlc3M7CkBAIC0zMDUsOCArMzMzLDI0IEBACiAgICAgICAgICAgICAgICAgICAgICBOdW1UYXBzKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB3b3JkcyAqLwogICAgIH0KIH0KKyNlbHNlCit2b2lkICAgIExWRVFOQl9DbGVhckZpbHRlckhpc3RvcnkoTFZFUU5CX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UpCit7CisgICAgTFZNX0ZMT0FUICAgICAgICpwVGFwQWRkcmVzczsKKyAgICBMVk1fSU5UMTYgICAgICAgTnVtVGFwczsKIAorICAgIHBUYXBBZGRyZXNzID0gKExWTV9GTE9BVCAqKXBJbnN0YW5jZS0+cEVRTkJfVGFwc19GbG9hdDsKKyAgICBOdW1UYXBzICAgICA9IChMVk1fSU5UMTYpKChwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCYW5kcyAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkpIC8gc2l6ZW9mKExWTV9GTE9BVCkpOwogCisgICAgaWYgKE51bVRhcHMgIT0gMCkKKyAgICB7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBoaXN0b3J5LCB2YWx1ZSAwICovCisgICAgICAgICAgICAgICAgICAgICAgICBwVGFwQWRkcmVzcywgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICBOdW1UYXBzKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB3b3JkcyAqLworICAgIH0KK30KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkVRTkJfQ29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDIyLDkgKzQ2NiwxMyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBpZihwUGFyYW1zLT5PcGVyYXRpbmdNb2RlID09IExWRVFOQl9PTikKICAgICAgICAgICAgIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sIDEuMGYpOworICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sIDAuMGYpOworI2Vsc2UKICAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLExWTV9NQVhJTlRfMTYpOwogICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sMCk7Ci0KKyNlbmRpZgogICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgICAgICAgID0gMTsKICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ICAgICAgICA9IDE7CiAgICAgICAgICAgICB9CkBAIC00MzIsMTUgKzQ4MCwxOCBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8qIFN0YXkgb24gdGhlIE9OIG9wZXJhdGluZyBtb2RlIHVudGlsIHRoZSB0cmFuc2l0aW9uIGlzIGRvbmUgKi8KICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZFUU5CX09OOwotCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLCAwLjBmKTsKKyAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLCAxLjBmKTsKKyNlbHNlCiAgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwwKTsKICAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLExWTV9NQVhJTlRfMTYpOworI2VuZGlmCiAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCAgICAgICAgPSAxOwogICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgICAgICAgID0gMTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sTFZFUU5CX0JZUEFTU19NSVhFUl9UQywoTFZNX0ZzX2VuKXBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLExWRVFOQl9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOwotCiAgICAgICAgICAgICBwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uID0gTFZNX1RSVUU7CiAgICAgICAgIH0KIApAQCAtNDcwLDggKzUyMSwxMyBAQAogICAgICAvKgogICAgICAgKiBTZW5kIGFuIEFMR09GRiBldmVudCBpZiB0aGUgT04tPk9GRiBzd2l0Y2ggdHJhbnNpdGlvbiBpcyBmaW5pc2hlZAogICAgICAgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIGlmKChMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKSA9PSAwKSAmJgorICAgICAgIChDYWxsYmFja1BhcmFtID09IDApKXsKKyNlbHNlCiAgICAgaWYoKExWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pID09IDB4MDAwMDAwMDApICYmCiAgICAgICAgKENhbGxiYWNrUGFyYW0gPT0gMCkpeworI2VuZGlmCiAgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVkVRTkJfQllQQVNTOwogICAgICAgICBpZiAoQ2FsbEJhY2sgIT0gTFZNX05VTEwpewogICAgICAgICAgICAgQ2FsbEJhY2socEluc3RhbmNlLT5DYXBhYmlsaXRpZXMucEJ1bmRsZUluc3RhbmNlLCBMVk1fTlVMTCwgQUxHT1JJVEhNX0VRTkJfSUR8TFZFUU5CX0VWRU5UX0FMR09GRik7CkBAIC00ODUsOSArNTQxLDMgQEAKIAogICAgIHJldHVybiAxOwogfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfSW5pdC5jCmluZGV4IGUwMWMxYzUuLmRlMWJiYjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Jbml0LmMKQEAgLTk3LDYgKzk3LDIxIEBACiAgICAgICAgICAqLwogICAgICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCiAgICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMKTsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QpKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkpOworICAgICAgICAvKiBFcXVhbGlzZXIgQmlxdWFkIFRhcHMgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190KSkpOworICAgICAgICAvKiBGaWx0ZXIgZGVmaW5pdGlvbnMgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKExWRVFOQl9CYW5kRGVmX3QpKSk7CisgICAgICAgIC8qIEJpcXVhZCB0eXBlcyAqLworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoTFZFUU5CX0JpcXVhZFR5cGVfZW4pKSk7CisjZWxzZQogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QpKTsKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciAqLwpAQCAtMTA3LDYgKzEyMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKExWRVFOQl9CYW5kRGVmX3QpKSk7ICAgICAgICAvKiBGaWx0ZXIgZGVmaW5pdGlvbnMgKi8KICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKExWRVFOQl9CaXF1YWRUeXBlX2VuKSkpOyAgICAvKiBCaXF1YWQgdHlwZXMgKi8KKyNlbmRpZgogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZBbGxvY01lbSk7CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5BbGlnbm1lbnQgICAgPSBMVkVRTkJfREFUQV9BTElHTjsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlR5cGUgICAgICAgICA9IExWRVFOQl9QRVJTSVNURU5UX0RBVEE7CkBAIC0xMTcsMTIgKzEzMywyMiBAQAogICAgICAgICAgKi8KICAgICAgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAogICAgICAgICAgICAgICAgICAgICAgICBMVk1fTlVMTCk7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpKTsKKyAgICAgICAgLyogRXF1YWxpc2VyIEJpcXVhZCBJbnN0YW5jZSAqLworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCkpOworI2Vsc2UKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF9JbnN0YW5jZV90KSk7CiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkX0luc3RhbmNlX3QpKTsKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoQmlxdWFkX0luc3RhbmNlX3QpKTsgLyogRXF1YWxpc2VyIEJpcXVhZCBJbnN0YW5jZSAqLworI2VuZGlmCiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtKTsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLkFsaWdubWVudCAgICA9IExWRVFOQl9DT0VGX0FMSUdOOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uVHlwZSAgICAgICAgID0gTFZFUU5CX1BFUlNJU1RFTlRfQ09FRjsKQEAgLTEzMyw4ICsxNTksMTQgQEAKICAgICAgICAgICovCiAgICAgICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKICAgICAgICAgICAgICAgICAgICAgICAgTFZNX05VTEwpOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9TQ1JBVENIQlVGRkVSUyAqIHNpemVvZihMVk1fRkxPQVQpICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKTsKKyNlbHNlCiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9TQ1JBVENIQlVGRkVSUypzaXplb2YoTFZNX0lOVDE2KSpwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpOworI2VuZGlmCiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fU0NSQVRDSF0uU2l6ZSAgICAgICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtKTsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIXS5BbGlnbm1lbnQgICAgICAgICA9IExWRVFOQl9TQ1JBVENIX0FMSUdOOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1NDUkFUQ0hdLlR5cGUgICAgICAgICAgICAgID0gTFZFUU5CX1NDUkFUQ0g7CkBAIC0yNDgsOCArMjgwLDE1IEBACiAgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAogICAgICAgICAgICAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MpOwogCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAvKiBFcXVhbGlzZXIgQmlxdWFkIEluc3RhbmNlICovCisgICAgcEluc3RhbmNlLT5wRVFOQl9GaWx0ZXJTdGF0ZV9GbG9hdCA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCkpOworI2Vsc2UKICAgICBwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoQmlxdWFkX0luc3RhbmNlX3QpKTsgLyogRXF1YWxpc2VyIEJpcXVhZCBJbnN0YW5jZSAqLworI2VuZGlmCiAKIAogCkBAIC0yNTksOSArMjk4LDE1IEBACiAgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAogICAgICAgICAgICAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MpOwogCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBNZW1TaXplID0gKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190KSk7CisgICAgcEluc3RhbmNlLT5wRVFOQl9UYXBzX0Zsb2F0ID0gKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1TaXplKTsKKyNlbHNlCiAgICAgTWVtU2l6ZSA9IChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCkpOwogICAgIHBJbnN0YW5jZS0+cEVRTkJfVGFwcyA9IChCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtU2l6ZSk7CisjZW5kaWYKICAgICBNZW1TaXplID0gKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKExWRVFOQl9CYW5kRGVmX3QpKTsKICAgICBwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnMgID0gKExWRVFOQl9CYW5kRGVmX3QgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVNpemUpOwpAQCAtMjc5LDggKzMyNCwxMyBAQAogICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKICAgICAgICAgICAgICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzcyk7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIHBJbnN0YW5jZS0+cEZhc3RUZW1wb3JhcnkgPSAoTFZNX0ZMT0FUICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKKyNlbHNlCiAgICAgcEluc3RhbmNlLT5wRmFzdFRlbXBvcmFyeSA9IChMVk1fSU5UMTYgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9JTlQxNikpOworI2VuZGlmCiAKICAgICAvKgogICAgICAqIFVwZGF0ZSB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycwpAQCAtMzA4LDE1ICszNTgsMjIgQEAKICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gICAgICA9IDA7CiAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgICAgPSAodm9pZCopcEluc3RhbmNlOwogICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICAgICAgICAgID0gTFZFUU5CX0J5cGFzc01peGVyQ2FsbEJhY2s7CisKICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwwLDApOwogICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sMCxMVk1fRlNfODAwMCwyKTsKIAorCiAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCAgICAgICAgPSAxOwogICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSAgICAgID0gMDsKICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSAgICA9IExWTV9OVUxMOwogICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0ucENhbGxCYWNrICAgICAgICAgID0gTFZNX05VTEw7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwgMCwgMS4wZik7CisgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwgMCwgTFZNX0ZTXzgwMDAsIDIpOworI2Vsc2UKICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwwLExWTV9NQVhJTlRfMTYpOwogICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sMCxMVk1fRlNfODAwMCwyKTsKKyNlbmRpZgogCiAgICAgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiAgICAgID0gTFZNX0ZBTFNFOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcml2YXRlLmgKaW5kZXggOWRmOTgwYy4uNTZiMDJlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1ByaXZhdGUuaApAQCAtNjAsNiArNjAsOSBAQAogLyogRmlsdGVyIGJpcXVhZCB0eXBlcyAqLwogdHlwZWRlZiBlbnVtCiB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVkVRTkJfU2luZ2xlUHJlY2lzaW9uX0Zsb2F0ID0gLTEsCisjZW5kaWYKICAgICBMVkVRTkJfU2luZ2xlUHJlY2lzaW9uID0gMCwKICAgICBMVkVRTkJfRG91YmxlUHJlY2lzaW9uID0gMSwKICAgICBMVkVRTkJfT3V0T2ZSYW5nZSAgICAgID0gMiwKQEAgLTg0LDExICs4NywyMCBAQAogICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCAgICAgICAgICAgQ2FwYWJpbGl0aWVzOyAgICAgICAvKiBJbnN0YW5jZSBjYXBhYmlsaXRpZXMgKi8KIAogICAgIC8qIEFsaWduZWQgbWVtb3J5IHBvaW50ZXJzICovCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgKnBGYXN0VGVtcG9yYXJ5OyAgICAgICAgLyogRmFzdCB0ZW1wb3JhcnkgZGF0YSBiYXNlIGFkZHJlc3MgKi8KKyNlbHNlCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICpwRmFzdFRlbXBvcmFyeTsgICAgICAgIC8qIEZhc3QgdGVtcG9yYXJ5IGRhdGEgYmFzZSBhZGRyZXNzICovCisjZW5kaWYKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcEVRTkJfVGFwc19GbG9hdDsgICAgICAgIC8qIEVxdWFsaXNlciBUYXBzICovCisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEVRTkJfRmlsdGVyU3RhdGVfRmxvYXQ7IC8qIFN0YXRlIGZvciBlYWNoIGZpbHRlciBiYW5kICovCisjZWxzZQogICAgIC8qIFByb2Nlc3MgdmFyaWFibGVzICovCiAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgICAgICAgICAqcEVRTkJfVGFwczsgICAgICAgIC8qIEVxdWFsaXNlciBUYXBzICovCiAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAgICAgICAqcEVRTkJfRmlsdGVyU3RhdGU7IC8qIFN0YXRlIGZvciBlYWNoIGZpbHRlciBiYW5kICovCisjZW5kaWYKIAogICAgIC8qIEZpbHRlciBkZWZpbml0aW9ucyBhbmQgY2FsbCBiYWNrICovCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgICAgICBOQmFuZHM7ICAgICAgICAgICAgIC8qIE51bWJlciBvZiBiYW5kcyAqLwpAQCAtOTYsNyArMTA4LDEyIEBACiAgICAgTFZFUU5CX0JpcXVhZFR5cGVfZW4gICAgICAgICAgICAqcEJpcXVhZFR5cGU7ICAgICAgIC8qIEZpbHRlciBiaXF1YWQgdHlwZXMgKi8KIAogICAgIC8qIEJ5cGFzcyB2YXJpYWJsZSAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICAgICBCeXBhc3NNaXhlcjsKKyNlbHNlCiAgICAgTFZNaXhlcjNfMlN0X3N0ICAgICAgICAgICBCeXBhc3NNaXhlcjsgICAgICAgICAgICAgIC8qIEJ5cGFzcyBtaXhlciB1c2VkIGluIHRyYW5zaXRpb25zICovCisjZW5kaWYKKwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIGJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uOyAvKiBPcGVyYXRpbmcgbW9kZSB0cmFuc2l0aW9uIGZsYWcgKi8KIAogfSBMVkVRTkJfSW5zdGFuY2VfdDsKQEAgLTExNCw3ICsxMzEsMTEgQEAKIHZvaWQgICAgTFZFUU5CX1NldENvZWZmaWNpZW50cyhMVkVRTkJfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlKTsKIAogdm9pZCAgICBMVkVRTkJfQ2xlYXJGaWx0ZXJIaXN0b3J5KExWRVFOQl9JbnN0YW5jZV90ICpwSW5zdGFuY2UpOwotCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1NpbmdsZVByZWNDb2VmcyhMVk1fVUlOVDE2ICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQmFuZERlZl90ICAqcEZpbHRlckRlZmluaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfRkxPQVRfQ29lZnNfdCAgICAqcENvZWZmaWNpZW50cyk7CisjZWxzZQogTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfU2luZ2xlUHJlY0NvZWZzKExWTV9VSU5UMTYgICAgICAgIEZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9CYW5kRGVmX3QgICpwRmlsdGVyRGVmaW5pdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMTZfQ29lZnNfdCAgICAqcENvZWZmaWNpZW50cyk7CkBAIC0xMjIsNiArMTQzLDcgQEAKIExWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0RvdWJsZVByZWNDb2VmcyhMVk1fVUlOVDE2ICAgICAgICBGcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQmFuZERlZl90ICAqcEZpbHRlckRlZmluaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzMyX0NvZWZzX3QgICAgKnBDb2VmZmljaWVudHMpOworI2VuZGlmCiAKIExWTV9JTlQzMiBMVkVRTkJfQnlwYXNzTWl4ZXJDYWxsQmFjayAodm9pZCogaEluc3RhbmNlLCB2b2lkICpwR2VuZXJhbFB1cnBvc2UsIExWTV9JTlQxNiBDYWxsYmFja1BhcmFtKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jCmluZGV4IDU4ZjU4ZWQuLjYzMjgxODEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1Byb2Nlc3MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMKQEAgLTU3LDcgKzU3LDEyMSBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Qcm9jZXNzKExWRVFOQl9IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpCit7CiAKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgIGk7CisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAqcEJpcXVhZDsKKyAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UgPSAoTFZFUU5CX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBTY3JhdGNoOworCisKKyAgICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgKi8KKyAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEluRGF0YSA9PSBMVk1fTlVMTCkgfHwgKHBPdXREYXRhID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiBMVkVRTkJfTlVMTEFERFJFU1M7CisgICAgfQorCisgICAgLyogQ2hlY2sgaWYgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YSBidWZmZXJzIGFyZSAzMi1iaXQgYWxpZ25lZCAqLworICAgIGlmICgoKCh1aW50cHRyX3QpcEluRGF0YSAlIDQpICE9IDApIHx8ICgoKHVpbnRwdHJfdClwT3V0RGF0YSAlIDQpICE9IDApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWRVFOQl9BTElHTk1FTlRFUlJPUjsKKyAgICB9CisKKyAgICBwU2NyYXRjaCAgPSAoTFZNX0ZMT0FUICopcEluc3RhbmNlLT5wRmFzdFRlbXBvcmFyeTsKKworICAgIC8qCisgICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgbm90IHRvbyBsYXJnZQorICAgICovCisgICAgaWYgKE51bVNhbXBsZXMgPiBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUpCisgICAgeworICAgICAgICByZXR1cm4oTFZFUU5CX1RPT01BTllTQU1QTEVTKTsKKyAgICB9CisKKyAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVkVRTkJfT04pCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBDb3B5IGlucHV0IGRhdGEgaW4gdG8gc2NyYXRjaCBidWZmZXIKKyAgICAgICAgICovCisKKyAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7IC8qIExlZnQgYW5kIFJpZ2h0ICovCisgICAgICAgIC8qCisgICAgICAgICAqIEZvciBlYWNoIHNlY3Rpb24gZXhlY3RlIHRoZSBmaWx0ZXIgdW5sZXNzIHRoZSBnYWluIGlzIDBkQgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+TkJhbmRzICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwSW5zdGFuY2UtPk5CYW5kczsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgYmFuZCBpcyBub24temVybyBkQiBnYWluCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5HYWluICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGJpcXVhZCBpbnN0YW5jZQorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgcEJpcXVhZCA9ICZwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlX0Zsb2F0W2ldOworCisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogU2VsZWN0IHNpbmdsZSBvciBkb3VibGUgcHJlY2lzaW9uIGFzIHJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBJbnN0YW5jZS0+cEJpcXVhZFR5cGVbaV0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTFZFUU5CX1NpbmdsZVByZWNpc2lvbl9GbG9hdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMShwQmlxdWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIGlmKHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gPT0gTFZNX1RSVUUpeworICAgICAgICAgICAgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7CisgICAgICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQqKXBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgYW5kIFJpZ2h0IHNhbXBsZXMgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNleworICAgICAgICAgICAgQ29weV9GbG9hdChwU2NyYXRjaCwgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKSgyICogTnVtU2FtcGxlcykpOyAvKiBMZWZ0IGFuZCBSaWdodCAqLworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIE1vZGUgaXMgT0ZGIHNvIGNvcHkgdGhlIGRhdGEgaWYgbmVjZXNzYXJ5CisgICAgICAgICAqLworICAgICAgICBpZiAocEluRGF0YSAhPSBwT3V0RGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgQ29weV9GbG9hdChwSW5EYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAvKiBMZWZ0IGFuZCBSaWdodCBzYW1wbGVzICovCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKKworfQorI2Vsc2UKIExWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1Byb2Nlc3MoTFZFUU5CX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKnBPdXREYXRhLApAQCAtMTk4LDMgKzMxMiw0IEBACiAgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKIAogfQorI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuYwppbmRleCA4ZTJlMGU4Li41NjMxODFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuYwpAQCAtMzYsNiArMzYsMjAgQEAKICAqIFNhbXBsZSByYXRlIHRhYmxlIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gdGhlIGVudW1lcmF0ZWQgdHlwZSBhbmQgdGhlIGFjdHVhbAogICogZnJlcXVlbmN5CiAgKi8KKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKK2NvbnN0IExWTV9VSU5UMzIgICAgTFZFUU5CX1NhbXBsZVJhdGVUYWJbXSA9IHs4MDAwLCAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIwNTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkyMDAwCit9OworI2Vsc2UKIGNvbnN0IExWTV9VSU5UMTYgICAgTFZFUU5CX1NhbXBsZVJhdGVUYWJbXSA9IHs4MDAwLCAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwMDAsCkBAIC00NCw4ICs1OCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDB9OyAgICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyAqLwotCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDAKK307CisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01Niw2ICs3MSwyMiBAQAogLyoKICAqIFRhYmxlIGZvciAyICogUGkgLyBGcwogICovCisjaWZkZWYgQlVJTERfRkxPQVQKK2NvbnN0IExWTV9GTE9BVCAgICAgTFZFUU5CX1R3b1BpT25Gc1RhYmxlW10gPSB7TFZFUU5CXzJQaU9uXzgwMDAsICAgICAgLyogOGtTL3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzExMDI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMTIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8xNjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzIyMDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMjQwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8zMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzQ0MTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fNDgwMDAKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTFZFUU5CXzJQaU9uXzk2MDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWRVFOQl8yUGlPbl8xOTIwMDAKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworI2Vsc2UKIGNvbnN0IExWTV9JTlQxNiAgICAgTFZFUU5CX1R3b1BpT25Gc1RhYmxlW10gPSB7TFZFUU5CXzJQaU9uXzgwMDAsICAgICAgLyogOGtTL3MgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzExMDI1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMTIwMDAsCkBAIC02NSwxMCArOTYsNDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzMyMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fNDQxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl80ODAwMH07ICAgIC8qIDQ4a1MvcyAqLworI2VuZGlmCiAKIC8qCiAgKiBHYWluIHRhYmxlCiAgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorY29uc3QgTFZNX0ZMT0FUICAgICBMVkVRTkJfR2FpblRhYmxlW10gPSB7TFZFUU5CX0dhaW5fTmVnMTVfZEIsICAgICAgICAvKiAtMTVkQiBnYWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxNF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzEzX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTJfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxMV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzEwX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnOV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzhfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWc3X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnNl9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzVfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWc0X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnM19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzJfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMF9kQiwgICAgICAgICAgICAvKiAwZEIgZ2FpbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzJfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8zX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fNF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzVfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl82X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fN19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzhfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl85X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTBfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xMV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzEyX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTNfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xNF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzE1X2RCfTsgICAgICAgICAgLyogKzE1ZEIgZ2FpbiAqLworI2Vsc2UKIGNvbnN0IExWTV9JTlQxNiAgICAgTFZFUU5CX0dhaW5UYWJsZVtdID0ge0xWRVFOQl9HYWluX05lZzE1X2RCLCAgICAgICAgLyogLTE1ZEIgZ2FpbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTRfZEIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxM19kQiwKQEAgLTEwMSwxMCArMTY2LDI4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xNF9kQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzE1X2RCfTsgICAgICAgICAgLyogKzE1ZEIgZ2FpbiAqLwogCi0KKyNlbmRpZgogLyoKICAqIEQgdGFibGUgZm9yIDEwMCAvIChHYWluICsgMSkKICAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitjb25zdCBMVk1fRkxPQVQgICAgTFZFUU5CX0RUYWJsZVtdID0ge0xWRVFOQl8xMDBEX05lZzE1X2RCLCAgICAgICAgICAgIC8qIC0xNWRCIGdhaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTRfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzEzX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxMl9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTFfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzEwX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc5X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc4X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc3X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc2X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc1X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc0X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWczX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcyX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF8wX2RCfTsgICAgICAgICAgICAgICAvKiAwZEIgZ2FpbiAqLworI2Vsc2UKIGNvbnN0IExWTV9JTlQxNiAgICBMVkVRTkJfRFRhYmxlW10gPSB7TFZFUU5CXzEwMERfTmVnMTVfZEIsICAgICAgICAgICAgLyogLTE1ZEIgZ2FpbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxNF9kQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTNfZEIsCkBAIC0xMjIsNyArMjA1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMV9kQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfMF9kQn07ICAgICAgICAgICAgICAgLyogMGRCIGdhaW4gKi8KIAotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgRmlsdGVyIHBvbHlub21pYWwgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvbGliL0xWUkVWLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL2xpYi9MVlJFVi5oCmluZGV4IDI4ZTMzNjkuLjljMmUyOTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvbGliL0xWUkVWLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9saWIvTFZSRVYuaApAQCAtMTA3LDggKzEwNywxNCBAQAogCiAgICAgLyogUGFyYW1ldGVycyBmb3IgUkVWICovCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIExldmVsOyAgICAgICAgICAgICAgICAgIC8qIExldmVsLCAwIHRvIDEwMCByZXByZXNlbnRpbmcgcGVyY2VudGFnZSBvZiByZXZlcmIgKi8KKyNpZm5kZWYgSElHSEVSX0ZTCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIExQRjsgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciwgaW4gSHogKi8KICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgSFBGOyAgICAgICAgICAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciwgaW4gSHogKi8KKyNlbHNlCisgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIExQRjsgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciwgaW4gSHogKi8KKyAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgSFBGOyAgICAgICAgICAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciwgaW4gSHogKi8KKyNlbmRpZgorCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIFQ2MDsgICAgICAgICAgICAgICAgICAgIC8qIERlY2F5IHRpbWUgY29uc3RhbnQsIGluIG1zICovCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIERlbnNpdHk7ICAgICAgICAgICAgICAgIC8qIEVjaG8gZGVuc2l0eSwgMCB0byAxMDAgZm9yIG1pbmltdW0gdG8gbWF4aW11bSBkZW5zaXR5ICovCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIERhbXBpbmc7ICAgICAgICAgICAgICAgIC8qIERhbXBpbmcgKi8KQEAgLTI5NywxMSArMzAzLDE3IEBACiAvKiAgMS4gVGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBtdXN0IGJlIDMyLWJpdCBhbGlnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9Qcm9jZXNzKExWUkVWX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX1VJTlQxNiAgICAgICAgICBOdW1TYW1wbGVzKTsKKyNlbHNlCiBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfUHJvY2VzcyhMVlJFVl9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICpwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9VSU5UMTYgICAgICAgICAgTnVtU2FtcGxlcyk7Ci0KKyNlbmRpZgogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0FwcGx5TmV3U2V0dGluZ3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0FwcGx5TmV3U2V0dGluZ3MuYwppbmRleCBhYzJlZjlkLi5lNzEwODQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9BcHBseU5ld1NldHRpbmdzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfQXBwbHlOZXdTZXR0aW5ncy5jCkBAIC00MSw2ICs0MSw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfQXBwbHlOZXdTZXR0aW5ncyAoTFZSRVZfSW5zdGFuY2Vfc3QgICAgICpwUHJpdmF0ZSkKIHsKIApAQCAtNTkzLDggKzU5NCw1ODkgQEAKIAogICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOwogfQorI2Vsc2UgLyogQlVJTERfRkxPQVQqLworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0FwcGx5TmV3U2V0dGluZ3MgKExWUkVWX0luc3RhbmNlX3N0ICAgICAqcFByaXZhdGUpCit7CisKKyAgICBMVk1fTW9kZV9lbiAgT3BlcmF0aW5nTW9kZTsKKyAgICBMVk1fSU5UMzIgICAgTnVtYmVyT2ZEZWxheUxpbmVzOwogCiAKKyAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVyICovCisgICAgaWYocFByaXZhdGUgPT0gTFZNX05VTEwpCisgICAgeworICAgICAgICByZXR1cm4gTFZSRVZfTlVMTEFERFJFU1M7CisgICAgfQorCisgICAgT3BlcmF0aW5nTW9kZSA9IHBQcml2YXRlLT5OZXdQYXJhbXMuT3BlcmF0aW5nTW9kZTsKKworICAgIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQorICAgIHsKKyAgICAgICAgTnVtYmVyT2ZEZWxheUxpbmVzID0gNDsKKyAgICB9CisgICAgZWxzZSBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKKyAgICB7CisgICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDE7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzCisgICAgICovCisgICAgaWYoKHBQcml2YXRlLT5OZXdQYXJhbXMuSFBGICAgICAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5IUEYpICAgICAgICB8fAorICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKKyAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgICAgID09IExWTV9UUlVFKSkKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAgICAgICBPbWVnYTsKKyAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgQ29lZmZzOworCisgICAgICAgIE9tZWdhID0gTFZNX0dldE9tZWdhKHBQcml2YXRlLT5OZXdQYXJhbXMuSFBGLCBwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpOworICAgICAgICBMVk1fRk9fSFBGKE9tZWdhLCAmQ29lZmZzKTsKKyAgICAgICAgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggJnBQcml2YXRlLT5wRmFzdENvZWYtPkhQQ29lZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUHJpdmF0ZS0+cEZhc3REYXRhLT5IUFRhcHMsICZDb2VmZnMpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBQcml2YXRlLT5wRmFzdERhdGEtPkhQVGFwcywgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190KSAvIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBsb3cgcGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzCisgICAgICovCisgICAgaWYoKHBQcml2YXRlLT5OZXdQYXJhbXMuTFBGICAgICAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5MUEYpICAgICAgICB8fAorICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKKyAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgICAgID09IExWTV9UUlVFKSkKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAgICAgICBPbWVnYTsKKyAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgQ29lZmZzOworCisgICAgICAgIENvZWZmcy5BMCA9IDE7CisgICAgICAgIENvZWZmcy5BMSA9IDA7CisgICAgICAgIENvZWZmcy5CMSA9IDA7CisgICAgICAgIGlmKHBQcml2YXRlLT5OZXdQYXJhbXMuTFBGIDw9IChMVk1fRnNUYWJsZVtwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGVdID4+IDEpKQorICAgICAgICB7CisgICAgICAgICAgICBPbWVnYSA9IExWTV9HZXRPbWVnYShwUHJpdmF0ZS0+TmV3UGFyYW1zLkxQRiwgcFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIERvIG5vdCBhcHBseSBmaWx0ZXIgaWYgdyA9MipwaSpmYy9mcyA+PSAyLjkKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYoT21lZ2EgPD0gKExWTV9GTE9BVClMVlJFVl8yXzlfSU5RMjkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTFZNX0ZPX0xQRihPbWVnYSwgJkNvZWZmcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggJnBQcml2YXRlLT5wRmFzdENvZWYtPkxQQ29lZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUHJpdmF0ZS0+cEZhc3REYXRhLT5MUFRhcHMsICZDb2VmZnMpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBQcml2YXRlLT5wRmFzdERhdGEtPkxQVGFwcywgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190KSAvIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSByb29tIHNpemUgcGFyYW1ldGVyCisgICAgICovCisgICAgaWYoIHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuUm9vbVNpemUpCisgICAgeworICAgICAgICAvKiBSb29tIHNpemUgcmFuZ2UgaXMgMTBtcyB0byAyMDBtcworICAgICAgICAgKiAwJSAgIC0tIDEwbXMKKyAgICAgICAgICogNTAlICAtLSA2NW1zCisgICAgICAgICAqIDEwMCUgLS0gMTIwbXMKKyAgICAgICAgICovCisgICAgICAgIHBQcml2YXRlLT5Sb29tU2l6ZUlubXMgPSAxMCArICgoKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUqMTEpICsgNSkgLyAxMCk7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgVCBkZWxheSBudW1iZXIgb2Ygc2FtcGxlcyBhbmQgdGhlIGFsbCBwYXNzIGRlbGF5IG51bWJlciBvZiBzYW1wbGVzCisgICAgICovCisgICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuUm9vbVNpemUpICAgfHwKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgICAgID09IExWTV9UUlVFKSkKKyAgICB7CisKKyAgICAgICAgTFZNX1VJTlQzMiAgVGVtcDsKKyAgICAgICAgTFZNX0lOVDMyICAgQVBEZWxheVNpemU7CisgICAgICAgIExWTV9JTlQzMiAgIEZzID0gTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSk7CisgICAgICAgIExWTV9VSU5UMzIgIERlbGF5TGVuZ3RoU2FtcGxlcyA9IChMVk1fVUlOVDMyKShGcyAqIHBQcml2YXRlLT5Sb29tU2l6ZUlubXMpOworICAgICAgICBMVk1fSU5UMTYgICBpOworICAgICAgICBMVk1fRkxPQVQgICBTY2FsZVRhYmxlW10gID0ge0xWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80LCBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzR9OworICAgICAgICBMVk1fSU5UMTYgICBNYXhUX0RlbGF5W10gID0ge0xWUkVWX01BWF9UMF9ERUxBWSwgTFZSRVZfTUFYX1QxX0RFTEFZLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfTUFYX1QyX0RFTEFZLCBMVlJFVl9NQVhfVDNfREVMQVl9OworICAgICAgICBMVk1fSU5UMTYgICBNYXhBUF9EZWxheVtdID0ge0xWUkVWX01BWF9BUDBfREVMQVksIExWUkVWX01BWF9BUDFfREVMQVksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9NQVhfQVAyX0RFTEFZLCBMVlJFVl9NQVhfQVAzX0RFTEFZfTsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIEZvciBlYWNoIGRlbGF5IGxpbmUKKyAgICAgICAgICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOdW1iZXJPZkRlbGF5TGluZXM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMVk1fRkxPQVQgVGVtcDE7ICAvKiB0byBhdm9pZCBRQUMgd2FybmluZyBvbiB0eXBlIGNvbnZlcnNpb24gKi8KKworICAgICAgICAgICAgICAgIFRlbXAxPShMVk1fRkxPQVQpRGVsYXlMZW5ndGhTYW1wbGVzOworICAgICAgICAgICAgICAgIFRlbXAgPSAoTFZNX1VJTlQzMikoVGVtcDEgKiBTY2FsZVRhYmxlW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFRlbXAgPSBEZWxheUxlbmd0aFNhbXBsZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBUERlbGF5U2l6ZSA9IFRlbXAgIC8gMTUwMDsKKworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogU2V0IHRoZSBmaXhlZCBkZWxheQorICAgICAgICAgICAgICovCisKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgIFRlbXAgID0gKE1heFRfRGVsYXlbaV0gLSBNYXhBUF9EZWxheVtpXSkgKiBGcyAvIDE5MjAwMDsKKyNlbHNlCisgICAgICAgICAgICBUZW1wICA9IChNYXhUX0RlbGF5W2ldIC0gTWF4QVBfRGVsYXlbaV0pICogRnMgLyA0ODAwMDsKKyNlbmRpZgorICAgICAgICAgICAgcFByaXZhdGUtPkRlbGF5X0FQW2ldID0gcFByaXZhdGUtPlRbaV0gLSBUZW1wOworCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBTZXQgdGhlIHRhcCBzZWxlY3Rpb24KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHBQcml2YXRlLT5BQl9TZWxlY3Rpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU21vb3RoIGZyb20gdGFwIEEgdG8gdGFwIEIgKi8KKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cE9mZnNldEJbaV0gICAgICAgICAgICAgPSAmcFByaXZhdGUtPnBEZWxheV9UW2ldW3BQcml2YXRlLT5UW2ldIC0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcCAtIEFQRGVsYXlTaXplXTsKKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+Ql9EZWxheVNpemVbaV0gICAgICAgICAgPSBBUERlbGF5U2l6ZTsKKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLlRhcmdldDEgPSAwOworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MiA9IDEuMGY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU21vb3RoIGZyb20gdGFwIEIgdG8gdGFwIEEgKi8KKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cE9mZnNldEFbaV0gICAgICAgICAgICAgPSAmcFByaXZhdGUtPnBEZWxheV9UW2ldW3BQcml2YXRlLT5UW2ldIC0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcCAtIEFQRGVsYXlTaXplXTsKKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+QV9EZWxheVNpemVbaV0gICAgICAgICAgPSBBUERlbGF5U2l6ZTsKKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLlRhcmdldDIgPSAwOworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MSA9IDEuMGY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBTZXQgdGhlIG1heGltdW0gYmxvY2sgc2l6ZSB0byB0aGUgc21hbGxlc3QgZGVsYXkgc2l6ZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuICAgPSBUZW1wOworICAgICAgICAgICAgaWYgKHBQcml2YXRlLT5NYXhCbGtMZW4gPiBwUHJpdmF0ZS0+QV9EZWxheVNpemVbaV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPk1heEJsa0xlbiA9IHBQcml2YXRlLT5BX0RlbGF5U2l6ZVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwUHJpdmF0ZS0+TWF4QmxrTGVuID4gcFByaXZhdGUtPkJfRGVsYXlTaXplW2ldKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5NYXhCbGtMZW4gPSBwUHJpdmF0ZS0+Ql9EZWxheVNpemVbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBQcml2YXRlLT5BQl9TZWxlY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHBQcml2YXRlLT5BQl9TZWxlY3Rpb24gPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPkFCX1NlbGVjdGlvbiA9IDE7CisgICAgICAgIH0KKworCisgICAgICAgIC8qCisgICAgICAgICAqIExpbWl0IHRoZSBtYXhpbXVtIGJsb2NrIGxlbmd0aAorICAgICAgICAgKi8KKyAgICAgICAgLyogSnVzdCBhcyBhIHByZWNhdXNpb24sIGJ1dCBubyBwcm9ibGVtIGlmIHdlIHJlbW92ZSB0aGlzIGxpbmUgICAgICAqLworICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuID0gcFByaXZhdGUtPk1heEJsa0xlbiAtIDI7CisgICAgICAgIGlmKHBQcml2YXRlLT5NYXhCbGtMZW4gPiBwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTWF4QmxvY2tTaXplKQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuID0gKExWTV9JTlQzMilwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTWF4QmxvY2tTaXplOworICAgICAgICB9CisgICAgfQorCisKKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBsb3cgcGFzcyBmaWx0ZXIgY29lZmZpY2llbnQKKyAgICAgKi8KKyAgICBpZiggKHBQcml2YXRlLT5OZXdQYXJhbXMuRGFtcGluZyAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5EYW1waW5nKSAgICB8fAorICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8CisgICAgICAgIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCAgICAgICAgPT0gTFZNX1RSVUUpKQorICAgIHsKKworICAgICAgICBMVk1fSU5UMzIgICAgICAgVGVtcDsKKyAgICAgICAgTFZNX0ZMT0FUICAgICAgIE9tZWdhOworICAgICAgICBGT19GTE9BVF9Db2Vmc190ICBDb2VmZnM7CisgICAgICAgIExWTV9JTlQxNiAgICAgICBpOworICAgICAgICBMVk1fSU5UMTYgICAgICAgRGFtcGluZyAgICAgID0gKExWTV9JTlQxNikoKHBQcml2YXRlLT5OZXdQYXJhbXMuRGFtcGluZyAqIDEwMCkgKyAxMDAwKTsKKyAgICAgICAgTFZNX0ZMT0FUICAgICAgIFNjYWxlVGFibGVbXSA9IHtMVlJFVl9UXzNfUG93ZXJfMF9vbl80LCBMVlJFVl9UXzNfUG93ZXJfMV9vbl80LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX1RfM19Qb3dlcl8yX29uXzQsIExWUkVWX1RfM19Qb3dlcl8zX29uXzR9OworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogRm9yIGVhY2ggZmlsdGVyCisgICAgICAgICAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTnVtYmVyT2ZEZWxheUxpbmVzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGVtcCA9IChMVk1fSU5UMzIpKFNjYWxlVGFibGVbaV0gKiBEYW1waW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUZW1wID0gRGFtcGluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKFRlbXAgPD0gKExWTV9JTlQzMikoTFZNX0ZzVGFibGVbcFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlXSA+PiAxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBPbWVnYSA9IExWTV9HZXRPbWVnYShUZW1wLCBwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgIExWTV9GT19MUEYoT21lZ2EsICZDb2VmZnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvZWZmcy5BMCA9IDE7CisgICAgICAgICAgICAgICAgQ29lZmZzLkExID0gMDsKKyAgICAgICAgICAgICAgICBDb2VmZnMuQjEgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCgmcFByaXZhdGUtPnBGYXN0Q29lZi0+UmV2TFBDb2Vmc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1tpXSwgJkNvZWZmcyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIEFsbC1wYXNzIGZpbHRlciBtaXhlciB0aW1lIGNvbnN0YW50cworICAgICAqLworICAgIGlmKCAocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlJvb21TaXplKSAgIHx8CisgICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuRGVuc2l0eSAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5EZW5zaXR5KSkKKyAgICB7CisgICAgICAgIExWTV9JTlQxNiAgIGk7CisgICAgICAgIExWTV9GTE9BVCAgIEFscGhhOworICAgICAgICBMVk1fRkxPQVQgICBBbHBoYVRhcDsKKworICAgICAgICBBbHBoYSA9IExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZSRVZfQUxMUEFTU19UQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9HZXRGc0Zyb21UYWJsZShwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisKKyAgICAgICAgQWxwaGFUYXAgPSBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWUkVWX0FMTFBBU1NfVEFQX1RDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkFscGhhMSAgICAgICA9IEFscGhhVGFwOworICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5BbHBoYTIgICAgICAgPSBBbHBoYVRhcDsKKyAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLkFscGhhICAgID0gQWxwaGE7CisgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5BbHBoYSA9IEFscGhhOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgZmVlZCBiYWNrIGdhaW4KKyAgICAgKi8KKyAgICBpZiggKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Sb29tU2l6ZSkgICB8fAorICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8CisgICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MCAgICAgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuVDYwKSAgICAgICAgfHwKKyAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICA9PSBMVk1fVFJVRSkpCisgICAgeworCisgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIEdbNF07ICAgICAgICAgICAgICAgICAgICAgICAvKiBGZWVkYmFjayBnYWluIChRNy4yNCkgKi8KKworICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBHWzNdID0gMDsKKyAgICAgICAgICAgIEdbMl0gPSAwOworICAgICAgICAgICAgR1sxXSA9IDA7CisgICAgICAgICAgICBHWzBdID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIExWTV9GTE9BVCAgIFRlbXAxOworICAgICAgICAgICAgTFZNX0ZMT0FUICAgVGVtcDI7CisgICAgICAgICAgICBMVk1fSU5UMTYgICBpOworICAgICAgICAgICAgTFZNX0ZMT0FUICAgU2NhbGVUYWJsZVtdID0ge0xWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80fTsKKworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogRm9yIGVhY2ggZGVsYXkgbGluZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTnVtYmVyT2ZEZWxheUxpbmVzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGVtcDEgPSAoMyAqIHBQcml2YXRlLT5Sb29tU2l6ZUlubXMgKiBTY2FsZVRhYmxlW2ldKSAvIHBQcml2YXRlLT5OZXdQYXJhbXMuVDYwOworICAgICAgICAgICAgICAgIGlmKFRlbXAxID49ICg0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdbaV0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKChUZW1wMSA+PSAoMikpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVGVtcDIgPSBMVk1fUG93ZXIxMCgtKFRlbXAxIC8gMi4wZikpOworICAgICAgICAgICAgICAgICAgICBUZW1wMSA9IExWTV9Qb3dlcjEwKC0oVGVtcDEgLyAyLjBmKSk7CisgICAgICAgICAgICAgICAgICAgIFRlbXAxID0gVGVtcDEgKiBUZW1wMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVGVtcDEgPSBMVk1fUG93ZXIxMCgtKFRlbXAxKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChOdW1iZXJPZkRlbGF5TGluZXMgPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdbaV0gPSBUZW1wMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgVGVtcEc7CisgICAgICAgICAgICAgICAgICAgIFRlbXBHID0gVGVtcDEgKiBPTkVfT1ZFUl9TUVJUX1RXTzsKKyAgICAgICAgICAgICAgICAgICAgR1tpXT1UZW1wRzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBTZXQgdXAgdGhlIGZlZWRiYWNrIG1peGVycyBmb3IgZm91ciBkZWxheSBsaW5lcyAqLworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclswXS5UYXJnZXQ9R1swXTsKKyAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbMV0uVGFyZ2V0PUdbMV07CisgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzJdLlRhcmdldD1HWzJdOworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclszXS5UYXJnZXQ9R1szXTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSBnYWluIGNvcnJlY3Rpb24KKyAgICAgKi8KKyAgICBpZigocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Sb29tU2l6ZSkgfHwKKyAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5MZXZlbCkgICAgfHwKKyAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgICAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5UNjApICkKKyAgICB7CisgICAgICAgIExWTV9JTlQzMiBJbmRleD0wOworICAgICAgICBMVk1fRkxPQVQgSW5kZXhfRkxPQVQ7CisgICAgICAgIExWTV9JTlQzMiBpPTA7CisgICAgICAgIExWTV9GTE9BVCBHYWluPTA7CisgICAgICAgIExWTV9JTlQzMiBSb29tU2l6ZT0wOworICAgICAgICBMVk1fRkxPQVQgVDYwOworICAgICAgICBMVk1fRkxPQVQgQ29lZnNbNV07CisKKworICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIFJvb21TaXplID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFJvb21TaXplID0gKExWTV9JTlQzMilwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplOworICAgICAgICB9CisKKworICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MCA8IDEwMCkKKyAgICAgICAgeworICAgICAgICAgICAgVDYwID0gMTAwICogTFZSRVZfVDYwX1NDQUxFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgVDYwID0gcFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgKiBMVlJFVl9UNjBfU0NBTEU7CisgICAgICAgIH0KKworICAgICAgICAvKiBGaW5kIHRoZSBuZWFyZXN0IHJvb20gc2l6ZSBpbiB0YWJsZSAqLworICAgICAgICBmb3IoaSA9IDA7IGkgPCAyNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZihSb29tU2l6ZSA8PSBMVlJFVl9HYWluUG9seVRhYmxlW2ldWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgaWYoUm9vbVNpemUgPT0gTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleF1bMF0pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRha2UgdGFibGUgdmFsdWVzIGlmIHRoZSByb29tIHNpemUgaXMgaW4gdGFibGUgKi8KKyAgICAgICAgICAgIGZvcihpID0gMTsgaSA8IDU7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb2Vmc1tpLTFdID0gTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleF1baV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb2Vmc1s0XSA9IDA7CisgICAgICAgICAgICBHYWluID0gTFZNX1BvbHlub21pYWwoMywgQ29lZnMsIFQ2MCk7ICAgICAgIC8qIFEuMjQgcmVzdWx0ICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBJbnRlcnBvbGF0ZSB0aGUgZ2FpbiBiZXR3ZWVuIG5lYXJlc3Qgcm9vbSBzaXplcyAqLworCisgICAgICAgICAgICBMVk1fRkxPQVQgR2FpbjEsR2FpbjI7CisgICAgICAgICAgICBMVk1fSU5UMzIgVG90X0Rpc3QsRGlzdDsKKworICAgICAgICAgICAgVG90X0Rpc3QgPSAoTFZNX1VJTlQzMilMVlJFVl9HYWluUG9seVRhYmxlW0luZGV4XVswXSAtIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMzIpTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleC0xXVswXTsKKyAgICAgICAgICAgIERpc3QgPSBSb29tU2l6ZSAtIChMVk1fVUlOVDMyKUxWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXggLSAxXVswXTsKKworCisgICAgICAgICAgICAvKiBHZXQgZ2FpbiBmb3IgZmlyc3QgKi8KKyAgICAgICAgICAgIGZvcihpID0gMTsgaSA8IDU7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb2Vmc1tpLTFdID0gTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleC0xXVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvZWZzWzRdID0gMDsKKworICAgICAgICAgICAgR2FpbjEgPSBMVk1fUG9seW5vbWlhbCgzLCBDb2VmcywgVDYwKTsgICAgICAvKiBRLjI0IHJlc3VsdCAqLworCisgICAgICAgICAgICAvKiBHZXQgZ2FpbiBmb3Igc2Vjb25kICovCisgICAgICAgICAgICBmb3IoaSA9IDE7IGkgPCA1OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29lZnNbaS0xXSA9IExWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXhdW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29lZnNbNF0gPSAwOworCisgICAgICAgICAgICBHYWluMiA9IExWTV9Qb2x5bm9taWFsKDMsIENvZWZzLCBUNjApOyAgICAgIC8qIFEuMjQgcmVzdWx0ICovCisKKyAgICAgICAgICAgIC8qIExpbmVhciBJbnRlcnBvbGF0ZSB0aGUgZ2FpbiAqLworICAgICAgICAgICAgR2FpbiA9IEdhaW4xICsgKCgoR2FpbjIgLSBHYWluMSkgKiBEaXN0KSAvIChUb3RfRGlzdCkpOworICAgICAgICB9CisKKworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIGludmVyc2Ugb2YgZ2FpbjogUS4xNQorICAgICAgICAgKiBHYWluIGlzIG1vc3RseSBhYm92ZSBvbmUgZXhjZXB0IGZldyBjYXNlcywgdGFrZSBvbmx5IGdhaW5zIGFib3ZlIDEKKyAgICAgICAgICovCisgICAgICAgIGlmKEdhaW4gPCAxKQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+R2FpbiA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+R2FpbiA9IDEgLyBHYWluOworICAgICAgICB9CisKKyAgICAgICAgSW5kZXhfRkxPQVQgPSAxMDAuMGYgLyAoTFZNX0ZMT0FUKSgxMDAgKyBwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsKTsKKyAgICAgICAgcFByaXZhdGUtPkdhaW4gPSBwUHJpdmF0ZS0+R2FpbiAqIEluZGV4X0ZMT0FUOworICAgICAgICBwUHJpdmF0ZS0+R2Fpbk1peGVyLlRhcmdldCA9IChwUHJpdmF0ZS0+R2FpbipJbmRleF9GTE9BVCkgLyAyOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIGFsbCBwYXNzIGNvbWIgZmlsdGVyIGNvZWZmaWNpZW50CisgICAgICovCisgICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkRlbnNpdHkgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuRGVuc2l0eSkgfHwKKyAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICA9PSBMVk1fVFJVRSkpCisgICAgeworICAgICAgICBMVk1fSU5UMTYgICBpOworICAgICAgICBMVk1fRkxPQVQgICBiID0gKExWTV9GTE9BVClwUHJpdmF0ZS0+TmV3UGFyYW1zLkRlbnNpdHkgKiBMVlJFVl9CXzhfb25fMTAwMDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5UYXJnZXQgICAgPSBiOworICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0uVGFyZ2V0ID0gYjsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIGJ5cGFzcyBtaXhlciB0aW1lIGNvbnN0YW50CisgICAgICovCisgICAgaWYoKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpICAgfHwKKyAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgICAgICAgPT0gTFZNX1RSVUUpKQorICAgIHsKKyAgICAgICAgTFZNX1VJTlQxNiAgIE51bUNoYW5uZWxzID0gMTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEFzc3VtZSBNT05PIGZvcm1hdCAqLworICAgICAgICBMVk1fRkxPQVQgICAgQWxwaGE7CisKKyAgICAgICAgQWxwaGEgPSBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWUkVWX0ZFRURCQUNLTUlYRVJfVEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fR2V0RnNGcm9tVGFibGUocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bUNoYW5uZWxzKTsKKyAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbMF0uQWxwaGEgPSBBbHBoYTsKKyAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbMV0uQWxwaGEgPSBBbHBoYTsKKyAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbMl0uQWxwaGEgPSBBbHBoYTsKKyAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbM10uQWxwaGEgPSBBbHBoYTsKKworICAgICAgICBOdW1DaGFubmVscyA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWx3YXlzIHN0ZXJlbyBvdXRwdXQgKi8KKyAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLkFscGhhMSA9IExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZSRVZfQllQQVNTTUlYRVJfVEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9HZXRGc0Zyb21UYWJsZShwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpLCBOdW1DaGFubmVscyk7CisgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5BbHBoYTIgPSBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQWxwaGExOworICAgICAgICBwUHJpdmF0ZS0+R2Fpbk1peGVyLkFscGhhICAgID0gcFByaXZhdGUtPkJ5cGFzc01peGVyLkFscGhhMTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBieXBhc3MgbWl4ZXIgdGFyZ2V0cworICAgICAqLworICAgIGlmKCAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5MZXZlbCkgJiYKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PTikpCisgICAgeworICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MiA9IChMVk1fRkxPQVQpKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgKSAvIDEwMC4wZjsKKyAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDEgPSAweDAwMDAwMDAwOworICAgICAgICBpZiAoKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgPT0gMCkgJiYgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9GQUxTRSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1NldDIgPSBMVk1fVFJVRTsKKyAgICAgICAgfQorICAgICAgICBpZiAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+YkRpc2FibGVSZXZlcmIgPSBMVk1fRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLk9wZXJhdGluZ01vZGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuT3BlcmF0aW5nTW9kZSkKKyAgICB7CisgICAgICAgIGlmKHBQcml2YXRlLT5OZXdQYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PTikKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDIgPSAoTFZNX0ZMT0FUKShwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsICkgLyAxMDAuMGY7CisgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MSA9IDB4MDAwMDAwMDA7CisKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1NldDIgPSBMVk1fRkFMU0U7CisgICAgICAgICAgICBPcGVyYXRpbmdNb2RlICAgICAgICAgICAgICAgICAgICAgID0gTFZNX01PREVfT047CisgICAgICAgICAgICBpZiAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5iRGlzYWJsZVJldmVyYiA9IExWTV9UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5iRGlzYWJsZVJldmVyYiA9IExWTV9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9PSBMVk1fRkFMU0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQyID0gMHgwMDAwMDAwMDsKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQxID0gMHgwMDAwMDAwMDsKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1NldDIgPSBMVk1fVFJVRTsKKyAgICAgICAgICAgIHBQcml2YXRlLT5HYWluTWl4ZXIuVGFyZ2V0ICAgID0gMC4wMzEyNWY7CisgICAgICAgICAgICBPcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT047CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBPcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT0ZGOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKiAgSWYgaXQgaXMgdGhlIGZpcnN0IGNhbGwgdG8gQXBwbHlOZXcgc2V0dGluZ3MgZm9yY2UgdGhlIGN1cnJlbnQgdG8gdGhlIHRhcmdldCBcCisgICAgICAgIHRvIGJlZ2luIGltbWVkaWF0ZSBwbGF5YmFjayBvZiB0aGUgZWZmZWN0ICovCisgICAgaWYocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX1RSVUUpCisgICAgeworICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ3VycmVudDEgPSBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MTsKKyAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLkN1cnJlbnQyID0gcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDI7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIENvcHkgdGhlIG5ldyBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMgPSBwUHJpdmF0ZS0+TmV3UGFyYW1zOworICAgIHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBPcGVyYXRpbmdNb2RlOworCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSBmbGFnCisgICAgICovCisgICAgaWYocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX1RSVUUpCisgICAgeworICAgICAgICBwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9IExWTV9GQUxTRTsKKyAgICB9CisKKworICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOworfQorI2VuZGlmIC8qQlVJTERfRkxPQVQqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBCeXBhc3NNaXhlcl9DYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfQ2xlYXJBdWRpb0J1ZmZlcnMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0NsZWFyQXVkaW9CdWZmZXJzLmMKaW5kZXggNmJiMWU4OC4uOTQ5MTAxNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfQ2xlYXJBdWRpb0J1ZmZlcnMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9DbGVhckF1ZGlvQnVmZmVycy5jCkBAIC02MSwxNiArNjEsMjYgQEAKICAgICAgKiBDbGVhciBhbGwgZmlsdGVyIHRhcCBkYXRhLCBkZWxheS1saW5lcyBhbmQgb3RoZXIgc2lnbmFsIHJlbGF0ZWQgZGF0YQogICAgICAqLwogCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExvYWRDb25zdF9GbG9hdCgwLAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5IUFRhcHMsIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICAgICAyKTsKKyAgICBMb2FkQ29uc3RfRmxvYXQoMCwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+TFBUYXBzLCAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgICAgICAgICAgMik7CisjZWxzZQogICAgIExvYWRDb25zdF8zMigwLAogICAgICAgICAodm9pZCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5IUFRhcHMsIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCiAgICAgICAgIDIpOwogICAgIExvYWRDb25zdF8zMigwLAogICAgICAgICAodm9pZCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5MUFRhcHMsIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCiAgICAgICAgIDIpOwotCisjZW5kaWYKICAgICBpZigoTFZNX1VJTlQxNilwTFZSRVZfUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIExvYWRDb25zdF8zMigwLCAoTFZNX0lOVDMyICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1szXSwgMik7CiAgICAgICAgIExvYWRDb25zdF8zMigwLCAoTFZNX0lOVDMyICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1syXSwgMik7CiAgICAgICAgIExvYWRDb25zdF8zMigwLCAoTFZNX0lOVDMyICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1sxXSwgMik7CkBAIC04MCwyNCArOTAsNDYgQEAKICAgICAgICAgTG9hZENvbnN0XzMyKDAscExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzJdLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMl9ERUxBWSk7CiAgICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDFfREVMQVkpOwogICAgICAgICBMb2FkQ29uc3RfMzIoMCxwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0sIChMVk1fSU5UMTYpTFZSRVZfTUFYX1QwX0RFTEFZKTsKKyNlbHNlCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAoTFZNX0ZMT0FUICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1szXSwgMik7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAoTFZNX0ZMT0FUICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1syXSwgMik7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAoTFZNX0ZMT0FUICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1sxXSwgMik7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAoTFZNX0ZMT0FUICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1swXSwgMik7CiAKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFszXSwgTFZSRVZfTUFYX1QzX0RFTEFZKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsyXSwgTFZSRVZfTUFYX1QyX0RFTEFZKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSwgTFZSRVZfTUFYX1QxX0RFTEFZKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgTFZSRVZfTUFYX1QwX0RFTEFZKTsKKyNlbmRpZgogICAgIH0KIAogICAgIGlmKChMVk1fVUlOVDE2KXBMVlJFVl9Qcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPj0gTFZSRVZfREVMQVlMSU5FU18yKQogICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgTG9hZENvbnN0XzMyKDAsIChMVk1fSU5UMzIgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzFdLCAyKTsKICAgICAgICAgTG9hZENvbnN0XzMyKDAsIChMVk1fSU5UMzIgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzBdLCAyKTsKIAogICAgICAgICBMb2FkQ29uc3RfMzIoMCxwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMV0sIChMVk1fSU5UMTYpTFZSRVZfTUFYX1QxX0RFTEFZKTsKICAgICAgICAgTG9hZENvbnN0XzMyKDAscExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMF9ERUxBWSk7CisjZWxzZQorICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMV0sIDIpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMF0sIDIpOworCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMV0sIExWUkVWX01BWF9UMV9ERUxBWSk7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0sIExWUkVWX01BWF9UMF9ERUxBWSk7CisjZW5kaWYKICAgICB9CiAKICAgICBpZigoTFZNX1VJTlQxNilwTFZSRVZfUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID49IExWUkVWX0RFTEFZTElORVNfMSkKICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIExvYWRDb25zdF8zMigwLCAoTFZNX0lOVDMyICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1swXSwgMik7CiAgICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDBfREVMQVkpOworI2Vsc2UKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIChMVk1fRkxPQVQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzBdLCAyKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgTFZSRVZfTUFYX1QwX0RFTEFZKTsKKyNlbmRpZgogICAgIH0KLQogICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRJbnN0YW5jZUhhbmRsZS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0SW5zdGFuY2VIYW5kbGUuYwppbmRleCBmZmE1MTM4Li4zMzY2YmNiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRJbnN0YW5jZUhhbmRsZS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldEluc3RhbmNlSGFuZGxlLmMKQEAgLTEwOCwxMSArMTA4LDI5IEBACiAgICAgLyoKICAgICAgKiBaZXJvIGFsbCBtZW1vcnkgcmVnaW9ucwogICAgICAqLwotICAgICBMb2FkQ29uc3RfMTYoMCwgKExWTV9JTlQxNiAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzLCAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5TaXplKS9zaXplb2YoTFZNX0lOVDE2KSkpOwotICAgICBMb2FkQ29uc3RfMTYoMCwgKExWTV9JTlQxNiAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzLCAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplKS9zaXplb2YoTFZNX0lOVDE2KSkpOwotICAgICBMb2FkQ29uc3RfMTYoMCwgKExWTV9JTlQxNiAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzLCAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKS9zaXplb2YoTFZNX0lOVDE2KSkpOwotICAgICBMb2FkQ29uc3RfMTYoMCwgKExWTV9JTlQxNiAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzLCAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5TaXplKS9zaXplb2YoTFZNX0lOVDE2KSkpOwotCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBMb2FkQ29uc3RfRmxvYXQoMCwKKyAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5TaXplKSAvIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSkpOworICAgIExvYWRDb25zdF9GbG9hdCgwLAorICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUpIC8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKSk7CisgICAgTG9hZENvbnN0X0Zsb2F0KDAsCisgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSkgLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpKTsKKyAgICBMb2FkQ29uc3RfRmxvYXQoMCwKKyAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5TaXplKSAvIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSkpOworI2Vsc2UKKyAgICBMb2FkQ29uc3RfMTYoMCwgKExWTV9JTlQxNiAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzLCAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5TaXplKS9zaXplb2YoTFZNX0lOVDE2KSkpOworICAgIExvYWRDb25zdF8xNigwLCAoTFZNX0lOVDE2ICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MsIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUpL3NpemVvZihMVk1fSU5UMTYpKSk7CisgICAgTG9hZENvbnN0XzE2KDAsIChMVk1fSU5UMTYgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcywgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSkvc2l6ZW9mKExWTV9JTlQxNikpKTsKKyAgICBMb2FkQ29uc3RfMTYoMCwgKExWTV9JTlQxNiAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzLCAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5TaXplKS9zaXplb2YoTFZNX0lOVDE2KSkpOworI2VuZGlmCiAgICAgLyoKICAgICAgKiBTZXQgdGhlIGluc3RhbmNlIGhhbmRsZSBpZiBub3QgYWxyZWFkeSBpbml0aWFsaXNlZAogICAgICAqLwpAQCAtMTQ2LDcgKzE2NCw3IEBACiAgICAgICogU2V0IHRoZSBkYXRhLCBjb2VmZmljaWVudCBhbmQgdGVtcG9yYXJ5IG1lbW9yeSBwb2ludGVycwogICAgICAqLwogICAgIHBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgc2l6ZW9mKExWUkVWX0Zhc3REYXRhX3N0KSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmFzdCBkYXRhIG1lbW9yeSBiYXNlIGFkZHJlc3MgKi8KLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKICAgICB7CiAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFszXSAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QzX0RFTEFZICAqIHNpemVvZihMVk1fSU5UMzIpKTsKQEAgLTE5MCw3ICsyMDgsNjcgQEAKIAogICAgICAgICBMb2FkQ29uc3RfMzIoMCxwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0gICwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDBfREVMQVkpOwogICAgIH0KKyNlbHNlCisgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQorICAgIHsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzNdICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDNfREVMQVkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzJdICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDJfREVMQVkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzFdICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDFfREVMQVkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKIAorICAgICAgICBmb3IoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNjcmF0Y2ggZm9yIGVhY2ggZGVsYXkgbGluZSBvdXRwdXQgKi8KKyAgICAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVtpXSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzNdLCBMVlJFVl9NQVhfVDNfREVMQVkpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzJdLCBMVlJFVl9NQVhfVDJfREVMQVkpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzFdLCBMVlJFVl9NQVhfVDFfREVMQVkpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCBMVlJFVl9NQVhfVDBfREVMQVkpOworICAgIH0KKworICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKKyAgICB7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QwX0RFTEFZICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7CisKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTY3JhdGNoIGZvciBlYWNoIGRlbGF5IGxpbmUgb3V0cHV0ICovCisgICAgICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbaV0gPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemUpOworICAgICAgICB9CisKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDFfREVMQVkpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMF9ERUxBWSk7CisgICAgfQorCisgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18xKQorICAgIHsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9NQVhfVDBfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7CisKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgMTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTY3JhdGNoIGZvciBlYWNoIGRlbGF5IGxpbmUgb3V0cHV0ICovCisgICAgICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbaV0gPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemUpOworICAgICAgICB9CisKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDBfREVMQVkpOworICAgIH0KKyNlbmRpZgogICAgIC8qIEFsbC1wYXNzIGRlbGF5IGJ1ZmZlciBhZGRyZXNzZXMgYW5kIHNpemVzICovCiAgICAgcExWUkVWX1ByaXZhdGUtPlRbMF0gICAgICAgICA9IExWUkVWX01BWF9UMF9ERUxBWTsKICAgICBwTFZSRVZfUHJpdmF0ZS0+VFsxXSAgICAgICAgID0gTFZSRVZfTUFYX1QxX0RFTEFZOwpAQCAtMjAwLDEwICsyNzgsMTkgQEAKIAogCiAgICAgcExWUkVWX1ByaXZhdGUtPnBGYXN0Q29lZiAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3RDb2VmLCBzaXplb2YoTFZSRVZfRmFzdENvZWZfc3QpKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBGYXN0IGNvZWZmaWNpZW50IG1lbW9yeSBiYXNlIGFkZHJlc3MgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2ggICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0lOVDMyKSAqIE1heEJsb2NrU2l6ZSk7ICAgICAgICAgICAgICAgIC8qIEdlbmVyYWwgcHVycG9zZSBzY3JhdGNoICovCiAgICAgcExWUkVWX1ByaXZhdGUtPnBJbnB1dFNhdmUgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgMiAqIHNpemVvZihMVk1fSU5UMzIpICogTWF4QmxvY2tTaXplKTsgICAgICAgICAgICAvKiBNb25vLT5zdGVyZW8gaW5wdXQgc2F2ZSBmb3IgZW5kIG1peCAqLwogICAgIExvYWRDb25zdF8zMigwLCBwTFZSRVZfUHJpdmF0ZS0+cElucHV0U2F2ZSwgKExWTV9JTlQxNikoTWF4QmxvY2tTaXplKjIpKTsKLQorI2Vsc2UKKyAgICAvKiBHZW5lcmFsIHB1cnBvc2Ugc2NyYXRjaCAqLworICAgIHBMVlJFVl9Qcml2YXRlLT5wU2NyYXRjaCAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fRkxPQVQpICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZSk7CisgICAgLyogTW9uby0+c3RlcmVvIGlucHV0IHNhdmUgZm9yIGVuZCBtaXggKi8KKyAgICBwTFZSRVZfUHJpdmF0ZS0+cElucHV0U2F2ZSAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCAyICogc2l6ZW9mKExWTV9GTE9BVCkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4QmxvY2tTaXplKTsKKyAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBJbnB1dFNhdmUsIChMVk1fSU5UMTYpKE1heEJsb2NrU2l6ZSAqIDIpKTsKKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBTYXZlIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzIGluIHRoZSBpbnN0YW5jZSBzdHJ1Y3R1cmUKQEAgLTI1Miw5ICszMzksMTMgQEAKICAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLnBHZW5lcmFsUHVycG9zZSAgICA9IExWTV9OVUxMOwogICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIucENhbGxCYWNrICAgICAgICAgID0gTFZNX05VTEw7CiAgICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5DYWxsYmFja1NldCAgICAgICAgPSBMVk1fRkFMU0U7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5DdXJyZW50ICAgICAgICAgICAgPSAweDAzZmZmZmZmOwogICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIuVGFyZ2V0ICAgICAgICAgICAgID0gMHgwM2ZmZmZmZjsKLQorI2Vsc2UKKyAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLkN1cnJlbnQgICAgICAgICAgICA9IDAuMDMxMjVmOy8vMHgwM2ZmZmZmZjsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLlRhcmdldCAgICAgICAgICAgICA9IDAuMDMxMjVmOy8vMHgwM2ZmZmZmZjsKKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBTZXQgdGhlIEFsbC1QYXNzIEZpbHRlciBtaXhlcnMKQEAgLTI3Nyw3ICszNjgsMTEgQEAKICAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5wQ2FsbEJhY2sxICAgICAgID0gTFZNX05VTEw7CiAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQ2FsbGJhY2tTZXQxICAgICA9IExWTV9GQUxTRTsKICAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5DdXJyZW50MSAgICAgICAgID0gMDsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5UYXJnZXQxICAgICAgICAgID0gMHg3ZmZmZmZmZjsKKyNlbHNlCisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MSAgICAgICAgICA9IDE7CisjZW5kaWYKICAgICAgICAgLyogRmVlZGZvcndhcmQgbWl4ZXIgKi8KICAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0uQ2FsbGJhY2tQYXJhbSAgID0gMDsKICAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0ucENhbGxiYWNrSGFuZGxlID0gTFZNX05VTEw7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRNZW1vcnlUYWJsZS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0TWVtb3J5VGFibGUuYwppbmRleCAyMDEyNDMyLi5mNmQ0NDZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRNZW1vcnlUYWJsZS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldE1lbW9yeVRhYmxlLmMKQEAgLTE2MSwyMSArMTYxLDM3IEBACiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBzaXplb2YoTFZSRVZfRmFzdERhdGFfc3QpKTsKICAgICAgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQogICAgICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QzX0RFTEFZICAqIHNpemVvZihMVk1fSU5UMzIpKTsKICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDJfREVMQVkgICogc2l6ZW9mKExWTV9JTlQzMikpOwogICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMV9ERUxBWSAqIHNpemVvZihMVk1fSU5UMzIpKTsKICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBzaXplb2YoTFZNX0lOVDMyKSk7CisjZWxzZQorICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UM19ERUxBWSAqIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDJfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOworICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIHNpemVvZihMVk1fRkxPQVQpKTsKKyNlbmRpZgogICAgICAgICB9CiAKICAgICAgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18yKQogICAgICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogc2l6ZW9mKExWTV9JTlQzMikpOwogICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIHNpemVvZihMVk1fSU5UMzIpKTsKKyNlbHNlCisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOworICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIHNpemVvZihMVk1fRkxPQVQpKTsKKyNlbmRpZgogICAgICAgICB9CiAKICAgICAgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18xKQogICAgICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QwX0RFTEFZICogc2l6ZW9mKExWTV9JTlQzMikpOworI2Vsc2UKKyAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7CisjZW5kaWYKICAgICAgICAgfQogCiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZGYXN0RGF0YSk7CkBAIC0xOTUsMTQgKzIxMSwyNSBAQAogICAgICAgICAvKgogICAgICAgICAgKiBUZW1wb3JhcnkgZmFzdCBtZW1vcnkKICAgICAgICAgICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9JTlQzMikgKiBNYXhCbG9ja1NpemUpOyAgICAgICAgICAvKiBHZW5lcmFsIHB1cnBvc2Ugc2NyYXRjaCBtZW1vcnkgKi8KICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCAyKnNpemVvZihMVk1fSU5UMzIpICogTWF4QmxvY2tTaXplKTsgICAgICAgIC8qIE1vbm8tPnN0ZXJlbyBpbnB1dCBzYXZlZCBmb3IgZW5kIG1peCAqLwotCisjZWxzZQorICAgICAgICAvKiBHZW5lcmFsIHB1cnBvc2Ugc2NyYXRjaCBtZW1vcnkgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0ZMT0FUKSAqIE1heEJsb2NrU2l6ZSk7CisgICAgICAgIC8qIE1vbm8tPnN0ZXJlbyBpbnB1dCBzYXZlZCBmb3IgZW5kIG1peCAqLworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIDIgKiBzaXplb2YoTFZNX0ZMT0FUKSAqIE1heEJsb2NrU2l6ZSk7CisjZW5kaWYKICAgICAgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQogICAgICAgICB7CiAgICAgICAgICAgICBmb3IoaT0wOyBpPDQ7IGkrKykKICAgICAgICAgICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fSU5UMzIpICogTWF4QmxvY2tTaXplKTsgICAgICAvKiBBIFNjcmF0Y2ggYnVmZmVyIGZvciBlYWNoIGRlbGF5IGxpbmUgKi8KKyNlbHNlCisgICAgICAgICAgICAgICAgLyogQSBTY3JhdGNoIGJ1ZmZlciBmb3IgZWFjaCBkZWxheSBsaW5lICovCisgICAgICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0ZMT0FUKSAqIE1heEJsb2NrU2l6ZSk7CisjZW5kaWYKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yMTAsNyArMjM3LDEyIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGZvcihpPTA7IGk8MjsgaSsrKQogICAgICAgICAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9JTlQzMikgKiBNYXhCbG9ja1NpemUpOyAgICAgIC8qIEEgU2NyYXRjaCBidWZmZXIgZm9yIGVhY2ggZGVsYXkgbGluZSAqLworI2Vsc2UKKyAgICAgICAgICAgICAgICAvKiBBIFNjcmF0Y2ggYnVmZmVyIGZvciBlYWNoIGRlbGF5IGxpbmUgKi8KKyAgICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fRkxPQVQpICogTWF4QmxvY2tTaXplKTsKKyNlbmRpZgogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTIxOCw3ICsyNTAsMTIgQEAKICAgICAgICAgewogICAgICAgICAgICAgZm9yKGk9MDsgaTwxOyBpKyspCiAgICAgICAgICAgICB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0lOVDMyKSAqIE1heEJsb2NrU2l6ZSk7ICAgICAgLyogQSBTY3JhdGNoIGJ1ZmZlciBmb3IgZWFjaCBkZWxheSBsaW5lICovCisjZWxzZQorICAgICAgICAgICAgICAgIC8qIEEgU2NyYXRjaCBidWZmZXIgZm9yIGVhY2ggZGVsYXkgbGluZSAqLworICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9GTE9BVCkgKiBNYXhCbG9ja1NpemUpOworI2VuZGlmCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJpdmF0ZS5oCmluZGV4IGZiZmE0MzcuLmZmNzQ3NWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcml2YXRlLmgKQEAgLTQyLDE2ICs0MiwyNyBAQAogLyogIERlZmluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogLyogR2VuZXJhbCAqLwogI2RlZmluZSBPTkVfT1ZFUl9TUVJUX1RXTyAgICAgICAgICAgICAgIDIzMTcwICAgICAgICAgICAvKiAxL3NxcnQoMikgKiAyXjE1ICovCiAjZGVmaW5lIExWUkVWX0JfOF9vbl8xMDAwICAgICAgICAgICAgMTcxNzk4NjkgICAgICAgICAgIC8qIDAuOCAqIDJeMzEgKi8KICNkZWZpbmUgTFZSRVZfSEVBRFJPT00gICAgICAgICAgICAgICAgICAgODE5MiAgICAgICAgICAgLyogLTEyZEIgKiAyXjE1ICovCiAjZGVmaW5lIExWUkVWXzJfOV9JTlEyOSAgICAgICAgICAgMTU4Mzc2OTE5MEwgICAgICAgICAgIC8qIDIuOSBpbiBRMjkgZm9ybWF0ICovCiAjZGVmaW5lIExWUkVWX01JTjNEQiAgICAgICAgICAgICAgICAgICAweDVBODIgICAgICAgICAgIC8qIC0zZEIgaW4gUTE1IGZvcm1hdCAqLworI2Vsc2UKKy8qIEdlbmVyYWwgKi8KKyNkZWZpbmUgT05FX09WRVJfU1FSVF9UV08gICAgICAgICAgICAwLjcwNzEwN2YgICAgICAgICAgIC8qIDEvc3FydCgyKSAqIDJeMTUgKi8KKyNkZWZpbmUgTFZSRVZfQl84X29uXzEwMDAgICAgICAgICAgICAgICAwLjAwOGYgICAgICAgICAgIC8qIDAuOCAqIDJeMzEgKi8KKyNkZWZpbmUgTFZSRVZfSEVBRFJPT00gICAgICAgICAgICAgICAgICAgMC4yNWYgICAgICAgICAgIC8qIC0xMmRCICogMl4xNSAqLworI2RlZmluZSBMVlJFVl8yXzlfSU5RMjkgICAgICAgICAgICAgICAgICAgMi45ZiAgICAgICAgICAgLyogMi45IGluIFEyOSBmb3JtYXQgKi8KKyNkZWZpbmUgTFZSRVZfTUlOM0RCICAgICAgICAgICAgICAgIDAuNzA3OTQ1N2YgICAgICAgICAgIC8qIC0zZEIgaW4gUTE1IGZvcm1hdCAqLworI2VuZGlmCiAKIC8qIEludGVuYWwgY29uc3RhbnRzICovCiAjZGVmaW5lIExWUkVWX0xQX1BvbHlfT3JkZXIgICAgICAgICAgICAgICAgIDQKICNkZWZpbmUgTFZSRVZfTFBfUG9seV9TaGlmdCAgICAgICAgICAgICAgICAgNQorCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl8wX29uXzQgICAgICAgICAgMzI3NjgKICNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyXzFfb25fNCAgICAgICAgICA0MzEyNQogI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfMl9vbl80ICAgICAgICAgIDU2NzU1CkBAIC02MSwxNCArNzIsNDcgQEAKICNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80ICAgICAyNDg5OCAgICAgICAgICAgLyogM14oLTEvNCkgKiAyXjE1ICovCiAjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCAgICAgMTg5MTkgICAgICAgICAgIC8qIDNeKC0yLzQpICogMl4xNSAqLwogI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzQgICAgIDE0Mzc1ICAgICAgICAgICAvKiAzXigtMy80KSAqIDJeMTUgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX1QzX0RFTEFZICAgICAgICAgICAgICAgMjUyNyAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNCkgPj4gMTUpIC8gMTAwMCAqLwotI2RlZmluZSBMVlJFVl9NQVhfVDJfREVMQVkgICAgICAgICAgICAgICAzMzI2ICAgICAgICAgICAvKiAoKDQ4MDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80KSA+PiAxNSkgLyAxMDAwICovCi0jZGVmaW5lIExWUkVWX01BWF9UMV9ERUxBWSAgICAgICAgICAgICAgIDQzNzcgICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX1QwX0RFTEFZICAgICAgICAgICAgICAgNTc2MCAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCkgPj4gMTUpIC8gMTAwMCAqLwotI2RlZmluZSBMVlJFVl9NQVhfQVAzX0RFTEFZICAgICAgICAgICAgICAxNjg1ICAgICAgICAgICAvKiAoKDQ4MDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80KSA+PiAxNSkgLyAxNTAwICovCi0jZGVmaW5lIExWUkVWX01BWF9BUDJfREVMQVkgICAgICAgICAgICAgIDIyMTggICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX0FQMV9ERUxBWSAgICAgICAgICAgICAgMjkxOCAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCkgPj4gMTUpIC8gMTUwMCAqLwotI2RlZmluZSBMVlJFVl9NQVhfQVAwX0RFTEFZICAgICAgICAgICAgICAzODQwICAgICAgICAgICAvKiAoKDQ4MDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMF9vbl80KSA+PiAxNSkgLyAxNTAwICovCisjZWxzZS8qQlVJTERfRkxPQVQqLworI2RlZmluZSBMVlJFVl9UNjBfU0NBTEUgICAgICAgICAgICAgICAgMC4wMDAxNDJmICAgICAgICAgICAvKigxLzcwMDApICovCisKKyNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyXzBfb25fNCAgICAgICAgICAgICAgMS4wZgorI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfMV9vbl80ICAgICAgICAgMS4zMTYwNzRmCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl8yX29uXzQgICAgICAgICAxLjczMjA1MWYKKyNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyXzNfb25fNCAgICAgICAgIDIuMjc5NTA3ZgorI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQgICAgICAgICAxLjBmICAgICAgICAvKiAzXigtMC80KSAqIDJeMTUgKi8KKyNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80ICAgIDAuNzU5ODM2ZiAgICAgICAgLyogM14oLTEvNCkgKiAyXjE1ICovCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCAgICAwLjU3NzM1MGYgICAgICAgIC8qIDNeKC0yLzQpICogMl4xNSAqLworI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzQgICAgMC40Mzg2OTFmICAgICAgICAvKiAzXigtMy80KSAqIDJeMTUgKi8KKyNlbmRpZgorCisjaWZuZGVmIEhJR0hFUl9GUworI2RlZmluZSBMVlJFVl9NQVhfVDNfREVMQVkgICAgICAgICAgICAgICAgMjUyNyAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNCkgPj4gMTUpIC8gMTAwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfVDJfREVMQVkgICAgICAgICAgICAgICAgMzMyNiAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCkgPj4gMTUpIC8gMTAwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfVDFfREVMQVkgICAgICAgICAgICAgICAgNDM3NyAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCkgPj4gMTUpIC8gMTAwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfVDBfREVMQVkgICAgICAgICAgICAgICAgNTc2MCAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCkgPj4gMTUpIC8gMTAwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfQVAzX0RFTEFZICAgICAgICAgICAgICAgMTY4NSAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNCkgPj4gMTUpIC8gMTUwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfQVAyX0RFTEFZICAgICAgICAgICAgICAgMjIxOCAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCkgPj4gMTUpIC8gMTUwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfQVAxX0RFTEFZICAgICAgICAgICAgICAgMjkxOCAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCkgPj4gMTUpIC8gMTUwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfQVAwX0RFTEFZICAgICAgICAgICAgICAgMzg0MCAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCkgPj4gMTUpIC8gMTUwMCAqLworI2Vsc2UKKyAgICAvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNCkgPj4gMTUpIC8gMTAwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfVDNfREVMQVkgICAgICAgICAgICAgICAxMDEwOAorICAgIC8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80KSA+PiAxNSkgLyAxMDAwICovCisjZGVmaW5lIExWUkVWX01BWF9UMl9ERUxBWSAgICAgICAgICAgICAgIDEzMzA0CisgICAgLyogKCgxOTIwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX1QxX0RFTEFZICAgICAgICAgICAgICAgMTc1MDgKKyAgICAvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCkgPj4gMTUpIC8gMTAwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfVDBfREVMQVkgICAgICAgICAgICAgICAyMzA0MAorICAgIC8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80KSA+PiAxNSkgLyAxNTAwICovCisjZGVmaW5lIExWUkVWX01BWF9BUDNfREVMQVkgICAgICAgICAgICAgICA2NzQwCisgICAgLyogKCgxOTIwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX0FQMl9ERUxBWSAgICAgICAgICAgICAgIDg4NzIKKyAgICAvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCkgPj4gMTUpIC8gMTUwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfQVAxX0RFTEFZICAgICAgICAgICAgICAxMTY3MgorICAgIC8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMF9vbl80KSA+PiAxNSkgLyAxNTAwICovCisjZGVmaW5lIExWUkVWX01BWF9BUDBfREVMQVkgICAgICAgICAgICAgIDE1MzYwCisjZW5kaWYKKwogI2RlZmluZSBMVlJFVl9CWVBBU1NNSVhFUl9UQyAgICAgICAgICAgICAxMDAwICAgICAgICAgICAvKiBCeXBhc3MgbWl4ZXIgdGltZSBjb25zdGFudCovCiAjZGVmaW5lIExWUkVWX0FMTFBBU1NfVEMgICAgICAgICAgICAgICAgIDEwMDAgICAgICAgICAgIC8qIEFsbC1wYXNzIGZpbHRlciB0aW1lIGNvbnN0YW50ICovCiAjZGVmaW5lIExWUkVWX0FMTFBBU1NfVEFQX1RDICAgICAgICAgICAgIDEwMDAwICAgICAgICAgICAvKiBBbGwtcGFzcyBmaWx0ZXIgZGVseSB0YXAgY2hhbmdlICovCkBAIC03Niw3ICsxMjAsMTIgQEAKICNkZWZpbmUgTFZSRVZfT1VUUFVUR0FJTl9TSElGVCAgICAgICAgICAgICAgNSAgICAgICAgICAgLyogQml0cyBzaGlmdCBmb3Igb3V0cHV0IGdhaW4gY29ycmVjdGlvbiAqLwogCiAvKiBQYXJhbWV0ZXIgbGltaXRzICovCisjaWZuZGVmIEhJR0hFUl9GUwogI2RlZmluZSBMVlJFVl9OVU1fRlMgICAgICAgICAgICAgICAgICAgICAgICA5ICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc3VwcG9ydGVkIHNhbXBsZSByYXRlcyAqLworI2Vsc2UKKyNkZWZpbmUgTFZSRVZfTlVNX0ZTICAgICAgICAgICAgICAgICAgICAgICAxMSAgICAgICAgICAgLyogTnVtYmVyIG9mIHN1cHBvcnRlZCBzYW1wbGUgcmF0ZXMgKi8KKyNlbmRpZgorCiAjZGVmaW5lIExWUkVWX01BWEJMS1NJWkVfTElNSVQgICAgICAgICAgICAgNjQgICAgICAgICAgIC8qIE1heGltdW0gYmxvY2sgc2l6ZSBsb3cgbGltaXQgKi8KICNkZWZpbmUgTFZSRVZfTUFYX0xFVkVMICAgICAgICAgICAgICAgICAgIDEwMCAgICAgICAgICAgLyogTWF4aW11bSBsZXZlbCwgMTAwJSAqLwogI2RlZmluZSBMVlJFVl9NSU5fTFBGX0NPUk5FUiAgICAgICAgICAgICAgIDUwICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgbGltaXRzICovCkBAIC05NSw2ICsxNDQsNyBAQAogLyogIFN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogLyogRmFzdCBkYXRhIHN0cnVjdHVyZSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKQEAgLTE2MSw3ICsyMTEsODEgQEAKIAogfSBMVlJFVl9JbnN0YW5jZV9zdDsKIAorI2Vsc2UgLyogQlVJTERfRkxPQVQgKi8KIAorLyogRmFzdCBkYXRhIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCBIUFRhcHM7ICAgICAgICAgICAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciB0YXBzICovCisgICAgQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QgTFBUYXBzOyAgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciB0YXBzICovCisgICAgQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QgUmV2TFBUYXBzWzRdOyAgICAgICAgICAgICAgIC8qIFJldmVyYiBsb3cgcGFzcyBmaWx0ZXJzIHRhcHMgKi8KKworfSBMVlJFVl9GYXN0RGF0YV9zdDsKKworCisvKiBGYXN0IGNvZWZmaWNpZW50IHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKworICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIEhQQ29lZnM7ICAgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIExQQ29lZnM7ICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzICovCisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgUmV2TFBDb2Vmc1s0XTsgICAgICAgIC8qIFJldmVyYiBsb3cgcGFzcyBmaWx0ZXJzIGNvZWZmaWNpZW50cyAqLworCit9IExWUkVWX0Zhc3RDb2VmX3N0OwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBHZW5lcmFsICovCisgICAgTFZSRVZfSW5zdGFuY2VQYXJhbXNfc3QgSW5zdGFuY2VQYXJhbXM7ICAgICAgICAgICAvKiBJbml0aWFsaXNhdGlvbiB0aW1lIGluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9NZW1vcnlUYWJsZV9zdCAgICBNZW1vcnlUYWJsZTsgICAgICAgICAgICAgIC8qIE1lbW9yeSB0YWJsZSAqLworICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgIEN1cnJlbnRQYXJhbXM7ICAgICAgICAgICAgLyogUGFyYW1ldGVycyBiZWluZyB1c2VkICovCisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgTmV3UGFyYW1zOyAgICAgICAgICAgICAgICAvKiBOZXcgcGFyYW1ldGVycyBmcm9tIHRoZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsaW5nIGFwcGxpY2F0aW9uICovCisgICAgTFZNX0NIQVIgICAgICAgICAgICAgICAgYkNvbnRyb2xQZW5kaW5nOyAgICAgICAgICAvKiBGbGFnIHRvIGluZGljYXRlIG5ldyBwYXJhbWV0ZXJzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBhdmFpbGFibGUgKi8KKyAgICBMVk1fQ0hBUiAgICAgICAgICAgICAgICBiRmlyc3RDb250cm9sOyAgICAgICAgICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY29udHJvbCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lICovCisgICAgTFZNX0NIQVIgICAgICAgICAgICAgICAgYkRpc2FibGVSZXZlcmI7ICAgICAgICAgICAvKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIG1peCBsZXZlbCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCUgYW5kIHRoZSByZXZlcmIgY2FuIGJlIGRpc2FibGVkICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgUm9vbVNpemVJbm1zOyAgICAgICAgICAgICAvKiBSb29tIHNpemUgaW4gbXNlYyAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIE1heEJsa0xlbjsgICAgICAgICAgICAgICAgLyogTWF4aW11bSBibG9jayBzaXplIGZvciBpbnRlcm5hbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyAqLworCisgICAgLyogQWxpZ25lZCBtZW1vcnkgcG9pbnRlcnMgKi8KKyAgICBMVlJFVl9GYXN0RGF0YV9zdCAgICAgICAqcEZhc3REYXRhOyAgICAgICAgICAgICAgIC8qIEZhc3QgZGF0YSBtZW1vcnkgYmFzZSBhZGRyZXNzICovCisgICAgTFZSRVZfRmFzdENvZWZfc3QgICAgICAgKnBGYXN0Q29lZjsgICAgICAgICAgICAgICAvKiBGYXN0IGNvZWZmaWNpZW50IG1lbW9yeSBiYXNlIGFkZHJlc3MgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2hEZWxheUxpbmVbNF07ICAgIC8qIERlbGF5IGxpbmUgc2NyYXRjaCBtZW1vcnkgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2g7ICAgICAgICAgICAgICAgIC8qIE11bHRpIHVzc2dlIHNjcmF0Y2ggKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcElucHV0U2F2ZTsgICAgICAgICAgICAgIC8qIFJldmVyYiBibG9jayBpbnB1dCBzYXZlIGZvciBkcnkvd2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXhpbmcqLworCisgICAgLyogRmVlZGJhY2sgbWF0cml4ICovCisgICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgRmVlZGJhY2tNaXhlcls0XTsgICAgICAgICAvKiBNaXhlciBmb3IgUG9wIGFuZCBDbGljayBTdXByZXNzaW9uIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdXNlZCBieSBmZWVkYmFjayBHYWluICovCisKKworICAgIC8qIEFsbC1QYXNzIEZpbHRlciAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIFRbNF07ICAgICAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBkZWxheSBzaXplIG9mIGJ1ZmZlciAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGVsYXlfVFs0XTsgICAgICAgICAgICAgLyogUG9pbnRlciB0byBkZWxheSBidWZmZXJzICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgRGVsYXlfQVBbNF07ICAgICAgICAgICAgICAvKiBPZmZzZXQgdG8gQVAgZGVsYXkgYnVmZmVyIHN0YXJ0ICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgQUJfU2VsZWN0aW9uOyAgICAgICAgICAgICAvKiBTbW9vdGggZnJvbSB0YXAgQSB0byBCIHdoZW4gMSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgQiB0byBBICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQV9EZWxheVNpemVbNF07ICAgICAgICAgICAvKiBBIGRlbGF5IGxlbmd0aCBpbiBzYW1wbGVzICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQl9EZWxheVNpemVbNF07ICAgICAgICAgICAvKiBCIGRlbGF5IGxlbmd0aCBpbiBzYW1wbGVzICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBPZmZzZXRBWzRdOyAgICAgICAgICAgICAvKiBPZmZzZXQgZm9yIHRoZSBBIGRlbGF5IHRhcCAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwT2Zmc2V0Qls0XTsgICAgICAgICAgICAgLyogT2Zmc2V0IGZvciB0aGUgQiBkZWxheSB0YXAgKi8KKyAgICBNaXhfMlN0X0NsbF9GTE9BVF90ICAgICBNaXhlcl9BUFRhcHNbNF07ICAgICAgICAgIC8qIFNtb290aGVkIEFQIGRlbGF5IG1peGVyICovCisgICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgTWl4ZXJfU0dGZWVkYmFja1s0XTsgICAgICAvKiBTbW9vdGhlZCBTQWZlZWRiYWNrIGdhaW4gKi8KKyAgICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICBNaXhlcl9TR0ZlZWRmb3J3YXJkWzRdOyAgIC8qIFNtb290aGVkIEFQIGZlZWRmb3J3YXJkIGdhaW4gKi8KKworICAgIC8qIE91dHB1dCBnYWluICovCisgICAgTWl4XzJTdF9DbGxfRkxPQVRfdCAgICAgQnlwYXNzTWl4ZXI7ICAgICAgICAgICAgICAvKiBEcnkvd2V0IG1peGVyICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgR2FpbjsgICAgICAgICAgICAgICAgICAgICAvKiBHYWluIGFwcGxpZWQgdG8gb3V0cHV0IHRvIG1haW50YWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmVyYWdlIHNpZ25hbCBwb3dlciAqLworICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgIEdhaW5NaXhlcjsgICAgICAgICAgICAgICAgLyogR2FpbiBzbW9vdGhpbmcgKi8KKworfSBMVlJFVl9JbnN0YW5jZV9zdDsKKworI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIEZ1bmN0aW9uIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xNjksMTIgKzI5MywxNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIExWUkVWX1JldHVyblN0YXR1c19lbiAgIExWUkVWX0FwcGx5TmV3U2V0dGluZ3MoTFZSRVZfSW5zdGFuY2Vfc3QgICAgICpwUHJpdmF0ZSk7Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCAgICAgICAgICAgICAgICAgICAgUmV2ZXJiQmxvY2soTFZNX0ZMT0FUICAgICAgICAgICAqcElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0luc3RhbmNlX3N0ICAgKnBQcml2YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICBOdW1TYW1wbGVzKTsKKyNlbHNlCiB2b2lkICAgICAgICAgICAgICAgICAgICBSZXZlcmJCbG9jayhMVk1fSU5UMzIgICAgICAgICAgICpwSW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICpwT3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfSW5zdGFuY2Vfc3QgICAqcFByaXZhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgIE51bVNhbXBsZXMpOwotCisjZW5kaWYKIExWTV9JTlQzMiAgICAgICAgICAgICAgIEJ5cGFzc01peGVyX0NhbGxiYWNrKHZvaWQgICAgICAgKnBDYWxsYmFja0RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICpwR2VuZXJhbFB1cnBvc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIEdlbmVyYWxQdXJwb3NlICk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmMKaW5kZXggNWM3YThhMC4uNTY2ZDg0ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1Byb2Nlc3MuYwpAQCAtNDYsMTQgKzQ2LDI2IEBACiAvKiAgMS4gVGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBtdXN0IGJlIDMyLWJpdCBhbGlnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9Qcm9jZXNzKExWUkVWX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX1VJTlQxNiAgICBOdW1TYW1wbGVzKQorI2Vsc2UKIExWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9Qcm9jZXNzKExWUkVWX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgKnBPdXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX1VJTlQxNiAgICBOdW1TYW1wbGVzKQorI2VuZGlmCiB7CiAgICBMVlJFVl9JbnN0YW5jZV9zdCAgICAgKnBMVlJFVl9Qcml2YXRlID0gKExWUkVWX0luc3RhbmNlX3N0ICopaEluc3RhbmNlOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBJbnB1dCAgPSAoTFZNX0ZMT0FUICopcEluRGF0YTsKKyAgIExWTV9GTE9BVCAgICAgICAgICAgICAqcE91dHB1dCA9IHBPdXREYXRhOworI2Vsc2UKICAgIExWTV9JTlQzMiAgICAgICAgICAgICAqcElucHV0ICA9IChMVk1fSU5UMzIgKilwSW5EYXRhOwogICAgTFZNX0lOVDMyICAgICAgICAgICAgICpwT3V0cHV0ID0gcE91dERhdGE7CisjZW5kaWYKICAgIExWTV9JTlQzMiAgICAgICAgICAgICBTYW1wbGVzVG9Qcm9jZXNzLCBSZW1haW5pbmdTYW1wbGVzOwogICAgTFZNX0lOVDMyICAgICAgICAgICAgIGZvcm1hdCA9IDE7CiAKQEAgLTEwNSw3ICsxMTcsNyBAQAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIENvcHkgdGhlIGRhdGEgdG8gdGhlIG91dHB1dCBidWZmZXIsIGNvbnZlcnQgdG8gc3RlcmVvIGlzIHJlcXVpcmVkCiAgICAgICAgICAgICAgKi8KLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICAgICAgaWYocExWUkVWX1ByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NT05PKXsKICAgICAgICAgICAgICAgICBNb25vVG8ySV8zMihwSW5wdXQsIHBPdXRwdXQsIE51bVNhbXBsZXMpOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTExMyw2ICsxMjUsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKilwT3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtU2FtcGxlcyA8PCAyKSk7IC8vIDMyIGJpdCBkYXRhLCBzdGVyZW8KICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICBpZihwTFZSRVZfUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX01PTk8peworICAgICAgICAgICAgICAgIE1vbm9UbzJJX0Zsb2F0KHBJbnB1dCwgcE91dHB1dCwgTnVtU2FtcGxlcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIENvcHlfRmxvYXQocElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bVNhbXBsZXMgPDwgMSkpOyAvLyAzMiBiaXQgZGF0YSwgc3RlcmVvCisgICAgICAgICAgICB9CisjZW5kaWYKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOwpAQCAtMTQzLDkgKzE2NCwxMyBAQAogICAgICAgICB9CiAKICAgICAgICAgUmV2ZXJiQmxvY2socElucHV0LCBwT3V0cHV0LCBwTFZSRVZfUHJpdmF0ZSwgKExWTV9VSU5UMTYpU2FtcGxlc1RvUHJvY2Vzcyk7Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBwSW5wdXQgID0gKExWTV9GTE9BVCAqKShwSW5wdXQgKyAoU2FtcGxlc1RvUHJvY2VzcyAqIGZvcm1hdCkpOworICAgICAgICBwT3V0cHV0ID0gKExWTV9GTE9BVCAqKShwT3V0cHV0ICsgKFNhbXBsZXNUb1Byb2Nlc3MgKiAyKSk7ICAgICAgLy8gQWx3YXlzIHN0ZXJlbyBvdXRwdXQKKyNlbHNlCiAgICAgICAgIHBJbnB1dCAgPSAoTFZNX0lOVDMyICopKHBJbnB1dCArKFNhbXBsZXNUb1Byb2Nlc3MqZm9ybWF0KSk7Ci0gICAgICAgIHBPdXRwdXQgPSAoTFZNX0lOVDMyICopKHBPdXRwdXQrKFNhbXBsZXNUb1Byb2Nlc3MqMikpOyAgICAgIC8vIEFsd2F5cyBzdGVyZW8gb3V0cHV0CisgICAgICAgIHBPdXRwdXQgPSAoTFZNX0lOVDMyICopKHBPdXRwdXQrKFNhbXBsZXNUb1Byb2Nlc3MqMikpOworI2VuZGlmCiAgICAgfQogCiAgICAgcmV0dXJuIExWUkVWX1NVQ0NFU1M7CkBAIC0xNzUsNyArMjAwLDcgQEAKIC8qICAxLiBUaGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIG11c3QgYmUgMzItYml0IGFsaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCBSZXZlcmJCbG9jayhMVk1fSU5UMzIgKnBJbnB1dCwgTFZNX0lOVDMyICpwT3V0cHV0LCBMVlJFVl9JbnN0YW5jZV9zdCAqcFByaXZhdGUsIExWTV9VSU5UMTYgTnVtU2FtcGxlcykKIHsKICAgICBMVk1fSU5UMTYgICBqLCBzaXplOwpAQCAtNDc5LDcgKzUwNCwzMjIgQEAKIAogICAgIHJldHVybjsKIH0KKyNlbHNlCit2b2lkIFJldmVyYkJsb2NrKExWTV9GTE9BVCAqcElucHV0LCBMVk1fRkxPQVQgKnBPdXRwdXQsCisgICAgICAgICAgICAgICAgIExWUkVWX0luc3RhbmNlX3N0ICpwUHJpdmF0ZSwgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKQoreworICAgIExWTV9JTlQxNiAgIGosIHNpemU7CisgICAgTFZNX0ZMT0FUICAgKnBEZWxheUxpbmU7CisgICAgTFZNX0ZMT0FUICAgKnBEZWxheUxpbmVJbnB1dCA9IHBQcml2YXRlLT5wU2NyYXRjaDsKKyAgICBMVk1fRkxPQVQgICAqcFNjcmF0Y2ggPSBwUHJpdmF0ZS0+cFNjcmF0Y2g7CisgICAgTFZNX0ZMT0FUICAgKnBJbjsKKyAgICBMVk1fRkxPQVQgICAqcFRlbXAgPSBwUHJpdmF0ZS0+cElucHV0U2F2ZTsKKyAgICBMVk1fSU5UMzIgICBOdW1iZXJPZkRlbGF5TGluZXM7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogQWxsIGNhbGN1bGF0aW9ucyB3aWxsIGdvIGludG8gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IHBUZW1wLCB0aGlzIHdpbGwgICAgKgorICAgICAqIHRoZW4gYmUgbWl4ZWQgd2l0aCB0aGUgb3JpZ2luYWwgaW5wdXQgdG8gY3JlYXRlIHRoZSBmaW5hbCBvdXRwdXQuICAgICAgICAgICoKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogV2hlbiBJTlBMQUNFIHByb2Nlc3NpbmcgaXMgc2VsZWN0ZWQgdGhpcyBtdXN0IGJlIGEgdGVtcG9yYXJ5IGJ1ZmZlciBhbmQgICAgKgorICAgICAqIGhlbmNlIHRoaXMgaXMgdGhlIHdvcnN0IGNhc2UsIHNvIGZvciBzaW1wbGljaXR5IHRoaXMgd2lsbCBBTFdBWVMgYmUgc28gICAgICoKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogVGhlIGlucHV0IGJ1ZmZlciB3aWxsIHJlbWFpbiB1bnRvdWNoZWQgdW50aWwgdGhlIG91dHB1dCBvZiB0aGUgbWl4ZXIgaWYgICAgKgorICAgICAqIElOUExBQ0UgcHJvY2Vzc2luZyBpcyBzZWxlY3RlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogVGhlIHRlbXAgYnVmZmVyIHdpbGwgYWx3YXlzIGJlIE51bVNhbXBsZXMgaW4gc2l6ZSByZWdhcmRsZXNzIG9mIE1PTk8gb3IgICAgKgorICAgICAqIFNURVJFTyBpbnB1dC4gSW4gdGhlIGNhc2Ugb2Ygc3RlcmVvIGlucHV0IGFsbCBwcm9jZXNzaW5nIGlzIGRvbmUgaW4gTU9OTyAgICoKKyAgICAgKiBhbmQgdGhlIGZpbmFsIG91dHB1dCBpcyBjb252ZXJ0ZWQgdG8gU1RFUkVPIGFmdGVyIHRoZSBtaXhlciAgICAgICAgICAgICAgICAqCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQorICAgIHsKKyAgICAgICAgTnVtYmVyT2ZEZWxheUxpbmVzID0gNDsKKyAgICB9CisgICAgZWxzZSBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKKyAgICB7CisgICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDE7CisgICAgfQorCisgICAgaWYocFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NT05PKQorICAgIHsKKyAgICAgICAgcEluID0gcElucHV0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiAgU3RlcmVvIHRvIG1vbm8gY29udmVyc2lvbgorICAgICAgICAgKi8KKworICAgICAgICBGcm9tMmlUb01vbm9fRmxvYXQocElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICBwSW4gPSBwVGVtcDsKKyAgICB9CisKKyAgICBNdWx0M3NfRmxvYXQocEluLAorICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKUxWUkVWX0hFQURST09NLAorICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgIC8qCisgICAgICogIEhpZ2ggcGFzcyBmaWx0ZXIKKyAgICAgKi8KKyAgICBGT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMSgmcFByaXZhdGUtPnBGYXN0Q29lZi0+SFBDb2VmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgIC8qCisgICAgICogIExvdyBwYXNzIGZpbHRlcgorICAgICAqLworICAgIEZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxKCZwUHJpdmF0ZS0+cEZhc3RDb2VmLT5MUENvZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgCisgICAgLyoKKyAgICAgKiAgUHJvY2VzcyBhbGwgZGVsYXkgbGluZXMKKyAgICAgKi8KKworICAgIGZvcihqID0gMDsgaiA8IE51bWJlck9mRGVsYXlMaW5lczsgaisrKQorICAgIHsKKyAgICAgICAgcERlbGF5TGluZSA9IHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVtqXTsKKworICAgICAgICAvKgorICAgICAgICAgKiBBbGwtcGFzcyBmaWx0ZXIgd2l0aCBwb3AgYW5kIGNsaWNrIHN1cHByZXNzaW9uCisgICAgICAgICAqLworICAgICAgICAvKiBHZXQgdGhlIHNtb290aGVkLCBkZWxheWVkIG91dHB1dC4gUHV0IGl0IGluIHRoZSBvdXRwdXQgYnVmZmVyICovCisgICAgICAgIE1peFNvZnRfMlN0X0QzMkMzMV9TQVQoJnBQcml2YXRlLT5NaXhlcl9BUFRhcHNbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBPZmZzZXRBW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wT2Zmc2V0QltqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIC8qIFJlLWFsaWduIHRoZSBhbGwgcGFzcyBmaWx0ZXIgZGVsYXkgYnVmZmVyIGFuZCBjb3B5aW5nIHRoZSBmaXhlZCBkZWxheSBkYXRhIFwKKyAgICAgICAgICAgdG8gdGhlIEFQIGRlbGF5IGluIHRoZSBwcm9jZXNzICovCisgICAgICAgIENvcHlfRmxvYXQoJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtOdW1TYW1wbGVzXSwKKyAgICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cERlbGF5X1Rbal0sCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikocFByaXZhdGUtPlRbal0gLSBOdW1TYW1wbGVzKSk7ICAgICAgICAgLyogMzItYml0IGRhdGEgKi8KKyAgICAgICAgLyogQXBwbHkgdGhlIHNtb290aGVkIGZlZWRiYWNrIGFuZCBzYXZlIHRvIGZpeGVkIGRlbGF5IGlucHV0IChjdXJyZW50bHkgZW1wdHkpICovCisgICAgICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoJnBQcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+VFtqXSAtIE51bVNhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIC8qIFN1bSBpbnRvIHRoZSBBUCBkZWxheSBsaW5lICovCisgICAgICAgIE1hYzNzX1NhdF9GbG9hdCgmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5UW2pdIC0gTnVtU2FtcGxlc10sCisgICAgICAgICAgICAgICAgICAgICAgICAtMS4wZiwgICAgLyogSW52ZXJ0IHNpbmNlIHRoZSBmZWVkYmFjayBjb2VmZmljaWVudCBpcyBuZWdhdGl2ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+RGVsYXlfQVBbal0gLSBOdW1TYW1wbGVzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIC8qIEFwcGx5IHNtb290aGVkIGZlZWRmb3J3YXJkIHNhbmQgc2F2ZSB0byBmaXhlZCBkZWxheSBpbnB1dCAoY3VycmVudGx5IGVtcHR5KSAqLworICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCZwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5EZWxheV9BUFtqXSAtIE51bVNhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUHJpdmF0ZS0+cERlbGF5X1Rbal1bcFByaXZhdGUtPlRbal0gLSBOdW1TYW1wbGVzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAvKiBTdW0gaW50byB0aGUgQVAgb3V0cHV0ICovCisgICAgICAgIE1hYzNzX1NhdF9GbG9hdCgmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5UW2pdIC0gTnVtU2FtcGxlc10sCisgICAgICAgICAgICAgICAgICAgICAgICAxLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogIEZlZWRiYWNrIGdhaW4KKyAgICAgICAgICovCisgICAgICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoJnBQcml2YXRlLT5GZWVkYmFja01peGVyW2pdLCBwRGVsYXlMaW5lLCBwRGVsYXlMaW5lLCBOdW1TYW1wbGVzKTsKKworICAgICAgICAvKgorICAgICAgICAgKiAgTG93IHBhc3MgZmlsdGVyCisgICAgICAgICAqLworICAgICAgICBGT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMSgmcFByaXZhdGUtPnBGYXN0Q29lZi0+UmV2TFBDb2Vmc1tqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqICBBcHBseSByb3RhdGlvbiBtYXRyaXggYW5kIGRlbGF5IHNhbXBsZXMKKyAgICAgKi8KKyAgICBmb3IoaiA9IDA7IGogPCBOdW1iZXJPZkRlbGF5TGluZXM7IGorKykKKyAgICB7CisKKyAgICAgICAgQ29weV9GbG9hdChwVGVtcCwKKyAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtU2FtcGxlcykpOworICAgICAgICAvKgorICAgICAgICAgKiAgUm90YXRpb24gbWF0cml4IG1peAorICAgICAgICAgKi8KKyAgICAgICAgc3dpdGNoKGopCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAxIGFuZCAyIGNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLCAtMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsyXSwgLTEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDAgYW5kIDMgY29udHJpYnV0aW9uCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sIC0xLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzNdLCAtMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDAgYW5kIDMgY29udHJpYnV0aW9uCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCAtMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzNdLCBwRGVsYXlMaW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDAgYW5kIDEgY29udHJpYnV0aW9uCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgLTEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwgLTEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDEgYW5kIDIgY29udHJpYnV0aW9uCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLCAtMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzJdLCBwRGVsYXlMaW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAwIGFuZCAxIGNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCBwRGVsYXlMaW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sIC0xLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAwIGNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICBTT1VSQ0UgICAgICAgICAgICAgICAgICAgICAgICAgIERFU1RJTkFUSU9OKi8KKyAgICAgICAgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCBwRGVsYXlMaW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqICBEZWxheSBzYW1wbGVzCisgICAgICAgICAqLworICAgICAgICBDb3B5X0Zsb2F0KHBEZWxheUxpbmVJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5UW2pdIC0gTnVtU2FtcGxlc10sCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAgLyogMzItYml0IGRhdGEgKi8KKyAgICB9CiAKIAorICAgIC8qCisgICAgICogIENyZWF0ZSBzdGVyZW8gb3V0cHV0CisgICAgICovCisgICAgc3dpdGNoKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMpCisgICAgeworICAgICAgICBjYXNlIExWUkVWX0RFTEFZTElORVNfNDoKKyAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisKKyAgICAgICAgICAgIEpvaW5UbzJpX0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMVlJFVl9ERUxBWUxJTkVTXzI6CisKKyAgICAgICAgICAgICBDb3B5X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtU2FtcGxlcykpOworCisgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisKKyAgICAgICAgICAgICBKb2luVG8yaV9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExWUkVWX0RFTEFZTElORVNfMToKKyAgICAgICAgICAgIE1vbm9UbzJJX0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisKKyAgICAvKgorICAgICAqICBEcnkvd2V0IG1peGVyCisgICAgICovCisKKyAgICBzaXplID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyA8PCAxKTsKKyAgICBNaXhTb2Z0XzJTdF9EMzJDMzFfU0FUKCZwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworCisgICAgLyogQXBwbHkgR2FpbiovCisKKyAgICBTaGlmdF9TYXRfRmxvYXQoTFZSRVZfT1VUUFVUR0FJTl9TSElGVCwKKyAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CisKKyAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCZwUHJpdmF0ZS0+R2Fpbk1peGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKworICAgIHJldHVybjsKK30KKyNlbmRpZgogLyogRW5kIG9mIGZpbGUgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzLmMKaW5kZXggZjU4OTVhNy4uYTcxOTA1MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jCkBAIC02MSwxMCArNjEsMTUgQEAKICAgICAgKiBDaGVjayBhbGwgbmV3IGNvbnRyb2wgcGFyYW1ldGVycyBhcmUgaW4gcmFuZ2UKICAgICAgKi8KICAgICBpZiggICAgKChwTmV3UGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IExWTV9NT0RFX09GRikgJiYgKHBOZXdQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT04pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgKChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTEwMjUpICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMjAwMCkgICAgICAgJiYKKyAgICAgICAgKAorICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzExMDI1KSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTIwMDApICAgICAgICYmCiAgICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xNjAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzIyMDUwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjQwMDApICAgICAgICYmCi0gICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18zMjAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ0MTAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDgwMDApKSAgICAgIHx8Ci0gICAgICAgICgocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICYmIChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk9JTlNURVJFTykgJiYgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykpICkKKyAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkgICAgICAKKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzk2MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTkyMDAwKQorI2VuZGlmCisgICAgICAgICkKKyAgICAgICAgfHwgKChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX1NURVJFTykgJiYgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OT0lOU1RFUkVPKSAmJiAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PKSkgKQogICAgIHsKICAgICAgICAgcmV0dXJuIChMVlJFVl9PVVRPRlJBTkdFKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jCmluZGV4IDVhNmQ0M2QuLmIzZWRjNjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jCkBAIC0yOSw2ICsyOSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogVGFibGUgd2l0aCBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMuICBUaGUgdGFibGUgY2FuIGJlIGluZGV4ZWQgdXNpbmcgTFZNX0ZzX2VuICAgICAgICovCisjaWZuZGVmIEhJR0hFUl9GUwogY29uc3QgTFZNX1VJTlQxNiBMVk1fRnNUYWJsZVtdID0gewogICAgIDgwMDAgLAogICAgIDExMDI1LApAQCAtNDAsMTQgKzQxLDM3IEBACiAgICAgNDQxMDAsCiAgICAgNDgwMDAKIH07Ci0KKyNlbHNlCitjb25zdCBMVk1fVUlOVDMyIExWTV9Gc1RhYmxlW10gPSB7CisgICAgODAwMCAsCisgICAgMTEwMjUsCisgICAgMTIwMDAsCisgICAgMTYwMDAsCisgICAgMjIwNTAsCisgICAgMjQwMDAsCisgICAgMzIwMDAsCisgICAgNDQxMDAsCisgICAgNDgwMDAsCisgICAgOTYwMDAsCisgICAgMTkyMDAwCit9OworI2VuZGlmCiAvKiBUYWJsZSB3aXRoIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcy4gIFRoZSB0YWJsZSBjYW4gYmUgaW5kZXhlZCB1c2luZyBMVk1fRnNfZW4gICAgICAgKi8KKyNpZm5kZWYgSElHSEVSX0ZTCiBMVk1fVUlOVDE2IExWTV9HZXRGc0Zyb21UYWJsZShMVk1fRnNfZW4gRnNJbmRleCl7CiAgICAgaWYgKEZzSW5kZXggPiBMVk1fRlNfNDgwMDApCiAgICAgICAgIHJldHVybiAwOwogCiAgICAgcmV0dXJuIChMVk1fRnNUYWJsZVtGc0luZGV4XSk7CiB9CisjZWxzZQorTFZNX1VJTlQzMiBMVk1fR2V0RnNGcm9tVGFibGUoTFZNX0ZzX2VuIEZzSW5kZXgpeworICAgIGlmIChGc0luZGV4ID4gTFZNX0ZTXzE5MjAwMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gKExWTV9Gc1RhYmxlW0ZzSW5kZXhdKTsKK30KKyNlbmRpZgogCiAvKiBJbiBvcmRlciB0byBtYWludGFpbiBjb25zaXN0YW50IGlucHV0IGFuZCBvdXQgcHV0IHNpZ25hbCBzdHJlbmd0aHMKICAgIG91dHB1dCBnYWluL2F0dGVudWF0aW9uIGlzIGFwcGxpZWQuIFRoaXMgZ2FpbiBkZXBlbmRzIG9uIFQ2MCBhbmQgUm9vbXMKQEAgLTY5LDYgKzkzLDcgQEAKICAgKi8KIAogLyogTm9ybWFsaXppbmcgb3V0cHV0IGluY2x1ZGluZyBSZXZlcmIgTGV2ZWwgcGFydCAob25seSBzaGlmdCB1cCkqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogY29uc3QgTFZNX0lOVDMyIExWUkVWX0dhaW5Qb2x5VGFibGVbMjRdWzVdPXt7MSwxNzU0NzQzNCwxMjg4Njc0MzQsLTEyMDk4ODg5Niw1MDc2MTIyOCx9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MiwxODI1Njg2OSwxNzI2NjY5MDIsLTE5MzE2OTI5Miw4ODM0NTc0NCx9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MywxNjU5MTMxMSwxMzkyNTAxNTEsLTE0OTY2NzIzNCw2Njc3MDA1OSx9LApAQCAtOTQsNiArMTE5LDMyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs5MCwxNjAwMzMyMiw0ODMyMzY2MSwtMzU2MDczNzgsMTMxNTM4NzIsfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEwMCwxNTk1NTIyMyw0ODU1ODIwMSwtMzM3MDY4NjUsMTE3MTU3OTIsfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQorI2Vsc2UKK2NvbnN0IExWTV9GTE9BVCBMVlJFVl9HYWluUG9seVRhYmxlWzI0XVs1XT17ezEsMS4wNDU5MDlmLDcuNjgxMDk4ZiwtNy4yMTE1MDBmLDMuMDI1NjA1Zix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MiwxLjA4ODE5NGYsMTAuMjkxNzQ5ZiwtMTEuNTEzNzg3Ziw1LjI2NTgxN2YsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezMsMC45ODg5MTlmLDguMjk5OTU2ZiwtOC45MjA4NjJmLDMuOTc5ODA2Zix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NCwxLjAzNTkyN2YsMTAuMTgyNTY3ZiwtMTAuMzQ2MTM0Ziw0LjU0NjUzM2YsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezUsMS4xMzAzMTNmLDEyLjUzODcyN2YsLTEzLjYyNzAyM2YsNi4xNjUyMDhmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs2LDEuMDYwNzQzZiw4LjA5MTcxM2YsLTguNTg4MDc5ZiwzLjgzNDIzMGYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezcsMS4wNDAzODFmLDEwLjQwNjU2NmYsLTExLjE3NjY1MGYsNS4wNzUxMzJmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs4LDEuMDI2OTQ0Ziw4LjM4NzMwMmYsLTguNjg5Nzk2ZiwzLjg5NTg2M2YsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezksMS4wMTMzMTJmLDkuNzI3MjM2ZiwtMTAuNTM0MTY1Ziw0Ljc0MjI3MmYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEwLDAuOTk2MDk1Ziw4LjQ5MjI0OWYsLTcuOTQ3Njc3ZiwzLjQ3ODkxN2YsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEzLDEuMDc5MzQ2Ziw4Ljg5NDQyNWYsLTkuNjQxNzY4Ziw0LjQzNDQ0MmYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezE1LDAuOTk0MzI3Ziw3LjQ0MTMzNWYsLTguMDAzOTc5ZiwzLjU4MTE3N2YsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezE3LDAuOTkxMDY3Ziw3LjIwODM3M2YsLTcuMjU3ODU5ZiwzLjE2Nzc3NGYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezIwLDEuMDMzNDQ1Ziw3LjQ3NjM3MWYsLTcuNTQ2OTYwZiwzLjM2OTcwM2YsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezI1LDAuOTgyODMwZiw1LjkxMzg2N2YsLTUuNjM4NDQ4ZiwyLjQyMDkzMmYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezMwLDAuOTI4NzgyZiw1LjAzNTM0M2YsLTQuNDkyMTA0ZiwxLjg0NDkwNGYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezQwLDAuOTUzNzE0Ziw1LjA2MDIzMmYsLTQuNDcyMjA0ZiwxLjgyOTY0MmYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezUwLDAuODk5MjU4Ziw0LjI3MzM1N2YsLTMuNTM3NDkyZiwxLjM4NzU3NmYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezYwLDAuOTQzNTg0Ziw0LjA5MzIyOGYsLTMuNDY5NjU4ZiwxLjQxMDkxMWYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezcwLDAuOTI2MDIxZiwzLjk3MzEyNWYsLTMuMzMxOTg1ZiwxLjM0NDY5MGYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezc1LDAuODk0ODUzZiwyLjg3MTc0N2YsLTEuNDM4NzU4ZiwwLjMxMTg1NmYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezgwLDAuOTM1MTIyZiwyLjk5MTg1N2YsLTIuMDM4ODgyZiwwLjY4NjM5NWYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezkwLDAuOTUzODcyZiwyLjg4MDMxNWYsLTIuMTIyMzY1ZiwwLjc4NDAzMmYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEwMCwwLjk1MTAwNWYsMi44OTQyOTRmLC0yLjAwOTA4NmYsMC42OTgzMTZmLH0sCit9OworI2VuZGlmCiAvKiBFbmQgb2YgZmlsZSAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5oCmluZGV4IDVmOTkzYmQuLjA2NTgxODYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5oCkBAIC0zNywxMCArMzcsMTkgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpZm5kZWYgSElHSEVSX0ZTCiBleHRlcm4gY29uc3QgICAgTFZNX1VJTlQxNiAgTFZNX0ZzVGFibGVbXTsKIGV4dGVybiAgICAgICAgICBMVk1fVUlOVDE2ICBMVk1fR2V0RnNGcm9tVGFibGUoTFZNX0ZzX2VuIEZzSW5kZXgpOwotZXh0ZXJuICAgICAgICAgIExWTV9JTlQzMiAgIExWUkVWX0dhaW5Qb2x5VGFibGVbMjRdWzVdOworI2Vsc2UKK2V4dGVybiBjb25zdCAgICBMVk1fVUlOVDMyICBMVk1fRnNUYWJsZVtdOworZXh0ZXJuICAgICAgICAgIExWTV9VSU5UMzIgIExWTV9HZXRGc0Zyb21UYWJsZShMVk1fRnNfZW4gRnNJbmRleCk7CisjZW5kaWYKIAorI2lmbmRlZiBCVUlMRF9GTE9BVAorZXh0ZXJuICAgICAgICAgIExWTV9JTlQzMiAgIExWUkVWX0dhaW5Qb2x5VGFibGVbMjRdWzVdOworI2Vsc2UKK2V4dGVybiAgICAgICAgICBMVk1fRkxPQVQgICBMVlJFVl9HYWluUG9seVRhYmxlWzI0XVs1XTsKKyNlbmRpZgogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL2xpYi9MVlBTQS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvbGliL0xWUFNBLmgKaW5kZXggYTY3NWNiMi4uMjAzOGZiYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvbGliL0xWUFNBLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvbGliL0xWUFNBLmgKQEAgLTIxNiwxMSArMjE2LDE3IEBACiAvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWUFNBX1JFVFVSTiBMVlBTQV9Qcm9jZXNzICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBMVlBTQV9JbnB1dFNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICBJbnB1dEJsb2NrU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX1RpbWUgICAgICAgICAgIEF1ZGlvVGltZSAgICAgICAgICAgICApOworI2Vsc2UKIExWUFNBX1JFVFVSTiBMVlBTQV9Qcm9jZXNzICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgKnBMVlBTQV9JbnB1dFNhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICBJbnB1dEJsb2NrU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX1RpbWUgICAgICAgICAgIEF1ZGlvVGltZSAgICAgICAgICAgICApOwotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfR2V0U3BlY3RydW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Db250cm9sLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfQ29udHJvbC5jCmluZGV4IGNkNWY2OWMuLmY2YzRlYTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Db250cm9sLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0NvbnRyb2wuYwpAQCAtMjgsNiArMjgsMTUgQEAKIExWUFNBX1JFVFVSTiBMVlBTQV9TZXRRUEZDb2VmZmljaWVudHMoIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgKnBQYXJhbXMgICk7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZQU0FfUkVUVVJOIExWUFNBX0JQU2luZ2xlUHJlY0NvZWZzKCAgTFZNX1VJTlQxNiAgICAgICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICAqcEZpbHRlclBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICAgICpwQ29lZmZpY2llbnRzKTsKKworTFZQU0FfUkVUVVJOIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKCAgTFZNX1VJTlQxNiAgICAgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgKnBGaWx0ZXJQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICpwQ29lZmZpY2llbnRzKTsKKyNlbHNlCiBMVlBTQV9SRVRVUk4gTFZQU0FfQlBTaW5nbGVQcmVjQ29lZnMoICBMVk1fVUlOVDE2ICAgICAgICAgICAgIEZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgICpwRmlsdGVyUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfQzE2X0NvZWZzX3QgICAgICAgICpwQ29lZmZpY2llbnRzKTsKQEAgLTM5LDcgKzQ4LDcgQEAKIExWUFNBX1JFVFVSTiBMVlBTQV9CUERvdWJsZVByZWNDb2VmcyggIExWTV9VSU5UMTYgICAgICAgICAgICAgIEZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgICAgKnBGaWx0ZXJQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMzJfQ29lZnNfdCAgICAgICAgICAqcENvZWZmaWNpZW50cyk7Ci0KKyNlbmRpZgogTFZQU0FfUkVUVVJOIExWUFNBX1NldEJQRkNvZWZmaWNpZW50cyggTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAqcFBhcmFtcyAgKTsKIApAQCAtMTc5LDcgKzE4OCwxMSBAQAogICAgIExWTV9VSU5UMTYgRnJlcTsKICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICBQYXJhbXM7CiAgICAgZXh0ZXJuIExWTV9JTlQxNiAgICAgICAgTFZQU0FfblNhbXBsZXNCdWZmZXJVcGRhdGVbXTsKKyNpZm5kZWYgSElHSEVSX0ZTCiAgICAgZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgTFZQU0FfU2FtcGxlUmF0ZVRhYltdOworI2Vsc2UKKyAgICBleHRlcm4gTFZNX1VJTlQzMiAgICAgICBMVlBTQV9TYW1wbGVSYXRlVGFiW107CisjZW5kaWYKICAgICBleHRlcm4gTFZNX1VJTlQxNiAgICAgICBMVlBTQV9Eb3duU2FtcGxpbmdGYWN0b3JbXTsKIAogCkBAIC0yNjcsOCArMjgwLDExIEBACiBMVlBTQV9SRVRVUk4gTFZQU0FfU2V0QlBGaWx0ZXJzVHlwZSAoICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgKnBQYXJhbXMgICkKIHsKLQorI2lmbmRlZiBISUdIRVJfRlMKICAgICBleHRlcm4gTFZNX1VJTlQxNiAgIExWUFNBX1NhbXBsZVJhdGVUYWJbXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZSByYXRlIHRhYmxlICovCisjZWxzZQorICAgIGV4dGVybiBMVk1fVUlOVDMyICAgTFZQU0FfU2FtcGxlUmF0ZVRhYltdOyAgICAgICAgICAgICAgICAgLyogU2FtcGxlIHJhdGUgdGFibGUgKi8KKyNlbmRpZgogICAgIExWTV9VSU5UMTYgICAgICAgICAgaWk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGJhbmQgaW5kZXggKi8KICAgICBMVk1fVUlOVDMyICAgICAgICAgIGZzID0gKExWTV9VSU5UMzIpTFZQU0FfU2FtcGxlUmF0ZVRhYlsoTFZNX1VJTlQxNilwUGFyYW1zLT5Gc107ICAgICAgLyogU2FtcGxlIHJhdGUgKi8KICAgICBMVk1fVUlOVDMyICAgICAgICAgIGZjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBjZW50cmUgZnJlcXVlbmN5ICovCkBAIC0zNDIsMjYgKzM1OCw0MiBAQAogICAgICAgICB7CiAgICAgICAgICAgICBjYXNlICAgIExWUFNBX0RvdWJsZVByZWNpc2lvbkZpbHRlcjoKICAgICAgICAgICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgICAgICAgICBCUF9DMzJfQ29lZnNfdCAgICAgIENvZWZmaWNpZW50czsKIAogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBkb3VibGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cwogICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKChMVk1fVUlOVDE2KXBQYXJhbXMtPkZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOwogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogU2V0IHRoZSBjb2VmZmljaWVudHMKICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggJnBJbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wQlBfVGFwc1tpaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworI2Vsc2UKKyAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgQ29lZmZpY2llbnRzOworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBkb3VibGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKChMVk1fVUlOVDE2KXBQYXJhbXMtPkZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogU2V0IHRoZSBjb2VmZmljaWVudHMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggJnBJbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wQlBfVGFwc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworI2VuZGlmCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGNhc2UgICAgTFZQU0FfU2ltcGxlUHJlY2lzaW9uRmlsdGVyOgogICAgICAgICAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICAgICAgICAgIEJQX0MxNl9Db2Vmc190ICAgICAgQ29lZmZpY2llbnRzOwogCiAgICAgICAgICAgICAgICAgLyoKQEAgLTM3NCw5ICs0MDYsMjYgQEAKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIFNldCB0aGUgY29lZmZpY2llbnRzCiAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICZwSW5zdC0+cEJQX0luc3RhbmNlc1tpaV0sCisgICAgICAgICAgICAgICAgQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoJnBJbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wQlBfVGFwc1tpaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworI2Vsc2UKKyAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgQ29lZmZpY2llbnRzOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIHNpbmdsZSBwcmVjaXNpb24gY29lZmZpY2llbnRzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgTFZQU0FfQlBTaW5nbGVQcmVjQ29lZnMoKExWTV9VSU5UMTYpcFBhcmFtcy0+RnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFNldCB0aGUgY29lZmZpY2llbnRzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoJnBJbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wQlBfVGFwc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworI2VuZGlmCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQwOSwxOCArNDU4LDMxIEBACiB7CiAgICAgTFZNX1VJTlQxNiAgICAgaWk7CiAgICAgTFZNX0ZzX2VuICAgICAgRnMgPSBwUGFyYW1zLT5GczsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBRUERfQzMyX0NvZWZzICAqcENvZWZmaWNpZW50czsKICAgICBleHRlcm4gICAgICAgICBRUERfQzMyX0NvZWZzICAgICBMVlBTQV9RUERfQ29lZnNbXTsKIAotCiAgICAgcENvZWZmaWNpZW50cyA9ICZMVlBTQV9RUERfQ29lZnNbKHBQYXJhbXMtPkxldmVsRGV0ZWN0aW9uU3BlZWQgKiBMVlBTQV9OUl9TVVBQT1JURURfUkFURSkgKyBGc107CisjZWxzZQorICAgIFFQRF9GTE9BVF9Db2VmcyAgKnBDb2VmZmljaWVudHM7CisgICAgZXh0ZXJuICAgICAgICAgUVBEX0ZMT0FUX0NvZWZzICAgICBMVlBTQV9RUERfRmxvYXRfQ29lZnNbXTsKKworICAgIHBDb2VmZmljaWVudHMgPSAmTFZQU0FfUVBEX0Zsb2F0X0NvZWZzWyhwUGFyYW1zLT5MZXZlbERldGVjdGlvblNwZWVkICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUpICsgRnNdOworI2VuZGlmCiAKIAogICAgIGZvciAoaWkgPSAwOyBpaSA8IHBJbnN0LT5uUmVsZXZhbnRGaWx0ZXJzOyBpaSsrKQogICAgIHsKLSAgICAgICAgICAgIExWUFNBX1FQRF9Jbml0ICgmcEluc3QtPnBRUERfU3RhdGVzW2lpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3QtPnBRUERfVGFwc1tpaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvZWZmaWNpZW50cyApOworI2lmbmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBMVlBTQV9RUERfSW5pdCAoJnBJbnN0LT5wUVBEX1N0YXRlc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3QtPnBRUERfVGFwc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICBwQ29lZmZpY2llbnRzICk7CisjZWxzZQorICAgICAgICBMVlBTQV9RUERfSW5pdF9GbG9hdCAoJnBJbnN0LT5wUVBEX1N0YXRlc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3QtPnBRUERfVGFwc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29lZmZpY2llbnRzICk7CisjZW5kaWYKICAgICB9CiAKICAgICByZXR1cm4oTFZQU0FfT0spOwpAQCAtNDYwLDYgKzUyMiw4NyBAQAogLyogICAgIG9mIHRoZSBuIGJhbmRzIGVxdWFsaXplciAoTFZFUU5CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVlBTQV9SRVRVUk4gTFZQU0FfQlBTaW5nbGVQcmVjQ29lZnMoICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAgICAqcEZpbHRlclBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAgKnBDb2VmZmljaWVudHMpCit7CisKKyAgICBleHRlcm4gTFZNX0ZMT0FUICAgIExWUFNBX0Zsb2F0X1R3b1BpT25Gc1RhYmxlW107CisgICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVlBTQV9GbG9hdF9Db3NDb2VmW107CisKKworICAgIC8qCisgICAgICogSW50ZXJtZWRpYXRlIHZhcmlhYmxlcyBhbmQgdGVtcG9yYXJ5IHZhbHVlcworICAgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgVDA7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBEOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQTA7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBCMTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEIyOworICAgIExWTV9GTE9BVCAgICAgICAgICAgRHQwOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQjJfRGVuOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQjJfTnVtOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQ09TX1QwOworICAgIExWTV9GTE9BVCAgICAgICAgICAgY29lZjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIGZhY3RvcjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIHQwOworICAgIExWTV9JTlQxNiAgICAgICAgICAgaTsKKworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIGZpbHRlciBkZWZpbml0aW9uCisgICAgICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgIEZyZXF1ZW5jeSAgID0gKExWTV9GTE9BVCkocEZpbHRlclBhcmFtcy0+Q2VudGVyRnJlcXVlbmN5KTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgUUZhY3RvciAgICAgPSAoKExWTV9GTE9BVCkocEZpbHRlclBhcmFtcy0+UUZhY3RvcikpIC8gMTAwOworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGluZyB0aGUgaW50ZXJtZWRpYXRlIHZhbHVlcworICAgICAqLworICAgIFQwID0gRnJlcXVlbmN5ICogTFZQU0FfRmxvYXRfVHdvUGlPbkZzVGFibGVbRnNdOyAgIC8qIFQwID0gMiAqIFBpICogRmMgLyBGcyAqLworICAgIEQgPSAzMjAwOyAgICAgICAgICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4wMDAwMDAgKDEqMTAwKjJeNSkgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogRm9yY2UgRCA9IDEgOiB0aGUgZnVuY3Rpb24gd2FzIG9yaWdpbmFsbHkgdXNlZCBmb3IgYSBwZWFraW5nIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgVGhlIEQgcGFyYW1ldGVyIGRvIG5vdCBleGlzdCBmb3IgYSBCYW5kUGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzICovCisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgQjIgY29lZmZpY2llbnQKKyAgICAgKi8KKyAgICBEdDAgPSAgVDAgLyAyMDQ4IDsKKyAgICBCMl9EZW4gPSBRRmFjdG9yICsgRHQwOworICAgIEIyX051bSA9IER0MCAtIFFGYWN0b3I7CisgICAgQjIgPSBCMl9OdW0gLyAoMiAqIEIyX0Rlbik7CisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgY29zaW5lIGJ5IGEgcG9seW5vbWlhbCBleHBhbnNpb24gdXNpbmcgdGhlIGVxdWF0aW9uOgorICAgICAqCisgICAgICogIENvcyArPSBjb2VmKG4pICogdDBebiAgICAgICAgICAgICAgICAgICBGb3IgbiA9IDAgdG8gNgorICAgICAqLworICAgIFQwID0gKFQwIC8gMjA0OCkgKiAwLjYzNjU4NTU4ZjsgICAgICAgICAgICAgIC8qIFNjYWxlIHRvIDEuMCBpbiAxNi1iaXQgZm9yIHJhbmdlIDAgdG8gZnMvMiAqLworICAgIHQwID0gVDAgOworICAgIGZhY3RvciA9IDEuMGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgdG8gMS4wIGZvciB0aGUgYTAgY29lZmZpY2llbnQgKi8KKyAgICBDT1NfVDAgPSAwLjBmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgdGhlIGVycm9yIHRvIHplcm8gKi8KKyAgICBmb3IgKGkgPSAxOyBpIDwgNzsgaSsrKQorICAgIHsKKyAgICAgICAgY29lZiAgICA9IExWUFNBX0Zsb2F0X0Nvc0NvZWZbaV07ICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbnRoIGNvZWZmaWNpZW50ICovCisgICAgICAgIENPU19UMCArPSAoZmFjdG9yICogY29lZik7ICAgICAgICAgLyogVGhlIG50aCBwYXJ0aWFsIHN1bSAqLworICAgICAgICBmYWN0b3IgID0gKGZhY3RvciAqIHQwKSA7ICAgICAgICAgICAvKiBDYWxjdWxhdGUgdDBebiAqLworICAgIH0KKyAgICBDT1NfVDAgPSBDT1NfVDAgKiA4OyAgICAvKkxWUFNBX0Nvc0NvZWZfZmxvYXRbMF0qLyAgICAgIC8qIENvcnJlY3QgdGhlIHNjYWxpbmcgKi8KKworCisgICAgQjEgPSAoKExWTV9GTE9BVCkwLjUgLSBCMikgKiAoQ09TX1QwKTsgICAgLyogQjEgPSAoMC41IC0gYjIpICogY29zKHQwKSAqLworICAgIEEwID0gKChMVk1fRkxPQVQpMC41ICsgQjIpIC8gMjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBBMCA9ICgwLjUgKyBiMikgLyAyICovCisKKyAgICAvKgorICAgICAqIFdyaXRlIGNvZWZmIGludG8gdGhlIGRhdGEgc3RydWN0dXJlCisgICAgICovCisgICAgcENvZWZmaWNpZW50cy0+QTAgPSBBMCAqIDI7CisgICAgcENvZWZmaWNpZW50cy0+QjEgPSBCMSAqIDI7CisgICAgcENvZWZmaWNpZW50cy0+QjIgPSBCMiAqIDI7CisKKyAgICByZXR1cm4oTFZQU0FfT0spOworfQorI2Vsc2UKIExWUFNBX1JFVFVSTiBMVlBTQV9CUFNpbmdsZVByZWNDb2VmcyggICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgRnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICAgKnBGaWx0ZXJQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MxNl9Db2Vmc190ICAgICAgICAgKnBDb2VmZmljaWVudHMpCkBAIC01NDEsNyArNjg0LDcgQEAKIAogICAgIHJldHVybihMVlBTQV9PSyk7CiB9Ci0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTg0LDYgKzcyNyw5MCBAQAogLyogICAgIG9mIHRoZSBuIGJhbmRzIGVxdWFsaXplciAoTFZFUU5CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEJVSUxEX0ZMT0FUCitMVlBTQV9SRVRVUk4gTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMoICAgTFZNX1VJTlQxNiAgICAgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICAqcEZpbHRlclBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgKnBDb2VmZmljaWVudHMpCit7CisKKyAgICBleHRlcm4gTFZNX0ZMT0FUICAgIExWUFNBX0Zsb2F0X1R3b1BpT25Gc1RhYmxlW107CisgICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVlBTQV9GbG9hdF9EUENvc0NvZWZbXTsKKworICAgIC8qCisgICAgICogSW50ZXJtZWRpYXRlIHZhcmlhYmxlcyBhbmQgdGVtcG9yYXJ5IHZhbHVlcworICAgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgVDA7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBEOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQTA7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBCMTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEIyOworICAgIExWTV9GTE9BVCAgICAgICAgICAgRHQwOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQjJfRGVuOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQjJfTnVtOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQ29zRXJyOworICAgIExWTV9GTE9BVCAgICAgICAgICAgY29lZjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIGZhY3RvcjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIHQwOworICAgIExWTV9JTlQxNiAgICAgICAgICAgaTsKKworICAgIC8qCisgICAgICogR2V0IHRoZSBmaWx0ZXIgZGVmaW5pdGlvbgorICAgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgICBGcmVxdWVuY3kgICA9IChMVk1fRkxPQVQpKHBGaWx0ZXJQYXJhbXMtPkNlbnRlckZyZXF1ZW5jeSk7CisgICAgTFZNX0ZMT0FUICAgICAgICAgIFFGYWN0b3IgICAgID0gKChMVk1fRkxPQVQpKHBGaWx0ZXJQYXJhbXMtPlFGYWN0b3IpKSAvIDEwMDsKKworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGluZyB0aGUgaW50ZXJtZWRpYXRlIHZhbHVlcworICAgICAqLworICAgIFQwID0gRnJlcXVlbmN5ICogTFZQU0FfRmxvYXRfVHdvUGlPbkZzVGFibGVbRnNdOyAgIC8qIFQwID0gMiAqIFBpICogRmMgLyBGcyAqLworICAgIEQgPSAzMjAwOyAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjAwMDAwMCAoMSoxMDAqMl41KSAqLworICAgICAgICAgICAgICAgICAvKiBGb3JjZSBEID0gMSA6IHRoZSBmdW5jdGlvbiB3YXMgb3JpZ2luYWxseSB1c2VkIGZvciBhIHBlYWtpbmcgZmlsdGVyLgorICAgICAgICAgICAgICAgICAgICBUaGUgRCBwYXJhbWV0ZXIgZG8gbm90IGV4aXN0IGZvciBhIEJhbmRQYXNzIGZpbHRlciBjb2VmZmljaWVudHMgKi8KKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSBCMiBjb2VmZmljaWVudAorICAgICAqLworICAgIER0MCA9ICBUMCAvIDIwNDggOworICAgIEIyX0RlbiA9IFFGYWN0b3IgKyBEdDA7CisgICAgQjJfTnVtID0gRHQwIC0gUUZhY3RvcjsKKyAgICBCMiA9IEIyX051bSAvICgyICogQjJfRGVuKTsKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSBjb3NpbmUgZXJyb3IgYnkgYSBwb2x5bm9taWFsIGV4cGFuc2lvbiB1c2luZyB0aGUgZXF1YXRpb246CisgICAgICoKKyAgICAgKiAgQ29zRXJyICs9IGNvZWYobikgKiB0MF5uICAgICAgICAgICAgICAgIEZvciBuID0gMCB0byA0CisgICAgICovCisgICAgVDAgPSBUMCAqIDAuOTk0NzUwZjsgICAgICAgICAgICAgICAgICAgIC8qIFNjYWxlIHRvIDEuMCBpbiAxNi1iaXQgZm9yIHJhbmdlIDAgdG8gZnMvNTAgKi8KKyAgICB0MCA9IFQwOworICAgIGZhY3RvciA9IDEuMGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgdG8gMS4wIGZvciB0aGUgYTAgY29lZmZpY2llbnQgKi8KKyAgICBDb3NFcnIgPSAwLjBmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgdGhlIGVycm9yIHRvIHplcm8gKi8KKyAgICBmb3IgKGkgPSAxOyBpIDwgNTsgaSsrKQorICAgIHsKKyAgICAgICAgY29lZiA9IExWUFNBX0Zsb2F0X0RQQ29zQ29lZltpXTsgICAgICAgICAgICAgIC8qIEdldCB0aGUgbnRoIGNvZWZmaWNpZW50ICovCisgICAgICAgIENvc0VyciArPSBmYWN0b3IgKiBjb2VmOyAgICAgICAgIC8qIFRoZSBudGggcGFydGlhbCBzdW0gKi8KKyAgICAgICAgZmFjdG9yID0gZmFjdG9yICogdDA7ICAgICAgICAgICAvKiBDYWxjdWxhdGUgdDBebiAqLworICAgIH0KKyAgICBDb3NFcnIgPSBDb3NFcnIgKiAyOyAgICAgICAgICAvKiBDb3JyZWN0IHRoZSBzY2FsaW5nICovCisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgQjEgYW5kIEEwIGNvZWZmaWNpZW50cworICAgICAqLworICAgIEIxID0gKChMVk1fRkxPQVQpMC41IC0gQjIpOyAgICAgICAgICAgICAgICAgICAgIC8qIEIxID0gKDAuNSAtIGIyKSAqLworICAgIEEwID0gQjEgKiBDb3NFcnIgOyAgICAvKiBUZW1wb3Jhcnkgc3RvcmFnZSBmb3IgKDAuNSAtIGIyKSAqIGNvc2Vycih0MCkgKi8KKyAgICBCMSAtPSBBMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEIxID0gKDAuNSAtIGIyKSAqICgxIC0gY29zZXJyKHQwKSkgICovCisgICAgQTAgPSAoKExWTV9GTE9BVCkwLjUgICsgQjIpIC8gMjsgICAgICAgICAgICAgICAgLyogQTAgPSAoMC41ICsgYjIpIC8gMiAqLworCisgICAgLyoKKyAgICAgKiBXcml0ZSBjb2VmZiBpbnRvIHRoZSBkYXRhIHN0cnVjdHVyZQorICAgICAqLworICAgIHBDb2VmZmljaWVudHMtPkEwID0gQTA7CisgICAgcENvZWZmaWNpZW50cy0+QjEgPSBCMTsKKyAgICBwQ29lZmZpY2llbnRzLT5CMiA9IEIyOworCisgICAgcmV0dXJuKExWUFNBX09LKTsKK30KKyNlbHNlCiBMVlBTQV9SRVRVUk4gTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMoICAgTFZNX1VJTlQxNiAgICAgICAgICAgIEZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICpwRmlsdGVyUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MzMl9Db2Vmc190ICAgICAgICpwQ29lZmZpY2llbnRzKQpAQCAtNjY2LDcgKzg5Myw3IEBACiAKICAgICByZXR1cm4oTFZQU0FfT0spOwogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfQ2xlYXJGaWx0ZXJIaXN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTY5MCwxMSArOTE3LDE3IEBACiAKICAgICAvKiBCYW5kIFBhc3MgZmlsdGVycyB0YXBzICovCiAgICAgcFRhcEFkZHJlc3MgPSAoTFZNX0lOVDggKilwSW5zdC0+cEJQX1RhcHM7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBmb3IoaSA9IDA7IGkgPCBwSW5zdC0+bkJhbmRzICogc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190KTsgaSsrKQorICAgIHsKKyAgICAgICAgcFRhcEFkZHJlc3NbaV0gPSAwOworICAgIH0KKyNlbHNlCiAgICAgZm9yKGkgPSAwOyBpIDwgcEluc3QtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCk7IGkrKykKICAgICB7CiAgICAgICAgIHBUYXBBZGRyZXNzW2ldID0gMDsKICAgICB9Ci0KKyNlbmRpZgogICAgIC8qIFF1YXNpLXBlYWsgZmlsdGVycyB0YXBzICovCiAgICAgcFRhcEFkZHJlc3MgPSAoTFZNX0lOVDggKilwSW5zdC0+cFFQRF9UYXBzOwogICAgIGZvcihpID0gMDsgaSA8IHBJbnN0LT5uQmFuZHMgKiBzaXplb2YoUVBEX1RhcHNfdCk7IGkrKykKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfSW5pdC5jCmluZGV4IDI3YTRiYzMuLjFjMjY4NjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0luaXQuYwpAQCAtNDcsNyArNDcsMTEgQEAKICAgICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgICAgKnBMVlBTQV9JbnN0OwogICAgIExWUFNBX1JFVFVSTiAgICAgICAgICAgICAgICBlcnJvckNvZGUgICAgICAgPSBMVlBTQV9PSzsKICAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgaWk7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgZXh0ZXJuIExWTV9JTlQxNiAgICAgICAgICAgIExWUFNBX0dhaW5UYWJsZVtdOworI2Vsc2UKKyAgICBleHRlcm4gTFZNX0ZMT0FUICAgICAgICAgICAgTFZQU0FfRmxvYXRfR2FpblRhYmxlW107CisjZW5kaWYKICAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgQnVmZmVyTGVuZ3RoID0gMDsKIAogICAgIC8qIEludHNfQWxsb2MgaW5zdGFuY2VzLCBuZWVkZWQgZm9yIG1lbW9yeSBhbGlnbm1lbnQgbWFuYWdlbWVudCAqLwpAQCAtMTQxLDE5ICsxNDUsMzcgQEAKIAogCiAgICAgLyogQXNzaWduIHRoZSBwb2ludGVycyAqLwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgcExWUFNBX0luc3QtPnBQb3N0R2FpbnMgICAgICAgICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWTV9VSU5UMTYpICk7CisjZWxzZQorICAgIHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zICAgICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkgKTsKKyNlbmRpZgogICAgIHBMVlBTQV9JbnN0LT5wRmlsdGVyc1BhcmFtcyAgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVlBTQV9GaWx0ZXJQYXJhbV90KSApOwogICAgIHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGggKiBzaXplb2YoTFZNX1VJTlQ4KSApOwogICAgIHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrcyAgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVk1fVUlOVDgpICk7CiAgICAgcExWUFNBX0luc3QtPnBCUEZpbHRlcnNQcmVjaXNpb24gICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWUFNBX0JQRmlsdGVyUHJlY2lzaW9uX2VuKSApOwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgcExWUFNBX0luc3QtPnBCUF9JbnN0YW5jZXMgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfSW5zdGFuY2VfdCkgKTsKICAgICBwTFZQU0FfSW5zdC0+cFFQRF9TdGF0ZXMgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZDb2VmLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKFFQRF9TdGF0ZV90KSApOworI2Vsc2UKKyAgICBwTFZQU0FfSW5zdC0+cEJQX0luc3RhbmNlcyAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZDb2VmLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSApOworICAgIHBMVlBTQV9JbnN0LT5wUVBEX1N0YXRlcyAgICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoUVBEX0ZMT0FUX1N0YXRlX3QpICk7CisjZW5kaWYKIAorI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIHBMVlBTQV9JbnN0LT5wQlBfVGFwcyAgICAgICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QpICk7CiAgICAgcExWUFNBX0luc3QtPnBRUERfVGFwcyAgICAgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmRGF0YSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihRUERfVGFwc190KSApOwogCisjZWxzZQorICAgIHBMVlBTQV9JbnN0LT5wQlBfVGFwcyAgICAgICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5pdFBhcmFtcy0+bkJhbmRzICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190KSk7CisgICAgcExWUFNBX0luc3QtPnBRUERfVGFwcyAgICAgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmRGF0YSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihRUERfRkxPQVRfVGFwc190KSApOworI2VuZGlmCiAKICAgICAvKiBDb3B5IGZpbHRlcnMgcGFyYW1ldGVycyBpbiB0aGUgcHJpdmF0ZSBpbnN0YW5jZSAqLwogICAgIGZvcihpaSA9IDA7IGlpIDwgcExWUFNBX0luc3QtPm5CYW5kczsgaWkrKykKQEAgLTE2NCw3ICsxODYsMTIgQEAKICAgICAvKiBTZXQgUG9zdCBmaWx0ZXJzIGdhaW5zKi8KICAgICBmb3IoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uQmFuZHM7IGlpKyspCiAgICAgeworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBwTFZQU0FfSW5zdC0+cFBvc3RHYWluc1tpaV0gPShMVk1fVUlOVDE2KSBMVlBTQV9HYWluVGFibGVbcEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5Qb3N0R2FpbiArIDE1XTsKKyNlbHNlCisgICAgICAgIHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zW2lpXSA9IExWUFNBX0Zsb2F0X0dhaW5UYWJsZVsxNSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5Qb3N0R2Fpbl07CisjZW5kaWYKICAgICB9CiAgICAgcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgPSBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfTWVtb3J5LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfTWVtb3J5LmMKaW5kZXggMDk4NGIxMC4uMDZhOGY5ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX01lbW9yeS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9NZW1vcnkuYwpAQCAtMTA2LDcgKzEwNiwxMSBAQAogICAgICAgICAgKi8KIAogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHNpemVvZihMVlBTQV9JbnN0YW5jZVByX3QpICk7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWTV9GTE9BVCkgKTsKKyNlbHNlCiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVk1fVUlOVDE2KSApOworI2VuZGlmCiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVlBTQV9GaWx0ZXJQYXJhbV90KSApOwogCiAgICAgICAgIHsKQEAgLTEzNCw3ICsxMzgsMTEgQEAKICAgICAgICAgLyoKICAgICAgICAgICogU2NyYXRjaCBtZW1vcnkKICAgICAgICAgICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZTY3JhdGNoLCAyICogcEluaXRQYXJhbXMtPk1heElucHV0QmxvY2tTaXplICogc2l6ZW9mKExWTV9JTlQxNikgKTsKKyNlbHNlCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZTY3JhdGNoLCAyICogcEluaXRQYXJhbXMtPk1heElucHV0QmxvY2tTaXplICogc2l6ZW9mKExWTV9GTE9BVCkgKTsKKyNlbmRpZgogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fU0NSQVRDSF0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZTY3JhdGNoKTsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1NDUkFUQ0hdLlR5cGUgICAgICAgICA9IExWUFNBX1NDUkFUQ0g7CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKQEAgLTE0Miw4ICsxNTAsMTMgQEAKICAgICAgICAgLyoKICAgICAgICAgICogUGVyc2lzdGVudCBjb2VmZmljaWVudHMgbWVtb3J5CiAgICAgICAgICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfSW5zdGFuY2VfdCkgKTsKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoUVBEX1N0YXRlX3QpICk7CisjZWxzZQorICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCkgKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoUVBEX0ZMT0FUX1N0YXRlX3QpICk7CisjZW5kaWYKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZDb2VmKTsKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uVHlwZSAgICAgICAgID0gTFZQU0FfUEVSU0lTVEVOVF9DT0VGOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKQEAgLTE1MSw4ICsxNjQsMTMgQEAKICAgICAgICAgLyoKICAgICAgICAgICogUGVyc2lzdGVudCBkYXRhIG1lbW9yeQogICAgICAgICAgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QpICk7CiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZEYXRhLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKFFQRF9UYXBzX3QpICk7CisjZWxzZQorICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmRGF0YSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCkgKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoUVBEX0ZMT0FUX1RhcHNfdCkgKTsKKyNlbmRpZgogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkRhdGEpOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVlBTQV9QRVJTSVNURU5UX0RBVEE7CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcml2YXRlLmgKaW5kZXggMDM1MjJmYi4uYTc1MGJiMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJpdmF0ZS5oCkBAIC00Myw4ICs0MywxMSBAQAogI2RlZmluZSBMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGICAxICAgICAgLyogT2Zmc2V0IHRvIHBlcnNpc3RlbnQgY29lZmZpY2llbnRzICBtZW1vcnkgcmVnaW9uIGluIG1lbW9yeSB0YWJsZSAqLwogI2RlZmluZSBMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBICAyICAgICAgLyogT2Zmc2V0IHRvIHBlcnNpc3RlbnQgdGFwcyAgbWVtb3J5IHJlZ2lvbiBpbiBtZW1vcnkgdGFibGUgICAgICAgICAqLwogI2RlZmluZSBMVlBTQV9NRU1SRUdJT05fU0NSQVRDSCAgICAgICAgICAzICAgICAgLyogT2Zmc2V0IHRvIHNjcmF0Y2ggIG1lbW9yeSByZWdpb24gaW4gbWVtb3J5IHRhYmxlICAgICAgICAgICAgICAgICAqLwotCi0jZGVmaW5lIExWUFNBX05SX1NVUFBPUlRFRF9SQVRFICAgICAgICAgIDkgICAgICAvKiBGcm9tIDgwMDBIeiB0byA0ODAwMEh6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWZuZGVmIEhJR0hFUl9GUworI2RlZmluZSBMVlBTQV9OUl9TVVBQT1JURURfUkFURSAgICAgICAgICA5ICAgICAgLyogRnJvbSA4MDAwSHogdG8gNDgwMDBIeiovCisjZWxzZQorI2RlZmluZSBMVlBTQV9OUl9TVVBQT1JURURfUkFURSAgICAgICAgICAxMSAgICAgIC8qIEZyb20gODAwMEh6IHRvIDE5MjAwMEh6Ki8KKyNlbmRpZgogI2RlZmluZSBMVlBTQV9OUl9TVVBQT1JURURfU1BFRUQgICAgICAgICAzICAgICAgLyogTE9XLCBNRURJVU0sIEhJR0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCiAjZGVmaW5lIExWUFNBX01BWEJVRkZFUkRVUkFUSU9OICAgICAgICAgIDQwMDAgICAvKiBNYXhpbXVtIGxlbmd0aCBpbiBtcyBvZiB0aGUgbGV2ZWxzIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC05MywxMiArOTYsMjcgQEAKICAgICBMVlBTQV9NZW1UYWJfdCAgICAgICAgICAgICAgTWVtb3J5VGFibGU7CiAKICAgICBMVlBTQV9CUEZpbHRlclByZWNpc2lvbl9lbiAqcEJQRmlsdGVyc1ByZWNpc2lvbjsgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGZpbHRlciBwcmVjaXNpb24gZm9yIGVhY2ggYmFuZCAgICAgICAgICAgICAgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICAqcEJQX0luc3RhbmNlczsgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGJhbmQgcGFzcyBmaWx0ZXIgaW5zdGFuY2UgZm9yIGVhY2ggYmFuZCAgICAgKi8KICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAgICAqcEJQX1RhcHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGJhbmQgcGFzcyBmaWx0ZXIgdGFwcyBmb3IgZWFjaCBiYW5kICAgICAgICAgKi8KICAgICBRUERfU3RhdGVfdCAgICAgICAgICAgICAgICAqcFFQRF9TdGF0ZXM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIFFQRCBmaWx0ZXIgaW5zdGFuY2UgZm9yIGVhY2ggYmFuZCAgICAgICAgICAgKi8KICAgICBRUERfVGFwc190ICAgICAgICAgICAgICAgICAqcFFQRF9UYXBzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIFFQRCBmaWx0ZXIgdGFwcyBmb3IgZWFjaCBiYW5kICAgICAgICAgICAgICAgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAqcFBvc3RHYWluczsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIHBvc3QtZmlsdGVyIGdhaW5zIGZvciBlYWNoIGJhbmQgICAgICAgICAgICAgKi8KKyNlbHNlCisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAgKnBCUF9JbnN0YW5jZXM7CisgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGJhbmQgcGFzcyBmaWx0ZXIgdGFwcyBmb3IgZWFjaCBiYW5kICovCisgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAgKnBCUF9UYXBzOworICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBRUEQgZmlsdGVyIGluc3RhbmNlIGZvciBlYWNoIGJhbmQgKi8KKyAgICBRUERfRkxPQVRfU3RhdGVfdCAgICAgICAgICAgICAgICAqcFFQRF9TdGF0ZXM7CisgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIFFQRCBmaWx0ZXIgdGFwcyBmb3IgZWFjaCBiYW5kICovCisgICAgUVBEX0ZMT0FUX1RhcHNfdCAgICAgICAgICAgICAgICAgKnBRUERfVGFwczsKKyNlbmRpZgogCisjaWZuZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgKnBQb3N0R2FpbnM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBwb3N0LWZpbHRlciBnYWlucyBmb3IgZWFjaCBiYW5kICAgICAgICAgICAgICovCisjZWxzZQorICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBwb3N0LWZpbHRlciBnYWlucyBmb3IgZWFjaCBiYW5kICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBQb3N0R2FpbnM7CisjZW5kaWYKICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAgICAgICAqcEZpbHRlcnNQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgLyogQ29weSBvZiB0aGUgZmlsdGVycyBwYXJhbWV0ZXJzIGZyb20gdGhlIGlucHV0IHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1Byb2Nlc3MuYwppbmRleCA5ZTI5ZjY4Li5lYTVmNzRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcm9jZXNzLmMKQEAgLTQzLDYgKzQzLDk2IEBACiAvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWUFNBX1JFVFVSTiBMVlBTQV9Qcm9jZXNzICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBMVlBTQV9JbnB1dFNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICBJbnB1dEJsb2NrU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX1RpbWUgICAgICAgICAgIEF1ZGlvVGltZSAgICAgICAgICAgICkKKworeworICAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgKnBMVlBTQV9JbnN0ID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwU2NyYXRjaDsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBpaTsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBBdWRpb1RpbWVJbmM7CisgICAgZXh0ZXJuIExWTV9VSU5UMzIgICAgICAgTFZQU0FfU2FtcGxlUmF0ZUludlRhYltdOworICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICpwV3JpdGVfU2F2ZTsgICAgICAgICAvKiBQb3NpdGlvbiBvZiB0aGUgd3JpdGUgcG9pbnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwcm9jZXNzICAqLworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENIRUNLIFBBUkFNRVRFUlMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCB8fCBwTFZQU0FfSW5wdXRTYW1wbGVzID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKKyAgICB9CisgICAgaWYoSW5wdXRCbG9ja1NpemUgPT0gMCB8fCBJbnB1dEJsb2NrU2l6ZSA+IHBMVlBTQV9JbnN0LT5NYXhJbnB1dEJsb2NrU2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9JTlZBTElEUEFSQU0pOworICAgIH0KKworICAgIHBTY3JhdGNoID0gKExWTV9GTE9BVCopcExWUFNBX0luc3QtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzOworICAgIHBXcml0ZV9TYXZlID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXI7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgQVBQTFkgTkVXIFNFVFRJTkdTIElGIE5FRURFRAorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKHBMVlBTQV9JbnN0LT5iQ29udHJvbFBlbmRpbmcgPT0gTFZNX1RSVUUpCisgICAgeworICAgICAgICBwTFZQU0FfSW5zdC0+YkNvbnRyb2xQZW5kaW5nID0gMDsKKyAgICAgICAgTFZQU0FfQXBwbHlOZXdTZXR0aW5ncyggcExWUFNBX0luc3QpOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBQUk9DRVNTIFNBTVBMRVMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIFB1dCBzYW1wbGVzIGluIHJhbmdlIFstMC41OzAuNVsgZm9yIEJQIGZpbHRlcnMgKHNlZSBCaXF1YWRzIGRvY3VtZW50YXRpb24pICovCisgICAgQ29weV9GbG9hdChwTFZQU0FfSW5wdXRTYW1wbGVzLCBwU2NyYXRjaCwgKExWTV9JTlQxNilJbnB1dEJsb2NrU2l6ZSk7CisgICAgU2hpZnRfU2F0X0Zsb2F0KC0xLCBwU2NyYXRjaCwgcFNjcmF0Y2gsIChMVk1fSU5UMTYpSW5wdXRCbG9ja1NpemUpOworCisgICAgZm9yIChpaSA9IDA7IGlpIDwgcExWUFNBX0luc3QtPm5SZWxldmFudEZpbHRlcnM7IGlpKyspCisgICAgeworICAgICAgICBzd2l0Y2gocExWUFNBX0luc3QtPnBCUEZpbHRlcnNQcmVjaXNpb25baWldKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIExWUFNBX1NpbXBsZVByZWNpc2lvbkZpbHRlcjoKKyAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMSAgKCAmcExWUFNBX0luc3QtPnBCUF9JbnN0YW5jZXNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoICsgSW5wdXRCbG9ja1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilJbnB1dEJsb2NrU2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTFZQU0FfRG91YmxlUHJlY2lzaW9uRmlsdGVyOgorICAgICAgICAgICAgICAgIEJQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxICAoICZwTFZQU0FfSW5zdC0+cEJQX0luc3RhbmNlc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2ggKyBJbnB1dEJsb2NrU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KUlucHV0QmxvY2tTaXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworCisgICAgICAgIExWUFNBX1FQRF9Qcm9jZXNzX0Zsb2F0ICAgKCBwTFZQU0FfSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoICsgSW5wdXRCbG9ja1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KUlucHV0QmxvY2tTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWkpOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBVUERBVEUgU3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmKHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyICE9IHBXcml0ZV9TYXZlKQorICAgIHsKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzIoKEF1ZGlvVGltZSArIChMVk1fSU5UMzIpKChMVk1fSU5UMzIpcExWUFNBX0luc3QtPkxvY2FsU2FtcGxlc0NvdW50KjEwMDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpTFZQU0FfU2FtcGxlUmF0ZUludlRhYltwTFZQU0FfSW5zdC0+Q3VycmVudFBhcmFtcy5Gc10sCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RpbWVJbmMsCisgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Gc0ludmVydFNoaWZ0KQorICAgICAgICBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lID0gQXVkaW9UaW1lICsgQXVkaW9UaW1lSW5jOworICAgIH0KKworICAgIHJldHVybihMVlBTQV9PSyk7Cit9CisjZWxzZQogTFZQU0FfUkVUVVJOIExWUFNBX1Byb2Nlc3MgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqcExWUFNBX0lucHV0U2FtcGxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgIElucHV0QmxvY2tTaXplLApAQCAtMTMwLDcgKzIyMCw3IEBACiAKICAgICByZXR1cm4oTFZQU0FfT0spOwogfQotCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBELmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBELmgKaW5kZXggODM2YmZkNy4uOTlkODQ0YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRC5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUEQuaApAQCAtMzEsNiArMzEsMTUgQEAKICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZWZzWzJdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCiB9UVBEX1N0YXRlX3QsICpwUVBEX1N0YXRlX3Q7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERlbGF5OworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2Vmc1syXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfVFQRF9GTE9BVF9TdGF0ZV90LCAqcFFQRF9GTE9BVF9TdGF0ZV90OworI2VuZGlmCisKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNX0lOVDMyIEtQOyAgICAvKnNob3VsZCBzdG9yZSBhMCovCkBAIC0zOCwxMiArNDcsMzAgQEAKIAogfSBRUERfQzMyX0NvZWZzLCAqUFFQRF9DMzJfQ29lZnM7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgS1A7ICAgIC8qc2hvdWxkIHN0b3JlIGEwKi8KKyAgICBMVk1fRkxPQVQgS007ICAgIC8qc2hvdWxkIHN0b3JlIGIyKi8KKworfSBRUERfRkxPQVRfQ29lZnMsICpQUVBEX0ZMT0FUX0NvZWZzOworI2VuZGlmCisKKwogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1fSU5UMzIgU3RvcmFnZVsxXTsKIAogfSBRUERfVGFwc190LCAqcFFQRF9UYXBzX3Q7CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRkxPQVQgU3RvcmFnZVsxXTsKKworfSBRUERfRkxPQVRfVGFwc190LCAqcFFQRF9GTE9BVF9UYXBzX3Q7CisKKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9RUERfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjIsNiArODksMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBCYW5kSW5kZXgpOwogCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZQU0FfUVBEX1Byb2Nlc3NfRmxvYXQgKCAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJblNhbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhbmRJbmRleCk7CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUVBEX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTgwLDggKzExMywxMiBAQAogdm9pZCBMVlBTQV9RUERfSW5pdCAoICAgUVBEX1N0YXRlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgIFFQRF9UYXBzX3QgICAgICAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgIFFQRF9DMzJfQ29lZnMgICAgICpwQ29lZiAgICAgKTsKKyNpZmRlZiBCVUlMRF9GTE9BVAogCi0KK3ZvaWQgTFZQU0FfUVBEX0luaXRfRmxvYXQgKCAgIFFQRF9GTE9BVF9TdGF0ZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUERfRkxPQVRfVGFwc190ICAgICAgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUERfRkxPQVRfQ29lZnMgICAgICAgICAqcENvZWYgICAgICk7CisjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jCmluZGV4IDUwZTBhODAuLjJjYzMyYWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jCkBAIC00MCwzICs0MCwxNCBAQAogICAgIHBRUERfU3RhdGUtPkNvZWZzWzBdICA9IHBDb2VmLT5LUDsKICAgICBwUVBEX1N0YXRlLT5Db2Vmc1sxXSAgPSBwQ29lZi0+S007CiB9CisKKyNpZmRlZiBCVUlMRF9GTE9BVAordm9pZCBMVlBTQV9RUERfSW5pdF9GbG9hdCAoICAgcFFQRF9GTE9BVF9TdGF0ZV90ICAgICAgIHBRUERfU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUERfRkxPQVRfVGFwc190ICAgICAgICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVBEX0ZMT0FUX0NvZWZzICAgICAgICAgICpwQ29lZiAgICAgKQoreworICAgIHBRUERfU3RhdGUtPnBEZWxheSAgPSBwVGFwcy0+U3RvcmFnZTsKKyAgICBwUVBEX1N0YXRlLT5Db2Vmc1swXSAgPSAoKExWTV9GTE9BVClwQ29lZi0+S1ApOworICAgIHBRUERfU3RhdGUtPkNvZWZzWzFdICA9ICgoTFZNX0ZMT0FUKXBDb2VmLT5LTSk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Qcm9jZXNzLmMKaW5kZXggNjcxOTdjMS4uZTIzMzE3MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Qcm9jZXNzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Qcm9jZXNzLmMKQEAgLTM1LDEyICszNSwxNiBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIExWUFNBX1FQRF9Xcml0ZVBlYWsoICAgcExWUFNBX0luc3RhbmNlUHJfdCAgICAgICBwTFZQU0FfSW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICAgKipwcFdyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEJhbmRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBWYWx1ZSAgICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICAgICAqKnBwV3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICBCYW5kSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICBWYWx1ZSAgICk7CiAKLQotCisjaWZkZWYgQlVJTERfRkxPQVQKK3ZvaWQgTFZQU0FfUVBEX1dyaXRlUGVha19GbG9hdCggICBwTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgIHBMVlBTQV9JbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgICAqKnBwV3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgQmFuZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIFZhbHVlICAgKTsKKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9RUERfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTQsNiArNTgsNyBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogdm9pZCBMVlBTQV9RUERfUHJvY2VzcyAoICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAqcEluU2FtcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLApAQCAtMTczLDcgKzE3OCwxMzEgQEAKICAgICAgICAgcExWUFNBX0luc3QtPkRvd25TYW1wbGluZ0NvdW50ID0gKExWTV9VSU5UMTYpKC1paSk7CiAgICAgfQogfQorI2Vsc2UKK3ZvaWQgTFZQU0FfUVBEX1Byb2Nlc3NfRmxvYXQgKCAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJblNhbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhbmRJbmRleCkKK3sKIAorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBQQVJBTUVURVJTCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICpwTFZQU0FfSW5zdCA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKKyAgICBRUERfRkxPQVRfU3RhdGVfdCAqcFFQRFN0YXRlID0gIChRUERfRkxPQVRfU3RhdGVfdCopJnBMVlBTQV9JbnN0LT5wUVBEX1N0YXRlc1tCYW5kSW5kZXhdOworCisgICAgLyogUG9pbnRlciB0byB0YXBzICovCisgICAgTFZNX0ZMT0FUKiBwRGVsYXkgID0gcFFQRFN0YXRlLT5wRGVsYXk7CisKKyAgICAvKiBQYXJhbWV0ZXJzIG5lZWRlZCBkdXJpbmcgcXVhc2kgcGVhayBjYWxjdWxhdGlvbnMgKi8KKyAgICBMVk1fRkxPQVQgICBYMDsKKyAgICBMVk1fRkxPQVQgICB0ZW1wLHRlbXAyOworICAgIExWTV9GTE9BVCAgIGFjY3U7CisgICAgTFZNX0ZMT0FUICAgWGcwOworICAgIExWTV9GTE9BVCAgIEQwOworICAgIExWTV9GTE9BVCAgIFYwID0gKExWTV9GTE9BVCkoKnBEZWxheSk7CisKKyAgICAvKiBGaWx0ZXIncyBjb2VmICovCisgICAgTFZNX0ZMT0FUICAgS3AgPSAoKExWTV9GTE9BVCkocFFQRFN0YXRlLT5Db2Vmc1swXSkpOworICAgIExWTV9GTE9BVCAgIEttID0gKChMVk1fRkxPQVQpKHBRUERTdGF0ZS0+Q29lZnNbMV0pKTsKKworICAgIExWTV9JTlQxNiAgIGlpID0gbnVtU2FtcGxlczsKKworICAgIExWTV9VSU5UOCAgKnBXcml0ZSA9IHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyOworICAgIExWTV9JTlQzMiAgIEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCA9IHBMVlBTQV9JbnN0LT5CdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQ7CisgICAgTFZNX1VJTlQxNiAgRG93blNhbXBsaW5nRmFjdG9yID0gcExWUFNBX0luc3QtPkRvd25TYW1wbGluZ0ZhY3RvcjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBJTklUSUFMSVpBVElPTgorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogQ29ycmVjdCB0aGUgcG9pbnRlciB0byB0YWtlIHRoZSBmaXJzdCBkb3duIHNhbXBsZWQgc2lnbmFsIHNhbXBsZSAqLworICAgIHBJblNhbXBzICs9IHBMVlBTQV9JbnN0LT5Eb3duU2FtcGxpbmdDb3VudDsKKyAgICAvKiBDb3JyZWN0IGFsc28gdGhlIG51bWJlciBvZiBzYW1wbGVzICovCisgICAgaWkgPSAoTFZNX0lOVDE2KShpaSAtIChMVk1fSU5UMTYpcExWUFNBX0luc3QtPkRvd25TYW1wbGluZ0NvdW50KTsKKworICAgIHdoaWxlIChpaSA+IDApCisgICAgeworICAgICAgICAvKiBBcHBseSBwb3N0IGdhaW4gKi8KKyAgICAgICAgLyogLSAxIHRvIGNvbXBlbnNhdGUgc2NhbGluZyBpbiBwcm9jZXNzIGZ1bmN0aW9uKi8KKyAgICAgICAgWDAgPSAoKnBJblNhbXBzKSAqIHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zW0JhbmRJbmRleF07CisgICAgICAgIHBJblNhbXBzID0gcEluU2FtcHMgKyBEb3duU2FtcGxpbmdGYWN0b3I7CisKKyAgICAgICAgLyogU2F0dXJhdGUgYW5kIHRha2UgYWJzb2x1dGUgdmFsdWUgKi8KKyAgICAgICAgaWYoWDAgPCAwLjBmKQorICAgICAgICAgICAgWDAgPSAtWDA7CisgICAgICAgIGlmIChYMCA+IDEuMGYpCisgICAgICAgICAgICBYZzAgPSAxLjBmOworICAgICAgICBlbHNlCisgICAgICAgICAgICBYZzAgPVgwOworCisKKyAgICAgICAgLyogUXVhc2kgcGVhayBmaWx0ZXIgY2FsY3VsYXRpb24gKi8KKyAgICAgICAgRDAgID0gWGcwIC0gVjA7CisKKyAgICAgICAgdGVtcDIgPSBEMDsKKworICAgICAgICBhY2N1ID0gdGVtcDIgKiBLcDsKKyAgICAgICAgRDAgICAgPSBEMCAvIDIuMGY7CisgICAgICAgIGlmIChEMCA8IDAuMGYpeworICAgICAgICAgICAgRDAgPSAtRDA7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wMiA9IEQwOworCisgICAgICAgIHRlbXAgPSBEMCAqIEttOworICAgICAgICBhY2N1ICs9IHRlbXAgKyBYZzA7CisKKyAgICAgICAgaWYgKGFjY3UgPiAxLjBmKQorICAgICAgICAgICAgYWNjdSA9IDEuMGY7CisgICAgICAgIGVsc2UgaWYoYWNjdSA8IDAuMGYpCisgICAgICAgICAgICBhY2N1ID0gMC4wZjsKKworICAgICAgICBWMCA9IGFjY3U7CisKKyAgICAgICAgaWYoKChwTFZQU0FfSW5zdC0+blNhbXBsZXNCdWZmZXJVcGRhdGUgLSBCdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQpIDwgRG93blNhbXBsaW5nRmFjdG9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgTFZQU0FfUVBEX1dyaXRlUGVha19GbG9hdCggcExWUFNBX0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFuZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjApOworCisgICAgICAgICAgICBCdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQgLT0gcExWUFNBX0luc3QtPm5TYW1wbGVzQnVmZmVyVXBkYXRlOworICAgICAgICAgICAgcExWUFNBX0luc3QtPkxvY2FsU2FtcGxlc0NvdW50ID0gKExWTV9VSU5UMTYpKG51bVNhbXBsZXMgLSBpaSk7CisgICAgICAgIH0KKyAgICAgICAgQnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50ICs9IERvd25TYW1wbGluZ0ZhY3RvcjsKKworICAgICAgICBpaSA9IChMVk1fSU5UMTYpKGlpIC0gRG93blNhbXBsaW5nRmFjdG9yKTsKKworICAgIH0KKworICAgIC8qIFN0b3JlIGxhc3QgdGFwcyBpbiBtZW1vcnkgKi8KKyAgICAqcERlbGF5ID0gVjA7CisKKyAgICAvKiBJZiB0aGlzIGlzIHRoZSBsYXN0IGNhbGwgdG8gdGhlIGZ1bmN0aW9uIGFmdGVyIGxhc3QgYmFuZCBwcm9jZXNzaW5nLAorICAgICAgIHVwZGF0ZSB0aGUgcGFyYW1ldGVycy4gKi8KKyAgICBpZihCYW5kSW5kZXggPT0gKHBMVlBTQV9JbnN0LT5uUmVsZXZhbnRGaWx0ZXJzIC0gMSkpCisgICAgeworICAgICAgICBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciA9IHBXcml0ZTsKKyAgICAgICAgLyogQWRqdXN0bWVudCBmb3IgMTEwMjVIeiBpbnB1dCwgMjIwLDUgaXMgbm9ybWFsbHkKKyAgICAgICAgICAgdGhlIGV4YWN0IG51bWJlciBvZiBzYW1wbGVzIGZvciAyMG1zLiovCisgICAgICAgIGlmKChwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciAhPSBwV3JpdGUpJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocExWUFNBX0luc3QtPkN1cnJlbnRQYXJhbXMuRnMgPT0gTFZNX0ZTXzExMDI1KSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYocExWUFNBX0luc3QtPm5TYW1wbGVzQnVmZmVyVXBkYXRlID09IDIyMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwTFZQU0FfSW5zdC0+blNhbXBsZXNCdWZmZXJVcGRhdGUgPSAyMjE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcExWUFNBX0luc3QtPm5TYW1wbGVzQnVmZmVyVXBkYXRlID0gMjIwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyID0gcFdyaXRlOworICAgICAgICBwTFZQU0FfSW5zdC0+QnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50ID0gQnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50OworICAgICAgICBwTFZQU0FfSW5zdC0+RG93blNhbXBsaW5nQ291bnQgPSAoTFZNX1VJTlQxNikoLWlpKTsKKyAgICB9Cit9CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUVBEX1dyaXRlUGVhayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTIwOSw0ICszMzgsMjMgQEAKICAgICAqcHBXcml0ZSA9IHBXcml0ZTsKIAogfQorI2lmZGVmIEJVSUxEX0ZMT0FUCit2b2lkIExWUFNBX1FQRF9Xcml0ZVBlYWtfRmxvYXQoICAgcExWUFNBX0luc3RhbmNlUHJfdCAgICAgcExWUFNBX0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICAgKipwcFdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEJhbmRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBWYWx1ZSAgICkKK3sKKyAgICBMVk1fVUlOVDggKnBXcml0ZSA9ICpwcFdyaXRlOwogCisgICAgLyogV3JpdGUgdGhlIHZhbHVlIGFuZCB1cGRhdGUgdGhlIHdyaXRlIHBvaW50ZXIgKi8KKyAgICAqKHBXcml0ZSArIEJhbmRJbmRleCkgPSAoTFZNX1VJTlQ4KShWYWx1ZSAqIDI1Nik7CisgICAgcFdyaXRlICs9IHBMVlBTQV9JbnN0LT5uQmFuZHM7CisgICAgaWYgKHBXcml0ZSA9PSAocExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydCArIHBMVlBTQV9JbnN0LT5uQmFuZHMgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyTGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHBXcml0ZSA9IHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQ7CisgICAgfQorCisgICAgKnBwV3JpdGUgPSBwV3JpdGU7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYwppbmRleCAyMWE1ZDhkLi4xMjg3NTAzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5jCkBAIC0zNCw2ICszNCw3IEBACiAgKiBTYW1wbGUgcmF0ZSB0YWJsZSBmb3IgY29udmVydGluZyBiZXR3ZWVuIHRoZSBlbnVtZXJhdGVkIHR5cGUgYW5kIHRoZSBhY3R1YWwKICAqIGZyZXF1ZW5jeQogICovCisjaWZuZGVmIEhJR0hFUl9GUwogY29uc3QgTFZNX1VJTlQxNiAgICBMVlBTQV9TYW1wbGVSYXRlVGFiW10gPSB7ICAgODAwMCwgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAwMCwKQEAgLTQzLDYgKzQ0LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDB9OyAgICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyAqLworI2Vsc2UKK2NvbnN0IExWTV9VSU5UMzIgICAgTFZQU0FfU2FtcGxlUmF0ZVRhYltdID0geyAgIDgwMDAsICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkyMDAwfTsgICAgICAgICAgICAgICAgICAvKiAxOTJrUy9zICovCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02Miw3ICs3NiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg5NDc4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY3MTA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4Njk2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0NzM5fTsgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDczOQorI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwyMjM2OQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMTE4NSAgICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgKi8KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogCiAKIApAQCAtODQsNyArMTAzLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ODIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2MH07ICAgICAgICAgICAgICAgICAgLyogNDhrUy9zICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2MAorI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTkyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMzg0MCAgICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgKi8KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEb3duIHNhbXBsaW5nIGZhY3RvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xMDIsNyArMTI2LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LCAgICAgICAgICAgICAgICAgICAvKiAyNDAwMCBTL3MgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxLCAgICAgICAgICAgICAgICAgICAvKiAzMjAwMCBTL3MgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLCAgICAgICAgICAgICAgICAgICAvKiA0NDEwMCBTL3MgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyfTsgICAgICAgICAgICAgICAgICAvKiA0ODAwMCBTL3MgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyICAgICAgICAgICAgICAgICAgICAvKiA0ODAwMCBTL3MgICovCisjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDY0ICAgICAgICAgICAgICAgICAgIC8qIDk2MDAwIFMvcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTI4ICAgICAgICAgICAgICAgICAgLyoxOTIwMDAgUy9zICAqLworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEyMiw4ICsxNTEsMzAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4Nzg1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1ODgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDc4MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MzkyfTsgICAgLyogNDhrUy9zICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM5MgorI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDIxOTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMDk4ICAgIC8qIDE5MmtTL3MgKi8KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCitjb25zdCBMVk1fRkxPQVQgICAgIExWUFNBX0Zsb2F0X1R3b1BpT25Gc1RhYmxlW10gPSB7ICAwLjgwNDI4NDdmLCAgICAgIC8qIDhrUy9zICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjU4MzYwNTRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41MzYxNzk2ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNDAyMTQyM2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI5MTc4NzRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjgxMDUxZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjAxMDU1OWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE0NTkwODlmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMzQwMzcyZgorI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMC4wNjcwMTg2ZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMC4wMzM1MDkzZiAgICAvKiAxOTJrUy9zICovCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKyNlbmRpZgogLyoKICAqIEdhaW4gdGFibGUKICAqLwpAQCAtMTU5LDYgKzIxMCwzOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI2NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE1NzZ9OyAgICAgICAgLyogKzE1ZEIgZ2FpbiAqLwogCisjaWZkZWYgQlVJTERfRkxPQVQKK2NvbnN0IExWTV9GTE9BVCAgTFZQU0FfRmxvYXRfR2FpblRhYmxlW109eyAgMC4xNzc3MzQzNzVmLCAgICAgICAgICAvKiAtMTVkQiBnYWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTk5MjE4NzUwZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMjM2MzI4MTJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1MDk3NjU2MmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjgxNzM4MjgxZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMTU5MTc5NjhmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM1NDQ5MjE4N2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzk3OTQ5MjE4ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40NDYyODkwNjJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjUwMDk3NjU2MmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTYyMDExNzE4ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC42MzA4NTkzNzVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjcwNzUxOTUzMWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNzkzOTQ1MzEyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC44OTExMTMyODFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjAwMDAwMDAwMGYsICAgICAgICAgLyogMGRCIGdhaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMjE1ODIwMzFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjI1ODc4OTA2MmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDEyMTA5Mzc1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS41ODQ0NzI2NTZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc3NzgzMjAzMWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDAwMDAwMDAwZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4yMzgyODEyNTBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjUxMTcxODc1MGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuODE4MzU5Mzc1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4xNjIxMDkzNzVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjU0Nzg1MTU2MmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuOTgwOTU3MDMxZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC40NjY3OTY4NzVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LjAxMTcxODc1MGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUuNjUyMzQzNzUwZn07ICAgICAgICAvKiArMTVkQiBnYWluICovCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIENvc29uZSBwb2x5bm9taWFsIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE4MSw3ICsyNjUsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjY3MSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzczMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtOTQ5MH07ICAgICAgICAgICAgICAgICAgICAgICAgLyogYTUgKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitjb25zdCBMVk1fRkxPQVQgICAgIExWUFNBX0Zsb2F0X0Nvc0NvZWZbXSA9IHsgMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTI1MDAzOGYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMTA5ODZmLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGExICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNjAxOTc3NWYsICAgICAgICAgICAgICAgICAgICAgICAgLyogYTIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wODE1MTQ5ZiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjcyNDIwNDJmLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhNCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI4OTYyMDZmfTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBhNSAqLworI2VuZGlmCiAvKgogICogQ29lZmZpY2llbnRzIGZvciBjYWxjdWxhdGluZyB0aGUgY29zaW5lIGVycm9yIHdpdGggdGhlIGVxdWF0aW9uOgogICoKQEAgLTIwMSw3ICsyOTMsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjU4NiwgICAgICAgICAgICAgICAgICAgICAgIC8qIGEyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NH07ICAgICAgICAgICAgICAgICAgICAgICAgLyogYTMgKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitjb25zdCBMVk1fRkxPQVQgICAgTFZQU0FfRmxvYXRfRFBDb3NDb2VmW10gPSB7MS4wZiwgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaGlmdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjBmLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEwICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDgzMTFmLCAgICAgICAgICAgICAgICAgLyogYTEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjUwNjE3OTk5ZiwgICAgICAgICAgICAgICAgIC8qIGEyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAxMzQyODFmfTsgICAgICAgICAgICAgICAgLyogYTMgKi8KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgUXVhc2kgcGVhayBmaWx0ZXIgY29lZmZpY2llbnRzIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjM5LDMgKzMzNyw1NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHhBMzc1QjJDNiwweDFFOTQzQkJDfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4QTJFMUU5NTAsMHgxRTJBNTMyRX19OyAvKiA0OGtTL3MgKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUCitjb25zdCBRUERfRkxPQVRfQ29lZnMgICAgIExWUFNBX1FQRF9GbG9hdF9Db2Vmc1tdID0geworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLyAgICAvKiBMVlBTQV9TUEVFRF9MT1cgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzNjgzMTk4OTMyNTU4M2YsMC4wMDYyMTM1NTY1MDk0NjUwZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTM1ODMzMzMyMTI4ODIzZiwwLjAwNjMxMTU0OTMzOTQ0MzRmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLDAuMDA2NjI0OTkzNDAyNTEwOWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzNjgzMTk4OTMyNTU4M2YsMC4wMDYyMTM1NTY1MDk0NjUwZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMxMjY5NjE4NjgyNTYzZiwwLjAwNjc1OTI2NDk3MjA2MDlmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLDAuMDA2NjI0OTkzNDAyNTEwOWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMzY4NjYzMzU5NDMzNGYsMC4wMDY1MjIxNjcwMDgzNzAyZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMxMjY5NjE4NjgyNTYzZiwwLjAwNjc1OTI2NDk3MjA2MDlmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMjYzODQ1Nzk3NjI4MmYsMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCisjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwwLjAwNjYyNDk5MzQwMjUxMDlmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLDAuMDA2NjI0OTkzNDAyNTEwOWZ9LAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLyAgICAvKiBMVlBTQV9TUEVFRF9NRURJVU0gICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU2ODA3OTQyNTk1MzMyOWYsMC4wNDE4NzQyNjY2OTUyMzEyZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTYxNDEzMDQ2OTAzOTA4ZiwwLjA0MjUwOTA4MjIzOTEyMTJmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU2ODA3OTQyNTk1MzMyOWYsMC4wNDE4NzQyNjY2OTUyMzEyZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTMxMDExOTEyMDQwNDEyZiwwLjA0NTM5OTUyMzgwNTgyNjlmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU0NzA5OTk1NTM3OTk2M2YsMC4wNDM4NzA4NTU1ODg0NjU5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3sweDg2MDBDN0I5LDB4MDVDRkE2Q0Z9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTUzMTAxMTkxMjA0MDQxMmYsMC4wNDUzOTk1MjM4MDU4MjY5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAorI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU0MDExOTU2MjI5ODA1OWYsMC4wNDQ1MzQzODE5NDQ2ODYyZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTQwMTE5NTYyMjk4MDU5ZiwwLjA0NDUzNDM4MTk0NDY4NjJmfSwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovICAgLyogTFZQU0FfU1BFRURfSElHSCAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43NDE1MTg2NzkwNzQ5NDMxZiwwLjIyNTQ0MDkwMjYzNTQ1NTFmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjczODE0NTEyMDQ0MTkxMzZmLDAuMjI3OTIwOTY1MjkxNTU5N2Z9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzI3NDgwNzMxOTA0NTA2N2YsMC4yMzU2NjY2NTQwNzI3MDE5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43NDE1MTg2NzkwNzQ5NDMxZiwwLjIyNTQ0MDkwMjYzNTQ1NTFmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjcyMjk3MDYzMTkwNDkwMDFmLDAuMjM4ODk4NzIyNDU0OTA1NWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzI3NDgwNzMxOTA0NTA2N2YsMC4yMzU2NjY2NTQwNzI3MDE5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43MzA5NTgxMzUzMzI5MTIyZiwwLjIzMzE1NjgyMjYyMTgyMjRmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjcyMjk3MDYzMTkwNDkwMDFmLDAuMjM4ODk4NzIyNDU0OTA1NWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzI3NDgwNzMxOTA0NTA2N2YsMC4yMzU2NjY2NTQwNzI3MDE5Zn0KKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsey0wLjcyNzQ4MDczMTkwNDUwNjdmLDAuMjM1NjY2NjU0MDcyNzAxOWZ9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHstMC43Mjc0ODA3MzE5MDQ1MDY3ZiwwLjIzNTY2NjY1NDA3MjcwMTlmfQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYi9MVkNTLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliL0xWQ1MuaAppbmRleCAwZDYyMjc0Li5lNzU2OTVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliL0xWQ1MuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliL0xWQ1MuaApAQCAtMzc0LDEyICszNzQsMTcgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2lmZGVmIEJVSUxEX0ZMT0FUCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1Byb2Nlc3MoTFZDU19IYW5kbGVfdCAgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOworI2Vsc2UKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUHJvY2VzcyhMVkNTX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7Ci0KKyNlbmRpZgogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguYwppbmRleCAzZTQ4YzdlLi4yOWUzYzllIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5jCkBAIC03MCwxMSArNzAsMTcgQEAKIHsKIAogICAgIExWTV9VSU5UMTYgICAgICAgICAgT2Zmc2V0OworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIExWTV9VSU5UMzIgICAgICAgICAgR2FpbjsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIEN1cnJlbnQ7CisjZWxzZQorICAgIExWTV9GTE9BVCAgICAgICAgICAgR2FpbjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEN1cnJlbnQ7CisjZW5kaWYKICAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKICAgICBMVkNTX0J5cGFzc01peF90ICAgICpwQ29uZmlnICAgPSAoTFZDU19CeXBhc3NNaXhfdCAqKSZwSW5zdGFuY2UtPkJ5cGFzc01peDsKICAgICBjb25zdCBHYWluX3QgICAgICAgICpwT3V0cHV0R2FpblRhYmxlOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgQ3VycmVudDsKKwogCiAKICAgICAvKgpAQCAtODUsNyArOTEsMTEgQEAKICAgICAgICAgJiYgKHBJbnN0YW5jZS0+TVNUYXJnZXQxICE9IDB4N0ZGRikgLyogdGhpcyBpbmRpY2F0ZXMgYW4gb2ZmLT5vbiB0cmFuc3Rpb24gKi8KICAgICAgICAgKQogICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbiA9IHBQYXJhbXMtPkVmZmVjdExldmVsOworI2Vsc2UKKyAgICAgICAgcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbiA9ICgoTFZNX0ZMT0FUKXBQYXJhbXMtPkVmZmVjdExldmVsIC8gMzI3NjcpOworI2VuZGlmCiAgICAgfQogICAgIGVsc2UKICAgICB7CkBAIC0xMDIsMjMgKzExMiw0NiBAQAogICAgIC8qCiAgICAgICogU2V0dXAgdGhlIG1peGVyIGdhaW4gZm9yIHRoZSBwcm9jZXNzZWQgcGF0aAogICAgICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIEdhaW4gPSAoTFZNX1VJTlQzMikocE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLkxvc3MgKiBwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluKTsKKyNlbHNlCisgICAgR2FpbiA9ICAoTFZNX0ZMT0FUKShwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uTG9zcyAqIHBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4pOworI2VuZGlmCiAKICAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtID0gMDsKICAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgPSBMVk1fTlVMTDsKICAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgPSBMVk1fTlVMTDsKICAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldD0xOworCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgQ3VycmVudCA9IExWQ19NaXhlcl9HZXRDdXJyZW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSk7CiAgICAgTFZDX01peGVyX0luaXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLChMVk1fSU5UMzIpKEdhaW4gPj4gMTUpLEN1cnJlbnQpOwogICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLExWQ1NfQllQQVNTX01JWEVSX1RDLHBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CisjZWxzZQorICAgIEN1cnJlbnQgPSBMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0pOworICAgIExWQ19NaXhlcl9Jbml0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSwgKExWTV9GTE9BVCkoR2FpbiksIEN1cnJlbnQpOworICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMsIHBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOworI2VuZGlmCisKICAgICAvKgogICAgICAqIFNldHVwIHRoZSBtaXhlciBnYWluIGZvciB0aGUgdW5wcm9jZXNzZWQgcGF0aAogICAgICAqLworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIEdhaW4gPSAoTFZNX1VJTlQzMikocE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLkxvc3MgKiAoMHg3RkZGIC0gcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbikpOwogICAgIEdhaW4gPSAoTFZNX1VJTlQzMilwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uVW5wcm9jTG9zcyAqIChHYWluID4+IDE1KTsKICAgICBDdXJyZW50ID0gTFZDX01peGVyX0dldEN1cnJlbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdKTsKICAgICBMVkNfTWl4ZXJfSW5pdCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sKExWTV9JTlQzMikoR2FpbiA+PiAxNSksQ3VycmVudCk7CiAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sTFZDU19CWVBBU1NfTUlYRVJfVEMscFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKKyNlbHNlCisgICAgR2FpbiA9IChMVk1fRkxPQVQpKHBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5Mb3NzICogKDEuMCAtIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQpcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbikpOworICAgIEdhaW4gPSAoTFZNX0ZMT0FUKXBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5VbnByb2NMb3NzICogR2FpbjsKKyAgICBDdXJyZW50ID0gTFZDX01peGVyX0dldEN1cnJlbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdKTsKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sIChMVk1fRkxPQVQpKEdhaW4pLCBDdXJyZW50KTsKKyAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLCBwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKKyNlbmRpZgogICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrUGFyYW0gPSAwOwogICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSA9IGhJbnN0YW5jZTsKICAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldD0xOwpAQCAtMTM0LDcgKzE2Nyw3IEBACiAgICAgICogQ29ycmVjdCBnYWluIGZvciB0aGUgZWZmZWN0IGxldmVsCiAgICAgICovCiAgICAgewotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgR2FpbkNvcnJlY3Q7CiAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgR2FpbjE7CiAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgR2FpbjI7CkBAIC0xNzIsNiArMjA1LDQzIEBACiAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLExWQ1NfQllQQVNTX01JWEVSX1RDLHBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CiAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLEdhaW4yPj4xNik7CiAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLExWQ1NfQllQQVNTX01JWEVSX1RDLHBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CisjZWxzZQorICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgIEdhaW5Db3JyZWN0OworICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgIEdhaW4xOworICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgIEdhaW4yOworCisgICAgICAgIEdhaW4xID0gTFZDX01peGVyX0dldFRhcmdldCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0pOworICAgICAgICBHYWluMiA9IExWQ19NaXhlcl9HZXRUYXJnZXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBnYWluIGNvcnJlY3Rpb24KKyAgICAgICAgICovCisgICAgICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5Db21wcmVzc29yTW9kZSA9PSBMVk1fTU9ERV9PTikKKyAgICAgICAgeworICAgICAgICBHYWluQ29ycmVjdCA9IChMVk1fRkxPQVQpKCAgcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkdhaW5NaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKCgoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5HYWluTWluICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMVk1fRkxPQVQpcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKChMVk1fRkxPQVQpcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkdhaW5GdWxsICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExWTV9GTE9BVClwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluKSkpKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgZ2FpbiBjb3JyZWN0aW9uCisgICAgICAgICAqLworICAgICAgICBHYWluMSA9IChHYWluMSAqIEdhaW5Db3JyZWN0KTsKKyAgICAgICAgR2FpbjIgPSAoR2FpbjIgKiBHYWluQ29ycmVjdCk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgZ2FpbiB2YWx1ZXMKKyAgICAgICAgICovCisgICAgICAgIHBDb25maWctPk91dHB1dF9TaGlmdCA9IHBDb25maWctPk91dHB1dF9TaGlmdDsKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sR2FpbjEpOworICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0JZUEFTU19NSVhFUl9UQywgcFBhcmFtcy0+U2FtcGxlUmF0ZSwgMik7CisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLEdhaW4yKTsKKyAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMsIHBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOworI2VuZGlmCiAgICAgfQogCiAgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7CkBAIC0yMDYsOSArMjc2LDE1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0J5cGFzc01peGVyKExWQ1NfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAqcFByb2Nlc3NlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICpwVW5wcm9jZXNzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqcE91dERhdGEsCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqcFVucHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBPdXREYXRhLAorI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICBOdW1TYW1wbGVzKQogewogCkBAIC0yMjMsNiArMjk5LDcgQEAKICAgICAgICAgLyoKICAgICAgICAgICogQXBwbHkgdGhlIGJ5cGFzcyBtaXgKICAgICAgICAgICovCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKikgcFVucHJvY2Vzc2VkLApAQCAtMjM2LDYgKzMxMywyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KilwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiopcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcykpOyAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCovCisjZWxzZQorICAgICAgICBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikgcFVucHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwbHkgb3V0cHV0IGdhaW4gY29ycmVjdGlvbiBzaGlmdAorICAgICAgICAgKi8KKyAgICAgICAgU2hpZnRfU2F0X0Zsb2F0KChMVk1fSU5UMTYpcENvbmZpZy0+T3V0cHV0X1NoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCopcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKilwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0Ki8KKyNlbmRpZgogICAgIH0KIAogICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5oCmluZGV4IGQxZWY3MGEuLmY2OWJhMzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmgKQEAgLTQyLDEyICs0MiwxNiBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICAvKiBNaXhlciBzZXR0aW5ncyAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICAgTWl4ZXJfSW5zdGFuY2U7ICAgICAgICAgICAgIC8qIE1peGVyIGluc3RhbmNlICovCisjZWxzZQogICAgIExWTWl4ZXIzXzJTdF9zdCAgICAgICAgIE1peGVyX0luc3RhbmNlOyAgICAgICAgICAgICAvKiBNaXhlciBpbnN0YW5jZSAqLworI2VuZGlmCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgT3V0cHV0X1NoaWZ0OyAgICAgICAgICAgICAgIC8qIENvcnJlY3RpbmcgZ2FpbiBvdXRwdXQgc2hpZnQgKi8KIAogfSBMVkNTX0J5cGFzc01peF90OwogCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKIC8qIE91dHB1dCBnYWluIHR5cGUgKi8KIHR5cGVkZWYgc3RydWN0CiB7CkBAIC01Niw4ICs2MCwxNSBAQAogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIExvc3M7ICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3NzIHJlcXVpcmVkICovCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgVW5wcm9jTG9zczsgICAgICAgICAgICAgICAgIC8qIFVucHJvY2Vzc2VkIHBhdGggbG9zcyAqLwogfSBHYWluX3Q7Ci0KLQorI2Vsc2UKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogT3V0cHV0IGdhaW4gc2V0dGluZ3MsIEdhaW4gPSAoTG9zcy8zMjc2OCkgKiAyXlNoaWZ0ICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICBTaGlmdDsgICAgICAgICAgICAgICAgICAgICAgLyogTGVmdCBzaGlmdHMgcmVxdWlyZWQgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgIExvc3M7ICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3NzIHJlcXVpcmVkICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICBVbnByb2NMb3NzOyAgICAgICAgICAgICAgICAgLyogVW5wcm9jZXNzZWQgcGF0aCBsb3NzICovCit9IEdhaW5fdDsKKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEZ1bmN0aW9uIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTY3LDEzICs3OCwxOSBAQAogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19CeXBhc3NNaXhJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgKnBQYXJhbXMpOwogCi0KKyNpZm5kZWYgQlVJTERfRkxPQVQKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQnlwYXNzTWl4ZXIoTFZDU19IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICpwUHJvY2Vzc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgKnVuUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgTnVtU2FtcGxlcyk7Ci0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgIE51bVNhbXBsZXMpOworI2Vsc2UKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQnlwYXNzTWl4ZXIoTFZDU19IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnVuUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgTnVtU2FtcGxlcyk7CisjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQ29udHJvbC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0NvbnRyb2wuYwppbmRleCBjZTZkNDEwLi4zYmY2ZWM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQ29udHJvbC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Db250cm9sLmMKQEAgLTEyMCwxMSArMTIwLDEzIEBACiAgICAgICAgIHBJbnN0YW5jZS0+Vm9sQ29ycmVjdCA9IHBMVkNTX1ZvbENvcnJlY3RUYWJsZVtPZmZzZXRdOwogCiAgICAgICAgIHBJbnN0YW5jZS0+Q29tcHJlc3NHYWluID0gcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkNvbXBNaW47Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sIDAsIDApOworI2Vsc2UKICAgICAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLDAsMCk7Ci0KLQorI2VuZGlmCiAgICAgICAgIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICAgICAgICAgIExWTV9VSU5UMzIgICAgICAgICAgR2FpbjsKICAgICAgICAgICAgIGNvbnN0IEdhaW5fdCAgICAgICAgKnBPdXRwdXRHYWluVGFibGUgPSAoR2Fpbl90KikmTFZDU19PdXRwdXRHYWluVGFibGVbMF07CiAgICAgICAgICAgICBHYWluID0gKExWTV9VSU5UMzIpKHBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5Mb3NzICogTFZNX01BWElOVF8xNik7CkBAIC0xNDAsNyArMTQyLDIzIEBACiAgICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLHBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSwKICAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMscFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKKyNlbHNlCisgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgR2FpbjsKKyAgICAgICAgICAgIGNvbnN0IEdhaW5fdCAgICAgICAgKnBPdXRwdXRHYWluVGFibGUgPSAoR2Fpbl90KikmTFZDU19PdXRwdXRHYWluVGFibGVbMF07CisgICAgICAgICAgICBHYWluID0gKExWTV9GTE9BVCkocE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLkxvc3MpOworICAgICAgICAgICAgR2FpbiA9IChMVk1fRkxPQVQpcE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLlVucHJvY0xvc3MgKiAoR2Fpbik7CiAKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBcHBseSB0aGUgZ2FpbiBjb3JyZWN0aW9uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEdhaW4gPSAoR2FpbiAqIHBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5HYWluTWluKTsKKworICAgICAgICAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLCAwLCBHYWluKTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICBMVkNTX0JZUEFTU19NSVhFUl9UQywgcFBhcmFtcy0+U2FtcGxlUmF0ZSwgMik7CisgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSwKKyAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMsIHBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOworI2VuZGlmCiAgICAgICAgIH0KIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmMKaW5kZXggMjViMGQ4Ni4uZWM1MzEyZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuYwpAQCAtNTMsNyArNTMsNzIgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXJJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpCit7CiAKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgIE9mZnNldDsKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVkNTX0VxdWFsaXNlcl90ICAgICpwQ29uZmlnICAgPSAoTFZDU19FcXVhbGlzZXJfdCAqKSZwSW5zdGFuY2UtPkVxdWFsaXNlcjsKKyAgICBMVkNTX0RhdGFfdCAgICAgICAgICpwRGF0YTsKKyAgICBMVkNTX0NvZWZmaWNpZW50X3QgICpwQ29lZmZpY2llbnRzOworICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICBDb2VmZnM7CisgICAgY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAqcEVxdWFsaXNlckNvZWZUYWJsZTsKKworICAgIHBEYXRhID0gKExWQ1NfRGF0YV90ICopIFwKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzOworCisgICAgcENvZWZmaWNpZW50cyA9IChMVkNTX0NvZWZmaWNpZW50X3QgKikgXAorICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7CisgICAgLyoKKyAgICAgKiBJZiB0aGUgc2FtcGxlIHJhdGUgY2hhbmdlcyByZS1pbml0aWFsaXNlIHRoZSBmaWx0ZXJzCisgICAgICovCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUpIHx8CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSAhPSBwUGFyYW1zLT5TcGVha2VyVHlwZSkpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBTZXR1cCB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyBhbmQgY2xlYXIgdGhlIGhpc3RvcnkKKyAgICAgICAgICovCisgICAgICAgIE9mZnNldCA9IChMVk1fVUlOVDE2KShwUGFyYW1zLT5TYW1wbGVSYXRlICsgKHBQYXJhbXMtPlNwZWFrZXJUeXBlICogKDEgKyBMVk1fRlNfNDgwMDApKSk7CisgICAgICAgIHBFcXVhbGlzZXJDb2VmVGFibGUgPSAoQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCopJkxWQ1NfRXF1YWxpc2VyQ29lZlRhYmxlWzBdOworCisgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0IGZpbHRlcnMgKi8KKyAgICAgICAgLyogQ29udmVydCBpbmNvbWluZyBjb2VmZmljaWVudHMgdG8gdGhlIHJlcXVpcmVkIGZvcm1hdC9vcmRlcmluZyAqLworICAgICAgICBDb2VmZnMuQTAgPSAoTFZNX0ZMT0FUKSBwRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQTA7CisgICAgICAgIENvZWZmcy5BMSA9IChMVk1fRkxPQVQpIHBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5BMTsKKyAgICAgICAgQ29lZmZzLkEyID0gKExWTV9GTE9BVCkgcEVxdWFsaXNlckNvZWZUYWJsZVtPZmZzZXRdLkEyOworICAgICAgICBDb2VmZnMuQjEgPSAoTFZNX0ZMT0FUKS1wRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQjE7CisgICAgICAgIENvZWZmcy5CMiA9IChMVk1fRkxPQVQpLXBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5CMjsKKworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoKExWTV9JTlQxNikwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBEYXRhLT5FcXVhbGlzZXJCaXF1YWRUYXBzLCAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDpcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB3b3JkcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHNpemVvZihwRGF0YS0+RXF1YWxpc2VyQmlxdWFkVGFwcykgLyBzaXplb2YoTFZNX0ZMT0FUKSkpOworCisgICAgICAgIEJRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQoJnBDb2VmZmljaWVudHMtPkVxdWFsaXNlckJpcXVhZEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+RXF1YWxpc2VyQmlxdWFkVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZzKTsKKworICAgICAgICAvKiBDYWxsYmFja3MgKi8KKyAgICAgICAgc3dpdGNoKHBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5TY2FsZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2sgID0gQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFjayAgPSBCUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrICA9IEJRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisjZWxzZQogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXJJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpCiB7CkBAIC0xMTIsNyArMTc3LDcgQEAKIAogICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfRXF1YWxpc2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTEzMiw3ICsxOTcsMzcgQEAKIC8qICAxLiAgQWx3YXlzIHByb2Nlc3NlcyBpbiBwbGFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXIoTFZDU19IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwSW5wdXRPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgIE51bVNhbXBsZXMpCit7CiAKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVkNTX0VxdWFsaXNlcl90ICAgICpwQ29uZmlnICAgPSAoTFZDU19FcXVhbGlzZXJfdCAgKikmcEluc3RhbmNlLT5FcXVhbGlzZXI7CisgICAgTFZDU19Db2VmZmljaWVudF90ICAqcENvZWZmaWNpZW50czsKKworCisgICAgcENvZWZmaWNpZW50cyA9IChMVkNTX0NvZWZmaWNpZW50X3QgKikgXAorICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGUgZXF1YWxpc2VyIGlzIHJlcXVpcmVkCisgICAgICovCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19FUVVBTElTRVJTV0lUQ0gpICE9IDApCisgICAgeworICAgICAgICAvKiBBcHBseSBmaWx0ZXIgdG8gdGhlIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWxzICovCisgICAgICAgIChwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2spKChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCopIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENvZWZmaWNpZW50cy0+RXF1YWxpc2VyQmlxdWFkSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBJbnB1dE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcElucHV0T3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgfQorCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisjZWxzZQogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXIoTFZDU19IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICpwSW5wdXRPdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgIE51bVNhbXBsZXMpCkBAIC0xNTcsNCArMjUyLDQgQEAKIAogICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwogfQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuaAppbmRleCBjZjk2ZjViLi4wZTc1NmU3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5oCkBAIC0zMiw4ICszMiwxMSBAQAogLyogRXF1YWxpc2VyIHN0cnVjdHVyZSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICB2b2lkICgqcEJpcXVhZENhbGxCYWNrKSAoQmlxdWFkX0luc3RhbmNlX3QqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYpOwotCisjZWxzZQorICAgIHZvaWQgKCpwQmlxdWFkQ2FsbEJhY2spIChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCosIExWTV9GTE9BVCosIExWTV9GTE9BVCosIExWTV9JTlQxNik7CisjZW5kaWYKIH0gTFZDU19FcXVhbGlzZXJfdDsKIAogCkBAIC00NSwxMiArNDgsMTUgQEAKIAogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXJJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpOwotCisjaWZuZGVmIEJVSUxEX0ZMT0FUCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0VxdWFsaXNlcihMVkNTX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICpwSW5wdXRPdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOwotCi0KKyNlbHNlCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0VxdWFsaXNlcihMVkNTX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICpwSW5wdXRPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOworI2VuZGlmCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgKaW5kZXggM2U2NDBjYi4uNGY1MjIxYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSGVhZHBob25lX0NvZWZmcy5oCkBAIC0yNCw3ICsyNCw0NjMgQEAKIC8qIFRoZSBTdGVyZW8gRW5oYW5jZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgODAwMCBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjEyNTggKi8KKyNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjIyNzcyMAorI2RlZmluZSBDU19NSURETEVfODAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE1MTI1CisjZGVmaW5lIENTX01JRERMRV84MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjkyMTg5OQorI2RlZmluZSBDU19NSURETEVfODAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV84MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV84MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjYxMTQ0MQorI2RlZmluZSBDU19TSURFXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMzgwMzQ0CisjZGVmaW5lIENTX1NJREVfODAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMzEwOTcKKyNkZWZpbmUgQ1NfU0lERV84MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjYyMjQ3MAorI2RlZmluZSBDU19TSURFXzgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTMwNzU5CisjZGVmaW5lIENTX1NJREVfODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAxNQogCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAxMTAyNUh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2Mjk0MyAqLworI2RlZmluZSBDU19NSURETEVfMTEwMjVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMjMwODM4CisjZGVmaW5lIENTX01JRERMRV8xMTAyNV9BMSAgICAgICAgICAgICAgICAgICAgICAtMC4yMjE1NTkKKyNkZWZpbmUgQ1NfTUlERExFXzExMDI1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMTEwMjVfQjEgICAgICAgICAgICAgICAgICAgICAgLTAuOTQzMDU2CisjZGVmaW5lIENTX01JRERMRV8xMTAyNV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzExMDI1X1NDQUxFICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzExMDI1X0EwICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTU3MzcyCisjZGVmaW5lIENTX1NJREVfMTEwMjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMC4zOTE0OTAKKyNkZWZpbmUgQ1NfU0lERV8xMTAyNV9BMiAgICAgICAgICAgICAgICAgICAgICAgIC0wLjE2NTg4MQorI2RlZmluZSBDU19TSURFXzExMDI1X0IxICAgICAgICAgICAgICAgICAgICAgICAgLTAuODgwNjA4CisjZGVmaW5lIENTX1NJREVfMTEwMjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMzIzOTcKKyNkZWZpbmUgQ1NfU0lERV8xMTAyNV9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAxNQorCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAxMjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MjE5MSAqLworI2RlZmluZSBDU19NSURETEVfMTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAwLjIyOTkzMgorI2RlZmluZSBDU19NSURETEVfMTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgIC0wLjIyMTQzNgorI2RlZmluZSBDU19NSURETEVfMTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0wLjk0NzYxNgorI2RlZmluZSBDU19NSURETEVfMTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzEyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTU4Mzk4CisjZGVmaW5lIENTX1NJREVfMTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMC4zOTIyMTEKKyNkZWZpbmUgQ1NfU0lERV8xMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgIC0wLjE2NjE4NworI2RlZmluZSBDU19TSURFXzEyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgLTAuODkyNTUwCisjZGVmaW5lIENTX1NJREVfMTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMzI4NTYKKyNkZWZpbmUgQ1NfU0lERV8xMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTUKKworLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMTYwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjIzNzEgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjIzMDYzOAorI2RlZmluZSBDU19NSURETEVfMTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgLTAuMjI0MjMyCisjZGVmaW5lIENTX01JRERMRV8xNjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgIC0wLjk2MDU1MAorI2RlZmluZSBDU19NSURETEVfMTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8xNjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfMTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgMC40OTk2OTUKKyNkZWZpbmUgQ1NfU0lERV8xNjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgIC0wLjM1NTU0MworI2RlZmluZSBDU19TSURFXzE2MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTQ0MTUyCisjZGVmaW5lIENTX1NJREVfMTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAtMS4wNTA3ODgKKyNkZWZpbmUgQ1NfU0lERV8xNjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjE0NDEwNAorI2RlZmluZSBDU19TSURFXzE2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNAorCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAyMjA1MEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MDc4MSAqLworI2RlZmluZSBDU19NSURETEVfMjIwNTBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMjI4NzQ5CisjZGVmaW5lIENTX01JRERMRV8yMjA1MF9BMSAgICAgICAgICAgICAgICAgICAgICAtMC4yMjQxMjgKKyNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMjIwNTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTAuOTcxMjYyCisjZGVmaW5lIENTX01JRERMRV8yMjA1MF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMC40NDAxMTIKKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjEwOTYKKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAtMC4xNzkwMTYKKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMS4xMTY3ODYKKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xODI1MDcKKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMjQwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjE4ODIgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjMwMzk1CisjZGVmaW5lIENTX01JRERMRV8yNDAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIyNjExNworI2RlZmluZSBDU19NSURETEVfMjQwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgLTAuOTczNTczCisjZGVmaW5lIENTX01JRERMRV8yNDAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMjQwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzI0MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40MTQ3NzAKKyNkZWZpbmUgQ1NfU0lERV8yNDAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjg3MTgyCisjZGVmaW5lIENTX1NJREVfMjQwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjEyNzU4OAorI2RlZmluZSBDU19TSURFXzI0MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4yMjk2NDgKKyNkZWZpbmUgQ1NfU0lERV8yNDAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjgyMTc3CisjZGVmaW5lIENTX1NJREVfMjQwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDMyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYwMzIyICovCisjZGVmaW5lIENTX01JRERMRV8zMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMjg0MDAKKyNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIyNTIxNAorI2RlZmluZSBDU19NSURETEVfMzIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8zMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC45ODAxMjYKKyNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMzIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzMyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzY0NTc5CisjZGVmaW5lIENTX1NJREVfMzIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMDczNTUKKyNkZWZpbmUgQ1NfU0lERV8zMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjE1NzIyNAorI2RlZmluZSBDU19TSURFXzMyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMjc0MjMxCisjZGVmaW5lIENTX1NJREVfMzIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMTI0OTUKKyNkZWZpbmUgQ1NfU0lERV8zMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgNDQxMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjM4MzQgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yMzM1OTMKKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0ExICAgICAgICAgICAgICAgICAgICAtMC4yMzEyMjUKKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0IxICAgICAgICAgICAgICAgICAgICAtMC45ODU1NDUKKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0IyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4yODQ1NzMKKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9BMSAgICAgICAgICAgICAgICAgICAgICAtMC4yNTg5MTAKKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMjU2NjIKKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS41NzIyNDgKKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC41ODgzOTkKKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9TQ0FMRSAgICAgICAgICAgICAgICAgIDE0CisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDQ4MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTY0NDAyICovCisjZGVmaW5lIENTX01JRERMRV80ODAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjM0NDQ1CisjZGVmaW5lIENTX01JRERMRV80ODAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTAuMjMyMjYxCisjZGVmaW5lIENTX01JRERMRV80ODAwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV80ODAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTAuOTg2NzEzCisjZGVmaW5lIENTX01JRERMRV80ODAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfNDgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjI3MjYwNgorI2RlZmluZSBDU19TSURFXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAgICAtMC4yNjY5NTIKKyNkZWZpbmUgQ1NfU0lERV80ODAwMF9BMiAgICAgICAgICAgICAgICAgICAgLTAuMDA1NjU0CisjZGVmaW5lIENTX1NJREVfNDgwMDBfQjEgICAgICAgICAgICAgICAgICAgIC0xLjYxNzE0MQorI2RlZmluZSBDU19TSURFXzQ4MDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC42MzA0MDUKKyNkZWZpbmUgQ1NfU0lERV80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworI2lmZGVmIEhJR0hFUl9GUworLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgOTYwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggIDAuMTY1Ki8KKy8qIGhpZ2ggcGFzcyBmaWx0ZXIgd2l0aCBjdXRvZmYgZnJlcXVlbmN5IDEwMi4xOCBIeiovCisjZGVmaW5lIENTX01JRERMRV85NjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjM1NTMyCisjZGVmaW5lIENTX01JRERMRV85NjAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTAuMjM0NDMyCisjZGVmaW5lIENTX01JRERMRV85NjAwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV85NjAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTAuOTkzMzM0CisjZGVmaW5lIENTX01JRERMRV85NjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisvKiBiYW5kcGFzcyBmaWx0ZXIgd2l0aCBmYzEgMjcwIGFuZCBmYzIgMzcwMywgZGVzaWduZWQgdXNpbmcgMm5kIG9yZGVyIGJ1dHRlcndvcnRoICovCisjZGVmaW5lIENTX1NJREVfOTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjAxNjcyNworI2RlZmluZSBDU19TSURFXzk2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMiAgICAgICAgICAgICAgICAgICAgLTAuMDE2NzI3CisjZGVmaW5lIENTX1NJREVfOTYwMDBfQjEgICAgICAgICAgICAgICAgICAgIC0xLjc5MzM3MgorI2RlZmluZSBDU19TSURFXzk2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC43OTcyMzYKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDE5MjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAgMC4xNjg5Ki8KKyNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjQxMjE5CisjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQTEgICAgICAgICAgICAgICAgICAgIC0wLjI0MDY1NgorI2RlZmluZSBDU19NSURETEVfMTkyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTAuOTk2NjYxCisjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKy8qIGJhbmRwYXNzIGZpbHRlciB3aXRoIGZjMSAyNzAgYW5kIGZjMiAzNzAzLCBkZXNpZ25lZCB1c2luZyAybmQgb3JkZXIgYnV0dGVyd29ydGggKi8KKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwODk5MQorI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0EyICAgICAgICAgICAgICAgICAgICAtMC4wMDg5OTEKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQjEgICAgICAgICAgICAgICAgICAgIC0xLjg5MjUwOQorI2RlZmluZSBDU19TSURFXzE5MjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuODkzNTI0CisjZGVmaW5lIENTX1NJREVfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAxNAorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhlIFJldmVyYiBVbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBSZXZlcmIgZGVsYXkgc2V0dGluZ3MgaW4gc2FtcGxlcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzhLSFogICAgICAgICAgICAgICAgICAgICA5MyAgICAgICAgIC8qIFNhbXBsZSByYXRlIDhrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTFLSFogICAgICAgICAgICAgICAgICAgMTI4ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMTFrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTJLSFogICAgICAgICAgICAgICAgICAgMTM5ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMTJrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTZLSFogICAgICAgICAgICAgICAgICAgMTg2ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMTZrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMjJLSFogICAgICAgICAgICAgICAgICAgMjU2ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMjJrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMjRLSFogICAgICAgICAgICAgICAgICAgMjc5ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMjRrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMzJLSFogICAgICAgICAgICAgICAgICAgMzcyICAgICAgICAgLyogU2FtcGxlIHJhdGUgMzJrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDRLSFogICAgICAgICAgICAgICAgICAgNTEyICAgICAgICAgLyogU2FtcGxlIHJhdGUgNDRrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDhLSFogICAgICAgICAgICAgICAgICAgNTEyICAgICAgICAgLyogU2FtcGxlIHJhdGUgNDhrUy9zICovCisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDgwMDAgSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl84MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAwLjY2NzI3MQorI2RlZmluZSBDU19SRVZFUkJfODAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC42NjcyNzEKKyNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl84MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjY2ODE3OQorI2RlZmluZSBDU19SRVZFUkJfODAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgMTUKKworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMTEwMjVIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0EwICAgICAgICAgICAgICAgICAgICAgMC42OTk2MzgKKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0ExICAgICAgICAgICAgICAgICAgICAtMC42OTk2MzgKKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0EyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0IxICAgICAgICAgICAgICAgICAgICAtMC43NDkwOTYKKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0IyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X1NDQUxFICAgICAgICAgICAgICAgICAgMTUKKworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMTIwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0EwICAgICAgICAgICAgICAgICAgIDAuNzA2OTMxCisjZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9BMSAgICAgICAgICAgICAgICAgIC0wLjcwNjkzMQorI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfQTIgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0IxICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9CMiAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgMTUKKworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMTYwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuNzI4MjcyCisjZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9BMSAgICAgICAgICAgICAgICAgICAgIC0wLjcyODI3MgorI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgLTAuODIwNjc5CisjZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAyMjA1MEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLworI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQTAgICAgICAgICAgICAgICAgICAgICAwLjUxNjM5NgorI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQTIgICAgICAgICAgICAgICAgICAgIC0wLjUxNjM5NgorI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQjEgICAgICAgICAgICAgICAgICAgIC0wLjUxODUxMgorI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQjIgICAgICAgICAgICAgICAgICAgIC0wLjI5MDk5MAorI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorCisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDI0MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC40Nzk1NjUKKyNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuNDc5NTY1CisjZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAtMC42Mzc3NDUKKyNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0IyICAgICAgICAgICAgICAgICAgICAgIC0wLjE5ODkxMgorI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAzMjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLworI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4zODAzNDkKKyNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjM4MDM0OQorI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAtMC45NTA4NzMKKyNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuMDQ5MTI3CisjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDQ0MTAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAwLjI5NzM4OQorI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjk3Mzg5CisjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0xLjIwMDQyMworI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTY1MjkKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgNDgwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjI3ODY2MQorI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4yNzg2NjEKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjI1NDk5MworI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuMzAzMzQ3CisjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE0CisKKyNpZmRlZiBISUdIRVJfRlMKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDk2MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuOCAqLworLyogQmFuZCBwYXNzIGZpbHRlciB3aXRoIGZjMT01MDAgYW5kIGZjMj04MDAwKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjE2MDI0ODgKKyNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMTYwMjQ4OAorI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuNTg1NDEzCisjZGVmaW5lIENTX1JFVkVSQl85NjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC41OTkzNzcKKyNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMTkyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuOCAqLworLyogQmFuZCBwYXNzIGZpbHRlciB3aXRoIGZjMT01MDAgYW5kIGZjMj04MDAwKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4wODc4MzY5CisjZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDg3ODM2OQorI2RlZmluZSBDU19SRVZFUkJfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjc3NjU3NjQKKyNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC43ODA0MDc2CisjZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNAorCisjZW5kaWYKKworCisvKiBSZXZlcmIgR2FpbiBTZXR0aW5ncyAqLworI2RlZmluZSBMVkNTX0hFQURQSE9ORV9ERUxBWUdBSU4gICAgICAgICAgICAgICAwLjgwMDAwMCAgICAgICAgIC8qIEFsZ29yaXRobSBkZWxheSBwYXRoIGdhaW4gKi8KKyNkZWZpbmUgTFZDU19IRUFEUEhPTkVfT1VUUFVUR0FJTiAgICAgICAgICAgICAgMS4wMDAwMDAgICAgICAgICAvKiBBbGdvcml0aG0gb3V0cHV0IGdhaW4gKi8KKyNkZWZpbmUgTFZDU19IRUFEUEhPTkVfUFJPQ0dBSU4gICAgICAgICAgICAgICAgICAgMTg0MDMgICAgICAgICAvKiBQcm9jZXNzZWQgcGF0aCBnYWluICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX1VOUFJPQ0dBSU4gICAgICAgICAgICAgICAgIDE4NDAzICAgICAgICAgLyogVW5wcm9jZXNzZWQgcGF0aCBnYWluICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX0dBSU5DT1JSRUNUICAgICAgICAgICAgIDEuMDA5MzQzICAgICAgICAgLyogRGVsYXkgbWl4ZXIgZ2FpbiBjb3JyZWN0aW9uICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhlIEVxdWFsaXNlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciA4MDAwIEh6IHNhbXBsZSByYXRlLCBcCisgICBDUyBzY2FsZWQgd2l0aCAxLjAzODQ5NyBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc3NTQ4MCAqLworI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDEuMjYzMzEyCisjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0ExICAgICAgICAgICAgICAgICAgICAtMC42MDE3NDgKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfQTIgICAgICAgICAgICAgICAgICAgIC0wLjI4MDY4MQorI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTAuNDc1ODY1CisjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0IyICAgICAgICAgICAgICAgICAgICAtMC40MDgxNTQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgMC45NDMzNTcKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9BMSAgICAgICAgICAgICAgICAgICAtMC40NDkzNDUKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9BMiAgICAgICAgICAgICAgICAgICAtMC4yMDk1OTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9CMSAgICAgICAgICAgICAgICAgICAtMC40NzU4NjUKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9CMiAgICAgICAgICAgICAgICAgICAtMC40MDgxNTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgMTUKKworLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMTEwMjVIeiBzYW1wbGUgcmF0ZSwgXAorICAgQ1Mgc2NhbGVkIHdpdGggMS4wMjc3NjEgYW5kIENTRVggc2NhbGVkIHdpdGggMC43Njc0NjMgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0EwICAgICAgICAgICAgICAgICAgICAxLjEwMTE0NQorI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQTEgICAgICAgICAgICAgICAgICAgIDAuMTM5MDIwCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9BMiAgICAgICAgICAgICAgICAgICAtMC44NjQ0MjMKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0IxICAgICAgICAgICAgICAgICAgICAwLjAyNDU0MQorI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQjIgICAgICAgICAgICAgICAgICAgLTAuOTA4OTMwCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X0EwICAgICAgICAgICAgICAgICAgICAwLjk3NjA1OAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMSAgICAgICAgICAgICAgICAgICAtMC42OTUzMjYKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQTIgICAgICAgICAgICAgICAgICAgLTAuMDkwODA5CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X0IxICAgICAgICAgICAgICAgICAgIC0wLjYxMDU5NAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9CMiAgICAgICAgICAgICAgICAgICAtMC4zMTExNDkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfU0NBTEUgICAgICAgICAgICAgICAgICAgMTUKKworLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMTIwMDBIeiBzYW1wbGUgcmF0ZSwgXAorICAgQ1Mgc2NhbGVkIHdpdGggMS4wMzI1MjEgYW5kIENTRVggc2NhbGVkIHdpdGggMC43NzEwMTcgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgIDEuMjc2NjYxCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgIC0xLjAxNzUxOQorI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wNDQxMjgKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgLTAuNzI5NjE2CisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIC0wLjIwNDUzMgorI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9BMCAgICAgICAgICAgICAgICAgMS4wMDcwOTUKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQTEgICAgICAgICAgICAgICAgLTAuODcxOTEyCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX0EyICAgICAgICAgICAgICAgICAwLjAyMzIzMgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9CMSAgICAgICAgICAgICAgICAtMC43NDU4NTcKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQjIgICAgICAgICAgICAgICAgLTAuMTg5MTcxCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDE2MDAwSHogc2FtcGxlIHJhdGUsIFwKKyAgIENTIHNjYWxlZCB3aXRoIDEuMDMxMzc4IGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzcwMTY0ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDEuMjgxNjI5CisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTEuMDc1ODcyCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9BMiAgICAgICAgICAgICAgICAgICAgLTAuMDQxMzY1CisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTAuNzI1MjM5CisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9CMiAgICAgICAgICAgICAgICAgICAgLTAuMjI0MzU4CisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0EwICAgICAgICAgICAgICAgICAgMS4wODEwOTEKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQTEgICAgICAgICAgICAgICAgIC0wLjg2NzE4MworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9BMiAgICAgICAgICAgICAgICAgLTAuMDcwMjQ3CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0IxICAgICAgICAgICAgICAgICAtMC41MTUxMjEKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQjIgICAgICAgICAgICAgICAgIC0wLjQyNTg5MworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxNAorCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAyMjA1MEh6IHNhbXBsZSByYXRlLCBcCisgICBDUyBzY2FsZWQgd2l0aCAxLjA0MTU3NiBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc3Nzc3OSAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQTAgICAgICAgICAgICAgICAgICAgMS4zODg2MDUKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0ExICAgICAgICAgICAgICAgICAgLTEuMzA1Nzk5CisjZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9BMiAgICAgICAgICAgICAgICAgICAwLjAzOTkyMgorI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQjEgICAgICAgICAgICAgICAgICAtMC43MTk0OTQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0IyICAgICAgICAgICAgICAgICAgLTAuMjQzMjQ1CisjZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0EwICAgICAgICAgICAgICAgICAgIDEuMjcyOTEwCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0ExICAgICAgICAgICAgICAgICAgLTEuMzQxMDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgIDAuMTY3NDYyCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0IxICAgICAgICAgICAgICAgICAgLTAuNjE0MjE5CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0IyICAgICAgICAgICAgICAgICAgLTAuMzQ1Mzg0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX1NDQUxFICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDI0MDAwSHogc2FtcGxlIHJhdGUsIFwKKyAgIENTIHNjYWxlZCB3aXRoIDEuMDM0NDk1IGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzcyNDkxICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9BMCAgICAgICAgICAgICAgICAgICAgMS40MDk4MzIKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0ExICAgICAgICAgICAgICAgICAgIC0xLjQ1NjUwNgorI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQTIgICAgICAgICAgICAgICAgICAgIDAuMTUxNDEwCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9CMSAgICAgICAgICAgICAgICAgICAtMC44MDQyMDEKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0IyICAgICAgICAgICAgICAgICAgIC0wLjE2Mzc4MworI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMCAgICAgICAgICAgICAgICAgIDEuMjk5MTk4CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0ExICAgICAgICAgICAgICAgICAtMS40NTI0NDcKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQTIgICAgICAgICAgICAgICAgICAwLjI0MDQ4OQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9CMSAgICAgICAgICAgICAgICAgLTAuNjY5MzAzCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0IyICAgICAgICAgICAgICAgICAtMC4yOTQ5ODQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTQKKworLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMzIwMDBIeiBzYW1wbGUgcmF0ZSwgXAorICAgQ1Mgc2NhbGVkIHdpdGggMS4wNDQ1NTkgYW5kIENTRVggc2NhbGVkIHdpdGggMC43ODAwMDYgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgMS41NjA5ODgKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0ExICAgICAgICAgICAgICAgICAgICAtMS44Nzc3MjQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4zODk3NDEKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0IxICAgICAgICAgICAgICAgICAgICAtMC45MDc0MTAKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0IyICAgICAgICAgICAgICAgICAgICAtMC4wNzA0ODkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQTAgICAgICAgICAgICAgICAgICAxLjc4NTA0OQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMSAgICAgICAgICAgICAgICAgLTIuMjMzNDk3CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0EyICAgICAgICAgICAgICAgICAgMC41MjY0MzEKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQjEgICAgICAgICAgICAgICAgIC0wLjQ0NTkzOQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9CMiAgICAgICAgICAgICAgICAgLTAuNTIyNDQ2CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCisKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDQ0MTAwSHogc2FtcGxlIHJhdGUsIFwKKyAgIENTIHNjYWxlZCB3aXRoIDEuMDIyMTcwIGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzYzMjg4ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9BMCAgICAgICAgICAgICAgICAgIDEuNjIzOTkzCisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9BMSAgICAgICAgICAgICAgICAgLTIuMjcwNzQzCisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9BMiAgICAgICAgICAgICAgICAgIDAuNjg4ODI5CisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9CMSAgICAgICAgICAgICAgICAgLTEuMTE3MTkwCisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9CMiAgICAgICAgICAgICAgICAgIDAuMTMwMjA4CisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0EwICAgICAgICAgICAgICAgICAgIDIuMDI4MzE1CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0ExICAgICAgICAgICAgICAgICAgLTIuODgyNDU5CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0EyICAgICAgICAgICAgICAgICAgIDAuOTA0NTM1CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0IxICAgICAgICAgICAgICAgICAgLTAuNTkzMzA4CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0IyICAgICAgICAgICAgICAgICAgLTAuMzg1ODE2CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCisKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDQ4MDAwSHogc2FtcGxlIHJhdGUsIFwKKyAgIENTIHNjYWxlZCB3aXRoIDEuMDE4NjM1IGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzYwNjQ4ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9BMCAgICAgICAgICAgICAgICAgICAgMS42NDExNzcKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAgIC0yLjM2NDY4NworI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfQTIgICAgICAgICAgICAgICAgICAgIDAuNzU5OTEwCisjZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9CMSAgICAgICAgICAgICAgICAgICAtMS4xNjY3NzQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0IyICAgICAgICAgICAgICAgICAgICAwLjE3ODA3NAorI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxMworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9BMCAgICAgICAgICAgICAgICAgIDIuMDk5NjU1CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAtMy4wNjUyMjAKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQTIgICAgICAgICAgICAgICAgICAxLjAxMDQxNworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9CMSAgICAgICAgICAgICAgICAgLTAuNjM0MDIxCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0IyICAgICAgICAgICAgICAgICAtMC4zNDczMzIKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTMKKworCisjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9BMCAgICAgICAgICAgICAgICAgICAgMS43ODQ0OTcKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0ExICAgICAgICAgICAgICAgICAgIC0zLjAwMTQzNQorI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfQTIgICAgICAgICAgICAgICAgICAgIDEuMjI4NDIyCisjZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9CMSAgICAgICAgICAgICAgICAgICAtMS40Nzc4MDQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0IyICAgICAgICAgICAgICAgICAgICAwLjQ4MTM2OQorI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxMworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMCAgICAgICAgICAgICAgICAgIDIuNzU3MworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMSAgICAgICAgICAgICAgICAgLTQuNjcyMQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMiAgICAgICAgICAgICAgICAgIDEuOTMxNworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMSAgICAgICAgICAgICAgICAgLTAuOTcxNzE4CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX0IyICAgICAgICAgICAgICAgICAtMC4wMjEyMTYKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTMKKworI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAxLjg4OTU4MgorI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAgIC0zLjQ1NjE0MAorI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0EyICAgICAgICAgICAgICAgICAgICAxLjU2OTg2NAorI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAgIC0xLjcwMDc5OAorI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0IyICAgICAgICAgICAgICAgICAgICAwLjcwMTgyNAorI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgMy40MjczCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMSAgICAgICAgICAgICAgICAgLTYuMjkzNgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTIgICAgICAgICAgICAgICAgICAyLjg3MjAKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAtMS4zMTA3NAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQjIgICAgICAgICAgICAgICAgIDAuMzEzMTIKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCisjZW5kaWYKKworCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAvKiBPdXRwdXQgU2hpZnQgKi8KKyNkZWZpbmUgTFZDU19IRUFEUEhPTkVfU0hJRlRMT1NTICAgICAgICAgICAgICAgICAgMC44NDc3NzM1ICAgICAgICAgIC8qIE91dHB1dCBTaGlmdCBsb3NzICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX0dBSU4gICAgICAgICAgICAgICAgICAgICAgIDAuMjA4NzQ2NSAgICAgICAgICAvKiBVbnByb2Nlc3NlZCBwYXRoIGdhaW4gKi8KKyNkZWZpbmUgTFZDU19FWF9IRUFEUEhPTkVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAgICAgIC8qIEVYIE91dHB1dCBTaGlmdCAqLworI2RlZmluZSBMVkNTX0VYX0hFQURQSE9ORV9TSElGVExPU1MgICAgICAgICAgICAgICAwLjU2OTIyNSAgICAgICAgICAgLyogRVggT3V0cHV0IFNoaWZ0IGxvc3MgKi8KKyNkZWZpbmUgTFZDU19FWF9IRUFEUEhPTkVfR0FJTiAgICAgICAgICAgICAgICAgICAgMC4wNzc5NDQyNSAgICAgICAgIC8qIEVYIFVucHJvY2Vzc2VkIHBhdGggZ2FpbiAqLworI2Vsc2UKIC8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDgwMDAgSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYxMjU4ICovCiAjZGVmaW5lIENTX01JRERMRV84MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICA3NDYyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yMjc3MjAgKi8KICNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAoLTcwNDkpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTUxMjUgKi8KQEAgLTM5NCw1ICs4NTAsNiBAQAogI2RlZmluZSBMVkNTX0VYX0hFQURQSE9ORV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgICAgICAgLyogRVggT3V0cHV0IFNoaWZ0ICovCiAjZGVmaW5lIExWQ1NfRVhfSEVBRFBIT05FX1NISUZUTE9TUyAgICAgICAgICAgICAgIDE4NjAwICAgICAgICAgICAgICAvKiBFWCBPdXRwdXQgU2hpZnQgbG9zcyAqLwogI2RlZmluZSBMVkNTX0VYX0hFQURQSE9ORV9HQUlOICAgICAgICAgICAgICAgICAgICAgNTEwOCAgICAgICAgICAgICAgLyogRVggVW5wcm9jZXNzZWQgcGF0aCBnYWluICovCi0KICNlbmRpZgorI2VuZGlmCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSW5pdC5jCmluZGV4IDE5MDRlNDYuLmQ0Yzc2MjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0luaXQuYwpAQCAtOTgsNyArOTgsMTMgQEAKICAgICAgICAgLyoKICAgICAgICAgICogU2NyYXRjaCBtZW1vcnkKICAgICAgICAgICovCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgLyogSW5wbGFjZSBwcm9jZXNzaW5nICovCisgICAgICAgIFNjcmF0Y2hTaXplID0gKExWTV9VSU5UMzIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVkNTX1NDUkFUQ0hCVUZGRVJTICogc2l6ZW9mKExWTV9GTE9BVCkgKiBwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpOworI2Vsc2UKICAgICAgICAgU2NyYXRjaFNpemUgPSAoTFZNX1VJTlQzMikoTFZDU19TQ1JBVENIQlVGRkVSUypzaXplb2YoTFZNX0lOVDE2KSpwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpOyAgICAgLyogSW5wbGFjZSBwcm9jZXNzaW5nICovCisjZW5kaWYKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemUgICAgICAgICA9IFNjcmF0Y2hTaXplOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uVHlwZSAgICAgICAgID0gTFZDU19TQ1JBVENIOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CkBAIC0xOTAsNiArMTk2LDcgQEAKICAgICBwTFZDU19Wb2xDb3JyZWN0VGFibGUgICAgICAgICAgICA9IChMVkNTX1ZvbENvcnJlY3RfdCopJkxWQ1NfVm9sQ29ycmVjdFRhYmxlWzBdOwogICAgIHBJbnN0YW5jZS0+Vm9sQ29ycmVjdCAgICAgICAgICAgID0gcExWQ1NfVm9sQ29ycmVjdFRhYmxlWzBdOwogICAgIHBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4gICAgICAgID0gMDsKKwogICAgIC8qIFRoZXNlIGN1cnJlbnQgYW5kIHRhcmdldCB2YWx1ZXMgYXJlIGludGlhbGl6ZWQgYWdhaW4gaW4gTFZDU19Db250cm9sLmMgKi8KICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sMCwwKTsKICAgICAvKiBUaGVzZSBjdXJyZW50IGFuZCB0YXJnZXQgdmFsdWVzIGFyZSBpbnRpYWxpemVkIGFnYWluIGluIExWQ1NfQ29udHJvbC5jICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1ByaXZhdGUuaAppbmRleCBmM2FkYjhkLi5hOTdlNGYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcml2YXRlLmgKQEAgLTk1LDEwICs5NSwxNyBAQAogLyogVm9sdW1lIGNvcnJlY3Rpb24gc3RydWN0dXJlICovCiB0eXBlZGVmIHN0cnVjdAogeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZNX0ZMT0FUICAgQ29tcEZ1bGw7ICAgICAgICAgICAgICAgICAgICAgICAvKiBQb3N0IENTIGNvbXByZXNzaW9uIDEwMCUgZWZmZWN0ICovCisgICAgTFZNX0ZMT0FUICAgQ29tcE1pbjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb3N0IENTIGNvbXByZXNzaW9uIDAlIGVmZmVjdCAqLworICAgIExWTV9GTE9BVCAgIEdhaW5GdWxsOyAgICAgICAgICAgICAgICAgICAgICAgLyogQ1MgZ2FpbiBjb3JyZWN0IDEwMCUgZWZmZWN0ICovCisgICAgTFZNX0ZMT0FUICAgR2Fpbk1pbjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBDUyBnYWluIGNvcnJlY3QgMCUgZWZmZWN0ICovCisjZWxzZQogICAgIExWTV9JTlQxNiAgIENvbXBGdWxsOyAgICAgICAgICAgICAgICAgICAgICAgLyogUG9zdCBDUyBjb21wcmVzc2lvbiAxMDAlIGVmZmVjdCAqLwogICAgIExWTV9JTlQxNiAgIENvbXBNaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9zdCBDUyBjb21wcmVzc2lvbiAwJSBlZmZlY3QgKi8KICAgICBMVk1fSU5UMTYgICBHYWluRnVsbDsgICAgICAgICAgICAgICAgICAgICAgIC8qIENTIGdhaW4gY29ycmVjdCAxMDAlIGVmZmVjdCAqLwogICAgIExWTV9JTlQxNiAgIEdhaW5NaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogQ1MgZ2FpbiBjb3JyZWN0IDAlIGVmZmVjdCAqLworI2VuZGlmCiB9IExWQ1NfVm9sQ29ycmVjdF90OwogCiAvKiBJbnN0YW5jZSBzdHJ1Y3R1cmUgKi8KQEAgLTExMiw4ICsxMTksMTMgQEAKICAgICAvKiBQcml2YXRlIHBhcmFtZXRlcnMgKi8KICAgICBMVkNTX091dHB1dERldmljZV9lbiAgICBPdXRwdXREZXZpY2U7ICAgICAgIC8qIFNlbGVjdGVkIG91dHB1dCBkZXZpY2UgdHlwZSAqLwogICAgIExWQ1NfVm9sQ29ycmVjdF90ICAgICAgIFZvbENvcnJlY3Q7ICAgICAgICAgLyogVm9sdW1lIGNvcnJlY3Rpb24gc2V0dGluZ3MgKi8KKyNpZm5kZWYgQlVJTERfRkxPQVQKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBUcmFuc2l0aW9uR2FpbjsgICAgIC8qIFRyYW5zaXRpb24gZ2FpbiAqLwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIENvbXByZXNzR2FpbjsgICAgICAgLyogTGFzdCB1c2VkIGNvbXByZXNzb3IgZ2FpbiovCisjZWxzZQorICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIFRyYW5zaXRpb25HYWluOyAgICAgLyogVHJhbnNpdGlvbiBnYWluICovCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgQ29tcHJlc3NHYWluOyAgICAgICAvKiBMYXN0IHVzZWQgY29tcHJlc3NvciBnYWluKi8KKyNlbmRpZgogCiAgICAgLyogU3ViLWJsb2NrIGNvbmZpZ3VyYXRpb25zICovCiAgICAgTFZDU19TdGVyZW9FbmhhbmNlcl90ICAgU3RlcmVvRW5oYW5jZXI7ICAgICAvKiBTdGVyZW8gZW5oYW5jZXIgY29uZmlndXJhdGlvbiAqLwpAQCAtMTM0LDI0ICsxNDYsMzUgQEAKIC8qIENvZWZmaWNpZW50IFN0cnVjdHVyZSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIEVxdWFsaXNlckJpcXVhZEluc3RhbmNlOworICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIFJldmVyYkJpcXVhZEluc3RhbmNlOworICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIFNFQmlxdWFkSW5zdGFuY2VNaWQ7CisgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgU0VCaXF1YWRJbnN0YW5jZVNpZGU7CisjZWxzZQogICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgIEVxdWFsaXNlckJpcXVhZEluc3RhbmNlOwogICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgIFJldmVyYkJpcXVhZEluc3RhbmNlOwogICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgIFNFQmlxdWFkSW5zdGFuY2VNaWQ7CiAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgU0VCaXF1YWRJbnN0YW5jZVNpZGU7Ci0KKyNlbmRpZgogfSBMVkNTX0NvZWZmaWNpZW50X3Q7CiAKIC8qIERhdGEgU3RydWN0dXJlICovCiB0eXBlZGVmIHN0cnVjdAogeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgRXF1YWxpc2VyQmlxdWFkVGFwczsKKyAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCBSZXZlcmJCaXF1YWRUYXBzOworICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190IFNFQmlxdWFkVGFwc01pZDsKKyAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCBTRUJpcXVhZFRhcHNTaWRlOworI2Vsc2UKICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCBFcXVhbGlzZXJCaXF1YWRUYXBzOwogICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190IFJldmVyYkJpcXVhZFRhcHM7CiAgICAgQmlxdWFkXzFJX09yZGVyMV9UYXBzX3QgU0VCaXF1YWRUYXBzTWlkOwogICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190IFNFQmlxdWFkVGFwc1NpZGU7Ci0KKyNlbmRpZgogfSBMVkNTX0RhdGFfdDsKIAotCiB2b2lkIExWQ1NfVGltZXJDYWxsQmFjayAoICAgdm9pZCogaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBDYWxsQmFja1BhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgQ2FsbGJhY2tQYXJhbSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuYwppbmRleCA1ZDk5NDYxLi4zOTU2ZDRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcm9jZXNzLmMKQEAgLTY2LDcgKzY2LDc3IEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUHJvY2Vzc19DUyhMVkNTX0hhbmRsZV90ICAgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpCit7CisgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqcElucHV0OworICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBTY3JhdGNoOworICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuIGVycjsKIAorICAgIHBTY3JhdGNoICA9IChMVk1fRkxPQVQgKikgXAorICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzczsKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlIHByb2Nlc3NpbmcgaXMgaW5wbGFjZQorICAgICAqLworICAgIGlmIChwSW5EYXRhID09IHBPdXREYXRhKQorICAgIHsKKyAgICAgICAgLyogUHJvY2Vzc2luZyBpbnBsYWNlICovCisgICAgICAgIHBJbnB1dCA9IHBTY3JhdGNoICsgKDIgKiBOdW1TYW1wbGVzKTsKKyAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwSW5wdXQsICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogUHJvY2Vzc2luZyBvdXRwbGFjZSAqLworICAgICAgICBwSW5wdXQgPSBwSW5EYXRhOworICAgIH0KKworICAgIC8qCisgICAgICogQ2FsbCB0aGUgc3RlcmVvIGVuaGFuY2VyCisgICAgICovCisgICAgZXJyID0gTFZDU19TdGVyZW9FbmhhbmNlcihoSW5zdGFuY2UsICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCisKKyAgICAvKgorICAgICAqIENhbGwgdGhlIHJldmVyYiBnZW5lcmF0b3IKKyAgICAgKi8KKyAgICBlcnIgPSBMVkNTX1JldmVyYkdlbmVyYXRvcihoSW5zdGFuY2UsICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KKyAgICAKKyAgICAvKgorICAgICAqIENhbGwgdGhlIGVxdWFsaXNlcgorICAgICAqLworICAgIGVyciA9IExWQ1NfRXF1YWxpc2VyKGhJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KKworICAgIC8qCisgICAgICogQ2FsbCB0aGUgYnlwYXNzIG1peGVyCisgICAgICovCisgICAgZXJyID0gTFZDU19CeXBhc3NNaXhlcihoSW5zdGFuY2UsICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBwcm9jZXNzZWQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgcElucHV0LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0ICh1bnByb2Nlc3NlZCkgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAqLworCisgICAgaWYoZXJyICE9IExWQ1NfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisjZWxzZQogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Qcm9jZXNzX0NTKExWQ1NfSGFuZGxlX3QgICAgICAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAqcE91dERhdGEsCkBAIC0xMzMsNyArMjAzLDcgQEAKIAogICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE2MCw3ICsyMzAsMTcwIEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUHJvY2VzcyhMVkNTX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgTnVtU2FtcGxlcykKK3sKIAorICAgIExWQ1NfSW5zdGFuY2VfdCAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19SZXR1cm5TdGF0dXNfZW4gZXJyOworCisgICAgLyoKKyAgICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgbm90IHRvbyBsYXJnZQorICAgICAqLworICAgIGlmIChOdW1TYW1wbGVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWQ1NfVE9PTUFOWVNBTVBMRVMpOworICAgIH0KKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlIGFsZ29yaXRobSBpcyBlbmFibGVkCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgIT0gTFZDU19PRkYpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBDYWxsIENTIHByb2Nlc3MgZnVuY3Rpb24KKyAgICAgICAgICovCisgICAgICAgICAgICBlcnIgPSBMVkNTX1Byb2Nlc3NfQ1MoaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAvKgorICAgICAgICAgKiBDb21wcmVzcyB0byByZWR1Y2UgZXhwYW5zaW9uIGVmZmVjdCBvZiBDb25jZXJ0IFNvdW5kIGFuZCBjb3JyZWN0IHZvbHVtZQorICAgICAgICAgKiBkaWZmZXJlbmNlcyBmb3IgZGlmZmVyZW5jZSBzZXR0aW5ncy4gTm90IGFwcGxpZWQgaW4gdGVzdCBtb2RlcworICAgICAgICAgKi8KKyAgICAgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWQ1NfT04pJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5Db21wcmVzc29yTW9kZSA9PSBMVk1fTU9ERV9PTikpCisgICAgICAgIHsKKyAgICAgICAgICAgIExWTV9GTE9BVCBHYWluID0gcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkNvbXBNaW47CisgICAgICAgICAgICBMVk1fRkxPQVQgQ3VycmVudDE7CisKKyAgICAgICAgICAgIEN1cnJlbnQxID0gTFZDX01peGVyX0dldEN1cnJlbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdKTsKKyAgICAgICAgICAgIEdhaW4gPSAoTFZNX0ZMT0FUKSggIHBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wTWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoKChMVk1fRkxPQVQpcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkNvbXBNaW4gICogKEN1cnJlbnQxKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKChMVk1fRkxPQVQpcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkNvbXBGdWxsICogKEN1cnJlbnQxKSkpKTsKKworICAgICAgICAgICAgaWYoTnVtU2FtcGxlcyA8IExWQ1NfQ09NUEdBSU5GUkFNRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOb25MaW5Db21wX0Zsb2F0KEdhaW4sICAgICAgICAgICAgICAgICAgICAvKiBDb21wcmVzc29yIGdhaW4gc2V0dGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpKDIgKiBOdW1TYW1wbGVzKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICBHYWluU3RlcDsKKyAgICAgICAgICAgICAgICBMVk1fRkxPQVQgIEZpbmFsR2FpbjsKKyAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIFNhbXBsZVRvUHJvY2VzcyA9IE51bVNhbXBsZXM7CisgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqcE91dFB0cjsKKworICAgICAgICAgICAgICAgIC8qIExhcmdlIGNoYW5nZXMgaW4gR2FpbiBjYW4gY2F1c2UgY2xpY2tzIGluIG91dHB1dAorICAgICAgICAgICAgICAgICAgIFNwbGl0IGRhdGEgaW50byBzbWFsbCBibG9ja3MgYW5kIHVzZSBpbnRlcnBvbGF0ZWQgZ2FpbiB2YWx1ZXMgKi8KKworICAgICAgICAgICAgICAgIEdhaW5TdGVwID0gKExWTV9GTE9BVCkoKChHYWluLXBJbnN0YW5jZS0+Q29tcHJlc3NHYWluKSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQ09NUEdBSU5GUkFNRSkgLyBOdW1TYW1wbGVzKTsKKworICAgICAgICAgICAgICAgIGlmKChHYWluU3RlcCA9PSAwKSAmJiAocEluc3RhbmNlLT5Db21wcmVzc0dhaW4gPCBHYWluKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdhaW5TdGVwID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoKEdhaW5TdGVwID09IDApICYmIChwSW5zdGFuY2UtPkNvbXByZXNzR2FpbiA+IEdhaW4pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHYWluU3RlcCA9IC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgRmluYWxHYWluID0gR2FpbjsKKyAgICAgICAgICAgICAgICBHYWluID0gcEluc3RhbmNlLT5Db21wcmVzc0dhaW47CisgICAgICAgICAgICAgICAgcE91dFB0ciA9IHBPdXREYXRhOworCisgICAgICAgICAgICAgICAgd2hpbGUoU2FtcGxlVG9Qcm9jZXNzID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdhaW4gPSAoTFZNX0ZMT0FUKShHYWluICsgR2FpblN0ZXApOworICAgICAgICAgICAgICAgICAgICBpZigoR2FpblN0ZXAgPiAwKSAmJiAoRmluYWxHYWluIDw9IEdhaW4pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHYWluID0gRmluYWxHYWluOworICAgICAgICAgICAgICAgICAgICAgICAgR2FpblN0ZXAgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYoKEdhaW5TdGVwIDwgMCkgJiYgKEZpbmFsR2FpbiA+IEdhaW4pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHYWluID0gRmluYWxHYWluOworICAgICAgICAgICAgICAgICAgICAgICAgR2FpblN0ZXAgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYoU2FtcGxlVG9Qcm9jZXNzID4gTFZDU19DT01QR0FJTkZSQU1FKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBOb25MaW5Db21wX0Zsb2F0KEdhaW4sICAgICAgICAgICAgICAgICAgICAvKiBDb21wcmVzc29yIGdhaW4gc2V0dGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKSgyICogTFZDU19DT01QR0FJTkZSQU1FKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwT3V0UHRyICs9ICgyICogTFZDU19DT01QR0FJTkZSQU1FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZVRvUHJvY2VzcyA9IChMVk1fSU5UMTYpKFNhbXBsZVRvUHJvY2VzcyAtIExWQ1NfQ09NUEdBSU5GUkFNRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBOb25MaW5Db21wX0Zsb2F0KEdhaW4sICAgICAgICAgICAgICAgICAgICAvKiBDb21wcmVzc29yIGdhaW4gc2V0dGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKSgyICogU2FtcGxlVG9Qcm9jZXNzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVUb1Byb2Nlc3MgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFN0b3JlIGdhaW4gdmFsdWUqLworICAgICAgICAgICAgcEluc3RhbmNlLT5Db21wcmVzc0dhaW4gPSBHYWluOworICAgICAgICB9CisKKworICAgICAgICBpZihwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uID09IExWTV9UUlVFKXsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFJlLWluaXQgYnlwYXNzIG1peCB3aGVuIHRpbWVyIGhhcyBjb21wbGV0ZWQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPmJUaW1lckRvbmUgPT0gTFZNX1RSVUUpICYmCisgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ID09IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVyciA9IExWQ1NfQnlwYXNzTWl4SW5pdChoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPlBhcmFtcyk7CisKKyAgICAgICAgICAgICAgICBpZihlcnIgIT0gTFZDU19TVUNDRVNTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgTFZNX1RpbWVyICggJnBJbnN0YW5jZS0+VGltZXJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChwSW5EYXRhICE9IHBPdXREYXRhKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisgICAgICAgIH0KKyAgICB9CisKKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorI2Vsc2UKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUHJvY2VzcyhMVkNTX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgKnBPdXREYXRhLApAQCAtMzIxLDEzICs1NTQsNCBAQAogCiAgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7CiB9Ci0KLQotCi0KLQotCi0KLQotCi0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5jCmluZGV4IGVlMjU3YjguLjEwODUxMDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmMKQEAgLTU3LDcgKzU3LDk4IEBACiAvKiAgMi4gIFRoZSBudW1lcmF0b3IgY29lZmZpY2llbnRzIG9mIHRoZSBmaWx0ZXIgYXJlIG5lZ2F0ZWQgdG8gY2F1c2UgYW4gaW52ZXJzaW9uLiAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9ySW5pdChMVkNTX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgKnBQYXJhbXMpCit7CiAKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBEZWxheTsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBPZmZzZXQ7CisgICAgTFZDU19JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWQ1NfUmV2ZXJiR2VuZXJhdG9yX3QgICpwQ29uZmlnICAgPSAoTFZDU19SZXZlcmJHZW5lcmF0b3JfdCAqKSZwSW5zdGFuY2UtPlJldmVyYmVyYXRpb247CisgICAgTFZDU19EYXRhX3QgICAgICAgICAgICAgKnBEYXRhOworICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgICAgICpwQ29lZmZpY2llbnRzOworICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICBDb2VmZnM7CisgICAgY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAgKnBSZXZlcmJDb2VmVGFibGU7CisKKworICAgIHBEYXRhID0gKExWQ1NfRGF0YV90ICopIFwKKyAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzczsKKworICAgIHBDb2VmZmljaWVudHMgPSAoTFZDU19Db2VmZmljaWVudF90ICopIFwKKyAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKworICAgIC8qCisgICAgICogSW5pdGlhbGlzZSB0aGUgZGVsYXkgYW5kIGZpbHRlcnMgaWY6CisgICAgICogIC0gdGhlIHNhbXBsZSByYXRlIGhhcyBjaGFuZ2VkCisgICAgICogIC0gdGhlIHNwZWFrZXIgdHlwZSBoYXMgY2hhbmdlZCB0byBvciBmcm9tIHRoZSBtb2JpbGUgc3BlYWtlcgorICAgICAqLworICAgIGlmKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSApICAgICAgLyogU2FtcGxlIHJhdGUgY2hhbmdlIHRlc3QgKi8KKworICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0dXAgdGhlIGRlbGF5CisgICAgICAgICAqLworICAgICAgICBEZWxheSA9IChMVk1fVUlOVDE2KUxWQ1NfU3RlcmVvRGVsYXlDU1soTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlXTsKKworCisgICAgICAgIHBDb25maWctPkRlbGF5U2l6ZSAgICAgID0gKExWTV9JTlQxNikoMiAqIERlbGF5KTsKKyAgICAgICAgcENvbmZpZy0+RGVsYXlPZmZzZXQgICAgPSAwOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopJnBDb25maWctPlN0ZXJlb1NhbXBsZXNbMF0sICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB3b3JkcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHNpemVvZihwQ29uZmlnLT5TdGVyZW9TYW1wbGVzKSAvIHNpemVvZihMVk1fRkxPQVQpKSk7CisgICAgICAgIC8qCisgICAgICAgICAqIFNldHVwIHRoZSBmaWx0ZXJzCisgICAgICAgICAqLworICAgICAgICBPZmZzZXQgPSAoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlOworICAgICAgICBwUmV2ZXJiQ29lZlRhYmxlID0gKEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QqKSZMVkNTX1JldmVyYkNvZWZUYWJsZVswXTsKKworICAgICAgICAvKiBDb252ZXJ0IGluY29taW5nIGNvZWZmaWNpZW50cyB0byB0aGUgcmVxdWlyZWQgZm9ybWF0L29yZGVyaW5nICovCisgICAgICAgIENvZWZmcy5BMCA9IChMVk1fRkxPQVQpcFJldmVyYkNvZWZUYWJsZVtPZmZzZXRdLkEwOworICAgICAgICBDb2VmZnMuQTEgPSAoTFZNX0ZMT0FUKXBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5BMTsKKyAgICAgICAgQ29lZmZzLkEyID0gKExWTV9GTE9BVClwUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uQTI7CisgICAgICAgIENvZWZmcy5CMSA9IChMVk1fRkxPQVQpLXBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5CMTsKKyAgICAgICAgQ29lZmZzLkIyID0gKExWTV9GTE9BVCktcFJldmVyYkNvZWZUYWJsZVtPZmZzZXRdLkIyOworCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZwRGF0YS0+UmV2ZXJiQmlxdWFkVGFwcywgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB3b3JkcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHNpemVvZihwRGF0YS0+UmV2ZXJiQmlxdWFkVGFwcykgLyBzaXplb2YoTFZNX0ZMT0FUKSkpOworCisgICAgICAgIEJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQoJnBDb2VmZmljaWVudHMtPlJldmVyYkJpcXVhZEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+UmV2ZXJiQmlxdWFkVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZzKTsKKworICAgICAgICAvKiBDYWxsYmFja3MgKi8KKyAgICAgICAgc3dpdGNoKHBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5TY2FsZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2sgID0gQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFjayAgPSBCUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0dXAgdGhlIG1peGVyCisgICAgICAgICAqLworICAgICAgICBwQ29uZmlnLT5Qcm9jR2FpbiA9IChMVk1fVUlOVDE2KShIRUFEUEhPTkVHQUlOUFJPQyk7CisgICAgICAgIHBDb25maWctPlVucHJvY0dhaW4gID0gKExWTV9VSU5UMTYpKEhFQURQSE9ORUdBSU5VTlBST0MpOworICAgIH0KKworICAgIGlmKHBJbnN0YW5jZS0+UGFyYW1zLlJldmVyYkxldmVsICE9IHBQYXJhbXMtPlJldmVyYkxldmVsKQorICAgIHsKKyAgICAgICAgTFZNX0lOVDMyICAgUmV2ZXJiUGVyY2VudGFnZSA9IDgzODg2OyAgICAgIC8vIDEgUGVyY2VudCBSZXZlcmIgaS5lIDEvMTAwIGluIFEgMjMgZm9ybWF0CisgICAgICAgIFJldmVyYlBlcmNlbnRhZ2UgKj0gcFBhcmFtcy0+UmV2ZXJiTGV2ZWw7ICAvLyBBY3R1YWwgUmV2ZXJiIExldmVsIGluIFEgMjMgZm9ybWF0CisgICAgICAgIHBDb25maWctPlJldmVyYkxldmVsID0gKChMVk1fRkxPQVQpKFJldmVyYlBlcmNlbnRhZ2U+PjgpKSAvIDMyNzY3LjBmOworICAgIH0KKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKK30KKyNlbHNlCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1JldmVyYkdlbmVyYXRvckluaXQoTFZDU19IYW5kbGVfdCAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICpwUGFyYW1zKQogewpAQCAtMTQwLDcgKzIzMSw3IEBACiAKICAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKIH0KLQorI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX1JldmVyYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xNzksNyArMjcwLDkxIEBACiAvKiAgMi4gIFRoZSBHYWluIGlzIGNvbWJpbmVkIHdpdGggdGhlIExQRiBhbmQgaW5jb3Jwb3JhdGVkIGluIHRvIHRoZSBjb2VmZmljaWVudHMgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9yKExWQ1NfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpCit7CiAKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19SZXZlcmJHZW5lcmF0b3JfdCAgKnBDb25maWcgICA9IChMVkNTX1JldmVyYkdlbmVyYXRvcl90ICopJnBJbnN0YW5jZS0+UmV2ZXJiZXJhdGlvbjsKKyAgICBMVkNTX0NvZWZmaWNpZW50X3QgICAgICAqcENvZWZmaWNpZW50czsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2g7CisKKyAgICBwQ29lZmZpY2llbnRzID0gKExWQ1NfQ29lZmZpY2llbnRfdCAqKVwKKyAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOworCisgICAgcFNjcmF0Y2ggID0gKExWTV9GTE9BVCAqKVwKKyAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzczsKKworICAgIC8qCisgICAgICogQ29weSB0aGUgZGF0YSB0byB0aGUgb3V0cHV0IGluIG91dHBsYWNlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBpZiAocEluRGF0YSAhPSBwT3V0RGF0YSkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFJldmVyYiBub3QgcmVxdWlyZWQgc28ganVzdCBjb3B5IHRoZSBkYXRhCisgICAgICAgICAqLworICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQgKilwSW5EYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGUgcmV2ZXJiIGlzIHJlcXVpcmVkCisgICAgICovCisgICAgLyogRGlzYWJsZSB3aGVuIENTNE1TIGluIHN0ZXJlbyBtb2RlICovCisgICAgaWYgKCgocEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgPT0gTFZDU19IRUFEUEhPTkUpIHx8IFwKKyAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSA9PSBMVkNTX0VYX0hFQURQSE9ORVMpIHx8CisgICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ICE9IExWQ1NfU1RFUkVPKSkgICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3IgdmFsaWRhdGlvbiB0ZXN0aW5nICovCisgICAgICAgICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAmIExWQ1NfUkVWRVJCU1dJVENIKSAhPTApKQorICAgIHsKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qIENvcHkgdGhlIGlucHV0IGRhdGEgdG8gc2NyYXRjaCBtZW1vcnkgYW5kIGZpbHRlciBpdCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29weSB0aGUgaW5wdXQgZGF0YSB0byB0aGUgc2NyYXRjaCBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisKKyAgICAgICAgLyoKKyAgICAgICAgICogRmlsdGVyIHRoZSBkYXRhCisgICAgICAgICAqLworICAgICAgICAocENvbmZpZy0+cEJpcXVhZENhbGxCYWNrKSgoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqKSZwQ29lZmZpY2llbnRzLT5SZXZlcmJCaXF1YWRJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgTXVsdDNzX0Zsb2F0KCAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgcENvbmZpZy0+UmV2ZXJiTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgZGVsYXkgbWl4CisgICAgICAgICAqLworICAgICAgICBEZWxheU1peF9GbG9hdCgoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICZwQ29uZmlnLT5TdGVyZW9TYW1wbGVzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5EZWxheVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAmcENvbmZpZy0+RGVsYXlPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKworICAgIH0KKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorI2Vsc2UKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9yKExWQ1NfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKnBPdXREYXRhLApAQCAtMjU3LDggKzQzMiw0IEBACiAKICAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKIH0KLQotCi0KLQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuaAppbmRleCA2ZTAyNmZmLi42OTg5MmI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5oCkBAIC01OCwxNCArNTgsMjAgQEAKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgRGVsYXlPZmZzZXQ7CiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIFByb2NHYWluOwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBVbnByb2NHYWluOworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgU3RlcmVvU2FtcGxlc1syKkxWQ1NfU1RFUkVPREVMQVlfQ1NfNDhLSFpdOwotCiAgICAgLyogUmV2ZXJiIExldmVsICovCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIFJldmVyYkxldmVsOwotCiAgICAgLyogRmlsdGVyICovCiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICgqcEJpcXVhZENhbGxCYWNrKSAoQmlxdWFkX0luc3RhbmNlX3QqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYpOwotCisjZWxzZQorICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICBTdGVyZW9TYW1wbGVzWzIgKiBMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0haXTsKKyAgICAvKiBSZXZlcmIgTGV2ZWwgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgUmV2ZXJiTGV2ZWw7CisgICAgLyogRmlsdGVyICovCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICgqcEJpcXVhZENhbGxCYWNrKSAoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCosIExWTV9GTE9BVCosIExWTV9JTlQxNik7CisjZW5kaWYKIH0gTFZDU19SZXZlcmJHZW5lcmF0b3JfdDsKIAogCkBAIC03NywxMiArODMsMTcgQEAKIAogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19SZXZlcmJHZW5lcmF0b3JJbml0KExWQ1NfSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAqcFBhcmFtcyk7Ci0KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19SZXZlcmJHZW5lcmF0b3IoTFZDU19IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqcElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpOworI2Vsc2UKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9yKExWQ1NfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgKnBJbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqcE91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICBOdW1TYW1wbGVzKTsKLQorI2VuZGlmCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuYwppbmRleCBiOWI4YjA1Li4yOTkyYzM1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuYwpAQCAtNDksNyArNDksMTAzIEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQlVJTERfRkxPQVQKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfU0VuaGFuY2VySW5pdChMVkNTX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQorewogCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgT2Zmc2V0OworICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVkNTX1N0ZXJlb0VuaGFuY2VyX3QgICAqcENvbmZpZyAgID0gKExWQ1NfU3RlcmVvRW5oYW5jZXJfdCAqKSZwSW5zdGFuY2UtPlN0ZXJlb0VuaGFuY2VyOworICAgIExWQ1NfRGF0YV90ICAgICAgICAgICAgICpwRGF0YTsKKyAgICBMVkNTX0NvZWZmaWNpZW50X3QgICAgICAqcENvZWZmaWNpZW50OworICAgIEZPX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgQ29lZmZzTWlkOworICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgQ29lZmZzU2lkZTsKKyAgICBjb25zdCBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICpwU0VTaWRlQ29lZnM7CisKKworICAgIHBEYXRhICAgICA9IChMVkNTX0RhdGFfdCAqKSBcCisgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzOworCisgICAgcENvZWZmaWNpZW50ID0gKExWQ1NfQ29lZmZpY2llbnRfdCAqKSBcCisgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgc2FtcGxlIHJhdGUgb3Igc3BlYWtlciB0eXBlIGhhcyBjaGFuZ2VkIHVwZGF0ZSB0aGUgZmlsdGVycworICAgICAqLworICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUGFyYW1zLT5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgIT0gcFBhcmFtcy0+U3BlYWtlclR5cGUpKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0IHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGJhc2VkIG9uIHRoZSBzYW1wbGUgcmF0ZQorICAgICAgICAgKi8KKyAgICAgICAgLyogTWlkIGZpbHRlciAqLworICAgICAgICBPZmZzZXQgPSAoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlOworCisgICAgICAgIC8qIENvbnZlcnQgaW5jb21pbmcgY29lZmZpY2llbnRzIHRvIHRoZSByZXF1aXJlZCBmb3JtYXQvb3JkZXJpbmcgKi8KKyAgICAgICAgQ29lZmZzTWlkLkEwID0gKExWTV9GTE9BVCkgTFZDU19TRU1pZENvZWZUYWJsZVtPZmZzZXRdLkEwOworICAgICAgICBDb2VmZnNNaWQuQTEgPSAoTFZNX0ZMT0FUKSBMVkNTX1NFTWlkQ29lZlRhYmxlW09mZnNldF0uQTE7CisgICAgICAgIENvZWZmc01pZC5CMSA9IChMVk1fRkxPQVQpLUxWQ1NfU0VNaWRDb2VmVGFibGVbT2Zmc2V0XS5CMTsKKworICAgICAgICAvKiBDbGVhciB0aGUgdGFwcyAqLworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBEYXRhLT5TRUJpcXVhZFRhcHNNaWQsICAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDpcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHdvcmRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBEYXRhLT5TRUJpcXVhZFRhcHNNaWQpIC8gc2l6ZW9mKExWTV9GTE9BVCkpKTsKKworICAgICAgICBGT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCZwQ29lZmZpY2llbnQtPlNFQmlxdWFkSW5zdGFuY2VNaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5TRUJpcXVhZFRhcHNNaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmc01pZCk7CisKKyAgICAgICAgLyogQ2FsbGJhY2tzICovCisgICAgICAgIGlmKExWQ1NfU0VNaWRDb2VmVGFibGVbT2Zmc2V0XS5TY2FsZSA9PSAxNSkKKyAgICAgICAgeworICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrX01pZCAgPSBGT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMTsKKyAgICAgICAgfQorCisgICAgICAgIE9mZnNldCA9IChMVk1fVUlOVDE2KShwUGFyYW1zLT5TYW1wbGVSYXRlKTsKKyAgICAgICAgcFNFU2lkZUNvZWZzID0gKEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QqKSZMVkNTX1NFU2lkZUNvZWZUYWJsZVswXTsKKworICAgICAgICAvKiBTaWRlIGZpbHRlciAqLworICAgICAgICAvKiBDb252ZXJ0IGluY29taW5nIGNvZWZmaWNpZW50cyB0byB0aGUgcmVxdWlyZWQgZm9ybWF0L29yZGVyaW5nICovCisgICAgICAgIENvZWZmc1NpZGUuQTAgPSAoTFZNX0ZMT0FUKSBwU0VTaWRlQ29lZnNbT2Zmc2V0XS5BMDsKKyAgICAgICAgQ29lZmZzU2lkZS5BMSA9IChMVk1fRkxPQVQpIHBTRVNpZGVDb2Vmc1tPZmZzZXRdLkExOworICAgICAgICBDb2VmZnNTaWRlLkEyID0gKExWTV9GTE9BVCkgcFNFU2lkZUNvZWZzW09mZnNldF0uQTI7CisgICAgICAgIENvZWZmc1NpZGUuQjEgPSAoTFZNX0ZMT0FUKS1wU0VTaWRlQ29lZnNbT2Zmc2V0XS5CMTsKKyAgICAgICAgQ29lZmZzU2lkZS5CMiA9IChMVk1fRkxPQVQpLXBTRVNpZGVDb2Vmc1tPZmZzZXRdLkIyOworCisgICAgICAgIC8qIENsZWFyIHRoZSB0YXBzICovCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBEYXRhLT5TRUJpcXVhZFRhcHNTaWRlLCAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHdvcmRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBEYXRhLT5TRUJpcXVhZFRhcHNTaWRlKSAvIHNpemVvZihMVk1fRkxPQVQpKSk7CisgICAgICAgIC8qIENhbGxiYWNrcyAqLworICAgICAgICBzd2l0Y2gocFNFU2lkZUNvZWZzW09mZnNldF0uU2NhbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCgmcENvZWZmaWNpZW50LT5TRUJpcXVhZEluc3RhbmNlU2lkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+U0VCaXF1YWRUYXBzU2lkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZnNTaWRlKTsKKworICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFja19TaWRlICA9IEJRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICBCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCZwQ29lZmZpY2llbnQtPlNFQmlxdWFkSW5zdGFuY2VTaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5TRUJpcXVhZFRhcHNTaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmc1NpZGUpOworCisgICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrX1NpZGUgID0gQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisjZWxzZQogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TRW5oYW5jZXJJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpCiB7CkBAIC0xMzgsNyArMjM0LDcgQEAKIAogICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwogfQotCisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfU3RlcmVvRW5oYW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE3Nyw3ICsyNzMsOTAgQEAKIC8qICAxLiAgVGhlIHNpZGUgZmlsdGVyIGlzIG5vdCB1c2VkIGluIE1vYmlsZSBTcGVha2VyIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TdGVyZW9FbmhhbmNlcihMVkNTX0hhbmRsZV90ICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgTnVtU2FtcGxlcykKK3sKIAorICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVkNTX1N0ZXJlb0VuaGFuY2VyX3QgICAqcENvbmZpZyAgID0gKExWQ1NfU3RlcmVvRW5oYW5jZXJfdCAqKSZwSW5zdGFuY2UtPlN0ZXJlb0VuaGFuY2VyOworICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgICAgICpwQ29lZmZpY2llbnQ7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBTY3JhdGNoOworCisgICAgcENvZWZmaWNpZW50ID0gKExWQ1NfQ29lZmZpY2llbnRfdCAqKSBcCisgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKworICAgIHBTY3JhdGNoICA9IChMVk1fRkxPQVQgKikgXAorICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzOworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlIFN0ZXJlbyBFbmhhbmNlciBpcyBlbmFibGVkCisgICAgICovCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19TVEVSRU9FTkhBTkNFU1dJVENIKSAhPSAwKQorICAgICAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIENvbnZlcnQgZnJvbSBzdGVyZW8gdG8gbWlkZGxlIGFuZCBzaWRlCisgICAgICAgICAqLworICAgICAgICBGcm9tMmlUb01TX0Zsb2F0KHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2ggKyBOdW1TYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwbHkgZmlsdGVyIHRvIHRoZSBtaWRkbGUgc2lnbmFsCisgICAgICAgICAqLworICAgICAgICBpZiAocEluc3RhbmNlLT5PdXRwdXREZXZpY2UgPT0gTFZDU19IRUFEUEhPTkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIChwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2tfTWlkKSgoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqKVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDb2VmZmljaWVudC0+U0VCaXF1YWRJbnN0YW5jZU1pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBNdWx0M3NfRmxvYXQocFNjcmF0Y2gsICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKXBDb25maWctPk1pZEdhaW4sICAgICAgLyogR2FpbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLCAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IHRoZSBmaWx0ZXIgdGhlIHNpZGUgc2lnbmFsIG9ubHkgaW4gc3RlcmVvIG1vZGUgZm9yIGhlYWRwaG9uZXMKKyAgICAgICAgICogYW5kIGluIGFsbCBtb2RlcyBmb3IgbW9iaWxlIHNwZWFrZXJzCisgICAgICAgICAqLworICAgICAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ID09IExWQ1NfU1RFUkVPKQorICAgICAgICB7CisgICAgICAgICAgICAocENvbmZpZy0+cEJpcXVhZENhbGxCYWNrX1NpZGUpKChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCopIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDb2VmZmljaWVudC0+U0VCaXF1YWRJbnN0YW5jZVNpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikocFNjcmF0Y2ggKyBOdW1TYW1wbGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKShwU2NyYXRjaCArIE51bVNhbXBsZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29udmVydCBmcm9tIG1pZGRsZSBhbmQgc2lkZSB0byBzdGVyZW8KKyAgICAgICAgICovCisgICAgICAgIE1TVG8yaV9TYXRfRmxvYXQocFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2ggKyBOdW1TYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIHN0ZXJlbyBlbmhhbmNlciBpcyBkaXNhYmxlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKKyAgICAgICAgICovCisgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbkRhdGEsICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcE91dERhdGEsICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisgICAgfQorCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisjZWxzZQogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TdGVyZW9FbmhhbmNlcihMVkNTX0hhbmRsZV90ICAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAqcE91dERhdGEsCkBAIC0yNTQsNyArNDMzLDQgQEAKIAogICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwogfQotCi0KLQotCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19TdGVyZW9FbmhhbmNlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmgKaW5kZXggMTViYzQwNy4uNDEyNWYyNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmgKQEAgLTQzLDE4ICs0MywzMSBAQAogLyogU3RlcmVvIGVuaGFuY2VyIHN0cnVjdHVyZSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKKworI2lmbmRlZiBCVUlMRF9GTE9BVAogICAgIC8qCiAgICAgICogTWlkZGxlIGZpbHRlcgogICAgICAqLwogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICgqcEJpcXVhZENhbGxCYWNrX01pZCkoQmlxdWFkX0luc3RhbmNlX3QqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYpOwotCiAgICAgLyoKICAgICAgKiBTaWRlIGZpbHRlcgogICAgICAqLwogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICgqcEJpcXVhZENhbGxCYWNrX1NpZGUpKEJpcXVhZF9JbnN0YW5jZV90KiwgTFZNX0lOVDE2KiwgTFZNX0lOVDE2KiwgTFZNX0lOVDE2KTsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBNaWRHYWluOyAgICAgICAgICAgIC8qIE1pZGRsZSBnYWluIGluIG1vYmlsZSBzcGVha2VyIG1vZGUgKi8KKyNlbHNlCisgICAgLyoKKyAgICAgKiBNaWRkbGUgZmlsdGVyCisgICAgICovCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKCpwQmlxdWFkQ2FsbEJhY2tfTWlkKShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqLCBMVk1fRkxPQVQqLCBMVk1fSU5UMTYpOwogCi0gICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBNaWRHYWluOyAgICAgICAgICAgIC8qIE1pZGRsZSBnYWluIGluIG1vYmlsZSBzcGVha2VyIG1vZGUgKi8KLQorICAgIC8qCisgICAgICogU2lkZSBmaWx0ZXIKKyAgICAgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAoKnBCaXF1YWRDYWxsQmFja19TaWRlKShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqLCBMVk1fRkxPQVQqLCBMVk1fSU5UMTYpOworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgTWlkR2FpbjsgICAgICAgICAgICAvKiBNaWRkbGUgZ2FpbiBpbiBtb2JpbGUgc3BlYWtlciBtb2RlICovCisjZW5kaWYKIH0gTFZDU19TdGVyZW9FbmhhbmNlcl90OwogCiAKQEAgLTY3LDEyICs4MCwxNyBAQAogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TRW5oYW5jZXJJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAgICAqcFBhcmFtcyk7CiAKKyNpZm5kZWYgQlVJTERfRkxPQVQKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfU3RlcmVvRW5oYW5jZXIoTFZDU19IYW5kbGVfdCAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICpwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpOwotCi0KKyNlbHNlCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1N0ZXJlb0VuaGFuY2VyKExWQ1NfSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICBOdW1TYW1wbGVzKTsKKyNlbmRpZgogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuYwppbmRleCA5NzRkZTIxLi5lMTU0ZTI5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5jCkBAIC03MSw3ICs3MSwxOSBAQAogICAgIHtDU19NSURETEVfNDgwMDBfQTAsICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIENTX01JRERMRV80ODAwMF9BMSwKICAgICAgQ1NfTUlERExFXzQ4MDAwX0IxLAotICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzQ4MDAwX1NDQUxFfX07CisgICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfNDgwMDBfU0NBTEV9CisjaWZkZWYgSElHSEVSX0ZTCisgICAgLAorICAgIHtDU19NSURETEVfOTYwMDBfQTAsICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX01JRERMRV85NjAwMF9BMSwKKyAgICAgQ1NfTUlERExFXzk2MDAwX0IxLAorICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzk2MDAwX1NDQUxFfSwKKyAgICB7Q1NfTUlERExFXzE5MjAwMF9BMCwgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX01JRERMRV8xOTIwMDBfQTEsCisgICAgIENTX01JRERMRV8xOTIwMDBfQjEsCisgICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfMTkyMDAwX1NDQUxFfQorI2VuZGlmCisgICAgfTsKIAogLyogQ29lZmZpY2llbnQgdGFibGUgZm9yIHRoZSBzaWRlIGZpbHRlciAqLwogY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCBMVkNTX1NFU2lkZUNvZWZUYWJsZVtdID0gewpAQCAtMTMwLDYgKzE0MiwyMSBAQAogICAgICBDU19TSURFXzQ4MDAwX0IxLAogICAgICBDU19TSURFXzQ4MDAwX0IyLAogICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV80ODAwMF9TQ0FMRX0KKyNpZmRlZiBISUdIRVJfRlMKKyAgICAgLAorICAgICB7Q1NfU0lERV85NjAwMF9BMCwgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19TSURFXzk2MDAwX0ExLAorICAgICBDU19TSURFXzk2MDAwX0EyLAorICAgICBDU19TSURFXzk2MDAwX0IxLAorICAgICBDU19TSURFXzk2MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV85NjAwMF9TQ0FMRX0sCisgICAgIHtDU19TSURFXzE5MjAwMF9BMCwgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfU0lERV8xOTIwMDBfQTEsCisgICAgIENTX1NJREVfMTkyMDAwX0EyLAorICAgICBDU19TSURFXzE5MjAwMF9CMSwKKyAgICAgQ1NfU0lERV8xOTIwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19TSURFXzE5MjAwMF9TQ0FMRX0KKyNlbmRpZgogfTsKIAogCkBAIC0xOTUsNiArMjIyLDIwIEBACiAgICAgIENTX0VRVUFMSVNFUl80ODAwMF9CMSwKICAgICAgQ1NfRVFVQUxJU0VSXzQ4MDAwX0IyLAogICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFfSwKKyNpZmRlZiBISUdIRVJfRlMKKyAgICB7Q1NfRVFVQUxJU0VSXzk2MDAwX0EwLCAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19FUVVBTElTRVJfOTYwMDBfQTEsCisgICAgIENTX0VRVUFMSVNFUl85NjAwMF9BMiwKKyAgICAgQ1NfRVFVQUxJU0VSXzk2MDAwX0IxLAorICAgICBDU19FUVVBTElTRVJfOTYwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfOTYwMDBfU0NBTEV9LAorICAgIHtDU19FUVVBTElTRVJfMTkyMDAwX0EwLCAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMiwKKyAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9CMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl8xOTIwMDBfU0NBTEV9LAorI2VuZGlmCiAKICAgICAvKiBDb25jZXJ0IFNvdW5kIEVYIEhlYWRwaG9uZSBjb2VmZmljaWVudHMgKi8KICAgICB7Q1NFWF9FUVVBTElTRVJfODAwMF9BMCwgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCkBAIC0yNTEsNiArMjkyLDIxIEBACiAgICAgIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0IxLAogICAgICBDU0VYX0VRVUFMSVNFUl80ODAwMF9CMiwKICAgICAgKExWTV9VSU5UMTYgKUNTRVhfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFfQorI2lmZGVmIEhJR0hFUl9GUworICAgICwKKyAgICB7Q1NFWF9FUVVBTElTRVJfOTYwMDBfQTAsICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTIsCisgICAgIENTRVhfRVFVQUxJU0VSXzk2MDAwX0IxLAorICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTRVhfRVFVQUxJU0VSXzk2MDAwX1NDQUxFfSwKKyAgICAge0NTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMCwgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTEsCisgICAgIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMiwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0IxLAorICAgICBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl8xOTIwMDBfU0NBTEV9CisjZW5kaWYKIH07CiAKIApAQCAtMzM0LDYgKzM5MCwyMSBAQAogICAgICBDU19SRVZFUkJfNDgwMDBfQjEsCiAgICAgIENTX1JFVkVSQl80ODAwMF9CMiwKICAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl80ODAwMF9TQ0FMRX0KKyNpZmRlZiBISUdIRVJfRlMKKyAgICAsCisgICAge0NTX1JFVkVSQl85NjAwMF9BMCwgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl85NjAwMF9BMSwKKyAgICAgQ1NfUkVWRVJCXzk2MDAwX0EyLAorICAgICBDU19SRVZFUkJfOTYwMDBfQjEsCisgICAgIENTX1JFVkVSQl85NjAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl85NjAwMF9TQ0FMRX0sCisgICAgIHtDU19SRVZFUkJfMTkyMDAwX0EwLCAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl8xOTIwMDBfQTEsCisgICAgIENTX1JFVkVSQl8xOTIwMDBfQTIsCisgICAgIENTX1JFVkVSQl8xOTIwMDBfQjEsCisgICAgIENTX1JFVkVSQl8xOTIwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfMTkyMDAwX1NDQUxFfQorI2VuZGlmCiB9OwogCiAKQEAgLTM4NSw2ICs0NTYsMjQgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogY29uc3QgTFZDU19Wb2xDb3JyZWN0X3QgTFZDU19Wb2xDb3JyZWN0VGFibGVbXSA9IHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIHswLjQzMzM2MmYsICAgICAgICAgIC8qIEhlYWRwaG9uZSwgc3RlcmVvIG1vZGUgKi8KKyAgICAgMC4wMDAwMDBmLAorICAgICAxLjAwMDAyNGYsCisgICAgIDEuNDEyNjQwZn0sCisgICAgezAuNDMzMzYyZiwgICAgICAgICAgLyogRVggSGVhZHBob25lLCBzdGVyZW8gbW9kZSAqLworICAgICAwLjAwMDAwMGYsCisgICAgIDEuMDAwMDI0ZiwKKyAgICAgMS40MTI2NDBmfSwKKyAgICB7MS4wMDAwMDBmLCAgICAgICAgIC8qIEhlYWRwaG9uZSwgbW9ubyBtb2RlICovCisgICAgIDAuMDAwMDAwZiwKKyAgICAgMS4wMDAwMjRmLAorICAgICAxLjQxMjY0MGZ9LAorICAgIHsxLjAwMDAwMGYsICAgICAgICAgLyogRVggSGVhZHBob25lLCBtb25vIG1vZGUgKi8KKyAgICAgMC4wMDAwMDBmLAorICAgICAxLjAwMDAyNGYsCisgICAgIDEuNDEyNjQwZn0KKyNlbHNlCiAgICAgezE0MjAwLCAgICAgICAgICAvKiBIZWFkcGhvbmUsIHN0ZXJlbyBtb2RlICovCiAgICAgIDAsCiAgICAgIDQwOTYsCkBAIC00MDEsNiArNDkwLDcgQEAKICAgICAgMCwKICAgICAgNDA5NiwKICAgICAgNTc4Nn0KKyNlbmRpZgogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQxOCw4ICs1MDgsMjUgQEAKICNkZWZpbmUgTFZDU19WT0xfVENfRnMzMjAwMCAgICAgMzI3MjEgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg1NjU2NzQgKi8KICNkZWZpbmUgTFZDU19WT0xfVENfRnM0NDEwMCAgICAgMzI3MzQgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg5NjI0MDIgKi8KICNkZWZpbmUgTFZDU19WT0xfVENfRnM0ODAwMCAgICAgMzI3MzcgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTkwNTM5NTUgKi8KKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyNkZWZpbmUgTFZDU19WT0xfVENfRnM5NjAwMCAgICAgMzI3NTEgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk1MTE3MDMgKi8gICAvKiBUb2RvIEAgbmVlZCB0byByZSBjaGVjayB0aGlzIHZhbHVlKi8KKyNkZWZpbmUgTFZDU19WT0xfVENfRnMxOTIwMDAgICAgMzI3NjMgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk4Nzc5MjUgKi8gIC8qIFRvZG8gQCBuZWVkIHRvIHJlIGNoZWNrIHRoaXMgdmFsdWUqLworI2VuZGlmCiAKLQorI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorY29uc3QgTFZNX0lOVDE2IExWQ1NfVm9sdW1lVENUYWJsZVsxMV0gPSB7TFZDU19WT0xfVENfRnM4MDAwLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxMTAyNSwKKwkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzMTIwMDAsCisJCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczE2MDAwLAorCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnMyMjA1MCwKKwkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzMjQwMDAsCisJCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczMyMDAwLAorCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnM0NDEwMCwKKwkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzNDgwMDAsCisJCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19Gczk2MDAwLAorCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnMxOTIwMDAKK307CisjZWxzZQogY29uc3QgTFZNX0lOVDE2IExWQ1NfVm9sdW1lVENUYWJsZVs5XSA9IHtMVkNTX1ZPTF9UQ19GczgwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxMTAyNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczEyMDAwLApAQCAtNDI4LDE1ICs1MzUsMzAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczI0MDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMzIwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnM0NDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczQ4MDAwfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczQ4MDAwCit9OworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFNhbXBsZSByYXRlIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1jb25zdCBMVk1fSU5UMzIgICBMVkNTX1NhbXBsZVJhdGVUYWJsZVs5XSA9IHs4MDAwLAorI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorY29uc3QgTFZNX0lOVDMyICAgTFZDU19TYW1wbGVSYXRlVGFibGVbMTFdID0gezgwMDAsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsCisJCQkJCQkJCQkJCSAgMTIwMDAsCisJCQkJCQkJCQkJCSAgMTYwMDAsCisJCQkJCQkJCQkJCSAgMjIwNTAsCisJCQkJCQkJCQkJCSAgMjQwMDAsCisJCQkJCQkJCQkJCSAgMzIwMDAsCisJCQkJCQkJCQkJCSAgNDQxMDAsCisJCQkJCQkJCQkJCSAgNDgwMDAsCisJCQkJCQkJCQkJCSAgOTYwMDAsCisJCQkJCQkJCQkJCSAgMTkyMDAwCit9OworI2Vsc2UKK2NvbnN0IExWTV9JTlQxNiAgIExWQ1NfU2FtcGxlUmF0ZVRhYmxlWzldID0gezgwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMDAsCkBAIC00NDQsNSArNTY2LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDB9OwotCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQubWsKaW5kZXggZWZkMzBmYi4uZjEwNmFhZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5tawpAQCAtMTAsNyArMTAsNyBAQAogTE9DQUxfU1JDX0ZJTEVTOj0gXAogCUJ1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCiAKLUxPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCitMT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbiAtREJVSUxEX0ZMT0FUIC1ESElHSEVSX0ZTCiBMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgogCiBMT0NBTF9NT0RVTEU6PSBsaWJidW5kbGV3cmFwcGVyCkBAIC00Myw3ICs0Myw3IEBACiBMT0NBTF9TUkNfRklMRVM6PSBcCiAgICAgUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKIAotTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KK0xPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuIC1EQlVJTERfRkxPQVQgLURISUdIRVJfRlMKIExPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2Vycm9yCiAKIExPQ0FMX01PRFVMRTo9IGxpYnJldmVyYndyYXBwZXIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCmluZGV4IGRmNjUwMWIuLmFhZTgwYjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcApAQCAtMTQsNyArMTQsOSBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLQorI2lmbmRlZiBMVk1fRkxPQVQKK3R5cGVkZWYgZmxvYXQgTFZNX0ZMT0FUOworI2VuZGlmCiAjZGVmaW5lIExPR19UQUcgIkJ1bmRsZSIKICNkZWZpbmUgQVJSQVlfU0laRShhcnJheSkgKHNpemVvZiAoYXJyYXkpIC8gc2l6ZW9mIChhcnJheSlbMF0pCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCkBAIC0zMyw2ICszNSwxNSBAQAogLy8gZWZmZWN0X2hhbmRsZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgYmFzcyBib29zdAogZXh0ZXJuICJDIiBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIGdMdm1FZmZlY3RJbnRlcmZhY2U7CiAKKy8vIFR1cm4gb24gVkVSWV9WRVJZX1ZFUkJPU0VfTE9HR0lORyB0byBsb2cgcGFyYW1ldGVyIGdldCBhbmQgc2V0IGZvciBlZmZlY3RzLgorCisvLyNkZWZpbmUgVkVSWV9WRVJZX1ZFUkJPU0VfTE9HR0lORworI2lmZGVmIFZFUllfVkVSWV9WRVJCT1NFX0xPR0dJTkcKKyNkZWZpbmUgQUxPR1ZWIEFMT0dWCisjZWxzZQorI2RlZmluZSBBTE9HVlYoYS4uLikgZG8geyB9IHdoaWxlIChmYWxzZSkKKyNlbmRpZgorCiAjZGVmaW5lIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKXtcCiAgICAgICAgIGlmICgoTHZtU3RhdHVzKSA9PSBMVk1fTlVMTEFERFJFU1Mpe1wKICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICJcCkBAIC0xMzgsMjYgKzE0OSw0MyBAQAogdm9pZCBMdm1FZmZlY3RfZnJlZSAgICAgICAgICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCk7CiBpbnQgIEVmZmVjdF9zZXRDb25maWcgICAgICAgICAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBlZmZlY3RfY29uZmlnX3QgKnBDb25maWcpOwogdm9pZCBFZmZlY3RfZ2V0Q29uZmlnICAgICAgICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190ICpwQ29uZmlnKTsKLWludCAgQmFzc0Jvb3N0X3NldFBhcmFtZXRlciAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKTsKK2ludCAgQmFzc0Jvb3N0X3NldFBhcmFtZXRlciAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHBhcmFtU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICB2YWx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBWYWx1ZSk7CiBpbnQgIEJhc3NCb29zdF9nZXRQYXJhbWV0ZXIgICAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgKnBWYWx1ZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKnBWYWx1ZSk7Ci1pbnQgIFZpcnR1YWxpemVyX3NldFBhcmFtZXRlciAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCB2b2lkICpwUGFyYW0sIHZvaWQgKnBWYWx1ZSk7Ci1pbnQgIFZpcnR1YWxpemVyX2dldFBhcmFtZXRlciAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgKnBWYWx1ZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKnBWYWx1ZSk7Ci1pbnQgIEVxdWFsaXplcl9zZXRQYXJhbWV0ZXIgICAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFZhbHVlKTsKLWludCAgRXF1YWxpemVyX2dldFBhcmFtZXRlciAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHBhcmFtU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICpwVmFsdWVTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpOwotaW50ICBWb2x1bWVfc2V0UGFyYW1ldGVyICAgICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgdm9pZCAqcFBhcmFtLCB2b2lkICpwVmFsdWUpOworaW50ICBWaXJ0dWFsaXplcl9zZXRQYXJhbWV0ZXIgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgcGFyYW1TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFZhbHVlKTsKK2ludCAgVmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHBhcmFtU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICpwVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpOworaW50ICBFcXVhbGl6ZXJfc2V0UGFyYW1ldGVyICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgcGFyYW1TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFZhbHVlKTsKK2ludCAgRXF1YWxpemVyX2dldFBhcmFtZXRlciAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHBhcmFtU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICpwVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpOworaW50ICBWb2x1bWVfc2V0UGFyYW1ldGVyICAgICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgcGFyYW1TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFZhbHVlKTsKIGludCAgVm9sdW1lX2dldFBhcmFtZXRlciAgICAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHBhcmFtU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICpwVmFsdWVTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpOwpAQCAtMjcxLDcgKzI5OSwxMCBAQAogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0ICAgPSAwOwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiAgICAgPSAwOwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSAgICAgPSAwOwotCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyICAgICAgICAgICAgID0gTlVMTDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlciAgICAgICAgICAgID0gTlVMTDsKKyNlbmRpZgogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJhbmRHYWluZEJbaV0gPSBFUU5CXzVCYW5kU29mdFByZXNldHNbaV07CiAgICAgICAgIH0KQEAgLTQzOSw2ICs0NzAsMTQgQEAKICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyKTsKICAgICAgICAgfQorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIpOworICAgICAgICB9CisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlcik7CisgICAgICAgIH0KKyNlbmRpZgogICAgICAgICBkZWxldGUgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dDsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCA9IExWTV9OVUxMOwogICAgIH0KQEAgLTY5NSw3ICs3MzQsNDcgQEAKICAgICByZXR1cm4gMDsKIH0gICAvKiBlbmQgTHZtQnVuZGxlX2luaXQgKi8KIAorI2lmZGVmIEJVSUxEX0ZMT0FUCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gSU5UMTZMVE9GTE9BVAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBUb2RvOiBuZWVkIHRvIHdyaXRlIGZ1bmN0aW9uIGRlc2NyaXB0b3IKK3N0YXRpYyB2b2lkIEludDE2VG9GbG9hdChjb25zdCBMVk1fSU5UMTYgKnNyYywgTFZNX0ZMT0FUICpkc3QsIHNpemVfdCBuKSB7CisgICAgc2l6ZV90IGlpOworICAgIHNyYyArPSBuLTE7CisgICAgZHN0ICs9IG4tMTsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAqZHN0ID0gKChMVk1fRkxPQVQpKChMVk1fSU5UMTYpKnNyYykpIC8gMzI3NjguMGY7CisgICAgICAgIHNyYy0tOworICAgICAgICBkc3QtLTsKKyAgICB9CisgICAgcmV0dXJuOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIEZMT0FUVE9JTlQxNl9TQVQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8gVG9kbyA6IE5lZWQgdG8gd3JpdGUgZnVuY3Rpb24gZGVzY3JpcHRvcgorc3RhdGljIHZvaWQgRmxvYXRUb0ludDE2X1NBVChjb25zdCBMVk1fRkxPQVQgKnNyYywgTFZNX0lOVDE2ICpkc3QsIHNpemVfdCBuKSB7CisgICAgc2l6ZV90IGlpOworICAgIExWTV9JTlQzMiB0ZW1wOwogCisgICAgc3JjICs9IG4tMTsKKyAgICBkc3QgKz0gbi0xOworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgIHRlbXAgPSAoTFZNX0lOVDMyKSgoKnNyYykgKiAzMjc2OC4wZik7CisgICAgICAgIGlmICh0ZW1wID49IDMyNzY3KSB7CisgICAgICAgICAgICAqZHN0ID0gMzI3Njc7CisgICAgICAgIH0gZWxzZSBpZiAodGVtcCA8PSAtMzI3NjgpIHsKKyAgICAgICAgICAgICpkc3QgPSAtMzI3Njg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZHN0ID0gKExWTV9JTlQxNil0ZW1wOworICAgICAgICB9CisgICAgICAgIHNyYy0tOworICAgICAgICBkc3QtLTsKKyAgICB9CisgICAgcmV0dXJuOworfQorI2VuZGlmCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEx2bUJ1bmRsZV9wcm9jZXNzKCkKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNzEzLDcgKzc5Miw5OSBAQAogLy8gIHBPdXQ6ICAgICAgIHBvaW50ZXIgdG8gdXBkYXRlZCBzdGVyZW8gMTYgYml0IG91dHB1dCBkYXRhCiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgQlVJTERfRkxPQVQKK2ludCBMdm1CdW5kbGVfcHJvY2VzcyhMVk1fSU5UMTYgICAgICAgICpwSW4sCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqcE91dCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0Q29udGV4dCAgICAqcENvbnRleHQpewogCisKKyAgICAvL0xWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwT3V0VG1wOworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwSW5wdXRCdWZmOworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwT3V0cHV0QnVmZjsKKworICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgPT0gTlVMTCB8fAorICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZnJhbWVDb3VudCA8IGZyYW1lQ291bnQpIHsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyID0gKExWTV9GTE9BVCAqKW1hbGxvYyhmcmFtZUNvdW50ICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpICogRkNDXzIpOworICAgIH0KKworICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyID09IE5VTEwgfHwKKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZyYW1lQ291bnQgPCBmcmFtZUNvdW50KSB7CisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlciA9IChMVk1fRkxPQVQgKiltYWxsb2MoZnJhbWVDb3VudCAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkgKiBGQ0NfMik7CisgICAgfQorCisgICAgaWYgKChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgPT0gTlVMTCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyID09IE5VTEwpKSB7CisgICAgICAgIEFMT0dWKCJMVk1fRVJST1IgOiBMdm1CdW5kbGVfcHJvY2VzcyBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgZmxvYXQgYnVmZmVyJ3MgZmFpbGVkIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHBJbnB1dEJ1ZmYgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXI7CisgICAgcE91dHB1dEJ1ZmYgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyOworCisgICAgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUpeworICAgICAgICBwT3V0VG1wID0gcE91dDsKKyAgICB9IGVsc2UgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSl7CisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5mcmFtZUNvdW50ICE9IGZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciA9CisgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKiljYWxsb2MoZnJhbWVDb3VudCwgc2l6ZW9mKExWTV9JTlQxNikgKiBGQ0NfMik7CisgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICAgICAgfQorICAgICAgICBwT3V0VG1wID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlcjsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiTFZNX0VSUk9SIDogTHZtQnVuZGxlX3Byb2Nlc3MgaW52YWxpZCBhY2Nlc3MgbW9kZSIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICAjaWZkZWYgTFZNX1BDTQorICAgIGZ3cml0ZShwSW4sIGZyYW1lQ291bnQqc2l6ZW9mKExWTV9JTlQxNikgKiBGQ0NfMiwgMSwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIpOworICAgIGZmbHVzaChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21JblB0cik7CisgICAgI2VuZGlmCisKKyAgICAvKiBDb252ZXJ0aW5nIGlucHV0IGRhdGEgZnJvbSBmaXhlZCBwb2ludCB0byBmbG9hdCBwb2ludCAqLworICAgIEludDE2VG9GbG9hdChwSW4sIHBJbnB1dEJ1ZmYsIGZyYW1lQ291bnQgKiAyKTsKKworICAgIC8qIFByb2Nlc3MgdGhlIHNhbXBsZXMgKi8KKyAgICBMdm1TdGF0dXMgPSBMVk1fUHJvY2VzcyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnB1dEJ1ZmYsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5wdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dEJ1ZmYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpZnJhbWVDb3VudCwgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byByZWFkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdWRvIFRpbWUgKi8KKworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fUHJvY2VzcyIsICJMdm1CdW5kbGVfcHJvY2VzcyIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICAgIC8qIENvbnZlcnRpbmcgb3V0cHV0IGRhdGEgZnJvbSBmbG9hdCBwb2ludCB0byBmaXhlZCBwb2ludCAqLworICAgIEZsb2F0VG9JbnQxNl9TQVQocE91dHB1dEJ1ZmYsIHBPdXRUbXAsIChMVk1fVUlOVDE2KWZyYW1lQ291bnQgKiAyKTsKKyAgICAjaWZkZWYgTFZNX1BDTQorICAgIGZ3cml0ZShwT3V0VG1wLCBmcmFtZUNvdW50KnNpemVvZihMVk1fSU5UMTYpICogRkNDXzIsIDEsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbU91dFB0cik7CisgICAgZmZsdXNoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbU91dFB0cik7CisgICAgI2VuZGlmCisKKyAgICBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKXsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50ICogMjsgaSsrKXsKKyAgICAgICAgICAgIHBPdXRbaV0gPSBjbGFtcDE2KChMVk1fSU5UMzIpcE91dFtpXSArIChMVk1fSU5UMzIpcE91dFRtcFtpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9ICAgIC8qIGVuZCBMdm1CdW5kbGVfcHJvY2VzcyAqLworI2Vsc2UKIGludCBMdm1CdW5kbGVfcHJvY2VzcyhMVk1fSU5UMTYgICAgICAgICpwSW4sCiAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqcE91dCwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIGZyYW1lQ291bnQsCkBAIC03NzEsNyArOTQyLDcgQEAKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9ICAgIC8qIGVuZCBMdm1CdW5kbGVfcHJvY2VzcyAqLwotCisjZW5kaWYKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBFcXVhbGl6ZXJVcGRhdGVBY3RpdmVQYXJhbXMoKQpAQCAtODQwLDggKzEwMTEsMTIgQEAKICAgICBmbG9hdCBlbmVyZ3lCYXNzQm9vc3QgPSAwOwogICAgIGZsb2F0IGNyb3NzQ29ycmVjdGlvbiA9IDA7CiAKKyAgICBib29sIGVxRW5hYmxlZCA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJFcXVhbGl6ZXJFbmFibGVkID09IExWTV9UUlVFOworICAgIGJvb2wgYmJFbmFibGVkID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NFbmFibGVkID09IExWTV9UUlVFOworICAgIGJvb2wgdmlFbmFibGVkID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9PSBMVk1fVFJVRTsKKwogICAgIC8vRVEgY29udHJpYnV0aW9uCi0gICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJFcXVhbGl6ZXJFbmFibGVkID09IExWTV9UUlVFKSB7CisgICAgaWYgKGVxRW5hYmxlZCkgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKICAgICAgICAgICAgIGZsb2F0IGJhbmRGYWN0b3IgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2ldLzE1LjA7CiAgICAgICAgICAgICBmbG9hdCBiYW5kQ29lZmZpY2llbnQgPSBMaW1pdExldmVsX2JhbmRFbmVyZ3lDb2VmZmljaWVudFtpXTsKQEAgLTg2NywzNSArMTA0MiwzNyBAQAogICAgICAgICB9CiAgICAgICAgIGJhbmRGYWN0b3JTdW0gLT0gMS4wOwogICAgICAgICBpZiAoYmFuZEZhY3RvclN1bSA+IDApCi0gICAgICAgICAgICBjcm9zc0NvcnJlY3Rpb24gPSBiYW5kRmFjdG9yU3VtICogMC43OworICAgICAgICAgIGNyb3NzQ29ycmVjdGlvbiA9IGJhbmRGYWN0b3JTdW0gKiAwLjc7CiAgICAgfQogCiAgICAgLy9CYXNzQm9vc3QgY29udHJpYnV0aW9uCi0gICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzRW5hYmxlZCA9PSBMVk1fVFJVRSkgeworICAgIGlmIChiYkVuYWJsZWQpIHsKICAgICAgICAgZmxvYXQgYm9vc3RGYWN0b3IgPSAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+QmFzc1N0cmVuZ3RoU2F2ZWQpLzEwMDAuMDsKICAgICAgICAgZmxvYXQgYm9vc3RDb2VmZmljaWVudCA9IExpbWl0TGV2ZWxfYmFzc0Jvb3N0RW5lcmd5Q29lZmZpY2llbnQ7CiAKICAgICAgICAgZW5lcmd5Q29udHJpYnV0aW9uICs9IGJvb3N0RmFjdG9yICogYm9vc3RDb2VmZmljaWVudCAqIGJvb3N0Q29lZmZpY2llbnQ7CiAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7Ci0gICAgICAgICAgICBmbG9hdCBiYW5kRmFjdG9yID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YmFuZEdhaW5kQltpXS8xNS4wOwotICAgICAgICAgICAgZmxvYXQgYmFuZENyb3NzQ29lZmZpY2llbnQgPSBMaW1pdExldmVsX2Jhc3NCb29zdEVuZXJneUNyb3NzQ29lZmZpY2llbnRbaV07Ci0gICAgICAgICAgICBmbG9hdCBiYW5kRW5lcmd5ID0gYm9vc3RGYWN0b3IgKiBiYW5kRmFjdG9yICoKKyAgICAgICAgaWYgKGVxRW5hYmxlZCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgYmFuZEZhY3RvciA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJhbmRHYWluZEJbaV0vMTUuMDsKKyAgICAgICAgICAgICAgICBmbG9hdCBiYW5kQ3Jvc3NDb2VmZmljaWVudCA9IExpbWl0TGV2ZWxfYmFzc0Jvb3N0RW5lcmd5Q3Jvc3NDb2VmZmljaWVudFtpXTsKKyAgICAgICAgICAgICAgICBmbG9hdCBiYW5kRW5lcmd5ID0gYm9vc3RGYWN0b3IgKiBiYW5kRmFjdG9yICoKICAgICAgICAgICAgICAgICAgICAgYmFuZENyb3NzQ29lZmZpY2llbnQ7Ci0gICAgICAgICAgICBpZiAoYmFuZEVuZXJneSA+IDApCi0gICAgICAgICAgICAgICAgZW5lcmd5QmFzc0Jvb3N0ICs9IGJhbmRFbmVyZ3k7CisgICAgICAgICAgICAgICAgaWYgKGJhbmRFbmVyZ3kgPiAwKQorICAgICAgICAgICAgICAgICAgZW5lcmd5QmFzc0Jvb3N0ICs9IGJhbmRFbmVyZ3k7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvL1ZpcnR1YWxpemVyIGNvbnRyaWJ1dGlvbgotICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID09IExWTV9UUlVFKSB7CisgICAgaWYgKHZpRW5hYmxlZCkgewogICAgICAgICBlbmVyZ3lDb250cmlidXRpb24gKz0gTGltaXRMZXZlbF92aXJ0dWFsaXplckNvbnRyaWJ1dGlvbiAqCiAgICAgICAgICAgICAgICAgTGltaXRMZXZlbF92aXJ0dWFsaXplckNvbnRyaWJ1dGlvbjsKICAgICB9CiAKICAgICBkb3VibGUgdG90YWxFbmVyZ3lFc3RpbWF0aW9uID0gc3FydChlbmVyZ3lDb250cmlidXRpb24gKyBlbmVyZ3lDcm9zcyArIGVuZXJneUJhc3NCb29zdCkgLQogICAgICAgICAgICAgY3Jvc3NDb3JyZWN0aW9uOwotICAgIEFMT0dWKCIgVE9UQUwgZW5lcmd5IGVzdGltYXRpb246ICUwLjJmIiwgdG90YWxFbmVyZ3lFc3RpbWF0aW9uKTsKKyAgICBBTE9HVigiIFRPVEFMIGVuZXJneSBlc3RpbWF0aW9uOiAlMC4yZiBkQiIsIHRvdGFsRW5lcmd5RXN0aW1hdGlvbik7CiAKICAgICAvL3JvdW5kb2ZmCiAgICAgaW50IG1heExldmVsUm91bmQgPSAoaW50KSh0b3RhbEVuZXJneUVzdGltYXRpb24gKyAwLjk5KTsKQEAgLTkxMyw2ICsxMDkwLDggQEAKICAgICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLwogICAgIEx2bVN0YXR1cyA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiTHZtRWZmZWN0X2xpbWl0TGV2ZWwiKQorCisgICAgQUxPR1YoIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyByZXR1cm46JWQiLCAoaW50KUx2bVN0YXR1cyk7CiAgICAgLy9BTE9HVigiXHRMdm1FZmZlY3RfbGltaXRMZXZlbCBqdXN0IFNldCAtPiAlZFxuIiwKICAgICAvLyAgICAgICAgICBBY3RpdmVQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb25bYmFuZF0uR2Fpbik7CiAKQEAgLTExMjYsNiArMTMwNSwxNiBAQAogICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzQ4MDAwOwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gNDgwMDAqMjsgLy8gMiBzZWNzIFN0ZXJlbwogICAgICAgICBicmVhazsKKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyAgICBjYXNlIDk2MDAwOgorICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzk2MDAwOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gOTYwMDAqMjsgLy8gMiBzZWNzIFN0ZXJlbworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE5MjAwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18xOTIwMDA7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAxOTIwMDAqMjsgLy8gMiBzZWNzIFN0ZXJlbworICAgICAgICBicmVhazsKKyNlbmRpZgogICAgIGRlZmF1bHQ6CiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdF9zZXRDb25maWcgaW52YWxpZCBzYW1wbGluZyByYXRlICVkIiwgcENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CkBAIC0xMTUzLDYgKzEzNDIsOCBAQAogICAgICAgICBBTE9HVigiXHRFZmZlY3Rfc2V0Q29uZmlnIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVSYXRlID0gU2FtcGxlUmF0ZTsKIAorICAgICAgICBMdm1FZmZlY3RfbGltaXRMZXZlbChwQ29udGV4dCk7CisKICAgICB9ZWxzZXsKICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3Rfc2V0Q29uZmlnIGtlZXAgc2FtcGxpbmcgcmF0ZSBhdCAlZCIsIFNhbXBsZVJhdGUpOwogICAgIH0KQEAgLTIwMTAsNTkgKzIyMDEsNTQgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50IEJhc3NCb29zdF9nZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCAgICAgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICpwVmFsdWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgKnBWYWx1ZSl7CitpbnQgQmFzc0Jvb3N0X2dldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHBhcmFtU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgKnBWYWx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpIHsKICAgICBpbnQgc3RhdHVzID0gMDsKLSAgICBpbnQzMl90ICpwUGFyYW1UZW1wID0gKGludDMyX3QgKilwUGFyYW07Ci0gICAgaW50MzJfdCBwYXJhbSA9ICpwUGFyYW1UZW1wKys7CisgICAgaW50MzJfdCAqcGFyYW1zID0gKGludDMyX3QgKilwUGFyYW07CiAKLSAgICAvL0FMT0dWKCJcdEJhc3NCb29zdF9nZXRQYXJhbWV0ZXIgc3RhcnQiKTsKKyAgICBBTE9HVlYoIiVzIHN0YXJ0IiwgX19mdW5jX18pOwogCi0gICAgc3dpdGNoIChwYXJhbSl7Ci0gICAgICAgIGNhc2UgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIX1NVUFBPUlRFRDoKLSAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YodWludDMyX3QpKXsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBCYXNzQm9vc3RfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplMSAlZCIsICpwVmFsdWVTaXplKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJBU1NCT09TVF9QQVJBTV9TVFJFTkdUSDoKLSAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEJhc3NCb29zdF9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBWYWx1ZVNpemUyICVkIiwgKnBWYWx1ZVNpemUpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YoaW50MTZfdCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogQmFzc0Jvb3N0X2dldFBhcmFtZXRlcigpIGludmFsaWQgcGFyYW0gJWQiLCBwYXJhbSk7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAocGFyYW1TaXplIDwgc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgIEFMT0dWKCIlcyBpbnZhbGlkIHBhcmFtU2l6ZTogJXUiLCBfX2Z1bmNfXywgcGFyYW1TaXplKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQotCi0gICAgc3dpdGNoIChwYXJhbSl7CisgICAgc3dpdGNoIChwYXJhbXNbMF0pIHsKICAgICAgICAgY2FzZSBCQVNTQk9PU1RfUEFSQU1fU1RSRU5HVEhfU1VQUE9SVEVEOgotICAgICAgICAgICAgKih1aW50MzJfdCAqKXBWYWx1ZSA9IDE7CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKHVpbnQzMl90KSkgeyAgLy8gbGVnYWN5OiBjaGVjayBlcXVhbGl0eSBoZXJlLgorICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBCQVNTQk9PU1RfUEFSQU1fU1RSRU5HVEhfU1VQUE9SVEVEIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBzZXQgKnBWYWx1ZVNpemUKIAotICAgICAgICAgICAgLy9BTE9HVigiXHRCYXNzQm9vc3RfZ2V0UGFyYW1ldGVyKCkgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIX1NVUFBPUlRFRCBWYWx1ZSBpcyAlZCIsCi0gICAgICAgICAgICAvLyAgICAgICAgKih1aW50MzJfdCAqKXBWYWx1ZSk7CisgICAgICAgICAgICAqKHVpbnQzMl90ICopcFZhbHVlID0gMTsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIX1NVUFBPUlRFRCAldSIsIF9fZnVuY19fLCAqKHVpbnQzMl90ICopcFZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIOgotICAgICAgICAgICAgKihpbnQxNl90ICopcFZhbHVlID0gQmFzc0dldFN0cmVuZ3RoKHBDb250ZXh0KTsKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpIHsgIC8vIGxlZ2FjeTogY2hlY2sgZXF1YWxpdHkgaGVyZS4KKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBzZXQgKnBWYWx1ZVNpemUKIAotICAgICAgICAgICAgLy9BTE9HVigiXHRCYXNzQm9vc3RfZ2V0UGFyYW1ldGVyKCkgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIIFZhbHVlIGlzICVkIiwKLSAgICAgICAgICAgIC8vICAgICAgICAqKGludDE2X3QgKilwVmFsdWUpOworICAgICAgICAgICAgKihpbnQxNl90ICopcFZhbHVlID0gQmFzc0dldFN0cmVuZ3RoKHBDb250ZXh0KTsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIICVkIiwgX19mdW5jX18sICooaW50MTZfdCAqKXBWYWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogQmFzc0Jvb3N0X2dldFBhcmFtZXRlcigpIGludmFsaWQgcGFyYW0gJWQiLCBwYXJhbSk7CisgICAgICAgICAgICBBTE9HVigiJXMgaW52YWxpZCBwYXJhbSAlZCIsIF9fZnVuY19fLCBwYXJhbXNbMF0pOwogICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIC8vQUxPR1YoIlx0QmFzc0Jvb3N0X2dldFBhcmFtZXRlciBlbmQiKTsKKyAgICBBTE9HVlYoIiVzIGVuZCBwYXJhbTogJWQsIHN0YXR1czogJWQiLCBfX2Z1bmNfXywgcGFyYW1zWzBdLCBzdGF0dXMpOwogICAgIHJldHVybiBzdGF0dXM7CiB9IC8qIGVuZCBCYXNzQm9vc3RfZ2V0UGFyYW1ldGVyICovCiAKQEAgLTIwODEsMjcgKzIyNjcsNDIgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50IEJhc3NCb29zdF9zZXRQYXJhbWV0ZXIgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCB2b2lkICpwUGFyYW0sIHZvaWQgKnBWYWx1ZSl7CitpbnQgQmFzc0Jvb3N0X3NldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHBhcmFtU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBWYWx1ZSkgewogICAgIGludCBzdGF0dXMgPSAwOwotICAgIGludDE2X3Qgc3RyZW5ndGg7Ci0gICAgaW50MzJfdCAqcFBhcmFtVGVtcCA9IChpbnQzMl90ICopcFBhcmFtOworICAgIGludDMyX3QgKnBhcmFtcyA9IChpbnQzMl90ICopcFBhcmFtOwogCi0gICAgLy9BTE9HVigiXHRCYXNzQm9vc3Rfc2V0UGFyYW1ldGVyIHN0YXJ0Iik7CisgICAgQUxPR1ZWKCIlcyBzdGFydCIsIF9fZnVuY19fKTsKIAotICAgIHN3aXRjaCAoKnBQYXJhbVRlbXApewotICAgICAgICBjYXNlIEJBU1NCT09TVF9QQVJBTV9TVFJFTkdUSDoKLSAgICAgICAgICAgIHN0cmVuZ3RoID0gKihpbnQxNl90ICopcFZhbHVlOwotICAgICAgICAgICAgLy9BTE9HVigiXHRCYXNzQm9vc3Rfc2V0UGFyYW1ldGVyKCkgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIIHZhbHVlIGlzICVkIiwgc3RyZW5ndGgpOwotICAgICAgICAgICAgLy9BTE9HVigiXHRCYXNzQm9vc3Rfc2V0UGFyYW1ldGVyKCkgQ2FsbGluZyBwQmFzc0Jvb3N0LT5CYXNzU2V0U3RyZW5ndGgiKTsKKyAgICBpZiAocGFyYW1TaXplICE9IHNpemVvZihpbnQzMl90KSkgeyAgLy8gbGVnYWN5OiBjaGVjayBlcXVhbGl0eSBoZXJlLgorICAgICAgICBBTE9HVigiJXMgaW52YWxpZCBwYXJhbVNpemU6ICV1IiwgX19mdW5jX18sIHBhcmFtU2l6ZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBzd2l0Y2ggKHBhcmFtc1swXSkgeworICAgICAgICBjYXNlIEJBU1NCT09TVF9QQVJBTV9TVFJFTkdUSDogeworICAgICAgICAgICAgaWYgKHZhbHVlU2l6ZSA8IHNpemVvZihpbnQxNl90KSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBCQVNTQk9PU1RfUEFSQU1fU1RSRU5HVEggaW52YWxpZCB2YWx1ZVNpemU6ICV1IiwgX19mdW5jX18sIHZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3QgaW50MTZfdCBzdHJlbmd0aCA9ICooaW50MTZfdCAqKXBWYWx1ZTsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIICVkIiwgX19mdW5jX18sIHN0cmVuZ3RoKTsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIIENhbGxpbmcgQmFzc1NldFN0cmVuZ3RoIiwgX19mdW5jX18pOwogICAgICAgICAgICAgQmFzc1NldFN0cmVuZ3RoKHBDb250ZXh0LCAoaW50MzJfdClzdHJlbmd0aCk7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdEJhc3NCb29zdF9zZXRQYXJhbWV0ZXIoKSBDYWxsZWQgcEJhc3NCb29zdC0+QmFzc1NldFN0cmVuZ3RoIik7Ci0gICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgQUxPR1ZWKCIlcyBCQVNTQk9PU1RfUEFSQU1fU1RSRU5HVEggQ2FsbGVkIEJhc3NTZXRTdHJlbmd0aCIsIF9fZnVuY19fKTsKKyAgICAgICAgfSBicmVhazsKKwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogQmFzc0Jvb3N0X3NldFBhcmFtZXRlcigpIGludmFsaWQgcGFyYW0gJWQiLCAqcFBhcmFtVGVtcCk7CisgICAgICAgICAgICBBTE9HVigiJXMgaW52YWxpZCBwYXJhbSAlZCIsIF9fZnVuY19fLCBwYXJhbXNbMF0pOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIC8vQUxPR1YoIlx0QmFzc0Jvb3N0X3NldFBhcmFtZXRlciBlbmQiKTsKKyAgICBBTE9HVlYoIiVzIGVuZCBwYXJhbTogJWQsIHN0YXR1czogJWQiLCBfX2Z1bmNfXywgcGFyYW1zWzBdLCBzdGF0dXMpOwogICAgIHJldHVybiBzdGF0dXM7CiB9IC8qIGVuZCBCYXNzQm9vc3Rfc2V0UGFyYW1ldGVyICovCiAKQEAgLTIxMjYsOTIgKzIzMjcsOTcgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50IFZpcnR1YWxpemVyX2dldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0ICAgICAgICAqcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICpwVmFsdWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAqcFZhbHVlKXsKK2ludCBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHBhcmFtU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICpwVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpIHsKICAgICBpbnQgc3RhdHVzID0gMDsKLSAgICBpbnQzMl90ICpwUGFyYW1UZW1wID0gKGludDMyX3QgKilwUGFyYW07Ci0gICAgaW50MzJfdCBwYXJhbSA9ICpwUGFyYW1UZW1wKys7CisgICAgaW50MzJfdCAqcGFyYW1zID0gKGludDMyX3QgKilwUGFyYW07CiAKLSAgICAvL0FMT0dWKCJcdFZpcnR1YWxpemVyX2dldFBhcmFtZXRlciBzdGFydCIpOworICAgIEFMT0dWVigiJXMgc3RhcnQiLCBfX2Z1bmNfXyk7CiAKLSAgICBzd2l0Y2ggKHBhcmFtKXsKLSAgICAgICAgY2FzZSBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSF9TVVBQT1JURUQ6Ci0gICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKHVpbnQzMl90KSl7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogVmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplICVkIiwqcFZhbHVlU2l6ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZih1aW50MzJfdCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSDoKLSAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFZpcnR1YWxpemVyX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZTIgJWQiLCpwVmFsdWVTaXplKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKGludDE2X3QpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVklSVFVBTElaRVJfUEFSQU1fVklSVFVBTF9TUEVBS0VSX0FOR0xFUzoKLSAgICAgICAgICAgIC8vIHJldHVybiB2YWx1ZSBzaXplIGNhbiBvbmx5IGJlIGludGVycHJldGVkIGFzIHJlbGF0aXZlIHRvIGlucHV0IHZhbHVlLAotICAgICAgICAgICAgLy8gZGVmZXJyaW5nIHZhbGlkaXR5IGNoZWNrIHRvIGJlbG93Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWSVJUVUFMSVpFUl9QQVJBTV9WSVJUVUFMSVpBVElPTl9NT0RFOgotICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZih1aW50MzJfdCkpewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFZpcnR1YWxpemVyX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZSAlZCIsKnBWYWx1ZVNpemUpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YodWludDMyX3QpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBhcmFtICVkIiwgcGFyYW0pOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKHBhcmFtU2l6ZSA8IHNpemVvZihpbnQzMl90KSkgeworICAgICAgICBBTE9HVigiJXMgaW52YWxpZCBwYXJhbVNpemU6ICV1IiwgX19mdW5jX18sIHBhcmFtU2l6ZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KLQotICAgIHN3aXRjaCAocGFyYW0peworICAgIHN3aXRjaCAocGFyYW1zWzBdKSB7CiAgICAgICAgIGNhc2UgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEhfU1VQUE9SVEVEOgotICAgICAgICAgICAgKih1aW50MzJfdCAqKXBWYWx1ZSA9IDE7CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKHVpbnQzMl90KSkgeyAvLyBsZWdhY3k6IGNoZWNrIGVxdWFsaXR5IGhlcmUuCisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIFZJUlRVQUxJWkVSX1BBUkFNX1NUUkVOR1RIX1NVUFBPUlRFRCBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gc2V0ICpwVmFsdWVTaXplCiAKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0VmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEhfU1VQUE9SVEVEIFZhbHVlIGlzICVkIiwKLSAgICAgICAgICAgIC8vICAgICAgICAqKHVpbnQzMl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgICoodWludDMyX3QgKilwVmFsdWUgPSAxOworICAgICAgICAgICAgQUxPR1ZWKCIlcyBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSF9TVVBQT1JURUQgJWQiLCBfX2Z1bmNfXywgKih1aW50MzJfdCAqKXBWYWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIFZJUlRVQUxJWkVSX1BBUkFNX1NUUkVOR1RIOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSkgeyAvLyBsZWdhY3k6IGNoZWNrIGVxdWFsaXR5IGhlcmUuCisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIFZJUlRVQUxJWkVSX1BBUkFNX1NUUkVOR1RIIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBzZXQgKnBWYWx1ZVNpemUKKwogICAgICAgICAgICAgKihpbnQxNl90ICopcFZhbHVlID0gVmlydHVhbGl6ZXJHZXRTdHJlbmd0aChwQ29udGV4dCk7CiAKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0VmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEggVmFsdWUgaXMgJWQiLAotICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSk7CisgICAgICAgICAgICBBTE9HVlYoIiVzIFZJUlRVQUxJWkVSX1BBUkFNX1NUUkVOR1RIICVkIiwgX19mdW5jX18sICooaW50MTZfdCAqKXBWYWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIFZJUlRVQUxJWkVSX1BBUkFNX1ZJUlRVQUxfU1BFQUtFUl9BTkdMRVM6IHsKLSAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gKGF1ZGlvX2NoYW5uZWxfbWFza190KSAqcFBhcmFtVGVtcCsrOwotICAgICAgICAgICAgY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgPSAoYXVkaW9fZGV2aWNlc190KSAqcFBhcmFtVGVtcDsKLSAgICAgICAgICAgIHVpbnQzMl90IG5iQ2hhbm5lbHMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOwotICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgMyAqIG5iQ2hhbm5lbHMgKiBzaXplb2YoaW50MzJfdCkpewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFZpcnR1YWxpemVyX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZSAlZCIsKnBWYWx1ZVNpemUpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgaWYgKHBhcmFtU2l6ZSA8IDMgKiBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgVklSVFVBTElaRVJfUEFSQU1fU1BFQUtFUl9BTkdMRVMgaW52YWxpZCBwYXJhbVNpemU6ICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwYXJhbVNpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gKGF1ZGlvX2NoYW5uZWxfbWFza190KSBwYXJhbXNbMV07CisgICAgICAgICAgICBjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSA9IChhdWRpb19kZXZpY2VzX3QpIHBhcmFtc1syXTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IG5iQ2hhbm5lbHMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgdmFsdWVTaXplUmVxdWlyZWQgPSAzICogbmJDaGFubmVscyAqIHNpemVvZihpbnQzMl90KTsKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHZhbHVlU2l6ZVJlcXVpcmVkKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIFZJUlRVQUxJWkVSX1BBUkFNX1NQRUFLRVJfQU5HTEVTIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSB2YWx1ZVNpemVSZXF1aXJlZDsKKwogICAgICAgICAgICAgLy8gdmVyaWZ5IHRoZSBjb25maWd1cmF0aW9uIGlzIHN1cHBvcnRlZAogICAgICAgICAgICAgc3RhdHVzID0gVmlydHVhbGl6ZXJJc0NvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoY2hhbm5lbE1hc2ssIGRldmljZVR5cGUpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlZJUlRVQUxJWkVSX1BBUkFNX1ZJUlRVQUxfU1BFQUtFUl9BTkdMRVMgc3VwcG9ydHMgbWFzaz0weCV4IGRldmljZT0weCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBkZXZpY2VUeXBlKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgVklSVFVBTElaRVJfUEFSQU1fVklSVFVBTF9TUEVBS0VSX0FOR0xFUyBtYXNrPTB4JXggZGV2aWNlPTB4JXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNoYW5uZWxNYXNrLCBkZXZpY2VUeXBlKTsKICAgICAgICAgICAgICAgICAvLyBjb25maWd1cmF0aW9uIGlzIHN1cHBvcnRlZCwgZ2V0IHRoZSBhbmdsZXMKICAgICAgICAgICAgICAgICBWaXJ0dWFsaXplckdldFNwZWFrZXJBbmdsZXMoY2hhbm5lbE1hc2ssIGRldmljZVR5cGUsIChpbnQzMl90ICopcFZhbHVlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgVklSVFVBTElaRVJfUEFSQU1fVklSVFVBTElaQVRJT05fTU9ERToKLSAgICAgICAgICAgICoodWludDMyX3QgKilwVmFsdWUgID0gKHVpbnQzMl90KSBWaXJ0dWFsaXplckdldFZpcnR1YWxpemF0aW9uTW9kZShwQ29udGV4dCk7CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKHVpbnQzMl90KSkgeyAvLyBsZWdhY3k6IGNoZWNrIGVxdWFsaXR5IGhlcmUuCisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIFZJUlRVQUxJWkVSX1BBUkFNX1ZJUlRVQUxJWkFUSU9OX01PREUgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBubyBuZWVkIHRvIHNldCAqcFZhbHVlU2l6ZQorCisgICAgICAgICAgICAqKHVpbnQzMl90ICopcFZhbHVlID0gKHVpbnQzMl90KSBWaXJ0dWFsaXplckdldFZpcnR1YWxpemF0aW9uTW9kZShwQ29udGV4dCk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogVmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwYXJhbSAlZCIsIHBhcmFtKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBpbnZhbGlkIHBhcmFtICVkIiwgX19mdW5jX18sIHBhcmFtc1swXSk7CiAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgQUxPR1YoIlx0VmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyIGVuZCByZXR1cm5pbmcgc3RhdHVzPSVkIiwgc3RhdHVzKTsKKyAgICBBTE9HVlYoIiVzIGVuZCBwYXJhbTogJWQsIHN0YXR1czogJWQiLCBfX2Z1bmNfXywgcGFyYW1zWzBdLCBzdGF0dXMpOwogICAgIHJldHVybiBzdGF0dXM7CiB9IC8qIGVuZCBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIgKi8KIApAQCAtMjIzMCwzNyArMjQzNiw1NyBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQgVmlydHVhbGl6ZXJfc2V0UGFyYW1ldGVyIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgdm9pZCAqcFBhcmFtLCB2b2lkICpwVmFsdWUpeworaW50IFZpcnR1YWxpemVyX3NldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgcGFyYW1TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFZhbHVlKSB7CiAgICAgaW50IHN0YXR1cyA9IDA7Ci0gICAgaW50MTZfdCBzdHJlbmd0aDsKLSAgICBpbnQzMl90ICpwUGFyYW1UZW1wID0gKGludDMyX3QgKilwUGFyYW07Ci0gICAgaW50MzJfdCBwYXJhbSA9ICpwUGFyYW1UZW1wKys7CisgICAgaW50MzJfdCAqcGFyYW1zID0gKGludDMyX3QgKilwUGFyYW07CiAKLSAgICAvL0FMT0dWKCJcdFZpcnR1YWxpemVyX3NldFBhcmFtZXRlciBzdGFydCIpOworICAgIEFMT0dWVigiJXMgc3RhcnQiLCBfX2Z1bmNfXyk7CiAKLSAgICBzd2l0Y2ggKHBhcmFtKXsKLSAgICAgICAgY2FzZSBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSDoKLSAgICAgICAgICAgIHN0cmVuZ3RoID0gKihpbnQxNl90ICopcFZhbHVlOwotICAgICAgICAgICAgLy9BTE9HVigiXHRWaXJ0dWFsaXplcl9zZXRQYXJhbWV0ZXIoKSBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSCB2YWx1ZSBpcyAlZCIsIHN0cmVuZ3RoKTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0VmlydHVhbGl6ZXJfc2V0UGFyYW1ldGVyKCkgQ2FsbGluZyBwVmlydHVhbGl6ZXItPnNldFN0cmVuZ3RoIik7CisgICAgaWYgKHBhcmFtU2l6ZSAhPSBzaXplb2YoaW50MzJfdCkpIHsgLy8gbGVnYWN5OiBjaGVjayBlcXVhbGl0eSBoZXJlLgorICAgICAgICBBTE9HVigiJXMgaW52YWxpZCBwYXJhbVNpemU6ICV1IiwgX19mdW5jX18sIHBhcmFtU2l6ZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBzd2l0Y2ggKHBhcmFtc1swXSkgeworICAgICAgICBjYXNlIFZJUlRVQUxJWkVSX1BBUkFNX1NUUkVOR1RIOiB7CisgICAgICAgICAgICBpZiAodmFsdWVTaXplIDwgc2l6ZW9mKGludDE2X3QpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIFZJUlRVQUxJWkVSX1BBUkFNX1NUUkVOR1RIIGludmFsaWQgdmFsdWVTaXplOiAldSIsIF9fZnVuY19fLCB2YWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IGludDE2X3Qgc3RyZW5ndGggPSAqKGludDE2X3QgKilwVmFsdWU7CisgICAgICAgICAgICBBTE9HVlYoIiVzIFZJUlRVQUxJWkVSX1BBUkFNX1NUUkVOR1RIICVkIiwgX19mdW5jX18sIHN0cmVuZ3RoKTsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEggQ2FsbGluZyBWaXJ0dWFsaXplclNldFN0cmVuZ3RoIiwgX19mdW5jX18pOwogICAgICAgICAgICAgVmlydHVhbGl6ZXJTZXRTdHJlbmd0aChwQ29udGV4dCwgKGludDMyX3Qpc3RyZW5ndGgpOwotICAgICAgICAgICAgLy9BTE9HVigiXHRWaXJ0dWFsaXplcl9zZXRQYXJhbWV0ZXIoKSBDYWxsZWQgcFZpcnR1YWxpemVyLT5zZXRTdHJlbmd0aCIpOwotICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEggQ2FsbGVkIFZpcnR1YWxpemVyU2V0U3RyZW5ndGgiLCBfX2Z1bmNfXyk7CisgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBWSVJUVUFMSVpFUl9QQVJBTV9GT1JDRV9WSVJUVUFMSVpBVElPTl9NT0RFOiB7Ci0gICAgICAgICAgICBjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSA9ICooYXVkaW9fZGV2aWNlc190ICopIHBWYWx1ZTsKLSAgICAgICAgICAgIHN0YXR1cyA9IFZpcnR1YWxpemVyRm9yY2VWaXJ0dWFsaXphdGlvbk1vZGUocENvbnRleHQsIGRldmljZVR5cGUpOwotICAgICAgICAgICAgLy9BTE9HVigiVklSVFVBTElaRVJfUEFSQU1fRk9SQ0VfVklSVFVBTElaQVRJT05fTU9ERSBkZXZpY2U9MHgleCByZXN1bHQ9JWQiLAotICAgICAgICAgICAgLy8gICAgICAgIGRldmljZVR5cGUsIHN0YXR1cyk7CisgICAgICAgICAgICBpZiAodmFsdWVTaXplIDwgc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIFZJUlRVQUxJWkVSX1BBUkFNX0ZPUkNFX1ZJUlRVQUxJWkFUSU9OX01PREUgaW52YWxpZCB2YWx1ZVNpemU6ICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB2YWx1ZVNpemUpOworICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNjQ0NzgwMDMiKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlID0gKGF1ZGlvX2RldmljZXNfdCkqKGludDMyX3QgKilwVmFsdWU7CisgICAgICAgICAgICBzdGF0dXMgPSBWaXJ0dWFsaXplckZvcmNlVmlydHVhbGl6YXRpb25Nb2RlKHBDb250ZXh0LCBkZXZpY2VUeXBlKTsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgVklSVFVBTElaRVJfUEFSQU1fRk9SQ0VfVklSVFVBTElaQVRJT05fTU9ERSBkZXZpY2U9JSN4IHJlc3VsdD0lZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBkZXZpY2VUeXBlLCBzdGF0dXMpOworICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBWaXJ0dWFsaXplcl9zZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBhcmFtICVkIiwgcGFyYW0pOworICAgICAgICAgICAgQUxPR1YoIiVzIGludmFsaWQgcGFyYW0gJWQiLCBfX2Z1bmNfXywgcGFyYW1zWzBdKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICAvL0FMT0dWKCJcdFZpcnR1YWxpemVyX3NldFBhcmFtZXRlciBlbmQiKTsKKyAgICBBTE9HVlYoIiVzIGVuZCBwYXJhbTogJWQsIHN0YXR1czogJWQiLCBfX2Z1bmNfXywgcGFyYW1zWzBdLCBzdGF0dXMpOwogICAgIHJldHVybiBzdGF0dXM7CiB9IC8qIGVuZCBWaXJ0dWFsaXplcl9zZXRQYXJhbWV0ZXIgKi8KIApAQCAtMjI4NCwxNzQgKzI1MTAsMjE1IEBACiAvLyBTaWRlIEVmZmVjdHM6CiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pbnQgRXF1YWxpemVyX2dldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0ICAgICAqcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAqcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgKnBWYWx1ZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAqcFZhbHVlKXsKK2ludCBFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgcGFyYW1TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBWYWx1ZSkgewogICAgIGludCBzdGF0dXMgPSAwOwotICAgIGludDMyX3QgKnBQYXJhbVRlbXAgPSAoaW50MzJfdCAqKXBQYXJhbTsKLSAgICBpbnQzMl90IHBhcmFtID0gKnBQYXJhbVRlbXArKzsKLSAgICBpbnQzMl90IHBhcmFtMjsKLSAgICBjaGFyICpuYW1lOworICAgIGludDMyX3QgKnBhcmFtcyA9IChpbnQzMl90ICopcFBhcmFtOwogCi0gICAgLy9BTE9HVigiXHRFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyIHN0YXJ0Iik7CisgICAgQUxPR1ZWKCIlcyBzdGFydCIsIF9fZnVuY19fKTsKIAotICAgIHN3aXRjaCAocGFyYW0pIHsKKyAgICBpZiAocGFyYW1TaXplIDwgc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgIEFMT0dWKCIlcyBpbnZhbGlkIHBhcmFtU2l6ZTogJXUiLCBfX2Z1bmNfXywgcGFyYW1TaXplKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHN3aXRjaCAocGFyYW1zWzBdKSB7CiAgICAgY2FzZSBFUV9QQVJBTV9OVU1fQkFORFM6CisgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZih1aW50MTZfdCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9OVU1fQkFORFMgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YodWludDE2X3QpOworCisgICAgICAgICoodWludDE2X3QgKilwVmFsdWUgPSAodWludDE2X3QpRklWRUJBTkRfTlVNQkFORFM7CisgICAgICAgIEFMT0dWVigiJXMgRVFfUEFSQU1fTlVNX0JBTkRTICV1IiwgX19mdW5jX18sICoodWludDE2X3QgKilwVmFsdWUpOworICAgICAgICBicmVhazsKKwogICAgIGNhc2UgRVFfUEFSQU1fQ1VSX1BSRVNFVDoKKyAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKHVpbnQxNl90KSkgeworICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0NVUl9QUkVTRVQgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YodWludDE2X3QpOworCisgICAgICAgICoodWludDE2X3QgKilwVmFsdWUgPSAodWludDE2X3QpRXF1YWxpemVyR2V0UHJlc2V0KHBDb250ZXh0KTsKKyAgICAgICAgQUxPR1ZWKCIlcyBFUV9QQVJBTV9DVVJfUFJFU0VUICV1IiwgX19mdW5jX18sICoodWludDE2X3QgKilwVmFsdWUpOworICAgICAgICBicmVhazsKKwogICAgIGNhc2UgRVFfUEFSQU1fR0VUX05VTV9PRl9QUkVTRVRTOgotICAgIGNhc2UgRVFfUEFSQU1fQkFORF9MRVZFTDoKLSAgICBjYXNlIEVRX1BBUkFNX0dFVF9CQU5EOgorICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YodWludDE2X3QpKSB7CisgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fR0VUX05VTV9PRl9QUkVTRVRTIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKHVpbnQxNl90KTsKKworICAgICAgICAqKHVpbnQxNl90ICopcFZhbHVlID0gKHVpbnQxNl90KUVxdWFsaXplckdldE51bVByZXNldHMoKTsKKyAgICAgICAgQUxPR1ZWKCIlcyBFUV9QQVJBTV9HRVRfTlVNX09GX1BSRVNFVFMgJXUiLCBfX2Z1bmNfXywgKih1aW50MTZfdCAqKXBWYWx1ZSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBFUV9QQVJBTV9HRVRfQkFORDogeworICAgICAgICBpZiAocGFyYW1TaXplIDwgMiAqIHNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0dFVF9CQU5EIGludmFsaWQgcGFyYW1TaXplOiAldSIsIF9fZnVuY19fLCBwYXJhbVNpemUpOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZih1aW50MTZfdCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9HRVRfQkFORCBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZih1aW50MTZfdCk7CisKKyAgICAgICAgY29uc3QgaW50MzJfdCBmcmVxdWVuY3kgPSBwYXJhbXNbMV07CisgICAgICAgICoodWludDE2X3QgKilwVmFsdWUgPSAodWludDE2X3QpRXF1YWxpemVyR2V0QmFuZChwQ29udGV4dCwgZnJlcXVlbmN5KTsKKyAgICAgICAgQUxPR1ZWKCIlcyBFUV9QQVJBTV9HRVRfQkFORCBmcmVxdWVuY3kgJWQsIGJhbmQgJXUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBmcmVxdWVuY3ksICoodWludDE2X3QgKilwVmFsdWUpOworICAgIH0gYnJlYWs7CisKKyAgICBjYXNlIEVRX1BBUkFNX0JBTkRfTEVWRUw6IHsKKyAgICAgICAgaWYgKHBhcmFtU2l6ZSA8IDIgKiBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9CQU5EX0xFVkVMIGludmFsaWQgcGFyYW1TaXplICV1IiwgX19mdW5jX18sIHBhcmFtU2l6ZSk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKGludDE2X3QpKSB7Ci0gICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplIDEgICVkIiwgKnBWYWx1ZVNpemUpOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fQkFORF9MRVZFTCBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZihpbnQxNl90KTsKLSAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY29uc3QgaW50MzJfdCBiYW5kID0gcGFyYW1zWzFdOworICAgICAgICBpZiAoYmFuZCA8IDAgfHwgYmFuZCA+PSBGSVZFQkFORF9OVU1CQU5EUykgeworICAgICAgICAgICAgaWYgKGJhbmQgPCAwKSB7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzMjQzODU5OCIpOworICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBFUV9QQVJBTV9CQU5EX0xFVkVMIGludmFsaWQgYmFuZCAlZCIsIF9fZnVuY19fLCBiYW5kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAqKGludDE2X3QgKilwVmFsdWUgPSAoaW50MTZfdClFcXVhbGl6ZXJHZXRCYW5kTGV2ZWwocENvbnRleHQsIGJhbmQpOworICAgICAgICBBTE9HVlYoIiVzIEVRX1BBUkFNX0JBTkRfTEVWRUwgYmFuZCAlZCwgbGV2ZWwgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBiYW5kLCAqKGludDE2X3QgKilwVmFsdWUpOworICAgIH0gYnJlYWs7CiAKICAgICBjYXNlIEVRX1BBUkFNX0xFVkVMX1JBTkdFOgogICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCAyICogc2l6ZW9mKGludDE2X3QpKSB7Ci0gICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplIDIgICVkIiwgKnBWYWx1ZVNpemUpOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fTEVWRUxfUkFOR0UgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgKnBWYWx1ZVNpemUgPSAyICogc2l6ZW9mKGludDE2X3QpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEVRX1BBUkFNX0JBTkRfRlJFUV9SQU5HRToKLSAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgMiAqIHNpemVvZihpbnQzMl90KSkgewotICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogRXF1YWxpemVyX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZSAzICAlZCIsICpwVmFsdWVTaXplKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgICpwVmFsdWVTaXplID0gMiAqIHNpemVvZihpbnQzMl90KTsKLSAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIEVRX1BBUkFNX0NFTlRFUl9GUkVROgotICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YoaW50MzJfdCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBWYWx1ZVNpemUgNSAgJWQiLCAqcFZhbHVlU2l6ZSk7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZihpbnQzMl90KTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVRX1BBUkFNX0dFVF9QUkVTRVRfTkFNRToKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVRX1BBUkFNX1BST1BFUlRJRVM6Ci0gICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8ICgyICsgRklWRUJBTkRfTlVNQkFORFMpICogc2l6ZW9mKHVpbnQxNl90KSkgewotICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogRXF1YWxpemVyX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZSAxICAlZCIsICpwVmFsdWVTaXplKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgICpwVmFsdWVTaXplID0gKDIgKyBGSVZFQkFORF9OVU1CQU5EUykgKiBzaXplb2YodWludDE2X3QpOwotICAgICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIgdW5rbm93biBwYXJhbSAlZCIsIHBhcmFtKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgc3dpdGNoIChwYXJhbSkgewotICAgIGNhc2UgRVFfUEFSQU1fTlVNX0JBTkRTOgotICAgICAgICAqKHVpbnQxNl90ICopcFZhbHVlID0gKHVpbnQxNl90KUZJVkVCQU5EX05VTUJBTkRTOwotICAgICAgICAvL0FMT0dWKCJcdEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9OVU1fQkFORFMgJWQiLCAqKGludDE2X3QgKilwVmFsdWUpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgRVFfUEFSQU1fTEVWRUxfUkFOR0U6CiAgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IC0xNTAwOwogICAgICAgICAqKChpbnQxNl90ICopcFZhbHVlICsgMSkgPSAxNTAwOwotICAgICAgICAvL0FMT0dWKCJcdEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9MRVZFTF9SQU5HRSBtaW4gJWQsIG1heCAlZCIsCi0gICAgICAgIC8vICAgICAgKihpbnQxNl90ICopcFZhbHVlLCAqKChpbnQxNl90ICopcFZhbHVlICsgMSkpOworICAgICAgICBBTE9HVlYoIiVzIEVRX1BBUkFNX0xFVkVMX1JBTkdFIG1pbiAlZCwgbWF4ICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKihpbnQxNl90ICopcFZhbHVlLCAqKChpbnQxNl90ICopcFZhbHVlICsgMSkpOwogICAgICAgICBicmVhazsKIAotICAgIGNhc2UgRVFfUEFSQU1fQkFORF9MRVZFTDoKLSAgICAgICAgcGFyYW0yID0gKnBQYXJhbVRlbXA7Ci0gICAgICAgIGlmIChwYXJhbTIgPCAwIHx8IHBhcmFtMiA+PSBGSVZFQkFORF9OVU1CQU5EUykgeworICAgIGNhc2UgRVFfUEFSQU1fQkFORF9GUkVRX1JBTkdFOiB7CisgICAgICAgIGlmIChwYXJhbVNpemUgPCAyICogc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fQkFORF9GUkVRX1JBTkdFIGludmFsaWQgcGFyYW1TaXplOiAldSIsIF9fZnVuY19fLCBwYXJhbVNpemUpOwogICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGlmIChwYXJhbTIgPCAwKSB7Ci0gICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzMjQzODU5OCIpOwotICAgICAgICAgICAgICAgIEFMT0dXKCJcdEVSUk9SIEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9CQU5EX0xFVkVMIGJhbmQgJWQiLCBwYXJhbTIpOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgKihpbnQxNl90ICopcFZhbHVlID0gKGludDE2X3QpRXF1YWxpemVyR2V0QmFuZExldmVsKHBDb250ZXh0LCBwYXJhbTIpOwotICAgICAgICAvL0FMT0dWKCJcdEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9CQU5EX0xFVkVMIGJhbmQgJWQsIGxldmVsICVkIiwKLSAgICAgICAgLy8gICAgICBwYXJhbTIsICooaW50MzJfdCAqKXBWYWx1ZSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFUV9QQVJBTV9DRU5URVJfRlJFUToKLSAgICAgICAgcGFyYW0yID0gKnBQYXJhbVRlbXA7Ci0gICAgICAgIGlmIChwYXJhbTIgPCAwIHx8IHBhcmFtMiA+PSBGSVZFQkFORF9OVU1CQU5EUykgeworICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCAyICogc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fQkFORF9GUkVRX1JBTkdFIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOwogICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGlmIChwYXJhbTIgPCAwKSB7Ci0gICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzMjQzNjM0MSIpOwotICAgICAgICAgICAgICAgIEFMT0dXKCJcdEVSUk9SIEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9DRU5URVJfRlJFUSBiYW5kICVkIiwgcGFyYW0yKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgICooaW50MzJfdCAqKXBWYWx1ZSA9IEVxdWFsaXplckdldENlbnRyZUZyZXF1ZW5jeShwQ29udGV4dCwgcGFyYW0yKTsKLSAgICAgICAgLy9BTE9HVigiXHRFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fQ0VOVEVSX0ZSRVEgYmFuZCAlZCwgZnJlcXVlbmN5ICVkIiwKLSAgICAgICAgLy8gICAgICBwYXJhbTIsICooaW50MzJfdCAqKXBWYWx1ZSk7Ci0gICAgICAgIGJyZWFrOworICAgICAgICAqcFZhbHVlU2l6ZSA9IDIgKiBzaXplb2YoaW50MzJfdCk7CiAKLSAgICBjYXNlIEVRX1BBUkFNX0JBTkRfRlJFUV9SQU5HRToKLSAgICAgICAgcGFyYW0yID0gKnBQYXJhbVRlbXA7Ci0gICAgICAgIGlmIChwYXJhbTIgPCAwIHx8IHBhcmFtMiA+PSBGSVZFQkFORF9OVU1CQU5EUykgewotICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGlmIChwYXJhbTIgPCAwKSB7CisgICAgICAgIGNvbnN0IGludDMyX3QgYmFuZCA9IHBhcmFtc1sxXTsKKyAgICAgICAgaWYgKGJhbmQgPCAwIHx8IGJhbmQgPj0gRklWRUJBTkRfTlVNQkFORFMpIHsKKyAgICAgICAgICAgIGlmIChiYW5kIDwgMCkgewogICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzIyNDc5NDgiKTsKLSAgICAgICAgICAgICAgICBBTE9HVygiXHRFUlJPUiBFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fQkFORF9GUkVRX1JBTkdFIGJhbmQgJWQiLCBwYXJhbTIpOworICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBFUV9QQVJBTV9CQU5EX0ZSRVFfUkFOR0UgaW52YWxpZCBiYW5kICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBiYW5kKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIEVxdWFsaXplckdldEJhbmRGcmVxUmFuZ2UocENvbnRleHQsIHBhcmFtMiwgKHVpbnQzMl90ICopcFZhbHVlLCAoKHVpbnQzMl90ICopcFZhbHVlICsgMSkpOwotICAgICAgICAvL0FMT0dWKCJcdEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9CQU5EX0ZSRVFfUkFOR0UgYmFuZCAlZCwgbWluICVkLCBtYXggJWQiLAotICAgICAgICAvLyAgICAgIHBhcmFtMiwgKihpbnQzMl90ICopcFZhbHVlLCAqKChpbnQzMl90ICopcFZhbHVlICsgMSkpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgRVFfUEFSQU1fR0VUX0JBTkQ6Ci0gICAgICAgIHBhcmFtMiA9ICpwUGFyYW1UZW1wOwotICAgICAgICAqKHVpbnQxNl90ICopcFZhbHVlID0gKHVpbnQxNl90KUVxdWFsaXplckdldEJhbmQocENvbnRleHQsIHBhcmFtMik7Ci0gICAgICAgIC8vQUxPR1YoIlx0RXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0dFVF9CQU5EIGZyZXF1ZW5jeSAlZCwgYmFuZCAlZCIsCi0gICAgICAgIC8vICAgICAgcGFyYW0yLCAqKHVpbnQxNl90ICopcFZhbHVlKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVRX1BBUkFNX0NVUl9QUkVTRVQ6Ci0gICAgICAgICoodWludDE2X3QgKilwVmFsdWUgPSAodWludDE2X3QpRXF1YWxpemVyR2V0UHJlc2V0KHBDb250ZXh0KTsKLSAgICAgICAgLy9BTE9HVigiXHRFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fQ1VSX1BSRVNFVCAlZCIsICooaW50MzJfdCAqKXBWYWx1ZSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFUV9QQVJBTV9HRVRfTlVNX09GX1BSRVNFVFM6Ci0gICAgICAgICoodWludDE2X3QgKilwVmFsdWUgPSAodWludDE2X3QpRXF1YWxpemVyR2V0TnVtUHJlc2V0cygpOwotICAgICAgICAvL0FMT0dWKCJcdEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9HRVRfTlVNX09GX1BSRVNFVFMgJWQiLCAqKGludDE2X3QgKilwVmFsdWUpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgRVFfUEFSQU1fR0VUX1BSRVNFVF9OQU1FOgotICAgICAgICBwYXJhbTIgPSAqcFBhcmFtVGVtcDsKLSAgICAgICAgaWYgKChwYXJhbTIgPCAwICYmIHBhcmFtMiAhPSBQUkVTRVRfQ1VTVE9NKSB8fCAgcGFyYW0yID49IEVxdWFsaXplckdldE51bVByZXNldHMoKSkgewogICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGlmIChwYXJhbTIgPCAwKSB7Ci0gICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzMjQ0ODI1OCIpOwotICAgICAgICAgICAgICAgIEFMT0dFKCJcdEVSUk9SIEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9HRVRfUFJFU0VUX05BTUUgcHJlc2V0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBFcXVhbGl6ZXJHZXRCYW5kRnJlcVJhbmdlKHBDb250ZXh0LCBiYW5kLCAodWludDMyX3QgKilwVmFsdWUsICgodWludDMyX3QgKilwVmFsdWUgKyAxKSk7CisgICAgICAgIEFMT0dWVigiJXMgRVFfUEFSQU1fQkFORF9GUkVRX1JBTkdFIGJhbmQgJWQsIG1pbiAlZCwgbWF4ICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYmFuZCwgKihpbnQzMl90ICopcFZhbHVlLCAqKChpbnQzMl90ICopcFZhbHVlICsgMSkpOworCisgICAgfSBicmVhazsKKworICAgIGNhc2UgRVFfUEFSQU1fQ0VOVEVSX0ZSRVE6IHsKKyAgICAgICAgaWYgKHBhcmFtU2l6ZSA8IDIgKiBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9DRU5URVJfRlJFUSBpbnZhbGlkIHBhcmFtU2l6ZTogJXUiLCBfX2Z1bmNfXywgcGFyYW1TaXplKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9DRU5URVJfRlJFUSBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZihpbnQzMl90KTsKKworICAgICAgICBjb25zdCBpbnQzMl90IGJhbmQgPSBwYXJhbXNbMV07CisgICAgICAgIGlmIChiYW5kIDwgMCB8fCBiYW5kID49IEZJVkVCQU5EX05VTUJBTkRTKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgaWYgKGJhbmQgPCAwKSB7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzMjQzNjM0MSIpOworICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBFUV9QQVJBTV9DRU5URVJfRlJFUSBpbnZhbGlkIGJhbmQgJWQiLCBfX2Z1bmNfXywgYmFuZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQorICAgICAgICAqKGludDMyX3QgKilwVmFsdWUgPSBFcXVhbGl6ZXJHZXRDZW50cmVGcmVxdWVuY3kocENvbnRleHQsIGJhbmQpOworICAgICAgICBBTE9HVlYoIiVzIEVRX1BBUkFNX0NFTlRFUl9GUkVRIGJhbmQgJWQsIGZyZXF1ZW5jeSAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIGJhbmQsICooaW50MzJfdCAqKXBWYWx1ZSk7CisgICAgfSBicmVhazsKIAorICAgIGNhc2UgRVFfUEFSQU1fR0VUX1BSRVNFVF9OQU1FOiB7CisgICAgICAgIGlmIChwYXJhbVNpemUgPCAyICogc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fUFJFU0VUX05BTUUgaW52YWxpZCBwYXJhbVNpemU6ICV1IiwgX19mdW5jX18sIHBhcmFtU2l6ZSk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgMSkgewotICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzc1MzY0MDciKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIG5hbWUgPSAoY2hhciAqKXBWYWx1ZTsKLSAgICAgICAgc3RybmNweShuYW1lLCBFcXVhbGl6ZXJHZXRQcmVzZXROYW1lKHBhcmFtMiksICpwVmFsdWVTaXplIC0gMSk7CisgICAgICAgIGNvbnN0IGludDMyX3QgcHJlc2V0ID0gcGFyYW1zWzFdOworICAgICAgICBpZiAoKHByZXNldCA8IDAgJiYgcHJlc2V0ICE9IFBSRVNFVF9DVVNUT00pIHx8ICBwcmVzZXQgPj0gRXF1YWxpemVyR2V0TnVtUHJlc2V0cygpKSB7CisgICAgICAgICAgICBpZiAocHJlc2V0IDwgMCkgeworICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzI0NDgyNTgiKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMgRVFfUEFSQU1fR0VUX1BSRVNFVF9OQU1FIHByZXNldCAlZCIsIF9fZnVuY19fLCBwcmVzZXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2hhciAqIGNvbnN0IG5hbWUgPSAoY2hhciAqKXBWYWx1ZTsKKyAgICAgICAgc3RybmNweShuYW1lLCBFcXVhbGl6ZXJHZXRQcmVzZXROYW1lKHByZXNldCksICpwVmFsdWVTaXplIC0gMSk7CiAgICAgICAgIG5hbWVbKnBWYWx1ZVNpemUgLSAxXSA9IDA7CiAgICAgICAgICpwVmFsdWVTaXplID0gc3RybGVuKG5hbWUpICsgMTsKLSAgICAgICAgLy9BTE9HVigiXHRFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fR0VUX1BSRVNFVF9OQU1FIHByZXNldCAlZCwgbmFtZSAlcyBsZW4gJWQiLAotICAgICAgICAvLyAgICAgIHBhcmFtMiwgZ0VxdWFsaXplclByZXNldHNbcGFyYW0yXS5uYW1lLCAqcFZhbHVlU2l6ZSk7Ci0gICAgICAgIGJyZWFrOworICAgICAgICBBTE9HVlYoIiVzIEVRX1BBUkFNX0dFVF9QUkVTRVRfTkFNRSBwcmVzZXQgJWQsIG5hbWUgJXMgbGVuICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcHJlc2V0LCBnRXF1YWxpemVyUHJlc2V0c1twcmVzZXRdLm5hbWUsICpwVmFsdWVTaXplKTsKKworICAgIH0gYnJlYWs7CiAKICAgICBjYXNlIEVRX1BBUkFNX1BST1BFUlRJRVM6IHsKKyAgICAgICAgY29uc3RleHByIHVpbnQzMl90IHJlcXVpcmVkVmFsdWVTaXplID0gKDIgKyBGSVZFQkFORF9OVU1CQU5EUykgKiBzaXplb2YodWludDE2X3QpOworICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCByZXF1aXJlZFZhbHVlU2l6ZSkgeworICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX1BST1BFUlRJRVMgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgKnBWYWx1ZVNpemUgPSByZXF1aXJlZFZhbHVlU2l6ZTsKKwogICAgICAgICBpbnQxNl90ICpwID0gKGludDE2X3QgKilwVmFsdWU7Ci0gICAgICAgIEFMT0dWKCJcdEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9QUk9QRVJUSUVTIik7CisgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9QUk9QRVJUSUVTIiwgX19mdW5jX18pOwogICAgICAgICBwWzBdID0gKGludDE2X3QpRXF1YWxpemVyR2V0UHJlc2V0KHBDb250ZXh0KTsKICAgICAgICAgcFsxXSA9IChpbnQxNl90KUZJVkVCQU5EX05VTUJBTkRTOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKQEAgLTI0NjAsMTIgKzI3MjcsMTIgQEAKICAgICB9IGJyZWFrOwogCiAgICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogRXF1YWxpemVyX2dldFBhcmFtZXRlcigpIGludmFsaWQgcGFyYW0gJWQiLCBwYXJhbSk7CisgICAgICAgIEFMT0dWKCIlcyBpbnZhbGlkIHBhcmFtICVkIiwgX19mdW5jX18sIHBhcmFtc1swXSk7CiAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CiAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIC8vR1YoIlx0RXF1YWxpemVyX2dldFBhcmFtZXRlciBlbmRcbiIpOworICAgIEFMT0dWVigiJXMgZW5kIHBhcmFtOiAlZCwgc3RhdHVzOiAlZCIsIF9fZnVuY19fLCBwYXJhbXNbMF0sIHN0YXR1cyk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0gLyogZW5kIEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIgKi8KIApAQCAtMjQ4NSw3NCArMjc1Miw4OSBAQAogLy8gT3V0cHV0czoKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludCBFcXVhbGl6ZXJfc2V0UGFyYW1ldGVyIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBWYWx1ZSkgeworaW50IEVxdWFsaXplcl9zZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBwYXJhbVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICB2YWx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpIHsKICAgICBpbnQgc3RhdHVzID0gMDsKLSAgICBpbnQzMl90IHByZXNldDsKLSAgICBpbnQzMl90IGJhbmQ7Ci0gICAgaW50MzJfdCBsZXZlbDsKLSAgICBpbnQzMl90ICpwUGFyYW1UZW1wID0gKGludDMyX3QgKilwUGFyYW07Ci0gICAgaW50MzJfdCBwYXJhbSA9ICpwUGFyYW1UZW1wKys7CisgICAgaW50MzJfdCAqcGFyYW1zID0gKGludDMyX3QgKilwUGFyYW07CiAKKyAgICBBTE9HVlYoIiVzIHN0YXJ0IiwgX19mdW5jX18pOwogCi0gICAgLy9BTE9HVigiXHRFcXVhbGl6ZXJfc2V0UGFyYW1ldGVyIHN0YXJ0Iik7Ci0gICAgc3dpdGNoIChwYXJhbSkgewotICAgIGNhc2UgRVFfUEFSQU1fQ1VSX1BSRVNFVDoKKyAgICBpZiAocGFyYW1TaXplIDwgc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgIEFMT0dWKCIlcyBpbnZhbGlkIHBhcmFtU2l6ZTogJXUiLCBfX2Z1bmNfXywgcGFyYW1TaXplKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHN3aXRjaCAocGFyYW1zWzBdKSB7CisgICAgY2FzZSBFUV9QQVJBTV9DVVJfUFJFU0VUOiB7CiAgICAgICAgIGlmICh2YWx1ZVNpemUgPCBzaXplb2YoaW50MTZfdCkpIHsKLSAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0NVUl9QUkVTRVQgaW52YWxpZCB2YWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgdmFsdWVTaXplKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBwcmVzZXQgPSAoaW50MzJfdCkoKih1aW50MTZfdCAqKXBWYWx1ZSk7CisgICAgICAgIGNvbnN0IGludDMyX3QgcHJlc2V0ID0gKGludDMyX3QpKih1aW50MTZfdCAqKXBWYWx1ZTsKIAotICAgICAgICAvL0FMT0dWKCJcdEVxdWFsaXplcl9zZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9DVVJfUFJFU0VUICVkIiwgcHJlc2V0KTsKLSAgICAgICAgaWYgKChwcmVzZXQgPj0gRXF1YWxpemVyR2V0TnVtUHJlc2V0cygpKXx8KHByZXNldCA8IDApKSB7CisgICAgICAgIEFMT0dWVigiJXMgRVFfUEFSQU1fQ1VSX1BSRVNFVCAlZCIsIF9fZnVuY19fLCBwcmVzZXQpOworICAgICAgICBpZiAocHJlc2V0ID49IEVxdWFsaXplckdldE51bVByZXNldHMoKSB8fCBwcmVzZXQgPCAwKSB7CisgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fQ1VSX1BSRVNFVCBpbnZhbGlkIHByZXNldCAlZCIsIF9fZnVuY19fLCBwcmVzZXQpOwogICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIEVxdWFsaXplclNldFByZXNldChwQ29udGV4dCwgcHJlc2V0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBFUV9QQVJBTV9CQU5EX0xFVkVMOgotICAgICAgICBpZiAodmFsdWVTaXplIDwgc2l6ZW9mKGludDE2X3QpKSB7Ci0gICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBiYW5kID0gICpwUGFyYW1UZW1wOwotICAgICAgICBsZXZlbCA9IChpbnQzMl90KSgqKGludDE2X3QgKilwVmFsdWUpOwotICAgICAgICAvL0FMT0dWKCJcdEVxdWFsaXplcl9zZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9CQU5EX0xFVkVMIGJhbmQgJWQsIGxldmVsICVkIiwgYmFuZCwgbGV2ZWwpOwotICAgICAgICBpZiAoYmFuZCA8IDAgfHwgYmFuZCA+PSBGSVZFQkFORF9OVU1CQU5EUykgeworICAgIH0gYnJlYWs7CisKKyAgICBjYXNlIEVRX1BBUkFNX0JBTkRfTEVWRUw6IHsKKyAgICAgICAgaWYgKHBhcmFtU2l6ZSA8IDIgKiBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9CQU5EX0xFVkVMIGludmFsaWQgcGFyYW1TaXplOiAldSIsIF9fZnVuY19fLCBwYXJhbVNpemUpOwogICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZVNpemUgPCBzaXplb2YoaW50MTZfdCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9CQU5EX0xFVkVMIGludmFsaWQgdmFsdWVTaXplICV1IiwgX19mdW5jX18sIHZhbHVlU2l6ZSk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgaW50MzJfdCBiYW5kID0gIHBhcmFtc1sxXTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBsZXZlbCA9IChpbnQzMl90KSooaW50MTZfdCAqKXBWYWx1ZTsKKyAgICAgICAgQUxPR1ZWKCIlcyBFUV9QQVJBTV9CQU5EX0xFVkVMIGJhbmQgJWQsIGxldmVsICVkIiwgX19mdW5jX18sIGJhbmQsIGxldmVsKTsKKyAgICAgICAgaWYgKGJhbmQgPCAwIHx8IGJhbmQgPj0gRklWRUJBTkRfTlVNQkFORFMpIHsKICAgICAgICAgICAgIGlmIChiYW5kIDwgMCkgewogICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzIwOTU2MjYiKTsKLSAgICAgICAgICAgICAgICBBTE9HRSgiXHRFUlJPUiBFcXVhbGl6ZXJfc2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fQkFORF9MRVZFTCBiYW5kICVkIiwgYmFuZCk7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzIEVRX1BBUkFNX0JBTkRfTEVWRUwgaW52YWxpZCBiYW5kICVkIiwgX19mdW5jX18sIGJhbmQpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIEVxdWFsaXplclNldEJhbmRMZXZlbChwQ29udGV4dCwgYmFuZCwgbGV2ZWwpOwotICAgICAgICBicmVhazsKKyAgICB9IGJyZWFrOworCiAgICAgY2FzZSBFUV9QQVJBTV9QUk9QRVJUSUVTOiB7Ci0gICAgICAgIC8vQUxPR1YoIlx0RXF1YWxpemVyX3NldFBhcmFtZXRlcigpIEVRX1BBUkFNX1BST1BFUlRJRVMiKTsKKyAgICAgICAgQUxPR1ZWKCIlcyBFUV9QQVJBTV9QUk9QRVJUSUVTIiwgX19mdW5jX18pOwogICAgICAgICBpZiAodmFsdWVTaXplIDwgc2l6ZW9mKGludDE2X3QpKSB7Ci0gICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9QUk9QRVJUSUVTIGludmFsaWQgdmFsdWVTaXplICV1IiwgX19mdW5jX18sIHZhbHVlU2l6ZSk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgaW50MTZfdCAqcCA9IChpbnQxNl90ICopcFZhbHVlOwogICAgICAgICBpZiAoKGludClwWzBdID49IEVxdWFsaXplckdldE51bVByZXNldHMoKSkgeworICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX1BST1BFUlRJRVMgaW52YWxpZCBwcmVzZXQgJWQiLCBfX2Z1bmNfXywgKGludClwWzBdKTsKICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBpZiAocFswXSA+PSAwKSB7CiAgICAgICAgICAgICBFcXVhbGl6ZXJTZXRQcmVzZXQocENvbnRleHQsIChpbnQpcFswXSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAodmFsdWVTaXplIDwgKDIgKyBGSVZFQkFORF9OVU1CQU5EUykgKiBzaXplb2YoaW50MTZfdCkpIHsKKyAgICAgICAgICAgIGNvbnN0ZXhwciB1aW50MzJfdCB2YWx1ZVNpemVSZXF1aXJlZCA9ICgyICsgRklWRUJBTkRfTlVNQkFORFMpICogc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgaWYgKHZhbHVlU2l6ZSA8IHZhbHVlU2l6ZVJlcXVpcmVkKSB7CiAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzc1NjMzNzEiKTsKLSAgICAgICAgICAgICAgQUxPR0UoIlx0RVJST1IgRXF1YWxpemVyX3NldFBhcmFtZXRlcigpIEVRX1BBUkFNX1BST1BFUlRJRVMgdmFsdWVTaXplICVkIDwgJWQiLAotICAgICAgICAgICAgICAgICAgICAoaW50KXZhbHVlU2l6ZSwgKGludCkoKDIgKyBGSVZFQkFORF9OVU1CQU5EUykgKiBzaXplb2YoaW50MTZfdCkpKTsKKyAgICAgICAgICAgICAgQUxPR0UoIiVzIEVRX1BBUkFNX1BST1BFUlRJRVMgaW52YWxpZCB2YWx1ZVNpemUgJXUgPCAldSIsCisgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHZhbHVlU2l6ZSwgdmFsdWVTaXplUmVxdWlyZWQpOwogICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwogICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICgoaW50KXBbMV0gIT0gRklWRUJBTkRfTlVNQkFORFMpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fUFJPUEVSVElFUyBpbnZhbGlkIGJhbmRzICVkIiwgX19mdW5jX18sIChpbnQpcFsxXSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTI1NjEsMTMgKzI4NDMsMTQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gYnJlYWs7CisKICAgICBkZWZhdWx0OgotICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBFcXVhbGl6ZXJfc2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwYXJhbSAlZCIsIHBhcmFtKTsKKyAgICAgICAgQUxPR1YoIiVzIGludmFsaWQgcGFyYW0gJWQiLCBfX2Z1bmNfXywgcGFyYW1zWzBdKTsKICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgLy9BTE9HVigiXHRFcXVhbGl6ZXJfc2V0UGFyYW1ldGVyIGVuZCIpOworICAgIEFMT0dWVigiJXMgZW5kIHBhcmFtOiAlZCwgc3RhdHVzOiAlZCIsIF9fZnVuY19fLCBwYXJhbXNbMF0sIHN0YXR1cyk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0gLyogZW5kIEVxdWFsaXplcl9zZXRQYXJhbWV0ZXIgKi8KIApAQCAtMjU5Miw3OSArMjg3NSw5MiBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQgVm9sdW1lX2dldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0ICAgICAqcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAqcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgKnBWYWx1ZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAqcFZhbHVlKXsKK2ludCBWb2x1bWVfZ2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgcGFyYW1TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBWYWx1ZSkgewogICAgIGludCBzdGF0dXMgPSAwOwotICAgIGludDMyX3QgKnBQYXJhbVRlbXAgPSAoaW50MzJfdCAqKXBQYXJhbTsKLSAgICBpbnQzMl90IHBhcmFtID0gKnBQYXJhbVRlbXArKzs7CisgICAgaW50MzJfdCAqcGFyYW1zID0gKGludDMyX3QgKilwUGFyYW07CiAKLSAgICAvL0FMT0dWKCJcdFZvbHVtZV9nZXRQYXJhbWV0ZXIgc3RhcnQiKTsKKyAgICBBTE9HVlYoIiVzIHN0YXJ0IiwgX19mdW5jX18pOwogCi0gICAgc3dpdGNoIChwYXJhbSl7CisgICAgaWYgKHBhcmFtU2l6ZSA8IHNpemVvZihpbnQzMl90KSkgeworICAgICAgICBBTE9HVigiJXMgaW52YWxpZCBwYXJhbVNpemU6ICV1IiwgX19mdW5jX18sIHBhcmFtU2l6ZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBzd2l0Y2ggKHBhcmFtc1swXSkgewogICAgICAgICBjYXNlIFZPTFVNRV9QQVJBTV9MRVZFTDoKLSAgICAgICAgY2FzZSBWT0xVTUVfUEFSQU1fTUFYTEVWRUw6Ci0gICAgICAgIGNhc2UgVk9MVU1FX1BBUkFNX1NURVJFT1BPU0lUSU9OOgotICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSl7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogVm9sdW1lX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZSAxICAlZCIsICpwVmFsdWVTaXplKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpIHsgLy8gbGVnYWN5OiBjaGVjayBlcXVhbGl0eSBoZXJlLgorICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBWT0xVTUVfUEFSQU1fTEVWRUwgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBzZXQgKnBWYWx1ZVNpemUKKworICAgICAgICAgICAgc3RhdHVzID0gVm9sdW1lR2V0Vm9sdW1lTGV2ZWwocENvbnRleHQsIChpbnQxNl90ICopKHBWYWx1ZSkpOworICAgICAgICAgICAgQUxPR1ZWKCIlcyBWT0xVTUVfUEFSQU1fTEVWRUwgJWQiLCBfX2Z1bmNfXywgKihpbnQxNl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVk9MVU1FX1BBUkFNX01BWExFVkVMOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSkgeyAvLyBsZWdhY3k6IGNoZWNrIGVxdWFsaXR5IGhlcmUuCisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIFZPTFVNRV9QQVJBTV9NQVhMRVZFTCBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBzZXQgKnBWYWx1ZVNpemUKKworICAgICAgICAgICAgLy8gaW4gbWlsbGliZWwKKyAgICAgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IDA7CisgICAgICAgICAgICBBTE9HVlYoIiVzIFZPTFVNRV9QQVJBTV9NQVhMRVZFTCAlZCIsIF9fZnVuY19fLCAqKGludDE2X3QgKilwVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBWT0xVTUVfUEFSQU1fU1RFUkVPUE9TSVRJT046CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKSB7IC8vIGxlZ2FjeTogY2hlY2sgZXF1YWxpdHkgaGVyZS4KKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgVk9MVU1FX1BBUkFNX1NURVJFT1BPU0lUSU9OIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBzZXQgKnBWYWx1ZVNpemUKKworICAgICAgICAgICAgVm9sdW1lR2V0U3RlcmVvUG9zaXRpb24ocENvbnRleHQsIChpbnQxNl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgVk9MVU1FX1BBUkFNX1NURVJFT1BPU0lUSU9OICVkIiwgX19mdW5jX18sICooaW50MTZfdCAqKXBWYWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIFZPTFVNRV9QQVJBTV9NVVRFOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKHVpbnQzMl90KSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBWT0xVTUVfUEFSQU1fTVVURSBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YodWludDMyX3QpOworCisgICAgICAgICAgICBzdGF0dXMgPSBWb2x1bWVHZXRNdXRlKHBDb250ZXh0LCAodWludDMyX3QgKilwVmFsdWUpOworICAgICAgICAgICAgQUxPR1YoIiVzIFZPTFVNRV9QQVJBTV9NVVRFICV1IiwgX19mdW5jX18sICoodWludDMyX3QgKilwVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgY2FzZSBWT0xVTUVfUEFSQU1fRU5BQkxFU1RFUkVPUE9TSVRJT046Ci0gICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YoaW50MzJfdCkpewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFZvbHVtZV9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBWYWx1ZVNpemUgMiAgJWQiLCAqcFZhbHVlU2l6ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgVk9MVU1FX1BBUkFNX0VOQUJMRVNURVJFT1BPU0lUSU9OIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YoaW50MzJfdCk7Ci0gICAgICAgICAgICBicmVhazsKIAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogVm9sdW1lX2dldFBhcmFtZXRlciB1bmtub3duIHBhcmFtICVkIiwgcGFyYW0pOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgc3dpdGNoIChwYXJhbSl7Ci0gICAgICAgIGNhc2UgVk9MVU1FX1BBUkFNX0xFVkVMOgotICAgICAgICAgICAgc3RhdHVzID0gVm9sdW1lR2V0Vm9sdW1lTGV2ZWwocENvbnRleHQsIChpbnQxNl90ICopKHBWYWx1ZSkpOwotICAgICAgICAgICAgLy9BTE9HVigiXHRWb2x1bWVfZ2V0UGFyYW1ldGVyKCkgVk9MVU1FX1BBUkFNX0xFVkVMIFZhbHVlIGlzICVkIiwKLSAgICAgICAgICAgIC8vICAgICAgICAqKGludDE2X3QgKilwVmFsdWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBWT0xVTUVfUEFSQU1fTUFYTEVWRUw6Ci0gICAgICAgICAgICAqKGludDE2X3QgKilwVmFsdWUgPSAwOwotICAgICAgICAgICAgLy9BTE9HVigiXHRWb2x1bWVfZ2V0UGFyYW1ldGVyKCkgVk9MVU1FX1BBUkFNX01BWExFVkVMIFZhbHVlIGlzICVkIiwKLSAgICAgICAgICAgIC8vICAgICAgICAqKGludDE2X3QgKilwVmFsdWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBWT0xVTUVfUEFSQU1fU1RFUkVPUE9TSVRJT046Ci0gICAgICAgICAgICBWb2x1bWVHZXRTdGVyZW9Qb3NpdGlvbihwQ29udGV4dCwgKGludDE2X3QgKilwVmFsdWUpOwotICAgICAgICAgICAgLy9BTE9HVigiXHRWb2x1bWVfZ2V0UGFyYW1ldGVyKCkgVk9MVU1FX1BBUkFNX1NURVJFT1BPU0lUSU9OIFZhbHVlIGlzICVkIiwKLSAgICAgICAgICAgIC8vICAgICAgICAqKGludDE2X3QgKilwVmFsdWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBWT0xVTUVfUEFSQU1fTVVURToKLSAgICAgICAgICAgIHN0YXR1cyA9IFZvbHVtZUdldE11dGUocENvbnRleHQsICh1aW50MzJfdCAqKXBWYWx1ZSk7Ci0gICAgICAgICAgICBBTE9HVigiXHRWb2x1bWVfZ2V0UGFyYW1ldGVyKCkgVk9MVU1FX1BBUkFNX01VVEUgVmFsdWUgaXMgJWQiLAotICAgICAgICAgICAgICAgICAgICAqKHVpbnQzMl90ICopcFZhbHVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVk9MVU1FX1BBUkFNX0VOQUJMRVNURVJFT1BPU0lUSU9OOgogICAgICAgICAgICAgKihpbnQzMl90ICopcFZhbHVlID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlN0ZXJlb1Bvc2l0aW9uRW5hYmxlZDsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0Vm9sdW1lX2dldFBhcmFtZXRlcigpIFZPTFVNRV9QQVJBTV9FTkFCTEVTVEVSRU9QT1NJVElPTiBWYWx1ZSBpcyAlZCIsCi0gICAgICAgICAgICAvLyAgICAgICAgKih1aW50MzJfdCAqKXBWYWx1ZSk7CisgICAgICAgICAgICBBTE9HVlYoIiVzIFZPTFVNRV9QQVJBTV9FTkFCTEVTVEVSRU9QT1NJVElPTiAlZCIsIF9fZnVuY19fLCAqKGludDMyX3QgKilwVmFsdWUpOworCiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogVm9sdW1lX2dldFBhcmFtZXRlcigpIGludmFsaWQgcGFyYW0gJWQiLCBwYXJhbSk7CisgICAgICAgICAgICBBTE9HVigiJXMgaW52YWxpZCBwYXJhbSAlZCIsIF9fZnVuY19fLCBwYXJhbXNbMF0pOwogICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIC8vQUxPR1YoIlx0Vm9sdW1lX2dldFBhcmFtZXRlciBlbmQiKTsKKyAgICBBTE9HVlYoIiVzIGVuZCBwYXJhbTogJWQsIHN0YXR1czogJWQiLCBfX2Z1bmNfXywgcGFyYW1zWzBdLCBzdGF0dXMpOwogICAgIHJldHVybiBzdGF0dXM7CiB9IC8qIGVuZCBWb2x1bWVfZ2V0UGFyYW1ldGVyICovCiAKQEAgLTI2ODQsNTUgKzI5ODAsODcgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50IFZvbHVtZV9zZXRQYXJhbWV0ZXIgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCB2b2lkICpwUGFyYW0sIHZvaWQgKnBWYWx1ZSl7Ci0gICAgaW50ICAgICAgc3RhdHVzID0gMDsKLSAgICBpbnQxNl90ICBsZXZlbDsKLSAgICBpbnQxNl90ICBwb3NpdGlvbjsKLSAgICB1aW50MzJfdCBtdXRlOwotICAgIHVpbnQzMl90IHBvc2l0aW9uRW5hYmxlZDsKLSAgICBpbnQzMl90ICpwUGFyYW1UZW1wID0gKGludDMyX3QgKilwUGFyYW07Ci0gICAgaW50MzJfdCBwYXJhbSA9ICpwUGFyYW1UZW1wKys7CitpbnQgVm9sdW1lX3NldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHBhcmFtU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBWYWx1ZSkgeworICAgIGludCBzdGF0dXMgPSAwOworICAgIGludDMyX3QgKnBhcmFtcyA9IChpbnQzMl90ICopcFBhcmFtOwogCi0gICAgLy9BTE9HVigiXHRWb2x1bWVfc2V0UGFyYW1ldGVyIHN0YXJ0Iik7CisgICAgQUxPR1ZWKCIlcyBzdGFydCIsIF9fZnVuY19fKTsKIAotICAgIHN3aXRjaCAocGFyYW0pewotICAgICAgICBjYXNlIFZPTFVNRV9QQVJBTV9MRVZFTDoKLSAgICAgICAgICAgIGxldmVsID0gKihpbnQxNl90ICopcFZhbHVlOwotICAgICAgICAgICAgLy9BTE9HVigiXHRWb2x1bWVfc2V0UGFyYW1ldGVyKCkgVk9MVU1FX1BBUkFNX0xFVkVMIHZhbHVlIGlzICVkIiwgbGV2ZWwpOwotICAgICAgICAgICAgLy9BTE9HVigiXHRWb2x1bWVfc2V0UGFyYW1ldGVyKCkgQ2FsbGluZyBwVm9sdW1lLT5zZXRWb2x1bWVMZXZlbCIpOwotICAgICAgICAgICAgc3RhdHVzID0gVm9sdW1lU2V0Vm9sdW1lTGV2ZWwocENvbnRleHQsIChpbnQxNl90KWxldmVsKTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0Vm9sdW1lX3NldFBhcmFtZXRlcigpIENhbGxlZCBwVm9sdW1lLT5zZXRWb2x1bWVMZXZlbCIpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgaWYgKHBhcmFtU2l6ZSA8IHNpemVvZihpbnQzMl90KSkgeworICAgICAgICBBTE9HVigiJXMgaW52YWxpZCBwYXJhbVNpemU6ICV1IiwgX19mdW5jX18sIHBhcmFtU2l6ZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBzd2l0Y2ggKHBhcmFtc1swXSkgeworICAgICAgICBjYXNlIFZPTFVNRV9QQVJBTV9MRVZFTDogeworICAgICAgICAgICAgaWYgKHZhbHVlU2l6ZSA8IHNpemVvZihpbnQxNl90KSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBWT0xVTUVfUEFSQU1fTEVWRUwgaW52YWxpZCB2YWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgdmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogCi0gICAgICAgIGNhc2UgVk9MVU1FX1BBUkFNX01VVEU6Ci0gICAgICAgICAgICBtdXRlID0gKih1aW50MzJfdCAqKXBWYWx1ZTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0Vm9sdW1lX3NldFBhcmFtZXRlcigpIENhbGxpbmcgcFZvbHVtZS0+c2V0TXV0ZSwgbXV0ZSBpcyAlZCIsIG11dGUpOwotICAgICAgICAgICAgLy9BTE9HVigiXHRWb2x1bWVfc2V0UGFyYW1ldGVyKCkgQ2FsbGluZyBwVm9sdW1lLT5zZXRNdXRlIik7CisgICAgICAgICAgICBjb25zdCBpbnQxNl90IGxldmVsID0gKihpbnQxNl90ICopcFZhbHVlOworICAgICAgICAgICAgQUxPR1ZWKCIlcyBWT0xVTUVfUEFSQU1fTEVWRUwgJWQiLCBfX2Z1bmNfXywgbGV2ZWwpOworICAgICAgICAgICAgQUxPR1ZWKCIlcyBWT0xVTUVfUEFSQU1fTEVWRUwgQ2FsbGluZyBWb2x1bWVTZXRWb2x1bWVMZXZlbCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFZvbHVtZVNldFZvbHVtZUxldmVsKHBDb250ZXh0LCBsZXZlbCk7CisgICAgICAgICAgICBBTE9HVlYoIiVzIFZPTFVNRV9QQVJBTV9MRVZFTCBDYWxsZWQgVm9sdW1lU2V0Vm9sdW1lTGV2ZWwiLCBfX2Z1bmNfXyk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBWT0xVTUVfUEFSQU1fTVVURTogeworICAgICAgICAgICAgaWYgKHZhbHVlU2l6ZSA8IHNpemVvZih1aW50MzJfdCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgVk9MVU1FX1BBUkFNX01VVEUgaW52YWxpZCB2YWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgdmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjY0NDc3MjE3Iik7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgbXV0ZSA9ICoodWludDMyX3QgKilwVmFsdWU7CisgICAgICAgICAgICBBTE9HVlYoIiVzIFZPTFVNRV9QQVJBTV9NVVRFICVkIiwgX19mdW5jX18sIG11dGUpOworICAgICAgICAgICAgQUxPR1ZWKCIlcyBWT0xVTUVfUEFSQU1fTVVURSBDYWxsaW5nIFZvbHVtZVNldE11dGUiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICBzdGF0dXMgPSBWb2x1bWVTZXRNdXRlKHBDb250ZXh0LCBtdXRlKTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0Vm9sdW1lX3NldFBhcmFtZXRlcigpIENhbGxlZCBwVm9sdW1lLT5zZXRNdXRlIik7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgVk9MVU1FX1BBUkFNX01VVEUgQ2FsbGVkIFZvbHVtZVNldE11dGUiLCBfX2Z1bmNfXyk7CisgICAgICAgIH0gYnJlYWs7CiAKLSAgICAgICAgY2FzZSBWT0xVTUVfUEFSQU1fRU5BQkxFU1RFUkVPUE9TSVRJT046Ci0gICAgICAgICAgICBwb3NpdGlvbkVuYWJsZWQgPSAqKHVpbnQzMl90ICopcFZhbHVlOwotICAgICAgICAgICAgKHZvaWQpIFZvbHVtZUVuYWJsZVN0ZXJlb1Bvc2l0aW9uKHBDb250ZXh0LCBwb3NpdGlvbkVuYWJsZWQpOwotICAgICAgICAgICAgKHZvaWQpIFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uKHBDb250ZXh0LCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkKTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0Vm9sdW1lX3NldFBhcmFtZXRlcigpIFZPTFVNRV9QQVJBTV9FTkFCTEVTVEVSRU9QT1NJVElPTiBjYWxsZWQiKTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZPTFVNRV9QQVJBTV9FTkFCTEVTVEVSRU9QT1NJVElPTjogeworICAgICAgICAgICAgaWYgKHZhbHVlU2l6ZSA8IHNpemVvZih1aW50MzJfdCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgVk9MVU1FX1BBUkFNX0VOQUJMRVNURVJFT1BPU0lUSU9OIGludmFsaWQgdmFsdWVTaXplICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB2YWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBWT0xVTUVfUEFSQU1fU1RFUkVPUE9TSVRJT046Ci0gICAgICAgICAgICBwb3NpdGlvbiA9ICooaW50MTZfdCAqKXBWYWx1ZTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0Vm9sdW1lX3NldFBhcmFtZXRlcigpIFZPTFVNRV9QQVJBTV9TVEVSRU9QT1NJVElPTiB2YWx1ZSBpcyAlZCIsIHBvc2l0aW9uKTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0Vm9sdW1lX3NldFBhcmFtZXRlcigpIENhbGxpbmcgcFZvbHVtZS0+Vm9sdW1lU2V0U3RlcmVvUG9zaXRpb24iKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uKHBDb250ZXh0LCAoaW50MTZfdClwb3NpdGlvbik7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdFZvbHVtZV9zZXRQYXJhbWV0ZXIoKSBDYWxsZWQgcFZvbHVtZS0+Vm9sdW1lU2V0U3RlcmVvUG9zaXRpb24iKTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgcG9zaXRpb25FbmFibGVkID0gKih1aW50MzJfdCAqKXBWYWx1ZTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFZvbHVtZUVuYWJsZVN0ZXJlb1Bvc2l0aW9uKHBDb250ZXh0LCBwb3NpdGlvbkVuYWJsZWQpCisgICAgICAgICAgICAgICAgICAgID86IFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uKHBDb250ZXh0LCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkKTsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgVk9MVU1FX1BBUkFNX0VOQUJMRVNURVJFT1BPU0lUSU9OIGNhbGxlZCIsIF9fZnVuY19fKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIFZPTFVNRV9QQVJBTV9TVEVSRU9QT1NJVElPTjogeworICAgICAgICAgICAgaWYgKHZhbHVlU2l6ZSA8IHNpemVvZihpbnQxNl90KSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBWT0xVTUVfUEFSQU1fU1RFUkVPUE9TSVRJT04gaW52YWxpZCB2YWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgdmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25zdCBpbnQxNl90IHBvc2l0aW9uID0gKihpbnQxNl90ICopcFZhbHVlOworICAgICAgICAgICAgQUxPR1ZWKCIlcyBWT0xVTUVfUEFSQU1fU1RFUkVPUE9TSVRJT04gJWQiLCBfX2Z1bmNfXywgcG9zaXRpb24pOworICAgICAgICAgICAgQUxPR1ZWKCIlcyBWT0xVTUVfUEFSQU1fU1RFUkVPUE9TSVRJT04gQ2FsbGluZyBWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uKHBDb250ZXh0LCBwb3NpdGlvbik7CisgICAgICAgICAgICBBTE9HVlYoIiVzIFZPTFVNRV9QQVJBTV9TVEVSRU9QT1NJVElPTiBDYWxsZWQgVm9sdW1lU2V0U3RlcmVvUG9zaXRpb24iLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7CisgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFZvbHVtZV9zZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBhcmFtICVkIiwgcGFyYW0pOworICAgICAgICAgICAgQUxPR1YoIiVzIGludmFsaWQgcGFyYW0gJWQiLCBfX2Z1bmNfXywgcGFyYW1zWzBdKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICAvL0FMT0dWKCJcdFZvbHVtZV9zZXRQYXJhbWV0ZXIgZW5kIik7CisgICAgQUxPR1ZWKCIlcyBlbmQgcGFyYW06ICVkLCBzdGF0dXM6ICVkIiwgX19mdW5jX18sIHBhcmFtc1swXSwgc3RhdHVzKTsKICAgICByZXR1cm4gc3RhdHVzOwogfSAvKiBlbmQgVm9sdW1lX3NldFBhcmFtZXRlciAqLwogCkBAIC0zMDUwLDYgKzMzNzgsMTMgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfSAgIC8qIGVuZCBFZmZlY3RfcHJvY2VzcyAqLwogCisvLyBUaGUgdmFsdWUgb2Zmc2V0IG9mIGFuIGVmZmVjdCBwYXJhbWV0ZXIgaXMgY29tcHV0ZWQgYnkgcm91bmRpbmcgdXAKKy8vIHRoZSBwYXJhbWV0ZXIgc2l6ZSB0byB0aGUgbmV4dCAzMiBiaXQgYWxpZ25tZW50Lgorc3RhdGljIGlubGluZSB1aW50MzJfdCBjb21wdXRlUGFyYW1WT2Zmc2V0KGNvbnN0IGVmZmVjdF9wYXJhbV90ICpwKSB7CisgICAgcmV0dXJuICgocC0+cHNpemUgKyBzaXplb2YoaW50MzJfdCkgLSAxKSAvIHNpemVvZihpbnQzMl90KSkgKgorICAgICAgICAgICAgc2l6ZW9mKGludDMyX3QpOworfQorCiAvKiBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb246IENvbW1hbmQgKi8KIGludCBFZmZlY3RfY29tbWFuZChlZmZlY3RfaGFuZGxlX3QgIHNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIGNtZENvZGUsCkBAIC0zMTYwLDggKzM0OTUsNyBAQAogICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEVGRkVDVF9DTURfR0VUX1BBUkFNOiBwc2l6ZSB0b28gYmlnIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB1aW50MzJfdCBwYWRkZWRQYXJhbVNpemUgPSAoKHAtPnBzaXplICsgc2l6ZW9mKGludDMyX3QpIC0gMSkgLyBzaXplb2YoaW50MzJfdCkpICoKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludDMyX3QpOworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgcGFkZGVkUGFyYW1TaXplID0gY29tcHV0ZVBhcmFtVk9mZnNldChwKTsKICAgICAgICAgICAgIGlmICgoRUZGRUNUX1BBUkFNX1NJWkVfTUFYIC0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSA8IHBhZGRlZFBhcmFtU2l6ZSkgfHwKICAgICAgICAgICAgICAgICAoRUZGRUNUX1BBUkFNX1NJWkVfTUFYIC0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSAtIHBhZGRlZFBhcmFtU2l6ZSA8CiAgICAgICAgICAgICAgICAgICAgIHAtPnZzaXplKSkgewpAQCAtMzE4Myw2ICszNTE3LDcgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHZvZmZzZXQgPSBwYWRkZWRQYXJhbVNpemU7CiAgICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCl7CiAgICAgICAgICAgICAgICAgcC0+c3RhdHVzID0gYW5kcm9pZDo6QmFzc0Jvb3N0X2dldFBhcmFtZXRlcihwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLT52c2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKQEAgLTMxOTUsNiArMzUzMCw3IEBACiAKICAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUil7CiAgICAgICAgICAgICAgICAgcC0+c3RhdHVzID0gYW5kcm9pZDo6VmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5wc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwLT5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcC0+dnNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKQEAgLTMyMDksNiArMzU0NSw3IEBACiAgICAgICAgICAgICAgICAgLy9BTE9HVigiXHRFcXVhbGl6ZXJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKICAgICAgICAgICAgICAgICAvLyAgICAgICAgIkVGRkVDVF9DTURfR0VUX1BBUkFNIHN0YXJ0Iik7CiAgICAgICAgICAgICAgICAgcC0+c3RhdHVzID0gYW5kcm9pZDo6RXF1YWxpemVyX2dldFBhcmFtZXRlcihwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLT52c2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKQEAgLTMyMjMsNiArMzU2MCw3IEBACiAgICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVk9MVU1FKXsKICAgICAgICAgICAgICAgICAvL0FMT0dWKCJcdFZvbHVtZV9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9HRVRfUEFSQU0gc3RhcnQiKTsKICAgICAgICAgICAgICAgICBwLT5zdGF0dXMgPSBhbmRyb2lkOjpWb2x1bWVfZ2V0UGFyYW1ldGVyKHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+cHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXAtPmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcC0+dnNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgdm9mZnNldCk7CkBAIC0zMjUyLDEzICszNTkwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU06IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcCA9IChlZmZlY3RfcGFyYW1fdCAqKSBwQ21kRGF0YTsKIAotICAgICAgICAgICAgICAgIGlmIChwLT5wc2l6ZSAhPSBzaXplb2YoaW50MzJfdCkpewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBCYXNzQm9vc3RfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU06IEVSUk9SLCBwc2l6ZSBpcyBub3Qgc2l6ZW9mKGludDMyX3QpIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqIGNvbnN0IHAgPSAoZWZmZWN0X3BhcmFtX3QgKikgcENtZERhdGE7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgdm9mZnNldCA9IGNvbXB1dGVQYXJhbVZPZmZzZXQocCk7CiAKICAgICAgICAgICAgICAgICAvL0FMT0dWKCJcdG5CYXNzQm9vc3RfY29tbWFuZCBjbWRTaXplIGlzICVkXG4iCiAgICAgICAgICAgICAgICAgLy8gICAgICAgICJcdHNpemVvZihlZmZlY3RfcGFyYW1fdCkgaXMgICVkXG4iCkBAIC0zMjY4LDggKzM2MDIsMTAgQEAKICAgICAgICAgICAgICAgICAvLyAgICAgICAgY21kU2l6ZSwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSwgcC0+cHNpemUsIHAtPnZzaXplICk7CiAKICAgICAgICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSBhbmRyb2lkOjpCYXNzQm9vc3Rfc2V0UGFyYW1ldGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXAtPmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyBwLT5wc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5wc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHZvZmZzZXQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKXsKICAgICAgICAgICAgICAgLy8gV2FybmluZyB0aGlzIGxvZyB3aWxsIGZhaWwgdG8gcHJvcGVybHkgcmVhZCBhbiBpbnQzMl90IHZhbHVlLCBhc3N1bWVzIGludDE2X3QKQEAgLTMyODcsMTMgKzM2MjMsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTTogRVJST1IiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICpwID0gKGVmZmVjdF9wYXJhbV90ICopIHBDbWREYXRhOwogCi0gICAgICAgICAgICAgICAgaWYgKHAtPnBzaXplICE9IHNpemVvZihpbnQzMl90KSl7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFZpcnR1YWxpemVyX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNOiBFUlJPUiwgcHNpemUgaXMgbm90IHNpemVvZihpbnQzMl90KSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKiBjb25zdCBwID0gKGVmZmVjdF9wYXJhbV90ICopIHBDbWREYXRhOworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHZvZmZzZXQgPSBjb21wdXRlUGFyYW1WT2Zmc2V0KHApOwogCiAgICAgICAgICAgICAgICAgLy9BTE9HVigiXHRuVmlydHVhbGl6ZXJfY29tbWFuZCBjbWRTaXplIGlzICVkXG4iCiAgICAgICAgICAgICAgICAgLy8gICAgICAgICJcdHNpemVvZihlZmZlY3RfcGFyYW1fdCkgaXMgICVkXG4iCkBAIC0zMzAzLDggKzM2MzUsMTAgQEAKICAgICAgICAgICAgICAgICAvLyAgICAgICAgY21kU2l6ZSwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSwgcC0+cHNpemUsIHAtPnZzaXplICk7CiAKICAgICAgICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSBhbmRyb2lkOjpWaXJ0dWFsaXplcl9zZXRQYXJhbWV0ZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgcC0+cHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5wc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT52c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHZvZmZzZXQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0VRVUFMSVpFUil7CiAgICAgICAgICAgICAgICAvL0FMT0dWKCJcdEVxdWFsaXplcl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgpAQCAtMzMyMCwxMiArMzY1NCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTTogRVJST1IiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICpwID0gKGVmZmVjdF9wYXJhbV90ICopIHBDbWREYXRhOworCisgICAgICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKiBjb25zdCBwID0gKGVmZmVjdF9wYXJhbV90ICopIHBDbWREYXRhOworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHZvZmZzZXQgPSBjb21wdXRlUGFyYW1WT2Zmc2V0KHApOwogCiAgICAgICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gYW5kcm9pZDo6RXF1YWxpemVyX3NldFBhcmFtZXRlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT52c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHAtPnBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+dnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgdm9mZnNldCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVk9MVU1FKXsKICAgICAgICAgICAgICAgICAvL0FMT0dWKCJcdFZvbHVtZV9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9TRVRfUEFSQU0gc3RhcnQiKTsKQEAgLTMzNDIsMTEgKzM2NzksMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU06IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcCA9IChlZmZlY3RfcGFyYW1fdCAqKSBwQ21kRGF0YTsKKworICAgICAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICogY29uc3QgcCA9IChlZmZlY3RfcGFyYW1fdCAqKSBwQ21kRGF0YTsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCB2b2Zmc2V0ID0gY29tcHV0ZVBhcmFtVk9mZnNldChwKTsKIAogICAgICAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IGFuZHJvaWQ6OlZvbHVtZV9zZXRQYXJhbWV0ZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcC0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHAtPnBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+dnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgdm9mZnNldCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9TRVRfUEFSQU0gZW5kIik7CiAgICAgICAgIH0gYnJlYWs7CkBAIC0zNDkzLDEwICszODM0LDEwIEBACiAgICAgICAgICAgICBpZihyaWdodGRCID4gbWF4ZEIpewogICAgICAgICAgICAgICAgIG1heGRCID0gcmlnaHRkQjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfVk9MVU1FIFNlc3Npb246ICVkLCBTZXNzaW9uSUQ6ICVkIFZPTFVNRSBpcyAlZCBkQiAoJWQpLCAiCisgICAgICAgICAgICAvL0FMT0dWKCJcdEVGRkVDVF9DTURfU0VUX1ZPTFVNRSBTZXNzaW9uOiAlZCwgU2Vzc2lvbklEOiAlZCBWT0xVTUUgaXMgJWQgZEIsICIKICAgICAgICAgICAgIC8vICAgICAgImVmZmVjdCBpcyAlZCIsCiAgICAgICAgICAgICAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25ObywgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbklkLAotICAgICAgICAgICAgLy8oaW50MzJfdCltYXhkQiwgbWF4Vm9sPDw3LCBwQ29udGV4dC0+RWZmZWN0VHlwZSk7CisgICAgICAgICAgICAvLyhpbnQzMl90KW1heGRCLCBwQ29udGV4dC0+RWZmZWN0VHlwZSk7CiAgICAgICAgICAgICAvL0FMT0dWKCJcdEVGRkVDVF9DTURfU0VUX1ZPTFVNRTogTGVmdCBpcyAlZCwgUmlnaHQgaXMgJWQiLCBsZWZ0Vm9sdW1lLCByaWdodFZvbHVtZSk7CiAgICAgICAgICAgICAvL0FMT0dWKCJcdEVGRkVDVF9DTURfU0VUX1ZPTFVNRTogTGVmdCAlZGRCLCBSaWdodCAlZGRCLCBQb3NpdGlvbiAlZGRCIiwKICAgICAgICAgICAgIC8vICAgICAgICBsZWZ0ZEIsIHJpZ2h0ZEIsIHBhbmRCKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKaW5kZXggZWU2MDRlYi4uMjkxMzgzYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKQEAgLTEwMyw2ICsxMDMsMTAgQEAKICAgICBGSUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICpQY21JblB0cjsKICAgICBGSUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICpQY21PdXRQdHI7CiAgICAgI2VuZGlmCisgICAgI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAqcElucHV0QnVmZmVyOworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgKnBPdXRwdXRCdWZmZXI7CisgICAgI2VuZGlmCiB9OwogCiAvKiBTZXNzaW9uQ29udGV4dCA6IE9uZSBzZXNzaW9uICovCkBAIC0yMDksNyArMjEzLDcgQEAKIHN0YXRpYyBjb25zdCBmbG9hdCBMaW1pdExldmVsX2Jhc3NCb29zdEVuZXJneUNyb3NzQ29lZmZpY2llbnRbRklWRUJBTkRfTlVNQkFORFNdID0gewogICAgICAgICAyMjEuMjEsIDIwOC4xMCwgMjguMTYsIDAuMCwgMC4wIH07CiAKLXN0YXRpYyBjb25zdCBmbG9hdCBMaW1pdExldmVsX2Jhc3NCb29zdEVuZXJneUNvZWZmaWNpZW50ID0gNy4xMjsKK3N0YXRpYyBjb25zdCBmbG9hdCBMaW1pdExldmVsX2Jhc3NCb29zdEVuZXJneUNvZWZmaWNpZW50ID0gOS4wMDsKIAogc3RhdGljIGNvbnN0IGZsb2F0IExpbWl0TGV2ZWxfdmlydHVhbGl6ZXJDb250cmlidXRpb24gPSAxLjk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCmluZGV4IDZkN2Q0Y2QuLmVlOTQwNmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcApAQCAtMTQsNyArMTQsOSBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLQorI2lmbmRlZiBMVk1fRkxPQVQKK3R5cGVkZWYgZmxvYXQgTFZNX0ZMT0FUOworI2VuZGlmCiAjZGVmaW5lIExPR19UQUcgIlJldmVyYiIKICNkZWZpbmUgQVJSQVlfU0laRShhcnJheSkgKHNpemVvZiAoYXJyYXkpIC8gc2l6ZW9mIChhcnJheSlbMF0pCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCkBAIC0xNTIsNiArMTU0LDggQEAKICAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZVJhdGU7CiAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAgICAqSW5GcmFtZXMzMjsKICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICpPdXRGcmFtZXMzMjsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclNpemVJbjsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclNpemVPdXQ7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXhpbGlhcnk7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZXQ7CiAgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICBjdXJQcmVzZXQ7CkBAIC0xNzIsOCArMTc2LDExIEBACiAKICNkZWZpbmUgUkVWRVJCX0RFRkFVTFRfUFJFU0VUIFJFVkVSQl9QUkVTRVRfTk9ORQogCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorI2RlZmluZSBSRVZFUkJfU0VORF9MRVZFTCAgIDAuNzVmIC8vIDAuNzUgaW4gNC4xMiBmb3JtYXQKKyNlbHNlCiAjZGVmaW5lIFJFVkVSQl9TRU5EX0xFVkVMICAgKDB4MEMwMCkgLy8gMC43NSBpbiA0LjEyIGZvcm1hdAorI2VuZGlmCiAjZGVmaW5lIFJFVkVSQl9VTklUX1ZPTFVNRSAgKDB4MTAwMCkgLy8gMS4wIGluIDQuMTIgZm9ybWF0CiAKIC8vLS0tIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKQEAgLTI3MCw4ICsyNzcsMTUgQEAKIAogCiAgICAgLy8gQWxsb2NhdGUgbWVtb3J5IGZvciByZXZlcmIgcHJvY2VzcyAoKjIgaXMgZm9yIFNURVJFTykKLSAgICBwQ29udGV4dC0+SW5GcmFtZXMzMiAgPSAoTFZNX0lOVDMyICopbWFsbG9jKExWUkVWX01BWF9GUkFNRV9TSVpFICogc2l6ZW9mKExWTV9JTlQzMikgKiAyKTsKLSAgICBwQ29udGV4dC0+T3V0RnJhbWVzMzIgPSAoTFZNX0lOVDMyICopbWFsbG9jKExWUkVWX01BWF9GUkFNRV9TSVpFICogc2l6ZW9mKExWTV9JTlQzMikgKiAyKTsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIHBDb250ZXh0LT5idWZmZXJTaXplSW4gPSBMVlJFVl9NQVhfRlJBTUVfU0laRSAqIHNpemVvZihmbG9hdCkgKiAyOworICAgIHBDb250ZXh0LT5idWZmZXJTaXplT3V0ID0gcENvbnRleHQtPmJ1ZmZlclNpemVJbjsKKyNlbHNlCisgICAgcENvbnRleHQtPmJ1ZmZlclNpemVJbiA9IExWUkVWX01BWF9GUkFNRV9TSVpFICogc2l6ZW9mKExWTV9JTlQzMikgKiAyOworICAgIHBDb250ZXh0LT5idWZmZXJTaXplT3V0ID0gcENvbnRleHQtPmJ1ZmZlclNpemVJbjsKKyNlbmRpZgorICAgIHBDb250ZXh0LT5JbkZyYW1lczMyICA9IChMVk1fSU5UMzIgKiltYWxsb2MocENvbnRleHQtPmJ1ZmZlclNpemVJbik7CisgICAgcENvbnRleHQtPk91dEZyYW1lczMyID0gKExWTV9JTlQzMiAqKW1hbGxvYyhwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCk7CiAKICAgICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgJXAsIHNpemUgJXp1IiwgcENvbnRleHQsIHNpemVvZihSZXZlcmJDb250ZXh0KSk7CiAgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlIGVuZFxuIik7CkBAIC0yOTMsNiArMzA3LDggQEAKICAgICAjZW5kaWYKICAgICBmcmVlKHBDb250ZXh0LT5JbkZyYW1lczMyKTsKICAgICBmcmVlKHBDb250ZXh0LT5PdXRGcmFtZXMzMik7CisgICAgcENvbnRleHQtPmJ1ZmZlclNpemVJbiA9IDA7CisgICAgcENvbnRleHQtPmJ1ZmZlclNpemVPdXQgPSAwOwogICAgIFJldmVyYl9mcmVlKHBDb250ZXh0KTsKICAgICBkZWxldGUgcENvbnRleHQ7CiAgICAgcmV0dXJuIDA7CkBAIC0zODksNiArNDA1LDQ2IEBACiB9CiAjZW5kaWYKIAorI2lmZGVmIEJVSUxEX0ZMT0FUCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gSU5UMTZMVE9GTE9BVAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBUb2RvOiBuZWVkIHRvIHdyaXRlIGZ1bmN0aW9uIGRlc2NyaXB0b3IKK3N0YXRpYyB2b2lkIEludDE2VG9GbG9hdChjb25zdCBMVk1fSU5UMTYgKnNyYywgTFZNX0ZMT0FUICpkc3QsIHNpemVfdCBuKSB7CisgICAgc2l6ZV90IGlpOworICAgIHNyYyArPSBuLTE7CisgICAgZHN0ICs9IG4tMTsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAqZHN0ID0gKChMVk1fRkxPQVQpKChMVk1fSU5UMTYpKnNyYykpIC8gMzI3NjguMGY7CisgICAgICAgIHNyYy0tOworICAgICAgICBkc3QtLTsKKyAgICB9CisgICAgcmV0dXJuOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIEZMT0FUVE9JTlQxNl9TQVQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8gVG9kbyA6IE5lZWQgdG8gd3JpdGUgZnVuY3Rpb24gZGVzY3JpcHRvcgorc3RhdGljIHZvaWQgRmxvYXRUb0ludDE2X1NBVChjb25zdCBMVk1fRkxPQVQgKnNyYywgTFZNX0lOVDE2ICpkc3QsIHNpemVfdCBuKSB7CisgICAgc2l6ZV90IGlpOworICAgIExWTV9JTlQzMiB0ZW1wOworCisgICAgZm9yIChpaSA9IDA7IGlpIDwgbjsgaWkrKykgeworICAgICAgICB0ZW1wID0gKExWTV9JTlQzMikoKCpzcmMpICogMzI3NjguMGYpOworICAgICAgICBpZiAodGVtcCA+PSAzMjc2NykgeworICAgICAgICAgICAgKmRzdCA9IDMyNzY3OworICAgICAgICB9IGVsc2UgaWYgKHRlbXAgPD0gLTMyNzY4KSB7CisgICAgICAgICAgICAqZHN0ID0gLTMyNzY4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmRzdCA9IChMVk1fSU5UMTYpdGVtcDsKKyAgICAgICAgfQorICAgICAgICBzcmMrKzsKKyAgICAgICAgZHN0Kys7CisgICAgfQorICAgIHJldHVybjsKK30KKyNlbmRpZgorCiBzdGF0aWMgaW5saW5lIGludDE2X3QgY2xhbXAxNihpbnQzMl90IHNhbXBsZSkKIHsKICAgICBpZiAoKHNhbXBsZT4+MTUpIF4gKHNhbXBsZT4+MzEpKQpAQCAtNDIyLDggKzQ3OCwzMSBAQAogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDE7CiAgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgTHZtU3RhdHVzID0gTFZSRVZfU1VDQ0VTUzsgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAgICAgTFZNX0lOVDE2ICpPdXRGcmFtZXMxNjsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwSW5wdXRCdWZmOworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwT3V0cHV0QnVmZjsKKyNlbmRpZgogCi0KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIGlmIChwQ29udGV4dC0+SW5GcmFtZXMzMiA9PSBOVUxMIHx8CisgICAgICAgICAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZUluIDwgZnJhbWVDb3VudCAqIHNpemVvZihmbG9hdCkgKiAyKSB7CisgICAgICAgIGlmIChwQ29udGV4dC0+SW5GcmFtZXMzMiAhPSBOVUxMKSB7CisgICAgICAgICAgICBmcmVlKHBDb250ZXh0LT5JbkZyYW1lczMyKTsKKyAgICAgICAgfQorICAgICAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZUluID0gZnJhbWVDb3VudCAqIHNpemVvZihmbG9hdCkgKiAyOworICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXMzMiA9IChMVk1fSU5UMzIgKiltYWxsb2MocENvbnRleHQtPmJ1ZmZlclNpemVJbik7CisgICAgfQorICAgIGlmIChwQ29udGV4dC0+T3V0RnJhbWVzMzIgPT0gTlVMTCB8fAorICAgICAgICAgICAgcENvbnRleHQtPmJ1ZmZlclNpemVPdXQgPCBmcmFtZUNvdW50ICogc2l6ZW9mKGZsb2F0KSAqIDIpIHsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5PdXRGcmFtZXMzMiAhPSBOVUxMKSB7CisgICAgICAgICAgICBmcmVlKHBDb250ZXh0LT5PdXRGcmFtZXMzMik7CisgICAgICAgIH0KKyAgICAgICAgcENvbnRleHQtPmJ1ZmZlclNpemVPdXQgPSBmcmFtZUNvdW50ICogc2l6ZW9mKGZsb2F0KSAqIDI7CisgICAgICAgIHBDb250ZXh0LT5PdXRGcmFtZXMzMiA9IChMVk1fSU5UMzIgKiltYWxsb2MocENvbnRleHQtPmJ1ZmZlclNpemVPdXQpOworICAgIH0KKyAgICBwSW5wdXRCdWZmID0gKGZsb2F0ICopcENvbnRleHQtPkluRnJhbWVzMzI7CisgICAgcE91dHB1dEJ1ZmYgPSAoZmxvYXQgKilwQ29udGV4dC0+T3V0RnJhbWVzMzI7CisjZW5kaWYKICAgICAvLyBDaGVjayB0aGF0IHRoZSBpbnB1dCBpcyBlaXRoZXIgbW9ubyBvciBzdGVyZW8KICAgICBpZiAocENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pIHsKICAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gMjsKQEAgLTQ0OSw0OSArNTI4LDg0IEBACiAgICAgICAgIFJldmVyYl9Mb2FkUHJlc2V0KHBDb250ZXh0KTsKICAgICB9CiAKLQotCiAgICAgLy8gQ29udmVydCB0byBJbnB1dCAzMiBiaXRzCiAgICAgaWYgKHBDb250ZXh0LT5hdXhpbGlhcnkpIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBJbnQxNlRvRmxvYXQocEluLCBwSW5wdXRCdWZmLCBmcmFtZUNvdW50ICogc2FtcGxlc1BlckZyYW1lKTsKKyNlbHNlCiAgICAgICAgIGZvcihpbnQgaT0wOyBpPGZyYW1lQ291bnQqc2FtcGxlc1BlckZyYW1lOyBpKyspewogICAgICAgICAgICAgcENvbnRleHQtPkluRnJhbWVzMzJbaV0gPSAoTFZNX0lOVDMyKXBJbltpXTw8ODsKICAgICAgICAgfQotICAgIH0gZWxzZSB7CisjZW5kaWYKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gaW5zZXJ0IHJldmVyYiBpbnB1dCBpcyBhbHdheXMgc3RlcmVvCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudDsgaSsrKSB7CisjaWZuZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXMzMlsyKmldID0gKHBJblsyKmldICogUkVWRVJCX1NFTkRfTEVWRUwpID4+IDQ7IC8vIDw8OCArID4+MTIKICAgICAgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lczMyWzIqaSsxXSA9IChwSW5bMippKzFdICogUkVWRVJCX1NFTkRfTEVWRUwpID4+IDQ7IC8vIDw8OCArID4+MTIKKyNlbHNlCisgICAgICAgICAgICBwSW5wdXRCdWZmWzIgKiBpXSA9IChMVk1fRkxPQVQpcEluWzIgKiBpXSAqIFJFVkVSQl9TRU5EX0xFVkVMIC8gMzI3NjguMGY7CisgICAgICAgICAgICBwSW5wdXRCdWZmWzIgKiBpICsgMV0gPSAoTFZNX0ZMT0FUKXBJblsyICogaSArIDFdICogUkVWRVJCX1NFTkRfTEVWRUwgLyAzMjc2OC4wZjsKKyNlbmRpZgogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKHBDb250ZXh0LT5wcmVzZXQgJiYgcENvbnRleHQtPmN1clByZXNldCA9PSBSRVZFUkJfUFJFU0VUX05PTkUpIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBtZW1zZXQocE91dHB1dEJ1ZmYsIDAsIGZyYW1lQ291bnQgKiBzaXplb2YoTFZNX0ZMT0FUKSAqIDIpOyAvL2Fsd2F5cyBzdGVyZW8gaGVyZQorI2Vsc2UKICAgICAgICAgbWVtc2V0KHBDb250ZXh0LT5PdXRGcmFtZXMzMiwgMCwgZnJhbWVDb3VudCAqIHNpemVvZihMVk1fSU5UMzIpICogMik7IC8vYWx3YXlzIHN0ZXJlbyBoZXJlCisjZW5kaWYKICAgICB9IGVsc2UgewogICAgICAgICBpZihwQ29udGV4dC0+YkVuYWJsZWQgPT0gTFZNX0ZBTFNFICYmIHBDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnQgPiAwKSB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgICAgIG1lbXNldChwSW5wdXRCdWZmLCAwLCBmcmFtZUNvdW50ICogc2l6ZW9mKExWTV9GTE9BVCkgKiBzYW1wbGVzUGVyRnJhbWUpOworI2Vsc2UKICAgICAgICAgICAgIG1lbXNldChwQ29udGV4dC0+SW5GcmFtZXMzMiwwLGZyYW1lQ291bnQgKiBzaXplb2YoTFZNX0lOVDMyKSAqIHNhbXBsZXNQZXJGcmFtZSk7CisjZW5kaWYKICAgICAgICAgICAgIEFMT0dWKCJcdFplcm9pbmcgJWQgc2FtcGxlcyBwZXIgZnJhbWUgYXQgdGhlIGVuZCBvZiBjYWxsIiwgc2FtcGxlc1BlckZyYW1lKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qIFByb2Nlc3MgdGhlIHNhbXBsZXMsIHByb2R1Y2luZyBhIHN0ZXJlbyBvdXRwdXQgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBMdm1TdGF0dXMgPSBMVlJFVl9Qcm9jZXNzKHBDb250ZXh0LT5oSW5zdGFuY2UsICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcElucHV0QnVmZiwgICAgIC8qIElucHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXRCdWZmLCAgICAvKiBPdXRwdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCk7ICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byByZWFkICovCisjZWxzZQogICAgICAgICBMdm1TdGF0dXMgPSBMVlJFVl9Qcm9jZXNzKHBDb250ZXh0LT5oSW5zdGFuY2UsICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPkluRnJhbWVzMzIsICAgICAvKiBJbnB1dCBidWZmZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+T3V0RnJhbWVzMzIsICAgIC8qIE91dHB1dCBidWZmZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50KTsgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHJlYWQgKi8KLSAgICB9CisjZW5kaWYKKyAgICAgICAgfQogCiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX1Byb2Nlc3MiLCAicHJvY2VzcyIpCiAgICAgaWYoTHZtU3RhdHVzICE9IExWUkVWX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwogCiAgICAgLy8gQ29udmVydCB0byAxNiBiaXRzCiAgICAgaWYgKHBDb250ZXh0LT5hdXhpbGlhcnkpIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBGbG9hdFRvSW50MTZfU0FUKHBPdXRwdXRCdWZmLCBPdXRGcmFtZXMxNiwgKHNpemVfdClmcmFtZUNvdW50ICogMik7CisjZWxzZQogICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBmcmFtZUNvdW50KjI7IGkrKykgeyAvL2Fsd2F5cyBzdGVyZW8gaGVyZQogICAgICAgICAgICAgT3V0RnJhbWVzMTZbaV0gPSBjbGFtcDE2KHBDb250ZXh0LT5PdXRGcmFtZXMzMltpXT4+OCk7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBmcmFtZUNvdW50KjI7IGkrKykgeyAvL2Fsd2F5cyBzdGVyZW8gaGVyZQotICAgICAgICAgICAgT3V0RnJhbWVzMTZbaV0gPSBjbGFtcDE2KChwQ29udGV4dC0+T3V0RnJhbWVzMzJbaV0+PjgpICsgKExWTV9JTlQzMilwSW5baV0pOwotICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfSBlbHNlIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50ICogMjsgaSsrKSB7Ly9hbHdheXMgc3RlcmVvIGhlcmUKKyAgICAgICAgICAgICAgICAvL3BPdXRwdXRCdWZmIGFuZCBPdXRGcmFtZXMxNiBwb2ludCB0byB0aGUgc2FtZSBidWZmZXIsIHNvIGJldHRlciB0bworICAgICAgICAgICAgICAgIC8vYWNjdW11bGF0ZSBpbiBwSW5wdXRCdWZmLCB3aGljaCBpcyBhdmFpbGFibGUKKyAgICAgICAgICAgICAgICBwSW5wdXRCdWZmW2ldID0gcE91dHB1dEJ1ZmZbaV0gKyAoTFZNX0ZMT0FUKXBJbltpXSAvIDMyNzY4LjBmOworICAgICAgICAgICAgfQogCisgICAgICAgICAgICBGbG9hdFRvSW50MTZfU0FUKHBJbnB1dEJ1ZmYsIE91dEZyYW1lczE2LCAoc2l6ZV90KWZyYW1lQ291bnQgKiAyKTsKKyNlbHNlCisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBmcmFtZUNvdW50KjI7IGkrKykgeyAvL2Fsd2F5cyBzdGVyZW8gaGVyZQorICAgICAgICAgICAgICAgIE91dEZyYW1lczE2W2ldID0gY2xhbXAxNigocENvbnRleHQtPk91dEZyYW1lczMyW2ldPj44KSArIChMVk1fSU5UMzIpcEluW2ldKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgogICAgICAgICAvLyBhcHBseSB2b2x1bWUgd2l0aCByYW1wIGlmIG5lZWRlZAogICAgICAgICBpZiAoKHBDb250ZXh0LT5sZWZ0Vm9sdW1lICE9IHBDb250ZXh0LT5wcmV2TGVmdFZvbHVtZSB8fAogICAgICAgICAgICAgICAgIHBDb250ZXh0LT5yaWdodFZvbHVtZSAhPSBwQ29udGV4dC0+cHJldlJpZ2h0Vm9sdW1lKSAmJgpAQCAtNjQ0LDYgKzc1OCwxNCBAQAogICAgIGNhc2UgNDgwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfNDgwMDA7CiAgICAgICAgIGJyZWFrOworI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorICAgIGNhc2UgOTYwMDA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfOTYwMDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTkyMDAwOgorICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzE5MjAwMDsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKICAgICBkZWZhdWx0OgogICAgICAgICBBTE9HVigiXHJSZXZlcmJfc2V0Q29uZmlnIGludmFsaWQgc2FtcGxpbmcgcmF0ZSAlZCIsIHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSk7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwpAQCAtMTAxMSw3ICsxMTMzLDcgQEAKICAgICAvL0FMT0dWKCJcdFJldmVyYkdldFJvb21IZkxldmVsKCkgQWN0aXZlUGFyYW1zLkxQRkwgJWQsIHBDb250ZXh0LT5TYXZlZEhmTGV2ZWw6ICVkLCAiCiAgICAgLy8gICAgICJjb252ZXJ0ZWQgbGV2ZWw6ICVkXG4iLCBBY3RpdmVQYXJhbXMuTFBGLCBwQ29udGV4dC0+U2F2ZWRIZkxldmVsLCBsZXZlbCk7CiAKLSAgICBpZihBY3RpdmVQYXJhbXMuTFBGICE9IGxldmVsKXsKKyAgICBpZigoaW50MTZfdClBY3RpdmVQYXJhbXMuTFBGICE9IGxldmVsKXsKICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogKGlnbm9yZSBhdCBzdGFydCB1cCkgUmV2ZXJiR2V0Um9vbUhmTGV2ZWwoKSBoYXMgd3JvbmcgbGV2ZWwgLT4gJWQgJWRcbiIsCiAgICAgICAgICAgICAgICBBY3RpdmVQYXJhbXMuTGV2ZWwsIGxldmVsKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWlmL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJoZWlmL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q1YTRlYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlaWYvQW5kcm9pZC5icApAQCAtMCwwICsxLDIzIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmhlaWYiLAorCisgICAgc3JjczogWworICAgICAgICAiSGVpZkRlY29kZXJJbXBsLmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVpZi9IZWlmRGVjb2RlckltcGwuY3BwIGIvbWVkaWEvbGliaGVpZi9IZWlmRGVjb2RlckltcGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMTMxYTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5jcHAKQEAgLTAsMCArMSw0MzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkhlaWZEZWNvZGVySW1wbCIKKworI2luY2x1ZGUgIkhlaWZEZWNvZGVySW1wbC5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8ZHJtL2RybV9mcmFtZXdvcmtfY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvSURhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworSGVpZkRlY29kZXIqIGNyZWF0ZUhlaWZEZWNvZGVyKCkgeworICAgIHJldHVybiBuZXcgYW5kcm9pZDo6SGVpZkRlY29kZXJJbXBsKCk7Cit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoKKyAqIEhlaWZEYXRhU291cmNlCisgKgorICogUHJveGllcyBkYXRhIHJlcXVlc3RzIG92ZXIgSURhdGFTb3VyY2UgaW50ZXJmYWNlIGZyb20gTWVkaWFNZXRhZGF0YVJldHJpZXZlcgorICogdG8gdGhlIEhlaWZTdHJlYW0gaW50ZXJmYWNlIHdlIHJlY2VpdmVkIGZyb20gdGhlIGhlaWYgZGVjb2RlciBjbGllbnQuCisgKi8KK2NsYXNzIEhlaWZEYXRhU291cmNlIDogcHVibGljIEJuRGF0YVNvdXJjZSB7CitwdWJsaWM6CisgICAgLyoKKyAgICAgKiBDb25zdHJ1Y3RzIEhlaWZEYXRhU291cmNlOyB3aWxsIHRha2Ugb3duZXJzaGlwIG9mIHxzdHJlYW18LgorICAgICAqLworICAgIEhlaWZEYXRhU291cmNlKEhlaWZTdHJlYW0qIHN0cmVhbSkKKyAgICAgICAgOiBtU3RyZWFtKHN0cmVhbSksIG1FT1MoZmFsc2UpLAorICAgICAgICAgIG1DYWNoZWRPZmZzZXQoMCksIG1DYWNoZWRTaXplKDApLCBtQ2FjaGVCdWZmZXJTaXplKDApIHt9CisKKyAgICB+SGVpZkRhdGFTb3VyY2UoKSBvdmVycmlkZSB7fQorCisgICAgLyoKKyAgICAgKiBJbml0aWFsaXplcyBpbnRlcm5hbCByZXNvdXJjZXMuCisgICAgICovCisgICAgYm9vbCBpbml0KCk7CisKKyAgICBzcDxJTWVtb3J5PiBnZXRJTWVtb3J5KCkgb3ZlcnJpZGUgeyByZXR1cm4gbU1lbW9yeTsgfQorICAgIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90KiBzaXplKSBvdmVycmlkZSA7CisgICAgdm9pZCBjbG9zZSgpIHt9CisgICAgdWludDMyX3QgZ2V0RmxhZ3MoKSBvdmVycmlkZSB7IHJldHVybiAwOyB9CisgICAgU3RyaW5nOCB0b1N0cmluZygpIG92ZXJyaWRlIHsgcmV0dXJuIFN0cmluZzgoIkhlaWZEYXRhU291cmNlIik7IH0KKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyKikgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIC8qCisgICAgICAgICAqIEJ1ZmZlciBzaXplIGZvciBwYXNzaW5nIHRoZSByZWFkIGRhdGEgdG8gbWVkaWFzZXJ2ZXIuIFNldCB0byA2NEsKKyAgICAgICAgICogKHdoaWNoIGlzIHdoYXQgTWVkaWFEYXRhU291cmNlIEphdmEgQVBJJ3Mgam5pIGltcGxlbWVudGF0aW9uIHVzZXMpLgorICAgICAgICAgKi8KKyAgICAgICAga0J1ZmZlclNpemUgPSA2NCAqIDEwMjQsCisgICAgICAgIC8qCisgICAgICAgICAqIEluaXRpYWwgYW5kIG1heCBjYWNoZSBidWZmZXIgc2l6ZS4KKyAgICAgICAgICovCisgICAgICAgIGtJbml0aWFsQ2FjaGVCdWZmZXJTaXplID0gNCAqIDEwMjQgKiAxMDI0LAorICAgICAgICBrTWF4Q2FjaGVCdWZmZXJTaXplID0gNjQgKiAxMDI0ICogMTAyNCwKKyAgICB9OworICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEhlaWZTdHJlYW0+IG1TdHJlYW07CisgICAgYm9vbCBtRU9TOworICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90PiBtQ2FjaGU7CisgICAgb2ZmNjRfdCBtQ2FjaGVkT2Zmc2V0OworICAgIHNpemVfdCBtQ2FjaGVkU2l6ZTsKKyAgICBzaXplX3QgbUNhY2hlQnVmZmVyU2l6ZTsKK307CisKK2Jvb2wgSGVpZkRhdGFTb3VyY2U6OmluaXQoKSB7CisgICAgc3A8TWVtb3J5RGVhbGVyPiBtZW1vcnlEZWFsZXIgPQorICAgICAgICAgICAgbmV3IE1lbW9yeURlYWxlcihrQnVmZmVyU2l6ZSwgIkhlaWZEYXRhU291cmNlIik7CisgICAgbU1lbW9yeSA9IG1lbW9yeURlYWxlci0+YWxsb2NhdGUoa0J1ZmZlclNpemUpOworICAgIGlmIChtTWVtb3J5ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSBzaGFyZWQgbWVtb3J5ISIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1DYWNoZS5yZXNldChuZXcgdWludDhfdFtrSW5pdGlhbENhY2hlQnVmZmVyU2l6ZV0pOworICAgIGlmIChtQ2FjaGUuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgibUZhaWxlZCB0byBhbGxvY2F0ZSBjYWNoZSEiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtQ2FjaGVCdWZmZXJTaXplID0ga0luaXRpYWxDYWNoZUJ1ZmZlclNpemU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3NzaXplX3QgSGVpZkRhdGFTb3VyY2U6OnJlYWRBdChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigicmVhZEF0OiBvZmZzZXQ9JWxsZCwgc2l6ZT0lenUiLCAobG9uZyBsb25nKW9mZnNldCwgc2l6ZSk7CisKKyAgICBpZiAob2Zmc2V0IDwgbUNhY2hlZE9mZnNldCkgeworICAgICAgICAvLyB0cnkgc2VlaywgdGhlbiByZXdpbmQvc2tpcCwgZmFpbCBpZiBub25lIHdvcmtlZAorICAgICAgICBpZiAobVN0cmVhbS0+c2VlayhvZmZzZXQpKSB7CisgICAgICAgICAgICBBTE9HVigicmVhZEF0OiBzZWVrIHRvIG9mZnNldD0lbGxkIiwgKGxvbmcgbG9uZylvZmZzZXQpOworICAgICAgICAgICAgbUNhY2hlZE9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgICAgIG1DYWNoZWRTaXplID0gMDsKKyAgICAgICAgICAgIG1FT1MgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmIChtU3RyZWFtLT5yZXdpbmQoKSkgeworICAgICAgICAgICAgQUxPR1YoInJlYWRBdDogcmV3aW5kIHRvIG9mZnNldD0wIik7CisgICAgICAgICAgICBtQ2FjaGVkT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIG1DYWNoZWRTaXplID0gMDsKKyAgICAgICAgICAgIG1FT1MgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkQXQ6IGNvdWxkbid0IHNlZWsgb3IgcmV3aW5kISIpOworICAgICAgICAgICAgbUVPUyA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobUVPUyAmJiAob2Zmc2V0IDwgbUNhY2hlZE9mZnNldCB8fAorICAgICAgICAgICAgICAgICBvZmZzZXQgPj0gKG9mZjY0X3QpKG1DYWNoZWRPZmZzZXQgKyBtQ2FjaGVkU2l6ZSkpKSB7CisgICAgICAgIEFMT0dWKCJyZWFkQXQ6IEVPUyIpOworICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9CisKKyAgICAvLyBhdCB0aGlzIHBvaW50LCBvZmZzZXQgbXVzdCBiZSA+PSBtQ2FjaGVkT2Zmc2V0LCBvdGhlciBjYXNlcyBzaG91bGQKKyAgICAvLyBoYXZlIGJlZW4gY2F1Z2h0IGFib3ZlLgorICAgIENIRUNLKG9mZnNldCA+PSBtQ2FjaGVkT2Zmc2V0KTsKKworICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gQ2FuIG9ubHkgcmVhZCBtYXggb2Yga0J1ZmZlclNpemUKKyAgICBpZiAoc2l6ZSA+IGtCdWZmZXJTaXplKSB7CisgICAgICAgIHNpemUgPSBrQnVmZmVyU2l6ZTsKKyAgICB9CisKKyAgICAvLyBjb3B5IGZyb20gY2FjaGUgaWYgdGhlIHJlcXVlc3QgZmFsbHMgZW50aXJlbHkgaW4gY2FjaGUKKyAgICBpZiAob2Zmc2V0ICsgc2l6ZSA8PSBtQ2FjaGVkT2Zmc2V0ICsgbUNhY2hlZFNpemUpIHsKKyAgICAgICAgbWVtY3B5KG1NZW1vcnktPnBvaW50ZXIoKSwgbUNhY2hlLmdldCgpICsgb2Zmc2V0IC0gbUNhY2hlZE9mZnNldCwgc2l6ZSk7CisgICAgICAgIHJldHVybiBzaXplOworICAgIH0KKworICAgIC8vIG5lZWQgdG8gZmV0Y2ggbW9yZSwgY2hlY2sgaWYgd2UgbmVlZCB0byBleHBhbmQgdGhlIGNhY2hlIGJ1ZmZlci4KKyAgICBpZiAoKG9mZjY0X3QpKG9mZnNldCArIHNpemUpID4gbUNhY2hlZE9mZnNldCArIGtNYXhDYWNoZUJ1ZmZlclNpemUpIHsKKyAgICAgICAgLy8gaXQncyByZWFjaGluZyBtYXggY2FjaGUgYnVmZmVyIHNpemUsIG5lZWQgdG8gcm9sbCB3aW5kb3csIGFuZCBwb3NzaWJseQorICAgICAgICAvLyBleHBhbmQgdGhlIGNhY2hlIGJ1ZmZlci4KKyAgICAgICAgc2l6ZV90IG5ld0NhY2hlQnVmZmVyU2l6ZSA9IG1DYWNoZUJ1ZmZlclNpemU7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90PiBuZXdDYWNoZTsKKyAgICAgICAgdWludDhfdCogZHN0ID0gbUNhY2hlLmdldCgpOworICAgICAgICBpZiAobmV3Q2FjaGVCdWZmZXJTaXplIDwga01heENhY2hlQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgbmV3Q2FjaGVCdWZmZXJTaXplID0ga01heENhY2hlQnVmZmVyU2l6ZTsKKyAgICAgICAgICAgIG5ld0NhY2hlLnJlc2V0KG5ldyB1aW50OF90W25ld0NhY2hlQnVmZmVyU2l6ZV0pOworICAgICAgICAgICAgZHN0ID0gbmV3Q2FjaGUuZ2V0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyB3aGVuIHJvbGxpbmcgdGhlIGNhY2hlIHdpbmRvdywgdHJ5IHRvIGtlZXAgYWJvdXQgaGFsZiB0aGUgb2xkIGJ5dGVzCisgICAgICAgIC8vIGluIGNhc2UgdGhhdCB0aGUgY2xpZW50IGdvZXMgYmFjay4KKyAgICAgICAgb2ZmNjRfdCBuZXdDYWNoZWRPZmZzZXQgPSBvZmZzZXQgLSAob2ZmNjRfdCkobmV3Q2FjaGVCdWZmZXJTaXplIC8gMik7CisgICAgICAgIGlmIChuZXdDYWNoZWRPZmZzZXQgPCBtQ2FjaGVkT2Zmc2V0KSB7CisgICAgICAgICAgICBuZXdDYWNoZWRPZmZzZXQgPSBtQ2FjaGVkT2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgaW50NjRfdCBuZXdDYWNoZWRTaXplID0gKGludDY0X3QpKG1DYWNoZWRPZmZzZXQgKyBtQ2FjaGVkU2l6ZSkgLSBuZXdDYWNoZWRPZmZzZXQ7CisgICAgICAgIGlmIChuZXdDYWNoZWRTaXplID4gMCkgeworICAgICAgICAgICAgLy8gaW4gdGhpcyBjYXNlLCB0aGUgbmV3IGNhY2hlIHJlZ2lvbiBwYXJ0aWFsbHkgb3ZlcmxvcCB0aGUgb2xkIGNhY2hlLAorICAgICAgICAgICAgLy8gbW92ZSB0aGUgcG9ydGlvbiBvZiB0aGUgY2FjaGUgd2Ugd2FudCB0byBzYXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YKKyAgICAgICAgICAgIC8vIHRoZSBjYWNoZSBidWZmZXIuCisgICAgICAgICAgICBtZW1jcHkoZHN0LCBtQ2FjaGUuZ2V0KCkgKyBuZXdDYWNoZWRPZmZzZXQgLSBtQ2FjaGVkT2Zmc2V0LCBuZXdDYWNoZWRTaXplKTsKKyAgICAgICAgfSBlbHNlIGlmIChuZXdDYWNoZWRTaXplIDwgMCl7CisgICAgICAgICAgICAvLyBpbiB0aGlzIGNhc2UsIHRoZSBuZXcgY2FjaGUgcmVnaW9uIGlzIGVudGlyZWx5IG91dCBvZiB0aGUgb2xkIGNhY2hlLAorICAgICAgICAgICAgLy8gaW4gb3JkZXIgdG8gZ3VhcmFudGVlIHNlcXVlbnRpYWwgcmVhZCwgd2UgbmVlZCB0byBza2lwIGEgbnVtYmVyIG9mCisgICAgICAgICAgICAvLyBieXRlcyBiZWZvcmUgcmVhZGluZy4KKyAgICAgICAgICAgIHNpemVfdCBieXRlc1RvU2tpcCA9IC1uZXdDYWNoZWRTaXplOworICAgICAgICAgICAgc2l6ZV90IGJ5dGVzU2tpcHBlZCA9IG1TdHJlYW0tPnJlYWQobnVsbHB0ciwgYnl0ZXNUb1NraXApOworICAgICAgICAgICAgaWYgKGJ5dGVzU2tpcHBlZCAhPSBieXRlc1RvU2tpcCkgeworICAgICAgICAgICAgICAgIC8vIGJ5dGVzU2tpcHBlZCBpcyBpbnZhbGlkLCB0aGVyZSBpcyBub3QgZW5vdWdoIGJ5dGVzIHRvIHJlYWNoCisgICAgICAgICAgICAgICAgLy8gdGhlIHJlcXVlc3RlZCBvZmZzZXQuCisgICAgICAgICAgICAgICAgQUxPR0UoInJlYWRBdDogc2tpcCBmYWlsZWQsIEVPUyIpOworCisgICAgICAgICAgICAgICAgbUVPUyA9IHRydWU7CisgICAgICAgICAgICAgICAgbUNhY2hlZE9mZnNldCA9IG5ld0NhY2hlZE9mZnNldDsKKyAgICAgICAgICAgICAgICBtQ2FjaGVkU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBzZXQgY2FjaGUgc2l6ZSB0byAwLCBzaW5jZSB3ZSdyZSBub3Qga2VlcGluZyBhbnkgb2xkIGNhY2hlCisgICAgICAgICAgICBuZXdDYWNoZWRTaXplID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZXdDYWNoZS5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtQ2FjaGUucmVzZXQobmV3Q2FjaGUucmVsZWFzZSgpKTsKKyAgICAgICAgICAgIG1DYWNoZUJ1ZmZlclNpemUgPSBuZXdDYWNoZUJ1ZmZlclNpemU7CisgICAgICAgIH0KKyAgICAgICAgbUNhY2hlZE9mZnNldCA9IG5ld0NhY2hlZE9mZnNldDsKKyAgICAgICAgbUNhY2hlZFNpemUgPSBuZXdDYWNoZWRTaXplOworCisgICAgICAgIEFMT0dWKCJyZWFkQXQ6IHJvbGxpbmcgY2FjaGUgd2luZG93IHRvICglbGxkLCAlenUpLCBjYWNoZSBidWZmZXIgc2l6ZSAlenUiLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNhY2hlZE9mZnNldCwgbUNhY2hlZFNpemUsIG1DYWNoZUJ1ZmZlclNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGV4cGFuZCBjYWNoZSBidWZmZXIsIGJ1dCBubyBuZWVkIHRvIHJvbGwgdGhlIHdpbmRvdworICAgICAgICBzaXplX3QgbmV3Q2FjaGVCdWZmZXJTaXplID0gbUNhY2hlQnVmZmVyU2l6ZTsKKyAgICAgICAgd2hpbGUgKG9mZnNldCArIHNpemUgPiBtQ2FjaGVkT2Zmc2V0ICsgbmV3Q2FjaGVCdWZmZXJTaXplKSB7CisgICAgICAgICAgICBuZXdDYWNoZUJ1ZmZlclNpemUgKj0gMjsKKyAgICAgICAgfQorICAgICAgICBDSEVDSyhuZXdDYWNoZUJ1ZmZlclNpemUgPD0ga01heENhY2hlQnVmZmVyU2l6ZSk7CisgICAgICAgIGlmIChtQ2FjaGVCdWZmZXJTaXplIDwgbmV3Q2FjaGVCdWZmZXJTaXplKSB7CisgICAgICAgICAgICB1aW50OF90KiBuZXdDYWNoZSA9IG5ldyB1aW50OF90W25ld0NhY2hlQnVmZmVyU2l6ZV07CisgICAgICAgICAgICBtZW1jcHkobmV3Q2FjaGUsIG1DYWNoZS5nZXQoKSwgbUNhY2hlZFNpemUpOworICAgICAgICAgICAgbUNhY2hlLnJlc2V0KG5ld0NhY2hlKTsKKyAgICAgICAgICAgIG1DYWNoZUJ1ZmZlclNpemUgPSBuZXdDYWNoZUJ1ZmZlclNpemU7CisKKyAgICAgICAgICAgIEFMT0dWKCJyZWFkQXQ6IGN1cnJlbnQgY2FjaGUgd2luZG93ICglbGxkLCAlenUpLCBuZXcgY2FjaGUgYnVmZmVyIHNpemUgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgbUNhY2hlZE9mZnNldCwgbUNhY2hlZFNpemUsIG1DYWNoZUJ1ZmZlclNpemUpOworICAgICAgICB9CisgICAgfQorICAgIHNpemVfdCBieXRlc1RvUmVhZCA9IG9mZnNldCArIHNpemUgLSBtQ2FjaGVkT2Zmc2V0IC0gbUNhY2hlZFNpemU7CisgICAgc2l6ZV90IGJ5dGVzUmVhZCA9IG1TdHJlYW0tPnJlYWQobUNhY2hlLmdldCgpICsgbUNhY2hlZFNpemUsIGJ5dGVzVG9SZWFkKTsKKyAgICBpZiAoYnl0ZXNSZWFkID4gYnl0ZXNUb1JlYWQgfHwgYnl0ZXNSZWFkID09IDApIHsKKyAgICAgICAgLy8gYnl0ZXNSZWFkIGlzIGludmFsaWQKKyAgICAgICAgbUVPUyA9IHRydWU7CisgICAgICAgIGJ5dGVzUmVhZCA9IDA7CisgICAgfSBlbHNlIGlmIChieXRlc1JlYWQgPCBieXRlc1RvUmVhZCkgeworICAgICAgICAvLyByZWFkIHNvbWUgYnl0ZXMgYnV0IG5vdCBhbGwsIHNldCBFT1MKKyAgICAgICAgbUVPUyA9IHRydWU7CisgICAgfQorICAgIG1DYWNoZWRTaXplICs9IGJ5dGVzUmVhZDsKKyAgICBBTE9HVigicmVhZEF0OiBjdXJyZW50IGNhY2hlIHdpbmRvdyAoJWxsZCwgJXp1KSIsCisgICAgICAgICAgICAobG9uZyBsb25nKSBtQ2FjaGVkT2Zmc2V0LCBtQ2FjaGVkU2l6ZSk7CisKKyAgICAvLyBoZXJlIGJ5dGVzQXZhaWxhYmxlIGNvdWxkIGJlIG5lZ2F0aXZlIGlmIG9mZnNldCBqdW1wZWQgcGFzdCBFT1MuCisgICAgaW50NjRfdCBieXRlc0F2YWlsYWJsZSA9IG1DYWNoZWRPZmZzZXQgKyBtQ2FjaGVkU2l6ZSAtIG9mZnNldDsKKyAgICBpZiAoYnl0ZXNBdmFpbGFibGUgPD0gMCkgeworICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9CisgICAgaWYgKGJ5dGVzQXZhaWxhYmxlIDwgKGludDY0X3Qpc2l6ZSkgeworICAgICAgICBzaXplID0gYnl0ZXNBdmFpbGFibGU7CisgICAgfQorICAgIG1lbWNweShtTWVtb3J5LT5wb2ludGVyKCksIG1DYWNoZS5nZXQoKSArIG9mZnNldCAtIG1DYWNoZWRPZmZzZXQsIHNpemUpOworICAgIHJldHVybiBzaXplOworfQorCitzdGF0dXNfdCBIZWlmRGF0YVNvdXJjZTo6Z2V0U2l6ZShvZmY2NF90KiBzaXplKSB7CisgICAgaWYgKCFtU3RyZWFtLT5oYXNMZW5ndGgoKSkgeworICAgICAgICAqc2l6ZSA9IC0xOworICAgICAgICBBTE9HRSgiZ2V0U2l6ZTogbm90IHN1cHBvcnRlZCEiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKyAgICAqc2l6ZSA9IG1TdHJlYW0tPmdldExlbmd0aCgpOworICAgIEFMT0dWKCJnZXRTaXplOiBzaXplPSVsbGQiLCAobG9uZyBsb25nKSpzaXplKTsKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworSGVpZkRlY29kZXJJbXBsOjpIZWlmRGVjb2RlckltcGwoKSA6CisgICAgLy8gb3V0cHV0IGNvbG9yIGZvcm1hdCBzaG91bGQgYWx3YXlzIGJlIHNldCB2aWEgc2V0T3V0cHV0Q29sb3IoKSwgaW4gY2FzZQorICAgIC8vIGl0J3Mgbm90LCBkZWZhdWx0IHRvIEhBTF9QSVhFTF9GT1JNQVRfUkdCXzU2NS4KKyAgICBtT3V0cHV0Q29sb3IoSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1KSwKKyAgICBtQ3VyU2NhbmxpbmUoMCksCisgICAgbUZyYW1lRGVjb2RlZChmYWxzZSkgeworfQorCitIZWlmRGVjb2RlckltcGw6On5IZWlmRGVjb2RlckltcGwoKSB7Cit9CisKK2Jvb2wgSGVpZkRlY29kZXJJbXBsOjppbml0KEhlaWZTdHJlYW0qIHN0cmVhbSwgSGVpZkZyYW1lSW5mbyogZnJhbWVJbmZvKSB7CisgICAgbUZyYW1lRGVjb2RlZCA9IGZhbHNlOworICAgIHNwPEhlaWZEYXRhU291cmNlPiBkYXRhU291cmNlID0gbmV3IEhlaWZEYXRhU291cmNlKHN0cmVhbSk7CisgICAgaWYgKCFkYXRhU291cmNlLT5pbml0KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtRGF0YVNvdXJjZSA9IGRhdGFTb3VyY2U7CisKKyAgICBtUmV0cmlldmVyID0gbmV3IE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIoKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtUmV0cmlldmVyLT5zZXREYXRhU291cmNlKG1EYXRhU291cmNlLCAidmlkZW8vbXA0Iik7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHNldCBkYXRhIHNvdXJjZSEiKTsKKworICAgICAgICBtUmV0cmlldmVyLmNsZWFyKCk7CisgICAgICAgIG1EYXRhU291cmNlLmNsZWFyKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQUxPR1YoInN1Y2Nlc3NmdWxseSBzZXQgZGF0YSBzb3VyY2UuIik7CisKKyAgICBjb25zdCBjaGFyKiBoYXNWaWRlbyA9IG1SZXRyaWV2ZXItPmV4dHJhY3RNZXRhZGF0YShNRVRBREFUQV9LRVlfSEFTX1ZJREVPKTsKKyAgICBpZiAoIWhhc1ZpZGVvIHx8IHN0cmNhc2VjbXAoaGFzVmlkZW8sICJ5ZXMiKSkgeworICAgICAgICBBTE9HRSgibm8gdmlkZW86ICVzIiwgaGFzVmlkZW8gPyBoYXNWaWRlbyA6ICJudWxsIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtRnJhbWVNZW1vcnkgPSBtUmV0cmlldmVyLT5nZXRGcmFtZUF0VGltZSgwLAorICAgICAgICAgICAgSU1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DLAorICAgICAgICAgICAgbU91dHB1dENvbG9yLCB0cnVlIC8qbWV0YU9ubHkqLyk7CisgICAgaWYgKG1GcmFtZU1lbW9yeSA9PSBudWxscHRyIHx8IG1GcmFtZU1lbW9yeS0+cG9pbnRlcigpID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoImdldEZyYW1lQXRUaW1lOiB2aWRlb0ZyYW1lIGlzIGEgbnVsbHB0ciIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgVmlkZW9GcmFtZSogdmlkZW9GcmFtZSA9IHN0YXRpY19jYXN0PFZpZGVvRnJhbWUqPihtRnJhbWVNZW1vcnktPnBvaW50ZXIoKSk7CisKKyAgICBBTE9HVigiTWV0YSBkaW1lbnNpb24gJWR4JWQsIGRpc3BsYXkgJWR4JWQsIGFuZ2xlICVkLCBpY2NTaXplICVkIiwKKyAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1XaWR0aCwKKyAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1IZWlnaHQsCisgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tRGlzcGxheVdpZHRoLAorICAgICAgICAgICAgdmlkZW9GcmFtZS0+bURpc3BsYXlIZWlnaHQsCisgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tUm90YXRpb25BbmdsZSwKKyAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1JY2NTaXplKTsKKworICAgIGlmIChmcmFtZUluZm8gIT0gbnVsbHB0cikgeworICAgICAgICBmcmFtZUluZm8tPnNldCgKKyAgICAgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tRGlzcGxheVdpZHRoLAorICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1EaXNwbGF5SGVpZ2h0LAorICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1Sb3RhdGlvbkFuZ2xlLAorICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1CeXRlc1BlclBpeGVsLAorICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1JY2NTaXplLAorICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPmdldEZsYXR0ZW5lZEljY0RhdGEoKSk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEhlaWZEZWNvZGVySW1wbDo6Z2V0RW5jb2RlZENvbG9yKEhlaWZFbmNvZGVkQ29sb3IqIC8qb3V0Q29sb3IqLykgY29uc3QgeworICAgIEFMT0dXKCJnZXRFbmNvZGVkQ29sb3I6IG5vdCBpbXBsZW1lbnRlZCEiKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgSGVpZkRlY29kZXJJbXBsOjpzZXRPdXRwdXRDb2xvcihIZWlmQ29sb3JGb3JtYXQgaGVpZkNvbG9yKSB7CisgICAgc3dpdGNoKGhlaWZDb2xvcikgeworICAgICAgICBjYXNlIGtIZWlmQ29sb3JGb3JtYXRfUkdCNTY1OgorICAgICAgICB7CisgICAgICAgICAgICBtT3V0cHV0Q29sb3IgPSBIQUxfUElYRUxfRk9STUFUX1JHQl81NjU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtIZWlmQ29sb3JGb3JtYXRfUkdCQV84ODg4OgorICAgICAgICB7CisgICAgICAgICAgICBtT3V0cHV0Q29sb3IgPSBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4ODsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGNhc2Uga0hlaWZDb2xvckZvcm1hdF9CR1JBXzg4ODg6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1PdXRwdXRDb2xvciA9IEhBTF9QSVhFTF9GT1JNQVRfQkdSQV84ODg4OworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgb3V0cHV0IGNvbG9yIGZvcm1hdCAlZCIsIGhlaWZDb2xvcik7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEhlaWZEZWNvZGVySW1wbDo6ZGVjb2RlKEhlaWZGcmFtZUluZm8qIGZyYW1lSW5mbykgeworICAgIC8vIHJlc2V0IHNjYW5saW5lIHBvaW50ZXIKKyAgICBtQ3VyU2NhbmxpbmUgPSAwOworCisgICAgaWYgKG1GcmFtZURlY29kZWQpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgbUZyYW1lTWVtb3J5ID0gbVJldHJpZXZlci0+Z2V0RnJhbWVBdFRpbWUoMCwKKyAgICAgICAgICAgIElNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQywgbU91dHB1dENvbG9yKTsKKyAgICBpZiAobUZyYW1lTWVtb3J5ID09IG51bGxwdHIgfHwgbUZyYW1lTWVtb3J5LT5wb2ludGVyKCkgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiZ2V0RnJhbWVBdFRpbWU6IHZpZGVvRnJhbWUgaXMgYSBudWxscHRyIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBWaWRlb0ZyYW1lKiB2aWRlb0ZyYW1lID0gc3RhdGljX2Nhc3Q8VmlkZW9GcmFtZSo+KG1GcmFtZU1lbW9yeS0+cG9pbnRlcigpKTsKKyAgICBpZiAodmlkZW9GcmFtZS0+bVNpemUgPT0gMCB8fAorICAgICAgICAgICAgbUZyYW1lTWVtb3J5LT5zaXplKCkgPCB2aWRlb0ZyYW1lLT5nZXRGbGF0dGVuZWRTaXplKCkpIHsKKyAgICAgICAgQUxPR0UoImdldEZyYW1lQXRUaW1lOiB2aWRlb0ZyYW1lIHNpemUgaXMgaW52YWxpZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQUxPR1YoIkRlY29kZWQgZGltZW5zaW9uICVkeCVkLCBkaXNwbGF5ICVkeCVkLCBhbmdsZSAlZCwgcm93Ynl0ZXMgJWQsIHNpemUgJWQiLAorICAgICAgICAgICAgdmlkZW9GcmFtZS0+bVdpZHRoLAorICAgICAgICAgICAgdmlkZW9GcmFtZS0+bUhlaWdodCwKKyAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1EaXNwbGF5V2lkdGgsCisgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tRGlzcGxheUhlaWdodCwKKyAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1Sb3RhdGlvbkFuZ2xlLAorICAgICAgICAgICAgdmlkZW9GcmFtZS0+bVJvd0J5dGVzLAorICAgICAgICAgICAgdmlkZW9GcmFtZS0+bVNpemUpOworCisgICAgaWYgKGZyYW1lSW5mbyAhPSBudWxscHRyKSB7CisgICAgICAgIGZyYW1lSW5mby0+c2V0KAorICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1EaXNwbGF5V2lkdGgsCisgICAgICAgICAgICAgICAgdmlkZW9GcmFtZS0+bURpc3BsYXlIZWlnaHQsCisgICAgICAgICAgICAgICAgdmlkZW9GcmFtZS0+bVJvdGF0aW9uQW5nbGUsCisgICAgICAgICAgICAgICAgdmlkZW9GcmFtZS0+bUJ5dGVzUGVyUGl4ZWwsCisgICAgICAgICAgICAgICAgdmlkZW9GcmFtZS0+bUljY1NpemUsCisgICAgICAgICAgICAgICAgdmlkZW9GcmFtZS0+Z2V0RmxhdHRlbmVkSWNjRGF0YSgpKTsKKyAgICB9CisgICAgbUZyYW1lRGVjb2RlZCA9IHRydWU7CisKKyAgICAvLyBBZ2dyZXNzaXZlIGNsZWFyIHRvIGF2b2lkIGhvbGRpbmcgb24gdG8gcmVzb3VyY2VzCisgICAgbVJldHJpZXZlci5jbGVhcigpOworICAgIG1EYXRhU291cmNlLmNsZWFyKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSGVpZkRlY29kZXJJbXBsOjpnZXRTY2FubGluZSh1aW50OF90KiBkc3QpIHsKKyAgICBpZiAobUZyYW1lTWVtb3J5ID09IG51bGxwdHIgfHwgbUZyYW1lTWVtb3J5LT5wb2ludGVyKCkgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFZpZGVvRnJhbWUqIHZpZGVvRnJhbWUgPSBzdGF0aWNfY2FzdDxWaWRlb0ZyYW1lKj4obUZyYW1lTWVtb3J5LT5wb2ludGVyKCkpOworICAgIGlmIChtQ3VyU2NhbmxpbmUgPj0gdmlkZW9GcmFtZS0+bURpc3BsYXlIZWlnaHQpIHsKKyAgICAgICAgQUxPR0UoIm5vIG1vcmUgc2NhbmxpbmUgYXZhaWxhYmxlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdWludDhfdCogc3JjID0gdmlkZW9GcmFtZS0+Z2V0RmxhdHRlbmVkRGF0YSgpICsgdmlkZW9GcmFtZS0+bVJvd0J5dGVzICogbUN1clNjYW5saW5lKys7CisgICAgbWVtY3B5KGRzdCwgc3JjLCB2aWRlb0ZyYW1lLT5tQnl0ZXNQZXJQaXhlbCAqIHZpZGVvRnJhbWUtPm1EaXNwbGF5V2lkdGgpOworICAgIHJldHVybiB0cnVlOworfQorCitzaXplX3QgSGVpZkRlY29kZXJJbXBsOjpza2lwU2NhbmxpbmVzKHNpemVfdCBjb3VudCkgeworICAgIGlmIChtRnJhbWVNZW1vcnkgPT0gbnVsbHB0ciB8fCBtRnJhbWVNZW1vcnktPnBvaW50ZXIoKSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBWaWRlb0ZyYW1lKiB2aWRlb0ZyYW1lID0gc3RhdGljX2Nhc3Q8VmlkZW9GcmFtZSo+KG1GcmFtZU1lbW9yeS0+cG9pbnRlcigpKTsKKworICAgIHVpbnQzMl90IG9sZFNjYW5saW5lID0gbUN1clNjYW5saW5lOworICAgIG1DdXJTY2FubGluZSArPSBjb3VudDsKKyAgICBpZiAobUN1clNjYW5saW5lID4gdmlkZW9GcmFtZS0+bURpc3BsYXlIZWlnaHQpIHsKKyAgICAgICAgbUN1clNjYW5saW5lID0gdmlkZW9GcmFtZS0+bURpc3BsYXlIZWlnaHQ7CisgICAgfQorICAgIHJldHVybiAobUN1clNjYW5saW5lID4gb2xkU2NhbmxpbmUpID8gKG1DdXJTY2FubGluZSAtIG9sZFNjYW5saW5lKSA6IDA7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmggYi9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZTRmZjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9IRUlGX0RFQ09ERVJfSU1QTF8KKyNkZWZpbmUgX0hFSUZfREVDT0RFUl9JTVBMXworCisjaW5jbHVkZSAiaW5jbHVkZS9IZWlmRGVjb2RlckFQSS5oIgorI2luY2x1ZGUgPHN5c3RlbS9ncmFwaGljcy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJRGF0YVNvdXJjZTsKK2NsYXNzIElNZW1vcnk7CitjbGFzcyBNZWRpYU1ldGFkYXRhUmV0cmlldmVyOworCisvKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgSGVpZkRlY29kZXIgYmFzZWQgb24gQW5kcm9pZCdzIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuCisgKi8KK2NsYXNzIEhlaWZEZWNvZGVySW1wbCA6IHB1YmxpYyBIZWlmRGVjb2RlciB7CitwdWJsaWM6CisKKyAgICBIZWlmRGVjb2RlckltcGwoKTsKKyAgICB+SGVpZkRlY29kZXJJbXBsKCkgb3ZlcnJpZGU7CisKKyAgICBib29sIGluaXQoSGVpZlN0cmVhbSogc3RyZWFtLCBIZWlmRnJhbWVJbmZvKiBmcmFtZUluZm8pIG92ZXJyaWRlOworCisgICAgYm9vbCBnZXRFbmNvZGVkQ29sb3IoSGVpZkVuY29kZWRDb2xvciogb3V0Q29sb3IpIGNvbnN0IG92ZXJyaWRlOworCisgICAgYm9vbCBzZXRPdXRwdXRDb2xvcihIZWlmQ29sb3JGb3JtYXQgaGVpZkNvbG9yKSBvdmVycmlkZTsKKworICAgIGJvb2wgZGVjb2RlKEhlaWZGcmFtZUluZm8qIGZyYW1lSW5mbykgb3ZlcnJpZGU7CisKKyAgICBib29sIGdldFNjYW5saW5lKHVpbnQ4X3QqIGRzdCkgb3ZlcnJpZGU7CisKKyAgICBzaXplX3Qgc2tpcFNjYW5saW5lcyhzaXplX3QgY291bnQpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHNwPElEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKKyAgICBzcDxNZWRpYU1ldGFkYXRhUmV0cmlldmVyPiBtUmV0cmlldmVyOworICAgIHNwPElNZW1vcnk+IG1GcmFtZU1lbW9yeTsKKyAgICBhbmRyb2lkX3BpeGVsX2Zvcm1hdF90IG1PdXRwdXRDb2xvcjsKKyAgICBzaXplX3QgbUN1clNjYW5saW5lOworICAgIGJvb2wgbUZyYW1lRGVjb2RlZDsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9IRUlGX0RFQ09ERVJfSU1QTF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlaWYvaW5jbHVkZS9IZWlmRGVjb2RlckFQSS5oIGIvbWVkaWEvbGliaGVpZi9pbmNsdWRlL0hlaWZEZWNvZGVyQVBJLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE4M2MzOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmhlaWYvaW5jbHVkZS9IZWlmRGVjb2RlckFQSS5oCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfSEVJRl9ERUNPREVSX0FQSV8KKyNkZWZpbmUgX0hFSUZfREVDT0RFUl9BUElfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKy8qCisgKiBUaGUgb3V0cHV0IGNvbG9yIHBpeGVsIGZvcm1hdCBvZiBoZWlmIGRlY29kZXIuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAga0hlaWZDb2xvckZvcm1hdF9SR0I1NjUgICAgID0gMCwKKyAgICBrSGVpZkNvbG9yRm9ybWF0X1JHQkFfODg4OCAgPSAxLAorICAgIGtIZWlmQ29sb3JGb3JtYXRfQkdSQV84ODg4ICA9IDIsCit9IEhlaWZDb2xvckZvcm1hdDsKKworLyoKKyAqIFRoZSBjb2xvciBzcGFjZXMgZW5jb2RlZCBpbiB0aGUgaGVpZiBpbWFnZS4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBrSGVpZkVuY29kZWRDb2xvcl9SR0IgPSAwLAorICAgIGtIZWlmRW5jb2RlZENvbG9yX1lVViA9IDEsCisgICAga0hlaWZFbmNvZGVkQ29sb3JfQ01ZSyA9IDIsCit9IEhlaWZFbmNvZGVkQ29sb3I7CisKKy8qCisgKiBSZXByZXNlbnRzIGEgY29sb3IgY29udmVydGVkIChSR0ItYmFzZWQpIHZpZGVvIGZyYW1lCisgKi8KK3N0cnVjdCBIZWlmRnJhbWVJbmZvCit7CisgICAgSGVpZkZyYW1lSW5mbygpIDoKKyAgICAgICAgbVdpZHRoKDApLCBtSGVpZ2h0KDApLCBtUm90YXRpb25BbmdsZSgwKSwgbUJ5dGVzUGVyUGl4ZWwoMCksCisgICAgICAgIG1JY2NTaXplKDApLCBtSWNjRGF0YShudWxscHRyKSB7fQorCisgICAgLy8gdXBkYXRlIHRoZSBmcmFtZSBpbmZvLCB3aWxsIG1ha2UgYSBjb3B5IG9mIHxpY2NEYXRhfCBpbnRlcm5hbGx5CisgICAgdm9pZCBzZXQodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50MzJfdCByb3RhdGlvbiwgdWludDMyX3QgYnBwLAorICAgICAgICAgICAgdWludDMyX3QgaWNjU2l6ZSwgdWludDhfdCogaWNjRGF0YSkgeworICAgICAgICBtV2lkdGggPSB3aWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgbVJvdGF0aW9uQW5nbGUgPSByb3RhdGlvbjsKKyAgICAgICAgbUJ5dGVzUGVyUGl4ZWwgPSBicHA7CisKKyAgICAgICAgaWYgKG1JY2NEYXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1JY2NEYXRhLnJlc2V0KG51bGxwdHIpOworICAgICAgICB9CisgICAgICAgIG1JY2NTaXplID0gaWNjU2l6ZTsKKyAgICAgICAgaWYgKGljY1NpemUgPiAwKSB7CisgICAgICAgICAgICBtSWNjRGF0YS5yZXNldChuZXcgdWludDhfdFtpY2NTaXplXSk7CisgICAgICAgICAgICBpZiAobUljY0RhdGEuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1lbWNweShtSWNjRGF0YS5nZXQoKSwgaWNjRGF0YSwgaWNjU2l6ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1JY2NTaXplID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEludGVudGlvbmFsIHB1YmxpYyBhY2Nlc3MgbW9kaWZpZXJzOgorICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIGludDMyX3QgIG1Sb3RhdGlvbkFuZ2xlOyAgICAgICAgICAgLy8gUm90YXRpb24gYW5nbGUsIGNsb2Nrd2lzZSwgc2hvdWxkIGJlIG11bHRpcGxlIG9mIDkwCisgICAgdWludDMyX3QgbUJ5dGVzUGVyUGl4ZWw7ICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgZm9yIG9uZSBwaXhlbAorICAgIHVpbnQzMl90IG1JY2NTaXplOyAgICAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIG1JY2NEYXRhCisgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3Q+IG1JY2NEYXRhOyAvLyBBY3R1YWwgSUNDIGRhdGEsIG1lbW9yeSBpcyBvd25lZCBieSB0aGlzIHN0cnVjdHVyZQorfTsKKworLyoKKyAqIEFic3RyYWN0IGludGVyZmFjZSB0byBwcm92aWRlIGRhdGEgdG8gSGVpZkRlY29kZXIuCisgKi8KK3N0cnVjdCBIZWlmU3RyZWFtIHsKKyAgICBIZWlmU3RyZWFtKCkge30KKworICAgIHZpcnR1YWwgfkhlaWZTdHJlYW0oKSB7fQorCisgICAgLyoKKyAgICAgKiBSZWFkcyBvciBza2lwcyBzaXplIG51bWJlciBvZiBieXRlcy4gcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkKKyAgICAgKiByZWFkIG9yIHNraXBwZWQuCisgICAgICogSWYgfGJ1ZmZlcnwgPT0gTlVMTCwgc2tpcCBzaXplIGJ5dGVzLCByZXR1cm4gaG93IG1hbnkgd2VyZSBza2lwcGVkLgorICAgICAqIElmIHxidWZmZXJ8ICE9IE5VTEwsIGNvcHkgc2l6ZSBieXRlcyBpbnRvIGJ1ZmZlciwgcmV0dXJuIGhvdyBtYW55IHdlcmUgY29waWVkLgorICAgICAqLworICAgIHZpcnR1YWwgc2l6ZV90IHJlYWQodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgPSAwOworCisgICAgLyoKKyAgICAgKiBSZXdpbmRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbS4gUmV0dXJucyB0cnVlIGlmIHRoZSBzdHJlYW0gaXMga25vd24KKyAgICAgKiB0byBiZSBhdCB0aGUgYmVnaW5uaW5nIGFmdGVyIHRoaXMgY2FsbCByZXR1cm5zLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCByZXdpbmQoKSA9IDA7CisKKyAgICAvKgorICAgICAqIFNlZWtzIHRvIGFuIGFic29sdXRlIHBvc2l0aW9uIGluIHRoZSBzdHJlYW0uIElmIHRoaXMgY2Fubm90IGJlIGRvbmUsIHJldHVybnMgZmFsc2UuCisgICAgICogSWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHNlZWsgcGFzdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0sIHRoZSBwb3NpdGlvbiB3aWxsIGJlIHNldAorICAgICAqIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgc2VlayhzaXplX3QgLypwb3NpdGlvbiovKSA9IDA7CisKKyAgICAvKiogUmV0dXJucyB0cnVlIGlmIHRoaXMgc3RyZWFtIGNhbiByZXBvcnQgaXRzIHRvdGFsIGxlbmd0aC4gKi8KKyAgICB2aXJ0dWFsIGJvb2wgaGFzTGVuZ3RoKCkgY29uc3QgPSAwOworCisgICAgLyoqIFJldHVybnMgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgc3RyZWFtLiBJZiB0aGlzIGNhbm5vdCBiZSBkb25lLCByZXR1cm5zIDAuICovCisgICAgdmlydHVhbCBzaXplX3QgZ2V0TGVuZ3RoKCkgY29uc3QgPSAwOworCitwcml2YXRlOgorICAgIEhlaWZTdHJlYW0oY29uc3QgSGVpZkZyYW1lSW5mbyYpID0gZGVsZXRlOworICAgIEhlaWZTdHJlYW0mIG9wZXJhdG9yPShjb25zdCBIZWlmRnJhbWVJbmZvJikgPSBkZWxldGU7Cit9OworCisvKgorICogQWJzdHJhY3QgaW50ZXJmYWNlIHRvIGRlY29kZSBoZWlmIGltYWdlcyBmcm9tIGEgSGVpZlN0cmVhbSBkYXRhIHNvdXJjZS4KKyAqLworc3RydWN0IEhlaWZEZWNvZGVyIHsKKyAgICBIZWlmRGVjb2RlcigpIHt9CisKKyAgICB2aXJ0dWFsIH5IZWlmRGVjb2RlcigpIHt9CisKKyAgICAvKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBpdCBzdWNjZXNzZnVsbHkgc2V0cyBvdXRDb2xvciB0byB0aGUgZW5jb2RlZCBjb2xvciwKKyAgICAgKiBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBnZXRFbmNvZGVkQ29sb3IoSGVpZkVuY29kZWRDb2xvciogb3V0Q29sb3IpIGNvbnN0ID0gMDsKKworICAgIC8qCisgICAgICogUmV0dXJucyB0cnVlIGlmIGl0IHN1Y2Nlc3NmdWxseSBzZXRzIHRoZSBvdXRwdXQgY29sb3IgZm9ybWF0IHRvIGNvbG9yLAorICAgICAqIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgdmlydHVhbCBib29sIHNldE91dHB1dENvbG9yKEhlaWZDb2xvckZvcm1hdCBjb2xvcikgPSAwOworCisgICAgLyoKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgaXQgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemUgaGVpZiBkZWNvZGVyIHdpdGggc291cmNlLAorICAgICAqIGFuZCBmYWxzZSBvdGhlcndpc2UuIHxmcmFtZUluZm98IHdpbGwgYmUgZmlsbGVkIHdpdGggaW5mb3JtYXRpb24gb2YKKyAgICAgKiB0aGUgcHJpbWFyeSBwaWN0dXJlIHVwb24gc3VjY2VzcyBhbmQgdW5tb2RpZmllZCB1cG9uIGZhaWx1cmUuCisgICAgICogVGFrZXMgb3duZXJzaGlwIG9mIHxzdHJlYW18IHJlZ2FyZGxlc3Mgb2YgcmVzdWx0LgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBpbml0KEhlaWZTdHJlYW0qIHN0cmVhbSwgSGVpZkZyYW1lSW5mbyogZnJhbWVJbmZvKSA9IDA7CisKKyAgICAvKgorICAgICAqIERlY29kZSB0aGUgcGljdHVyZSBpbnRlcm5hbGx5LCByZXR1cm5pbmcgd2hldGhlciBpdCBzdWNjZWVkZWQuIHxmcmFtZUluZm98CisgICAgICogd2lsbCBiZSBmaWxsZWQgd2l0aCBpbmZvcm1hdGlvbiBvZiB0aGUgcHJpbWFyeSBwaWN0dXJlIHVwb24gc3VjY2VzcyBhbmQKKyAgICAgKiB1bm1vZGlmaWVkIHVwb24gZmFpbHVyZS4KKyAgICAgKgorICAgICAqIEFmdGVyIHRoaXMgc3VjY2VlZGVkLCBnZXRTY2FubGluZSBjYW4gYmUgY2FsbGVkIHRvIHJlYWQgdGhlIHNjYW5saW5lcworICAgICAqIHRoYXQgd2VyZSBkZWNvZGVkLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBkZWNvZGUoSGVpZkZyYW1lSW5mbyogZnJhbWVJbmZvKSA9IDA7CisKKyAgICAvKgorICAgICAqIFJlYWQgdGhlIG5leHQgc2NhbmxpbmUgKGluIHRvcC1kb3duIG9yZGVyKSwgcmV0dXJucyB0cnVlIHVwb24gc3VjY2VzcworICAgICAqIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgdmlydHVhbCBib29sIGdldFNjYW5saW5lKHVpbnQ4X3QqIGRzdCkgPSAwOworCisgICAgLyoKKyAgICAgKiBTa2lwIHRoZSBuZXh0IHxjb3VudHwgc2NhbmxpbmVzLCByZXR1cm5zIHRydWUgdXBvbiBzdWNjZXNzIGFuZAorICAgICAqIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHNpemVfdCBza2lwU2NhbmxpbmVzKHNpemVfdCBjb3VudCkgPSAwOworCitwcml2YXRlOgorICAgIEhlaWZEZWNvZGVyKGNvbnN0IEhlaWZGcmFtZUluZm8mKSA9IGRlbGV0ZTsKKyAgICBIZWlmRGVjb2RlciYgb3BlcmF0b3I9KGNvbnN0IEhlaWZGcmFtZUluZm8mKSA9IGRlbGV0ZTsKK307CisKKy8qCisgKiBDcmVhdGVzIGEgSGVpZkRlY29kZXIuIFJldHVybnMgYSBIZWlmRGVjb2RlciBpbnN0YW5jZSB1cG9uIHN1Y2Nlc3MsIG9yIE5VTEwKKyAqIGlmIHRoZSBjcmVhdGlvbiBoYXMgZmFpbGVkLgorICovCitIZWlmRGVjb2RlciogY3JlYXRlSGVpZkRlY29kZXIoKTsKKworI2VuZGlmIC8vIF9IRUlGX0RFQ09ERVJfQVBJXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAKaW5kZXggYmJlOTdlZS4uYTQ2MmYzYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwCkBAIC0yLDExICsyLDIyIEBACiAgICAgbmFtZTogImxpYm1lZGlhX2hlYWRlcnMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgaGVhZGVyX2xpYnM6WworICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCisgICAgXSwKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAogfQogCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibWVkaWFfaGVscGVyIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogICAgIHNyY3M6IFsiQXVkaW9QYXJhbWV0ZXIuY3BwIiwgIlR5cGVDb252ZXJ0ZXIuY3BwIl0sCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKQEAgLTM0LDYgKzQ1LDcgQEAKICAgICAgICAgIklNZWRpYUNvZGVjTGlzdC5jcHAiLAogICAgICAgICAiSU1lZGlhQ29kZWNTZXJ2aWNlLmNwcCIsCiAgICAgICAgICJJT01YLmNwcCIsCisgICAgICAgICJJT01YU3RvcmUuY3BwIiwKICAgICAgICAgIk1lZGlhQ29kZWNCdWZmZXIuY3BwIiwKICAgICAgICAgIk1lZGlhQ29kZWNJbmZvLmNwcCIsCiAgICAgICAgICJNZWRpYURlZnMuY3BwIiwKQEAgLTY5LDE0ICs4MSw2IEBACiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIiwgLy8gZm9yIG1lZGlhL3ZuZGsveG1scGFyc2VyLzEuMC9NZWRpYUNvZGVjc1htbFBhcnNlci5oCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUvbWVkaWEiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZSIsIC8vIGZvciBtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAotICAgIF0sCi0KICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKQEAgLTEyMCw2ICsxMjQsOSBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJtZWRpYV9vbXgiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCiAKICAgICBkZWZhdWx0czogWyJsaWJtZWRpYV9vbXhfZGVmYXVsdHMiXSwKIH0KQEAgLTIwMiw2ICsyMDksNyBAQAogICAgICAgICAibGliaWN1aTE4biIsCiAgICAgICAgICJsaWJzb25pdm94IiwKICAgICAgICAgImxpYm1lZGlhZHJtIiwKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCIsCiAgICAgXSwKIApAQCAtMjEwLDE1ICsyMTgsMTAgQEAKICAgICAgICAgImxpYmNfbWFsbG9jX2RlYnVnX2JhY2t0cmFjZSIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZS9tZWRpYS8iLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCi0gICAgXSwKLQogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKICAgICAgICAgImluY2x1ZGUiLAogICAgIF0sCisKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmNwcCBiL21lZGlhL2xpYm1lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuY3BwCmluZGV4IDgwOGMyYjUuLjk5MGQyNjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuY3BwCkBAIC0xOCwxNSArMTgsMTUgQEAKICNkZWZpbmUgTE9HX1RBRyAiQ2hhcmFjdGVyRW5jb2RpbmdEZWN0b3IiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlIDxDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5oPgogI2luY2x1ZGUgIkNoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3JUYWJsZXMuaCIKIAotI2luY2x1ZGUgInV0aWxzL1ZlY3Rvci5oIgotI2luY2x1ZGUgIlN0cmluZ0FycmF5LmgiCisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvU3RyaW5nQXJyYXkuaD4KIAotI2luY2x1ZGUgInVuaWNvZGUvdWNudi5oIgotI2luY2x1ZGUgInVuaWNvZGUvdWNzZGV0LmgiCi0jaW5jbHVkZSAidW5pY29kZS91c3RyaW5nLmgiCisjaW5jbHVkZSA8dW5pY29kZS91Y252Lmg+CisjaW5jbHVkZSA8dW5pY29kZS91Y3NkZXQuaD4KKyNpbmNsdWRlIDx1bmljb2RlL3VzdHJpbmcuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFDb2RlY1NlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhQ29kZWNTZXJ2aWNlLmNwcAppbmRleCAyZDYyNDE5Li5hZGZhOTNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFDb2RlY1NlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUNvZGVjU2VydmljZS5jcHAKQEAgLTI3LDcgKzI3LDggQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogZW51bSB7Ci0gICAgR0VUX09NWCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04KKyAgICBHRVRfT01YID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKKyAgICBHRVRfT01YX1NUT1JFCiB9OwogCiBjbGFzcyBCcE1lZGlhQ29kZWNTZXJ2aWNlIDogcHVibGljIEJwSW50ZXJmYWNlPElNZWRpYUNvZGVjU2VydmljZT4KQEAgLTQ1LDYgKzQ2LDEzIEBACiAgICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJT01YPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgIH0KIAorICAgIHZpcnR1YWwgc3A8SU9NWFN0b3JlPiBnZXRPTVhTdG9yZSgpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhQ29kZWNTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX09NWF9TVE9SRSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElPTVhTdG9yZT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICB9CisKIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShNZWRpYUNvZGVjU2VydmljZSwgImFuZHJvaWQubWVkaWEuSU1lZGlhQ29kZWNTZXJ2aWNlIik7CkBAIC02Miw2ICs3MCwxMiBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKG9teCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CisgICAgICAgIGNhc2UgR0VUX09NWF9TVE9SRTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYUNvZGVjU2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3A8SU9NWFN0b3JlPiBvbXhTdG9yZSA9IGdldE9NWFN0b3JlKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIob214U3RvcmUpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yLmNwcAppbmRleCA0Y2FhNzllLi5hOGE3YjgyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3Rvci5jcHAKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSUNhcy5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNhY2hlLmg+CkBAIC00MCw3ICszOSw4IEBACiAgICAgU0VUTUVESUFDQVMsCiAgICAgU0VUVUlELAogICAgIE5BTUUsCi0gICAgR0VUTUVUUklDUworICAgIEdFVE1FVFJJQ1MsCisgICAgUkVMRUFTRSwKIH07CiAKIGNsYXNzIEJwTWVkaWFFeHRyYWN0b3IgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SU1lZGlhRXh0cmFjdG9yPiB7CkBAIC0xMTgsMTIgKzExOCwxMiBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHNwPElDYXM+ICYgY2FzKSB7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBISW50ZXJmYWNlVG9rZW4gJmNhc1Rva2VuKSB7CiAgICAgICAgIEFMT0dWKCJzZXRNZWRpYUNhcyIpOwogCiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKEJwTWVkaWFFeHRyYWN0b3I6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoY2FzKSk7CisgICAgICAgIGRhdGEud3JpdGVCeXRlVmVjdG9yKGNhc1Rva2VuKTsKIAogICAgICAgICBzdGF0dXNfdCBlcnIgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUTUVESUFDQVMsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKQEAgLTE0MCw2ICsxNDAsMTMgQEAKICAgICAgICAgQUxPR1YoIm5hbWUgTk9UIElNUExFTUVOVEVEIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCkgeworICAgICAgICBBTE9HVigicmVsZWFzZSIpOworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihCcE1lZGlhRXh0cmFjdG9yOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRSwgZGF0YSwgJnJlcGx5KTsKKyAgICB9CiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoTWVkaWFFeHRyYWN0b3IsICJhbmRyb2lkLm1lZGlhLklNZWRpYUV4dHJhY3RvciIpOwpAQCAtMjA3LDE1ICsyMTQsMjAgQEAKICAgICAgICAgICAgIEFMT0dWKCJzZXRNZWRpYUNhcyIpOwogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYUV4dHJhY3RvciwgZGF0YSwgcmVwbHkpOwogCi0gICAgICAgICAgICBzcDxJQmluZGVyPiBjYXNCaW5kZXI7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBkYXRhLnJlYWROdWxsYWJsZVN0cm9uZ0JpbmRlcigmY2FzQmluZGVyKTsKKyAgICAgICAgICAgIEhJbnRlcmZhY2VUb2tlbiBjYXNUb2tlbjsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGRhdGEucmVhZEJ5dGVWZWN0b3IoJmNhc1Rva2VuKTsKICAgICAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiRXJyb3IgcmVhZGluZyBjYXMgZnJvbSBwYXJjZWwiKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRXJyb3IgcmVhZGluZyBjYXNUb2tlbiBmcm9tIHBhcmNlbCIpOwogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxJQ2FzPiBjYXMgPSBpbnRlcmZhY2VfY2FzdDxJQ2FzPihjYXNCaW5kZXIpOwogCi0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRNZWRpYUNhcyhjYXMpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldE1lZGlhQ2FzKGNhc1Rva2VuKSk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBSRUxFQVNFOiB7CisgICAgICAgICAgICBBTE9HVigicmVsZWFzZSIpOworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYUV4dHJhY3RvciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgcmVsZWFzZSgpOwogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAKaW5kZXggNzA1OGVlOC4uNWVhMmU4YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcApAQCAtMTI3LDIyICsxMjcsMzIgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAotICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SURhdGFTb3VyY2U+JiBzb3VyY2UpCisgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxJRGF0YVNvdXJjZT4mIHNvdXJjZSwgY29uc3QgY2hhciAqbWltZSkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKHNvdXJjZSkpOworCisgICAgICAgIGlmIChtaW1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigxKTsKKyAgICAgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKG1pbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDApOworICAgICAgICB9CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfREFUQV9TT1VSQ0VfQ0FMTEJBQ0ssIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKLSAgICBzcDxJTWVtb3J5PiBnZXRGcmFtZUF0VGltZShpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbikKKyAgICBzcDxJTWVtb3J5PiBnZXRGcmFtZUF0VGltZShpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbiwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5KQogICAgIHsKLSAgICAgICAgQUxPR1YoImdldFRpbWVBdFRpbWU6IHRpbWUoJSIgUFJJZDY0ICIgdXMpIGFuZCBvcHRpb24oJWQpIiwgdGltZVVzLCBvcHRpb24pOworICAgICAgICBBTE9HVigiZ2V0VGltZUF0VGltZTogdGltZSglIiBQUklkNjQgIiB1cyksIG9wdGlvbiglZCksIGNvbG9yRm9ybWF0KCVkKSBtZXRhT25seSglZCkiLAorICAgICAgICAgICAgICAgIHRpbWVVcywgb3B0aW9uLCBjb2xvckZvcm1hdCwgbWV0YU9ubHkpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFNZXRhZGF0YVJldHJpZXZlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDY0KHRpbWVVcyk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihvcHRpb24pOworICAgICAgICBkYXRhLndyaXRlSW50MzIoY29sb3JGb3JtYXQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIobWV0YU9ubHkpOwogI2lmbmRlZiBESVNBQkxFX0dST1VQX1NDSEVEVUxFX0hBQ0sKICAgICAgICAgc2VuZFNjaGVkUG9saWN5KGRhdGEpOwogI2VuZGlmCkBAIC0yNTgsNyArMjY4LDEyIEBACiAgICAgICAgICAgICBpZiAoc291cmNlID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihCQURfVkFMVUUpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXREYXRhU291cmNlKHNvdXJjZSkpOworICAgICAgICAgICAgICAgIGludDMyX3QgaGFzTWltZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgaWYgKGhhc01pbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgbWltZSA9IGRhdGEucmVhZENTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0RGF0YVNvdXJjZShzb3VyY2UsIG1pbWUpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTI2NiwxMSArMjgxLDE0IEBACiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGludDY0X3QgdGltZVVzID0gZGF0YS5yZWFkSW50NjQoKTsKICAgICAgICAgICAgIGludCBvcHRpb24gPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgQUxPR1YoImdldFRpbWVBdFRpbWU6IHRpbWUoJSIgUFJJZDY0ICIgdXMpIGFuZCBvcHRpb24oJWQpIiwgdGltZVVzLCBvcHRpb24pOworICAgICAgICAgICAgaW50IGNvbG9yRm9ybWF0ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGJvb2wgbWV0YU9ubHkgPSAoZGF0YS5yZWFkSW50MzIoKSAhPSAwKTsKKyAgICAgICAgICAgIEFMT0dWKCJnZXRUaW1lQXRUaW1lOiB0aW1lKCUiIFBSSWQ2NCAiIHVzKSwgb3B0aW9uKCVkKSwgY29sb3JGb3JtYXQoJWQpLCBtZXRhT25seSglZCkiLAorICAgICAgICAgICAgICAgICAgICB0aW1lVXMsIG9wdGlvbiwgY29sb3JGb3JtYXQsIG1ldGFPbmx5KTsKICNpZm5kZWYgRElTQUJMRV9HUk9VUF9TQ0hFRFVMRV9IQUNLCiAgICAgICAgICAgICBzZXRTY2hlZFBvbGljeShkYXRhKTsKICNlbmRpZgotICAgICAgICAgICAgc3A8SU1lbW9yeT4gYml0bWFwID0gZ2V0RnJhbWVBdFRpbWUodGltZVVzLCBvcHRpb24pOworICAgICAgICAgICAgc3A8SU1lbW9yeT4gYml0bWFwID0gZ2V0RnJhbWVBdFRpbWUodGltZVVzLCBvcHRpb24sIGNvbG9yRm9ybWF0LCBtZXRhT25seSk7CiAgICAgICAgICAgICBpZiAoYml0bWFwICE9IDApIHsgIC8vIERvbid0IHNlbmQgTlVMTCBhY3Jvc3MgdGhlIGJpbmRlciBpbnRlcmZhY2UKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihOT19FUlJPUik7CiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGJpdG1hcCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JT01YLmNwcAppbmRleCA0MzEzMGViLi5hMDczMDgxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JT01YLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JT01YLmNwcApAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgPHV0aWxzL05hdGl2ZUhhbmRsZS5oPgogI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CiAKLSNpbmNsdWRlIDxvbXgvMS4wL1dPbXhOb2RlLmg+CisjaW5jbHVkZSA8bWVkaWEvb214LzEuMC9XT214Tm9kZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvSUdyYXBoaWNCdWZmZXJTb3VyY2UuaD4KICNpbmNsdWRlIDxhbmRyb2lkL0lPTVhCdWZmZXJTb3VyY2UuaD4KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU9NWFN0b3JlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lPTVhTdG9yZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk0OGYxYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL0lPTVhTdG9yZS5jcHAKQEAgLTAsMCArMSwzNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiSU9NWFN0b3JlIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CisjaW5jbHVkZSA8bWVkaWEvSU9NWFN0b3JlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXhTdG9yZS5oPgorCisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUJpbmRlci5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworZW51bSB7CisgICAgQ09OTkVDVCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCisgICAgTElTVF9TRVJWSUNFX0FUVFJJQlVURVMsCisgICAgR0VUX05PREVfUFJFRklYLAorICAgIExJU1RfUk9MRVMsCisgICAgR0VUX09NWCwKK307CisKKy8vIEZvcndhcmQgZGVjbGFyYXRpb25zIG9mIHN0ZDo6dmVjdG9yPFQ+IDwtPiBQYXJjZWwgY29udmVyc2lvbiBmdW5jaXRvbnMgdGhhdAorLy8gZGVwZW5kIG9uIHdyaXRlVG9QYXJjZWwoKSBhbmQgcmVhZFRvUGFyY2VsKCkgZm9yIFQgPC0+IFBhcmNlbC4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+JiB2LCBQYXJjZWwqIHApOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKHN0ZDo6dmVjdG9yPFQ+KiB2LCBjb25zdCBQYXJjZWwmIHApOworCisvLyBzdGQ6OnN0cmluZyA8LT4gUGFyY2VsCisKK3N0YXR1c190IHdyaXRlVG9QYXJjZWwoY29uc3Qgc3RkOjpzdHJpbmcmIHMsIFBhcmNlbCogcCkgeworICAgIGlmIChzLnNpemUoKSA+IElOVDMyX01BWCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gcC0+d3JpdGVCeXRlQXJyYXkoCisgICAgICAgICAgICBzLnNpemUoKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocy5jX3N0cigpKSk7Cit9CisKK3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKHN0ZDo6c3RyaW5nKiBzLCBjb25zdCBQYXJjZWwmIHApIHsKKyAgICBpbnQzMl90IGxlbjsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBwLnJlYWRJbnQzMigmbGVuKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfSBlbHNlIGlmICgobGVuIDwgMCkgfHwgKHN0YXRpY19jYXN0PHVpbnQ2NF90PihsZW4pID4gU0laRV9NQVgpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHMtPnJlc2l6ZShsZW4pOworICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIHJldHVybiBwLnJlYWQoc3RhdGljX2Nhc3Q8dm9pZCo+KCZzLT5mcm9udCgpKSwgc3RhdGljX2Nhc3Q8c2l6ZV90PihsZW4pKTsKK30KKworLy8gSU9NWFN0b3JlOjpBdHRyaWJ1dGUgPC0+IFBhcmNlbAorCitzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKGNvbnN0IElPTVhTdG9yZTo6QXR0cmlidXRlJiBhLCBQYXJjZWwqIHApIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSB3cml0ZVRvUGFyY2VsKGEua2V5LCBwKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiB3cml0ZVRvUGFyY2VsKGEudmFsdWUsIHApOworfQorCitzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChJT01YU3RvcmU6OkF0dHJpYnV0ZSogYSwgY29uc3QgUGFyY2VsJiBwKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVhZEZyb21QYXJjZWwoJihhLT5rZXkpLCBwKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiByZWFkRnJvbVBhcmNlbCgmKGEtPnZhbHVlKSwgcCk7Cit9CisKKy8vIElPTVhTdG9yZTo6Tm9kZUluZm8gPC0+IFBhcmNlbAorCitzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKGNvbnN0IElPTVhTdG9yZTo6Tm9kZUluZm8mIG4sIFBhcmNlbCogcCkgeworICAgIHN0YXR1c190IHN0YXR1cyA9IHdyaXRlVG9QYXJjZWwobi5uYW1lLCBwKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHN0YXR1cyA9IHdyaXRlVG9QYXJjZWwobi5vd25lciwgcCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gd3JpdGVUb1BhcmNlbChuLmF0dHJpYnV0ZXMsIHApOworfQorCitzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChJT01YU3RvcmU6Ok5vZGVJbmZvKiBuLCBjb25zdCBQYXJjZWwmIHApIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSByZWFkRnJvbVBhcmNlbCgmKG4tPm5hbWUpLCBwKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHN0YXR1cyA9IHJlYWRGcm9tUGFyY2VsKCYobi0+b3duZXIpLCBwKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiByZWFkRnJvbVBhcmNlbCgmKG4tPmF0dHJpYnV0ZXMpLCBwKTsKK30KKworLy8gSU9NWFN0b3JlOjpSb2xlSW5mbyA8LT4gUGFyY2VsCisKK3N0YXR1c190IHdyaXRlVG9QYXJjZWwoY29uc3QgSU9NWFN0b3JlOjpSb2xlSW5mbyYgciwgUGFyY2VsKiBwKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gd3JpdGVUb1BhcmNlbChyLnJvbGUsIHApOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgc3RhdHVzID0gd3JpdGVUb1BhcmNlbChyLnR5cGUsIHApOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgc3RhdHVzID0gcC0+d3JpdGVCb29sKHIuaXNFbmNvZGVyKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHN0YXR1cyA9IHAtPndyaXRlQm9vbChyLnByZWZlclBsYXRmb3JtTm9kZXMpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHdyaXRlVG9QYXJjZWwoci5ub2RlcywgcCk7Cit9CisKK3N0YXR1c190IHJlYWRGcm9tUGFyY2VsKElPTVhTdG9yZTo6Um9sZUluZm8qIHIsIGNvbnN0IFBhcmNlbCYgcCkgeworICAgIHN0YXR1c190IHN0YXR1cyA9IHJlYWRGcm9tUGFyY2VsKCYoci0+cm9sZSksIHApOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgc3RhdHVzID0gcmVhZEZyb21QYXJjZWwoJihyLT50eXBlKSwgcCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBzdGF0dXMgPSBwLnJlYWRCb29sKCYoci0+aXNFbmNvZGVyKSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBzdGF0dXMgPSBwLnJlYWRCb29sKCYoci0+cHJlZmVyUGxhdGZvcm1Ob2RlcykpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHJlYWRGcm9tUGFyY2VsKCYoci0+bm9kZXMpLCBwKTsKK30KKworLy8gc3RkOjp2ZWN0b3I8Tm9kZUluZm8+IDwtPiBQYXJjZWwKKy8vIHN0ZDo6dmVjdG9yPFJvbGVJbmZvPiA8LT4gUGFyY2VsCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChjb25zdCBzdGQ6OnZlY3RvcjxUPiYgdiwgUGFyY2VsKiBwKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcC0+d3JpdGVWZWN0b3JTaXplKHYpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgZm9yIChjb25zdCBUJiB4IDogdikgeworICAgICAgICBzdGF0dXMgPSB3cml0ZVRvUGFyY2VsKHgsIHApOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChzdGQ6OnZlY3RvcjxUPiogdiwgY29uc3QgUGFyY2VsJiBwKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcC5yZXNpemVPdXRWZWN0b3Iodik7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBmb3IgKFQmIHggOiAqdikgeworICAgICAgICBzdGF0dXMgPSByZWFkRnJvbVBhcmNlbCgmeCwgcCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIEJwT01YU3RvcmUgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SU9NWFN0b3JlPiB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQnBPTVhTdG9yZShjb25zdCBzcDxJQmluZGVyPiAmaW1wbCkKKyAgICAgICAgOiBCcEludGVyZmFjZTxJT01YU3RvcmU+KGltcGwpIHsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBsaXN0U2VydmljZUF0dHJpYnV0ZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBdHRyaWJ1dGU+KiBhdHRyaWJ1dGVzKSBvdmVycmlkZSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICBzdGF0dXMgPSBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWFN0b3JlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMSVNUX1NFUlZJQ0VfQVRUUklCVVRFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVhZEZyb21QYXJjZWwoYXR0cmlidXRlcywgcmVwbHkpOworICAgIH0KKworICAgIHN0YXR1c190IGdldE5vZGVQcmVmaXgoc3RkOjpzdHJpbmcqIHByZWZpeCkgb3ZlcnJpZGUgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIHN0YXR1c190IHN0YXR1czsKKyAgICAgICAgc3RhdHVzID0gZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVhTdG9yZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX05PREVfUFJFRklYLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZWFkRnJvbVBhcmNlbChwcmVmaXgsIHJlcGx5KTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBsaXN0Um9sZXMoc3RkOjp2ZWN0b3I8Um9sZUluZm8+KiByb2xlTGlzdCkgb3ZlcnJpZGUgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIHN0YXR1c190IHN0YXR1czsKKyAgICAgICAgc3RhdHVzID0gZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVhTdG9yZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTElTVF9ST0xFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVhZEZyb21QYXJjZWwocm9sZUxpc3QsIHJlcGx5KTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBnZXRPbXgoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHNwPElPTVg+KiBvbXgpIG92ZXJyaWRlIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIHN0YXR1cyA9IGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YU3RvcmU6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gd3JpdGVUb1BhcmNlbChuYW1lLCAmZGF0YSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9PTVgsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIob214KTsKKyAgICB9CisKK307CisKK0lNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShPTVhTdG9yZSwgImFuZHJvaWQuaGFyZHdhcmUuSU9NWFN0b3JlIik7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNkZWZpbmUgQ0hFQ0tfT01YX0lOVEVSRkFDRShpbnRlcmZhY2UsIGRhdGEsIHJlcGx5KSBcCisgICAgICAgIGRvIHsgaWYgKCEoZGF0YSkuZW5mb3JjZUludGVyZmFjZShpbnRlcmZhY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSkpIHsgXAorICAgICAgICAgICAgQUxPR1coIkNhbGwgaW5jb3JyZWN0bHkgcm91dGVkIHRvICIgI2ludGVyZmFjZSk7IFwKKyAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsgXAorICAgICAgICB9IH0gd2hpbGUgKDApCisKK3N0YXR1c190IEJuT01YU3RvcmU6Om9uVHJhbnNhY3QoCisgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsICZkYXRhLCBQYXJjZWwgKnJlcGx5LCB1aW50MzJfdCBmbGFncykgeworICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgICBjYXNlIExJU1RfU0VSVklDRV9BVFRSSUJVVEVTOiB7CisgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVhTdG9yZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXR0cmlidXRlPiBhdHRyaWJ1dGVzOworCisgICAgICAgICAgICBzdGF0dXMgPSBsaXN0U2VydmljZUF0dHJpYnV0ZXMoJmF0dHJpYnV0ZXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJsaXN0U2VydmljZUF0dHJpYnV0ZXMoKSBmYWlscyB3aXRoIHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IHdyaXRlVG9QYXJjZWwoYXR0cmlidXRlcywgcmVwbHkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJsaXN0U2VydmljZUF0dHJpYnV0ZXMoKSBmYWlscyB0byBzZW5kIHJlcGx5Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNhc2UgR0VUX05PREVfUFJFRklYOiB7CisgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVhTdG9yZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4OworCisgICAgICAgICAgICBzdGF0dXMgPSBnZXROb2RlUHJlZml4KCZwcmVmaXgpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJnZXROb2RlUHJlZml4KCkgZmFpbHMgd2l0aCBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSB3cml0ZVRvUGFyY2VsKHByZWZpeCwgcmVwbHkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJnZXROb2RlUHJlZml4KCkgZmFpbHMgdG8gc2VuZCByZXBseSIpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIExJU1RfUk9MRVM6IHsKKyAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWFN0b3JlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxSb2xlSW5mbz4gcm9sZUxpc3Q7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IGxpc3RSb2xlcygmcm9sZUxpc3QpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJsaXN0Um9sZXMoKSBmYWlscyB3aXRoIHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IHdyaXRlVG9QYXJjZWwocm9sZUxpc3QsIHJlcGx5KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgibGlzdFJvbGVzKCkgZmFpbHMgdG8gc2VuZCByZXBseSIpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEdFVF9PTVg6IHsKKyAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWFN0b3JlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICAgICAgc3A8SU9NWD4gb214OworCisgICAgICAgICAgICBzdGF0dXMgPSByZWFkRnJvbVBhcmNlbCgmbmFtZSwgZGF0YSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImdldE9teCgpIGZhaWxzIHRvIHJldHJpZXZlIG5hbWUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSBnZXRPbXgobmFtZSwgJm9teCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImdldE9teCgpIGZhaWxzIHdpdGggc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKG9teCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRPbXgoKSBmYWlscyB0byBzZW5kIHJlcGx5Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmNwcAppbmRleCA5NWY3ZDJlLi45NzI0ZmMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSVJlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwCkBAIC0xOSw3ICsxOSw3IEBACiAjZGVmaW5lIExPR19UQUcgIklSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAibWVkaWEvSVJlc291cmNlTWFuYWdlclNlcnZpY2UuaCIKKyNpbmNsdWRlIDxtZWRpYS9JUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oPgogCiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjSW5mby5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjSW5mby5jcHAKaW5kZXggMWYxODhmMy4uYTU3MGZmZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFDb2RlY0luZm8uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhQ29kZWNJbmZvLmNwcApAQCAtMTAxLDM2ICsxMDEsNDYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc0J1aWxkZXI6OmFkZFByb2ZpbGVMZXZlbCh1aW50MzJfdCBwcm9maWxlLCB1aW50MzJfdCBsZXZlbCkgewordm9pZCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyOjphZGREZXRhaWwoCisgICAgICAgIGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFsdWUpIHsKKyAgICBtQ2FwLT5tRGV0YWlscy0+c2V0U3RyaW5nKGtleSwgdmFsdWUpOworfQorCit2b2lkIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI6OmFkZERldGFpbCgKKyAgICAgICAgY29uc3QgY2hhcioga2V5LCBpbnQzMl90IHZhbHVlKSB7CisgICAgbUNhcC0+bURldGFpbHMtPnNldEludDMyKGtleSwgdmFsdWUpOworfQorCit2b2lkIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI6OmFkZFByb2ZpbGVMZXZlbCgKKyAgICAgICAgdWludDMyX3QgcHJvZmlsZSwgdWludDMyX3QgbGV2ZWwpIHsKICAgICBQcm9maWxlTGV2ZWwgcHJvZmlsZUxldmVsOwogICAgIHByb2ZpbGVMZXZlbC5tUHJvZmlsZSA9IHByb2ZpbGU7CiAgICAgcHJvZmlsZUxldmVsLm1MZXZlbCA9IGxldmVsOwotICAgIG1Qcm9maWxlTGV2ZWxzLnB1c2hfYmFjayhwcm9maWxlTGV2ZWwpOworICAgIGlmIChtQ2FwLT5tUHJvZmlsZUxldmVsc1NvcnRlZC5pbmRleE9mKHByb2ZpbGVMZXZlbCkgPCAwKSB7CisgICAgICAgIG1DYXAtPm1Qcm9maWxlTGV2ZWxzLnB1c2hfYmFjayhwcm9maWxlTGV2ZWwpOworICAgICAgICBtQ2FwLT5tUHJvZmlsZUxldmVsc1NvcnRlZC5hZGQocHJvZmlsZUxldmVsKTsKKyAgICB9CiB9CiAKLXZvaWQgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc0J1aWxkZXI6OmFkZENvbG9yRm9ybWF0KHVpbnQzMl90IGZvcm1hdCkgewotICAgIG1Db2xvckZvcm1hdHMucHVzaChmb3JtYXQpOwordm9pZCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyOjphZGRDb2xvckZvcm1hdCh1aW50MzJfdCBmb3JtYXQpIHsKKyAgICBpZiAobUNhcC0+bUNvbG9yRm9ybWF0c1NvcnRlZC5pbmRleE9mKGZvcm1hdCkgPCAwKSB7CisgICAgICAgIG1DYXAtPm1Db2xvckZvcm1hdHMucHVzaChmb3JtYXQpOworICAgICAgICBtQ2FwLT5tQ29sb3JGb3JtYXRzU29ydGVkLmFkZChmb3JtYXQpOworICAgIH0KIH0KIAotdm9pZCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzQnVpbGRlcjo6YWRkRmxhZ3ModWludDMyX3QgZmxhZ3MpIHsKLSAgICBtRmxhZ3MgfD0gZmxhZ3M7Cit2b2lkIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI6OmFkZEZsYWdzKHVpbnQzMl90IGZsYWdzKSB7CisgICAgbUNhcC0+bUZsYWdzIHw9IGZsYWdzOworfQorCitNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyOjpDYXBhYmlsaXRpZXNXcml0ZXIoCisgICAgICAgIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXMqIGNhcCkgOiBtQ2FwKGNhcCkgewogfQogCiBib29sIE1lZGlhQ29kZWNJbmZvOjppc0VuY29kZXIoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1Jc0VuY29kZXI7CiB9CiAKLWJvb2wgTWVkaWFDb2RlY0luZm86Omhhc1F1aXJrKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0IHsKLSAgICBpZiAobmFtZSkgewotICAgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgbVF1aXJrcy5zaXplKCk7IGl4KyspIHsKLSAgICAgICAgICAgIGlmIChtUXVpcmtzLml0ZW1BdChpeCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQogdm9pZCBNZWRpYUNvZGVjSW5mbzo6Z2V0U3VwcG9ydGVkTWltZXMoVmVjdG9yPEFTdHJpbmc+ICptaW1lcykgY29uc3QgewogICAgIG1pbWVzLT5jbGVhcigpOwogICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBtQ2Fwcy5zaXplKCk7IGl4KyspIHsKQEAgLTE1MSwyMCArMTYxLDIxIEBACiAgICAgcmV0dXJuIG1OYW1lLmNfc3RyKCk7CiB9CiAKK2NvbnN0IGNoYXIgKk1lZGlhQ29kZWNJbmZvOjpnZXRPd25lck5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Pd25lci5jX3N0cigpOworfQorCiAvLyBzdGF0aWMKIHNwPE1lZGlhQ29kZWNJbmZvPiBNZWRpYUNvZGVjSW5mbzo6RnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCkgewogICAgIEFTdHJpbmcgbmFtZSA9IEFTdHJpbmc6OkZyb21QYXJjZWwocGFyY2VsKTsKKyAgICBBU3RyaW5nIG93bmVyID0gQVN0cmluZzo6RnJvbVBhcmNlbChwYXJjZWwpOwogICAgIGJvb2wgaXNFbmNvZGVyID0gc3RhdGljX2Nhc3Q8Ym9vbD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKLSAgICBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IG5ldyBNZWRpYUNvZGVjSW5mbyhuYW1lLCBpc0VuY29kZXIsIE5VTEwpOworICAgIHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gbmV3IE1lZGlhQ29kZWNJbmZvOworICAgIGluZm8tPm1OYW1lID0gbmFtZTsKKyAgICBpbmZvLT5tT3duZXIgPSBvd25lcjsKKyAgICBpbmZvLT5tSXNFbmNvZGVyID0gaXNFbmNvZGVyOwogICAgIHNpemVfdCBzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihwYXJjZWwucmVhZEludDMyKCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgIEFTdHJpbmcgcXVpcmsgPSBBU3RyaW5nOjpGcm9tUGFyY2VsKHBhcmNlbCk7Ci0gICAgICAgIGlmIChpbmZvICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGluZm8tPm1RdWlya3MucHVzaF9iYWNrKHF1aXJrKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihwYXJjZWwucmVhZEludDMyKCkpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgIEFTdHJpbmcgbWltZSA9IEFTdHJpbmc6OkZyb21QYXJjZWwocGFyY2VsKTsKICAgICAgICAgc3A8Q2FwYWJpbGl0aWVzPiBjYXBzID0gQ2FwYWJpbGl0aWVzOjpGcm9tUGFyY2VsKHBhcmNlbCk7CiAgICAgICAgIGlmIChjYXBzID09IE5VTEwpCkBAIC0xNzgsMTEgKzE4OSw4IEBACiAKIHN0YXR1c190IE1lZGlhQ29kZWNJbmZvOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCB7CiAgICAgbU5hbWUud3JpdGVUb1BhcmNlbChwYXJjZWwpOworICAgIG1Pd25lci53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CiAgICAgcGFyY2VsLT53cml0ZUludDMyKG1Jc0VuY29kZXIpOwotICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtUXVpcmtzLnNpemUoKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUXVpcmtzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1RdWlya3MuaXRlbUF0KGkpLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKLSAgICB9CiAgICAgcGFyY2VsLT53cml0ZUludDMyKG1DYXBzLnNpemUoKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2Fwcy5zaXplKCk7IGkrKykgewogICAgICAgICBtQ2Fwcy5rZXlBdChpKS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CkBAIC0yMDIsODYgKzIxMCw0NiBAQAogICAgIHJldHVybiAtMTsKIH0KIAotTWVkaWFDb2RlY0luZm86Ok1lZGlhQ29kZWNJbmZvKEFTdHJpbmcgbmFtZSwgYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICptaW1lKQotICAgIDogbU5hbWUobmFtZSksCi0gICAgICBtSXNFbmNvZGVyKGVuY29kZXIpLAotICAgICAgbUhhc1NvbGVNaW1lKGZhbHNlKSB7Ci0gICAgaWYgKG1pbWUgIT0gTlVMTCkgewotICAgICAgICBhZGRNaW1lKG1pbWUpOwotICAgICAgICBtSGFzU29sZU1pbWUgPSB0cnVlOwotICAgIH0KK01lZGlhQ29kZWNJbmZvOjpNZWRpYUNvZGVjSW5mbygpIHsKIH0KIAotc3RhdHVzX3QgTWVkaWFDb2RlY0luZm86OmFkZE1pbWUoY29uc3QgY2hhciAqbWltZSkgewotICAgIGlmIChtSGFzU29sZU1pbWUpIHsKLSAgICAgICAgQUxPR0UoIkNvZGVjICclcycgYWxyZWFkeSBoYWQgaXRzIHR5cGUgc3BlY2lmaWVkIiwgbU5hbWUuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBzc2l6ZV90IGl4ID0gZ2V0Q2FwYWJpbGl0eUluZGV4KG1pbWUpOwordm9pZCBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6c2V0TmFtZShjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgbUluZm8tPm1OYW1lID0gbmFtZTsKK30KKwordm9pZCBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6c2V0T3duZXIoY29uc3QgY2hhciogb3duZXIpIHsKKyAgICBtSW5mby0+bU93bmVyID0gb3duZXI7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OnNldEVuY29kZXIoYm9vbCBpc0VuY29kZXIpIHsKKyAgICBtSW5mby0+bUlzRW5jb2RlciA9IGlzRW5jb2RlcjsKK30KKworc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+CisgICAgICAgIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjphZGRNaW1lKGNvbnN0IGNoYXIgKm1pbWUpIHsKKyAgICBzc2l6ZV90IGl4ID0gbUluZm8tPmdldENhcGFiaWxpdHlJbmRleChtaW1lKTsKICAgICBpZiAoaXggPj0gMCkgewotICAgICAgICBtQ3VycmVudENhcHMgPSBtQ2Fwcy52YWx1ZUF0KGl4KTsKLSAgICB9IGVsc2UgewotICAgICAgICBtQ3VycmVudENhcHMgPSBuZXcgQ2FwYWJpbGl0aWVzKCk7Ci0gICAgICAgIG1DYXBzLmFkZChBU3RyaW5nKG1pbWUpLCBtQ3VycmVudENhcHMpOworICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+KAorICAgICAgICAgICAgICAgIG5ldyBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyKAorICAgICAgICAgICAgICAgIG1JbmZvLT5tQ2Fwcy52YWx1ZUF0KGl4KS5nZXQoKSkpOwogICAgIH0KLSAgICByZXR1cm4gT0s7CisgICAgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gY2FwcyA9IG5ldyBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzKCk7CisgICAgbUluZm8tPm1DYXBzLmFkZChBU3RyaW5nKG1pbWUpLCBjYXBzKTsKKyAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+KAorICAgICAgICAgICAgbmV3IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXIoY2Fwcy5nZXQoKSkpOwogfQogCi1zdGF0dXNfdCBNZWRpYUNvZGVjSW5mbzo6dXBkYXRlTWltZShjb25zdCBjaGFyICptaW1lKSB7Ci0gICAgc3NpemVfdCBpeCA9IGdldENhcGFiaWxpdHlJbmRleChtaW1lKTsKLSAgICBpZiAoaXggPCAwKSB7Ci0gICAgICAgIEFMT0dFKCJ1cGRhdGVNaW1lIG1pbWUgbm90IGZvdW5kICVzIiwgbWltZSk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIG1DdXJyZW50Q2FwcyA9IG1DYXBzLnZhbHVlQXQoaXgpOwotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBNZWRpYUNvZGVjSW5mbzo6cmVtb3ZlTWltZShjb25zdCBjaGFyICptaW1lKSB7Ci0gICAgc3NpemVfdCBpeCA9IGdldENhcGFiaWxpdHlJbmRleChtaW1lKTsKK2Jvb2wgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OnJlbW92ZU1pbWUoY29uc3QgY2hhciAqbWltZSkgeworICAgIHNzaXplX3QgaXggPSBtSW5mby0+Z2V0Q2FwYWJpbGl0eUluZGV4KG1pbWUpOwogICAgIGlmIChpeCA+PSAwKSB7Ci0gICAgICAgIG1DYXBzLnJlbW92ZUl0ZW1zQXQoaXgpOwotICAgICAgICAvLyBtQ3VycmVudENhcHMgd2lsbCBiZSByZW1vdmVkIHdoZW4gY29tcGxldGVkCisgICAgICAgIG1JbmZvLT5tQ2Fwcy5yZW1vdmVJdGVtc0F0KGl4KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQorICAgIHJldHVybiBmYWxzZTsKIH0KIAotc3RhdHVzX3QgTWVkaWFDb2RlY0luZm86OmluaXRpYWxpemVDYXBhYmlsaXRpZXMoY29uc3Qgc3A8Q2FwYWJpbGl0aWVzPiAmY2FwcykgewotICAgIC8vIFRSSUNLWTogY29weSBkYXRhIHRvIG1DdXJyZW50Q2FwcyBhcyBpdCBpcyBhIHJlZmVyZW5jZSB0bwotICAgIC8vIGFuIGVsZW1lbnQgb2YgdGhlIGNhcGFiaWxpdGVzIG1hcC4KLSAgICBtQ3VycmVudENhcHMtPm1Db2xvckZvcm1hdHMuY2xlYXIoKTsKLSAgICBtQ3VycmVudENhcHMtPm1Db2xvckZvcm1hdHMuYXBwZW5kVmVjdG9yKGNhcHMtPm1Db2xvckZvcm1hdHMpOwotICAgIG1DdXJyZW50Q2Fwcy0+bVByb2ZpbGVMZXZlbHMuY2xlYXIoKTsKLSAgICBtQ3VycmVudENhcHMtPm1Qcm9maWxlTGV2ZWxzLmFwcGVuZFZlY3RvcihjYXBzLT5tUHJvZmlsZUxldmVscyk7Ci0gICAgbUN1cnJlbnRDYXBzLT5tRmxhZ3MgPSBjYXBzLT5tRmxhZ3M7Ci0gICAgbUN1cnJlbnRDYXBzLT5tRGV0YWlscyA9IGNhcHMtPm1EZXRhaWxzOwotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBNZWRpYUNvZGVjSW5mbzo6YWRkUXVpcmsoY29uc3QgY2hhciAqbmFtZSkgewotICAgIGlmICghaGFzUXVpcmsobmFtZSkpIHsKLSAgICAgICAgbVF1aXJrcy5wdXNoKG5hbWUpOwotICAgIH0KLX0KLQotdm9pZCBNZWRpYUNvZGVjSW5mbzo6Y29tcGxldGUoKSB7Ci0gICAgbUN1cnJlbnRDYXBzID0gTlVMTDsKLX0KLQotdm9pZCBNZWRpYUNvZGVjSW5mbzo6YWRkRGV0YWlsKGNvbnN0IEFTdHJpbmcgJmtleSwgY29uc3QgQVN0cmluZyAmdmFsdWUpIHsKLSAgICBtQ3VycmVudENhcHMtPm1EZXRhaWxzLT5zZXRTdHJpbmcoa2V5LmNfc3RyKCksIHZhbHVlLmNfc3RyKCkpOwotfQotCi12b2lkIE1lZGlhQ29kZWNJbmZvOjphZGRGZWF0dXJlKGNvbnN0IEFTdHJpbmcgJmtleSwgaW50MzJfdCB2YWx1ZSkgewotICAgIEFTdHJpbmcgdGFnID0gImZlYXR1cmUtIjsKLSAgICB0YWcuYXBwZW5kKGtleSk7Ci0gICAgbUN1cnJlbnRDYXBzLT5tRGV0YWlscy0+c2V0SW50MzIodGFnLmNfc3RyKCksIHZhbHVlKTsKLX0KLQotdm9pZCBNZWRpYUNvZGVjSW5mbzo6YWRkRmVhdHVyZShjb25zdCBBU3RyaW5nICZrZXksIGNvbnN0IGNoYXIgKnZhbHVlKSB7Ci0gICAgQVN0cmluZyB0YWcgPSAiZmVhdHVyZS0iOwotICAgIHRhZy5hcHBlbmQoa2V5KTsKLSAgICBtQ3VycmVudENhcHMtPm1EZXRhaWxzLT5zZXRTdHJpbmcodGFnLmNfc3RyKCksIHZhbHVlKTsKK01lZGlhQ29kZWNJbmZvV3JpdGVyOjpNZWRpYUNvZGVjSW5mb1dyaXRlcihNZWRpYUNvZGVjSW5mbyogaW5mbykgOgorICAgIG1JbmZvKGluZm8pIHsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lckNsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXJDbGllbnQuY3BwCmluZGV4IDlmODAzY2IuLjAyODYxNmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyQ2xpZW50LmNwcApAQCAtMjAsOCArMjAsOCBAQAogCiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFzY2FubmVyLmg+CiAKLSNpbmNsdWRlICJDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmgiCi0jaW5jbHVkZSAiU3RyaW5nQXJyYXkuaCIKKyNpbmNsdWRlIDxtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvU3RyaW5nQXJyYXkuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NaWRpRGV2aWNlSW5mby5jcHAgYi9tZWRpYS9saWJtZWRpYS9NaWRpRGV2aWNlSW5mby5jcHAKaW5kZXggMDJlZmM1Zi4uNzU4OGUwMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWlkaURldmljZUluZm8uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01pZGlEZXZpY2VJbmZvLmNwcApAQCAtMTYsNyArMTYsNyBAQAogCiAjZGVmaW5lIExPR19UQUcgIk1pZGlEZXZpY2VJbmZvIgogCi0jaW5jbHVkZSAiTWlkaURldmljZUluZm8uaCIKKyNpbmNsdWRlIDxtZWRpYS9NaWRpRGV2aWNlSW5mby5oPgogCiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPGxvZy9sb2cuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAKaW5kZXggZmFhZTk1NC4uNGU1ZDY3ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAKLSNpbmNsdWRlICJtZWRpYS9NaWRpSW9XcmFwcGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvTWlkaUlvV3JhcHBlci5oPgogCiBzdGF0aWMgaW50IHJlYWRBdCh2b2lkICpoYW5kbGUsIHZvaWQgKmJ1ZmZlciwgaW50IHBvcywgaW50IHNpemUpIHsKICAgICByZXR1cm4gKChhbmRyb2lkOjpNaWRpSW9XcmFwcGVyKiloYW5kbGUpLT5yZWFkQXQoYnVmZmVyLCBwb3MsIHNpemUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvU3RyaW5nQXJyYXkuY3BwIGIvbWVkaWEvbGlibWVkaWEvU3RyaW5nQXJyYXkuY3BwCmluZGV4IGIyZTU5MDcuLjc4NjhiODUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL1N0cmluZ0FycmF5LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9TdHJpbmdBcnJheS5jcHAKQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAotI2luY2x1ZGUgIlN0cmluZ0FycmF5LmgiCisjaW5jbHVkZSA8bWVkaWEvU3RyaW5nQXJyYXkuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9UeXBlQ29udmVydGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL1R5cGVDb252ZXJ0ZXIuY3BwCmluZGV4IGE2ZWJhODYuLmU2YzhmOWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL1R5cGVDb252ZXJ0ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL1R5cGVDb252ZXJ0ZXIuY3BwCkBAIC0zNzUsNyArMzc1LDcgQEAKIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmbGl0ZXJhbENoYW5uZWxzKQogewogICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxzOwotICAgIGlmICghT3V0cHV0Q2hhbm5lbENvbnZlcnRlcjo6ZnJvbVN0cmluZyhsaXRlcmFsQ2hhbm5lbHMsIGNoYW5uZWxzKSB8fAorICAgIGlmICghT3V0cHV0Q2hhbm5lbENvbnZlcnRlcjo6ZnJvbVN0cmluZyhsaXRlcmFsQ2hhbm5lbHMsIGNoYW5uZWxzKSAmJgogICAgICAgICAgICAgIUlucHV0Q2hhbm5lbENvbnZlcnRlcjo6ZnJvbVN0cmluZyhsaXRlcmFsQ2hhbm5lbHMsIGNoYW5uZWxzKSkgewogICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9JTlZBTElEOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtSGFsLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybUhhbC5oCmluZGV4IGUwMzE3NjUuLjVkMjVlNGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtSGFsLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm1IYWwuaApAQCAtMzksNiArMzksMTEgQEAKIAogc3RydWN0IERybVNlc3Npb25DbGllbnRJbnRlcmZhY2U7CiAKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZsLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJnIpIHsKKyAgICBpZiAobC5zaXplKCkgIT0gci5zaXplKCkpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gbWVtY21wKGwuYXJyYXkoKSwgci5hcnJheSgpLCBsLnNpemUoKSkgPT0gMDsKK30KKwogc3RydWN0IERybUhhbCA6IHB1YmxpYyBCbkRybSwKICAgICAgICAgICAgICBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQsCiAgICAgICAgICAgICAgcHVibGljIElEcm1QbHVnaW5MaXN0ZW5lciB7CkBAIC0xNjEsNiArMTY2LDkgQEAKICAgICBjb25zdCBWZWN0b3I8c3A8SURybUZhY3Rvcnk+PiBtRmFjdG9yaWVzOwogICAgIHNwPElEcm1QbHVnaW4+IG1QbHVnaW47CiAKKyAgICBWZWN0b3I8VmVjdG9yPHVpbnQ4X3Q+PiBtT3BlblNlc3Npb25zOworICAgIHZvaWQgY2xvc2VPcGVuU2Vzc2lvbnMoKTsKKwogICAgIC8qKgogICAgICAqIG1Jbml0Q2hlY2sgaXM6CiAgICAgICogICBOT19JTklUIGlmIGEgcGx1Z2luIGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0CkBAIC0xNzUsNiArMTgzLDExIEBACiAKICAgICB2b2lkIHdyaXRlQnl0ZUFycmF5KFBhcmNlbCAmb2JqLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgYXJyYXkpOwogCisgICAgdm9pZCByZXBvcnRNZXRyaWNzKCkgY29uc3Q7CisgICAgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSkgY29uc3Q7CisgICAgc3RhdHVzX3QgZ2V0UHJvcGVydHlCeXRlQXJyYXlJbnRlcm5hbChTdHJpbmc4IGNvbnN0ICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ2YWx1ZSkgY29uc3Q7CisKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEcm1IYWwpOwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JRGF0YVNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JRGF0YVNvdXJjZS5oCmluZGV4IDY1NWYzMzcuLjM4NThmNzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSURhdGFTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lEYXRhU291cmNlLmgKQEAgLTM1LDcgKzM1LDkgQEAKICAgICAvLyBHZXQgdGhlIG1lbW9yeSB0aGF0IHJlYWRBdCB3cml0ZXMgaW50by4KICAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGdldElNZW1vcnkoKSA9IDA7CiAgICAgLy8gUmVhZCB1cCB0byB8c2l6ZXwgYnl0ZXMgaW50byB0aGUgbWVtb3J5IHJldHVybmVkIGJ5IGdldElNZW1vcnkoKS4gUmV0dXJucwotICAgIC8vIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgLTEgb24gZXJyb3IuIHxzaXplfCBtdXN0IG5vdCBiZSBsYXJnZXIgdGhhbgorICAgIC8vIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IgKGVnLgorICAgIC8vIEVSUk9SX0VORF9PRl9TVFJFQU0gaW5kaWNhdGluZyBFT1MuIFRoaXMgaXMgbmVlZGVkIGJ5IENhbGxiYWNrRGF0YVNvdXJjZQorICAgIC8vIHRvIHByb3Blcmx5IGhhbmRsZSByZWFkaW5nIG9mIGxhc3QgY2h1bmspLiB8c2l6ZXwgbXVzdCBub3QgYmUgbGFyZ2VyIHRoYW4KICAgICAvLyB0aGUgYnVmZmVyLgogICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSA9IDA7CiAgICAgLy8gR2V0IHRoZSBzaXplLCBvciAtMSBpZiB0aGUgc2l6ZSBpcyB1bmtub3duLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFDb2RlY1NlcnZpY2UuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhQ29kZWNTZXJ2aWNlLmgKaW5kZXggZGEzYzVhMDMuLjU5ZmIxYzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhQ29kZWNTZXJ2aWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFDb2RlY1NlcnZpY2UuaApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxtZWRpYS9JRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KKyNpbmNsdWRlIDxtZWRpYS9JT01YU3RvcmUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zMSw2ICszMiw3IEBACiAgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShNZWRpYUNvZGVjU2VydmljZSk7CiAKICAgICB2aXJ0dWFsIHNwPElPTVg+IGdldE9NWCgpID0gMDsKKyAgICB2aXJ0dWFsIHNwPElPTVhTdG9yZT4gZ2V0T01YU3RvcmUoKSA9IDA7CiB9OwogCiBjbGFzcyBCbk1lZGlhQ29kZWNTZXJ2aWNlOiBwdWJsaWMgQm5JbnRlcmZhY2U8SU1lZGlhQ29kZWNTZXJ2aWNlPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFFeHRyYWN0b3IuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhRXh0cmFjdG9yLmgKaW5kZXggYWI0MGY1My4uMGFjNzY3MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUV4dHJhY3Rvci5oCkBAIC0yMCwxNCArMjAsMTIgQEAKIAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgTWV0YURhdGE7Ci1uYW1lc3BhY2UgbWVkaWEgewotY2xhc3MgSUNhczsKLX07Ci11c2luZyBuYW1lc3BhY2UgbWVkaWE7Cit0eXBlZGVmIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IEhJbnRlcmZhY2VUb2tlbjsKIAogY2xhc3MgSU1lZGlhRXh0cmFjdG9yIDogcHVibGljIElJbnRlcmZhY2UgewogcHVibGljOgpAQCAtNjUsMTEgKzYzLDEzIEBACiAgICAgLy8gZm9yIERSTQogICAgIHZpcnR1YWwgY2hhciogZ2V0RHJtVHJhY2tJbmZvKHNpemVfdCB0cmFja0lELCBpbnQgKmxlbikgID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3Qgc3A8SUNhcz4gJmNhcykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgSEludGVyZmFjZVRva2VuICZjYXNUb2tlbikgPSAwOwogCiAgICAgdmlydHVhbCB2b2lkIHNldFVJRCh1aWRfdCB1aWQpICA9IDA7CiAKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSA9IDA7CiB9OwogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuaAppbmRleCBjOTBmMjU0Li5lYTk1MTYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oCkBAIC0xOSwxMyArMTksMTIgQEAKICNkZWZpbmUgQU5EUk9JRF9JTUVESUFNRVRBREFUQVJFVFJJRVZFUl9ICiAKICNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KK2NsYXNzIFBhcmNlbDsKIGNsYXNzIElEYXRhU291cmNlOwogc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOwogCkBAIC00MSw4ICs0MCwxMCBAQAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxJRGF0YVNvdXJjZT4mIGRhdGFTb3VyY2UpID0gMDsKLSAgICB2aXJ0dWFsIHNwPElNZW1vcnk+ICAgICBnZXRGcmFtZUF0VGltZShpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbikgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzcDxJRGF0YVNvdXJjZT4mIGRhdGFTb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpID0gMDsKKyAgICB2aXJ0dWFsIHNwPElNZW1vcnk+ICAgICBnZXRGcmFtZUF0VGltZSgKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uLCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHkpID0gMDsKICAgICB2aXJ0dWFsIHNwPElNZW1vcnk+ICAgICBleHRyYWN0QWxidW1BcnQoKSA9IDA7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyKiAgICAgZXh0cmFjdE1ldGFkYXRhKGludCBrZXlDb2RlKSA9IDA7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JT01YLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lPTVguaAppbmRleCA5YTBhZGExLi5lNjljMDJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lPTVguaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lPTVguaApAQCAtMjksOCArMjksOSBAQAogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Tm9kZS5oPgogCi0jaW5jbHVkZSA8T01YX0NvcmUuaD4KLSNpbmNsdWRlIDxPTVhfVmlkZW8uaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Db3JlLmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfVmlkZW8uaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9WaWRlb0V4dC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU9NWFN0b3JlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lPTVhTdG9yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOGRiNzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lPTVhTdG9yZS5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSU9NWFNUT1JFX0hfCisKKyNkZWZpbmUgQU5EUk9JRF9JT01YU1RPUkVfSF8KKworI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teFN0b3JlLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+CisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIGhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjpJT214U3RvcmU7CisKK2NsYXNzIElPTVhTdG9yZSA6IHB1YmxpYyBJSW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKE9NWFN0b3JlKTsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGUgeworICAgICAgICBzdGQ6OnN0cmluZyBrZXk7CisgICAgICAgIHN0ZDo6c3RyaW5nIHZhbHVlOworICAgIH07CisKKyAgICBzdHJ1Y3QgTm9kZUluZm8geworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICBzdGQ6OnN0cmluZyBvd25lcjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QXR0cmlidXRlPiBhdHRyaWJ1dGVzOworICAgIH07CisKKyAgICBzdHJ1Y3QgUm9sZUluZm8geworICAgICAgICBzdGQ6OnN0cmluZyByb2xlOworICAgICAgICBzdGQ6OnN0cmluZyB0eXBlOworICAgICAgICBib29sIGlzRW5jb2RlcjsKKyAgICAgICAgYm9vbCBwcmVmZXJQbGF0Zm9ybU5vZGVzOworICAgICAgICBzdGQ6OnZlY3RvcjxOb2RlSW5mbz4gbm9kZXM7CisgICAgfTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdFNlcnZpY2VBdHRyaWJ1dGVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXR0cmlidXRlPiogYXR0cmlidXRlcykgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROb2RlUHJlZml4KHN0ZDo6c3RyaW5nKiBwcmVmaXgpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdFJvbGVzKHN0ZDo6dmVjdG9yPFJvbGVJbmZvPiogcm9sZUxpc3QpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T214KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBzcDxJT01YPiogb214KSA9IDA7Cit9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIEJuT01YU3RvcmUgOiBwdWJsaWMgQm5JbnRlcmZhY2U8SU9NWFN0b3JlPiB7CitwdWJsaWM6CisgICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KAorICAgICAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsICZkYXRhLCBQYXJjZWwgKnJlcGx5LAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9JT01YX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhQ29kZWNJbmZvLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhQ29kZWNJbmZvLmgKaW5kZXggNmI1MGYyMi4uYWIyY2QyNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjSW5mby5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0luZm8uaApAQCAtMTgsNiArMTgsNyBAQAogCiAjZGVmaW5lIE1FRElBX0NPREVDX0lORk9fSF8KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgpAQCAtMzYsMTIgKzM3LDIwIEBACiAKIHR5cGVkZWYgS2V5ZWRWZWN0b3I8QVN0cmluZywgQVN0cmluZz4gQ29kZWNTZXR0aW5nczsKIAorc3RydWN0IE1lZGlhQ29kZWNJbmZvV3JpdGVyOworc3RydWN0IE1lZGlhQ29kZWNMaXN0V3JpdGVyOworCiBzdHJ1Y3QgTWVkaWFDb2RlY0luZm8gOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgc3RydWN0IFByb2ZpbGVMZXZlbCB7CiAgICAgICAgIHVpbnQzMl90IG1Qcm9maWxlOwogICAgICAgICB1aW50MzJfdCBtTGV2ZWw7CisgICAgICAgIGJvb2wgb3BlcmF0b3IgPChjb25zdCBQcm9maWxlTGV2ZWwgJm8pIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtUHJvZmlsZSA8IG8ubVByb2ZpbGUgfHwgKG1Qcm9maWxlID09IG8ubVByb2ZpbGUgJiYgbUxldmVsIDwgby5tTGV2ZWwpOworICAgICAgICB9CiAgICAgfTsKIAorICAgIHN0cnVjdCBDYXBhYmlsaXRpZXNXcml0ZXI7CisKICAgICBzdHJ1Y3QgQ2FwYWJpbGl0aWVzIDogcHVibGljIFJlZkJhc2UgewogICAgICAgICBlbnVtIHsKICAgICAgICAgICAgIC8vIGRlY29kZXIgZmxhZ3MKQEAgLTYxLDcgKzcwLDkgQEAKIAogICAgIHByb3RlY3RlZDoKICAgICAgICAgVmVjdG9yPFByb2ZpbGVMZXZlbD4gbVByb2ZpbGVMZXZlbHM7CisgICAgICAgIFNvcnRlZFZlY3RvcjxQcm9maWxlTGV2ZWw+IG1Qcm9maWxlTGV2ZWxzU29ydGVkOwogICAgICAgICBWZWN0b3I8dWludDMyX3Q+IG1Db2xvckZvcm1hdHM7CisgICAgICAgIFNvcnRlZFZlY3Rvcjx1aW50MzJfdD4gbUNvbG9yRm9ybWF0c1NvcnRlZDsKICAgICAgICAgdWludDMyX3QgbUZsYWdzOwogICAgICAgICBzcDxBTWVzc2FnZT4gbURldGFpbHM7CiAKQEAgLTcyLDcyICs4MywxOTEgQEAKICAgICAgICAgc3RhdGljIHNwPENhcGFiaWxpdGllcz4gRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCk7CiAgICAgICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0OwogCi0gICAgICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENhcGFiaWxpdGllcyk7CisgICAgICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihDYXBhYmlsaXRpZXMpOwogCiAgICAgICAgIGZyaWVuZCBzdHJ1Y3QgTWVkaWFDb2RlY0luZm87CisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgTWVkaWFDb2RlY0luZm9Xcml0ZXI7CisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgQ2FwYWJpbGl0aWVzV3JpdGVyOwogICAgIH07CiAKLSAgICAvLyBVc2UgYSBzdWJjbGFzcyB0byBhbGxvdyBzZXR0aW5nIGZpZWxkcyBvbiBjb25zdHJ1Y3Rpb24gd2l0aG91dCBhbGxvd2luZwotICAgIC8vIHRvIGRvIHRoZSBzYW1lIHRocm91Z2hvdXQgdGhlIGZyYW1ld29yay4KLSAgICBzdHJ1Y3QgQ2FwYWJpbGl0aWVzQnVpbGRlciA6IHB1YmxpYyBDYXBhYmlsaXRpZXMgeworICAgIC8qKgorICAgICAqIFRoaXMgY2xhc3MgaXMgdXNlZCBmb3IgbW9kaWZ5aW5nIGluZm9ybWF0aW9uIGluc2lkZSBhIGBDYXBhYmlsaXRpZXNgCisgICAgICogb2JqZWN0LiBBbiBvYmplY3Qgb2YgdHlwZSBgQ2FwYWJpbGl0aWVzV3JpdGVyYCBjYW4gYmUgb2J0YWluZWQgYnkgY2FsbGluZworICAgICAqIGBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6YWRkTWltZSgpYCBvcgorICAgICAqIGBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6dXBkYXRlTWltZSgpYC4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgQ2FwYWJpbGl0aWVzV3JpdGVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBhIGtleS12YWx1ZSBwYWlyIHRvIHRoZSBsaXN0IG9mIGRldGFpbHMuIElmIHRoZSBrZXkgYWxyZWFkeQorICAgICAgICAgKiBleGlzdHMsIHRoZSBvbGQgdmFsdWUgd2lsbCBiZSByZXBsYWNlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQSBwYWlyIGFkZGVkIGJ5IHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBhY2Nlc3NpYmxlIGJ5CisgICAgICAgICAqIGBDYXBhYmlsaXRpZXM6OmdldERldGFpbHMoKWAuIENhbGwgYEFNZXNzYWdlOjpnZXRTdHJpbmcoKWAgd2l0aCB0aGUKKyAgICAgICAgICogc2FtZSBrZXkgdG8gcmV0cmlldmUgdGhlIHZhbHVlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgc3RyaW5nIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBhZGREZXRhaWwoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgYSBrZXktdmFsdWUgcGFpciB0byB0aGUgbGlzdCBvZiBkZXRhaWxzLiBJZiB0aGUga2V5IGFscmVhZHkKKyAgICAgICAgICogZXhpc3RzLCB0aGUgb2xkIHZhbHVlIHdpbGwgYmUgcmVwbGFjZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEEgcGFpciBhZGRlZCBieSB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgYWNjZXNzaWJsZSBieQorICAgICAgICAgKiBgQ2FwYWJpbGl0aWVzOjpnZXREZXRhaWxzKClgLiBDYWxsIGBBTWVzc2FnZTo6Z2V0SW50MzIoKWAgd2l0aCB0aGUKKyAgICAgICAgICogc2FtZSBrZXkgdG8gcmV0cmlldmUgdGhlIHZhbHVlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgYGludDMyX3RgIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBhZGREZXRhaWwoY29uc3QgY2hhcioga2V5LCBpbnQzMl90IHZhbHVlKTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBhIHByb2ZpbGUtbGV2ZWwgcGFpci4gSWYgdGhpcyBwcm9maWxlLWxldmVsIHBhaXIgYWxyZWFkeSBleGlzdHMsCisgICAgICAgICAqIGl0IHdpbGwgYmUgaWdub3JlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHByb2ZpbGUgVGhlICJwcm9maWxlIiBjb21wb25lbnQuCisgICAgICAgICAqIEBwYXJhbSBsZXZlbCBUaGUgImxldmVsIiBjb21wb25lbnQuCisgICAgICAgICAqLwogICAgICAgICB2b2lkIGFkZFByb2ZpbGVMZXZlbCh1aW50MzJfdCBwcm9maWxlLCB1aW50MzJfdCBsZXZlbCk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgYSBjb2xvciBmb3JtYXQuIElmIHRoaXMgY29sb3IgZm9ybWF0IGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlCisgICAgICAgICAqIGlnbm9yZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBmb3JtYXQgVGhlIGNvbG9yIGZvcm1hdC4KKyAgICAgICAgICovCiAgICAgICAgIHZvaWQgYWRkQ29sb3JGb3JtYXQodWludDMyX3QgZm9ybWF0KTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBmbGFncy4gVGhlIHVuZGVybHlpbmcgb3BlcmF0aW9uIGlzIGJpdHdpc2Utb3IuIEluIG90aGVyIHdvcmRzLAorICAgICAgICAgKiBiaXRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gc2V0IHdpbGwgYmUgaWdub3JlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGZsYWdzIFRoZSBhZGRpdGlvbmFsIGZsYWdzLgorICAgICAgICAgKi8KICAgICAgICAgdm9pZCBhZGRGbGFncyh1aW50MzJfdCBmbGFncyk7CisgICAgcHJpdmF0ZToKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBhc3NvY2lhdGVkIGBDYXBhYmlsaXRpZXNgIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIENhcGFiaWxpdGllcyogbUNhcDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdCBhIHdyaXRlciBmb3IgdGhlIGdpdmVuIGBDYXBhYmlsaXRpZXNgIG9iamVjdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNhcCBUaGUgYENhcGFiaWxpdGllc2Agb2JqZWN0IHRvIGJlIHdyaXR0ZW4gdG8uCisgICAgICAgICAqLworICAgICAgICBDYXBhYmlsaXRpZXNXcml0ZXIoQ2FwYWJpbGl0aWVzKiBjYXApOworCisgICAgICAgIGZyaWVuZCBNZWRpYUNvZGVjSW5mb1dyaXRlcjsKICAgICB9OwogCiAgICAgYm9vbCBpc0VuY29kZXIoKSBjb25zdDsKLSAgICBib29sIGhhc1F1aXJrKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0OwogICAgIHZvaWQgZ2V0U3VwcG9ydGVkTWltZXMoVmVjdG9yPEFTdHJpbmc+ICptaW1lcykgY29uc3Q7CiAgICAgY29uc3Qgc3A8Q2FwYWJpbGl0aWVzPiBnZXRDYXBhYmlsaXRpZXNGb3IoY29uc3QgY2hhciAqbWltZSkgY29uc3Q7CiAgICAgY29uc3QgY2hhciAqZ2V0Q29kZWNOYW1lKCkgY29uc3Q7CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgdGhhdCBob3N0cyB0aGUgY29kZWMuIFRoaXMgdmFsdWUgaXMgbm90CisgICAgICogdmlzaWJsZSBhdCB0aGUgSmF2YSBsZXZlbC4KKyAgICAgKgorICAgICAqIEN1cnJlbnRseSwgdGhpcyBpcyB0aGUgImluc3RhbmNlIG5hbWUiIG9mIHRoZSBJT214IHNlcnZpY2UuCisgICAgICovCisgICAgY29uc3QgY2hhciAqZ2V0T3duZXJOYW1lKCkgY29uc3Q7CisKKyAgICAvKioKICAgICAgKiBTZXJpYWxpemF0aW9uIG92ZXIgQmluZGVyCiAgICAgICovCiAgICAgc3RhdGljIHNwPE1lZGlhQ29kZWNJbmZvPiBGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKTsKICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdDsKIAogcHJpdmF0ZToKLSAgICAvLyB2YXJpYWJsZSBzZXQgb25seSBpbiBjb25zdHJ1Y3RvciAtIHRoZXNlIGFyZSBhY2Nlc3NlZCBieSBNZWRpYUNvZGVjTGlzdAotICAgIC8vIHRvIGF2b2lkIGR1cGxpY2F0aW9uIG9mIHNhbWUgdmFyaWFibGVzCiAgICAgQVN0cmluZyBtTmFtZTsKKyAgICBBU3RyaW5nIG1Pd25lcjsKICAgICBib29sIG1Jc0VuY29kZXI7Ci0gICAgYm9vbCBtSGFzU29sZU1pbWU7IC8vIHdhcyBpbml0aWFsaXplZCB3aXRoIG1pbWUKLQotICAgIFZlY3RvcjxBU3RyaW5nPiBtUXVpcmtzOwogICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIHNwPENhcGFiaWxpdGllcz4gPiBtQ2FwczsKIAotICAgIHNwPENhcGFiaWxpdGllcz4gbUN1cnJlbnRDYXBzOyAvLyBjdXJyZW50bHkgaW5pdGFsaXplZCBjYXBhYmlsaXRpZXMKLQogICAgIHNzaXplX3QgZ2V0Q2FwYWJpbGl0eUluZGV4KGNvbnN0IGNoYXIgKm1pbWUpIGNvbnN0OwogCi0gICAgLyogTWV0aG9kcyB1c2VkIGJ5IE1lZGlhQ29kZWNMaXN0IHRvIGNvbnN0cnVjdCB0aGUgaW5mbwotICAgICAqIG9iamVjdCBmcm9tIFhNTC4KLSAgICAgKgotICAgICAqIEFmdGVyIGluZm8gb2JqZWN0IGlzIGNyZWF0ZWQ6Ci0gICAgICogLSBhZGRpdGlvbmFsIHF1aXJrcyBjYW4gYmUgYWRkZWQKLSAgICAgKiAtIGFkZGl0aW9uYWwgbWltZXMgY2FuIGJlIGFkZGVkCi0gICAgICogICAtIE9NWCBjb2RlYyBjYXBhYmlsaXRpZXMgY2FuIGJlIHNldCBmb3IgdGhlIGN1cnJlbnQgbWltZS10eXBlCi0gICAgICogICAtIGEgY2FwYWJpbGl0eSBkZXRhaWwgY2FuIGJlIHNldCBmb3IgdGhlIGN1cnJlbnQgbWltZS10eXBlCi0gICAgICogICAtIGEgZmVhdHVyZSBjYW4gYmUgc2V0IGZvciB0aGUgY3VycmVudCBtaW1lLXR5cGUKLSAgICAgKiAgIC0gaW5mbyBvYmplY3QgY2FuIGJlIGNvbXBsZXRlZCB3aGVuIHBhcnNpbmcgb2YgYSBtaW1lLXR5cGUgaXMgZG9uZQorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbiBgTWVkaWFDb2RlY0luZm9gIG9iamVjdC4gQWZ0ZXIgdGhlIGNvbnN0cnVjdGlvbiwgaXRzCisgICAgICogaW5mb3JtYXRpb24gY2FuIGJlIHNldCB2aWEgYW4gYE1lZGlhQ29kZWNJbmZvV3JpdGVyYCBvYmplY3Qgb2J0YWluZWQgZnJvbQorICAgICAqIGBNZWRpYUNvZGVjTGlzdFdyaXRlcjo6YWRkTWVkaWFDb2RlY0luZm8oKWAuCiAgICAgICovCi0gICAgTWVkaWFDb2RlY0luZm8oQVN0cmluZyBuYW1lLCBib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKm1pbWUpOwotICAgIHZvaWQgYWRkUXVpcmsoY29uc3QgY2hhciAqbmFtZSk7Ci0gICAgc3RhdHVzX3QgYWRkTWltZShjb25zdCBjaGFyICptaW1lKTsKLSAgICBzdGF0dXNfdCB1cGRhdGVNaW1lKGNvbnN0IGNoYXIgKm1pbWUpOworICAgIE1lZGlhQ29kZWNJbmZvKCk7CiAKLSAgICBzdGF0dXNfdCBpbml0aWFsaXplQ2FwYWJpbGl0aWVzKGNvbnN0IHNwPENhcGFiaWxpdGllcz4gJmNhcHMpOwotICAgIHZvaWQgYWRkRGV0YWlsKGNvbnN0IEFTdHJpbmcgJmtleSwgY29uc3QgQVN0cmluZyAmdmFsdWUpOwotICAgIHZvaWQgYWRkRmVhdHVyZShjb25zdCBBU3RyaW5nICZrZXksIGludDMyX3QgdmFsdWUpOwotICAgIHZvaWQgYWRkRmVhdHVyZShjb25zdCBBU3RyaW5nICZrZXksIGNvbnN0IGNoYXIgKnZhbHVlKTsKLSAgICB2b2lkIHJlbW92ZU1pbWUoY29uc3QgY2hhciAqbWltZSk7Ci0gICAgdm9pZCBjb21wbGV0ZSgpOworICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNZWRpYUNvZGVjSW5mbyk7CiAKLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZWRpYUNvZGVjSW5mbyk7Ci0KLSAgICBmcmllbmQgc3RydWN0IE1lZGlhQ29kZWNMaXN0OwogICAgIGZyaWVuZCBjbGFzcyBNZWRpYUNvZGVjTGlzdE92ZXJyaWRlc1Rlc3Q7CisgICAgZnJpZW5kIHN0cnVjdCBNZWRpYUNvZGVjSW5mb1dyaXRlcjsKKyAgICBmcmllbmQgc3RydWN0IE1lZGlhQ29kZWNMaXN0V3JpdGVyOworfTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHRvIGJlIHVzZWQgYnkgYSBgTWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZWAgaW5zdGFuY2UgdG8KKyAqIHBvcHVsYXRlIGluZm9ybWF0aW9uIGluc2lkZSB0aGUgYXNzb2NpYXRlZCBgTWVkaWFDb2RlY0luZm9gIG9iamVjdC4KKyAqCisgKiBUaGUgb25seSBwbGFjZSB3aGVyZSBhbiBpbnN0YW5jZSBvZiBgTWVkaWFDb2RlY0luZm9Xcml0ZXJgIGNhbiBiZSBjb25zdHJ1Y3RlZAorICogaXMgYE1lZGlhQ29kZWNMaXN0V3JpdGVyOjphZGRNZWRpYUNvZGVjSW5mbygpYC4gQSBgTWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZWAKKyAqIGluc3RhbmNlIHNob3VsZCBjYWxsIGBNZWRpYUNvZGVjTGlzdFdyaXRlcjo6YWRkTWVkaWFDb2RlY0luZm8oKWAgb24gdGhlIGdpdmVuCisgKiBgTWVkaWFDb2RlY0xpc3RXcml0ZXJgIG9iamVjdCBnaXZlbiBhcyBhbiBpbnB1dCB0bworICogYE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2U6OmJ1aWxkTWVkaWFDb2RlY0xpc3QoKWAuCisgKi8KK3N0cnVjdCBNZWRpYUNvZGVjSW5mb1dyaXRlciB7CisgICAgLyoqCisgICAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSBjb2RlYy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuZXcgbmFtZS4KKyAgICAgKi8KKyAgICB2b2lkIHNldE5hbWUoY29uc3QgY2hhciogbmFtZSk7CisgICAgLyoqCisgICAgICogU2V0IHRoZSBvd25lciBuYW1lIG9mIHRoZSBjb2RlYy4KKyAgICAgKgorICAgICAqIFRoaXMgIm93bmVyIG5hbWUiIGlzIHRoZSBuYW1lIG9mIHRoZSBgSU9teGAgaW5zdGFuY2UgdGhhdCBzdXBwb3J0cyB0aGlzCisgICAgICogY29kZWMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3duZXIgVGhlIG5ldyBvd25lciBuYW1lLgorICAgICAqLworICAgIHZvaWQgc2V0T3duZXIoY29uc3QgY2hhciogb3duZXIpOworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRoaXMgY29kZWMgaXMgYW4gZW5jb2RlciBvciBhIGRlY29kZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXNFbmNvZGVyIFdoZXRoZXIgdGhpcyBjb2RlYyBpcyBhbiBlbmNvZGVyIG9yIGEgZGVjb2Rlci4KKyAgICAgKi8KKyAgICB2b2lkIHNldEVuY29kZXIoYm9vbCBpc0VuY29kZXIgPSB0cnVlKTsKKyAgICAvKioKKyAgICAgKiBBZGQgYSBtaW1lIHRvIGFuIGluZGV4ZWQgbGlzdCBhbmQgcmV0dXJuIGEgYENhcGFiaWxpdGllc1dyaXRlcmAgb2JqZWN0CisgICAgICogdGhhdCBjYW4gYmUgdXNlZCBmb3IgbW9kaWZ5aW5nIHRoZSBhc3NvY2lhdGVkIGBDYXBhYmlsaXRpZXNgLgorICAgICAqCisgICAgICogSWYgdGhlIG1pbWUgYWxyZWFkeSBleGlzdHMsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlCisgICAgICogYENhcGFiaWxpdGllc1dyaXRlcmAgYXNzb2NpYXRlZCB3aXRoIHRoZSBtaW1lLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBtaW1lIFRoZSBuYW1lIG9mIGEgbmV3IG1pbWUgdG8gYWRkLgorICAgICAqIEByZXR1cm4gd3JpdGVyIFRoZSBgQ2FwYWJpbGl0aWVzV3JpdGVyYCBvYmplY3QgZm9yIG1vZGlmeWluZyB0aGUKKyAgICAgKiBgQ2FwYWJpbGl0aWVzYCBhc3NvY2lhdGVkIHdpdGggdGhlIG1pbWUuIGB3cml0ZXJgIHdpbGwgYmUgdmFsaWQKKyAgICAgKiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYG1pbWVgIGFscmVhZHkgZXhpc3RzIG9yIG5vdC4KKyAgICAgKi8KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcj4gYWRkTWltZSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1pbWUpOworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIG1pbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWltZSBUaGUgbmFtZSBvZiB0aGUgbWltZSB0byByZW1vdmUuCisgICAgICogQHJldHVybiBgdHJ1ZWAgaWYgYG1pbWVgIGlzIHJlbW92ZWQ7IGBmYWxzZWAgaWYgYG1pbWVgIGlzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBib29sIHJlbW92ZU1pbWUoY29uc3QgY2hhciogbWltZSk7Citwcml2YXRlOgorICAgIC8qKgorICAgICAqIFRoZSBhc3NvY2lhdGVkIGBNZWRpYUNvZGVjSW5mb2AuCisgICAgICovCisgICAgTWVkaWFDb2RlY0luZm8qIG1JbmZvOworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCB0aGUgYE1lZGlhQ29kZWNJbmZvV3JpdGVyYCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbgorICAgICAqIGBNZWRpYUNvZGVjSW5mb2Agb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGluZm8gVGhlIHVuZGVybHlpbmcgYE1lZGlhQ29kZWNJbmZvYCBvYmplY3QuCisgICAgICovCisgICAgTWVkaWFDb2RlY0luZm9Xcml0ZXIoTWVkaWFDb2RlY0luZm8qIGluZm8pOworCisgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKE1lZGlhQ29kZWNJbmZvV3JpdGVyKTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgTWVkaWFDb2RlY0xpc3RXcml0ZXI7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UuaAppbmRleCBhNWUxMzUwLi4yNTcwMDJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UuaApAQCAtNDEsOCArNDEsOSBAQAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4mIHNvdXJjZSkgPSAwOwotICAgIHZpcnR1YWwgVmlkZW9GcmFtZSogZ2V0RnJhbWVBdFRpbWUoaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4mIHNvdXJjZSwgY29uc3QgY2hhciAqbWltZSkgPSAwOworICAgIHZpcnR1YWwgVmlkZW9GcmFtZSogZ2V0RnJhbWVBdFRpbWUoCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbiwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5KSA9IDA7CiAgICAgdmlydHVhbCBNZWRpYUFsYnVtQXJ0KiBleHRyYWN0QWxidW1BcnQoKSA9IDA7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyKiBleHRyYWN0TWV0YWRhdGEoaW50IGtleUNvZGUpID0gMDsKIH07CkBAIC01NCw3ICs1NSw5IEBACiAgICAgTWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZSgpIHt9CiAKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlKCkge30KLSAgICB2aXJ0dWFsIFZpZGVvRnJhbWUqIGdldEZyYW1lQXRUaW1lKGludDY0X3QgLyp0aW1lVXMqLywgaW50IC8qb3B0aW9uKi8pIHsgcmV0dXJuIE5VTEw7IH0KKyAgICB2aXJ0dWFsIFZpZGVvRnJhbWUqIGdldEZyYW1lQXRUaW1lKAorICAgICAgICAgICAgaW50NjRfdCAvKnRpbWVVcyovLCBpbnQgLypvcHRpb24qLywgaW50IC8qY29sb3JGb3JtYXQqLywgYm9vbCAvKm1ldGFPbmx5Ki8pCisgICAgeyByZXR1cm4gTlVMTDsgfQogICAgIHZpcnR1YWwgTWVkaWFBbGJ1bUFydCogZXh0cmFjdEFsYnVtQXJ0KCkgeyByZXR1cm4gTlVMTDsgfQogICAgIHZpcnR1YWwgY29uc3QgY2hhciogZXh0cmFjdE1ldGFkYXRhKGludCAvKmtleUNvZGUqLykgeyByZXR1cm4gTlVMTDsgfQogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvUGx1Z2luTWV0cmljc1JlcG9ydGluZy5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9QbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE1YTM2MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvUGx1Z2luTWV0cmljc1JlcG9ydGluZy5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFBMVUdJTl9NRVRSSUNTX1JFUE9SVElOR19IXworCisjZGVmaW5lIFBMVUdJTl9NRVRSSUNTX1JFUE9SVElOR19IXworCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXR1c190IHJlcG9ydERybVBsdWdpbk1ldHJpY3MoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXJpYWxpemVkTWV0cmljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgdmVuZG9yTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgZGVzY3JpcHRpb24pOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFBMVUdJTl9NRVRSSUNTX1JFUE9SVElOR19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaAppbmRleCA4ZWQwN2VlLi42NWMyNjZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaApAQCAtNzYsOCArNzYsMTAgQEAKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCk7CiAKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKLSAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IHNwPElEYXRhU291cmNlPiYgZGF0YVNvdXJjZSk7Ci0gICAgc3A8SU1lbW9yeT4gZ2V0RnJhbWVBdFRpbWUoaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24pOworICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzcDxJRGF0YVNvdXJjZT4mIGRhdGFTb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUgPSBOVUxMKTsKKyAgICBzcDxJTWVtb3J5PiBnZXRGcmFtZUF0VGltZShpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbiwKKyAgICAgICAgICAgIGludCBjb2xvckZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCXzU2NSwgYm9vbCBtZXRhT25seSA9IGZhbHNlKTsKICAgICBzcDxJTWVtb3J5PiBleHRyYWN0QWxidW1BcnQoKTsKICAgICBjb25zdCBjaGFyKiBleHRyYWN0TWV0YWRhdGEoaW50IGtleUNvZGUpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL29teC8xLjAvQ29udmVyc2lvbi5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL0NvbnZlcnNpb24uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9tZWRpYS9vbXgvMS4wL0NvbnZlcnNpb24uaApyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL0NvbnZlcnNpb24uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teC5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXguaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXguaApyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXguaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhCdWZmZXJTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214QnVmZmVyU291cmNlLmgKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhCdWZmZXJTb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhCdWZmZXJTb3VyY2UuaAppbmRleCA4NjMyMmRhLi4wODZmNjQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teEJ1ZmZlclNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214QnVmZmVyU291cmNlLmgKQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0JpbmRlci5oPgotI2luY2x1ZGUgPE9NWEZlbmNlUGFyY2VsYWJsZS5oPgorI2luY2x1ZGUgPG1lZGlhL09NWEZlbmNlUGFyY2VsYWJsZS5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXhCdWZmZXJTb3VyY2UuaD4KICNpbmNsdWRlIDxhbmRyb2lkL0JuT01YQnVmZmVyU291cmNlLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teE5vZGUuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214Tm9kZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL21lZGlhL29teC8xLjAvV09teE5vZGUuaApyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhOb2RlLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214T2JzZXJ2ZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214T2JzZXJ2ZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhPYnNlcnZlci5oCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teE9ic2VydmVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5jcHAKaW5kZXggMDhhOWU2YS4uN2QyN2Q1NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5jcHAKQEAgLTEzMCw3ICsxMzAsNyBAQAogfQogCiBzdGF0dXNfdCBNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpzZXREYXRhU291cmNlKAotICAgIGNvbnN0IHNwPElEYXRhU291cmNlPiYgZGF0YVNvdXJjZSkKKyAgICBjb25zdCBzcDxJRGF0YVNvdXJjZT4mIGRhdGFTb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpCiB7CiAgICAgQUxPR1YoInNldERhdGFTb3VyY2UoSURhdGFTb3VyY2UpIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTEzOCwxOCArMTM4LDIwIEBACiAgICAgICAgIEFMT0dFKCJyZXRyaWV2ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgcmV0dXJuIG1SZXRyaWV2ZXItPnNldERhdGFTb3VyY2UoZGF0YVNvdXJjZSk7CisgICAgcmV0dXJuIG1SZXRyaWV2ZXItPnNldERhdGFTb3VyY2UoZGF0YVNvdXJjZSwgbWltZSk7CiB9CiAKLXNwPElNZW1vcnk+IE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OmdldEZyYW1lQXRUaW1lKGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uKQorc3A8SU1lbW9yeT4gTWVkaWFNZXRhZGF0YVJldHJpZXZlcjo6Z2V0RnJhbWVBdFRpbWUoCisgICAgICAgIGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uLCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHkpCiB7Ci0gICAgQUxPR1YoImdldEZyYW1lQXRUaW1lOiB0aW1lKCUiIFBSSWQ2NCAiIHVzKSBvcHRpb24oJWQpIiwgdGltZVVzLCBvcHRpb24pOworICAgIEFMT0dWKCJnZXRGcmFtZUF0VGltZTogdGltZSglIiBQUklkNjQgIiB1cykgb3B0aW9uKCVkKSBjb2xvckZvcm1hdCglZCkgbWV0YU9ubHkoJWQpIiwKKyAgICAgICAgICAgIHRpbWVVcywgb3B0aW9uLCBjb2xvckZvcm1hdCwgbWV0YU9ubHkpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1SZXRyaWV2ZXIgPT0gMCkgewogICAgICAgICBBTE9HRSgicmV0cmlldmVyIGlzIG5vdCBpbml0aWFsaXplZCIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgcmV0dXJuIG1SZXRyaWV2ZXItPmdldEZyYW1lQXRUaW1lKHRpbWVVcywgb3B0aW9uKTsKKyAgICByZXR1cm4gbVJldHJpZXZlci0+Z2V0RnJhbWVBdFRpbWUodGltZVVzLCBvcHRpb24sIGNvbG9yRm9ybWF0LCBtZXRhT25seSk7CiB9CiAKIGNvbnN0IGNoYXIqIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OmV4dHJhY3RNZXRhZGF0YShpbnQga2V5Q29kZSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9JTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9JTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcAppbmRleCA2OGJhZmUxLi4yOGE3NzQ2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvSU1lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL0lNZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCkBAIC02MCw3ICs2MCw3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBlcnIgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VORVJBVEVfVU5JUVVFX1NFU1NJT05JRCwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgQUxPR1coImJhZCByZXNwb25zZSBmcm9tIHNlcnZpY2UiKTsKKyAgICAgICAgICAgIEFMT0dXKCJiYWQgcmVzcG9uc2UgZnJvbSBzZXJ2aWNlIGZvciBnZW5lcmF0ZVNlc3Npb25JZCwgZXJyPSVkIiwgZXJyKTsKICAgICAgICAgICAgIHJldHVybiBNZWRpYUFuYWx5dGljc0l0ZW06OlNlc3Npb25JREludmFsaWQ7CiAgICAgICAgIH0KICAgICAgICAgc2Vzc2lvbmlkID0gcmVwbHkucmVhZEludDY0KCk7CkBAIC05NCw2ICs5NCw3IEBACiAKICAgICAgICAgZXJyID0gcmVtb3RlKCktPnRyYW5zYWN0KFNVQk1JVF9JVEVNLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HVygiYmFkIHJlc3BvbnNlIGZyb20gc2VydmljZSBmb3Igc3VibWl0LCBlcnI9JWQiLCBlcnIpOwogICAgICAgICAgICAgcmV0dXJuIE1lZGlhQW5hbHl0aWNzSXRlbTo6U2Vzc2lvbklESW52YWxpZDsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFBbmFseXRpY3NJdGVtLmNwcCBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9NZWRpYUFuYWx5dGljc0l0ZW0uY3BwCmluZGV4IDQzODgxYjMuLmY5NjhjMDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9NZWRpYUFuYWx5dGljc0l0ZW0uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9NZWRpYUFuYWx5dGljc0l0ZW0uY3BwCkBAIC01OSw2ICs1OSw3IEBACiBNZWRpYUFuYWx5dGljc0l0ZW06Ok1lZGlhQW5hbHl0aWNzSXRlbSgpCiAgICAgOiBtUGlkKC0xKSwKICAgICAgIG1VaWQoLTEpLAorICAgICAgbVBrZ1ZlcnNpb25Db2RlKDApLAogICAgICAgbVNlc3Npb25JRChNZWRpYUFuYWx5dGljc0l0ZW06OlNlc3Npb25JRE5vbmUpLAogICAgICAgbVRpbWVzdGFtcCgwKSwKICAgICAgIG1GaW5hbGl6ZWQoMCksCkBAIC03MCw2ICs3MSw3IEBACiBNZWRpYUFuYWx5dGljc0l0ZW06Ok1lZGlhQW5hbHl0aWNzSXRlbShNZWRpYUFuYWx5dGljc0l0ZW06OktleSBrZXkpCiAgICAgOiBtUGlkKC0xKSwKICAgICAgIG1VaWQoLTEpLAorICAgICAgbVBrZ1ZlcnNpb25Db2RlKDApLAogICAgICAgbVNlc3Npb25JRChNZWRpYUFuYWx5dGljc0l0ZW06OlNlc3Npb25JRE5vbmUpLAogICAgICAgbVRpbWVzdGFtcCgwKSwKICAgICAgIG1GaW5hbGl6ZWQoMCksCkBAIC05OCw3ICsxMDAsNyBAQAogCiAgICAgLy8gY2xlYW4gYXR0cmlidXRlcwogICAgIC8vIGNvbnRlbnRzIG9mIHRoZSBhdHRyaWJ1dGVzCi0gICAgZm9yIChzaXplX3QgaSA9IDAgOyBpIDwgbVByb3BTaXplOyBpKysgKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDAgOyBpIDwgbVByb3BDb3VudDsgaSsrICkgewogICAgICAgICBjbGVhclByb3AoJm1Qcm9wc1tpXSk7CiAgICAgfQogICAgIC8vIHRoZSBhdHRyaWJ1dGUgcmVjb3JkcyB0aGVtc2VsdmVzCkBAIC0xMjAsNiArMTIyLDggQEAKICAgICAgICAgLy8ga2V5IGFzIHBhcnQgb2YgY29uc3RydWN0b3IKICAgICAgICAgZHN0LT5tUGlkID0gdGhpcy0+bVBpZDsKICAgICAgICAgZHN0LT5tVWlkID0gdGhpcy0+bVVpZDsKKyAgICAgICAgZHN0LT5tUGtnTmFtZSA9IHRoaXMtPm1Qa2dOYW1lOworICAgICAgICBkc3QtPm1Qa2dWZXJzaW9uQ29kZSA9IHRoaXMtPm1Qa2dWZXJzaW9uQ29kZTsKICAgICAgICAgZHN0LT5tU2Vzc2lvbklEID0gdGhpcy0+bVNlc3Npb25JRDsKICAgICAgICAgZHN0LT5tVGltZXN0YW1wID0gdGhpcy0+bVRpbWVzdGFtcDsKICAgICAgICAgZHN0LT5tRmluYWxpemVkID0gdGhpcy0+bUZpbmFsaXplZDsKQEAgLTIwMSw2ICsyMDUsMjQgQEAKICAgICByZXR1cm4gbVVpZDsKIH0KIAorTWVkaWFBbmFseXRpY3NJdGVtICZNZWRpYUFuYWx5dGljc0l0ZW06OnNldFBrZ05hbWUoQVN0cmluZyBwa2dOYW1lKSB7CisgICAgbVBrZ05hbWUgPSBwa2dOYW1lOworICAgIHJldHVybiAqdGhpczsKK30KKworQVN0cmluZyBNZWRpYUFuYWx5dGljc0l0ZW06OmdldFBrZ05hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Qa2dOYW1lOworfQorCitNZWRpYUFuYWx5dGljc0l0ZW0gJk1lZGlhQW5hbHl0aWNzSXRlbTo6c2V0UGtnVmVyc2lvbkNvZGUoaW50MzJfdCBwa2dWZXJzaW9uQ29kZSkgeworICAgIG1Qa2dWZXJzaW9uQ29kZSA9IHBrZ1ZlcnNpb25Db2RlOworICAgIHJldHVybiAqdGhpczsKK30KKworaW50MzJfdCBNZWRpYUFuYWx5dGljc0l0ZW06OmdldFBrZ1ZlcnNpb25Db2RlKCkgY29uc3QgeworICAgIHJldHVybiBtUGtnVmVyc2lvbkNvZGU7Cit9CisKIC8vIHRoaXMga2V5IGlzIGZvciB0aGUgb3ZlcmFsbCByZWNvcmQgLS0gImNvZGVjIiwgInBsYXllciIsICJkcm0iLCBldGMKIE1lZGlhQW5hbHl0aWNzSXRlbSAmTWVkaWFBbmFseXRpY3NJdGVtOjpzZXRLZXkoTWVkaWFBbmFseXRpY3NJdGVtOjpLZXkga2V5KSB7CiAgICAgbUtleSA9IGtleTsKQEAgLTI2MywxMSArMjg1LDMwIEBACiAgICAgICAgIGkgPSBtUHJvcENvdW50Kys7CiAgICAgICAgIHByb3AgPSAmbVByb3BzW2ldOwogICAgICAgICBwcm9wLT5zZXROYW1lKG5hbWUsIGxlbik7CisgICAgICAgIHByb3AtPm1UeXBlID0ga1R5cGVOb25lOyAgICAgICAgLy8gbWFrZSBjYWxsZXIgc2V0IHR5cGUgaW5mbwogICAgIH0KIAogICAgIHJldHVybiBwcm9wOwogfQogCisvLyB1c2VkIHdpdGhpbiB0aGUgc3VtbWFyaXplcnM7IHJldHVybiB3aGV0aGVyIHByb3BlcnR5IGV4aXN0ZWQKK2Jvb2wgTWVkaWFBbmFseXRpY3NJdGVtOjpyZW1vdmVQcm9wKGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICBzaXplX3QgbGVuID0gc3RybGVuKG5hbWUpOworICAgIHNpemVfdCBpID0gZmluZFByb3BJbmRleChuYW1lLCBsZW4pOworICAgIGlmIChpIDwgbVByb3BDb3VudCkgeworICAgICAgICBQcm9wICpwcm9wID0gJm1Qcm9wc1tpXTsKKyAgICAgICAgY2xlYXJQcm9wKHByb3ApOworICAgICAgICBpZiAoaSAhPSBtUHJvcENvdW50LTEpIHsKKyAgICAgICAgICAgIC8vIGluIHRoZSBtaWRkbGUsIGJyaW5nIGxhc3Qgb25lIGRvd24gdG8gZmlsbCBnYXAKKyAgICAgICAgICAgIGNvcHlQcm9wKHByb3AsICZtUHJvcHNbbVByb3BDb3VudC0xXSk7CisgICAgICAgICAgICBjbGVhclByb3AoJm1Qcm9wc1ttUHJvcENvdW50LTFdKTsKKyAgICAgICAgfQorICAgICAgICBtUHJvcENvdW50LS07CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIC8vIHNldCB0aGUgdmFsdWVzCiB2b2lkIE1lZGlhQW5hbHl0aWNzSXRlbTo6c2V0SW50MzIoTWVkaWFBbmFseXRpY3NJdGVtOjpBdHRyIG5hbWUsIGludDMyX3QgdmFsdWUpIHsKICAgICBQcm9wICpwcm9wID0gYWxsb2NhdGVQcm9wKG5hbWUpOwpAQCAtNTY4LDYgKzYwOSwxMCBAQAogICAgIC8vIGludG8gJ3RoaXMnIG9iamVjdAogICAgIC8vIC4uIHdlIG1ha2UgYSBjb3B5IG9mIHRoZSBzdHJpbmcgdG8gcHV0IGF3YXkuCiAgICAgbUtleSA9IGRhdGEucmVhZENTdHJpbmcoKTsKKyAgICBtUGlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICBtVWlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICBtUGtnTmFtZSA9IGRhdGEucmVhZENTdHJpbmcoKTsKKyAgICBtUGtnVmVyc2lvbkNvZGUgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgIG1TZXNzaW9uSUQgPSBkYXRhLnJlYWRJbnQ2NCgpOwogICAgIG1GaW5hbGl6ZWQgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgIG1UaW1lc3RhbXAgPSBkYXRhLnJlYWRJbnQ2NCgpOwpAQCAtNjExLDYgKzY1NiwxMCBAQAogCiAKICAgICBkYXRhLT53cml0ZUNTdHJpbmcobUtleS5jX3N0cigpKTsKKyAgICBkYXRhLT53cml0ZUludDMyKG1QaWQpOworICAgIGRhdGEtPndyaXRlSW50MzIobVVpZCk7CisgICAgZGF0YS0+d3JpdGVDU3RyaW5nKG1Qa2dOYW1lLmNfc3RyKCkpOworICAgIGRhdGEtPndyaXRlSW50MzIobVBrZ1ZlcnNpb25Db2RlKTsKICAgICBkYXRhLT53cml0ZUludDY0KG1TZXNzaW9uSUQpOwogICAgIGRhdGEtPndyaXRlSW50MzIobUZpbmFsaXplZCk7CiAgICAgZGF0YS0+d3JpdGVJbnQ2NChtVGltZXN0YW1wKTsKQEAgLTY1MSwyMSArNzAwLDU0IEBACiAKIAogQVN0cmluZyBNZWRpYUFuYWx5dGljc0l0ZW06OnRvU3RyaW5nKCkgeworICAgcmV0dXJuIHRvU3RyaW5nKC0xKTsKK30KIAotICAgIEFTdHJpbmcgcmVzdWx0ID0gIigiOworQVN0cmluZyBNZWRpYUFuYWx5dGljc0l0ZW06OnRvU3RyaW5nKGludCB2ZXJzaW9uKSB7CisKKyAgICAvLyB2MCA6IHJlbGVhc2VkIHdpdGggJ28nCisgICAgLy8gdjEgOiBidWcgZml4IChtaXNzaW5nIHBpZC9maW5hbGl6ZWQgc2VwYXJhdG9yKSwKKyAgICAvLyAgICAgIGFkZHMgYXBrIG5hbWUsIGFwayB2ZXJzaW9uIGNvZGUKKworICAgIGlmICh2ZXJzaW9uIDw9IFBST1RPX0ZJUlNUKSB7CisgICAgICAgIC8vIGRlZmF1bHQgdG8gb3JpZ2luYWwgdjAgZm9ybWF0LCB1bnRpbCBwcm9wZXIgcGFyc2VycyBhcmUgaW4gcGxhY2UKKyAgICAgICAgdmVyc2lvbiA9IFBST1RPX1YwOworICAgIH0gZWxzZSBpZiAodmVyc2lvbiA+IFBST1RPX0xBU1QpIHsKKyAgICAgICAgdmVyc2lvbiA9IFBST1RPX0xBU1Q7CisgICAgfQorCisgICAgQVN0cmluZyByZXN1bHQ7CiAgICAgY2hhciBidWZmZXJbNTEyXTsKIAorICAgIGlmICh2ZXJzaW9uID09IFBST1RPX1YwKSB7CisgICAgICAgIHJlc3VsdCA9ICIoIjsKKyAgICB9IGVsc2UgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiWyVkOiIsIHZlcnNpb24pOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorCiAgICAgLy8gc2FtZSBvcmRlciBhcyB3ZSBzcGlsbCBpbnRvIHRoZSBwYXJjZWwsIGFsdGhvdWdoIG5vdCByZXF1aXJlZAogICAgIC8vIGtleStzZXNzaW9uIGFyZSBvdXIgcHJpbWFyeSBtYXRjaGluZyBjcml0ZXJpYQotICAgIC8vUkJFIEFMT0dEKCJtS2V5LmNfc3RyIik7CiAgICAgcmVzdWx0LmFwcGVuZChtS2V5LmNfc3RyKCkpOwotICAgIC8vUkJFIEFMT0dEKCJwb3N0LW1LZXkuY19zdHIiKTsKICAgICByZXN1bHQuYXBwZW5kKCI6Iik7CiAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiUiIFBSSWQ2NCAiOiIsIG1TZXNzaW9uSUQpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKIAotICAgIC8vIHdlIG5lZWQgdGhlc2UgaW50ZXJuYWxseSwgYnV0IGRvbid0IHdhbnQgdG8gdXBsb2FkIHRoZW0KLSAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJWQ6JWQiLCBtVWlkLCBtUGlkKTsKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJWQ6IiwgbVVpZCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgaWYgKHZlcnNpb24gPj0gUFJPVE9fVjEpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChtUGtnTmFtZSk7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICI6JWQ6IiwgbVBrZ1ZlcnNpb25Db2RlKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIH0KKworICAgIC8vIGluICdvJyAodjEpICwgdGhlIHNlcGFyYXRvciBiZXR3ZWVuIHBpZCBhbmQgZmluYWxpemVkIHdhcyBvbWl0dGVkCisgICAgaWYgKHZlcnNpb24gPD0gUFJPVE9fVjApIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVkIiwgbVBpZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVkOiIsIG1QaWQpOworICAgIH0KICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAKICAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJWQ6IiwgbUZpbmFsaXplZCk7CkBAIC03MTMsNyArNzk1LDExIEBACiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgfQogCi0gICAgcmVzdWx0LmFwcGVuZCgiKSIpOworICAgIGlmICh2ZXJzaW9uID09IFBST1RPX1YwKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIikiKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQuYXBwZW5kKCJdIik7CisgICAgfQogCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTczNCwxMSArODIwLDE2IEBACiAgICAgc3A8SU1lZGlhQW5hbHl0aWNzU2VydmljZT4gc3ZjID0gZ2V0SW5zdGFuY2UoKTsKIAogICAgIGlmIChzdmMgIT0gTlVMTCkgewotICAgICAgICBzdmMtPnN1Ym1pdCh0aGlzLCBmb3JjZW5ldyk7CisgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbTo6U2Vzc2lvbklEX3QgbmV3aWQgPSBzdmMtPnN1Ym1pdCh0aGlzLCBmb3JjZW5ldyk7CisgICAgICAgIGlmIChuZXdpZCA9PSBTZXNzaW9uSURJbnZhbGlkKSB7CisgICAgICAgICAgICBBU3RyaW5nIHAgPSB0aGlzLT50b1N0cmluZygpOworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byByZWNvcmQ6ICVzIFtmb3JjZW5ldz0lZF0iLCBwLmNfc3RyKCksIGZvcmNlbmV3KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9IGVsc2UgewogICAgICAgICBBU3RyaW5nIHAgPSB0aGlzLT50b1N0cmluZygpOwotICAgICAgICBBTE9HRCgiVW5hYmxlIHRvIHJlY29yZDogJXMgW2ZvcmNlbmV3PSVkXSIsIHAuY19zdHIoKSwgZm9yY2VuZXcpOworICAgICAgICBBTE9HVygiVW5hYmxlIHRvIHJlY29yZDogJXMgW2ZvcmNlbmV3PSVkXSIsIHAuY19zdHIoKSwgZm9yY2VuZXcpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogfQpAQCAtNzQ3LDYgKzgzOCw3IEBACiAvLyBzdGF0aWMKIHNwPElNZWRpYUFuYWx5dGljc1NlcnZpY2U+IE1lZGlhQW5hbHl0aWNzSXRlbTo6c0FuYWx5dGljc1NlcnZpY2U7CiBzdGF0aWMgTXV0ZXggc0luaXRNdXRleDsKK3N0YXRpYyBpbnQgcmVtYWluaW5nQmluZEF0dGVtcHRzID0gU1ZDX1RSSUVTOwogCiAvL3N0YXRpYwogYm9vbCBNZWRpYUFuYWx5dGljc0l0ZW06OmlzRW5hYmxlZCgpIHsKQEAgLTc2NCwxMCArODU2LDI4IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKKworLy8gbW9uaXRvciBoZWFsdGggb2Ygb3VyIGNvbm5lY3Rpb24gdG8gdGhlIG1ldHJpY3Mgc2VydmljZQorY2xhc3MgTWVkaWFNZXRyaWNzRGVhdGhOb3RpZmllciA6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7CisgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICYpIHsKKyAgICAgICAgICAgIEFMT0dXKCJSZWFjcXVpcmUgc2VydmljZSBjb25uZWN0aW9uIG9uIG5leHQgcmVxdWVzdCIpOworICAgICAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtOjpkcm9wSW5zdGFuY2UoKTsKKyAgICAgICAgfQorfTsKKworc3RhdGljIHNwPE1lZGlhTWV0cmljc0RlYXRoTm90aWZpZXI+IHNOb3RpZmllciA9IE5VTEw7CisKKy8vIHN0YXRpYwordm9pZCBNZWRpYUFuYWx5dGljc0l0ZW06OmRyb3BJbnN0YW5jZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woc0luaXRNdXRleCk7CisgICAgcmVtYWluaW5nQmluZEF0dGVtcHRzID0gU1ZDX1RSSUVTOworICAgIHNBbmFseXRpY3NTZXJ2aWNlID0gTlVMTDsKK30KKwogLy9zdGF0aWMKIHNwPElNZWRpYUFuYWx5dGljc1NlcnZpY2U+IE1lZGlhQW5hbHl0aWNzSXRlbTo6Z2V0SW5zdGFuY2UoKSB7CisKICAgICBzdGF0aWMgY29uc3QgY2hhciAqc2VydmljZW5hbWUgPSAibWVkaWEubWV0cmljcyI7Ci0gICAgc3RhdGljIGludCB0cmllc19yZW1haW5pbmcgPSBTVkNfVFJJRVM7CiAgICAgaW50IGVuYWJsZWQgPSBpc0VuYWJsZWQoKTsKIAogICAgIGlmIChlbmFibGVkID09IGZhbHNlKSB7CkBAIC03OTksMTUgKzkwOSwyMCBAQAogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woc0luaXRNdXRleCk7CiAgICAgICAgIGNvbnN0IGNoYXIgKmJhZG5lc3MgPSAiIjsKIAotICAgICAgICAvLyB0aGluayBvZiB0cmllc19yZW1haW5pbmcgYXMgdGVsbGluZyB1cyB3aGV0aGVyIHNlcnZpY2U9PU5VTEwgYmVjYXVzZQorICAgICAgICAvLyB0aGluayBvZiByZW1haW5pbmdCaW5kQXR0ZW1wdHMgYXMgdGVsbGluZyB1cyB3aGV0aGVyIHNlcnZpY2U9PU5VTEwgYmVjYXVzZQogICAgICAgICAvLyAoMSkgd2UgaGF2ZW4ndCB0cmllZCB0byBpbml0aWFsaXplIGl0IHlldAogICAgICAgICAvLyAoMikgd2UndmUgdHJpZWQgdG8gaW5pdGlhbGl6ZSBpdCwgYnV0IGZhaWxlZC4KLSAgICAgICAgaWYgKHNBbmFseXRpY3NTZXJ2aWNlID09IE5VTEwgJiYgdHJpZXNfcmVtYWluaW5nID4gMCkgeworICAgICAgICBpZiAoc0FuYWx5dGljc1NlcnZpY2UgPT0gTlVMTCAmJiByZW1haW5pbmdCaW5kQXR0ZW1wdHMgPiAwKSB7CiAgICAgICAgICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CiAgICAgICAgICAgICBpZiAoc20gIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KHNlcnZpY2VuYW1lKSk7CiAgICAgICAgICAgICAgICAgaWYgKGJpbmRlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIHNBbmFseXRpY3NTZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhQW5hbHl0aWNzU2VydmljZT4oYmluZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNOb3RpZmllciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzTm90aWZpZXIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNOb3RpZmllciA9IG5ldyBNZWRpYU1ldHJpY3NEZWF0aE5vdGlmaWVyKCk7CisgICAgICAgICAgICAgICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgoc05vdGlmaWVyKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBiYWRuZXNzID0gImRpZCBub3QgZmluZCBzZXJ2aWNlIjsKICAgICAgICAgICAgICAgICB9CkBAIC04MTYsOCArOTMxLDggQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKHNBbmFseXRpY3NTZXJ2aWNlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAodHJpZXNfcmVtYWluaW5nID4gMCkgewotICAgICAgICAgICAgICAgICAgICB0cmllc19yZW1haW5pbmctLTsKKyAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nQmluZEF0dGVtcHRzID4gMCkgeworICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdCaW5kQXR0ZW1wdHMtLTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKERFQlVHX1NFUlZJQ0VBQ0NFU1MpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlVuYWJsZSB0byBiaW5kIHRvIHNlcnZpY2UgJXM6ICVzIiwgc2VydmljZW5hbWUsIGJhZG5lc3MpOwpAQCAtODI5LDcgKzk0NCw2IEBACiAgICAgfQogfQogCi0KIC8vIG1lcmdlIHRoZSBpbmZvIGZyb20gJ2luY29taW5nJyBpbnRvIHRoaXMgcmVjb3JkLgogLy8gd2UgZmluaXNoIHdpdGggYSB1bmlvbiBvZiB0aGlzK2luY29taW5nIGFuZCBzcGVjaWFsIGhhbmRsaW5nIGZvciBjb2xsaXNpb25zCiBib29sIE1lZGlhQW5hbHl0aWNzSXRlbTo6bWVyZ2UoTWVkaWFBbmFseXRpY3NJdGVtICppbmNvbWluZykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFBbmFseXRpY3NJdGVtLmggYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYUFuYWx5dGljc0l0ZW0uaAppbmRleCBkYzUwMWIyLi5kZDc0NTJmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYUFuYWx5dGljc0l0ZW0uaAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYUFuYWx5dGljc0l0ZW0uaApAQCAtNDIsNiArNDIsNyBAQAogICAgIGZyaWVuZCBjbGFzcyBJTWVkaWFBbmFseXRpY3NTZXJ2aWNlOwogICAgIGZyaWVuZCBjbGFzcyBNZWRpYU1ldHJpY3NKTkk7CiAgICAgZnJpZW5kIGNsYXNzIE1ldHJpY3NTdW1tYXJpemVyOworICAgIGZyaWVuZCBjbGFzcyBNZWRpYU1ldHJpY3NEZWF0aE5vdGlmaWVyOwogCiAgICAgcHVibGljOgogCkBAIC03NSw2ICs3NiwxNCBAQAogICAgICAgICB0eXBlZGVmIGNvbnN0IGNoYXIgKkF0dHI7CiAKIAorICAgICAgICBlbnVtIHsKKyAgICAgICAgICAgIFBST1RPX1YwID0gMCwKKyAgICAgICAgICAgIFBST1RPX0ZJUlNUID0gUFJPVE9fVjAsCisgICAgICAgICAgICBQUk9UT19WMSA9IDEsCisgICAgICAgICAgICBQUk9UT19MQVNUID0gUFJPVE9fVjEsCisgICAgICAgIH07CisKKwogICAgIHB1YmxpYzoKIAogICAgICAgICAvLyBhY2Nlc3MgZnVuY3Rpb25zIGZvciB0aGUgY2xhc3MKQEAgLTE2MSwxMSArMTcwLDE4IEBACiAgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAmc2V0VWlkKHVpZF90KTsKICAgICAgICAgdWlkX3QgZ2V0VWlkKCkgY29uc3Q7CiAKKyAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICZzZXRQa2dOYW1lKEFTdHJpbmcpOworICAgICAgICBBU3RyaW5nIGdldFBrZ05hbWUoKSBjb25zdDsKKworICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gJnNldFBrZ1ZlcnNpb25Db2RlKGludDMyX3QpOworICAgICAgICBpbnQzMl90IGdldFBrZ1ZlcnNpb25Db2RlKCkgY29uc3Q7CisKICAgICAgICAgLy8gb3VyIHNlcmlhbGl6YXRpb24gY29kZSBmb3IgYmluZGVyIGNhbGxzCiAgICAgICAgIGludDMyX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKik7CiAgICAgICAgIGludDMyX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsJik7CiAKICAgICAgICAgQVN0cmluZyB0b1N0cmluZygpOworICAgICAgICBBU3RyaW5nIHRvU3RyaW5nKGludCB2ZXJzaW9uKTsKIAogICAgICAgICAvLyBhcmUgd2UgY29sbGVjdGluZyBhbmFseXRpY3MgZGF0YQogICAgICAgICBzdGF0aWMgYm9vbCBpc0VuYWJsZWQoKTsKQEAgLTE4OCwxMCArMjA0LDEzIEBACiAgICAgICAgIC8vIHRvIGhlbHAgdmFsaWRhdGUgdGhhdCBBIGRvZXNuJ3QgbWVzcyB3aXRoIEIncyByZWNvcmRzCiAgICAgICAgIHBpZF90ICAgICBtUGlkOwogICAgICAgICB1aWRfdCAgICAgbVVpZDsKKyAgICAgICAgQVN0cmluZyAgIG1Qa2dOYW1lOworICAgICAgICBpbnQzMl90ICAgbVBrZ1ZlcnNpb25Db2RlOwogCiAgICAgICAgIC8vIGxldCdzIHJldXNlIGEgYmluZGVyIGNvbm5lY3Rpb24KICAgICAgICAgc3RhdGljIHNwPElNZWRpYUFuYWx5dGljc1NlcnZpY2U+IHNBbmFseXRpY3NTZXJ2aWNlOwogICAgICAgICBzdGF0aWMgc3A8SU1lZGlhQW5hbHl0aWNzU2VydmljZT4gZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgc3RhdGljIHZvaWQgZHJvcEluc3RhbmNlKCk7CiAKICAgICAgICAgLy8gdHJhY2tpbmcgaW5mb3JtYXRpb24KICAgICAgICAgU2Vzc2lvbklEX3QgbVNlc3Npb25JRDsgICAgICAgICAvLyBncm91cGluZyBzaW1pbGFyIHJlY29yZHMKQEAgLTIyOCw2ICsyNDcsNyBAQAogICAgICAgICBzaXplX3QgZmluZFByb3BJbmRleChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbGVuKTsKICAgICAgICAgUHJvcCAqZmluZFByb3AoY29uc3QgY2hhciAqbmFtZSk7CiAgICAgICAgIFByb3AgKmFsbG9jYXRlUHJvcChjb25zdCBjaGFyICpuYW1lKTsKKyAgICAgICAgYm9vbCByZW1vdmVQcm9wKGNvbnN0IGNoYXIgKm5hbWUpOwogCiAgICAgICAgIHNpemVfdCBtUHJvcENvdW50OwogICAgICAgICBzaXplX3QgbVByb3BTaXplOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAppbmRleCA5NDJhOGZjLi40OTZkYjBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcApAQCAtNzcsNyArNzcsNyBAQAogI2luY2x1ZGUgIlRlc3RQbGF5ZXJTdHViLmgiCiAjaW5jbHVkZSAibnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaCIKIAotI2luY2x1ZGUgPE9NWC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVguaD4KIAogI2luY2x1ZGUgIkhEQ1AuaCIKICNpbmNsdWRlICJIVFRQQmFzZS5oIgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAKaW5kZXggNzkzZjQ3Ni4uNWE0NjhmMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwCkBAIC0xNzUsNyArMTc1LDcgQEAKIH0KIAogc3RhdHVzX3QgTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQ6OnNldERhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IHNwPElEYXRhU291cmNlPiYgc291cmNlKQorICAgICAgICBjb25zdCBzcDxJRGF0YVNvdXJjZT4mIHNvdXJjZSwgY29uc3QgY2hhciAqbWltZSkKIHsKICAgICBBTE9HVigic2V0RGF0YVNvdXJjZShJRGF0YVNvdXJjZSkiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CkBAIC0xODYsMTYgKzE4NiwxOCBAQAogICAgIEFMT0dWKCJwbGF5ZXIgdHlwZSA9ICVkIiwgcGxheWVyVHlwZSk7CiAgICAgc3A8TWVkaWFNZXRhZGF0YVJldHJpZXZlckJhc2U+IHAgPSBjcmVhdGVSZXRyaWV2ZXIocGxheWVyVHlwZSk7CiAgICAgaWYgKHAgPT0gTlVMTCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3RhdHVzX3QgcmV0ID0gcC0+c2V0RGF0YVNvdXJjZShkYXRhU291cmNlKTsKKyAgICBzdGF0dXNfdCByZXQgPSBwLT5zZXREYXRhU291cmNlKGRhdGFTb3VyY2UsIG1pbWUpOwogICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIG1SZXRyaWV2ZXIgPSBwOwogICAgIHJldHVybiByZXQ7CiB9CiAKIE11dGV4IE1ldGFkYXRhUmV0cmlldmVyQ2xpZW50OjpzTG9jazsKIAotc3A8SU1lbW9yeT4gTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQ6OmdldEZyYW1lQXRUaW1lKGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uKQorc3A8SU1lbW9yeT4gTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQ6OmdldEZyYW1lQXRUaW1lKAorICAgICAgICBpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbiwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5KQogewotICAgIEFMT0dWKCJnZXRGcmFtZUF0VGltZTogdGltZSglbGxkIHVzKSBvcHRpb24oJWQpIiwgKGxvbmcgbG9uZyl0aW1lVXMsIG9wdGlvbik7CisgICAgQUxPR1YoImdldEZyYW1lQXRUaW1lOiB0aW1lKCVsbGQgdXMpIG9wdGlvbiglZCkgY29sb3JGb3JtYXQoJWQpLCBtZXRhT25seSglZCkiLAorICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lVXMsIG9wdGlvbiwgY29sb3JGb3JtYXQsIG1ldGFPbmx5KTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGdsb2NrKHNMb2NrKTsKICAgICBtVGh1bWJuYWlsLmNsZWFyKCk7CkBAIC0yMDMsMTIgKzIwNSwxMyBAQAogICAgICAgICBBTE9HRSgicmV0cmlldmVyIGlzIG5vdCBpbml0aWFsaXplZCIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgVmlkZW9GcmFtZSAqZnJhbWUgPSBtUmV0cmlldmVyLT5nZXRGcmFtZUF0VGltZSh0aW1lVXMsIG9wdGlvbik7CisgICAgVmlkZW9GcmFtZSAqZnJhbWUgPSBtUmV0cmlldmVyLT5nZXRGcmFtZUF0VGltZSgKKyAgICAgICAgICAgIHRpbWVVcywgb3B0aW9uLCBjb2xvckZvcm1hdCwgbWV0YU9ubHkpOwogICAgIGlmIChmcmFtZSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gY2FwdHVyZSBhIHZpZGVvIGZyYW1lIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBzaXplX3Qgc2l6ZSA9IHNpemVvZihWaWRlb0ZyYW1lKSArIGZyYW1lLT5tU2l6ZTsKKyAgICBzaXplX3Qgc2l6ZSA9IGZyYW1lLT5nZXRGbGF0dGVuZWRTaXplKCk7CiAgICAgc3A8TWVtb3J5SGVhcEJhc2U+IGhlYXAgPSBuZXcgTWVtb3J5SGVhcEJhc2Uoc2l6ZSwgMCwgIk1ldGFkYXRhUmV0cmlldmVyQ2xpZW50Iik7CiAgICAgaWYgKGhlYXAgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGNyZWF0ZSBNZW1vcnlEZWFsZXIiKTsKQEAgLTIyMiwxNiArMjI1LDcgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIFZpZGVvRnJhbWUgKmZyYW1lQ29weSA9IHN0YXRpY19jYXN0PFZpZGVvRnJhbWUgKj4obVRodW1ibmFpbC0+cG9pbnRlcigpKTsKLSAgICBmcmFtZUNvcHktPm1XaWR0aCA9IGZyYW1lLT5tV2lkdGg7Ci0gICAgZnJhbWVDb3B5LT5tSGVpZ2h0ID0gZnJhbWUtPm1IZWlnaHQ7Ci0gICAgZnJhbWVDb3B5LT5tRGlzcGxheVdpZHRoID0gZnJhbWUtPm1EaXNwbGF5V2lkdGg7Ci0gICAgZnJhbWVDb3B5LT5tRGlzcGxheUhlaWdodCA9IGZyYW1lLT5tRGlzcGxheUhlaWdodDsKLSAgICBmcmFtZUNvcHktPm1TaXplID0gZnJhbWUtPm1TaXplOwotICAgIGZyYW1lQ29weS0+bVJvdGF0aW9uQW5nbGUgPSBmcmFtZS0+bVJvdGF0aW9uQW5nbGU7Ci0gICAgQUxPR1YoInJvdGF0aW9uOiAlZCIsIGZyYW1lQ29weS0+bVJvdGF0aW9uQW5nbGUpOwotICAgIGZyYW1lQ29weS0+bURhdGEgPSAodWludDhfdCAqKWZyYW1lQ29weSArIHNpemVvZihWaWRlb0ZyYW1lKTsKLSAgICBtZW1jcHkoZnJhbWVDb3B5LT5tRGF0YSwgZnJhbWUtPm1EYXRhLCBmcmFtZS0+bVNpemUpOwotICAgIGZyYW1lQ29weS0+bURhdGEgPSAwOworICAgIGZyYW1lQ29weS0+Y29weUZsYXR0ZW5lZCgqZnJhbWUpOwogICAgIGRlbGV0ZSBmcmFtZTsgIC8vIEZpeCBtZW1vcnkgbGVha2FnZQogICAgIHJldHVybiBtVGh1bWJuYWlsOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuaAppbmRleCBmZTc1NDdjLi5jNzhjZDRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuaApAQCAtNDksOCArNDksOSBAQAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SURhdGFTb3VyY2U+JiBzb3VyY2UpOwotICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gICAgICAgICAgICAgZ2V0RnJhbWVBdFRpbWUoaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24pOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICAgICAgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxJRGF0YVNvdXJjZT4mIHNvdXJjZSwgY29uc3QgY2hhciAqbWltZSk7CisgICAgdmlydHVhbCBzcDxJTWVtb3J5PiAgICAgICAgICAgICBnZXRGcmFtZUF0VGltZSgKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uLCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHkpOwogICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gICAgICAgICAgICAgZXh0cmFjdEFsYnVtQXJ0KCk7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyKiAgICAgICAgICAgICBleHRyYWN0TWV0YWRhdGEoaW50IGtleUNvZGUpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcAppbmRleCA2YTA5MjI3Li5kZjM2MDQ2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKQEAgLTExNzEsNyArMTE3MSw3IEBACiAgICAgICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9EZWNvZGVyRXJyb3IgfHwgbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSA9PSBOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1TdXJmYWNlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbVN1cmZhY2UgPT0gTlVMTCB8fCBtVmlkZW9EZWNvZGVyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIGJvdGggYXVkaW8gYW5kIHZpZGVvIGhhdmUgZXJyb3IsIG9yIHRoaXMgc3RyZWFtIGhhcyBvbmx5IGF1ZGlvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggaGFzIGVycm9yLCBub3RpZnkgY2xpZW50IG9mIGVycm9yLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9VTktOT1dOLCBlcnIpOwpAQCAtMTE4Miw3ICsxMTgyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0RlY29kZXJFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvRGVjb2RlckVycm9yIHx8IG1Tb3VyY2UtPmdldEZvcm1hdCh0cnVlIC8qIGF1ZGlvICovKSA9PSBOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1BdWRpb1NpbmsgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtQXVkaW9TaW5rID09IE5VTEwgfHwgbUF1ZGlvRGVjb2RlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBib3RoIGF1ZGlvIGFuZCB2aWRlbyBoYXZlIGVycm9yLCBvciB0aGlzIHN0cmVhbSBoYXMgb25seSB2aWRlbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGhhcyBlcnJvciwgbm90aWZ5IGNsaWVudCBvZiBlcnJvci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfVU5LTk9XTiwgZXJyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKaW5kZXggOGZlMjU1Yi4uYWMxODdjYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKQEAgLTM0Myw3ICszNDMsNyBAQAogICAgICAgICAgICAgZm9ybWF0LCBtU3VyZmFjZSwgY3J5cHRvLCAwIC8qIGZsYWdzICovKTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjb25maWd1cmUgJXMgZGVjb2RlciAoZXJyPSVkKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY29uZmlndXJlIFslc10gZGVjb2RlciAoZXJyPSVkKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CiAgICAgICAgIG1Db2RlYy0+cmVsZWFzZSgpOwogICAgICAgICBtQ29kZWMuY2xlYXIoKTsKICAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKQEAgLTM3Miw3ICszNzIsNyBAQAogCiAgICAgZXJyID0gbUNvZGVjLT5zdGFydCgpOwogICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzdGFydCAlcyBkZWNvZGVyIChlcnI9JWQpIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzdGFydCBbJXNdIGRlY29kZXIgKGVycj0lZCkiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOwogICAgICAgICBtQ29kZWMtPnJlbGVhc2UoKTsKICAgICAgICAgbUNvZGVjLmNsZWFyKCk7CiAgICAgICAgIGhhbmRsZUVycm9yKGVycik7CkBAIC00NjAsNiArNDYwLDEyIEBACiAgICAgaWYgKG5vdGlmeUNvbXBsZXRlKSB7CiAgICAgICAgIG1SZXN1bWVQZW5kaW5nID0gdHJ1ZTsKICAgICB9CisKKyAgICBpZiAobUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIlslc10gb25SZXN1bWUgd2l0aG91dCBhIHZhbGlkIGNvZGVjIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgIGhhbmRsZUVycm9yKE5PX0lOSVQpOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIG1Db2RlYy0+c3RhcnQoKTsKIH0KIApAQCAtNDgxLDcgKzQ4Nyw3IEBACiAgICAgfQogCiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGZsdXNoICVzIChlcnI9JWQpIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBmbHVzaCBbJXNdIChlcnI9JWQpIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKICAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKICAgICAgICAgLy8gZmluaXNoIHdpdGggcG9zdGluZyBrV2hhdEZsdXNoQ29tcGxldGVkLgogICAgICAgICAvLyB3ZSBhdHRlbXB0IHRvIHJlbGVhc2UgdGhlIGJ1ZmZlcnMgZXZlbiBpZiBmbHVzaCBmYWlscy4KQEAgLTUzMCw3ICs1MzYsNyBAQAogICAgIHJlbGVhc2VBbmRSZXNldE1lZGlhQnVmZmVycygpOwogCiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHJlbGVhc2UgJXMgKGVycj0lZCkiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHJlbGVhc2UgWyVzXSAoZXJyPSVkKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CiAgICAgICAgIGhhbmRsZUVycm9yKGVycik7CiAgICAgICAgIC8vIGZpbmlzaCB3aXRoIHBvc3Rpbmcga1doYXRTaHV0ZG93bkNvbXBsZXRlZC4KICAgICB9CkBAIC02MzEsMTAgKzYzNywxNyBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgaWYgKG1Db2RlYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJbJXNdIGhhbmRsZUFuSW5wdXRCdWZmZXIgd2l0aG91dCBhIHZhbGlkIGNvZGVjIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgIGhhbmRsZUVycm9yKE5PX0lOSVQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCiAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyOwogICAgIG1Db2RlYy0+Z2V0SW5wdXRCdWZmZXIoaW5kZXgsICZidWZmZXIpOwogCiAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJbJXNdIGhhbmRsZUFuSW5wdXRCdWZmZXIsIGZhaWxlZCB0byBnZXQgaW5wdXQgYnVmZmVyIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAgICAgICAgIGhhbmRsZUVycm9yKFVOS05PV05fRVJST1IpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtNjk3LDExICs3MTAsMTggQEAKICAgICAgICAgc2l6ZV90IHNpemUsCiAgICAgICAgIGludDY0X3QgdGltZVVzLAogICAgICAgICBpbnQzMl90IGZsYWdzKSB7CisgICAgaWYgKG1Db2RlYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJbJXNdIGhhbmRsZUFuT3V0cHV0QnVmZmVyIHdpdGhvdXQgYSB2YWxpZCBjb2RlYyIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICBoYW5kbGVFcnJvcihOT19JTklUKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogLy8gICAgQ0hFQ0tfTFQoYnVmZmVySXgsIG1PdXRwdXRCdWZmZXJzLnNpemUoKSk7CiAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyOwogICAgIG1Db2RlYy0+Z2V0T3V0cHV0QnVmZmVyKGluZGV4LCAmYnVmZmVyKTsKIAogICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiWyVzXSBoYW5kbGVBbk91dHB1dEJ1ZmZlciwgZmFpbGVkIHRvIGdldCBvdXRwdXQgYnVmZmVyIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAgICAgICAgIGhhbmRsZUVycm9yKFVOS05PV05fRVJST1IpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtOTQ5LDYgKzk2OSwxMiBAQAogfQogCiBib29sIE51UGxheWVyOjpEZWNvZGVyOjpvbklucHV0QnVmZmVyRmV0Y2hlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGlmIChtQ29kZWMgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiWyVzXSBvbklucHV0QnVmZmVyRmV0Y2hlZCB3aXRob3V0IGEgdmFsaWQgY29kZWMiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgaGFuZGxlRXJyb3IoTk9fSU5JVCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICBzaXplX3QgYnVmZmVySXg7CiAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgiYnVmZmVyLWl4IiwgJmJ1ZmZlckl4KSk7CiAgICAgQ0hFQ0tfTFQoYnVmZmVySXgsIG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpKTsKQEAgLTk3OSw3ICsxMDA1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChzdHJlYW1FcnIgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICAgICAgQUxPR0UoIlN0cmVhbSBlcnJvciBmb3IgJXMgKGVycj0lZCksIEVPUyAlcyBxdWV1ZWQiLAorICAgICAgICAgICAgQUxPR0UoIlN0cmVhbSBlcnJvciBmb3IgWyVzXSAoZXJyPSVkKSwgRU9TICVzIHF1ZXVlZCIsCiAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUVyciwKICAgICAgICAgICAgICAgICAgICAgZXJyID09IE9LID8gInN1Y2Nlc3NmdWxseSIgOiAidW5zdWNjZXNzZnVsbHkiKTsKQEAgLTEwNzMsNyArMTA5OSw3IEBACiAgICAgICAgIH0gLy8gbm8gY3J5cHRJbmZvCiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIm9uSW5wdXRCdWZmZXJGZXRjaGVkOiBxdWV1ZSVzSW5wdXRCdWZmZXIgZmFpbGVkIGZvciAlcyAoZXJyPSVkLCAlcykiLAorICAgICAgICAgICAgQUxPR0UoIm9uSW5wdXRCdWZmZXJGZXRjaGVkOiBxdWV1ZSVzSW5wdXRCdWZmZXIgZmFpbGVkIGZvciBbJXNdIChlcnI9JWQsICVzKSIsCiAgICAgICAgICAgICAgICAgICAgIChjcnlwdEluZm8gIT0gTlVMTCA/ICJTZWN1cmUiIDogIiIpLAogICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIsIGVycm9yRGV0YWlsTXNnLmNfc3RyKCkpOwogICAgICAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKQEAgLTExMDIsNyArMTEyOCw5IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAobXNnLT5maW5kSW50MzIoInJlbmRlciIsICZyZW5kZXIpICYmIHJlbmRlcikgeworICAgIGlmIChtQ29kZWMgPT0gTlVMTCkgeworICAgICAgICBlcnIgPSBOT19JTklUOworICAgIH0gZWxzZSBpZiAobXNnLT5maW5kSW50MzIoInJlbmRlciIsICZyZW5kZXIpICYmIHJlbmRlcikgewogICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcE5zOwogICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZXN0YW1wTnMiLCAmdGltZXN0YW1wTnMpKTsKICAgICAgICAgZXJyID0gbUNvZGVjLT5yZW5kZXJPdXRwdXRCdWZmZXJBbmRSZWxlYXNlKGJ1ZmZlckl4LCB0aW1lc3RhbXBOcyk7CkBAIC0xMTExLDcgKzExMzksNyBAQAogICAgICAgICBlcnIgPSBtQ29kZWMtPnJlbGVhc2VPdXRwdXRCdWZmZXIoYnVmZmVySXgpOwogICAgIH0KICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gcmVsZWFzZSBvdXRwdXQgYnVmZmVyIGZvciAlcyAoZXJyPSVkKSIsCisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gcmVsZWFzZSBvdXRwdXQgYnVmZmVyIGZvciBbJXNdIChlcnI9JWQpIiwKICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOwogICAgICAgICBoYW5kbGVFcnJvcihlcnIpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCmluZGV4IGFkNzg4ZjcuLmRjMjk3NjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcApAQCAtNjksNiArNjksNyBAQAogICAgICAgbVBsYXllcihuZXcgTnVQbGF5ZXIocGlkKSksCiAgICAgICBtUGxheWVyRmxhZ3MoMCksCiAgICAgICBtQW5hbHl0aWNzSXRlbShOVUxMKSwKKyAgICAgIG1DbGllbnRVaWQoLTEpLAogICAgICAgbUF0RU9TKGZhbHNlKSwKICAgICAgIG1Mb29waW5nKGZhbHNlKSwKICAgICAgIG1BdXRvTG9vcChmYWxzZSkgewpAQCAtMTA5LDYgKzExMCwxMCBAQAogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0VUlEKHVpZF90IHVpZCkgewogICAgIG1QbGF5ZXItPnNldFVJRCh1aWQpOworICAgIG1DbGllbnRVaWQgPSB1aWQ7CisgICAgaWYgKG1BbmFseXRpY3NJdGVtKSB7CisgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRVaWQobUNsaWVudFVpZCk7CisgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtNjAxLDYgKzYwNiw3IEBACiAgICAgICAgIG1BbmFseXRpY3NJdGVtID0gbmV3IE1lZGlhQW5hbHl0aWNzSXRlbSgibnVwbGF5ZXIiKTsKICAgICAgICAgaWYgKG1BbmFseXRpY3NJdGVtKSB7CiAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+Z2VuZXJhdGVTZXNzaW9uSUQoKTsKKyAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRVaWQobUNsaWVudFVpZCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVigiZGlkIG5vdCBoYXZlIGFueXRoaW5nIHRvIHJlY29yZCIpOwpAQCAtNjM5LDExICs2NDUsNiBAQAogICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1NUT1BQRUQpOwogICAgIH0KIAotICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5kZWJ1Zy5zZi5zdGF0cyIsIGZhbHNlKSkgewotICAgICAgICBWZWN0b3I8U3RyaW5nMTY+IGFyZ3M7Ci0gICAgICAgIGR1bXAoLTEsIGFyZ3MpOwotICAgIH0KLQogICAgIG1TdGF0ZSA9IFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTOwogICAgIG1QbGF5ZXItPnJlc2V0QXN5bmMoKTsKIApAQCAtOTM1LDcgKzkzNiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBzZW5kIGNvbXBsZXRpb24gZXZlbnQgd2hlbiBsb29waW5nCiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QuZGVidWcuc2Yuc3RhdHMiLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgVmVjdG9yPFN0cmluZzE2PiBhcmdzOworICAgICAgICAgICAgICAgICAgICBkdW1wKC0xLCBhcmdzKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbVBsYXllci0+cGF1c2UoKTsKICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9QQVVTRUQ7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oCmluZGV4IGM1ZGRjYjAuLmQwY2YxZGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oCkBAIC0xMzIsMTEgKzEzMiwxMyBAQAogICAgIHVpbnQzMl90IG1QbGF5ZXJGbGFnczsKIAogICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqbUFuYWx5dGljc0l0ZW07CisgICAgdWlkX3QgbUNsaWVudFVpZDsKIAogICAgIGJvb2wgbUF0RU9TOwogICAgIGJvb2wgbUxvb3Bpbmc7CiAgICAgYm9vbCBtQXV0b0xvb3A7CiAKKwogICAgIHZvaWQgdXBkYXRlTWV0cmljcyhjb25zdCBjaGFyICp3aGVyZSk7CiAgICAgdm9pZCBsb2dNZXRyaWNzKGNvbnN0IGNoYXIgKndoZXJlKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCmluZGV4IDc1OGRiMWYuLmJkODY2Y2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKQEAgLTg0MCw3ICs4NDAsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgbm90aWZ5RU9TKHRydWUgLyogYXVkaW8gKi8sIEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgIG5vdGlmeUVPU19sKHRydWUgLyogYXVkaW8gKi8sIEVSUk9SX0VORF9PRl9TVFJFQU0pOwogfQogCiBzaXplX3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpmaWxsQXVkaW9CdWZmZXIodm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgewpAQCAtOTE3LDEwICs5MTcsMTAgQEAKICAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rLT5uZWVkc1RyYWlsaW5nUGFkZGluZygpKSB7CiAgICAgICAgICAgICAgICAgcG9zdEVPU0RlbGF5VXMgPSBnZXRQZW5kaW5nQXVkaW9QbGF5b3V0RHVyYXRpb25VcyhBTG9vcGVyOjpHZXROb3dVcygpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJmaWxsQXVkaW9CdWZmZXI6IG5vdGlmeUVPUyAiCisgICAgICAgICAgICBBTE9HVigiZmlsbEF1ZGlvQnVmZmVyOiBub3RpZnlFT1NfbCAiCiAgICAgICAgICAgICAgICAgICAgICJtTnVtRnJhbWVzV3JpdHRlbjoldSAgZmluYWxSZXN1bHQ6JWQgIHBvc3RFT1NEZWxheTolbGxkIiwKICAgICAgICAgICAgICAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4sIGVudHJ5LT5tRmluYWxSZXN1bHQsIChsb25nIGxvbmcpcG9zdEVPU0RlbGF5VXMpOwotICAgICAgICAgICAgbm90aWZ5RU9TKHRydWUgLyogYXVkaW8gKi8sIGVudHJ5LT5tRmluYWxSZXN1bHQsIHBvc3RFT1NEZWxheVVzKTsKKyAgICAgICAgICAgIG5vdGlmeUVPU19sKHRydWUgLyogYXVkaW8gKi8sIGVudHJ5LT5tRmluYWxSZXN1bHQsIHBvc3RFT1NEZWxheVVzKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gc2l6ZUNvcGllZDsKQEAgLTExNTIsNyArMTE1MiwxOCBAQAogICAgICAgICAgICAgcmV0dXJuIHdyaXR0ZW5BdWRpb0R1cmF0aW9uVXMgLSAobWVkaWFVcyAtIG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMpOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiB3cml0dGVuQXVkaW9EdXJhdGlvblVzIC0gbUF1ZGlvU2luay0+Z2V0UGxheWVkT3V0RHVyYXRpb25Vcyhub3dVcyk7CisKKyAgICBjb25zdCBpbnQ2NF90IGF1ZGlvU2lua1BsYXllZFVzID0gbUF1ZGlvU2luay0+Z2V0UGxheWVkT3V0RHVyYXRpb25Vcyhub3dVcyk7CisgICAgaW50NjRfdCBwZW5kaW5nVXMgPSB3cml0dGVuQXVkaW9EdXJhdGlvblVzIC0gYXVkaW9TaW5rUGxheWVkVXM7CisgICAgaWYgKHBlbmRpbmdVcyA8IDApIHsKKyAgICAgICAgLy8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuIHVubGVzcyB0aGUgdGltZXN0YW1wIGlzIHN0YWxlLgorICAgICAgICBBTE9HVygiJXM6IHBlbmRpbmdVcyAlbGxkIDwgMCwgY2xhbXBpbmcgdG8gemVybywgcG90ZW50aWFsIHJlc3VtZSBhZnRlciBwYXVzZSAiCisgICAgICAgICAgICAgICAgIndyaXR0ZW5BdWRpb0R1cmF0aW9uVXM6ICVsbGQsIGF1ZGlvU2lua1BsYXllZFVzOiAlbGxkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKGxvbmcgbG9uZylwZW5kaW5nVXMsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl3cml0dGVuQXVkaW9EdXJhdGlvblVzLCAobG9uZyBsb25nKWF1ZGlvU2lua1BsYXllZFVzKTsKKyAgICAgICAgcGVuZGluZ1VzID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHBlbmRpbmdVczsKIH0KIAogaW50NjRfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmdldFJlYWxUaW1lVXMoaW50NjRfdCBtZWRpYVRpbWVVcywgaW50NjRfdCBub3dVcykgewpAQCAtMTQwOCw2ICsxNDE5LDExIEBACiB9CiAKIHZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpub3RpZnlFT1MoYm9vbCBhdWRpbywgc3RhdHVzX3QgZmluYWxSZXN1bHQsIGludDY0X3QgZGVsYXlVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbm90aWZ5RU9TX2woYXVkaW8sIGZpbmFsUmVzdWx0LCBkZWxheVVzKTsKK30KKwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om5vdGlmeUVPU19sKGJvb2wgYXVkaW8sIHN0YXR1c190IGZpbmFsUmVzdWx0LCBpbnQ2NF90IGRlbGF5VXMpIHsKICAgICBpZiAoYXVkaW8gJiYgZGVsYXlVcyA+IDApIHsKICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEVPUywgdGhpcyk7CiAgICAgICAgIG1zZy0+c2V0SW50MzIoImF1ZGlvRU9TR2VuZXJhdGlvbiIsIG1BdWRpb0VPU0dlbmVyYXRpb24pOwpAQCAtMTQyMCw2ICsxNDM2LDExIEBACiAgICAgbm90aWZ5LT5zZXRJbnQzMigiYXVkaW8iLCBzdGF0aWNfY2FzdDxpbnQzMl90PihhdWRpbykpOwogICAgIG5vdGlmeS0+c2V0SW50MzIoImZpbmFsUmVzdWx0IiwgZmluYWxSZXN1bHQpOwogICAgIG5vdGlmeS0+cG9zdChkZWxheVVzKTsKKworICAgIGlmIChhdWRpbykgeworICAgICAgICAvLyBWaWRlbyBtaWdodCBvdXRsaXZlIGF1ZGlvLiBDbGVhciBhbmNob3IgdG8gZW5hYmxlIHZpZGVvIG9ubHkgY2FzZS4KKyAgICAgICAgbUFuY2hvclRpbWVNZWRpYVVzID0gLTE7CisgICAgfQogfQogCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6bm90aWZ5QXVkaW9UZWFyRG93bihBdWRpb1RlYXJEb3duUmVhc29uIHJlYXNvbikgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmgKaW5kZXggZTY4NTBiNS4uZjU4Yjc5YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCkBAIC0yNzUsNiArMjc1LDcgQEAKICAgICB2b2lkIG9uQ2hhbmdlQXVkaW9Gb3JtYXQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtZXRhLCBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7CiAKICAgICB2b2lkIG5vdGlmeUVPUyhib29sIGF1ZGlvLCBzdGF0dXNfdCBmaW5hbFJlc3VsdCwgaW50NjRfdCBkZWxheVVzID0gMCk7CisgICAgdm9pZCBub3RpZnlFT1NfbChib29sIGF1ZGlvLCBzdGF0dXNfdCBmaW5hbFJlc3VsdCwgaW50NjRfdCBkZWxheVVzID0gMCk7CiAgICAgdm9pZCBub3RpZnlGbHVzaENvbXBsZXRlKGJvb2wgYXVkaW8pOwogICAgIHZvaWQgbm90aWZ5UG9zaXRpb24oKTsKICAgICB2b2lkIG5vdGlmeVZpZGVvTGF0ZUJ5KGludDY0X3QgbGF0ZUJ5VXMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vQW5kcm9pZC5icCBiL21lZGlhL2xpYm5iYWlvL0FuZHJvaWQuYnAKaW5kZXggZjUxMTg3Ni4uNDIyMGI3NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJuYmFpby9BbmRyb2lkLmJwCkBAIC0xLDE1ICsxLDUxIEBACisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGlibmJhaW9fbW9ub19kZWZhdWx0cyIsCisgICAgc3JjczogWworICAgICAgICAiTW9ub1BpcGUuY3BwIiwKKyAgICAgICAgIk1vbm9QaXBlUmVhZGVyLmNwcCIsCisgICAgICAgICJOQkFJTy5jcHAiLAorICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50X2hlYWRlcnMiLAorICAgICAgICAibGliYXVkaW9fc3lzdGVtX2hlYWRlcnMiLAorICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgXSwKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGVfbW9ubyJdLAorfQorCisvLyBsaWJuYmFpb19tb25vIGlzIHRoZSBwYXJ0IG9mIGxpYm5iYWlvIHRoYXQgaXMgYXZhaWxhYmxlIGZvciB2ZW5kb3JzIHRvIHVzZS4gVmVuZG9yIG1vZHVsZXMgY2FuJ3QKKy8vIGxpbmsgYWdhaW5zdCBsaWJuYmFpbyBhbmQgc3lzdGVtIG1vZHVsZXMgY2FuJ3QgbGluayBhZ2FpbnN0IGxpYm5iYWlvX21vbm8uIFRoZSByZXN0IG9mIGxpYm5iYWlvCisvLyBwdWxscyBpbiB0b28gbWFueSBvdGhlciBkZXBlbmRlbmNpZXMuCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYm5iYWlvX21vbm8iLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBkZWZhdWx0czogWyJsaWJuYmFpb19tb25vX2RlZmF1bHRzIl0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlibmJhaW8iLAorICAgIGRlZmF1bHRzOiBbImxpYm5iYWlvX21vbm9fZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbCiAgICAgICAgICJBdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmNwcCIsCiAgICAgICAgICJBdWRpb1N0cmVhbUluU291cmNlLmNwcCIsCiAgICAgICAgICJBdWRpb1N0cmVhbU91dFNpbmsuY3BwIiwKLSAgICAgICAgIk1vbm9QaXBlLmNwcCIsCi0gICAgICAgICJNb25vUGlwZVJlYWRlci5jcHAiLAotICAgICAgICAiTkJBSU8uY3BwIiwKICAgICAgICAgIk5CTG9nLmNwcCIsCisgICAgICAgICJQZXJmb3JtYW5jZUFuYWx5c2lzLmNwcCIsCiAgICAgICAgICJQaXBlLmNwcCIsCiAgICAgICAgICJQaXBlUmVhZGVyLmNwcCIsCisgICAgICAgICJSZXBvcnRQZXJmb3JtYW5jZS5jcHAiLAogICAgICAgICAiU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5jcHAiLAogICAgIF0sCiAKQEAgLTI0LDggKzYwLDggQEAKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKQEAgLTM1LDcgKzcxLDUgQEAKIAogICAgIGluY2x1ZGVfZGlyczogWyJzeXN0ZW0vbWVkaWEvYXVkaW9fdXRpbHMvaW5jbHVkZSJdLAogCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKLQogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmNwcCBiL21lZGlhL2xpYm5iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5jcHAKaW5kZXggY2JmZjg3ZC4uODU2NDg5OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmNwcAorKysgYi9tZWRpYS9saWJuYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuY3BwCkBAIC0xOCw2ICsxOCw3IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oPgogCkBAIC04Miw4ICs4Myw3IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9IHBvc2l0aW9uNjQ7Ci0gICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPQotICAgICAgICAgICAgdGltZS50dl9zZWMgKiAxMDAwMDAwMDAwTEwgKyB0aW1lLnR2X25zZWM7CisgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPSBhdWRpb191dGlsc19uc19mcm9tX3RpbWVzcGVjKCZ0aW1lKTsKICAgICByZXR1cm4gT0s7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL05CTG9nLmNwcCBiL21lZGlhL2xpYm5iYWlvL05CTG9nLmNwcAppbmRleCBlYmI5MGM4Li4yZjYzOWQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9OQkxvZy5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vTkJMb2cuY3BwCkBAIC0xOCwxNCArMTgsMTQgQEAKICogRG9jdW1lbnRhdGlvbjogV29ya2Zsb3cgc3VtbWFyeSBmb3IgaGlzdG9ncmFtIGRhdGEgcHJvY2Vzc2luZzoKICogRm9yIG1vcmUgZGV0YWlscyBvbiBGSUZPLCBwbGVhc2Ugc2VlIHN5c3RlbS9tZWRpYS9hdWRpb191dGlsczsgZG94eWdlbgogKiBUT0RPOiBhZGQgdGhpcyBkb2N1bWVudGF0aW9uIHRvIGRveHlnZW4gb25jZSBpdCBpcyBmdXJ0aGVyIGRldmVsb3BlZAotKiAxKSB3cml0aW5nIHRoZSBkYXRhIHRvIGEgYnVmZmVyCi0qIG9uV29yaworKiAxKSBXcml0aW5nIGJ1ZmZlciBwZXJpb2QgdGltZXN0YW1wIHRvIHRoZSBjaXJjdWxhciBidWZmZXIKKyogb25Xb3JrKCkKICogICAgIENhbGxlZCBldmVyeSBwZXJpb2QgbGVuZ3RoIChlLmcuLCA0bXMpCiAqICAgICBDYWxscyBMT0dfSElTVF9UUwogKiBMT0dfSElTVF9UUwotKiAgICAgSGFzaGVzIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIKLSogICAgIGNhbGxzIE5CTE9HOjpXcml0ZXI6OmxvZ0hpc3RUUyBvbmNlCi0qIE5CTE9HOjpXcml0ZXI6OmxvZ0hpc3RUUworKiAgICAgSGFzaGVzIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIsIGFuZCB3cml0ZXMgc2luZ2xlIHRpbWVzdGFtcCB0byBidWZmZXIKKyogICAgIGNhbGxzIE5CTE9HOjpXcml0ZXI6OmxvZ0V2ZW50SGlzdFRTIG9uY2UKKyogTkJMT0c6OldyaXRlcjo6bG9nRXZlbnRIaXN0VFMKICogICAgIGNhbGxzIE5CTE9HOjpXcml0ZXI6OmxvZyBvbiBoYXNoIGFuZCBjdXJyZW50IHRpbWVzdGFtcAogKiAgICAgdGltZSBpcyBpbiBDTE9DS19NT05PVE9OSUMgY29udmVydGVkIHRvIG5zCiAqIE5CTE9HOjpXcml0ZXI6OmxvZyhFdmVudCwgY29uc3Qgdm9pZCosIHNpemVfdCkKQEAgLTQ0LDYgKzQ0LDggQEAKICogc3NpemVfdCBhdWRpb191dGlsc19maWZvX3JlYWRlcjo6b2J0YWluCiAqICAgICBEZXRlcm1pbmVzIHJlYWRhYmxlIGJ1ZmZlciBzZWN0aW9uIHZpYSBwb2ludGVyIGFyaXRobWV0aWMgb24gcmVhZGVyCiAqICAgICBhbmQgd3JpdGVyIHBvaW50ZXJzCisqIFNpbWlsYXJseSwgTE9HX0FVRElPX1NUQVRFKCkgaXMgY2FsbGVkIGJ5IG9uU3RhdGVDaGFuZ2Ugd2hlbmV2ZXIgYXVkaW8gaXMKKyogdHVybmVkIG9uIG9yIG9mZiwgYW5kIHdyaXRlcyB0aGlzIG5vdGlmaWNhdGlvbiB0byB0aGUgRklGTy4KICoKICogMikgcmVhZGluZyB0aGUgZGF0YSBmcm9tIHNoYXJlZCBtZW1vcnkKICogVGhyZWFkOjp0aHJlYWRsb29wKCkKQEAgLTUxLDYgKzUzLDcgQEAKICogTkJMb2c6Ok1lcmdlVGhyZWFkOjp0aHJlYWRMb29wKCkKICogICAgIGNhbGxzIE5CTG9nOjpNZXJnZXI6Om1lcmdlCiAqIE5CTG9nOjpNZXJnZXI6Om1lcmdlCisqICAgICBNZXJnZXMgc25hcHNob3RzIHNvcnRlZCBieSB0aW1lc3RhbXAKICogICAgIGZvciBlYWNoIHJlYWRlciBpbiB2ZWN0b3Igb2YgY2xhc3MgTmFtZWRSZWFkZXIsCiAqICAgICBjYWxsc05hbWVkUmVhZGVyOjpyZWFkZXIoKS0+Z2V0U25hcHNob3QKICogICAgIFRPRE86IGNoZWNrIHdoZXRoZXIgdGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbiBpcyByZWxldmFudApAQCAtNTksMTEgKzYyLDEyIEBACiAqICAgICBjYWxscyBtRmlmb1JlYWRlci0+b2J0YWluIHRvIGZpbmQgcmVhZGFibGUgZGF0YQogKiAgICAgc2V0cyBzbmFwc2hvdC5iZWdpbigpIGFuZCAuZW5kKCkgaXRlcmF0b3JzIHRvIGJvdW5kYXJpZXMgb2YgdmFsaWQgZW50cmllcwogKiAgICAgbW92ZXMgdGhlIGZpZm8gcmVhZGVyIGluZGV4IHRvIGFmdGVyIHRoZSBsYXN0IGVudHJ5IHJlYWQKLSogICAgIGluIHRoaXMgY2FzZSwgdGhlIGJ1ZmZlciBpcyBpbiBzaGFyZWQgbWVtb3J5LiBpbiAoMyksIHRoZSBidWZmZXIgaXMgcHJpdmF0ZQorKiAgICAgaW4gdGhpcyBjYXNlLCB0aGUgYnVmZmVyIGlzIGluIHNoYXJlZCBtZW1vcnkuIGluICg0KSwgdGhlIGJ1ZmZlciBpcyBwcml2YXRlCiAqCiAqIDMpIHJlYWRpbmcgdGhlIGRhdGEgZnJvbSBwcml2YXRlIGJ1ZmZlcgogKiBNZWRpYUxvZ1NlcnZpY2U6OmR1bXAKLSogICAgIGNhbGxzIE5CTG9nOjpSZWFkZXI6OmR1bXAoaW50KSBvbiBpbnN0YW5jZSBvZiBzdWJjbGFzcyBtZXJnZVJlYWRlcgorKiAgICAgY2FsbHMgTkJMb2c6OlJlYWRlcjo6ZHVtcChDT05TT0xFKQorKiAgICAgVGhlIHByaXZhdGUgYnVmZmVyIGNvbnRhaW5zIGFsbCBsb2dzIGZvciBhbGwgcmVhZGVycyBpbiBzaGFyZWQgbWVtb3J5CiAqIE5CTG9nOjpSZWFkZXI6OmR1bXAoaW50KQogKiAgICAgY2FsbHMgZ2V0U25hcHNob3Qgb24gdGhlIGN1cnJlbnQgcmVhZGVyCiAqICAgICBjYWxscyBkdW1wKGludCwgc2l6ZV90LCBTbmFwc2hvdCkKQEAgLTcyLDkgKzc2LDEwIEBACiAqICAgICAoc3RyaW5nLCB0aW1lc3RhbXAsIGV0Yy4uLikKICogICAgIEluIHRoZSBjYXNlIG9mIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywgYWRkcyBhIGxpc3Qgb2YgdGltZXN0YW1wIHNlcXVlbmNlcwogKiAgICAgKGhpc3RvZ3JhbSBlbnRyeSkgdG8gTkJMb2c6Om1IaXN0cwotKiAgICAgSW4gdGhlIGNhc2Ugb2YgRVZFTlRfSElTVE9HUkFNX0ZMVVNILCBjYWxscyBkcmF3SGlzdG9ncmFtIG9uIGVhY2ggZWxlbWVudCBpbgotKiAgICAgdGhlIGxpc3QgYW5kIGVyYXNlcyBpdAotKiAgICAgVE9ETzogd2hlbiBkbyB0aGVzZSBldmVudHMgb2NjdXI/CisqICAgICBUT0RPOiBhZGQgZXZlcnkgSElTVE9HUkFNX0VOVFJZX1RTIHRvIHR3bworKiAgICAgY2lyY3VsYXIgYnVmZmVyczogb25lIHNob3J0LXRlcm0gYW5kIG9uZSBsb25nLXRlcm0gKGNhbiBhZGQgZXZlbiBsb25nZXItdGVybQorKiAgICAgc3RydWN0dXJlcyBpbiB0aGUgZnV0dXJlKS4gV2hlbiBkdW1wIGlzIGNhbGxlZCwgcHJpbnQgZXZlcnl0aGluZyBjdXJyZW50bHkKKyogICAgIGluIHRoZSBidWZmZXIuCiAqIE5CTG9nOjpkcmF3SGlzdG9ncmFtCiAqICAgICBpbnB1dDogdGltZXN0YW1wIGFycmF5CiAqICAgICBidWNrZXRzIHRoaXMgdG8gYSBoaXN0b2dyYW0gYW5kIHByaW50cwpAQCAtODIsNyArODcsNyBAQAogKi8KIAogI2RlZmluZSBMT0dfVEFHICJOQkxvZyIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8Y2xpbWl0cz4KQEAgLTEwMiw2ICsxMDcsOCBAQAogI2luY2x1ZGUgPG5ldz4KICNpbmNsdWRlIDxhdWRpb191dGlscy9yb3VuZHVwLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJMb2cuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUmVwb3J0UGVyZm9ybWFuY2UuaD4KIC8vICNpbmNsdWRlIDx1dGlscy9DYWxsU3RhY2suaD4gLy8gdXNlZCB0byBwcmludCBjYWxsc3RhY2sKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CkBAIC0xMzQsNyArMTQxLDcgQEAKICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICBjYXNlIEVWRU5UX1NUQVJUX0ZNVDoKICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8Rm9ybWF0RW50cnk+KEZvcm1hdEVudHJ5KHB0cikpOwotICAgIGNhc2UgRVZFTlRfSElTVE9HUkFNX0ZMVVNIOgorICAgIGNhc2UgRVZFTlRfQVVESU9fU1RBVEU6CiAgICAgY2FzZSBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFM6CiAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEhpc3RvZ3JhbUVudHJ5PihIaXN0b2dyYW1FbnRyeShwdHIpKTsKICAgICBkZWZhdWx0OgpAQCAtNTEzLDcgKzUyMCw3IEBACiAgICAgbG9nKEVWRU5UX0hBU0gsICZoYXNoLCBzaXplb2YoaGFzaCkpOwogfQogCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0hpc3RUUyhsb2dfaGFzaF90IGhhc2gpCit2b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0V2ZW50SGlzdFRzKEV2ZW50IGV2ZW50LCBsb2dfaGFzaF90IGhhc2gpCiB7CiAgICAgaWYgKCFtRW5hYmxlZCkgewogICAgICAgICByZXR1cm47CkBAIC01MjIsMjIgKzUyOSw3IEBACiAgICAgZGF0YS5oYXNoID0gaGFzaDsKICAgICBkYXRhLnRzID0gZ2V0X21vbm90b25pY19ucygpOwogICAgIGlmIChkYXRhLnRzID4gMCkgewotICAgICAgICBsb2coRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCB0aW1lc3RhbXAiKTsKLSAgICB9Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nSGlzdEZsdXNoKGxvZ19oYXNoX3QgaGFzaCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgSGlzdFRzRW50cnkgZGF0YTsKLSAgICBkYXRhLmhhc2ggPSBoYXNoOwotICAgIGRhdGEudHMgPSBnZXRfbW9ub3RvbmljX25zKCk7Ci0gICAgaWYgKGRhdGEudHMgPiAwKSB7Ci0gICAgICAgIGxvZyhFVkVOVF9ISVNUT0dSQU1fRkxVU0gsICZkYXRhLCBzaXplb2YoZGF0YSkpOworICAgICAgICBsb2coZXZlbnQsICZkYXRhLCBzaXplb2YoZGF0YSkpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IHRpbWVzdGFtcCIpOwogICAgIH0KQEAgLTc3MSwxNSArNzYzLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CTG9nOjpFdmVudDo6RVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTfTsKIGNvbnN0IHN0ZDo6c2V0PE5CTG9nOjpFdmVudD4gTkJMb2c6OlJlYWRlcjo6ZW5kaW5nVHlwZXMgICB7TkJMb2c6OkV2ZW50OjpFVkVOVF9FTkRfRk1ULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQkxvZzo6RXZlbnQ6OkVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJMb2c6OkV2ZW50OjpFVkVOVF9ISVNUT0dSQU1fRkxVU0h9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQkxvZzo6RXZlbnQ6OkVWRU5UX0FVRElPX1NUQVRFfTsKKwogTkJMb2c6OlJlYWRlcjo6UmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpCiAgICAgOiBtU2hhcmVkKCgvKmNvbnN0Ki8gU2hhcmVkICopIHNoYXJlZCksIC8qbUlNZW1vcnkqLwogICAgICAgbUZkKC0xKSwgbUluZGVudCgwKSwKICAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/CiAgICAgICAgIG5ldyBhdWRpb191dGlsc19maWZvKHNpemUsIHNpemVvZih1aW50OF90KSwKICAgICAgICAgICAgIG1TaGFyZWQtPm1CdWZmZXIsIG1TaGFyZWQtPm1SZWFyLCBOVUxMIC8qdGhyb3R0bGVzRnJvbnQqLykgOiBOVUxMKSwKLSAgICAgIG1GaWZvUmVhZGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIoKm1GaWZvKSA6IE5VTEwpLAotICAgICAgZmluZEdsaXRjaChmYWxzZSkKKyAgICAgIG1GaWZvUmVhZGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIoKm1GaWZvKSA6IE5VTEwpCiB7CiB9CiAKQEAgLTc5NSwzOSArNzg3LDYgQEAKICAgICBkZWxldGUgbUZpZm87CiB9CiAKLWlubGluZSBzdGF0aWMgaW50IGRlbHRhTXMoaW50NjRfdCBuczEsIGludDY0X3QgbnMyKSB7Ci0gICAgcmV0dXJuIChuczIgLSBuczEpIC8gKDEwMDAgKiAxMDAwKTsKLX0KLQotLy8gUHJvZHVjZXMgYSBsb2cgd2FybmluZyBpZiB0aGUgdGltaW5nIG9mIHJlY2VudCBidWZmZXIgcGVyaW9kcyBjYXVzZWQgYSBnbGl0Y2gKLS8vIENvbXB1dGVzIHN1bSBvZiBydW5uaW5nIHdpbmRvdyBvZiB0aHJlZSBidWZmZXIgcGVyaW9kcwotLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGJ1ZmZlciBwZXJpb2RzIGxlYXZlIGVub3VnaCBDUFUgdGltZSBmb3IgdGhlIG5leHQgb25lCi0vLyBlLmcuIGlmIGEgYnVmZmVyIHBlcmlvZCBpcyBleHBlY3RlZCB0byBiZSA0IG1zIGFuZCBhIGJ1ZmZlciByZXF1aXJlcyAzIG1zIG9mIENQVSB0aW1lLAotLy8gaGVyZSBhcmUgc29tZSBnbGl0Y2ggY2FzZXM6Ci0vLyA0ICsgNCArIDYgOyA1ICsgNCArIDU7IDIgKyAyICsgMTAKLS8vIFRPRE86IGRldmVsb3AgdGhpcyBjb2RlIHRvIHRyYWNrIGNoYW5nZXMgaW4gaGlzdG9ncmFtIGRpc3RyaWJ1dGlvbiBpbiBhZGRpdGlvbgotLy8gdG8gLyBpbnN0ZWFkIG9mIGdsaXRjaGVzCi12b2lkIE5CTG9nOjpSZWFkZXI6OmFsZXJ0SWZHbGl0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gJnNhbXBsZXMpIHsKLSAgICAvL1RPRE86IG1lYXN1cmUga1BlcmlvZExlbiBhbmQga1JhdGlvIGZyb20gdGhlIGRhdGEgYXMgdGhleSBtYXkgY2hhbmdlLgotICAgIHN0YXRpYyBjb25zdCBpbnQga1BlcmlvZExlbiA9IDQ7IC8vIGN1cnJlbnQgcGVyaW9kIGxlbmd0aCBpcyBpZGVhbGx5IDQgbXMKLSAgICBzdGF0aWMgY29uc3QgZG91YmxlIGtSYXRpbyA9IDAuNzU7IC8vIGVzdGltYXRlIG9mIENQVSB0aW1lIGFzIHJhdGlvIG9mIHBlcmlvZCBsZW5ndGgKLSAgICAvLyBEQUMgcHJvY2Vzc2luZyB0aW1lIGZvciA0IG1zIGJ1ZmZlcgotICAgIHN0YXRpYyBjb25zdCBpbnQga1BlcmlvZFRpbWUgPSBzdGF0aWNfY2FzdDxpbnQ+KHJvdW5kKGtQZXJpb2RMZW4gKiBrUmF0aW8pKTsKLSAgICBzdGF0aWMgY29uc3QgaW50IGtOdW1CdWZmID0gMzsgLy8gbnVtYmVyIG9mIGJ1ZmZlcnMgY29uc2lkZXJlZCBpbiBsb2NhbCBoaXN0b3J5Ci0gICAgc3RkOjpkZXF1ZTxpbnQ+IHBlcmlvZHMoa051bUJ1ZmYsIGtQZXJpb2RMZW4pOwotICAgIGZvciAoc2l6ZV90IGkgPSAyOyBpIDwgc2FtcGxlcy5zaXplKCk7ICsraSkgeyAvLyBza2lwIGZpcnN0IHRpbWUgZW50cnkKLSAgICAgICAgcGVyaW9kcy5wdXNoX2Zyb250KGRlbHRhTXMoc2FtcGxlc1tpIC0gMV0sIHNhbXBsZXNbaV0pKTsKLSAgICAgICAgcGVyaW9kcy5wb3BfYmFjaygpOwotICAgICAgICAvLyBUT0RPOiBjaGVjayB0aGF0IGFsbCBnbGl0Y2ggY2FzZXMgYXJlIGNvdmVyZWQKLSAgICAgICAgaWYgKHN0ZDo6YWNjdW11bGF0ZShwZXJpb2RzLmJlZ2luKCksIHBlcmlvZHMuZW5kKCksIDApID4ga051bUJ1ZmYgKiBrUGVyaW9kTGVuICsKLSAgICAgICAgICAgIGtQZXJpb2RMZW4gLSBrUGVyaW9kVGltZSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJBIGdsaXRjaCBvY2N1cnJlZCIpOwotICAgICAgICAgICAgICAgIHBlcmlvZHMuYXNzaWduKGtOdW1CdWZmLCBrUGVyaW9kTGVuKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KIGNvbnN0IHVpbnQ4X3QgKk5CTG9nOjpSZWFkZXI6OmZpbmRMYXN0RW50cnlPZlR5cGVzKGNvbnN0IHVpbnQ4X3QgKmZyb250LCBjb25zdCB1aW50OF90ICpiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxFdmVudD4gJnR5cGVzKSB7CiAgICAgd2hpbGUgKGJhY2sgKyBFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0ID49IGZyb250KSB7CkBAIC05MTEsNjEgKzg3MCwxNyBAQAogCiB9CiAKLS8vIHdyaXRlcyBzYW1wbGUgZGVsdGFzIHRvIGZpbGUsIGVpdGhlciB0cnVuY2F0aW5nIG9yIGFwcGVuZGluZwotaW5saW5lIHZvaWQgd3JpdGVIaXN0VG9GaWxlKGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICZzYW1wbGVzLCBib29sIGFwcGVuZCkgewotICAgIC8vIG5hbWUgb2YgZmlsZSBvbiBhdWRpb3NlcnZlcgotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrTmFtZSA9IChjaGFyICopIi9kYXRhL21pc2MvYXVkaW9zZXJ2ZXIvc2FtcGxlX3Jlc3VsdHMudHh0IjsKLSAgICAvLyBzdG9yZXMgZGVsdGFzIGJldHdlZW4gdGhlIHNhbXBsZXMKLSAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBpbnRlcnZhbHM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBzYW1wbGVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGludGVydmFscy5wdXNoX2JhY2soZGVsdGFNcyhzYW1wbGVzW2kgLSAxXSwgc2FtcGxlc1tpXSkpOwotICAgIH0KLSAgICBpZiAoaW50ZXJ2YWxzLmVtcHR5KCkpIHJldHVybjsKLSAgICAvLyBEZWxldGVzIG1heGltdW0gdmFsdWUgaW4gYSBoaXN0b2dyYW0uIFRlbXAgcXVpY2sgZml4LgotICAgIC8vIEZJWE1FOiBuZWVkIHRvIGZpbmQgcm9vdCBjYXVzZSBvZiBhcHByb3guIDM1dGggZWxlbWVudCBmcm9tIHRoZSBlbmQKLSAgICAvLyBjb25zaXN0ZW50bHkgYmVpbmcgYW4gb3V0bGllciBpbiB0aGUgZmlyc3QgaGlzdG9ncmFtIG9mIGEgZmx1c2gKLSAgICAvLyBBTE9HVygiJSIgUFJJZDY0ICJiZWZvcmUiLCAoaW50NjRfdCkgKihzdGQ6Om1heF9lbGVtZW50KGludGVydmFscy5iZWdpbigpLCBpbnRlcnZhbHMuZW5kKCkpKSk7Ci0gICAgaW50ZXJ2YWxzLmVyYXNlKHN0ZDo6bWF4X2VsZW1lbnQoaW50ZXJ2YWxzLmJlZ2luKCksIGludGVydmFscy5lbmQoKSkpOwotICAgIC8vIEFMT0dXKCIlIiBQUklkNjQgImFmdGVyIiwgKGludDY0X3QpICooc3RkOjptYXhfZWxlbWVudChpbnRlcnZhbHMuYmVnaW4oKSwgaW50ZXJ2YWxzLmVuZCgpKSkpOwotICAgIHN0ZDo6b2ZzdHJlYW0gb2ZzOwotICAgIG9mcy5vcGVuKGtOYW1lLCBhcHBlbmQgPyBzdGQ6Omlvczo6YXBwIDogc3RkOjppb3M6OnRydW5jKTsKLSAgICBpZiAoIW9mcykgewotICAgICAgICBBTE9HVygiY291bGRuJ3Qgb3BlbiBmaWxlICVzIiwga05hbWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW50ZXJ2YWxzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIG9mcyA8PCBpbnRlcnZhbHNbaV0gPDwgIlxuIjsKLSAgICB9Ci0gICAgb2ZzLmNsb3NlKCk7Ci19Ci0KKy8vIFRPRE86IG1vdmUgdGhpcyB0byBQZXJmb3JtYW5jZUFuYWx5c2lzCisvLyBUT0RPOiBtYWtlIGNhbGwgdG8gZHVtcCBwZXJpb2RpYyBzbyB0aGF0IGRhdGEgaW4gc2hhcmVkIEZJRk8gZG9lcyBub3QgZ2V0IG92ZXJ3cml0dGVuCiB2b2lkIE5CTG9nOjpSZWFkZXI6OmR1bXAoaW50IGZkLCBzaXplX3QgaW5kZW50LCBOQkxvZzo6UmVhZGVyOjpTbmFwc2hvdCAmc25hcHNob3QpCiB7Ci0gIC8vICBDYWxsU3RhY2sgY3MoTE9HX1RBRyk7Ci0jaWYgMAotICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKLSAgICB0aW1lX3QgbWF4U2VjID0gLTE7Ci0gICAgd2hpbGUgKGVudHJ5IC0gc3RhcnQgPj0gKGludCkgRW50cnk6OmtPdmVyaGVhZCkgewotICAgICAgICBpZiAocHJldkVudHJ5IC0gc3RhcnQgPCAwIHx8ICFwcmV2RW50cnkuaGFzQ29uc2lzdGVudExlbmd0aCgpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJldkVudHJ5LT50eXBlID09IEVWRU5UX1RJTUVTVEFNUCkgewotICAgICAgICAgICAgaWYgKHByZXZFbnRyeS0+bGVuZ3RoICE9IHNpemVvZihzdHJ1Y3QgdGltZXNwZWMpKSB7Ci0gICAgICAgICAgICAgICAgLy8gY29ycnVwdAotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJldkVudHJ5LmNvcHlEYXRhKCh1aW50OF90KikgJnRzKTsKLSAgICAgICAgICAgIGlmICh0cy50dl9zZWMgPiBtYXhTZWMpIHsKLSAgICAgICAgICAgICAgICBtYXhTZWMgPSB0cy50dl9zZWM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLS1lbnRyeTsKLSAgICAgICAgLS1wcmV2RW50cnk7Ci0gICAgfQotI2VuZGlmCiAgICAgbUZkID0gZmQ7CiAgICAgbUluZGVudCA9IGluZGVudDsKICAgICBTdHJpbmc4IHRpbWVzdGFtcCwgYm9keTsKKyAgICAvLyBGSVhNRTogdGhpcyBpcyBub3QgdGhyZWFkIHNhZmUKKyAgICAvLyBUT0RPOiBuZWVkIGEgc2VwYXJhdGUgaW5zdGFuY2Ugb2YgcGVyZm9ybWFuY2VBbmFseXNpcyBmb3IgZWFjaCB0aHJlYWQKKyAgICAvLyB1c2VkIHRvIHN0b3JlIGRhdGEgYW5kIHRvIGNhbGwgYW5hbHlzaXMgZnVuY3Rpb25zCisgICAgc3RhdGljIFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZUFuYWx5c2lzIHBlcmZvcm1hbmNlQW5hbHlzaXM7CiAgICAgc2l6ZV90IGxvc3QgPSBzbmFwc2hvdC5sb3N0KCkgKyAoc25hcHNob3QuYmVnaW4oKSAtIEVudHJ5SXRlcmF0b3Ioc25hcHNob3QuZGF0YSgpKSk7CiAgICAgaWYgKGxvc3QgPiAwKSB7CiAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJ3YXJuaW5nOiBsb3N0ICV6dSBieXRlcyB3b3J0aCBvZiBldmVudHMiLCBsb3N0KTsKQEAgLTk3Myw4NSArODg4LDkgQEAKICAgICAgICAgLy8gICAgICBsb2cgdG8gcHVzaCBpdCBvdXQuICBDb25zaWRlciBrZWVwaW5nIHRoZSB0aW1lc3RhbXAvYm9keSBiZXR3ZWVuIGNhbGxzIHRvIGNvcHlFbnRyeURhdGFBdCgpLgogICAgICAgICBkdW1wTGluZSh0aW1lc3RhbXAsIGJvZHkpOwogICAgIH0KLSNpZiAwCi0gICAgc2l6ZV90IHdpZHRoID0gMTsKLSAgICB3aGlsZSAobWF4U2VjID49IDEwKSB7Ci0gICAgICAgICsrd2lkdGg7Ci0gICAgICAgIG1heFNlYyAvPSAxMDsKLSAgICB9Ci0gICAgaWYgKG1heFNlYyA+PSAwKSB7Ci0gICAgICAgIHRpbWVzdGFtcC5hcHBlbmRGb3JtYXQoIlslKnNdIiwgKGludCkgd2lkdGggKyA0LCAiIik7Ci0gICAgfQotICAgIGJvb2wgZGVmZXJyZWRUaW1lc3RhbXAgPSBmYWxzZTsKLSNlbmRpZgogCiAgICAgZm9yIChhdXRvIGVudHJ5ID0gc25hcHNob3QuYmVnaW4oKTsgZW50cnkgIT0gc25hcHNob3QuZW5kKCk7KSB7CiAgICAgICAgIHN3aXRjaCAoZW50cnktPnR5cGUpIHsKLSNpZiAwCi0gICAgICAgIGNhc2UgRVZFTlRfU1RSSU5HOgotICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIiUuKnMiLCAoaW50KSBlbnRyeS5sZW5ndGgoKSwgZW50cnkuZGF0YSgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVWRU5UX1RJTUVTVEFNUDogewotICAgICAgICAgICAgLy8gYWxyZWFkeSBjaGVja2VkIHRoYXQgbGVuZ3RoID09IHNpemVvZihzdHJ1Y3QgdGltZXNwZWMpOwotICAgICAgICAgICAgZW50cnkuY29weURhdGEoKGNvbnN0IHVpbnQ4X3QqKSAmdHMpOwotICAgICAgICAgICAgbG9uZyBwcmV2TnNlYyA9IHRzLnR2X25zZWM7Ci0gICAgICAgICAgICBsb25nIGRlbHRhTWluID0gTE9OR19NQVg7Ci0gICAgICAgICAgICBsb25nIGRlbHRhTWF4ID0gLTE7Ci0gICAgICAgICAgICBsb25nIGRlbHRhVG90YWwgPSAwOwotICAgICAgICAgICAgYXV0byBhdXgoZW50cnkpOwotICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgICsrYXV4OwotICAgICAgICAgICAgICAgIGlmIChlbmQgLSBhdXggPj0gMCB8fCBhdXgudHlwZSgpICE9IEVWRU5UX1RJTUVTVEFNUCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RydWN0IHRpbWVzcGVjIHRzTmV4dDsKLSAgICAgICAgICAgICAgICBhdXguY29weURhdGEoKGNvbnN0IHVpbnQ4X3QqKSAmdHNOZXh0KTsKLSAgICAgICAgICAgICAgICBpZiAodHNOZXh0LnR2X3NlYyAhPSB0cy50dl9zZWMpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxvbmcgZGVsdGEgPSB0c05leHQudHZfbnNlYyAtIHByZXZOc2VjOwotICAgICAgICAgICAgICAgIGlmIChkZWx0YSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChkZWx0YSA8IGRlbHRhTWluKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbHRhTWluID0gZGVsdGE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChkZWx0YSA+IGRlbHRhTWF4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbHRhTWF4ID0gZGVsdGE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlbHRhVG90YWwgKz0gZGVsdGE7Ci0gICAgICAgICAgICAgICAgcHJldk5zZWMgPSB0c05leHQudHZfbnNlYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNpemVfdCBuID0gKGF1eCAtIGVudHJ5KSAvIChzaXplb2Yoc3RydWN0IHRpbWVzcGVjKSArIDMgLypFbnRyeTo6a092ZXJoZWFkPyovKTsKLSAgICAgICAgICAgIGlmIChkZWZlcnJlZFRpbWVzdGFtcCkgewotICAgICAgICAgICAgICAgIGR1bXBMaW5lKHRpbWVzdGFtcCwgYm9keSk7Ci0gICAgICAgICAgICAgICAgZGVmZXJyZWRUaW1lc3RhbXAgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRpbWVzdGFtcC5jbGVhcigpOwotICAgICAgICAgICAgaWYgKG4gPj0ga1NxdWFzaFRpbWVzdGFtcCkgewotICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5hcHBlbmRGb3JtYXQoIlslZC4lMDNkIHRvIC4lLjAzZCBieSAuJS4wM2QgdG8gLiUuMDNkXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50KSB0cy50dl9zZWMsIChpbnQpICh0cy50dl9uc2VjIC8gMTAwMDAwMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoKHRzLnR2X25zZWMgKyBkZWx0YVRvdGFsKSAvIDEwMDAwMDApLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKGRlbHRhTWluIC8gMTAwMDAwMCksIChpbnQpIChkZWx0YU1heCAvIDEwMDAwMDApKTsKLSAgICAgICAgICAgICAgICBlbnRyeSA9IGF1eDsKLSAgICAgICAgICAgICAgICAvLyBhZHZhbmNlID0gMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRpbWVzdGFtcC5hcHBlbmRGb3JtYXQoIlslZC4lMDNkXSIsIChpbnQpIHRzLnR2X3NlYywKLSAgICAgICAgICAgICAgICAgICAgKGludCkgKHRzLnR2X25zZWMgLyAxMDAwMDAwKSk7Ci0gICAgICAgICAgICBkZWZlcnJlZFRpbWVzdGFtcCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFVkVOVF9JTlRFR0VSOgotICAgICAgICAgICAgYXBwZW5kSW50KCZib2R5LCBlbnRyeS5kYXRhKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRVZFTlRfRkxPQVQ6Ci0gICAgICAgICAgICBhcHBlbmRGbG9hdCgmYm9keSwgZW50cnkuZGF0YSgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVWRU5UX1BJRDoKLSAgICAgICAgICAgIGFwcGVuZFBJRCgmYm9keSwgZW50cnkuZGF0YSgpLCBlbnRyeS5sZW5ndGgoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSNlbmRpZgogICAgICAgICBjYXNlIEVWRU5UX1NUQVJUX0ZNVDoKICAgICAgICAgICAgIGVudHJ5ID0gaGFuZGxlRm9ybWF0KEZvcm1hdEVudHJ5KGVudHJ5KSwgJnRpbWVzdGFtcCwgJmJvZHkpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0xMDYzLDQwICs5MDIsMTIgQEAKICAgICAgICAgICAgIG1lbWNweSgmaGFzaCwgJihkYXRhLT5oYXNoKSwgc2l6ZW9mKGhhc2gpKTsKICAgICAgICAgICAgIGludDY0X3QgdHM7CiAgICAgICAgICAgICBtZW1jcHkoJnRzLCAmZGF0YS0+dHMsIHNpemVvZih0cykpOwotICAgICAgICAgICAgY29uc3Qgc3RkOjpwYWlyPGxvZ19oYXNoX3QsIGludD4ga2V5KGhhc2gsIGRhdGEtPmF1dGhvcik7Ci0gICAgICAgICAgICAvLyBUT0RPIG1pZ2h0IHdhbnQgdG8gZmlsdGVyIGV4Y2Vzc2l2ZWx5IGhpZ2ggb3V0bGllcnMsIHdoaWNoIGFyZSB1c3VhbGx5IGNhdXNlZAotICAgICAgICAgICAgLy8gYnkgdGhlIHRocmVhZCBiZWluZyBpbmFjdGl2ZS4KLSAgICAgICAgICAgIG1IaXN0c1trZXldLnB1c2hfYmFjayh0cyk7CisgICAgICAgICAgICBwZXJmb3JtYW5jZUFuYWx5c2lzLmxvZ1RzRW50cnkodHMpOwogICAgICAgICAgICAgKytlbnRyeTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIC8vIGRyYXdzIGhpc3RvZ3JhbXMgc3RvcmVkIGluIGdsb2JhbCBSZWFkZXI6Om1IaXN0cyBhbmQgZXJhc2VzIHRoZW0KLSAgICAgICAgY2FzZSBFVkVOVF9ISVNUT0dSQU1fRkxVU0g6IHsKLSAgICAgICAgICAgIEhpc3RvZ3JhbUVudHJ5IGhpc3RFbnRyeShlbnRyeSk7Ci0gICAgICAgICAgICAvLyBMb2cgdGltZXN0YW1wCi0gICAgICAgICAgICAvLyBUaW1lc3RhbXAgb2YgY2FsbCB0byBkcmF3SGlzdG9ncmFtLCBub3Qgd2hlbiBhdWRpbyB3YXMgZ2VuZXJhdGVkCi0gICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRzID0gaGlzdEVudHJ5LnRpbWVzdGFtcCgpOwotICAgICAgICAgICAgdGltZXN0YW1wLmNsZWFyKCk7Ci0gICAgICAgICAgICB0aW1lc3RhbXAuYXBwZW5kRm9ybWF0KCJbJWQuJTAzZF0iLCAoaW50KSAodHMgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKCh0cyAvICgxMDAwICogMTAwMCkpICUgMTAwMCkpOwotICAgICAgICAgICAgLy8gTG9nIGhpc3RvZ3JhbXMKLSAgICAgICAgICAgIHNldEZpbmRHbGl0Y2godHJ1ZSk7Ci0gICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiSGlzdG9ncmFtIGZsdXNoIC0gIik7Ci0gICAgICAgICAgICBoYW5kbGVBdXRob3IoaGlzdEVudHJ5LCAmYm9keSk7Ci0gICAgICAgICAgICBmb3IgKGF1dG8gaGlzdCA9IG1IaXN0cy5iZWdpbigpOyBoaXN0ICE9IG1IaXN0cy5lbmQoKTspIHsKLSAgICAgICAgICAgICAgICBpZiAoaGlzdC0+Zmlyc3Quc2Vjb25kID09IGhpc3RFbnRyeS5hdXRob3IoKSkgewotICAgICAgICAgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiJVgiLCAoaW50KWhpc3QtPmZpcnN0LmZpcnN0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmRHbGl0Y2gpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0SWZHbGl0Y2goaGlzdC0+c2Vjb25kKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBzZXQgZmlsZSB0byBlbXB0eSBhbmQgd3JpdGUgZGF0YSBmb3IgYWxsIGhpc3RvZ3JhbXMgaW4gdGhpcyBzZXQKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVIaXN0VG9GaWxlKGhpc3QtPnNlY29uZCwgaGlzdCAhPSBtSGlzdHMuYmVnaW4oKSk7Ci0gICAgICAgICAgICAgICAgICAgIGRyYXdIaXN0b2dyYW0oJmJvZHksIGhpc3QtPnNlY29uZCwgdHJ1ZSwgaW5kZW50KTsKLSAgICAgICAgICAgICAgICAgICAgaGlzdCA9IG1IaXN0cy5lcmFzZShoaXN0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICArK2hpc3Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICBjYXNlIEVWRU5UX0FVRElPX1NUQVRFOiB7CisgICAgICAgICAgICBwZXJmb3JtYW5jZUFuYWx5c2lzLmhhbmRsZVN0YXRlQ2hhbmdlKCk7CiAgICAgICAgICAgICArK2VudHJ5OwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTExMTAsMTAgKzkyMSwxMCBAQAogICAgICAgICAgICAgKytlbnRyeTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFib2R5LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZHVtcExpbmUodGltZXN0YW1wLCBib2R5KTsKLSAgICAgICAgfQorICAgIH0KKyAgICBwZXJmb3JtYW5jZUFuYWx5c2lzLnJlcG9ydFBlcmZvcm1hbmNlKCZib2R5KTsKKyAgICBpZiAoIWJvZHkuaXNFbXB0eSgpKSB7CisgICAgICAgIGR1bXBMaW5lKHRpbWVzdGFtcCwgYm9keSk7CiAgICAgfQogfQogCkBAIC0xMTM5LDE2ICs5NTAsNiBAQAogICAgIHJldHVybiBpTWVtb3J5ICE9IDAgJiYgbUlNZW1vcnkgIT0gMCAmJiBpTWVtb3J5LT5wb2ludGVyKCkgPT0gbUlNZW1vcnktPnBvaW50ZXIoKTsKIH0KIAotdm9pZCBOQkxvZzo6UmVhZGVyOjpzZXRGaW5kR2xpdGNoKGJvb2wgcykKLXsKLSAgICBmaW5kR2xpdGNoID0gczsKLX0KLQotYm9vbCBOQkxvZzo6UmVhZGVyOjppc0ZpbmRHbGl0Y2goKSBjb25zdAotewotICAgIHJldHVybiBmaW5kR2xpdGNoOwotfQotCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogdm9pZCBOQkxvZzo6YXBwZW5kVGltZXN0YW1wKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpIHsKQEAgLTEyODMsMTI2ICsxMDg0LDYgQEAKICAgICByZXR1cm4gYXJnOwogfQogCi1zdGF0aWMgaW50IHdpZHRoT2YoaW50IHgpIHsKLSAgICBpbnQgd2lkdGggPSAwOwotICAgIHdoaWxlICh4ID4gMCkgewotICAgICAgICArK3dpZHRoOwotICAgICAgICB4IC89IDEwOwotICAgIH0KLSAgICByZXR1cm4gd2lkdGg7Ci19Ci0KLXN0YXRpYyBzdGQ6Om1hcDxpbnQsIGludD4gYnVpbGRCdWNrZXRzKGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICZzYW1wbGVzKSB7Ci0gICAgLy8gVE9ETyBhbGxvdyBidWNrZXRzIG9mIHZhcmlhYmxlIHJlc29sdXRpb24KLSAgICBzdGQ6Om1hcDxpbnQsIGludD4gYnVja2V0czsKLSAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IHNhbXBsZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgKytidWNrZXRzW2RlbHRhTXMoc2FtcGxlc1tpIC0gMV0sIHNhbXBsZXNbaV0pXTsKLSAgICB9Ci0gICAgcmV0dXJuIGJ1Y2tldHM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgbG9nMih1aW50MzJfdCB4KSB7Ci0gICAgLy8gVGhpcyB3b3JrcyBmb3IgeCA+IDAKLSAgICByZXR1cm4gMzEgLSBfX2J1aWx0aW5fY2x6KHgpOwotfQotCi0vLyBUT0RPIHB1dCB0aGlzIGZ1bmN0aW9uIGluIHNlcGFyYXRlIGZpbGUuIE1ha2UgaXQgcmV0dXJuIGEgc3RkOjpzdHJpbmcgaW5zdGVhZCBvZiBtb2RpZnlpbmcgYm9keQotLyoKLUV4YW1wbGUgb3V0cHV0OgotWzU0LjIzNF0gSGlzdG9ncmFtIGZsdXNoIC0gQXVkaW9PdXRfRDoKLUhpc3RvZ3JhbSAzMzY0MEJGMQotICAgICAgICAgICAgWyAxXVsgMV1bIDFdWyAzXVs1NF1bNjldWyAxXVsgMl1bIDFdCi0gICAgICAgIDY0fCAgICAgICAgICAgICAgICAgICAgICBbXQotICAgICAgICAzMnwgICAgICAgICAgICAgICAgICBbXSAgW10KLSAgICAgICAgMTZ8ICAgICAgICAgICAgICAgICAgW10gIFtdCi0gICAgICAgICA4fCAgICAgICAgICAgICAgICAgIFtdICBbXQotICAgICAgICAgNHwgICAgICAgICAgICAgICAgICBbXSAgW10KLSAgICAgICAgIDJ8X19fX19fX19fX19fX19bXV9fW11fX1tdX19fX19fW11fX19fCi0gICAgICAgICAgICAgIDQgICA1ICAgNiAgIDggICA5ICAxMCAgMTEgIDEzICAxNQotTm90aWNlIHRoYXQgYWxsIHZhbHVlcyB0aGF0IGZhbGwgaW4gdGhlIHNhbWUgcm93IGhhdmUgdGhlIHNhbWUgaGVpZ2h0ICg2NSBhbmQgMTI3IGFyZSBkaXNwbGF5ZWQKLWlkZW50aWNhbGx5KS4gVGhhdCdzIHdoeSBleGFjdCBjb3VudHMgYXJlIGFkZGVkIGF0IHRoZSB0b3AuCi0qLwotdm9pZCBOQkxvZzo6UmVhZGVyOjpkcmF3SGlzdG9ncmFtKFN0cmluZzggKmJvZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gJnNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2dTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhIZWlnaHQpIHsKLSAgICAvLyB0aGlzIGF2b2lkcyBzb21lIGNvcm5lciBjYXNlcwotICAgIGlmIChzYW1wbGVzLnNpemUoKSA8PSAxKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gdGVtcCBjb2RlIGZvciBkZWJ1Z2dpbmcgdGhlIG91dGxpZXIgdGltZXN0YW1wCi0gICAgY29uc3QgaW50IGtNYXhNcyA9IDEwMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IHNhbXBsZXMuc2l6ZSgpLTE7ICsraSkgewotICAgICAgICBjb25zdCBpbnQgY3VyckRlbHRhID0gZGVsdGFNcyhzYW1wbGVzW2kgLSAxXSwgc2FtcGxlc1tpXSk7Ci0gICAgICAgIGlmIChjdXJyRGVsdGEgPiBrTWF4TXMpIHsKLSAgICAgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG5sb2NhdGlvbjogJXp1LCBzaXplOiAlenUsIHBvcyBmcm9tIGVuZDogJXp1LCAlZFx0IiwgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMuc2l6ZSgpLCBzYW1wbGVzLnNpemUoKSAtIGksIGN1cnJEZWx0YSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gRklYTUU6IGFzIGNhbiBiZSBzZWVuIHdoZW4gcHJpbnRpbmcgdGhlIHZhbHVlcywgdGhlIG91dGxpZXIgdGltZXN0YW1wcyB0eXBpY2FsbHkgb2NjdXIKLSAgICAvLyBpbiB0aGUgZmlyc3QgaGlzdG9ncmFtIDM1IHRvIDM4IGluZGljZXMgZnJvbSB0aGUgZW5kIChtb3N0IG9mdGVuIDM1KS4KLSAgICAvLyBUT0RPOiBidWlsZCBoaXN0b2dyYW0gYnVja2V0cyBlYXJsaWVyIGFuZCBkaXNjYXJkIHRpbWVzdGFtcHMgdG8gc2F2ZSBtZW1vcnkKLSAgICBzdGQ6Om1hcDxpbnQsIGludD4gYnVja2V0cyA9IGJ1aWxkQnVja2V0cyhzYW1wbGVzKTsKLSAgICAvLyBUT0RPIGNvbnNpZGVyIGNoYW5naW5nIGFsbCBpbnRzIHRvIHVpbnQzMl90IG9yIHVpbnQ2NF90Ci0KLSAgICAvLyB1bmRlcnNjb3JlcyBhbmQgc3BhY2VzIGxlbmd0aCBjb3JyZXNwb25kcyB0byBtYXhpbXVtIHdpZHRoIG9mIGhpc3RvZ3JhbQotICAgIHN0YXRpYyBjb25zdCBpbnQga0xlbiA9IDQwOwotICAgIHN0ZDo6c3RyaW5nIHVuZGVyc2NvcmVzKGtMZW4sICctJyk7Ci0gICAgc3RkOjpzdHJpbmcgc3BhY2VzKGtMZW4sICcgJyk7Ci0KLSAgICBhdXRvIGl0ID0gYnVja2V0cy5iZWdpbigpOwotICAgIGludCBtYXhEZWx0YSA9IGl0LT5maXJzdDsKLSAgICBpbnQgbWF4Q291bnQgPSBpdC0+c2Vjb25kOwotICAgIC8vIENvbXB1dGUgbWF4aW11bSB2YWx1ZXMKLSAgICB3aGlsZSAoKytpdCAhPSBidWNrZXRzLmVuZCgpKSB7Ci0gICAgICAgIGlmIChpdC0+Zmlyc3QgPiBtYXhEZWx0YSkgewotICAgICAgICAgICAgbWF4RGVsdGEgPSBpdC0+Zmlyc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGl0LT5zZWNvbmQgPiBtYXhDb3VudCkgewotICAgICAgICAgICAgbWF4Q291bnQgPSBpdC0+c2Vjb25kOwotICAgICAgICB9Ci0gICAgfQotICAgIGludCBoZWlnaHQgPSBsb2dTY2FsZSA/IGxvZzIobWF4Q291bnQpICsgMSA6IG1heENvdW50OyAvLyBtYXhDb3VudCA+IDAsIHNhZmUgdG8gY2FsbCBsb2cyCi0gICAgY29uc3QgaW50IGxlZnRQYWRkaW5nID0gd2lkdGhPZihsb2dTY2FsZSA/IHBvdygyLCBoZWlnaHQpIDogbWF4Q291bnQpOwotICAgIGNvbnN0IGludCBjb2xXaWR0aCA9IHN0ZDo6bWF4KHN0ZDo6bWF4KHdpZHRoT2YobWF4RGVsdGEpICsgMSwgMyksIGxlZnRQYWRkaW5nICsgMik7Ci0gICAgaW50IHNjYWxpbmdGYWN0b3IgPSAxOwotICAgIC8vIHNjYWxlIGRhdGEgaWYgaXQgZXhjZWVkcyBtYXhpbXVtIGhlaWdodAotICAgIGlmIChoZWlnaHQgPiBtYXhIZWlnaHQpIHsKLSAgICAgICAgc2NhbGluZ0ZhY3RvciA9IChoZWlnaHQgKyBtYXhIZWlnaHQpIC8gbWF4SGVpZ2h0OwotICAgICAgICBoZWlnaHQgLz0gc2NhbGluZ0ZhY3RvcjsKLSAgICB9Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiUqcyIsIGxlZnRQYWRkaW5nICsgMTEsICJPY2N1cnJlbmNlcyIpOwotICAgIC8vIHdyaXRlIGhpc3RvZ3JhbSBsYWJlbCBsaW5lIHdpdGggYnVja2V0IHZhbHVlcwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lKnMiLCBpbmRlbnQsICIgIik7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKnMiLCBsZWZ0UGFkZGluZywgIiAiKTsKLSAgICBmb3IgKGF1dG8gY29uc3QgJnggOiBidWNrZXRzKSB7Ci0gICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpkIiwgY29sV2lkdGgsIHguc2Vjb25kKTsKLSAgICB9Ci0gICAgLy8gd3JpdGUgaGlzdG9ncmFtIGFzY2lpIGFydAotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lKnMiLCBpbmRlbnQsICIgIik7Ci0gICAgZm9yIChpbnQgcm93ID0gaGVpZ2h0ICogc2NhbGluZ0ZhY3Rvcjsgcm93ID49IDA7IHJvdyAtPSBzY2FsaW5nRmFjdG9yKSB7Ci0gICAgICAgIGNvbnN0IGludCB2YWx1ZSA9IGxvZ1NjYWxlID8gKDEgPDwgcm93KSA6IHJvdzsKLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLipzIiwgbGVmdFBhZGRpbmcsIHNwYWNlcy5jX3N0cigpKTsKLSAgICAgICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgewotICAgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyVzIiwgY29sV2lkdGggLSAxLCBzcGFjZXMuY19zdHIoKSwgeC5zZWNvbmQgPCB2YWx1ZSA/ICIgIiA6ICJ8Iik7Ci0gICAgICAgIH0KLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiUqcyIsIGluZGVudCwgIiAiKTsKLSAgICB9Ci0gICAgLy8gcHJpbnQgeC1heGlzCi0gICAgY29uc3QgaW50IGNvbHVtbnMgPSBzdGF0aWNfY2FzdDxpbnQ+KGJ1Y2tldHMuc2l6ZSgpKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqYyIsIGxlZnRQYWRkaW5nLCAnICcpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyIsIChjb2x1bW5zICsgMSkgKiBjb2xXaWR0aCwgdW5kZXJzY29yZXMuY19zdHIoKSk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiUqcyIsIGluZGVudCwgIiAiKTsKLQotICAgIC8vIHdyaXRlIGZvb3RlciB3aXRoIGJ1Y2tldCBsYWJlbHMKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqcyIsIGxlZnRQYWRkaW5nLCAiICIpOwotICAgIGZvciAoYXV0byBjb25zdCAmeCA6IGJ1Y2tldHMpIHsKLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKmQiLCBjb2xXaWR0aCwgeC5maXJzdCk7Ci0gICAgfQotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyVzIiwgY29sV2lkdGgsIHNwYWNlcy5jX3N0cigpLCAibXNcbiIpOwotfQotCiBOQkxvZzo6TWVyZ2VyOjpNZXJnZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk6CiAgICAgICBtU2hhcmVkKChTaGFyZWQgKikgc2hhcmVkKSwKICAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/CmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9PV05FUlMgYi9tZWRpYS9saWJuYmFpby9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljYjU2NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5iYWlvL09XTkVSUwpAQCAtMCwwICsxIEBACitna2FzdGVuQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuY3BwIGIvbWVkaWEvbGlibmJhaW8vUGVyZm9ybWFuY2VBbmFseXNpcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzYmRkYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuY3BwCkBAIC0wLDAgKzEsMzc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjZGVmaW5lIExPR19UQUcgIlBlcmZvcm1hbmNlQW5hbHlzaXMiCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPG51bWVyaWM+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9yb3VuZHVwLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJMb2cuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUmVwb3J0UGVyZm9ybWFuY2UuaD4KKy8vICNpbmNsdWRlIDx1dGlscy9DYWxsU3RhY2suaD4gLy8gdXNlZCB0byBwcmludCBjYWxsc3RhY2sKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZSB7CisKK1BlcmZvcm1hbmNlQW5hbHlzaXM6OlBlcmZvcm1hbmNlQW5hbHlzaXMoKSB7CisgICAgLy8gVGhlc2UgdmFyaWFibGVzIHdpbGwgYmUgKEZJWE1FKSBsZWFybmVkIGZyb20gdGhlIGRhdGEKKyAgICBrUGVyaW9kTXMgPSA0OyAvLyB0eXBpY2FsIGJ1ZmZlciBwZXJpb2QgKG1vZGUpCisgICAgLy8gYXZlcmFnZSBudW1iZXIgb2YgTXMgc3BlbnQgcHJvY2Vzc2luZyBidWZmZXIKKyAgICBrUGVyaW9kTXNDUFUgPSBzdGF0aWNfY2FzdDxpbnQ+KGtQZXJpb2RNcyAqIGtSYXRpbyk7Cit9CisKKy8vIGNvbnZlcnRzIGEgdGltZSBzZXJpZXMgaW50byBhIG1hcC4ga2V5OiBidWZmZXIgcGVyaW9kIGxlbmd0aC4gdmFsdWU6IGNvdW50CitzdGF0aWMgc3RkOjptYXA8aW50LCBpbnQ+IGJ1aWxkQnVja2V0cyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAmc2FtcGxlcykgeworICAgIC8vIFRPRE8gYWxsb3cgYnVja2V0cyBvZiB2YXJpYWJsZSByZXNvbHV0aW9uCisgICAgc3RkOjptYXA8aW50LCBpbnQ+IGJ1Y2tldHM7CisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBzYW1wbGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICsrYnVja2V0c1tkZWx0YU1zKHNhbXBsZXNbaSAtIDFdLCBzYW1wbGVzW2ldKV07CisgICAgfQorICAgIHJldHVybiBidWNrZXRzOworfQorCitzdGF0aWMgaW50IHdpZHRoT2YoaW50IHgpIHsKKyAgICBpbnQgd2lkdGggPSAwOworICAgIHdoaWxlICh4ID4gMCkgeworICAgICAgICArK3dpZHRoOworICAgICAgICB4IC89IDEwOworICAgIH0KKyAgICByZXR1cm4gd2lkdGg7Cit9CisKKy8vIEdpdmVuIGEgc2VyaWVzIG9mIGF1ZGlvIHByb2Nlc3Npbmcgd2FrZXVwIHRpbWVzdGFtcHMsCisvLyBidWNrZXRzIHRoZSB0aW1lIGludGVydmFscyBpbnRvIGEgaGlzdG9ncmFtLCBzZWFyY2hlcyBmb3IKKy8vIG91dGxpZXJzLCBhbmFseXplcyB0aGUgb3V0bGllciBzZXJpZXMgZm9yIHVuZXhwZWN0ZWRseQorLy8gc21hbGwgb3IgbGFyZ2UgdmFsdWVzIGFuZCBzdG9yZXMgdGhlc2UgYXMgcGVha3MsIGFuZCBmbHVzaGVzCisvLyB0aGUgdGltZXN0YW1wIHNlcmllcyBmcm9tIG1lbW9yeS4KK3ZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6cHJvY2Vzc0FuZEZsdXNoVGltZVN0YW1wU2VyaWVzKCkgeworICAgIC8vIDEpIGFuYWx5emUgdGhlIHNlcmllcyB0byBzdG9yZSBhbGwgb3V0bGllcnMgYW5kIHRoZWlyIGV4YWN0IHRpbWVzdGFtcHM6CisgICAgc3RvcmVPdXRsaWVyRGF0YShtVGltZVN0YW1wU2VyaWVzKTsKKworICAgIC8vIDIpIGRldGVjdCBwZWFrcyBpbiB0aGUgb3V0bGllciBzZXJpZXMKKyAgICBkZXRlY3RQZWFrcygpOworCisgICAgLy8gMykgY29tcHV0ZSBpdHMgaGlzdG9ncmFtLCBhcHBlbmQgdG8gbVJlY2VudEhpc3RzIGFuZCBjbGVhciB0aGUgdGltZSBzZXJpZXMKKyAgICBtUmVjZW50SGlzdHMuZW1wbGFjZV9iYWNrKHN0YXRpY19jYXN0PHRpbWVzdGFtcD4obVRpbWVTdGFtcFNlcmllc1swXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZEJ1Y2tldHMobVRpbWVTdGFtcFNlcmllcykpOworICAgIC8vIGRvIG5vdCBsZXQgbVJlY2VudEhpc3RzIGV4Y2VlZCBjYXBhY2l0eQorICAgIC8vIEFMT0dEKCJtUmVjZW50SGlzdHMgc2l6ZTogJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KG1SZWNlbnRIaXN0cy5zaXplKCkpKTsKKyAgICBpZiAobVJlY2VudEhpc3RzLnNpemUoKSA+PSBrUmVjZW50SGlzdHNDYXBhY2l0eSkgeworICAgICAgICAvLyAgQUxPR0QoInBvcHBlZCBiYWNrIG1SZWNlbnRIaXN0cyIpOworICAgICAgICBtUmVjZW50SGlzdHMucG9wX2Zyb250KCk7CisgICAgfQorICAgIG1UaW1lU3RhbXBTZXJpZXMuY2xlYXIoKTsKK30KKworLy8gZm9yY2VzIHNob3J0LXRlcm0gaGlzdG9ncmFtIHN0b3JhZ2UgdG8gYXZvaWQgYWRkaW5nIGlkbGUgYXVkaW8gdGltZSBpbnRlcnZhbAorLy8gdG8gYnVmZmVyIHBlcmlvZCBkYXRhCit2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OmhhbmRsZVN0YXRlQ2hhbmdlKCkgeworICAgIEFMT0dEKCJoYW5kbGVTdGF0ZUNoYW5nZSIpOworICAgIHByb2Nlc3NBbmRGbHVzaFRpbWVTdGFtcFNlcmllcygpOworICAgIHJldHVybjsKK30KKworLy8gVGFrZXMgYSBzaW5nbGUgYnVmZmVyIHBlcmlvZCB0aW1lc3RhbXAgZW50cnkgaW5mb3JtYXRpb24gYW5kIHN0b3JlcyBpdCBpbiBhCisvLyB0ZW1wb3Jhcnkgc2VyaWVzIG9mIHRpbWVzdGFtcHMuIE9uY2UgdGhlIHNlcmllcyBpcyBmdWxsLCB0aGUgZGF0YSBpcyBhbmFseXplZCwKKy8vIHN0b3JlZCwgYW5kIGVtcHRpZWQuCit2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OmxvZ1RzRW50cnkoaW50NjRfdCB0cykgeworICAgIC8vIFRPRE8gbWlnaHQgd2FudCB0byBmaWx0ZXIgZXhjZXNzaXZlbHkgaGlnaCBvdXRsaWVycywgd2hpY2ggYXJlIHVzdWFsbHkgY2F1c2VkCisgICAgLy8gYnkgdGhlIHRocmVhZCBiZWluZyBpbmFjdGl2ZS4KKyAgICAvLyBTdG9yZSB0aW1lIHNlcmllcyBkYXRhIGZvciBlYWNoIHJlYWRlciBpbiBvcmRlciB0byBidWNrZXQgaXQgb25jZSB0aGVyZQorICAgIC8vIGlzIGVub3VnaCBkYXRhLiBUaGVuLCB3cml0ZSB0byByZWNlbnRIaXN0cyBhcyBhIGhpc3RvZ3JhbS4KKyAgICBtVGltZVN0YW1wU2VyaWVzLnB1c2hfYmFjayh0cyk7CisgICAgLy8gaWYgbGVuZ3RoIG9mIHRoZSB0aW1lIHNlcmllcyBoYXMgcmVhY2hlZCBrU2hvcnRIaXN0U2l6ZSBzYW1wbGVzLAorICAgIC8vIGFuYWx5emUgdGhlIGRhdGEgYW5kIGZsdXNoIHRoZSB0aW1lc3RhbXAgc2VyaWVzIGZyb20gbWVtb3J5CisgICAgaWYgKG1UaW1lU3RhbXBTZXJpZXMuc2l6ZSgpID49IGtTaG9ydEhpc3RTaXplKSB7CisgICAgICAgIHByb2Nlc3NBbmRGbHVzaFRpbWVTdGFtcFNlcmllcygpOworICAgIH0KK30KKworLy8gV2hlbiB0aGUgc2hvcnQtdGVybSBoaXN0b2dyYW0gYXJyYXkgbVJlY2VudEhpc3RzIGhhcyByZWFjaGVkIGNhcGFjaXR5LAorLy8gbWVyZ2UgaGlzdG9ncmFtcyBmb3IgZGF0YSBjb21wcmVzc2lvbiBhbmQgc3RvcmUgdGhlbSBpbiBtTG9uZ1Rlcm1IaXN0cworLy8gY2xlYXJzIG1SZWNlbnRIaXN0cworLy8gVE9ETzogaGF2ZSBsb2dUc0VudHJ5IHdyaXRlIGRpcmVjdGx5IHRvIG1Mb25nVGVybUhpc3RzLCBkaXNjYXJkIG1SZWNlbnRIaXN0cywKKy8vIHN0YXJ0IGEgbmV3IGhpc3RvZ3JhbSB3aGVuIGEgcGVhayBvY2N1cnMKK3ZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6cHJvY2Vzc0FuZEZsdXNoUmVjZW50SGlzdHMoKSB7CisKKyAgICAvLyBCdWNrZXRzIGlzIHVzZWQgdG8gYWdncmVnYXRlIHNob3J0LXRlcm0gaGlzdG9ncmFtcy4KKyAgICBIaXN0b2dyYW0gYnVja2V0czsKKyAgICB0aW1lc3RhbXAgc3RhcnRpbmdUcyA9IG1SZWNlbnRIaXN0c1swXS5maXJzdDsKKworICAgIGZvciAoY29uc3QgYXV0byAmc2hvcnRIaXN0OiBtUmVjZW50SGlzdHMpIHsKKyAgICAgICAgLy8gSWYgdGhlIHRpbWUgYmV0d2VlbiBzdGFydGluZyBhbmQgZW5kaW5nIHRpbWVzdGFtcHMgaGFzIHJlYWNoZWQgdGhlIG1heGltdW0sCisgICAgICAgIC8vIGFkZCB0aGUgY3VycmVudCBoaXN0b2dyYW0gKGJ1Y2tldHMpIHRvIHRoZSBsb25nLXRlcm0gaGlzdG9ncmFtIGJ1ZmZlciwKKyAgICAgICAgLy8gY2xlYXIgYnVja2V0cywgYW5kIHN0YXJ0IGEgbmV3IGxvbmctdGVybSBoaXN0b2dyYW0gYWdncmVnYXRpb24gcHJvY2Vzcy4KKyAgICAgICAgaWYgKGRlbHRhTXMoc3RhcnRpbmdUcywgc2hvcnRIaXN0LmZpcnN0KSA+PSBrTWF4SGlzdFRpbWVzcGFuTXMpIHsKKyAgICAgICAgICAgIG1Mb25nVGVybUhpc3RzLmVtcGxhY2VfYmFjayhzdGFydGluZ1RzLCBzdGQ6Om1vdmUoYnVja2V0cykpOworICAgICAgICAgICAgYnVja2V0cy5jbGVhcigpOworICAgICAgICAgICAgc3RhcnRpbmdUcyA9IHNob3J0SGlzdC5maXJzdDsKKyAgICAgICAgICAgIC8vIFdoZW4gbWVtb3J5IGlzIGZ1bGwsIGRlbGV0ZSBvbGRlc3QgaGlzdG9ncmFtCisgICAgICAgICAgICAvLyBUT0RPIHVzZSBhIGNpcmN1bGFyIGJ1ZmZlcgorICAgICAgICAgICAgaWYgKG1Mb25nVGVybUhpc3RzLnNpemUoKSA+PSBrTG9uZ1Rlcm1IaXN0c0NhcGFjaXR5KSB7CisgICAgICAgICAgICAgICAgbUxvbmdUZXJtSGlzdHMucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgY3VycmVudCBoaXN0b2dyYW0gdG8gYnVja2V0cworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmNvdW50UGFpciA6IHNob3J0SGlzdC5zZWNvbmQpIHsKKyAgICAgICAgICAgIGJ1Y2tldHNbY291bnRQYWlyLmZpcnN0XSArPSBjb3VudFBhaXIuc2Vjb25kOworICAgICAgICB9CisgICAgfQorICAgIG1SZWNlbnRIaXN0cy5jbGVhcigpOworICAgIC8vIFRPRE86IGRlY2lkZSB3aGVuL3doZXJlIHRvIGNhbGwgd3JpdGVUb0ZpbGUKKyAgICAvLyBUT0RPOiBhZGQgYSB0aHJlYWQtc3BlY2lmaWMgZXh0ZW5zaW9uIHRvIHRoZSBmaWxlIG5hbWUKKyAgICBzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga05hbWUgPSAoY29uc3QgY2hhciAqKSAiL2RhdGEvbWlzYy9hdWRpb3NlcnZlci9zYW1wbGVfcmVzdWx0cy50eHQiOworICAgIHdyaXRlVG9GaWxlKG1PdXRsaWVyRGF0YSwgbUxvbmdUZXJtSGlzdHMsIGtOYW1lLCBmYWxzZSk7Cit9CisKKy8vIEdpdmVuIGEgc2VyaWVzIG9mIG91dGxpZXIgaW50ZXJ2YWxzIChtT3V0bGllciBkYXRhKSwKKy8vIGxvb2tzIGZvciBjaGFuZ2VzIGluIGRpc3RyaWJ1dGlvbiAocGVha3MpLCB3aGljaCBjYW4gYmUgZWl0aGVyIHBvc2l0aXZlIG9yIG5lZ2F0aXZlLgorLy8gVGhlIGZ1bmN0aW9uIHNldHMgdGhlIG1lYW4gdG8gdGhlIHN0YXJ0aW5nIHZhbHVlIGFuZCBzaWdtYSB0byAwLCBhbmQgdXBkYXRlcworLy8gdGhlbSBhcyBsb25nIGFzIG5vIHBlYWsgaXMgZGV0ZWN0ZWQuIFdoZW4gYSB2YWx1ZSBpcyBtb3JlIHRoYW4gJ3RocmVzaG9sZCcKKy8vIHN0YW5kYXJkIGRldmlhdGlvbnMgZnJvbSB0aGUgbWVhbiwgYSBwZWFrIGlzIGRldGVjdGVkIGFuZCB0aGUgbWVhbiBhbmQgc2lnbWEKKy8vIGFyZSBzZXQgdG8gdGhlIHBlYWsgdmFsdWUgYW5kIDAuCit2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OmRldGVjdFBlYWtzKCkgeworICAgIGlmIChtT3V0bGllckRhdGEuZW1wdHkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gY29tcHV0ZSBtZWFuIG9mIHRoZSBkaXN0cmlidXRpb24uIFVzZWQgdG8gY2hlY2sgd2hldGhlciBhIHZhbHVlIGlzIGxhcmdlCisgICAgY29uc3QgZG91YmxlIGtUeXBpY2FsRGlmZiA9IHN0ZDo6YWNjdW11bGF0ZSgKKyAgICAgICAgbU91dGxpZXJEYXRhLmJlZ2luKCksIG1PdXRsaWVyRGF0YS5lbmQoKSwgMCwKKyAgICAgICAgW10oYXV0byAmYSwgYXV0byAmYil7cmV0dXJuIGEgKyBiLmZpcnN0O30pIC8gbU91dGxpZXJEYXRhLnNpemUoKTsKKyAgICAvLyBBTE9HRCgidHlwaWNhbERpZmYgJWYiLCBrVHlwaWNhbERpZmYpOworCisgICAgLy8gaXRlcmF0b3IgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHNlcXVlbmNlLCBvciB1cGRhdGVkIHRvIHRoZSBtb3N0IHJlY2VudCBwZWFrCisgICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dWludDY0X3QsIHVpbnQ2NF90Pj46Oml0ZXJhdG9yIHN0YXJ0ID0gbU91dGxpZXJEYXRhLmJlZ2luKCk7CisgICAgLy8gdGhlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBhcmUgdXBkYXRlZCBldmVyeSB0aW1lIGEgcGVhayBpcyBkZXRlY3RlZAorICAgIC8vIGluaXRpYWxpemUgZmlyc3QgdGltZS4gVGhlIG1lYW4gZnJvbSB0aGUgcHJldmlvdXMgc2VxdWVuY2UgaXMgc3RvcmVkCisgICAgLy8gZm9yIHRoZSBuZXh0IHNlcXVlbmNlLiBIZXJlLCB0aGV5IGFyZSBpbml0aWFsaXplZCBmb3IgdGhlIGZpcnN0IHRpbWUuCisgICAgaWYgKG1QZWFrRGV0ZWN0b3JNZWFuIDwgMCkgeworICAgICAgICBtUGVha0RldGVjdG9yTWVhbiA9IHN0YXRpY19jYXN0PGRvdWJsZT4oc3RhcnQtPmZpcnN0KTsKKyAgICAgICAgbVBlYWtEZXRlY3RvclNkID0gMDsKKyAgICB9CisgICAgYXV0byBzcXIgPSBbXShhdXRvIHgpeyByZXR1cm4geCAqIHg7IH07CisgICAgZm9yIChhdXRvIGl0ID0gbU91dGxpZXJEYXRhLmJlZ2luKCk7IGl0ICE9IG1PdXRsaWVyRGF0YS5lbmQoKTsgKytpdCkgeworICAgICAgICAvLyBubyBzdXJwcmlzZSBvY2N1cnJlZDoKKyAgICAgICAgLy8gdGhlIG5ldyBlbGVtZW50IGlzIGEgc21hbGwgbnVtYmVyIG9mIHN0YW5kYXJkIGRldmlhdGlvbnMgZnJvbSB0aGUgbWVhbgorICAgICAgICBpZiAoKGZhYnMoaXQtPmZpcnN0IC0gbVBlYWtEZXRlY3Rvck1lYW4pIDwga1N0ZGRldlRocmVzaG9sZCAqIG1QZWFrRGV0ZWN0b3JTZCkgfHwKKyAgICAgICAgICAgICAvLyBvcjogcmlnaHQgYWZ0ZXIgcGVhayBoYXMgYmVlbiBkZXRlY3RlZCwgdGhlIGRlbHRhIGlzIHNtYWxsZXIgdGhhbiBhdmVyYWdlCisgICAgICAgICAgICAobVBlYWtEZXRlY3RvclNkID09IDAgJiYgZmFicyhpdC0+Zmlyc3QgLSBtUGVha0RldGVjdG9yTWVhbikgPCBrVHlwaWNhbERpZmYpKSB7CisgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIG1lYW4gYW5kIHNkOgorICAgICAgICAgICAgLy8gY291bnQgbnVtYmVyIG9mIGVsZW1lbnRzIChkaXN0YW5jZSBiZXR3ZWVuIHN0YXJ0IGludGVyYXRvciBhbmQgY3VycmVudCkKKyAgICAgICAgICAgIGNvbnN0IGludCBrTiA9IHN0ZDo6ZGlzdGFuY2Uoc3RhcnQsIGl0KSArIDE7CisgICAgICAgICAgICAvLyB1c3VhbCBmb3JtdWxhcyBmb3IgbWVhbiBhbmQgc2QKKyAgICAgICAgICAgIG1QZWFrRGV0ZWN0b3JNZWFuID0gc3RkOjphY2N1bXVsYXRlKHN0YXJ0LCBpdCArIDEsIDAuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oYXV0byAmYSwgYXV0byAmYil7cmV0dXJuIGEgKyBiLmZpcnN0O30pIC8ga047CisgICAgICAgICAgICBtUGVha0RldGVjdG9yU2QgPSBzcXJ0KHN0ZDo6YWNjdW11bGF0ZShzdGFydCwgaXQgKyAxLCAwLjAsCisgICAgICAgICAgICAgICAgICAgICAgWz1dKGF1dG8gJmEsIGF1dG8gJmIpeyByZXR1cm4gYSArIHNxcihiLmZpcnN0IC0gbVBlYWtEZXRlY3Rvck1lYW4pO30pKSAvCisgICAgICAgICAgICAgICAgICAgICAgKChrTiA+IDEpPyBrTiAtIDEgOiBrTik7IC8vIGtOIC0gMTogbWVhbiBpcyBjb3JyZWxhdGVkIHdpdGggdmFyaWFuY2UKKyAgICAgICAgfQorICAgICAgICAvLyBzdXJwcmlzaW5nIHZhbHVlOiBzdG9yZSBwZWFrIHRpbWVzdGFtcCBhbmQgcmVzZXQgbWVhbiwgc2QsIGFuZCBzdGFydCBpdGVyYXRvcgorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1QZWFrVGltZXN0YW1wcy5lbXBsYWNlX2JhY2soaXQtPnNlY29uZCk7CisgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgcG9wX2Zyb250IG9uY2UgYSBjaXJjdWxhciBidWZmZXIgaXMgaW4gcGxhY2UKKyAgICAgICAgICAgIGlmIChtUGVha1RpbWVzdGFtcHMuc2l6ZSgpID49IGtQZWFrU2VyaWVzU2l6ZSkgeworICAgICAgICAgICAgICAgIG1QZWFrVGltZXN0YW1wcy5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QZWFrRGV0ZWN0b3JNZWFuID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihpdC0+Zmlyc3QpOworICAgICAgICAgICAgbVBlYWtEZXRlY3RvclNkID0gMDsKKyAgICAgICAgICAgIHN0YXJ0ID0gaXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworfQorCisvLyBDYWxsZWQgYnkgTG9nVHNFbnRyeS4gVGhlIGlucHV0IGlzIGEgdmVjdG9yIG9mIHRpbWVzdGFtcHMuCisvLyBGaW5kcyBvdXRsaWVycyBhbmQgd3JpdGVzIHRvIG1PdXRsaWVyZGF0YS4KKy8vIEVhY2ggdmFsdWUgaW4gbU91dGxpZXJkYXRhIGNvbnNpc3RzIG9mOiA8b3V0bGllciB0aW1lc3RhbXAsIHRpbWUgZWxhcHNlZCBzaW5jZSBwcmV2aW91cyBvdXRsaWVyPi4KKy8vIGUuZy4gdGltZXN0YW1wcyAobXMpIDEsIDQsIDUsIDE2LCAxOCwgMjggd2lsbCBwcm9kdWNlIHBhaXJzICg0LCA1KSwgKDEzLCAxOCkuCisvLyBUaGlzIGZ1bmN0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIHRpbWUgc2VyaWVzIGJlZm9yZSBpdCBpcyBjb252ZXJ0ZWQgaW50byBhIGhpc3RvZ3JhbS4KK3ZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6c3RvcmVPdXRsaWVyRGF0YShjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAmdGltZXN0YW1wcykgeworICAgIGlmICh0aW1lc3RhbXBzLnNpemUoKSA8IDEpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBmaXJzdCBwYXNzOiBuZWVkIHRvIGluaXRpYWxpemUKKyAgICBpZiAobUVsYXBzZWQgPT0gMCkgeworICAgICAgICBtUHJldk5zID0gdGltZXN0YW1wc1swXTsKKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvICZ0czogdGltZXN0YW1wcykgeworICAgICAgICBjb25zdCB1aW50NjRfdCBkaWZmTXMgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oZGVsdGFNcyhtUHJldk5zLCB0cykpOworICAgICAgICBpZiAoZGlmZk1zID49IHN0YXRpY19jYXN0PHVpbnQ2NF90PihrT3V0bGllck1zKSkgeworICAgICAgICAgICAgbU91dGxpZXJEYXRhLmVtcGxhY2VfYmFjayhtRWxhcHNlZCwgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG1QcmV2TnMpKTsKKyAgICAgICAgICAgIC8vIFJlbW92ZSBvbGRlc3QgdmFsdWUgaWYgdGhlIHZlY3RvciBpcyBmdWxsCisgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgcG9wX2Zyb250IG9uY2UgY2lyY3VsYXIgYnVmZmVyIGlzIGluIHBsYWNlCisgICAgICAgICAgICAvLyBGSVhNRTogbWFrZSBzdXJlIGtTaG9ydEhpc3RTaXplIGlzIGxhcmdlIGVub3VnaCB0aGF0IHRoYXQgZGF0YSB3aWxsIG5ldmVyIGJlIGxvc3QKKyAgICAgICAgICAgIC8vIGJlZm9yZSBiZWluZyB3cml0dGVuIHRvIGZpbGUgb3IgdG8gYSBGSUZPCisgICAgICAgICAgICBpZiAobU91dGxpZXJEYXRhLnNpemUoKSA+PSBrT3V0bGllclNlcmllc1NpemUpIHsKKyAgICAgICAgICAgICAgICBtT3V0bGllckRhdGEucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRWxhcHNlZCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgbUVsYXBzZWQgKz0gZGlmZk1zOworICAgICAgICBtUHJldk5zID0gdHM7CisgICAgfQorfQorCisKKy8vIEZJWE1FOiBkZWxldGUgdGhpcyB0ZW1wb3JhcnkgdGVzdCBjb2RlLCByZWN5Y2xlZCBmb3IgdmFyaW91cyBuZXcgZnVuY3Rpb25zCit2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OnRlc3RGdW5jdGlvbigpIHsKKyAgICAvLyBwcm9kdWNlcyB2YWx1ZXMgKDQ6IDUwMDAwMDApLCAoMTM6IDE4MDAwMDAwKQorICAgIC8vIG5zIHRpbWVzdGFtcHMgb2YgYnVmZmVyIHBlcmlvZHMKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PmtUZW1wVGVzdERhdGEgPSB7MTAwMDAwMCwgNDAwMDAwMCwgNTAwMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMDAwMDAsIDE4MDAwMDAwLCAyODAwMDAwMH07CisgICAgUGVyZm9ybWFuY2VBbmFseXNpczo6c3RvcmVPdXRsaWVyRGF0YShrVGVtcFRlc3REYXRhKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJm91dGxpZXI6IG1PdXRsaWVyRGF0YSkgeworICAgICAgICBBTE9HRSgiUGVyZm9ybWFuY2VBbmFseXNpcyB0ZXN0ICVsbGQ6ICVsbGQiLAorICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG91dGxpZXIuZmlyc3QpLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG91dGxpZXIuc2Vjb25kKSk7CisgICAgfQorICAgIGRldGVjdFBlYWtzKCk7Cit9CisKKy8vIFRPRE8gTWFrZSBpdCByZXR1cm4gYSBzdGQ6OnN0cmluZyBpbnN0ZWFkIG9mIG1vZGlmeWluZyBib2R5IC0tPiBpcyB0aGlzIHN0aWxsIHJlbGV2YW50PworLy8gVE9ETyBjb25zaWRlciBjaGFuZ2luZyBhbGwgaW50cyB0byB1aW50MzJfdCBvciB1aW50NjRfdAorLy8gVE9ETzogbW92ZSB0aGlzIHRvIFJlcG9ydFBlcmZvcm1hbmNlLCBwcm9iYWJseSBtYWtlIGl0IGEgZnJpZW5kIGZ1bmN0aW9uIG9mIFBlcmZvcm1hbmNlQW5hbHlzaXMKK3ZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6cmVwb3J0UGVyZm9ybWFuY2UoU3RyaW5nOCAqYm9keSwgaW50IG1heEhlaWdodCkgeworICAgIGlmIChtUmVjZW50SGlzdHMuc2l6ZSgpIDwgMSkgeworICAgICAgICBBTE9HRCgicmVwb3J0UGVyZm9ybWFuY2U6IG1SZWNlbnRIaXN0cyBpcyBlbXB0eSIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dEKCJyZXBvcnRQZXJmb3JtYW5jZTogaGlzdHMgc2l6ZSAlZCIsIHN0YXRpY19jYXN0PGludD4obVJlY2VudEhpc3RzLnNpemUoKSkpOworICAgIC8vIFRPRE86IG1vcmUgZWxhYm9yYXRlIGRhdGEgYW5hbHlzaXMKKyAgICBzdGQ6Om1hcDxpbnQsIGludD4gYnVja2V0czsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnNob3J0SGlzdDogbVJlY2VudEhpc3RzKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmY291bnRQYWlyIDogc2hvcnRIaXN0LnNlY29uZCkgeworICAgICAgICAgICAgYnVja2V0c1tjb3VudFBhaXIuZmlyc3RdICs9IGNvdW50UGFpci5zZWNvbmQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB1bmRlcnNjb3JlcyBhbmQgc3BhY2VzIGxlbmd0aCBjb3JyZXNwb25kcyB0byBtYXhpbXVtIHdpZHRoIG9mIGhpc3RvZ3JhbQorICAgIHN0YXRpYyBjb25zdCBpbnQga0xlbiA9IDQwOworICAgIHN0ZDo6c3RyaW5nIHVuZGVyc2NvcmVzKGtMZW4sICdfJyk7CisgICAgc3RkOjpzdHJpbmcgc3BhY2VzKGtMZW4sICcgJyk7CisKKyAgICBhdXRvIGl0ID0gYnVja2V0cy5iZWdpbigpOworICAgIGludCBtYXhEZWx0YSA9IGl0LT5maXJzdDsKKyAgICBpbnQgbWF4Q291bnQgPSBpdC0+c2Vjb25kOworICAgIC8vIENvbXB1dGUgbWF4aW11bSB2YWx1ZXMKKyAgICB3aGlsZSAoKytpdCAhPSBidWNrZXRzLmVuZCgpKSB7CisgICAgICAgIGlmIChpdC0+Zmlyc3QgPiBtYXhEZWx0YSkgeworICAgICAgICAgICAgbWF4RGVsdGEgPSBpdC0+Zmlyc3Q7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGl0LT5zZWNvbmQgPiBtYXhDb3VudCkgeworICAgICAgICAgICAgbWF4Q291bnQgPSBpdC0+c2Vjb25kOworICAgICAgICB9CisgICAgfQorICAgIGludCBoZWlnaHQgPSBsb2cyKG1heENvdW50KSArIDE7IC8vIG1heENvdW50ID4gMCwgc2FmZSB0byBjYWxsIGxvZzIKKyAgICBjb25zdCBpbnQgbGVmdFBhZGRpbmcgPSB3aWR0aE9mKDEgPDwgaGVpZ2h0KTsKKyAgICBjb25zdCBpbnQgY29sV2lkdGggPSBzdGQ6Om1heChzdGQ6Om1heCh3aWR0aE9mKG1heERlbHRhKSArIDEsIDMpLCBsZWZ0UGFkZGluZyArIDIpOworICAgIGludCBzY2FsaW5nRmFjdG9yID0gMTsKKyAgICAvLyBzY2FsZSBkYXRhIGlmIGl0IGV4Y2VlZHMgbWF4aW11bSBoZWlnaHQKKyAgICBpZiAoaGVpZ2h0ID4gbWF4SGVpZ2h0KSB7CisgICAgICAgIHNjYWxpbmdGYWN0b3IgPSAoaGVpZ2h0ICsgbWF4SGVpZ2h0KSAvIG1heEhlaWdodDsKKyAgICAgICAgaGVpZ2h0IC89IHNjYWxpbmdGYWN0b3I7CisgICAgfQorICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lKnMiLCBsZWZ0UGFkZGluZyArIDExLCAiT2NjdXJyZW5jZXMiKTsKKyAgICAvLyB3cml0ZSBoaXN0b2dyYW0gbGFiZWwgbGluZSB3aXRoIGJ1Y2tldCB2YWx1ZXMKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJXMiLCAiICIpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpzIiwgbGVmdFBhZGRpbmcsICIgIik7CisgICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgeworICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqZCIsIGNvbFdpZHRoLCB4LnNlY29uZCk7CisgICAgfQorICAgIC8vIHdyaXRlIGhpc3RvZ3JhbSBhc2NpaSBhcnQKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJXMiLCAiICIpOworICAgIGZvciAoaW50IHJvdyA9IGhlaWdodCAqIHNjYWxpbmdGYWN0b3I7IHJvdyA+PSAwOyByb3cgLT0gc2NhbGluZ0ZhY3RvcikgeworICAgICAgICBjb25zdCBpbnQgdmFsdWUgPSAxIDw8IHJvdzsKKyAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLipzIiwgbGVmdFBhZGRpbmcsIHNwYWNlcy5jX3N0cigpKTsKKyAgICAgICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgeworICAgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyVzIiwgY29sV2lkdGggLSAxLCBzcGFjZXMuY19zdHIoKSwgeC5zZWNvbmQgPCB2YWx1ZSA/ICIgIiA6ICJ8Iik7CisgICAgICAgIH0KKyAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKKyAgICB9CisgICAgLy8gcHJpbnQgeC1heGlzCisgICAgY29uc3QgaW50IGNvbHVtbnMgPSBzdGF0aWNfY2FzdDxpbnQ+KGJ1Y2tldHMuc2l6ZSgpKTsKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqYyIsIGxlZnRQYWRkaW5nLCAnICcpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyIsIChjb2x1bW5zICsgMSkgKiBjb2xXaWR0aCwgdW5kZXJzY29yZXMuY19zdHIoKSk7CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKKworICAgIC8vIHdyaXRlIGZvb3RlciB3aXRoIGJ1Y2tldCBsYWJlbHMKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqcyIsIGxlZnRQYWRkaW5nLCAiICIpOworICAgIGZvciAoYXV0byBjb25zdCAmeCA6IGJ1Y2tldHMpIHsKKyAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKmQiLCBjb2xXaWR0aCwgeC5maXJzdCk7CisgICAgfQorICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyVzIiwgY29sV2lkdGgsIHNwYWNlcy5jX3N0cigpLCAibXNcbiIpOworCisgICAgLy8gTm93IHJlcG9ydCBnbGl0Y2hlcworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG50aW1lIGVsYXBzZWQgYmV0d2VlbiBnbGl0Y2hlcyBhbmQgZ2xpdGNoIHRpbWVzdGFtcHNcbiIpOworICAgIGZvciAoY29uc3QgYXV0byAmb3V0bGllcjogbU91dGxpZXJEYXRhKSB7CisgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJWxsZDogJWxsZFxuIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihvdXRsaWVyLmZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4ob3V0bGllci5zZWNvbmQpKTsKKyAgICB9CisKK30KKworCisvLyBQcm9kdWNlcyBhIGxvZyB3YXJuaW5nIGlmIHRoZSB0aW1pbmcgb2YgcmVjZW50IGJ1ZmZlciBwZXJpb2RzIGNhdXNlZCBhIGdsaXRjaAorLy8gQ29tcHV0ZXMgc3VtIG9mIHJ1bm5pbmcgd2luZG93IG9mIHRocmVlIGJ1ZmZlciBwZXJpb2RzCisvLyBDaGVja3Mgd2hldGhlciB0aGUgYnVmZmVyIHBlcmlvZHMgbGVhdmUgZW5vdWdoIENQVSB0aW1lIGZvciB0aGUgbmV4dCBvbmUKKy8vIGUuZy4gaWYgYSBidWZmZXIgcGVyaW9kIGlzIGV4cGVjdGVkIHRvIGJlIDQgbXMgYW5kIGEgYnVmZmVyIHJlcXVpcmVzIDMgbXMgb2YgQ1BVIHRpbWUsCisvLyBoZXJlIGFyZSBzb21lIGdsaXRjaCBjYXNlczoKKy8vIDQgKyA0ICsgNiA7IDUgKyA0ICsgNTsgMiArIDIgKyAxMAorLy8gVE9ETzogZGV2ZWxvcCB0aGlzIGNvZGUgdG8gdHJhY2sgY2hhbmdlcyBpbiBoaXN0b2dyYW0gZGlzdHJpYnV0aW9uIGluIGFkZGl0aW9uCisvLyB0byAvIGluc3RlYWQgb2YgZ2xpdGNoZXMuCit2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OmFsZXJ0SWZHbGl0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gJnNhbXBsZXMpIHsKKyAgICBzdGQ6OmRlcXVlPGludD4gcGVyaW9kcyhrTnVtQnVmZiwga1BlcmlvZE1zKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMjsgaSA8IHNhbXBsZXMuc2l6ZSgpOyArK2kpIHsgLy8gc2tpcCBmaXJzdCB0aW1lIGVudHJ5CisgICAgICAgIHBlcmlvZHMucHVzaF9mcm9udChkZWx0YU1zKHNhbXBsZXNbaSAtIDFdLCBzYW1wbGVzW2ldKSk7CisgICAgICAgIHBlcmlvZHMucG9wX2JhY2soKTsKKyAgICAgICAgLy8gVE9ETzogY2hlY2sgdGhhdCBhbGwgZ2xpdGNoIGNhc2VzIGFyZSBjb3ZlcmVkCisgICAgICAgIGlmIChzdGQ6OmFjY3VtdWxhdGUocGVyaW9kcy5iZWdpbigpLCBwZXJpb2RzLmVuZCgpLCAwKSA+IGtOdW1CdWZmICoga1BlcmlvZE1zICsKKyAgICAgICAgICAgIGtQZXJpb2RNcyAtIGtQZXJpb2RNc0NQVSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJBIGdsaXRjaCBvY2N1cnJlZCIpOworICAgICAgICAgICAgICAgIHBlcmlvZHMuYXNzaWduKGtOdW1CdWZmLCBrUGVyaW9kTXMpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybjsKK30KKworfSAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9SZXBvcnRQZXJmb3JtYW5jZS5jcHAgYi9tZWRpYS9saWJuYmFpby9SZXBvcnRQZXJmb3JtYW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM1MGFkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5iYWlvL1JlcG9ydFBlcmZvcm1hbmNlLmNwcApAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJSZXBvcnRQZXJmb3JtYW5jZSIKKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CTG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUGVyZm9ybWFuY2VBbmFseXNpcy5oPgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL1JlcG9ydFBlcmZvcm1hbmNlLmg+CisvLyAjaW5jbHVkZSA8dXRpbHMvQ2FsbFN0YWNrLmg+IC8vIHVzZWQgdG8gcHJpbnQgY2FsbHN0YWNrCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZSB7CisKKy8vIFdyaXRlcyBvdXRsaWVyIGludGVydmFscywgdGltZXN0YW1wcywgYW5kIGhpc3RvZ3JhbXMgc3Bhbm5pbmcgbG9uZyB0aW1lIGludGVydmFscyB0byBhIGZpbGUuCisvLyBUT0RPOiBmb3JtYXQgdGhlIGRhdGEgZWZmaWNpZW50bHkgYW5kIHdyaXRlIGRpZmZlcmVudCB0eXBlcyBvZiBkYXRhIHRvIGRpZmZlcmVudCBmaWxlcwordm9pZCB3cml0ZVRvRmlsZShzdGQ6OmRlcXVlPHN0ZDo6cGFpcjxvdXRsaWVySW50ZXJ2YWwsIHRpbWVzdGFtcD4+ICZvdXRsaWVyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdG9ncmFtPj4gJmhpc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGtOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhcHBlbmQpIHsKKyAgICBBTE9HRCgid3JpdGluZyBwZXJmb3JtYW5jZSBkYXRhIHRvIGZpbGUiKTsKKyAgICBpZiAob3V0bGllckRhdGEuZW1wdHkoKSB8fCBoaXN0cy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6Om9mc3RyZWFtIG9mczsKKyAgICBvZnMub3BlbihrTmFtZSwgYXBwZW5kID8gc3RkOjppb3M6OmFwcCA6IHN0ZDo6aW9zOjp0cnVuYyk7CisgICAgaWYgKCFvZnMuaXNfb3BlbigpKSB7CisgICAgICAgIEFMT0dXKCJjb3VsZG4ndCBvcGVuIGZpbGUgJXMiLCBrTmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgb2ZzIDw8ICJPdXRsaWVyIGRhdGE6IGludGVydmFsIGFuZCB0aW1lc3RhbXBcbiI7CisgICAgZm9yIChjb25zdCBhdXRvICZvdXRsaWVyIDogb3V0bGllckRhdGEpIHsKKyAgICAgICAgb2ZzIDw8IG91dGxpZXIuZmlyc3QgPDwgIjogIiA8PCBvdXRsaWVyLnNlY29uZCA8PCAiXG4iOworICAgIH0KKyAgICBvZnMgPDwgIkhpc3RvZ3JhbSBkYXRhXG4iOworICAgIGZvciAoY29uc3QgYXV0byAmaGlzdCA6IGhpc3RzKSB7CisgICAgICAgIG9mcyA8PCAiXHR0aW1lc3RhbXBcbiI7CisgICAgICAgIG9mcyA8PCBoaXN0LmZpcnN0IDw8ICJcbiI7CisgICAgICAgIG9mcyA8PCAiXHRidWNrZXRzIGFuZCBjb3VudHNcbiI7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmYnVja2V0IDogaGlzdC5zZWNvbmQpIHsKKyAgICAgICAgICAgIG9mcyA8PCBidWNrZXQuZmlyc3QgPDwgIjogIiA8PCBidWNrZXQuc2Vjb25kIDw8ICJcbiI7CisgICAgICAgIH0KKyAgICB9CisgICAgb2ZzLmNsb3NlKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmgKaW5kZXggNDc0N2RjZi4uNzExODJiYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmgKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmgKQEAgLTE5LDggKzE5LDggQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19CVUZGRVJfUFJPVklERVJfU09VUkNFX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT19CVUZGRVJfUFJPVklERVJfU09VUkNFX0gKIAotI2luY2x1ZGUgIk5CQUlPLmgiCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9BdWRpb1N0cmVhbUluU291cmNlLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmgKaW5kZXggNTA4ZTBmZS4uOGEzZmZiZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9BdWRpb1N0cmVhbUluU291cmNlLmgKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmgKQEAgLTE3LDcgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19TVFJFQU1fSU5fU09VUkNFX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT19TVFJFQU1fSU5fU09VUkNFX0gKIAotI2luY2x1ZGUgIk5CQUlPLmgiCisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL0F1ZGlvU3RyZWFtT3V0U2luay5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL0F1ZGlvU3RyZWFtT3V0U2luay5oCnJlbmFtZSB0byBtZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oCmluZGV4IDU2YTJhMzguLjM0OGI0ZjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvQXVkaW9TdHJlYW1PdXRTaW5rLmgKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaApAQCAtMTcsNyArMTcsNyBAQAogI2lmbmRlZiBBTkRST0lEX0FVRElPX1NUUkVBTV9PVVRfU0lOS19ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fU1RSRUFNX09VVF9TSU5LX0gKIAotI2luY2x1ZGUgIk5CQUlPLmgiCisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL0xpYnNuZGZpbGVTaW5rLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTaW5rLmgKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9MaWJzbmRmaWxlU2luay5oCnJlbmFtZSB0byBtZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTaW5rLmgKaW5kZXggOTdhNTdlMC4uNTM1ZTNmNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9MaWJzbmRmaWxlU2luay5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNpbmsuaApAQCAtMTcsNyArMTcsOCBAQAogI2lmbmRlZiBBTkRST0lEX0FVRElPX0xJQlNOREZJTEVfU0lOS19ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fTElCU05ERklMRV9TSU5LX0gKIAotI2luY2x1ZGUgIk5CQUlPLmgiCisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KKwogI2luY2x1ZGUgInNuZGZpbGUuaCIKIAogLy8gSW1wbGVtZW50YXRpb24gb2YgTkJBSU9fU2luayB0aGF0IHdyYXBzIGEgbGlic25kZmlsZSBvcGVuZWQgaW4gU0ZNX1dSSVRFIG1vZGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTGlic25kZmlsZVNvdXJjZS5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU291cmNlLmgKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9MaWJzbmRmaWxlU291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNvdXJjZS5oCmluZGV4IDRmYmRiNGIuLmJjNmFhOWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTGlic25kZmlsZVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNvdXJjZS5oCkBAIC0xNyw3ICsxNyw4IEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9fTElCU05ERklMRV9TT1VSQ0VfSAogI2RlZmluZSBBTkRST0lEX0FVRElPX0xJQlNOREZJTEVfU09VUkNFX0gKIAotI2luY2x1ZGUgIk5CQUlPLmgiCisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KKwogI2luY2x1ZGUgInNuZGZpbGUuaCIKIAogLy8gSW1wbGVtZW50YXRpb24gb2YgTkJBSU9fU291cmNlIHRoYXQgd3JhcHMgYSBsaWJzbmRmaWxlIG9wZW5lZCBpbiBTRk1fUkVBRCBtb2RlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL05CTG9nLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmgKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9OQkxvZy5oCnJlbmFtZSB0byBtZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmgKaW5kZXggNzg1YjljMi4uM2U0OGVlMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9OQkxvZy5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKICNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8ZGVxdWU+CiAjaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPHZlY3Rvcj4KIApAQCAtNDMsOCArNDQsNiBAQAogY2xhc3MgV3JpdGVyOwogY2xhc3MgUmVhZGVyOwogCi1wcml2YXRlOgotCiBlbnVtIEV2ZW50IDogdWludDhfdCB7CiAgICAgRVZFTlRfUkVTRVJWRUQsCiAgICAgRVZFTlRfU1RSSU5HLCAgICAgICAgICAgICAgIC8vIEFTQ0lJIHN0cmluZywgbm90IE5VTC10ZXJtaW5hdGVkCkBAIC01OSwxMiArNTgsMTMgQEAKICAgICBFVkVOVF9IQVNILCAgICAgICAgICAgICAgICAgLy8gdW5pcXVlIEhBU0ggb2YgbG9nIG9yaWdpbiwgb3JpZ2luYXRlcyBmcm9tIGhhc2ggb2YgZmlsZSBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBsaW5lIG51bWJlcgogICAgIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywgICAvLyBzaW5nbGUgZGF0dW0gZm9yIHRpbWVzdGFtcCBoaXN0b2dyYW0KLSAgICBFVkVOVF9ISVNUT0dSQU1fRkxVU0gsICAgICAgLy8gc2hvdyBoaXN0b2dyYW0gb24gbG9nCisgICAgRVZFTlRfQVVESU9fU1RBVEUsICAgICAgICAgIC8vIGF1ZGlvIG9uL29mZiBldmVudDogbG9nZ2VkIHVwb24gRmFzdE1peGVyOjpvblN0YXRlQ2hhbmdlKCkgY2FsbAogICAgIEVWRU5UX0VORF9GTVQsICAgICAgICAgICAgICAvLyBlbmQgb2YgbG9nRm9ybWF0IGFyZ3VtZW50IGxpc3QKIAogICAgIEVWRU5UX1VQUEVSX0JPVU5ELCAgICAgICAgICAvLyB0byBjaGVjayBmb3IgaW52YWxpZCBldmVudHMKIH07CiAKK3ByaXZhdGU6CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gQVBJIGZvciBoYW5kbGluZyBmb3JtYXQgZW50cnkgb3BlcmF0aW9ucwpAQCAtMjQ4LDYgKzI0OCw4IEBACiAgICAgaW50IGF1dGhvcjsKIH07IC8vVE9ETyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAordXNpbmcgU3RhdGVUc0VudHJ5V2l0aEF1dGhvciA9IEhpc3RUc0VudHJ5V2l0aEF1dGhvcjsKKwogc3RydWN0IEhpc3RJbnRFbnRyeSB7CiAgICAgbG9nX2hhc2hfdCBoYXNoOwogICAgIGludCB2YWx1ZTsKQEAgLTM0MSw4ICszNDMsNyBAQAogICAgIHZpcnR1YWwgdm9pZCAgICBsb2dTdGFydChjb25zdCBjaGFyICpmbXQpOwogICAgIHZpcnR1YWwgdm9pZCAgICBsb2dFbmQoKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nSGFzaChsb2dfaGFzaF90IGhhc2gpOwotICAgIHZpcnR1YWwgdm9pZCAgICBsb2dIaXN0VFMobG9nX2hhc2hfdCBoYXNoKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgbG9nSGlzdEZsdXNoKGxvZ19oYXNoX3QgaGFzaCk7CisgICAgdmlydHVhbCB2b2lkICAgIGxvZ0V2ZW50SGlzdFRzKEV2ZW50IGV2ZW50LCBsb2dfaGFzaF90IGhhc2gpOwogCiAgICAgdmlydHVhbCBib29sICAgIGlzRW5hYmxlZCgpIGNvbnN0OwogCkBAIC00MDcsNiArNDA4LDcgQEAKIHB1YmxpYzoKIAogICAgIC8vIEEgc25hcHNob3Qgb2YgYSByZWFkZXJzIGJ1ZmZlcgorICAgIC8vIFRoaXMgaXMgcmF3IGRhdGEuIE5vIGFuYWx5c2lzIGhhcyBiZWVuIGRvbmUgb24gaXQKICAgICBjbGFzcyBTbmFwc2hvdCB7CiAgICAgcHVibGljOgogICAgICAgICBTbmFwc2hvdCgpIDogbURhdGEoTlVMTCksIG1Mb3N0KDApIHt9CkBAIC00NDMsMjAgKzQ0NSwxNyBAQAogCiAgICAgdmlydHVhbCB+UmVhZGVyKCk7CiAKLSAgICB2b2lkIGFsZXJ0SWZHbGl0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gJnNhbXBsZXMpOwotCiAgICAgLy8gZ2V0IHNuYXBzaG90IG9mIHJlYWRlcnMgZmlmbyBidWZmZXIsIGVmZmVjdGl2ZWx5IGNvbnN1bWluZyB0aGUgYnVmZmVyCiAgICAgc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBnZXRTbmFwc2hvdCgpOwogICAgIC8vIGR1bXAgYSBwYXJ0aWN1bGFyIHNuYXBzaG90IG9mIHRoZSByZWFkZXIKKyAgICAvLyBUT0RPOiBtb3ZlIGR1bXAgdG8gUGVyZm9ybWFuY2VBbmFseXNpcy4gTW9kZWwvdmlldy9jb250cm9sbGVyIGRlc2lnbgogICAgIHZvaWQgICAgIGR1bXAoaW50IGZkLCBzaXplX3QgaW5kZW50LCBTbmFwc2hvdCAmIHNuYXApOwogICAgIC8vIGR1bXAgdGhlIGN1cnJlbnQgY29udGVudCBvZiB0aGUgcmVhZGVyJ3MgYnVmZmVyIChjYWxsIGdldFNuYXBzaG90KCkgYW5kIHByZXZpb3VzIGR1bXAoKSkKICAgICB2b2lkICAgICBkdW1wKGludCBmZCwgc2l6ZV90IGluZGVudCA9IDApOwogICAgIGJvb2wgICAgIGlzSU1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSkgY29uc3Q7Ci0gICAgLy8gaWYgZmluZEdsaXRjaCBpcyB0cnVlLCBsb2cgd2FybmluZyB3aGVuIGJ1ZmZlciBwZXJpb2RzIGNhdXNlZCBnbGl0Y2gKLSAgICB2b2lkICAgICBzZXRGaW5kR2xpdGNoKGJvb2wgcyk7Ci0gICAgYm9vbCAgICAgaXNGaW5kR2xpdGNoKCkgY29uc3Q7CiAKIHByaXZhdGU6CisKICAgICBzdGF0aWMgY29uc3Qgc3RkOjpzZXQ8RXZlbnQ+IHN0YXJ0aW5nVHlwZXM7CiAgICAgc3RhdGljIGNvbnN0IHN0ZDo6c2V0PEV2ZW50PiBlbmRpbmdUeXBlczsKICAgICAvKmNvbnN0Ki8gU2hhcmVkKiBjb25zdCBtU2hhcmVkOyAgICAvLyByYXcgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5LCBhY3R1YWxseSBjb25zdCBidXQgbm90CkBAIC00NjksMTAgKzQ2OCw2IEBACiAgICAgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIgKiBjb25zdCBtRmlmb1JlYWRlcjsgICAgLy8gdXNlZCB0byByZWFkIGZyb20gRklGTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub24tTlVMTCB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKIAotICAgIC8vIGVhY2ggcGFpciBjb250YWlucyBhIHNlcXVlbmNlIG9mIHRpbWVzdGFtcHMgKG9uZSBoaXN0b2dyYW0ncyB3b3J0aCkKLSAgICAvLyBwYWlyJ3MgbG9nX2hhc2hfdCBpcyB0aGUgaGFzaCBvZiB0aGUgc291cmNlIGNvZGUgbG9jYXRpb24gd2hlcmUgdGhlIHRpbWVzdGFtcCB3YXMgdGFrZW4KLSAgICAvLyBwYWlyJ3MgaW50IHBvaW50cyB0byB0aGUgUmVhZGVyIHRoYXQgb3JpZ2luYXRlZCB0aGUgZW50cnkKLSAgICBzdGQ6Om1hcDxzdGQ6OnBhaXI8bG9nX2hhc2hfdCwgaW50Piwgc3RkOjp2ZWN0b3I8aW50NjRfdD4+IG1IaXN0czsKICAgICAvLyBUT0RPOiBpdCBtaWdodCBiZSBjbGVhcmVyLCBpbnN0ZWFkIG9mIGEgZGlyZWN0IG1hcCBmcm9tIHNvdXJjZSBsb2NhdGlvbiB0byB2ZWN0b3Igb2YKICAgICAvLyB0aW1lc3RhbXBzLCBpZiB3ZSBpbnN0ZWFkIGZpcnN0IG1hcHBlZCBmcm9tIHNvdXJjZSBsb2NhdGlvbiB0byBhbiBvYmplY3QgdGhhdAogICAgIC8vIHJlcHJlc2VudGVkIHRoYXQgbG9jYXRpb24uIEFuZCBvbmVfb2YgaXRzIGZpZWxkcyB3b3VsZCBiZSBhIHZlY3RvciBvZiB0aW1lc3RhbXBzLgpAQCAtNDg1LDE3ICs0ODAsMTIgQEAKICAgICAvLyBkdW1teSBtZXRob2QgZm9yIGhhbmRsaW5nIGFic2VudCBhdXRob3IgZW50cnkKICAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlQXV0aG9yKGNvbnN0IEFic3RyYWN0RW50cnkmIC8qZm10RW50cnkqLywgU3RyaW5nOCogLypib2R5Ki8pIHt9CiAKLSAgICBzdGF0aWMgdm9pZCBkcmF3SGlzdG9ncmFtKFN0cmluZzggKmJvZHksIGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICZzYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2dTY2FsZSwgaW50IGluZGVudCA9IDAsIGludCBtYXhIZWlnaHQgPSAxMCk7Ci0KICAgICAvLyBTZWFyY2hlcyBmb3IgdGhlIGxhc3QgZW50cnkgb2YgdHlwZSA8dHlwZT4gaW4gdGhlIHJhbmdlIFtmcm9udCwgYmFjaykKICAgICAvLyBiYWNrIGhhcyB0byBiZSBlbnRyeS1hbGlnbmVkLiBSZXR1cm5zIG51bGxwdHIgaWYgbm9uZSBlbmNvbnVudGVyZWQuCiAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgKmZpbmRMYXN0RW50cnlPZlR5cGVzKGNvbnN0IHVpbnQ4X3QgKmZyb250LCBjb25zdCB1aW50OF90ICpiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxFdmVudD4gJnR5cGVzKTsKIAogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1NxdWFzaFRpbWVzdGFtcCA9IDU7IC8vIHNxdWFzaCB0aGlzIG1hbnkgb3IgbW9yZSBhZGphY2VudCB0aW1lc3RhbXBzCi0KLSAgICBib29sIGZpbmRHbGl0Y2g7IC8vIGFsZXJ0IGlmIGEgbG9jYWwgYnVmZmVyIHBlcmlvZCBzZXF1ZW5jZSBjYXVzZWQgYW4gYXVkaW8gZ2xpdGNoCiB9OwogCiAvLyBXcmFwcGVyIGZvciBhIHJlYWRlciB3aXRoIGEgbmFtZS4gQ29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSByZWFkZXIgYW5kIGEgcG9pbnRlciB0byB0aGUgbmFtZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGRjMTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmgKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBOb24tYmxvY2tpbmcgZXZlbnQgbG9nZ2VyIGludGVuZGVkIGZvciBzYWZlIGNvbW11bmljYXRpb24gYmV0d2VlbiBwcm9jZXNzZXMgdmlhIHNoYXJlZCBtZW1vcnkKKworI2lmbmRlZiBBTkRST0lEX01FRElBX1BFUkZPUk1BTkNFQU5BTFlTSVNfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1BFUkZPUk1BTkNFQU5BTFlTSVNfSAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJOQkxvZy5oIgorI2luY2x1ZGUgIlJlcG9ydFBlcmZvcm1hbmNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlIHsKKworY2xhc3MgUGVyZm9ybWFuY2VBbmFseXNpcyB7CisgICAgLy8gVGhpcyBjbGFzcyBzdG9yZXMgYW5kIGFuYWx5emVzIGF1ZGlvIHByb2Nlc3Npbmcgd2FrZXVwIHRpbWVzdGFtcHMgZnJvbSBOQkxvZworICAgIC8vIEZJWE1FOiBjdXJyZW50bHksIGFsbCBwZXJmb3JtYW5jZSBkYXRhIGlzIHN0b3JlZCBpbiBkZXF1ZXMuIE5lZWQgdG8gYWRkIGEgbXV0ZXguCisgICAgLy8gRklYTUU6IGNvbnRpbnVlIHRoaXMgd2F5IHVudGlsIGFuYWx5c2lzIGlzIGRvbmUgaW4gYSBzZXBhcmF0ZSB0aHJlYWQuIFRoZW4sIHVzZQorICAgIC8vIHRoZSBmaWZvIHdyaXRlciB1dGlsaXRpZXMuCitwdWJsaWM6CisKKyAgICBQZXJmb3JtYW5jZUFuYWx5c2lzKCk7CisKKyAgICAvLyBHaXZlbiBhIHNlcmllcyBvZiBhdWRpbyBwcm9jZXNzaW5nIHdha2V1cCB0aW1lc3RhbXBzLAorICAgIC8vIGNvbXByZXNzZXMgYW5kIGFuZCBhbmFseXplcyB0aGUgZGF0YSwgYW5kIGZsdXNoZXMKKyAgICAvLyB0aGUgdGltZXN0YW1wIHNlcmllcyBmcm9tIG1lbW9yeS4KKyAgICB2b2lkIHByb2Nlc3NBbmRGbHVzaFRpbWVTdGFtcFNlcmllcygpOworCisgICAgLy8gQ2FsbGVkIHdoZW4gYW4gYXVkaW8gb24vb2ZmIGV2ZW50IGlzIHJlYWQgZnJvbSB0aGUgYnVmZmVyLAorICAgIC8vIGUuZy4gRVZFTlRfQVVESU9fU1RBVEUuCisgICAgLy8gY2FsbHMgZmx1c2hUaW1lU3RhbXBTZXJpZXMgb24gdGhlIGRhdGEgdXAgdG8gdGhlIGV2ZW50LAorICAgIC8vIGVmZmVjdGl2ZWx5IGRpc2NhcmRpbmcgdGhlIGlkbGUgYXVkaW8gdGltZSBpbnRlcnZhbAorICAgIHZvaWQgaGFuZGxlU3RhdGVDaGFuZ2UoKTsKKworICAgIC8vIFdoZW4gdGhlIHNob3J0LXRlcm0gaGlzdG9ncmFtIGFycmF5IG1SZWNlbnRIaXN0cyBoYXMgcmVhY2hlZCBjYXBhY2l0eSwKKyAgICAvLyBtZXJnZXMgaGlzdG9ncmFtcyBmb3IgZGF0YSBjb21wcmVzc2lvbiBhbmQgc3RvcmVzIHRoZW0gaW4gbUxvbmdUZXJtSGlzdHMKKyAgICB2b2lkIHByb2Nlc3NBbmRGbHVzaFJlY2VudEhpc3RzKCk7CisKKyAgICAvLyBXcml0ZXMgd2FrZXVwIHRpbWVzdGFtcCBlbnRyeSB0byBsb2cgYW5kIHJ1bnMgYW5hbHlzaXMKKyAgICAvLyBUT0RPOiBtYWtlIHRoaXMgdGhyZWFkIHNhZmUuIEVhY2ggdGhyZWFkIHNob3VsZCBoYXZlIGl0cyBvd24gaW5zdGFuY2UKKyAgICAvLyBvZiBQZXJmb3JtYW5jZUFuYWx5c2lzLgorICAgIHZvaWQgbG9nVHNFbnRyeSh0aW1lc3RhbXBfcmF3IHRzKTsKKworICAgIC8vIEZJWE1FOiBtYWtlIHBlYWtkZXRlY3RvciBhbmQgc3RvcmVPdXRsaWVyRGF0YSBhIHNpbmdsZSBmdW5jdGlvbgorICAgIC8vIElucHV0OiBtT3V0bGllckRhdGEuIExvb2tzIGF0IHRpbWUgZWxhcHNlZCBiZXR3ZWVuIG91dGxpZXJzCisgICAgLy8gZmluZHMgc2lnbmlmaWNhbnQgY2hhbmdlcyBpbiB0aGUgZGlzdHJpYnV0aW9uCisgICAgLy8gd3JpdGVzIHRpbWVzdGFtcHMgb2Ygc2lnbmlmaWNhbnQgY2hhbmdlcyB0byBtUGVha1RpbWVzdGFtcHMKKyAgICB2b2lkIGRldGVjdFBlYWtzKCk7CisKKyAgICAvLyBydW5zIGFuYWx5c2lzIG9uIHRpbWVzdGFtcCBzZXJpZXMgYmVmb3JlIGl0IGlzIGNvbnZlcnRlZCB0byBhIGhpc3RvZ3JhbQorICAgIC8vIGZpbmRzIG91dGxpZXJzCisgICAgLy8gd3JpdGVzIHRvIG1PdXRsaWVyRGF0YSA8dGltZSBlbGFwc2VkIHNpbmNlIHByZXZpb3VzIG91dGxpZXIsIG91dGxpZXIgdGltZXN0YW1wPgorICAgIHZvaWQgc3RvcmVPdXRsaWVyRGF0YShjb25zdCBzdGQ6OnZlY3Rvcjx0aW1lc3RhbXBfcmF3PiAmdGltZXN0YW1wcyk7CisKKyAgICAvLyBpbnB1dDogc2VyaWVzIG9mIHNob3J0IGhpc3RvZ3JhbXMuIEdlbmVyYXRlcyBhIHN0cmluZyBvZiBhbmFseXNpcyBvZiB0aGUgYnVmZmVyIHBlcmlvZHMKKyAgICAvLyBUT0RPOiBXSVAgd3JpdGUgbW9yZSBkZXRhaWxlZCBhbmFseXNpcworICAgIC8vIEZJWE1FOiBtb3ZlIHRoaXMgZGF0YSB2aXN1YWxpemF0aW9uIHRvIGEgc2VwYXJhdGUgY2xhc3MuIE1vZGVsL3ZpZXcvY29udHJvbGxlcgorICAgIHZvaWQgcmVwb3J0UGVyZm9ybWFuY2UoU3RyaW5nOCAqYm9keSwgaW50IG1heEhlaWdodCA9IDEwKTsKKworICAgIC8vIFRPRE86IGRlbGV0ZSB0aGlzLiB0ZW1wIGZvciB0ZXN0aW5nCisgICAgdm9pZCB0ZXN0RnVuY3Rpb24oKTsKKworICAgIC8vIFRoaXMgZnVuY3Rpb24gdXNlZCB0byBkZXRlY3QgZ2xpdGNoZXMgaW4gYSB0aW1lIHNlcmllcworICAgIC8vIFRPRE8gaW5jb3Jwb3JhdGUgdGhpcyBpbnRvIHRoZSBhbmFseXNpcyAoY3VycmVudGx5IHVudXNlZCkKKyAgICB2b2lkIGFsZXJ0SWZHbGl0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8dGltZXN0YW1wX3Jhdz4gJnNhbXBsZXMpOworCitwcml2YXRlOgorCisgICAgLy8gc3RvcmVzIG91dGxpZXIgYW5hbHlzaXM6IDxlbGFwc2VkIHRpbWUgYmV0d2VlbiBvdXRsaWVycyBpbiBtcywgb3V0bGllciB0aW1lc3RhbXA+CisgICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8b3V0bGllckludGVydmFsLCB0aW1lc3RhbXA+PiBtT3V0bGllckRhdGE7CisKKyAgICAvLyBzdG9yZXMgZWFjaCB0aW1lc3RhbXAgYXQgd2hpY2ggYSBwZWFrIHdhcyBkZXRlY3RlZAorICAgIC8vIGEgcGVhayBpcyBhIG1vbWVudCBhdCB3aGljaCB0aGUgYXZlcmFnZSBvdXRsaWVyIGludGVydmFsIGNoYW5nZWQgc2lnbmlmaWNhbnRseQorICAgIHN0ZDo6ZGVxdWU8dGltZXN0YW1wPiBtUGVha1RpbWVzdGFtcHM7CisKKyAgICAvLyBUT0RPOiB0dXJuIHRoZXNlIGludG8gY2lyY3VsYXIgYnVmZmVycyBmb3IgYmV0dGVyIGRhdGEgZmxvdworICAgIC8vIEZJRk8gb2Ygc21hbGwgaGlzdG9ncmFtcworICAgIC8vIHN0b3JlcyBmaXhlZC1zaXplIHNob3J0IGJ1ZmZlciBwZXJpb2QgaGlzdG9ncmFtcyB3aXRoIHRpbWVzdGFtcCBvZiBmaXJzdCBzYW1wbGUKKyAgICBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjx0aW1lc3RhbXAsIEhpc3RvZ3JhbT4+IG1SZWNlbnRIaXN0czsKKworICAgIC8vIEZJRk8gb2Ygc21hbGwgaGlzdG9ncmFtcworICAgIC8vIHN0b3JlcyBmaXhlZC1zaXplIGxvbmctdGVybSBidWZmZXIgcGVyaW9kIGhpc3RvZ3JhbXMgd2l0aCB0aW1lc3RhbXAgb2YgZmlyc3Qgc2FtcGxlCisgICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dGltZXN0YW1wLCBIaXN0b2dyYW0+PiBtTG9uZ1Rlcm1IaXN0czsKKworICAgIC8vIHZlY3RvciBvZiB0aW1lc3RhbXBzLCBjb2xsZWN0ZWQgZnJvbSBOQkxvZyBmb3IgYSAoVE9ETykgc3BlY2lmaWMgdGhyZWFkCisgICAgLy8gd2hlbiBhIHZlY3RvciByZWFjaGVzIGl0cyBtYXhpbXVtIHNpemUsIHRoZSBkYXRhIGlzIHByb2Nlc3NlZCBhbmQgZmx1c2hlZAorICAgIHN0ZDo6dmVjdG9yPHRpbWVzdGFtcF9yYXc+IG1UaW1lU3RhbXBTZXJpZXM7CisKKyAgICBzdGF0aWMgY29uc3QgaW50IGtNc1BlclNlYyA9IDEwMDA7CisKKyAgICAvLyBQYXJhbWV0ZXJzIHVzZWQgd2hlbiBkZXRlY3Rpbmcgb3V0bGllcnMKKyAgICAvLyBUT0RPOiBsZWFybiBzb21lIG9mIHRoZXNlIGZyb20gdGhlIGRhdGEsIGRlbGV0ZSB1bnVzZWQgb25lcworICAgIC8vIEZJWE1FOiBkZWNpZGUgd2hldGhlciB0byBtYWtlIGtQZXJpb2RNcyBzdGF0aWMuCisgICAgc3RhdGljIGNvbnN0IGludCBrTnVtQnVmZiA9IDM7IC8vIG51bWJlciBvZiBidWZmZXJzIGNvbnNpZGVyZWQgaW4gbG9jYWwgaGlzdG9yeQorICAgIGludCBrUGVyaW9kTXM7IC8vIGN1cnJlbnQgcGVyaW9kIGxlbmd0aCBpcyBpZGVhbGx5IDQgbXMKKyAgICBzdGF0aWMgY29uc3QgaW50IGtPdXRsaWVyTXMgPSA3OyAvLyB2YWx1ZXMgZ3JlYXRlciBvciBlcXVhbCB0byB0aGlzIGNhdXNlIGdsaXRjaGVzCisgICAgLy8gREFDIHByb2Nlc3NpbmcgdGltZSBmb3IgNCBtcyBidWZmZXIKKyAgICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrUmF0aW8gPSAwLjc1OyAvLyBlc3RpbWF0ZSBvZiBDUFUgdGltZSBhcyByYXRpbyBvZiBwZXJpb2QgbGVuZ3RoCisgICAgaW50IGtQZXJpb2RNc0NQVTsgLy8gY29tcHV0ZSBiYXNlZCBvbiBrUGVyaW9kTGVuIGFuZCBrUmF0aW8KKworICAgIC8vIFBlYWsgZGV0ZWN0aW9uOiBudW1iZXIgb2Ygc3RhbmRhcmQgZGV2aWF0aW9ucyBmcm9tIG1lYW4gY29uc2lkZXJlZCBhIHNpZ25pZmljYW50IGNoYW5nZQorICAgIHN0YXRpYyBjb25zdCBpbnQga1N0ZGRldlRocmVzaG9sZCA9IDU7CisKKyAgICAvLyBjYXBhY2l0eSBhbGxvY2F0ZWQgdG8gZGF0YSBzdHJ1Y3R1cmVzCisgICAgLy8gVE9ETzogYWRqdXN0IGFsbCBvZiB0aGVzZSB2YWx1ZXMKKyAgICBzdGF0aWMgY29uc3QgaW50IGtSZWNlbnRIaXN0c0NhcGFjaXR5ID0gMTAwOyAvLyBudW1iZXIgb2Ygc2hvcnQtdGVybSBoaXN0b2dyYW1zIHN0b3JlZCBpbiBtZW1vcnkKKyAgICBzdGF0aWMgY29uc3QgaW50IGtTaG9ydEhpc3RTaXplID0gNTA7IC8vIG51bWJlciBvZiBzYW1wbGVzIGluIGEgc2hvcnQtdGVybSBoaXN0b2dyYW0KKyAgICBzdGF0aWMgY29uc3QgaW50IGtPdXRsaWVyU2VyaWVzU2l6ZSA9IDEwMDsgLy8gbnVtYmVyIG9mIHZhbHVlcyBzdG9yZWQgaW4gb3V0bGllciBhcnJheQorICAgIHN0YXRpYyBjb25zdCBpbnQga1BlYWtTZXJpZXNTaXplID0gMTAwOyAvLyBudW1iZXIgb2YgdmFsdWVzIHN0b3JlZCBpbiBwZWFrIGFycmF5CisgICAgc3RhdGljIGNvbnN0IGludCBrTG9uZ1Rlcm1IaXN0c0NhcGFjaXR5ID0gMjA7IC8vIG51bWJlciBvZiBsb25nLXRlcm0gaGlzdG9ncmFtIHN0b3JlZCBpbiBtZW1vcnkKKyAgICAvLyBtYXhpbXVtIGVsYXBzZWQgdGltZSBiZXR3ZWVuIGZpcnN0IGFuZCBsYXN0IHRpbWVzdGFtcCBvZiBhIGxvbmctdGVybSBoaXN0b2dyYW0KKyAgICBzdGF0aWMgY29uc3QgaW50IGtNYXhIaXN0VGltZXNwYW5NcyA9IDUgKiBrTXNQZXJTZWM7CisKKyAgICAvLyB0aGVzZSB2YXJpYWJsZXMgYXJlIHN0b3JlZCBpbi1jbGFzcyB0byBlbnN1cmUgY29udGludWl0eSB3aGlsZSBhbmFseXppbmcgdGhlIHRpbWVzdGFtcAorICAgIC8vIHNlcmllcyBvbmUgc2hvcnQgc2VxdWVuY2UgYXQgYSB0aW1lOiB0aGUgdmFyaWFibGVzIGFyZSBub3QgcmUtaW5pdGlhbGl6ZWQgZXZlcnkgdGltZS4KKyAgICAvLyBGSVhNRTogY3JlYXRlIGlubmVyIGNsYXNzIGZvciB0aGVzZSB2YXJpYWJsZXMgYW5kIGRlY2lkZSB3aGljaCBvdGhlciBvbmVzIHRvIGFkZCB0byBpdAorICAgIGRvdWJsZSBtUGVha0RldGVjdG9yTWVhbiA9IC0xOworICAgIGRvdWJsZSBtUGVha0RldGVjdG9yU2QgPSAtMTsKKyAgICAvLyB2YXJpYWJsZXMgZm9yIHN0b3JlT3V0bGllckRhdGEKKyAgICB1aW50NjRfdCBtRWxhcHNlZCA9IDA7CisgICAgaW50NjRfdCBtUHJldk5zID0gLTE7CisKK307CisKK30gLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfUEVSRk9STUFOQ0VBTkFMWVNJU19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL1BpcGUuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvUGlwZS5oCnJlbmFtZSB0byBtZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaAppbmRleCA1OGI5NzUwLi4wNDMxOTc2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL1BpcGUuaAorKysgYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaApAQCAtMTgsNyArMTgsNyBAQAogI2RlZmluZSBBTkRST0lEX0FVRElPX1BJUEVfSAogCiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZmlmby5oPgotI2luY2x1ZGUgIk5CQUlPLmgiCisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL1BpcGVSZWFkZXIuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZVJlYWRlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL1BpcGVSZWFkZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlUmVhZGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUmVwb3J0UGVyZm9ybWFuY2UuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUmVwb3J0UGVyZm9ybWFuY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2QyODEwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9SZXBvcnRQZXJmb3JtYW5jZS5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfUkVQT1JUUEVSRk9STUFOQ0VfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1JFUE9SVFBFUkZPUk1BTkNFX0gKKworI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gVGhpcyBjbGFzcyBpcyB1c2VkIGJ5IHJlcG9ydFBlcmZvcm1hbmNlIGZ1bmN0aW9uCisvLyBUT0RPIG1vdmUgcmVwb3J0UGVyZm9ybWFuY2UgZnVuY3Rpb24gdG8gUmVwb3J0UGVyZm9ybWFuY2UuY3BwCitjbGFzcyBTdHJpbmc4OworCituYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UgeworCisvLyBzdG9yZXMgYSBoaXN0b2dyYW06IGtleTogb2JzZXJ2ZWQgYnVmZmVyIHBlcmlvZC4gdmFsdWU6IGNvdW50CisvLyBUT0RPOiB1bnNpZ25lZCwgdW5zaWduZWQKK3VzaW5nIEhpc3RvZ3JhbSA9IHN0ZDo6bWFwPGludCwgaW50PjsKKwordXNpbmcgb3V0bGllckludGVydmFsID0gdWludDY0X3Q7CisvLyBpbnQ2NF90IHRpbWVzdGFtcHMgYXJlIGNvbnZlcnRlZCB0byB1aW50NjRfdCBpbiBQZXJmb3JtYW5jZUFuYWx5c2lzOjpzdG9yZU91dGxpZXJEYXRhLAorLy8gYW5kIGFsbCBhbmFseXNpcyBmdW5jdGlvbnMgdXNlIHVpbnQ2NF90LgordXNpbmcgdGltZXN0YW1wID0gdWludDY0X3Q7Cit1c2luZyB0aW1lc3RhbXBfcmF3ID0gaW50NjRfdDsKKworLy8gRklYTUU6IGRlY2lkZSB3aGV0aGVyIHRvIHVzZSA2NCBvciAzMiBiaXRzCisvLyBUT0RPOiB0aGUgY29kZSBoYXMgYSBtaXggb2YgdHlwZWRlZiBhbmQgdXNpbmcuIFN0YW5kYXJkaXplIHRvIG9uZSBvciB0aGUgb3RoZXIuCit0eXBlZGVmIHVpbnQ2NF90IGxvZ19oYXNoX3Q7CisKK3N0YXRpYyBpbmxpbmUgaW50IGRlbHRhTXMoaW50NjRfdCBuczEsIGludDY0X3QgbnMyKSB7CisgICAgcmV0dXJuIChuczIgLSBuczEpIC8gKDEwMDAgKiAxMDAwKTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBsb2cyKHVpbnQzMl90IHgpIHsKKyAgICAvLyBUaGlzIHdvcmtzIGZvciB4ID4gMAorICAgIHJldHVybiAzMSAtIF9fYnVpbHRpbl9jbHooeCk7Cit9CisKKy8vIFdyaXRlcyBvdXRsaWVyIGludGVydmFscywgdGltZXN0YW1wcywgYW5kIGhpc3RvZ3JhbXMgc3Bhbm5pbmcgbG9uZyB0aW1lCisvLyBpbnRlcnZhbHMgdG8gYSBmaWxlLgordm9pZCB3cml0ZVRvRmlsZShzdGQ6OmRlcXVlPHN0ZDo6cGFpcjxvdXRsaWVySW50ZXJ2YWwsIHRpbWVzdGFtcD4+ICZvdXRsaWVyRGF0YSwKKyAgICAgICAgICAgICAgICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dGltZXN0YW1wLCBIaXN0b2dyYW0+PiAmaGlzdHMsCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBrTmFtZSwKKyAgICAgICAgICAgICAgICAgYm9vbCBhcHBlbmQpOworCit9IC8vIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1JFUE9SVFBFUkZPUk1BTkNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmgKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oCmluZGV4IGFlNDk5MDMuLmNjMmQwMTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oCkBAIC0xOSw3ICsxOSw3IEBACiAjaWZuZGVmIEFORFJPSURfU09VUkNFX0FVRElPX0JVRkZFUl9QUk9WSURFUl9ICiAjZGVmaW5lIEFORFJPSURfU09VUkNFX0FVRElPX0JVRkZFUl9QUk9WSURFUl9ICiAKLSNpbmNsdWRlICJOQkFJTy5oIgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CiAjaW5jbHVkZSA8bWVkaWEvRXh0ZW5kZWRBdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTW9ub1BpcGUuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9Nb25vUGlwZS5oCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTW9ub1BpcGUuaApyZW5hbWUgdG8gbWVkaWEvbGlibmJhaW8vaW5jbHVkZV9tb25vL21lZGlhL25iYWlvL01vbm9QaXBlLmgKaW5kZXggNjBhZTkyZS4uYzUxZDBmZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9Nb25vUGlwZS5oCisrKyBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9Nb25vUGlwZS5oCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KICNpbmNsdWRlIDxtZWRpYS9TaW5nbGVTdGF0ZVF1ZXVlLmg+Ci0jaW5jbHVkZSAiTkJBSU8uaCIKKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkFJTy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvTW9ub1BpcGVSZWFkZXIuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9Nb25vUGlwZVJlYWRlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJuYmFpby9pbmNsdWRlL01vbm9QaXBlUmVhZGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9Nb25vUGlwZVJlYWRlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL05CQUlPLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlX21vbm8vbWVkaWEvbmJhaW8vTkJBSU8uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9OQkFJTy5oCnJlbmFtZSB0byBtZWRpYS9saWJuYmFpby9pbmNsdWRlX21vbm8vbWVkaWEvbmJhaW8vTkJBSU8uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKaW5kZXggNjQ5MWNlYi4uYzQ0ZTg2OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCkBAIC00OSwyMSArNDksMTggQEAKIAogI2luY2x1ZGUgPGhpZGxtZW1vcnkvbWFwcGluZy5oPgogCi0jaW5jbHVkZSA8T01YX0F1ZGlvRXh0Lmg+Ci0jaW5jbHVkZSA8T01YX1ZpZGVvRXh0Lmg+Ci0jaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgotI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgotI2luY2x1ZGUgPE9NWF9Bc1N0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0F1ZGlvRXh0Lmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfVmlkZW9FeHQuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Db21wb25lbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9JbmRleEV4dC5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0FzU3RyaW5nLmg+CiAKICNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgogI2luY2x1ZGUgImluY2x1ZGUvQUNvZGVjQnVmZmVyQ2hhbm5lbC5oIgogI2luY2x1ZGUgImluY2x1ZGUvRGF0YUNvbnZlcnRlci5oIgogI2luY2x1ZGUgImluY2x1ZGUvU2VjdXJlQnVmZmVyLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9TaGFyZWRNZW1vcnlCdWZmZXIuaCIKLSNpbmNsdWRlICJvbXgvT01YVXRpbHMuaCIKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9hbGxvY2F0b3IvMS4wL0lBbGxvY2F0b3IuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMTg2NiwxNiArMTg2MywxNSBAQAogICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnSXNHcmFsbG9jVXNhZ2VQcm90ZWN0ZWQ7CiAgICAgICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdQdXNoQmxhbmtCdWZmZXJzVG9OYXRpdmVXaW5kb3dPblNodXRkb3duOwogICAgICAgICB9CisgICAgfQorICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzU2VjdXJlKSB7CisgICAgICAgIC8vIHVzZSBuYXRpdmVfaGFuZGxlcyBmb3Igc2VjdXJlIGlucHV0IGJ1ZmZlcnMKKyAgICAgICAgZXJyID0gc2V0UG9ydE1vZGUoa1BvcnRJbmRleElucHV0LCBJT01YOjprUG9ydE1vZGVQcmVzZXRTZWN1cmVCdWZmZXIpOwogCi0gICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzU2VjdXJlKSB7Ci0gICAgICAgICAgICAvLyB1c2UgbmF0aXZlX2hhbmRsZXMgZm9yIHNlY3VyZSBpbnB1dCBidWZmZXJzCi0gICAgICAgICAgICBlcnIgPSBzZXRQb3J0TW9kZShrUG9ydEluZGV4SW5wdXQsIElPTVg6OmtQb3J0TW9kZVByZXNldFNlY3VyZUJ1ZmZlcik7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgiZmFsbGluZyBiYWNrIHRvIG5vbi1uYXRpdmVfaGFuZGxlcyIpOwotICAgICAgICAgICAgICAgIHNldFBvcnRNb2RlKGtQb3J0SW5kZXhJbnB1dCwgSU9NWDo6a1BvcnRNb2RlUHJlc2V0Qnl0ZUJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgZXJyID0gT0s7IC8vIGlnbm9yZSBlcnJvciBmb3Igbm93Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dJKCJmYWxsaW5nIGJhY2sgdG8gbm9uLW5hdGl2ZV9oYW5kbGVzIik7CisgICAgICAgICAgICBzZXRQb3J0TW9kZShrUG9ydEluZGV4SW5wdXQsIElPTVg6OmtQb3J0TW9kZVByZXNldEJ5dGVCdWZmZXIpOworICAgICAgICAgICAgZXJyID0gT0s7IC8vIGlnbm9yZSBlcnJvciBmb3Igbm93CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKGhhdmVOYXRpdmVXaW5kb3cpIHsKQEAgLTQxNzQsMTEgKzQxNzAsMTIgQEAKIC8vIHN0YXRpYwogaW50IC8qIE9NWF9WSURFT19BVkNMRVZFTFRZUEUgKi8gQUNvZGVjOjpnZXRBVkNMZXZlbEZvcigKICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcmF0ZSwgaW50IGJpdHJhdGUsCi0gICAgICAgIE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSBwcm9maWxlKSB7CisgICAgICAgIE9NWF9WSURFT19BVkNQUk9GSUxFRVhUVFlQRSBwcm9maWxlKSB7CiAgICAgLy8gY29udmVydCBiaXRyYXRlIHRvIG1haW4vYmFzZWxpbmUgcHJvZmlsZSBrYnBzIGVxdWl2YWxlbnQKLSAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKKyAgICBzd2l0Y2ggKCh1aW50MzJfdClwcm9maWxlKSB7CiAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoMTA6CiAgICAgICAgICAgICBiaXRyYXRlID0gZGl2VXAoYml0cmF0ZSwgMzAwMCk7IGJyZWFrOworICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNQcm9maWxlQ29uc3RyYWluZWRIaWdoOgogICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDoKICAgICAgICAgICAgIGJpdHJhdGUgPSBkaXZVcChiaXRyYXRlLCAxMjUwKTsgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CkBAIC00MzIyLDkgKzQzMTksMTQgQEAKICAgICAgICAgaDI2NHR5cGUuYlVzZUhhZGFtYXJkID0gT01YX1RSVUU7CiAgICAgICAgIGgyNjR0eXBlLm5SZWZGcmFtZXMgPSAyOwogICAgICAgICBoMjY0dHlwZS5uQkZyYW1lcyA9IG1MYXRlbmN5ID09IDAgPyAxIDogc3RkOjptaW4oMVUsIG1MYXRlbmN5IC0gMSk7CisKKyAgICAgICAgLy8gZGlzYWJsZSBCLWZyYW1lcyB1bnRpbCBNUEVHNFdyaXRlciBjYW4gZ3VhcmFudGVlIGZpbmFsaXppbmcgZmlsZXMgd2l0aCBCLWZyYW1lcworICAgICAgICBoMjY0dHlwZS5uUmVmRnJhbWVzID0gMTsKKyAgICAgICAgaDI2NHR5cGUubkJGcmFtZXMgPSAwOworCiAgICAgICAgIGgyNjR0eXBlLm5QRnJhbWVzID0gc2V0UEZyYW1lc1NwYWNpbmcoaUZyYW1lSW50ZXJ2YWwsIGZyYW1lUmF0ZSwgaDI2NHR5cGUubkJGcmFtZXMpOwogICAgICAgICBoMjY0dHlwZS5uQWxsb3dlZFBpY3R1cmVUeXBlcyA9Ci0gICAgICAgICAgICBPTVhfVklERU9fUGljdHVyZVR5cGVJIHwgT01YX1ZJREVPX1BpY3R1cmVUeXBlUCB8IE9NWF9WSURFT19QaWN0dXJlVHlwZUI7CisgICAgICAgICAgICBPTVhfVklERU9fUGljdHVyZVR5cGVJIHwgT01YX1ZJREVPX1BpY3R1cmVUeXBlUDsKICAgICAgICAgaDI2NHR5cGUublJlZklkeDEwQWN0aXZlTWludXMxID0gMDsKICAgICAgICAgaDI2NHR5cGUublJlZklkeDExQWN0aXZlTWludXMxID0gMDsKICAgICAgICAgaDI2NHR5cGUuYkVudHJvcHlDb2RpbmdDQUJBQyA9IE9NWF9UUlVFOwpAQCAtNjMzOSwxOSArNjM0MSwxMCBAQAogCiAgICAgQ0hFQ0sobUNvZGVjLT5tT01YTm9kZSA9PSBOVUxMKTsKIAotICAgIE9NWENsaWVudCBjbGllbnQ7Ci0gICAgYm9vbCB0cmVibGVGbGFnOwotICAgIGlmIChjbGllbnQuY29ubmVjdCgmdHJlYmxlRmxhZykgIT0gT0spIHsKLSAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIE5PX0lOSVQpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIG1Db2RlYy0+c2V0VHJlYmxlRmxhZyh0cmVibGVGbGFnKTsKLQotICAgIHNwPElPTVg+IG9teCA9IGNsaWVudC5pbnRlcmZhY2UoKTsKLQogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPTVhEaWVkLCBtQ29kZWMpOwogCiAgICAgVmVjdG9yPEFTdHJpbmc+IG1hdGNoaW5nQ29kZWNzOworICAgIFZlY3RvcjxBU3RyaW5nPiBvd25lcnM7CiAKICAgICBBU3RyaW5nIG1pbWU7CiAKQEAgLTYzNTksOSArNjM1MiwzMSBAQAogICAgIGludDMyX3QgZW5jb2RlciA9IGZhbHNlOwogICAgIGlmIChtc2ctPmZpbmRTdHJpbmcoImNvbXBvbmVudE5hbWUiLCAmY29tcG9uZW50TmFtZSkpIHsKICAgICAgICAgc3A8SU1lZGlhQ29kZWNMaXN0PiBsaXN0ID0gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCk7Ci0gICAgICAgIGlmIChsaXN0ICE9IE5VTEwgJiYgbGlzdC0+ZmluZENvZGVjQnlOYW1lKGNvbXBvbmVudE5hbWUuY19zdHIoKSkgPj0gMCkgewotICAgICAgICAgICAgbWF0Y2hpbmdDb2RlY3MuYWRkKGNvbXBvbmVudE5hbWUpOworICAgICAgICBpZiAobGlzdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIG9idGFpbiBNZWRpYUNvZGVjTGlzdCB3aGlsZSAiCisgICAgICAgICAgICAgICAgICAgICJhdHRlbXB0aW5nIHRvIGNyZWF0ZSBjb2RlYyBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICBjb21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIE5PX0lOSVQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBsaXN0LT5maW5kQ29kZWNCeU5hbWUoY29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBmaW5kIGNvZGVjIFwiJXNcIiIsCisgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvckludmFsaWRDb21wb25lbnQsIE5BTUVfTk9UX0ZPVU5EKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IGxpc3QtPmdldENvZGVjSW5mbyhpbmRleCk7CisgICAgICAgIGlmIChpbmZvID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJVbmV4cGVjdGVkIGVycm9yIChpbmRleCBvdXQtb2YtYm91bmQpIHdoaWxlICIKKyAgICAgICAgICAgICAgICAgICAgInJldHJpZXZpbmcgaW5mb3JtYXRpb24gZm9yIGNvZGVjIFwiJXNcIiIsCisgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgVU5LTk9XTl9FUlJPUik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbWF0Y2hpbmdDb2RlY3MuYWRkKGluZm8tPmdldENvZGVjTmFtZSgpKTsKKyAgICAgICAgb3duZXJzLmFkZChpbmZvLT5nZXRPd25lck5hbWUoKSA9PSBudWxscHRyID8KKyAgICAgICAgICAgICAgICAiZGVmYXVsdCIgOiBpbmZvLT5nZXRPd25lck5hbWUoKSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKIApAQCAtNjM3MywxMCArNjM4OCwxMiBAQAogICAgICAgICAgICAgICAgIG1pbWUuY19zdHIoKSwKICAgICAgICAgICAgICAgICBlbmNvZGVyLCAvLyBjcmVhdGVFbmNvZGVyCiAgICAgICAgICAgICAgICAgMCwgICAgICAgLy8gZmxhZ3MKLSAgICAgICAgICAgICAgICAmbWF0Y2hpbmdDb2RlY3MpOworICAgICAgICAgICAgICAgICZtYXRjaGluZ0NvZGVjcywKKyAgICAgICAgICAgICAgICAmb3duZXJzKTsKICAgICB9CiAKICAgICBzcDxDb2RlY09ic2VydmVyPiBvYnNlcnZlciA9IG5ldyBDb2RlY09ic2VydmVyOworICAgIHNwPElPTVg+IG9teDsKICAgICBzcDxJT01YTm9kZT4gb214Tm9kZTsKIAogICAgIHN0YXR1c190IGVyciA9IE5BTUVfTk9UX0ZPVU5EOwpAQCAtNjM4NCw2ICs2NDAxLDE0IEBACiAgICAgICAgICAgICArK21hdGNoSW5kZXgpIHsKICAgICAgICAgY29tcG9uZW50TmFtZSA9IG1hdGNoaW5nQ29kZWNzW21hdGNoSW5kZXhdOwogCisgICAgICAgIE9NWENsaWVudCBjbGllbnQ7CisgICAgICAgIGJvb2wgdHJlYmxlRmxhZzsKKyAgICAgICAgaWYgKGNsaWVudC5jb25uZWN0KG93bmVyc1ttYXRjaEluZGV4XS5jX3N0cigpLCAmdHJlYmxlRmxhZykgIT0gT0spIHsKKyAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBOT19JTklUKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBvbXggPSBjbGllbnQuaW50ZXJmYWNlKCk7CisKICAgICAgICAgcGlkX3QgdGlkID0gZ2V0dGlkKCk7CiAgICAgICAgIGludCBwcmV2UHJpb3JpdHkgPSBhbmRyb2lkR2V0VGhyZWFkUHJpb3JpdHkodGlkKTsKICAgICAgICAgYW5kcm9pZFNldFRocmVhZFByaW9yaXR5KHRpZCwgQU5EUk9JRF9QUklPUklUWV9GT1JFR1JPVU5EKTsKQEAgLTYzOTEsNiArNjQxNiw3IEBACiAgICAgICAgIGFuZHJvaWRTZXRUaHJlYWRQcmlvcml0eSh0aWQsIHByZXZQcmlvcml0eSk7CiAKICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgbUNvZGVjLT5zZXRUcmVibGVGbGFnKHRyZWJsZUZsYWcpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HVygiQWxsb2NhdGluZyBjb21wb25lbnQgJyVzJyBmYWlsZWQsIHRyeSBuZXh0IG9uZS4iLCBjb21wb25lbnROYW1lLmNfc3RyKCkpOwpAQCAtODIxNCwxNiArODI0MCwxNSBAQAogfQogCiBzdGF0dXNfdCBBQ29kZWM6OnF1ZXJ5Q2FwYWJpbGl0aWVzKAotICAgICAgICBjb25zdCBBU3RyaW5nICZuYW1lLCBjb25zdCBBU3RyaW5nICZtaW1lLCBib29sIGlzRW5jb2RlciwKLSAgICAgICAgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gKmNhcHMpIHsKLSAgICAoKmNhcHMpLmNsZWFyKCk7Ci0gICAgY29uc3QgY2hhciAqcm9sZSA9IEdldENvbXBvbmVudFJvbGUoaXNFbmNvZGVyLCBtaW1lLmNfc3RyKCkpOworICAgICAgICBjb25zdCBjaGFyKiBvd25lciwgY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogbWltZSwgYm9vbCBpc0VuY29kZXIsCisgICAgICAgIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXIqIGNhcHMpIHsKKyAgICBjb25zdCBjaGFyICpyb2xlID0gR2V0Q29tcG9uZW50Um9sZShpc0VuY29kZXIsIG1pbWUpOwogICAgIGlmIChyb2xlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBPTVhDbGllbnQgY2xpZW50OwotICAgIHN0YXR1c190IGVyciA9IGNsaWVudC5jb25uZWN0KCk7CisgICAgc3RhdHVzX3QgZXJyID0gY2xpZW50LmNvbm5lY3Qob3duZXIpOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CkBAIC04MjMyLDcgKzgyNTcsNyBAQAogICAgIHNwPENvZGVjT2JzZXJ2ZXI+IG9ic2VydmVyID0gbmV3IENvZGVjT2JzZXJ2ZXI7CiAgICAgc3A8SU9NWE5vZGU+IG9teE5vZGU7CiAKLSAgICBlcnIgPSBvbXgtPmFsbG9jYXRlTm9kZShuYW1lLmNfc3RyKCksIG9ic2VydmVyLCAmb214Tm9kZSk7CisgICAgZXJyID0gb214LT5hbGxvY2F0ZU5vZGUobmFtZSwgb2JzZXJ2ZXIsICZvbXhOb2RlKTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIGNsaWVudC5kaXNjb25uZWN0KCk7CiAgICAgICAgIHJldHVybiBlcnI7CkBAIC04MjQ1LDggKzgyNzAsNyBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNCdWlsZGVyPiBidWlsZGVyID0gbmV3IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNCdWlsZGVyKCk7Ci0gICAgYm9vbCBpc1ZpZGVvID0gbWltZS5zdGFydHNXaXRoSWdub3JlQ2FzZSgidmlkZW8vIik7CisgICAgYm9vbCBpc1ZpZGVvID0gc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpID09IDA7CiAKICAgICBpZiAoaXNWaWRlbykgewogICAgICAgICBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSBwYXJhbTsKQEAgLTgyNjEsMTEgKzgyODUsMjIgQEAKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1aWxkZXItPmFkZFByb2ZpbGVMZXZlbChwYXJhbS5lUHJvZmlsZSwgcGFyYW0uZUxldmVsKTsKKyAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChwYXJhbS5lUHJvZmlsZSwgcGFyYW0uZUxldmVsKTsKKworICAgICAgICAgICAgLy8gQVZDIGNvbXBvbmVudHMgbWF5IG5vdCBsaXN0IHRoZSBjb25zdHJhaW5lZCBwcm9maWxlcyBleHBsaWNpdGx5LCBidXQKKyAgICAgICAgICAgIC8vIGRlY29kZXJzIHRoYXQgc3VwcG9ydCBhIHByb2ZpbGUgYWxzbyBzdXBwb3J0IGl0cyBjb25zdHJhaW5lZCB2ZXJzaW9uLgorICAgICAgICAgICAgLy8gRW5jb2RlcnMgbXVzdCBleHBsaWNpdGx5IHN1cHBvcnQgY29uc3RyYWluZWQgcHJvZmlsZXMuCisgICAgICAgICAgICBpZiAoIWlzRW5jb2RlciAmJiBzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChwYXJhbS5lUHJvZmlsZSA9PSBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gpIHsKKyAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKE9NWF9WSURFT19BVkNQcm9maWxlQ29uc3RyYWluZWRIaWdoLCBwYXJhbS5lTGV2ZWwpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW0uZVByb2ZpbGUgPT0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSkgeworICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoT01YX1ZJREVPX0FWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lLCBwYXJhbS5lTGV2ZWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGluZGV4ID09IGtNYXhJbmRpY2VzVG9DaGVjaykgewogICAgICAgICAgICAgICAgIEFMT0dXKCJbJXNdIHN0b3BwaW5nIGNoZWNraW5nIHByb2ZpbGVzIGFmdGVyICV1OiAleC8leCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5lUHJvZmlsZSwgcGFyYW0uZUxldmVsKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtODI3Niw3ICs4MzExLDYgQEAKICAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFIHBvcnRGb3JtYXQ7CiAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBvcnRGb3JtYXQpOwogICAgICAgICBwb3J0Rm9ybWF0Lm5Qb3J0SW5kZXggPSBpc0VuY29kZXIgPyBrUG9ydEluZGV4SW5wdXQgOiBrUG9ydEluZGV4T3V0cHV0OwotICAgICAgICBWZWN0b3I8dWludDMyX3Q+IHN1cHBvcnRlZENvbG9yczsgLy8gc2hhZG93IGNvcHkgdG8gY2hlY2sgZm9yIGR1cGxpY2F0ZXMKICAgICAgICAgZm9yIChPTVhfVTMyIGluZGV4ID0gMDsgaW5kZXggPD0ga01heEluZGljZXNUb0NoZWNrOyArK2luZGV4KSB7CiAgICAgICAgICAgICBwb3J0Rm9ybWF0Lm5JbmRleCA9IGluZGV4OwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gb214Tm9kZS0+Z2V0UGFyYW1ldGVyKApAQCAtODI5MCwyOCArODMyNCwxNyBAQAogICAgICAgICAgICAgaWYgKElzRmxleGlibGVDb2xvckZvcm1hdCgKICAgICAgICAgICAgICAgICAgICAgb214Tm9kZSwgcG9ydEZvcm1hdC5lQ29sb3JGb3JtYXQsIGZhbHNlIC8qIHVzaW5nTmF0aXZlV2luZG93ICovLAogICAgICAgICAgICAgICAgICAgICAmZmxleGlibGVFcXVpdmFsZW50KSkgewotICAgICAgICAgICAgICAgIGJvb2wgbWFya2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdXBwb3J0ZWRDb2xvcnMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN1cHBvcnRlZENvbG9yc1tpXSA9PSBmbGV4aWJsZUVxdWl2YWxlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIW1hcmtlZCkgewotICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRDb2xvcnMucHVzaChmbGV4aWJsZUVxdWl2YWxlbnQpOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLT5hZGRDb2xvckZvcm1hdChmbGV4aWJsZUVxdWl2YWxlbnQpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXBzLT5hZGRDb2xvckZvcm1hdChmbGV4aWJsZUVxdWl2YWxlbnQpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3VwcG9ydGVkQ29sb3JzLnB1c2gocG9ydEZvcm1hdC5lQ29sb3JGb3JtYXQpOwotICAgICAgICAgICAgYnVpbGRlci0+YWRkQ29sb3JGb3JtYXQocG9ydEZvcm1hdC5lQ29sb3JGb3JtYXQpOworICAgICAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQocG9ydEZvcm1hdC5lQ29sb3JGb3JtYXQpOwogCiAgICAgICAgICAgICBpZiAoaW5kZXggPT0ga01heEluZGljZXNUb0NoZWNrKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIlslc10gc3RvcHBpbmcgY2hlY2tpbmcgZm9ybWF0cyBhZnRlciAldTogJXMoJXgpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKHBvcnRGb3JtYXQuZUNvbG9yRm9ybWF0KSwgcG9ydEZvcm1hdC5lQ29sb3JGb3JtYXQpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtaW1lLmVxdWFsc0lnbm9yZUNhc2UoTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkgeworICAgIH0gZWxzZSBpZiAoc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpID09IDApIHsKICAgICAgICAgLy8gTW9yZSBhdWRpbyBjb2RlY3MgaWYgdGhleSBoYXZlIHByb2ZpbGVzLgogICAgICAgICBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9QUk9GSUxFVFlQRSBwYXJhbTsKICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW0pOwpAQCAtODMyNSwxMSArODM0OCwxMSBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gRm9yIGF1ZGlvLCBsZXZlbCBpcyBpZ25vcmVkLgotICAgICAgICAgICAgYnVpbGRlci0+YWRkUHJvZmlsZUxldmVsKHBhcmFtLmVQcm9maWxlLCAwIC8qIGxldmVsICovKTsKKyAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChwYXJhbS5lUHJvZmlsZSwgMCAvKiBsZXZlbCAqLyk7CiAKICAgICAgICAgICAgIGlmIChpbmRleCA9PSBrTWF4SW5kaWNlc1RvQ2hlY2spIHsKICAgICAgICAgICAgICAgICBBTE9HVygiWyVzXSBzdG9wcGluZyBjaGVja2luZyBwcm9maWxlcyBhZnRlciAldTogJXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uZVByb2ZpbGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC04MzM3LDcgKzgzNjAsNyBAQAogICAgICAgICAvLyBOT1RFOiBXaXRob3V0IEFuZHJvaWQgZXh0ZW5zaW9ucywgT01YIGRvZXMgbm90IHByb3ZpZGUgYSB3YXkgdG8gcXVlcnkKICAgICAgICAgLy8gQUFDIHByb2ZpbGUgc3VwcG9ydAogICAgICAgICBpZiAocGFyYW0ublByb2ZpbGVJbmRleCA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiY29tcG9uZW50ICVzIGRvZXNuJ3Qgc3VwcG9ydCBwcm9maWxlIHF1ZXJ5LiIsIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBBTE9HVygiY29tcG9uZW50ICVzIGRvZXNuJ3Qgc3VwcG9ydCBwcm9maWxlIHF1ZXJ5LiIsIG5hbWUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC04MzQ2LDE0ICs4MzY5LDE0IEBACiAgICAgICAgIGlmIChvbXhOb2RlLT5jb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCiAgICAgICAgICAgICAgICAga1BvcnRJbmRleE91dHB1dCwgT01YX1RSVUUsIDAsICZzaWRlYmFuZEhhbmRsZSkgPT0gT0spIHsKICAgICAgICAgICAgIC8vIHR1bm5lbGVkIHBsYXliYWNrIGluY2x1ZGVzIGFkYXB0aXZlIHBsYXliYWNrCi0gICAgICAgICAgICBidWlsZGVyLT5hZGRGbGFncyhNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjprRmxhZ1N1cHBvcnRzQWRhcHRpdmVQbGF5YmFjaworICAgICAgICAgICAgY2Fwcy0+YWRkRmxhZ3MoTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6a0ZsYWdTdXBwb3J0c0FkYXB0aXZlUGxheWJhY2sKICAgICAgICAgICAgICAgICAgICAgfCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjprRmxhZ1N1cHBvcnRzVHVubmVsZWRQbGF5YmFjayk7CiAgICAgICAgIH0gZWxzZSBpZiAob214Tm9kZS0+c2V0UG9ydE1vZGUoCiAgICAgICAgICAgICAgICAga1BvcnRJbmRleE91dHB1dCwgSU9NWDo6a1BvcnRNb2RlRHluYW1pY0FOV0J1ZmZlcikgPT0gT0sgfHwKICAgICAgICAgICAgICAgICBvbXhOb2RlLT5wcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjaygKICAgICAgICAgICAgICAgICBrUG9ydEluZGV4T3V0cHV0LCBPTVhfVFJVRSwKICAgICAgICAgICAgICAgICAxMjgwIC8qIHdpZHRoICovLCA3MjAgLyogaGVpZ2h0ICovKSA9PSBPSykgewotICAgICAgICAgICAgYnVpbGRlci0+YWRkRmxhZ3MoTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6a0ZsYWdTdXBwb3J0c0FkYXB0aXZlUGxheWJhY2spOworICAgICAgICAgICAgY2Fwcy0+YWRkRmxhZ3MoTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6a0ZsYWdTdXBwb3J0c0FkYXB0aXZlUGxheWJhY2spOwogICAgICAgICB9CiAgICAgfQogCkBAIC04MzY1LDExICs4Mzg4LDEwIEBACiAgICAgICAgIGlmIChvbXhOb2RlLT5nZXRDb25maWcoCiAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4Q29uZmlnQW5kcm9pZEludHJhUmVmcmVzaCwKICAgICAgICAgICAgICAgICAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSkgPT0gT0spIHsKLSAgICAgICAgICAgIGJ1aWxkZXItPmFkZEZsYWdzKE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OmtGbGFnU3VwcG9ydHNJbnRyYVJlZnJlc2gpOworICAgICAgICAgICAgY2Fwcy0+YWRkRmxhZ3MoTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6a0ZsYWdTdXBwb3J0c0ludHJhUmVmcmVzaCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAqY2FwcyA9IGJ1aWxkZXI7CiAgICAgb214Tm9kZS0+ZnJlZU5vZGUoKTsKICAgICBjbGllbnQuZGlzY29ubmVjdCgpOwogICAgIHJldHVybiBPSzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlY0J1ZmZlckNoYW5uZWwuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKaW5kZXggMGQ5Njk2Zi4uM2M3YWUzZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKQEAgLTIwLDcgKzIwLDcgQEAKIAogI2luY2x1ZGUgPG51bWVyaWM+CiAKLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0lEZXNjcmFtYmxlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzL25hdGl2ZS8xLjAvSURlc2NyYW1ibGVyLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgogI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0NvcmUuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CkBAIC0zNCw4ICszNCwxMSBAQAogI2luY2x1ZGUgImluY2x1ZGUvU2hhcmVkTWVtb3J5QnVmZmVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLXVzaW5nIGJpbmRlcjo6U3RhdHVzOwotdXNpbmcgTWVkaWFEZXNjcmFtYmxlcjo6RGVzY3JhbWJsZUluZm87Cit1c2luZyBoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhczo6VjFfMDsKK3VzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA7CiB1c2luZyBCdWZmZXJJbmZvID0gQUNvZGVjQnVmZmVyQ2hhbm5lbDo6QnVmZmVySW5mbzsKIHVzaW5nIEJ1ZmZlckluZm9JdGVyYXRvciA9IHN0ZDo6dmVjdG9yPGNvbnN0IEJ1ZmZlckluZm8+Ojpjb25zdF9pdGVyYXRvcjsKIApAQCAtMTE0LDc0ICsxMTcsOTcgQEAKICAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CiAgICAgfQogCi0gICAgSUNyeXB0bzo6RGVzdGluYXRpb25CdWZmZXIgZGVzdGluYXRpb247CisgICAgbmF0aXZlX2hhbmRsZV90ICpzZWN1cmVIYW5kbGUgPSBOVUxMOwogICAgIGlmIChzZWN1cmUpIHsKICAgICAgICAgc3A8U2VjdXJlQnVmZmVyPiBzZWN1cmVEYXRhID0KICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxTZWN1cmVCdWZmZXIgKj4oaXQtPm1Db2RlY0J1ZmZlci5nZXQoKSk7Ci0gICAgICAgIGRlc3RpbmF0aW9uLm1UeXBlID0gc2VjdXJlRGF0YS0+Z2V0RGVzdGluYXRpb25UeXBlKCk7Ci0gICAgICAgIGlmIChkZXN0aW5hdGlvbi5tVHlwZSAhPSBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlTmF0aXZlSGFuZGxlKSB7CisgICAgICAgIGlmIChzZWN1cmVEYXRhLT5nZXREZXN0aW5hdGlvblR5cGUoKSAhPSBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlTmF0aXZlSGFuZGxlKSB7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIGRlc3RpbmF0aW9uLm1IYW5kbGUgPQotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihzZWN1cmVEYXRhLT5nZXREZXN0aW5hdGlvblBvaW50ZXIoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZGVzdGluYXRpb24ubVR5cGUgPSBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlU2hhcmVkTWVtb3J5OwotICAgICAgICBkZXN0aW5hdGlvbi5tU2hhcmVkTWVtb3J5ID0gbURlY3J5cHREZXN0aW5hdGlvbjsKKyAgICAgICAgc2VjdXJlSGFuZGxlID0gc3RhdGljX2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KHNlY3VyZURhdGEtPmdldERlc3RpbmF0aW9uUG9pbnRlcigpKTsKICAgICB9Ci0KLSAgICBJQ3J5cHRvOjpTb3VyY2VCdWZmZXIgc291cmNlOwotICAgIHNvdXJjZS5tU2hhcmVkTWVtb3J5ID0gaXQtPm1TaGFyZWRFbmNyeXB0ZWRCdWZmZXI7Ci0gICAgc291cmNlLm1IZWFwU2VxTnVtID0gbUhlYXBTZXFOdW07Ci0KICAgICBzc2l6ZV90IHJlc3VsdCA9IC0xOwogICAgIGlmIChtQ3J5cHRvICE9IE5VTEwpIHsKKyAgICAgICAgSUNyeXB0bzo6RGVzdGluYXRpb25CdWZmZXIgZGVzdGluYXRpb247CisgICAgICAgIGlmIChzZWN1cmUpIHsKKyAgICAgICAgICAgIGRlc3RpbmF0aW9uLm1UeXBlID0gSUNyeXB0bzo6a0Rlc3RpbmF0aW9uVHlwZU5hdGl2ZUhhbmRsZTsKKyAgICAgICAgICAgIGRlc3RpbmF0aW9uLm1IYW5kbGUgPSBzZWN1cmVIYW5kbGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXN0aW5hdGlvbi5tVHlwZSA9IElDcnlwdG86OmtEZXN0aW5hdGlvblR5cGVTaGFyZWRNZW1vcnk7CisgICAgICAgICAgICBkZXN0aW5hdGlvbi5tU2hhcmVkTWVtb3J5ID0gbURlY3J5cHREZXN0aW5hdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIElDcnlwdG86OlNvdXJjZUJ1ZmZlciBzb3VyY2U7CisgICAgICAgIHNvdXJjZS5tU2hhcmVkTWVtb3J5ID0gaXQtPm1TaGFyZWRFbmNyeXB0ZWRCdWZmZXI7CisgICAgICAgIHNvdXJjZS5tSGVhcFNlcU51bSA9IG1IZWFwU2VxTnVtOworCiAgICAgICAgIHJlc3VsdCA9IG1DcnlwdG8tPmRlY3J5cHQoa2V5LCBpdiwgbW9kZSwgcGF0dGVybiwKICAgICAgICAgICAgICAgICBzb3VyY2UsIGl0LT5tQ2xpZW50QnVmZmVyLT5vZmZzZXQoKSwKICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLCBudW1TdWJTYW1wbGVzLCBkZXN0aW5hdGlvbiwgZXJyb3JEZXRhaWxNc2cpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIERlc2NyYW1ibGVJbmZvIGRlc2NyYW1ibGVJbmZvOwotICAgICAgICBkZXNjcmFtYmxlSW5mby5kc3RUeXBlID0gZGVzdGluYXRpb24ubVR5cGUgPT0KLSAgICAgICAgICAgICAgICBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlU2hhcmVkTWVtb3J5ID8KLSAgICAgICAgICAgICAgICBEZXNjcmFtYmxlSW5mbzo6a0Rlc3RpbmF0aW9uVHlwZVZtUG9pbnRlciA6Ci0gICAgICAgICAgICAgICAgRGVzY3JhbWJsZUluZm86OmtEZXN0aW5hdGlvblR5cGVOYXRpdmVIYW5kbGU7Ci0gICAgICAgIGRlc2NyYW1ibGVJbmZvLnNjcmFtYmxpbmdDb250cm9sID0ga2V5ICE9IE5VTEwgPwotICAgICAgICAgICAgICAgIChEZXNjcmFtYmxlclBsdWdpbjo6U2NyYW1ibGluZ0NvbnRyb2wpa2V5WzBdIDoKLSAgICAgICAgICAgICAgICBEZXNjcmFtYmxlclBsdWdpbjo6a1NjcmFtYmxpbmdfVW5zY3JhbWJsZWQ7Ci0gICAgICAgIGRlc2NyYW1ibGVJbmZvLm51bVN1YlNhbXBsZXMgPSBudW1TdWJTYW1wbGVzOwotICAgICAgICBkZXNjcmFtYmxlSW5mby5zdWJTYW1wbGVzID0gKERlc2NyYW1ibGVyUGx1Z2luOjpTdWJTYW1wbGUgKilzdWJTYW1wbGVzOwotICAgICAgICBkZXNjcmFtYmxlSW5mby5zcmNNZW0gPSBpdC0+bVNoYXJlZEVuY3J5cHRlZEJ1ZmZlcjsKLSAgICAgICAgZGVzY3JhbWJsZUluZm8uc3JjT2Zmc2V0ID0gMDsKLSAgICAgICAgZGVzY3JhbWJsZUluZm8uZHN0UHRyID0gTlVMTDsKLSAgICAgICAgZGVzY3JhbWJsZUluZm8uZHN0T2Zmc2V0ID0gMDsKLQotICAgICAgICBpbnQzMl90IGRlc2NyYW1ibGVSZXN1bHQgPSAtMTsKLSAgICAgICAgU3RhdHVzIHN0YXR1cyA9IG1EZXNjcmFtYmxlci0+ZGVzY3JhbWJsZShkZXNjcmFtYmxlSW5mbywgJmRlc2NyYW1ibGVSZXN1bHQpOwotCi0gICAgICAgIGlmIChzdGF0dXMuaXNPaygpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBkZXNjcmFtYmxlUmVzdWx0OwotICAgICAgICB9CiAKICAgICAgICAgaWYgKHJlc3VsdCA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJkZXNjcmFtYmxlIGZhaWxlZCwgZXhjZXB0aW9uQ29kZT0lZCwgZXJyPSVkLCByZXN1bHQ9JXpkIiwKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmV4Y2VwdGlvbkNvZGUoKSwgc3RhdHVzLnRyYW5zYWN0aW9uRXJyb3IoKSwgcmVzdWx0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dWKCJkZXNjcmFtYmxlIHN1Y2NlZWRlZCwgcmVzdWx0PSV6ZCIsIHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHJlc3VsdCA+IDAgJiYgZGVzdGluYXRpb24ubVR5cGUgPT0gSUNyeXB0bzo6a0Rlc3RpbmF0aW9uVHlwZVNoYXJlZE1lbW9yeSkgewotICAgICAgICAgICAgbWVtY3B5KGRlc3RpbmF0aW9uLm1TaGFyZWRNZW1vcnktPnBvaW50ZXIoKSwKKyAgICAgICAgaWYgKGRlc3RpbmF0aW9uLm1UeXBlID09IElDcnlwdG86OmtEZXN0aW5hdGlvblR5cGVTaGFyZWRNZW1vcnkpIHsKKyAgICAgICAgICAgIG1lbWNweShpdC0+bUNvZGVjQnVmZmVyLT5iYXNlKCksIGRlc3RpbmF0aW9uLm1TaGFyZWRNZW1vcnktPnBvaW50ZXIoKSwgcmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEhlcmUgd2UgY2FzdCBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSB0byBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA6OlN1YlNhbXBsZQorICAgICAgICAvLyBkaXJlY3RseSwgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBzaG91bGQgbWF0Y2ggYXMgY2hlY2tlZCBpbiBEZXNjcmFtYmxlckltcGwuY3BwLgorICAgICAgICBoaWRsX3ZlYzxTdWJTYW1wbGU+IGhpZGxTdWJTYW1wbGVzOworICAgICAgICBoaWRsU3ViU2FtcGxlcy5zZXRUb0V4dGVybmFsKChTdWJTYW1wbGUgKilzdWJTYW1wbGVzLCBudW1TdWJTYW1wbGVzLCBmYWxzZSAvKm93biovKTsKKworICAgICAgICBzc2l6ZV90IG9mZnNldDsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGl0LT5tU2hhcmVkRW5jcnlwdGVkQnVmZmVyLT5nZXRNZW1vcnkoJm9mZnNldCwgJnNpemUpOworICAgICAgICBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA6OlNoYXJlZEJ1ZmZlciBzcmNCdWZmZXIgPSB7CisgICAgICAgICAgICAgICAgLmhlYXBCYXNlID0gbUhpZGxNZW1vcnksCisgICAgICAgICAgICAgICAgLm9mZnNldCA9ICh1aW50NjRfdCkgb2Zmc2V0LAorICAgICAgICAgICAgICAgIC5zaXplID0gc2l6ZQorICAgICAgICB9OworCisgICAgICAgIERlc3RpbmF0aW9uQnVmZmVyIGRzdEJ1ZmZlcjsKKyAgICAgICAgaWYgKHNlY3VyZSkgeworICAgICAgICAgICAgZHN0QnVmZmVyLnR5cGUgPSBCdWZmZXJUeXBlOjpOQVRJVkVfSEFORExFOworICAgICAgICAgICAgZHN0QnVmZmVyLnNlY3VyZU1lbW9yeSA9IGhpZGxfaGFuZGxlKHNlY3VyZUhhbmRsZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkc3RCdWZmZXIudHlwZSA9IEJ1ZmZlclR5cGU6OlNIQVJFRF9NRU1PUlk7CisgICAgICAgICAgICBkc3RCdWZmZXIubm9uc2VjdXJlTWVtb3J5ID0gc3JjQnVmZmVyOworICAgICAgICB9CisKKyAgICAgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7CisgICAgICAgIGhpZGxfc3RyaW5nIGRldGFpbGVkRXJyb3I7CisKKyAgICAgICAgYXV0byByZXR1cm5Wb2lkID0gbURlc2NyYW1ibGVyLT5kZXNjcmFtYmxlKAorICAgICAgICAgICAgICAgIGtleSAhPSBOVUxMID8gKFNjcmFtYmxpbmdDb250cm9sKWtleVswXSA6IFNjcmFtYmxpbmdDb250cm9sOjpVTlNDUkFNQkxFRCwKKyAgICAgICAgICAgICAgICBoaWRsU3ViU2FtcGxlcywKKyAgICAgICAgICAgICAgICBzcmNCdWZmZXIsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBbJnN0YXR1cywgJnJlc3VsdCwgJmRldGFpbGVkRXJyb3JdICgKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBfc3RhdHVzLCB1aW50MzJfdCBfYnl0ZXNXcml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIF9kZXRhaWxlZEVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IF9zdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChzc2l6ZV90KV9ieXRlc1dyaXR0ZW47CisgICAgICAgICAgICAgICAgICAgIGRldGFpbGVkRXJyb3IgPSBfZGV0YWlsZWRFcnJvcjsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBpZiAoIXJldHVyblZvaWQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok9LIHx8IHJlc3VsdCA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJkZXNjcmFtYmxlIGZhaWxlZCwgdHJhbnM9JXMsIHN0YXR1cz0lZCwgcmVzdWx0PSV6ZCIsCisgICAgICAgICAgICAgICAgICAgIHJldHVyblZvaWQuZGVzY3JpcHRpb24oKS5jX3N0cigpLCBzdGF0dXMsIHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJkZXNjcmFtYmxlIHN1Y2NlZWRlZCwgJXpkIGJ5dGVzIiwgcmVzdWx0KTsKKworICAgICAgICBpZiAoZHN0QnVmZmVyLnR5cGUgPT0gQnVmZmVyVHlwZTo6U0hBUkVEX01FTU9SWSkgeworICAgICAgICAgICAgbWVtY3B5KGl0LT5tQ29kZWNCdWZmZXItPmJhc2UoKSwKICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKWl0LT5tU2hhcmVkRW5jcnlwdGVkQnVmZmVyLT5wb2ludGVyKCksIHJlc3VsdCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAocmVzdWx0IDwgMCkgewotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIGlmIChkZXN0aW5hdGlvbi5tVHlwZSA9PSBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlU2hhcmVkTWVtb3J5KSB7Ci0gICAgICAgIG1lbWNweShpdC0+bUNvZGVjQnVmZmVyLT5iYXNlKCksIGRlc3RpbmF0aW9uLm1TaGFyZWRNZW1vcnktPnBvaW50ZXIoKSwgcmVzdWx0KTsKLSAgICB9Ci0KICAgICBpdC0+bUNvZGVjQnVmZmVyLT5zZXRSYW5nZSgwLCByZXN1bHQpOwogCiAgICAgLy8gQ29weSBtZXRhZGF0YSBmcm9tIGNsaWVudCB0byBjb2RlYyBidWZmZXIuCkBAIC0yNzUsMTAgKzMwMSwyMSBAQAogICAgICAgICBpbnQzMl90IHNlcU51bSA9IG1DcnlwdG8tPnNldEhlYXAoZGVhbGVyLT5nZXRNZW1vcnlIZWFwKCkpOwogICAgICAgICBpZiAoc2VxTnVtID49IDApIHsKICAgICAgICAgICAgIG1IZWFwU2VxTnVtID0gc2VxTnVtOwotICAgICAgICAgICAgQUxPR0QoInNldEhlYXAgcmV0dXJuZWQgbUhlYXBTZXFOdW09JWQiLCBtSGVhcFNlcU51bSk7CisgICAgICAgICAgICBBTE9HVigic2V0SGVhcCByZXR1cm5lZCBtSGVhcFNlcU51bT0lZCIsIG1IZWFwU2VxTnVtKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1IZWFwU2VxTnVtID0gLTE7Ci0gICAgICAgICAgICBBTE9HRCgic2V0SGVhcCBmYWlsZWQsIHNldHRpbmcgbUhlYXBTZXFOdW09LTEiKTsKKyAgICAgICAgICAgIEFMT0dFKCJzZXRIZWFwIGZhaWxlZCwgc2V0dGluZyBtSGVhcFNlcU51bT0tMSIpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtRGVzY3JhbWJsZXIgIT0gbnVsbHB0cikgeworICAgICAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IGRlYWxlci0+Z2V0TWVtb3J5SGVhcCgpOworICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIG5hdGl2ZUhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOworICAgICAgICBpZiAobmF0aXZlSGFuZGxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGludCBmZCA9IGhlYXAtPmdldEhlYXBJRCgpOworICAgICAgICAgICAgbmF0aXZlSGFuZGxlLT5kYXRhWzBdID0gZmQ7CisgICAgICAgICAgICBtSGlkbE1lbW9yeSA9IGhpZGxfbWVtb3J5KCJhc2htZW0iLCBoaWRsX2hhbmRsZShuYXRpdmVIYW5kbGUpLCBoZWFwLT5nZXRTaXplKCkpOworICAgICAgICAgICAgQUxPR1YoImNyZWF0ZWQgaGlkbF9tZW1vcnkgZm9yIGRlc2NyYW1ibGVyIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGNyZWF0ZSBoaWRsX21lbW9yeSBmb3IgZGVzY3JhbWJsZXIiKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZGVhbGVyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKaW5kZXggODFiNDk2NC4uYWM0ZTgxOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwCkBAIC0xNyw2ICsxNyw3IEBACiAgICAgICAgICJBdWRpb1BsYXllci5jcHAiLAogICAgICAgICAiQXVkaW9Tb3VyY2UuY3BwIiwKICAgICAgICAgIkJ1ZmZlckltcGwuY3BwIiwKKyAgICAgICAgIkNvZGVjQmFzZS5jcHAiLAogICAgICAgICAiQ2FsbGJhY2tEYXRhU291cmNlLmNwcCIsCiAgICAgICAgICJDYW1lcmFTb3VyY2UuY3BwIiwKICAgICAgICAgIkNhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAiLApAQCAtMjksNiArMzAsNyBAQAogICAgICAgICAiRnJhbWVSZW5kZXJUcmFja2VyLmNwcCIsCiAgICAgICAgICJIVFRQQmFzZS5jcHAiLAogICAgICAgICAiSGV2Y1V0aWxzLmNwcCIsCisgICAgICAgICJJdGVtVGFibGUuY3BwIiwKICAgICAgICAgIkpQRUdTb3VyY2UuY3BwIiwKICAgICAgICAgIk1QM0V4dHJhY3Rvci5jcHAiLAogICAgICAgICAiTVBFRzJUU1dyaXRlci5jcHAiLApAQCAtNDksNiArNTEsNyBAQAogICAgICAgICAiTnVDYWNoZWRTb3VyY2UyLmNwcCIsCiAgICAgICAgICJOdU1lZGlhRXh0cmFjdG9yLmNwcCIsCiAgICAgICAgICJPTVhDbGllbnQuY3BwIiwKKyAgICAgICAgIk9teEluZm9CdWlsZGVyLmNwcCIsCiAgICAgICAgICJPZ2dFeHRyYWN0b3IuY3BwIiwKICAgICAgICAgIlNhbXBsZUl0ZXJhdG9yLmNwcCIsCiAgICAgICAgICJTYW1wbGVUYWJsZS5jcHAiLApAQCAtNjcsMTEgKzcwLDYgQEAKICAgICAgICAgImF2Y191dGlscy5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2hhcmR3YXJlIiwKLSAgICBdLAotCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICAibGliYmluZGVyIiwKQEAgLTkzLDE1ICs5MSwyMiBAQAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlidm9yYmlzaWRlYyIsCiAgICAgICAgICJsaWJtZWRpYWRybSIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAogCiAgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214X3V0aWxzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZsYWNkZWMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXIiLAogICAgICAgICAibGliZGwiLAogICAgICAgICAibGliUlNjcHAiLAogICAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgICAibGliaGlkbG1lbW9yeSIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCiAgICAgXSwKIApAQCAtMTEwLDcgKzExNSw2IEBACiAgICAgICAgICJsaWJ5dXZfc3RhdGljIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21hdHJvc2thIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21lZGlhZmlsdGVyIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teF91dGlscyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF93ZWJtIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dCIsCiAgICAgICAgICJsaWJ2cHgiLApAQCAtMTIwLDkgKzEyNCwxMiBAQAogICAgICAgICAibGliRkxBQyIsCiAgICAgXSwKIAotICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsibGlibWVkaWEiXSwKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCisgICAgXSwKKwogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgIi4iLAogICAgICAgICAiaW5jbHVkZSIsCiAgICAgXSwKIApAQCAtMTY5LDQgKzE3Niw1IEBACiAgICAgInRpbWVkdGV4dCIsCiAgICAgIndlYm0iLAogICAgICJ3aWZpLWRpc3BsYXkiLAorICAgICJ4bWxwYXJzZXIiLAogXQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FsbGJhY2tEYXRhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbGxiYWNrRGF0YVNvdXJjZS5jcHAKaW5kZXggNDMwOTM3Mi4uNmRmZTJkZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FsbGJhY2tEYXRhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYWxsYmFja0RhdGFTb3VyY2UuY3BwCkBAIC0xMjcsMTAgKzEyNyw2IEBACiB9CiAKIHNzaXplX3QgVGlueUNhY2hlU291cmNlOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKHNpemUgPj0ga0NhY2hlU2l6ZSkgewotICAgICAgICByZXR1cm4gbVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgZGF0YSwgc2l6ZSk7Ci0gICAgfQotCiAgICAgLy8gQ2hlY2sgaWYgdGhlIGNhY2hlIHNhdGlzZmllcyB0aGUgcmVhZC4KICAgICBpZiAobUNhY2hlZE9mZnNldCA8PSBvZmZzZXQKICAgICAgICAgICAgICYmIG9mZnNldCA8IChvZmY2NF90KSAobUNhY2hlZE9mZnNldCArIG1DYWNoZWRTaXplKSkgewpAQCAtMTU0LDYgKzE1MCw5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAoc2l6ZSA+PSBrQ2FjaGVTaXplKSB7CisgICAgICAgIHJldHVybiBtU291cmNlLT5yZWFkQXQob2Zmc2V0LCBkYXRhLCBzaXplKTsKKyAgICB9CiAKICAgICAvLyBGaWxsIHRoZSBjYWNoZSBhbmQgY29weSB0byB0aGUgY2FsbGVyLgogICAgIGNvbnN0IHNzaXplX3QgbnVtUmVhZCA9IG1Tb3VyY2UtPnJlYWRBdChvZmZzZXQsIG1DYWNoZSwga0NhY2hlU2l6ZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Db2RlY0Jhc2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDYxMGIyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmNwcApAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjQmFzZSIKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzL25hdGl2ZS8xLjAvSURlc2NyYW1ibGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3ZvaWQgQnVmZmVyQ2hhbm5lbEJhc2U6OnNldENyeXB0byhjb25zdCBzcDxJQ3J5cHRvPiAmY3J5cHRvKSB7CisgICAgbUNyeXB0byA9IGNyeXB0bzsKK30KKwordm9pZCBCdWZmZXJDaGFubmVsQmFzZTo6c2V0RGVzY3JhbWJsZXIoY29uc3Qgc3A8SURlc2NyYW1ibGVyPiAmZGVzY3JhbWJsZXIpIHsKKyAgICBtRGVzY3JhbWJsZXIgPSBkZXNjcmFtYmxlcjsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhU291cmNlLmNwcAppbmRleCBhNTc2MGQxLi5jMjIwNTNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhU291cmNlLmNwcApAQCAtOTIsNiArOTIsNDggQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorYm9vbCBEYXRhU291cmNlOjpnZXRVSW50MTZWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90ICp4LCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChzaXplID09IDIpIHsKKyAgICAgICAgcmV0dXJuIGdldFVJbnQxNihvZmZzZXQsIHgpOworICAgIH0KKyAgICBpZiAoc2l6ZSA9PSAxKSB7CisgICAgICAgIHVpbnQ4X3QgdG1wOworICAgICAgICBpZiAocmVhZEF0KG9mZnNldCwgJnRtcCwgMSkgPT0gMSkgeworICAgICAgICAgICAgKnggPSB0bXA7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgRGF0YVNvdXJjZTo6Z2V0VUludDMyVmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoc2l6ZSA9PSA0KSB7CisgICAgICAgIHJldHVybiBnZXRVSW50MzIob2Zmc2V0LCB4KTsKKyAgICB9CisgICAgaWYgKHNpemUgPT0gMikgeworICAgICAgICB1aW50MTZfdCB0bXA7CisgICAgICAgIGlmIChnZXRVSW50MTYob2Zmc2V0LCAmdG1wKSkgeworICAgICAgICAgICAgKnggPSB0bXA7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgRGF0YVNvdXJjZTo6Z2V0VUludDY0VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoc2l6ZSA9PSA4KSB7CisgICAgICAgIHJldHVybiBnZXRVSW50NjQob2Zmc2V0LCB4KTsKKyAgICB9CisgICAgaWYgKHNpemUgPT0gNCkgeworICAgICAgICB1aW50MzJfdCB0bXA7CisgICAgICAgIGlmIChnZXRVSW50MzIob2Zmc2V0LCAmdG1wKSkgeworICAgICAgICAgICAgKnggPSB0bXA7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIHN0YXR1c190IERhdGFTb3VyY2U6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgewogICAgICpzaXplID0gMDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lUmVuZGVyVHJhY2tlci5jcHAKaW5kZXggOTE3ODcwZi4uMWFhM2JhZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZVJlbmRlclRyYWNrZXIuY3BwCkBAIC04OCw3ICs4OCw5IEBACiAKIHN0YXR1c190IEZyYW1lUmVuZGVyVHJhY2tlcjo6b25GcmFtZVJlbmRlcmVkKGludDY0X3QgbWVkaWFUaW1lVXMsIG5zZWNzX3Qgc3lzdGVtTmFubykgewogICAgIC8vIGVuc3VyZSBtb25vdG9uaWMgdGltZXN0YW1wcwotICAgIGlmIChtTGFzdFJlbmRlclRpbWVOcyA+PSBzeXN0ZW1OYW5vKSB7CisgICAgaWYgKG1MYXN0UmVuZGVyVGltZU5zID4gc3lzdGVtTmFubyB8fAorICAgICAgICAvLyBFT1MgaXMgbm9ybWFsbHkgbWFya2VkIG9uIHRoZSBsYXN0IGZyYW1lCisgICAgICAgIChtTGFzdFJlbmRlclRpbWVOcyA9PSBzeXN0ZW1OYW5vICYmIG1lZGlhVGltZVVzICE9IElOVDY0X01BWCkpIHsKICAgICAgICAgQUxPR1coIlslc10gSWdub3Jpbmcgb3V0IG9mIG9yZGVyL3N0YWxlIHN5c3RlbSBuYW5vICVsbGQgZm9yIG1lZGlhIHRpbWUgJWxsZCBmcm9tIGNvZGVjLiIsCiAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgKGxvbmcgbG9uZylzeXN0ZW1OYW5vLCAobG9uZyBsb25nKW1lZGlhVGltZVVzKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0l0ZW1UYWJsZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9JdGVtVGFibGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYzRmM2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9JdGVtVGFibGUuY3BwCkBAIC0wLDAgKzEsMTU2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiSXRlbVRhYmxlIgorCisjaW5jbHVkZSA8aW5jbHVkZS9JdGVtVGFibGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIGhlaWYgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgc3RydWN0IHRvIGtlZXAgdHJhY2sgb2Ygb25lIGltYWdlIGl0ZW0KKy8vCisKK3N0cnVjdCBJbWFnZUl0ZW0geworICAgIGZyaWVuZCBzdHJ1Y3QgSXRlbVJlZmVyZW5jZTsKKyAgICBmcmllbmQgc3RydWN0IEl0ZW1Qcm9wZXJ0eTsKKworICAgIEltYWdlSXRlbSgpIDogSW1hZ2VJdGVtKDApIHt9CisgICAgSW1hZ2VJdGVtKHVpbnQzMl90IF90eXBlKSA6IHR5cGUoX3R5cGUpLAorICAgICAgICAgICAgcm93cygwKSwgY29sdW1ucygwKSwgd2lkdGgoMCksIGhlaWdodCgwKSwgcm90YXRpb24oMCksCisgICAgICAgICAgICBvZmZzZXQoMCksIHNpemUoMCksIG5leHRUaWxlSW5kZXgoMCkge30KKworICAgIGJvb2wgaXNHcmlkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gdHlwZSA9PSBGT1VSQ0MoJ2cnLCAncicsICdpJywgJ2QnKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBnZXROZXh0VGlsZUl0ZW1JZCh1aW50MzJfdCAqbmV4dFRpbGVJdGVtSWQsIGJvb2wgcmVzZXQpIHsKKyAgICAgICAgaWYgKHJlc2V0KSB7CisgICAgICAgICAgICBuZXh0VGlsZUluZGV4ID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAobmV4dFRpbGVJbmRleCA+PSBkaW1nUmVmcy5zaXplKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICB9CisgICAgICAgICpuZXh0VGlsZUl0ZW1JZCA9IGRpbWdSZWZzW25leHRUaWxlSW5kZXgrK107CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICB1aW50MzJfdCB0eXBlOworICAgIGludDMyX3Qgcm93czsKKyAgICBpbnQzMl90IGNvbHVtbnM7CisgICAgaW50MzJfdCB3aWR0aDsKKyAgICBpbnQzMl90IGhlaWdodDsKKyAgICBpbnQzMl90IHJvdGF0aW9uOworICAgIG9mZjY0X3Qgb2Zmc2V0OworICAgIHNpemVfdCBzaXplOworICAgIHNwPEFCdWZmZXI+IGh2Y2M7CisgICAgc3A8QUJ1ZmZlcj4gaWNjOworCisgICAgVmVjdG9yPHVpbnQzMl90PiB0aHVtYm5haWxzOworICAgIFZlY3Rvcjx1aW50MzJfdD4gZGltZ1JlZnM7CisgICAgc2l6ZV90IG5leHRUaWxlSW5kZXg7Cit9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJU08gYm94ZXMKKy8vCisKK3N0cnVjdCBCb3ggeworcHJvdGVjdGVkOgorICAgIEJveChjb25zdCBzcDxEYXRhU291cmNlPiBzb3VyY2UsIHVpbnQzMl90IHR5cGUpIDoKKyAgICAgICAgbURhdGFTb3VyY2Uoc291cmNlKSwgbVR5cGUodHlwZSkge30KKworICAgIHZpcnR1YWwgfkJveCgpIHt9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uQ2h1bmtEYXRhKAorICAgICAgICAgICAgdWludDMyX3QgLyp0eXBlKi8sIG9mZjY0X3QgLypvZmZzZXQqLywgc2l6ZV90IC8qc2l6ZSovKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBpbmxpbmUgdWludDMyX3QgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1UeXBlOyB9CisKKyAgICBpbmxpbmUgc3A8RGF0YVNvdXJjZT4gc291cmNlKCkgY29uc3QgeyByZXR1cm4gbURhdGFTb3VyY2U7IH0KKworICAgIHN0YXR1c190IHBhcnNlQ2h1bmsob2ZmNjRfdCAqb2Zmc2V0KTsKKworICAgIHN0YXR1c190IHBhcnNlQ2h1bmtzKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisKK3ByaXZhdGU6CisgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CisgICAgdWludDMyX3QgbVR5cGU7Cit9OworCitzdGF0dXNfdCBCb3g6OnBhcnNlQ2h1bmsob2ZmNjRfdCAqb2Zmc2V0KSB7CisgICAgaWYgKCpvZmZzZXQgPCAwKSB7CisgICAgICAgIEFMT0dFKCJiLzIzNTQwOTE0Iik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIHVpbnQzMl90IGhkclsyXTsKKyAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgqb2Zmc2V0LCBoZHIsIDgpIDwgOCkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorICAgIHVpbnQ2NF90IGNodW5rX3NpemUgPSBudG9obChoZHJbMF0pOworICAgIGludDMyX3QgY2h1bmtfdHlwZSA9IG50b2hsKGhkclsxXSk7CisgICAgb2ZmNjRfdCBkYXRhX29mZnNldCA9ICpvZmZzZXQgKyA4OworCisgICAgaWYgKGNodW5rX3NpemUgPT0gMSkgeworICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgqb2Zmc2V0ICsgOCwgJmNodW5rX3NpemUsIDgpIDwgOCkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICB9CisgICAgICAgIGNodW5rX3NpemUgPSBudG9oNjQoY2h1bmtfc2l6ZSk7CisgICAgICAgIGRhdGFfb2Zmc2V0ICs9IDg7CisKKyAgICAgICAgaWYgKGNodW5rX3NpemUgPCAxNikgeworICAgICAgICAgICAgLy8gVGhlIHNtYWxsZXN0IHZhbGlkIGNodW5rIGlzIDE2IGJ5dGVzIGxvbmcgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoY2h1bmtfc2l6ZSA9PSAwKSB7CisgICAgICAgIC8vIFRoaXMgc2hvdWxkbid0IGhhcHBlbiBzaW5jZSB3ZSBzaG91bGQgbmV2ZXIgYmUgdG9wIGxldmVsCisgICAgICAgIEFMT0dFKCJpbnZhbGlkIGNodW5rIHNpemUgMCBmb3Igbm9uLXRvcCBsZXZlbCBib3giKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9IGVsc2UgaWYgKGNodW5rX3NpemUgPCA4KSB7CisgICAgICAgIC8vIFRoZSBzbWFsbGVzdCB2YWxpZCBjaHVuayBpcyA4IGJ5dGVzIGxvbmcuCisgICAgICAgIEFMT0dFKCJpbnZhbGlkIGNodW5rIHNpemU6ICVsbGQiLCAobG9uZyBsb25nKWNodW5rX3NpemUpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGNoYXIgY2h1bmtbNV07CisgICAgTWFrZUZvdXJDQ1N0cmluZyhjaHVua190eXBlLCBjaHVuayk7CisgICAgQUxPR1YoImNodW5rOiAlcyBAICVsbGQiLCBjaHVuaywgKGxvbmcgbG9uZykqb2Zmc2V0KTsKKworICAgIG9mZjY0X3QgY2h1bmtfZGF0YV9zaXplID0gY2h1bmtfc2l6ZSAtIChkYXRhX29mZnNldCAtICpvZmZzZXQpOworICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAwKSB7CisgICAgICAgIEFMT0dFKCJiLzIzNTQwOTE0Iik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gb25DaHVua0RhdGEoY2h1bmtfdHlwZSwgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEJveDo6cGFyc2VDaHVua3Mob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgb2ZmNjRfdCBzdG9wT2Zmc2V0ID0gb2Zmc2V0ICsgc2l6ZTsKKyAgICB3aGlsZSAob2Zmc2V0IDwgc3RvcE9mZnNldCkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rKCZvZmZzZXQpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorICAgIGlmIChvZmZzZXQgIT0gc3RvcE9mZnNldCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0cnVjdCBGdWxsQm94IDogcHVibGljIEJveCB7Citwcm90ZWN0ZWQ6CisgICAgRnVsbEJveChjb25zdCBzcDxEYXRhU291cmNlPiBzb3VyY2UsIHVpbnQzMl90IHR5cGUpIDoKKyAgICAgICAgQm94KHNvdXJjZSwgdHlwZSksIG1WZXJzaW9uKDApLCBtRmxhZ3MoMCkge30KKworICAgIGlubGluZSB1aW50OF90IHZlcnNpb24oKSBjb25zdCB7IHJldHVybiBtVmVyc2lvbjsgfQorCisgICAgaW5saW5lIHVpbnQzMl90IGZsYWdzKCkgY29uc3QgeyByZXR1cm4gbUZsYWdzOyB9CisKKyAgICBzdGF0dXNfdCBwYXJzZUZ1bGxCb3hIZWFkZXIob2ZmNjRfdCAqb2Zmc2V0LCBzaXplX3QgKnNpemUpOworCitwcml2YXRlOgorICAgIHVpbnQ4X3QgbVZlcnNpb247CisgICAgdWludDMyX3QgbUZsYWdzOworfTsKKworc3RhdHVzX3QgRnVsbEJveDo6cGFyc2VGdWxsQm94SGVhZGVyKG9mZjY0X3QgKm9mZnNldCwgc2l6ZV90ICpzaXplKSB7CisgICAgaWYgKCpzaXplIDwgNCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICBpZiAoIXNvdXJjZSgpLT5yZWFkQXQoKm9mZnNldCwgJm1WZXJzaW9uLCAxKSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorICAgIGlmICghc291cmNlKCktPmdldFVJbnQyNCgqb2Zmc2V0ICsgMSwgJm1GbGFncykpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICAqb2Zmc2V0ICs9IDQ7CisgICAgKnNpemUgLT0gNDsKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBQcmltYXJ5SW1hZ2UgYm94CisvLworCitzdHJ1Y3QgUGl0bUJveCA6IHB1YmxpYyBGdWxsQm94IHsKKyAgICBQaXRtQm94KGNvbnN0IHNwPERhdGFTb3VyY2U+IHNvdXJjZSkgOgorICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCdwJywgJ2knLCAndCcsICdtJykpIHt9CisKKyAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUsIHVpbnQzMl90ICpwcmltYXJ5SXRlbUlkKTsKK307CisKK3N0YXR1c190IFBpdG1Cb3g6OnBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgdWludDMyX3QgKnByaW1hcnlJdGVtSWQpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUZ1bGxCb3hIZWFkZXIoJm9mZnNldCwgJnNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBzaXplX3QgaXRlbUlkU2l6ZSA9ICh2ZXJzaW9uKCkgPT0gMCkgPyAyIDogNDsKKyAgICBpZiAoc2l6ZSA8IGl0ZW1JZFNpemUpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgdWludDMyX3QgaXRlbUlkOworICAgIGlmICghc291cmNlKCktPmdldFVJbnQzMlZhcihvZmZzZXQsICZpdGVtSWQsIGl0ZW1JZFNpemUpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisKKyAgICBBTE9HVigicHJpbWFyeSBpZCAlZCIsIGl0ZW1JZCk7CisgICAgKnByaW1hcnlJdGVtSWQgPSBpdGVtSWQ7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJdGVtTG9jYXRpb24gcmVsYXRlZCBib3hlcworLy8KKworc3RydWN0IEV4dGVudEVudHJ5IHsKKyAgICB1aW50NjRfdCBleHRlbnRJbmRleDsKKyAgICB1aW50NjRfdCBleHRlbnRPZmZzZXQ7CisgICAgdWludDY0X3QgZXh0ZW50TGVuZ3RoOworfTsKKworc3RydWN0IEl0ZW1Mb2MgeworICAgIEl0ZW1Mb2MoKSA6IEl0ZW1Mb2MoMCwgMCwgMCwgMCkge30KKyAgICBJdGVtTG9jKHVpbnQzMl90IGl0ZW1faWQsIHVpbnQxNl90IGNvbnN0cnVjdGlvbl9tZXRob2QsCisgICAgICAgICAgICB1aW50MTZfdCBkYXRhX3JlZmVyZW5jZV9pbmRleCwgdWludDY0X3QgYmFzZV9vZmZzZXQpIDoKKyAgICAgICAgaXRlbUlkKGl0ZW1faWQpLAorICAgICAgICBjb25zdHJ1Y3Rpb25NZXRob2QoY29uc3RydWN0aW9uX21ldGhvZCksCisgICAgICAgIGRhdGFSZWZlcmVuY2VJbmRleChkYXRhX3JlZmVyZW5jZV9pbmRleCksCisgICAgICAgIGJhc2VPZmZzZXQoYmFzZV9vZmZzZXQpIHt9CisKKyAgICB2b2lkIGFkZEV4dGVudChjb25zdCBFeHRlbnRFbnRyeSYgZXh0ZW50KSB7CisgICAgICAgIGV4dGVudHMucHVzaF9iYWNrKGV4dGVudCk7CisgICAgfQorCisgICAgc3RhdHVzX3QgZ2V0TG9jKG9mZjY0X3QgKm9mZnNldCwgc2l6ZV90ICpzaXplLAorICAgICAgICAgICAgb2ZmNjRfdCBpZGF0T2Zmc2V0LCBzaXplX3QgaWRhdFNpemUpIGNvbnN0IHsKKyAgICAgICAgLy8gVE9ETzogZml4IGV4dGVudCBoYW5kbGluZywgZml4IGNvbnN0cnVjdGlvbk1ldGhvZCA9IDIKKyAgICAgICAgQ0hFQ0soZXh0ZW50cy5zaXplKCkgPT0gMSk7CisgICAgICAgIGlmIChjb25zdHJ1Y3Rpb25NZXRob2QgPT0gMCkgeworICAgICAgICAgICAgKm9mZnNldCA9IGJhc2VPZmZzZXQgKyBleHRlbnRzWzBdLmV4dGVudE9mZnNldDsKKyAgICAgICAgICAgICpzaXplID0gZXh0ZW50c1swXS5leHRlbnRMZW5ndGg7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0gZWxzZSBpZiAoY29uc3RydWN0aW9uTWV0aG9kID09IDEpIHsKKyAgICAgICAgICAgIGlmIChiYXNlT2Zmc2V0ICsgZXh0ZW50c1swXS5leHRlbnRPZmZzZXQgKyBleHRlbnRzWzBdLmV4dGVudExlbmd0aAorICAgICAgICAgICAgICAgICAgICA+IGlkYXRTaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpvZmZzZXQgPSBiYXNlT2Zmc2V0ICsgZXh0ZW50c1swXS5leHRlbnRPZmZzZXQgKyBpZGF0T2Zmc2V0OworICAgICAgICAgICAgKnNpemUgPSBleHRlbnRzWzBdLmV4dGVudExlbmd0aDsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgLy8gcGFyc2VkIGluZm8KKyAgICB1aW50MzJfdCBpdGVtSWQ7CisgICAgdWludDE2X3QgY29uc3RydWN0aW9uTWV0aG9kOworICAgIHVpbnQxNl90IGRhdGFSZWZlcmVuY2VJbmRleDsKKyAgICBvZmY2NF90IGJhc2VPZmZzZXQ7CisgICAgVmVjdG9yPEV4dGVudEVudHJ5PiBleHRlbnRzOworfTsKKworc3RydWN0IElsb2NCb3ggOiBwdWJsaWMgRnVsbEJveCB7CisgICAgSWxvY0JveChjb25zdCBzcDxEYXRhU291cmNlPiBzb3VyY2UsIEtleWVkVmVjdG9yPHVpbnQzMl90LCBJdGVtTG9jPiAqaXRlbUxvY3MpIDoKKyAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygnaScsICdsJywgJ28nLCAnYycpKSwKKyAgICAgICAgbUl0ZW1Mb2NzKGl0ZW1Mb2NzKSwgbUhhc0NvbnN0cnVjdE1ldGhvZDEoZmFsc2UpIHt9CisKKyAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOworCisgICAgYm9vbCBoYXNDb25zdHJ1Y3RNZXRob2QxKCkgeyByZXR1cm4gbUhhc0NvbnN0cnVjdE1ldGhvZDE7IH0KKworcHJpdmF0ZToKKyAgICBzdGF0aWMgYm9vbCBpc1NpemVGaWVsZFZhbGlkKHVpbnQzMl90IG9mZnNldF9zaXplKSB7CisgICAgICAgIHJldHVybiBvZmZzZXRfc2l6ZSA9PSAwIHx8IG9mZnNldF9zaXplID09IDQgfHwgb2Zmc2V0X3NpemUgPT0gODsKKyAgICB9CisgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIEl0ZW1Mb2M+ICptSXRlbUxvY3M7CisgICAgYm9vbCBtSGFzQ29uc3RydWN0TWV0aG9kMTsKK307CisKK3N0YXR1c190IElsb2NCb3g6OnBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIHN0YXR1c190IGVyciA9IHBhcnNlRnVsbEJveEhlYWRlcigmb2Zmc2V0LCAmc2l6ZSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBpZiAodmVyc2lvbigpID4gMikgeworICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgdmVyc2lvbiAlZCIsIF9fRlVOQ1RJT05fXywgdmVyc2lvbigpKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBpZiAoc2l6ZSA8IDIpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgdWludDhfdCBvZmZzZXRfc2l6ZTsKKyAgICBpZiAoIXNvdXJjZSgpLT5yZWFkQXQob2Zmc2V0KyssICZvZmZzZXRfc2l6ZSwgMSkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICB1aW50OF90IGxlbmd0aF9zaXplID0gKG9mZnNldF9zaXplICYgMHhGKTsKKyAgICBvZmZzZXRfc2l6ZSA+Pj0gNDsKKworICAgIHVpbnQ4X3QgYmFzZV9vZmZzZXRfc2l6ZTsKKyAgICBpZiAoIXNvdXJjZSgpLT5yZWFkQXQob2Zmc2V0KyssICZiYXNlX29mZnNldF9zaXplLCAxKSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorICAgIHVpbnQ4X3QgaW5kZXhfc2l6ZSA9IDA7CisgICAgaWYgKHZlcnNpb24oKSA9PSAxIHx8IHZlcnNpb24oKSA9PSAyKSB7CisgICAgICAgIGluZGV4X3NpemUgPSAoYmFzZV9vZmZzZXRfc2l6ZSAmIDB4Rik7CisgICAgfQorICAgIGJhc2Vfb2Zmc2V0X3NpemUgPj49IDQ7CisgICAgc2l6ZSAtPSAyOworCisgICAgaWYgKCFpc1NpemVGaWVsZFZhbGlkKG9mZnNldF9zaXplKQorICAgICAgICAgICAgfHwgIWlzU2l6ZUZpZWxkVmFsaWQobGVuZ3RoX3NpemUpCisgICAgICAgICAgICB8fCAhaXNTaXplRmllbGRWYWxpZChiYXNlX29mZnNldF9zaXplKQorICAgICAgICAgICAgfHwgIWlzU2l6ZUZpZWxkVmFsaWQoKGluZGV4X3NpemUpKSkgeworICAgICAgICBBTE9HRSgiJXM6IG9mZnNldCBzaXplIG5vdCB2YWxpZDogJWQsICVkLCAlZCwgJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgb2Zmc2V0X3NpemUsIGxlbmd0aF9zaXplLCBiYXNlX29mZnNldF9zaXplLCBpbmRleF9zaXplKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBpdGVtX2NvdW50OworICAgIHNpemVfdCBpdGVtRmllbGRTaXplID0gdmVyc2lvbigpIDwgMiA/IDIgOiA0OworICAgIGlmIChzaXplIDwgaXRlbUZpZWxkU2l6ZSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MzJWYXIob2Zmc2V0LCAmaXRlbV9jb3VudCwgaXRlbUZpZWxkU2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKworICAgIEFMT0dWKCJpdGVtX2NvdW50ICVsbGQiLCAobG9uZyBsb25nKSBpdGVtX2NvdW50KTsKKyAgICBvZmZzZXQgKz0gaXRlbUZpZWxkU2l6ZTsKKyAgICBzaXplIC09IGl0ZW1GaWVsZFNpemU7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGl0ZW1fY291bnQ7IGkrKykgeworICAgICAgICB1aW50MzJfdCBpdGVtX2lkOworICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MzJWYXIob2Zmc2V0LCAmaXRlbV9pZCwgaXRlbUZpZWxkU2l6ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiaXRlbVslenVdOiBpZCAlbGxkIiwgaSwgKGxvbmcgbG9uZylpdGVtX2lkKTsKKyAgICAgICAgb2Zmc2V0ICs9IGl0ZW1GaWVsZFNpemU7CisKKyAgICAgICAgdWludDhfdCBjb25zdHJ1Y3Rpb25fbWV0aG9kID0gMDsKKyAgICAgICAgaWYgKHZlcnNpb24oKSA9PSAxIHx8IHZlcnNpb24oKSA9PSAyKSB7CisgICAgICAgICAgICB1aW50OF90IGJ1ZlsyXTsKKyAgICAgICAgICAgIGlmICghc291cmNlKCktPnJlYWRBdChvZmZzZXQsIGJ1ZiwgMikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdHJ1Y3Rpb25fbWV0aG9kID0gKGJ1ZlsxXSAmIDB4Rik7CisgICAgICAgICAgICBBTE9HVigiY29uc3RydWN0aW9uX21ldGhvZCAlZCIsIGNvbnN0cnVjdGlvbl9tZXRob2QpOworICAgICAgICAgICAgaWYgKGNvbnN0cnVjdGlvbl9tZXRob2QgPT0gMSkgeworICAgICAgICAgICAgICAgIG1IYXNDb25zdHJ1Y3RNZXRob2QxID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb2Zmc2V0ICs9IDI7CisgICAgICAgIH0KKworICAgICAgICB1aW50MTZfdCBkYXRhX3JlZmVyZW5jZV9pbmRleDsKKyAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDE2KG9mZnNldCwgJmRhdGFfcmVmZXJlbmNlX2luZGV4KSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJkYXRhX3JlZmVyZW5jZV9pbmRleCAlZCIsIGRhdGFfcmVmZXJlbmNlX2luZGV4KTsKKyAgICAgICAgaWYgKGRhdGFfcmVmZXJlbmNlX2luZGV4ICE9IDApIHsKKyAgICAgICAgICAgIC8vIHdlIGRvbid0IHN1cHBvcnQgcmVmZXJlbmNlIHRvIG90aGVyIGZpbGVzCisgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0ICs9IDI7CisKKyAgICAgICAgdWludDY0X3QgYmFzZV9vZmZzZXQgPSAwOworICAgICAgICBpZiAoYmFzZV9vZmZzZXRfc2l6ZSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50NjRWYXIob2Zmc2V0LCAmYmFzZV9vZmZzZXQsIGJhc2Vfb2Zmc2V0X3NpemUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2Zmc2V0ICs9IGJhc2Vfb2Zmc2V0X3NpemU7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImJhc2Vfb2Zmc2V0ICVsbGQiLCAobG9uZyBsb25nKSBiYXNlX29mZnNldCk7CisKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IG1JdGVtTG9jcy0+YWRkKGl0ZW1faWQsIEl0ZW1Mb2MoCisgICAgICAgICAgICAgICAgaXRlbV9pZCwgY29uc3RydWN0aW9uX21ldGhvZCwgZGF0YV9yZWZlcmVuY2VfaW5kZXgsIGJhc2Vfb2Zmc2V0KSk7CisgICAgICAgIEl0ZW1Mb2MgJml0ZW0gPSBtSXRlbUxvY3MtPmVkaXRWYWx1ZUF0KGluZGV4KTsKKworICAgICAgICB1aW50MTZfdCBleHRlbnRfY291bnQ7CisgICAgICAgIGlmICghc291cmNlKCktPmdldFVJbnQxNihvZmZzZXQsICZleHRlbnRfY291bnQpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImV4dGVudF9jb3VudCAlZCIsIGV4dGVudF9jb3VudCk7CisKKyAgICAgICAgaWYgKGV4dGVudF9jb3VudCA+IDEgJiYgKG9mZnNldF9zaXplID09IDAgfHwgbGVuZ3RoX3NpemUgPT0gMCkpIHsKKyAgICAgICAgICAgIC8vIGlmIHRoZSBpdGVtIGlzIGRpdmlkZWMgaW50byBtb3JlIHRoYW4gb25lIGV4dGVudHMsIG9mZnNldCBhbmQKKyAgICAgICAgICAgIC8vIGxlbmd0aCBtdXN0IGJlIHByZXNlbnQuCisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSAyOworCisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgZXh0ZW50X2NvdW50OyBqKyspIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IGV4dGVudF9pbmRleCA9IDE7IC8vIGRlZmF1bHQ9MQorICAgICAgICAgICAgaWYgKCh2ZXJzaW9uKCkgPT0gMSB8fCB2ZXJzaW9uKCkgPT0gMikgJiYgKGluZGV4X3NpemUgPiAwKSkgeworICAgICAgICAgICAgICAgIGlmICghc291cmNlKCktPmdldFVJbnQ2NFZhcihvZmZzZXQsICZleHRlbnRfaW5kZXgsIGluZGV4X3NpemUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gVE9ETzogYWRkIHN1cHBvcnQgZm9yIHRoaXMgbW9kZQorICAgICAgICAgICAgICAgIG9mZnNldCArPSBpbmRleF9zaXplOworICAgICAgICAgICAgICAgIEFMT0dWKCJleHRlbnRfaW5kZXggJWxsZCIsIChsb25nIGxvbmcpZXh0ZW50X2luZGV4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDY0X3QgZXh0ZW50X29mZnNldCA9IDA7IC8vIGRlZmF1bHQ9MAorICAgICAgICAgICAgaWYgKG9mZnNldF9zaXplID4gMCkgeworICAgICAgICAgICAgICAgIGlmICghc291cmNlKCktPmdldFVJbnQ2NFZhcihvZmZzZXQsICZleHRlbnRfb2Zmc2V0LCBvZmZzZXRfc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gb2Zmc2V0X3NpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiZXh0ZW50X29mZnNldCAlbGxkIiwgKGxvbmcgbG9uZylleHRlbnRfb2Zmc2V0KTsKKworICAgICAgICAgICAgdWludDY0X3QgZXh0ZW50X2xlbmd0aCA9IDA7IC8vIHRoaXMgaW5kaWNhdGVzIGZ1bGwgbGVuZ3RoIG9mIGZpbGUKKyAgICAgICAgICAgIGlmIChsZW5ndGhfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50NjRWYXIob2Zmc2V0LCAmZXh0ZW50X2xlbmd0aCwgbGVuZ3RoX3NpemUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxlbmd0aF9zaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoImV4dGVudF9sZW5ndGggJWxsZCIsIChsb25nIGxvbmcpZXh0ZW50X2xlbmd0aCk7CisKKyAgICAgICAgICAgIGl0ZW0uYWRkRXh0ZW50KHsgZXh0ZW50X2luZGV4LCBleHRlbnRfb2Zmc2V0LCBleHRlbnRfbGVuZ3RoIH0pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIEl0ZW1SZWZlcmVuY2UgcmVsYXRlZCBib3hlcworLy8KKworc3RydWN0IEl0ZW1SZWZlcmVuY2UgOiBwdWJsaWMgQm94LCBwdWJsaWMgUmVmQmFzZSB7CisgICAgSXRlbVJlZmVyZW5jZShjb25zdCBzcDxEYXRhU291cmNlPiBzb3VyY2UsIHVpbnQzMl90IHR5cGUsIHVpbnQzMl90IGl0ZW1JZFNpemUpIDoKKyAgICAgICAgQm94KHNvdXJjZSwgdHlwZSksIG1JdGVtSWQoMCksIG1SZWZJZFNpemUoaXRlbUlkU2l6ZSkge30KKworICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisKKyAgICB1aW50MzJfdCBpdGVtSWQoKSB7IHJldHVybiBtSXRlbUlkOyB9CisKKyAgICB2b2lkIGFwcGx5KEtleWVkVmVjdG9yPHVpbnQzMl90LCBJbWFnZUl0ZW0+ICZpdGVtSWRUb0ltYWdlTWFwKSBjb25zdCB7CisgICAgICAgIHNzaXplX3QgaW1hZ2VJbmRleCA9IGl0ZW1JZFRvSW1hZ2VNYXAuaW5kZXhPZktleShtSXRlbUlkKTsKKworICAgICAgICAvLyBpZ25vcmUgbm9uLWltYWdlIGl0ZW1zCisgICAgICAgIGlmIChpbWFnZUluZGV4IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoImF0dGFjaCByZWZlcmVuY2UgdHlwZSAweCV4IHRvIGl0ZW0gaWQgJWQpIiwgdHlwZSgpLCBtSXRlbUlkKTsKKworICAgICAgICBpZiAodHlwZSgpID09IEZPVVJDQygnZCcsICdpJywgJ20nLCAnZycpKSB7CisgICAgICAgICAgICBJbWFnZUl0ZW0gJmltYWdlID0gaXRlbUlkVG9JbWFnZU1hcC5lZGl0VmFsdWVBdChpbWFnZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghaW1hZ2UuZGltZ1JlZnMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJkaW1nUmVmcyBpZiBub3QgY2xlYW4hIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbWFnZS5kaW1nUmVmcy5hcHBlbmRWZWN0b3IobVJlZnMpOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUoKSA9PSBGT1VSQ0MoJ3QnLCAnaCcsICdtJywgJ2InKSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUmVmcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGltYWdlSW5kZXggPSBpdGVtSWRUb0ltYWdlTWFwLmluZGV4T2ZLZXkobVJlZnNbaV0pOworCisgICAgICAgICAgICAgICAgLy8gaWdub3JlIG5vbi1pbWFnZSBpdGVtcworICAgICAgICAgICAgICAgIGlmIChpbWFnZUluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoIkltYWdlIGl0ZW0gaWQgJWQgdXNlcyB0aHVtYm5haWwgaXRlbSBpZCAlZCIsIG1SZWZzW2ldLCBtSXRlbUlkKTsKKyAgICAgICAgICAgICAgICBJbWFnZUl0ZW0gJmltYWdlID0gaXRlbUlkVG9JbWFnZU1hcC5lZGl0VmFsdWVBdChpbWFnZUluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAoIWltYWdlLnRodW1ibmFpbHMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiYWxyZWFkeSBoYXMgdGh1bWJuYWlscyEiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW1hZ2UudGh1bWJuYWlscy5wdXNoX2JhY2sobUl0ZW1JZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiaWdub3JpbmcgdW5zdXBwb3J0ZWQgcmVmIHR5cGUgMHgleCIsIHR5cGUoKSk7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgdWludDMyX3QgbUl0ZW1JZDsKKyAgICB1aW50MzJfdCBtUmVmSWRTaXplOworICAgIFZlY3Rvcjx1aW50MzJfdD4gbVJlZnM7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJdGVtUmVmZXJlbmNlKTsKK307CisKK3N0YXR1c190IEl0ZW1SZWZlcmVuY2U6OnBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChzaXplIDwgbVJlZklkU2l6ZSArIDIpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyVmFyKG9mZnNldCwgJm1JdGVtSWQsIG1SZWZJZFNpemUpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgb2Zmc2V0ICs9IG1SZWZJZFNpemU7CisKKyAgICB1aW50MTZfdCBjb3VudDsKKyAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MTYob2Zmc2V0LCAmY291bnQpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgb2Zmc2V0ICs9IDI7CisgICAgc2l6ZSAtPSAobVJlZklkU2l6ZSArIDIpOworCisgICAgaWYgKHNpemUgPCBjb3VudCAqIG1SZWZJZFNpemUpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgdWludDMyX3QgcmVmSXRlbUlkOworICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MzJWYXIob2Zmc2V0LCAmcmVmSXRlbUlkLCBtUmVmSWRTaXplKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSBtUmVmSWRTaXplOworICAgICAgICBtUmVmcy5wdXNoX2JhY2socmVmSXRlbUlkKTsKKyAgICAgICAgQUxPR1YoIml0ZW0gaWQgJWQ6IHJlZmVyZW5jaW5nIGl0ZW0gaWQgJWQiLCBtSXRlbUlkLCByZWZJdGVtSWQpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RydWN0IElyZWZCb3ggOiBwdWJsaWMgRnVsbEJveCB7CisgICAgSXJlZkJveChjb25zdCBzcDxEYXRhU291cmNlPiBzb3VyY2UsIFZlY3RvcjxzcDxJdGVtUmVmZXJlbmNlPiA+ICppdGVtUmVmcykgOgorICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ3InLCAnZScsICdmJykpLCBtUmVmSWRTaXplKDApLCBtSXRlbVJlZnMoaXRlbVJlZnMpIHt9CisKKyAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOworCitwcm90ZWN0ZWQ6CisgICAgc3RhdHVzX3Qgb25DaHVua0RhdGEodWludDMyX3QgdHlwZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICB1aW50MzJfdCBtUmVmSWRTaXplOworICAgIFZlY3RvcjxzcDxJdGVtUmVmZXJlbmNlPiA+ICptSXRlbVJlZnM7Cit9OworCitzdGF0dXNfdCBJcmVmQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworICAgIHN0YXR1c190IGVyciA9IHBhcnNlRnVsbEJveEhlYWRlcigmb2Zmc2V0LCAmc2l6ZSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIG1SZWZJZFNpemUgPSAodmVyc2lvbigpID09IDApID8gMiA6IDQ7CisgICAgcmV0dXJuIHBhcnNlQ2h1bmtzKG9mZnNldCwgc2l6ZSk7Cit9CisKK3N0YXR1c190IElyZWZCb3g6Om9uQ2h1bmtEYXRhKHVpbnQzMl90IHR5cGUsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIHNwPEl0ZW1SZWZlcmVuY2U+IGl0ZW1SZWYgPSBuZXcgSXRlbVJlZmVyZW5jZShzb3VyY2UoKSwgdHlwZSwgbVJlZklkU2l6ZSk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBpdGVtUmVmLT5wYXJzZShvZmZzZXQsIHNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgbUl0ZW1SZWZzLT5wdXNoX2JhY2soaXRlbVJlZik7CisgICAgcmV0dXJuIE9LOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSXRlbVByb3BlcnR5IHJlbGF0ZWQgYm94ZXMKKy8vCisKK3N0cnVjdCBBc3NvY2lhdGlvbkVudHJ5IHsKKyAgICB1aW50MzJfdCBpdGVtSWQ7CisgICAgYm9vbCBlc3NlbnRpYWw7CisgICAgdWludDE2X3QgaW5kZXg7Cit9OworCitzdHJ1Y3QgSXRlbVByb3BlcnR5IDogcHVibGljIFJlZkJhc2UgeworICAgIEl0ZW1Qcm9wZXJ0eSgpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoVG8oSW1hZ2VJdGVtICYvKmltYWdlKi8pIGNvbnN0IHsKKyAgICAgICAgQUxPR1coIlVucmVjb2duaXplZCBwcm9wZXJ0eSIpOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhcnNlKG9mZjY0X3QgLypvZmZzZXQqLywgc2l6ZV90IC8qc2l6ZSovKSB7CisgICAgICAgIEFMT0dXKCJVbnJlY29nbml6ZWQgcHJvcGVydHkiKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJdGVtUHJvcGVydHkpOworfTsKKworc3RydWN0IElzcGVCb3ggOiBwdWJsaWMgRnVsbEJveCwgcHVibGljIEl0ZW1Qcm9wZXJ0eSB7CisgICAgSXNwZUJveChjb25zdCBzcDxEYXRhU291cmNlPiBzb3VyY2UpIDoKKyAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygnaScsICdzJywgJ3AnLCAnZScpKSwgbVdpZHRoKDApLCBtSGVpZ2h0KDApIHt9CisKKyAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworCisgICAgdm9pZCBhdHRhY2hUbyhJbWFnZUl0ZW0gJmltYWdlKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIGltYWdlLndpZHRoID0gbVdpZHRoOworICAgICAgICBpbWFnZS5oZWlnaHQgPSBtSGVpZ2h0OworICAgIH0KKworcHJpdmF0ZToKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKK307CisKK3N0YXR1c190IElzcGVCb3g6OnBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIEFMT0dWKCIlczogb2Zmc2V0ICVsbGQsIHNpemUgJXp1IiwgX19GVU5DVElPTl9fLCAobG9uZyBsb25nKW9mZnNldCwgc2l6ZSk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUZ1bGxCb3hIZWFkZXIoJm9mZnNldCwgJnNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoc2l6ZSA8IDgpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyKG9mZnNldCwgJm1XaWR0aCkKKyAgICAgICAgICAgIHx8ICFzb3VyY2UoKS0+Z2V0VUludDMyKG9mZnNldCArIDQsICZtSGVpZ2h0KSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorICAgIEFMT0dWKCJwcm9wZXJ0eSBpc3BlOiAlZHglZCIsIG1XaWR0aCwgbUhlaWdodCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0cnVjdCBIdmNjQm94IDogcHVibGljIEJveCwgcHVibGljIEl0ZW1Qcm9wZXJ0eSB7CisgICAgSHZjY0JveChjb25zdCBzcDxEYXRhU291cmNlPiBzb3VyY2UpIDoKKyAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCdoJywgJ3YnLCAnYycsICdDJykpIHt9CisKKyAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworCisgICAgdm9pZCBhdHRhY2hUbyhJbWFnZUl0ZW0gJmltYWdlKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIGltYWdlLmh2Y2MgPSBtSFZDQzsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3A8QUJ1ZmZlcj4gbUhWQ0M7Cit9OworCitzdGF0dXNfdCBIdmNjQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworCisgICAgbUhWQ0MgPSBuZXcgQUJ1ZmZlcihzaXplKTsKKworICAgIGlmIChtSFZDQy0+ZGF0YSgpID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImIvMjg0NzEyMDYiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBpZiAoc291cmNlKCktPnJlYWRBdChvZmZzZXQsIG1IVkNDLT5kYXRhKCksIHNpemUpIDwgKHNzaXplX3Qpc2l6ZSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorCisgICAgQUxPR1YoInByb3BlcnR5IGh2Y0MiKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RydWN0IElyb3RCb3ggOiBwdWJsaWMgQm94LCBwdWJsaWMgSXRlbVByb3BlcnR5IHsKKyAgICBJcm90Qm94KGNvbnN0IHNwPERhdGFTb3VyY2U+IHNvdXJjZSkgOgorICAgICAgICBCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAncicsICdvJywgJ3QnKSksIG1BbmdsZSgwKSB7fQorCisgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKworICAgIHZvaWQgYXR0YWNoVG8oSW1hZ2VJdGVtICZpbWFnZSkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBpbWFnZS5yb3RhdGlvbiA9IG1BbmdsZSAqIDkwOworICAgIH0KKworcHJpdmF0ZToKKyAgICB1aW50OF90IG1BbmdsZTsKK307CisKK3N0YXR1c190IElyb3RCb3g6OnBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIEFMT0dWKCIlczogb2Zmc2V0ICVsbGQsIHNpemUgJXp1IiwgX19GVU5DVElPTl9fLCAobG9uZyBsb25nKW9mZnNldCwgc2l6ZSk7CisKKyAgICBpZiAoc2l6ZSA8IDEpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgaWYgKHNvdXJjZSgpLT5yZWFkQXQob2Zmc2V0LCAmbUFuZ2xlLCAxKSAhPSAxKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgbUFuZ2xlICY9IDB4MzsKKyAgICBBTE9HVigicHJvcGVydHkgaXJvdDogJWQiLCBtQW5nbGUpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdHJ1Y3QgQ29sckJveCA6IHB1YmxpYyBCb3gsIHB1YmxpYyBJdGVtUHJvcGVydHkgeworICAgIENvbHJCb3goY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlKSA6CisgICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygnYycsICdvJywgJ2wnLCAncicpKSB7fQorCisgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKworICAgIHZvaWQgYXR0YWNoVG8oSW1hZ2VJdGVtICZpbWFnZSkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBpbWFnZS5pY2MgPSBtSUNDRGF0YTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3A8QUJ1ZmZlcj4gbUlDQ0RhdGE7Cit9OworCitzdGF0dXNfdCBDb2xyQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworCisgICAgaWYgKHNpemUgPCA0KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIHVpbnQzMl90IGNvbG91cl90eXBlOworICAgIGlmICghc291cmNlKCktPmdldFVJbnQzMihvZmZzZXQsICZjb2xvdXJfdHlwZSkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICBvZmZzZXQgKz0gNDsKKyAgICBzaXplIC09IDQ7CisgICAgaWYgKGNvbG91cl90eXBlID09IEZPVVJDQygnbicsICdjJywgJ2wnLCAneCcpKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgaWYgKChjb2xvdXJfdHlwZSAhPSBGT1VSQ0MoJ3InLCAnSScsICdDJywgJ0MnKSkgJiYKKyAgICAgICAgKGNvbG91cl90eXBlICE9IEZPVVJDQygncCcsICdyJywgJ28nLCAnZicpKSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIG1JQ0NEYXRhID0gbmV3IEFCdWZmZXIoc2l6ZSk7CisgICAgaWYgKG1JQ0NEYXRhLT5kYXRhKCkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiYi8yODQ3MTIwNiIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIGlmIChzb3VyY2UoKS0+cmVhZEF0KG9mZnNldCwgbUlDQ0RhdGEtPmRhdGEoKSwgc2l6ZSkgIT0gKHNzaXplX3Qpc2l6ZSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorCisgICAgQUxPR1YoInByb3BlcnR5IENvbHI6IHNpemUgJXpkIiwgc2l6ZSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdHJ1Y3QgSXBtYUJveCA6IHB1YmxpYyBGdWxsQm94IHsKKyAgICBJcG1hQm94KGNvbnN0IHNwPERhdGFTb3VyY2U+IHNvdXJjZSwgVmVjdG9yPEFzc29jaWF0aW9uRW50cnk+ICphc3NvY2lhdGlvbnMpIDoKKyAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygnaScsICdwJywgJ20nLCAnYScpKSwgbUFzc29jaWF0aW9ucyhhc3NvY2lhdGlvbnMpIHt9CisKKyAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOworcHJpdmF0ZToKKyAgICBWZWN0b3I8QXNzb2NpYXRpb25FbnRyeT4gKm1Bc3NvY2lhdGlvbnM7Cit9OworCitzdGF0dXNfdCBJcG1hQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUZ1bGxCb3hIZWFkZXIoJm9mZnNldCwgJnNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoc2l6ZSA8IDQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgdWludDMyX3QgZW50cnlDb3VudDsKKyAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MzIob2Zmc2V0LCAmZW50cnlDb3VudCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICBvZmZzZXQgKz0gNDsKKyAgICBzaXplIC09IDQ7CisKKyAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IGVudHJ5Q291bnQ7ICsraykgeworICAgICAgICB1aW50MzJfdCBpdGVtSWQgPSAwOworICAgICAgICBzaXplX3QgaXRlbUlkU2l6ZSA9ICh2ZXJzaW9uKCkgPCAxKSA/IDIgOiA0OworCisgICAgICAgIGlmIChzaXplIDwgaXRlbUlkU2l6ZSArIDEpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MzJWYXIob2Zmc2V0LCAmaXRlbUlkLCBpdGVtSWRTaXplKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSBpdGVtSWRTaXplOworICAgICAgICBzaXplIC09IGl0ZW1JZFNpemU7CisKKyAgICAgICAgdWludDhfdCBhc3NvY2lhdGlvbkNvdW50OworICAgICAgICBpZiAoIXNvdXJjZSgpLT5yZWFkQXQob2Zmc2V0LCAmYXNzb2NpYXRpb25Db3VudCwgMSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQrKzsKKyAgICAgICAgc2l6ZS0tOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXNzb2NpYXRpb25Db3VudDsgKytpKSB7CisgICAgICAgICAgICBzaXplX3QgcHJvcEluZGV4U2l6ZSA9IChmbGFncygpICYgMSkgPyAyIDogMTsKKyAgICAgICAgICAgIGlmIChzaXplIDwgcHJvcEluZGV4U2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1aW50MTZfdCBwcm9wSW5kZXg7CisgICAgICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MTZWYXIob2Zmc2V0LCAmcHJvcEluZGV4LCBwcm9wSW5kZXhTaXplKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9mZnNldCArPSBwcm9wSW5kZXhTaXplOworICAgICAgICAgICAgc2l6ZSAtPSBwcm9wSW5kZXhTaXplOworICAgICAgICAgICAgdWludDE2X3QgYml0bWFzayA9ICgxIDw8ICg4ICogcHJvcEluZGV4U2l6ZSAtIDEpKTsKKyAgICAgICAgICAgIEFzc29jaWF0aW9uRW50cnkgZW50cnkgPSB7CisgICAgICAgICAgICAgICAgICAgIC5pdGVtSWQgPSBpdGVtSWQsCisgICAgICAgICAgICAgICAgICAgIC5lc3NlbnRpYWwgPSAhIShwcm9wSW5kZXggJiBiaXRtYXNrKSwKKyAgICAgICAgICAgICAgICAgICAgLmluZGV4ID0gKHVpbnQxNl90KSAocHJvcEluZGV4ICYgfmJpdG1hc2spCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBBTE9HVigiaXRlbSBpZCAlZCBhc3NvY2lhdGVkIHRvIHByb3BlcnR5ICVkIChlc3NlbnRpYWwgJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgaXRlbUlkLCBlbnRyeS5pbmRleCwgZW50cnkuZXNzZW50aWFsKTsKKworICAgICAgICAgICAgbUFzc29jaWF0aW9ucy0+cHVzaF9iYWNrKGVudHJ5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RydWN0IElwY29Cb3ggOiBwdWJsaWMgQm94IHsKKyAgICBJcGNvQm94KGNvbnN0IHNwPERhdGFTb3VyY2U+IHNvdXJjZSwgVmVjdG9yPHNwPEl0ZW1Qcm9wZXJ0eT4gPiAqcHJvcGVydGllcykgOgorICAgICAgICBCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAncCcsICdjJywgJ28nKSksIG1JdGVtUHJvcGVydGllcyhwcm9wZXJ0aWVzKSB7fQorCisgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKK3Byb3RlY3RlZDoKKyAgICBzdGF0dXNfdCBvbkNodW5rRGF0YSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIFZlY3RvcjxzcDxJdGVtUHJvcGVydHk+ID4gKm1JdGVtUHJvcGVydGllczsKK307CisKK3N0YXR1c190IElwY29Cb3g6OnBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIEFMT0dWKCIlczogb2Zmc2V0ICVsbGQsIHNpemUgJXp1IiwgX19GVU5DVElPTl9fLCAobG9uZyBsb25nKW9mZnNldCwgc2l6ZSk7CisgICAgLy8gcHVzaCBkdW1teSBhcyB0aGUgaW5kZXggaXMgMS1iYXNlZAorICAgIG1JdGVtUHJvcGVydGllcy0+cHVzaF9iYWNrKG5ldyBJdGVtUHJvcGVydHkoKSk7CisgICAgcmV0dXJuIHBhcnNlQ2h1bmtzKG9mZnNldCwgc2l6ZSk7Cit9CisKK3N0YXR1c190IElwY29Cb3g6Om9uQ2h1bmtEYXRhKHVpbnQzMl90IHR5cGUsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIHNwPEl0ZW1Qcm9wZXJ0eT4gaXRlbVByb3BlcnR5OworICAgIHN3aXRjaCh0eXBlKSB7CisgICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ3YnLCAnYycsICdDJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIGl0ZW1Qcm9wZXJ0eSA9IG5ldyBIdmNjQm94KHNvdXJjZSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ3MnLCAncCcsICdlJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIGl0ZW1Qcm9wZXJ0eSA9IG5ldyBJc3BlQm94KHNvdXJjZSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ3InLCAnbycsICd0Jyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIGl0ZW1Qcm9wZXJ0eSA9IG5ldyBJcm90Qm94KHNvdXJjZSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCdjJywgJ28nLCAnbCcsICdyJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIGl0ZW1Qcm9wZXJ0eSA9IG5ldyBDb2xyQm94KHNvdXJjZSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHB1c2ggZHVtbXkgdG8gbWFpbnRhaW4gY29ycmVjdCBpdGVtIHByb3BlcnR5IGluZGV4CisgICAgICAgICAgICBpdGVtUHJvcGVydHkgPSBuZXcgSXRlbVByb3BlcnR5KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGF0dXNfdCBlcnIgPSBpdGVtUHJvcGVydHktPnBhcnNlKG9mZnNldCwgc2l6ZSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBtSXRlbVByb3BlcnRpZXMtPnB1c2hfYmFjayhpdGVtUHJvcGVydHkpOworICAgIHJldHVybiBPSzsKK30KKworc3RydWN0IElwcnBCb3ggOiBwdWJsaWMgQm94IHsKKyAgICBJcHJwQm94KGNvbnN0IHNwPERhdGFTb3VyY2U+IHNvdXJjZSwKKyAgICAgICAgICAgIFZlY3RvcjxzcDxJdGVtUHJvcGVydHk+ID4gKnByb3BlcnRpZXMsCisgICAgICAgICAgICBWZWN0b3I8QXNzb2NpYXRpb25FbnRyeT4gKmFzc29jaWF0aW9ucykgOgorICAgICAgICBCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAncCcsICdyJywgJ3AnKSksCisgICAgICAgIG1Qcm9wZXJ0aWVzKHByb3BlcnRpZXMpLCBtQXNzb2NpYXRpb25zKGFzc29jaWF0aW9ucykge30KKworICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7Citwcm90ZWN0ZWQ6CisgICAgc3RhdHVzX3Qgb25DaHVua0RhdGEodWludDMyX3QgdHlwZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBWZWN0b3I8c3A8SXRlbVByb3BlcnR5PiA+ICptUHJvcGVydGllczsKKyAgICBWZWN0b3I8QXNzb2NpYXRpb25FbnRyeT4gKm1Bc3NvY2lhdGlvbnM7Cit9OworCitzdGF0dXNfdCBJcHJwQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworCisgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVua3Mob2Zmc2V0LCBzaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSXBycEJveDo6b25DaHVua0RhdGEodWludDMyX3QgdHlwZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgc3dpdGNoKHR5cGUpIHsKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAncCcsICdjJywgJ28nKToKKyAgICAgICAgeworICAgICAgICAgICAgSXBjb0JveCBpcGNvQm94KHNvdXJjZSgpLCBtUHJvcGVydGllcyk7CisgICAgICAgICAgICByZXR1cm4gaXBjb0JveC5wYXJzZShvZmZzZXQsIHNpemUpOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ3AnLCAnbScsICdhJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIElwbWFCb3ggaXBtYUJveChzb3VyY2UoKSwgbUFzc29jaWF0aW9ucyk7CisgICAgICAgICAgICByZXR1cm4gaXBtYUJveC5wYXJzZShvZmZzZXQsIHNpemUpOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dXKCJVbnJlY29nbml6ZWQgYm94LiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSXRlbUluZm8gcmVsYXRlZCBib3hlcworLy8KK3N0cnVjdCBJdGVtSW5mbyB7CisgICAgdWludDMyX3QgaXRlbUlkOworICAgIHVpbnQzMl90IGl0ZW1UeXBlOworfTsKKworc3RydWN0IEluZmVCb3ggOiBwdWJsaWMgRnVsbEJveCB7CisgICAgSW5mZUJveChjb25zdCBzcDxEYXRhU291cmNlPiBzb3VyY2UpIDoKKyAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygnaScsICduJywgJ2YnLCAnZScpKSB7fQorCisgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBJdGVtSW5mbyAqaXRlbUluZm8pOworCitwcml2YXRlOgorICAgIGJvb2wgcGFyc2VOdWxsVGVybWluYXRlZFN0cmluZyhvZmY2NF90ICpvZmZzZXQsIHNpemVfdCAqc2l6ZSwgU3RyaW5nOCAqb3V0KTsKK307CisKK2Jvb2wgSW5mZUJveDo6cGFyc2VOdWxsVGVybWluYXRlZFN0cmluZygKKyAgICAgICAgb2ZmNjRfdCAqb2Zmc2V0LCBzaXplX3QgKnNpemUsIFN0cmluZzggKm91dCkgeworICAgIGNoYXIgdG1wWzI1Nl07CisgICAgc2l6ZV90IGxlbiA9IDA7CisgICAgb2ZmNjRfdCBuZXdPZmZzZXQgPSAqb2Zmc2V0OworICAgIG9mZjY0X3Qgc3RvcE9mZnNldCA9ICpvZmZzZXQgKyAqc2l6ZTsKKyAgICB3aGlsZSAobmV3T2Zmc2V0IDwgc3RvcE9mZnNldCkgeworICAgICAgICBpZiAoIXNvdXJjZSgpLT5yZWFkQXQobmV3T2Zmc2V0KyssICZ0bXBbbGVuXSwgMSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodG1wW2xlbl0gPT0gMCkgeworICAgICAgICAgICAgb3V0LT5hcHBlbmQodG1wLCBsZW4pOworCisgICAgICAgICAgICAqb2Zmc2V0ID0gbmV3T2Zmc2V0OworICAgICAgICAgICAgKnNpemUgPSBzdG9wT2Zmc2V0IC0gbmV3T2Zmc2V0OworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKytsZW4gPj0gc2l6ZW9mKHRtcCkpIHsKKyAgICAgICAgICAgIG91dC0+YXBwZW5kKHRtcCwgbGVuKTsKKyAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0dXNfdCBJbmZlQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUsIEl0ZW1JbmZvICppdGVtSW5mbykgeworICAgIHN0YXR1c190IGVyciA9IHBhcnNlRnVsbEJveEhlYWRlcigmb2Zmc2V0LCAmc2l6ZSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICh2ZXJzaW9uKCkgPT0gMCB8fCB2ZXJzaW9uKCkgPT0gMSkgeworICAgICAgICBpZiAoc2l6ZSA8IDQpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgdWludDE2X3QgaXRlbV9pZDsKKyAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDE2KG9mZnNldCwgJml0ZW1faWQpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIml0ZW1faWQgJWQiLCBpdGVtX2lkKTsKKyAgICAgICAgdWludDE2X3QgaXRlbV9wcm90ZWN0aW9uX2luZGV4OworICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MTYob2Zmc2V0ICsgMiwgJml0ZW1fcHJvdGVjdGlvbl9pbmRleCkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQgKz0gNDsKKyAgICAgICAgc2l6ZSAtPSA0OworCisgICAgICAgIFN0cmluZzggaXRlbV9uYW1lOworICAgICAgICBpZiAoIXBhcnNlTnVsbFRlcm1pbmF0ZWRTdHJpbmcoJm9mZnNldCwgJnNpemUsICZpdGVtX25hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nOCBjb250ZW50X3R5cGU7CisgICAgICAgIGlmICghcGFyc2VOdWxsVGVybWluYXRlZFN0cmluZygmb2Zmc2V0LCAmc2l6ZSwgJmNvbnRlbnRfdHlwZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmc4IGNvbnRlbnRfZW5jb2Rpbmc7CisgICAgICAgIGlmICghcGFyc2VOdWxsVGVybWluYXRlZFN0cmluZygmb2Zmc2V0LCAmc2l6ZSwgJmNvbnRlbnRfZW5jb2RpbmcpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZlcnNpb24oKSA9PSAxKSB7CisgICAgICAgICAgICB1aW50MzJfdCBleHRlbnNpb25fdHlwZTsKKyAgICAgICAgICAgIGlmICghc291cmNlKCktPmdldFVJbnQzMihvZmZzZXQsICZleHRlbnNpb25fdHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvZmZzZXQrKzsKKyAgICAgICAgICAgIHNpemUtLTsKKyAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSB0aGlzIGNhc2UKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8vIHZlcnNpb24gPj0gMgorICAgICAgICB1aW50MzJfdCBpdGVtX2lkOworICAgICAgICBzaXplX3QgaXRlbUlkU2l6ZSA9ICh2ZXJzaW9uKCkgPT0gMikgPyAyIDogNDsKKyAgICAgICAgaWYgKHNpemUgPCBpdGVtSWRTaXplICsgNikgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MzJWYXIob2Zmc2V0LCAmaXRlbV9pZCwgaXRlbUlkU2l6ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiaXRlbV9pZCAlZCIsIGl0ZW1faWQpOworICAgICAgICBvZmZzZXQgKz0gaXRlbUlkU2l6ZTsKKyAgICAgICAgdWludDE2X3QgaXRlbV9wcm90ZWN0aW9uX2luZGV4OworICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MTYob2Zmc2V0LCAmaXRlbV9wcm90ZWN0aW9uX2luZGV4KSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJpdGVtX3Byb3RlY3Rpb25faW5kZXggJWQiLCBpdGVtX3Byb3RlY3Rpb25faW5kZXgpOworICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgdWludDMyX3QgaXRlbV90eXBlOworICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MzIob2Zmc2V0LCAmaXRlbV90eXBlKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICB9CisKKyAgICAgICAgaXRlbUluZm8tPml0ZW1JZCA9IGl0ZW1faWQ7CisgICAgICAgIGl0ZW1JbmZvLT5pdGVtVHlwZSA9IGl0ZW1fdHlwZTsKKworICAgICAgICBjaGFyIGl0ZW1UeXBlU3RyaW5nWzVdOworICAgICAgICBNYWtlRm91ckNDU3RyaW5nKGl0ZW1fdHlwZSwgaXRlbVR5cGVTdHJpbmcpOworICAgICAgICBBTE9HVigiaXRlbV90eXBlICVzIiwgaXRlbVR5cGVTdHJpbmcpOworICAgICAgICBvZmZzZXQgKz0gNDsKKyAgICAgICAgc2l6ZSAtPSBpdGVtSWRTaXplICsgNjsKKworICAgICAgICBTdHJpbmc4IGl0ZW1fbmFtZTsKKyAgICAgICAgaWYgKCFwYXJzZU51bGxUZXJtaW5hdGVkU3RyaW5nKCZvZmZzZXQsICZzaXplLCAmaXRlbV9uYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiaXRlbV9uYW1lICVzIiwgaXRlbV9uYW1lLmNfc3RyKCkpOworCisgICAgICAgIGlmIChpdGVtX3R5cGUgPT0gRk9VUkNDKCdtJywgJ2knLCAnbScsICdlJykpIHsKKyAgICAgICAgICAgIFN0cmluZzggY29udGVudF90eXBlOworICAgICAgICAgICAgaWYgKCFwYXJzZU51bGxUZXJtaW5hdGVkU3RyaW5nKCZvZmZzZXQsICZzaXplLCAmY29udGVudF90eXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZzggY29udGVudF9lbmNvZGluZzsKKyAgICAgICAgICAgIGlmICghcGFyc2VOdWxsVGVybWluYXRlZFN0cmluZygmb2Zmc2V0LCAmc2l6ZSwgJmNvbnRlbnRfZW5jb2RpbmcpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChpdGVtX3R5cGUgPT0gRk9VUkNDKCd1JywgJ3InLCAnaScsICcgJykpIHsKKyAgICAgICAgICAgIFN0cmluZzggaXRlbV91cmlfdHlwZTsKKyAgICAgICAgICAgIGlmICghcGFyc2VOdWxsVGVybWluYXRlZFN0cmluZygmb2Zmc2V0LCAmc2l6ZSwgJml0ZW1fdXJpX3R5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0cnVjdCBJaW5mQm94IDogcHVibGljIEZ1bGxCb3ggeworICAgIElpbmZCb3goY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlLCBWZWN0b3I8SXRlbUluZm8+ICppdGVtSW5mb3MpIDoKKyAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygnaScsICdpJywgJ24nLCAnZicpKSwKKyAgICAgICAgbUl0ZW1JbmZvcyhpdGVtSW5mb3MpLCBtSGFzR3JpZHMoZmFsc2UpIHt9CisKKyAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOworCisgICAgYm9vbCBoYXNHcmlkcygpIHsgcmV0dXJuIG1IYXNHcmlkczsgfQorCitwcm90ZWN0ZWQ6CisgICAgc3RhdHVzX3Qgb25DaHVua0RhdGEodWludDMyX3QgdHlwZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBWZWN0b3I8SXRlbUluZm8+ICptSXRlbUluZm9zOworICAgIGJvb2wgbUhhc0dyaWRzOworfTsKKworc3RhdHVzX3QgSWluZkJveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKworICAgIHN0YXR1c190IGVyciA9IHBhcnNlRnVsbEJveEhlYWRlcigmb2Zmc2V0LCAmc2l6ZSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHNpemVfdCBlbnRyeUNvdW50U2l6ZSA9IHZlcnNpb24oKSA9PSAwID8gMiA6IDQ7CisgICAgaWYgKHNpemUgPCBlbnRyeUNvdW50U2l6ZSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICB1aW50MzJfdCBlbnRyeV9jb3VudDsKKyAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MzJWYXIob2Zmc2V0LCAmZW50cnlfY291bnQsIGVudHJ5Q291bnRTaXplKSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorICAgIEFMT0dWKCJlbnRyeV9jb3VudCAlZCIsIGVudHJ5X2NvdW50KTsKKworICAgIG9mZjY0X3Qgc3RvcE9mZnNldCA9IG9mZnNldCArIHNpemU7CisgICAgb2Zmc2V0ICs9IGVudHJ5Q291bnRTaXplOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnlfY291bnQgJiYgb2Zmc2V0IDwgc3RvcE9mZnNldDsgaSsrKSB7CisgICAgICAgIEFMT0dWKCJlbnRyeSAlenUiLCBpKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuaygmb2Zmc2V0KTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAob2Zmc2V0ICE9IHN0b3BPZmZzZXQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IElpbmZCb3g6Om9uQ2h1bmtEYXRhKHVpbnQzMl90IHR5cGUsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIGlmICh0eXBlICE9IEZPVVJDQygnaScsICduJywgJ2YnLCAnZScpKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBJbmZlQm94IGluZmVCb3goc291cmNlKCkpOworICAgIEl0ZW1JbmZvIGl0ZW1JbmZvOworICAgIHN0YXR1c190IGVyciA9IGluZmVCb3gucGFyc2Uob2Zmc2V0LCBzaXplLCAmaXRlbUluZm8pOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgbUl0ZW1JbmZvcy0+cHVzaF9iYWNrKGl0ZW1JbmZvKTsKKyAgICBtSGFzR3JpZHMgfD0gKGl0ZW1JbmZvLml0ZW1UeXBlID09IEZPVVJDQygnZycsICdyJywgJ2knLCAnZCcpKTsKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitJdGVtVGFibGU6Okl0ZW1UYWJsZShjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKQorICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKKyAgICAgIG1QcmltYXJ5SXRlbUlkKDApLAorICAgICAgbUlkYXRPZmZzZXQoMCksCisgICAgICBtSWRhdFNpemUoMCksCisgICAgICBtSW1hZ2VJdGVtc1ZhbGlkKGZhbHNlKSwKKyAgICAgIG1DdXJyZW50SW1hZ2VJbmRleCgwKSB7CisgICAgbVJlcXVpcmVkQm94ZXMuaW5zZXJ0KCdpcHJwJyk7CisgICAgbVJlcXVpcmVkQm94ZXMuaW5zZXJ0KCdpbG9jJyk7CisgICAgbVJlcXVpcmVkQm94ZXMuaW5zZXJ0KCdwaXRtJyk7CisgICAgbVJlcXVpcmVkQm94ZXMuaW5zZXJ0KCdpaW5mJyk7Cit9CisKK0l0ZW1UYWJsZTo6fkl0ZW1UYWJsZSgpIHt9CisKK3N0YXR1c190IEl0ZW1UYWJsZTo6cGFyc2UodWludDMyX3QgdHlwZSwgb2ZmNjRfdCBkYXRhX29mZnNldCwgc2l6ZV90IGNodW5rX2RhdGFfc2l6ZSkgeworICAgIHN3aXRjaCh0eXBlKSB7CisgICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ2wnLCAnbycsICdjJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJzZUlsb2NCb3goZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAnaScsICduJywgJ2YnKToKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHBhcnNlSWluZkJveChkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdwJywgJ3InLCAncCcpOgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcGFyc2VJcHJwQm94KGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCdwJywgJ2knLCAndCcsICdtJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJzZVBpdG1Cb3goZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAnZCcsICdhJywgJ3QnKToKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHBhcnNlSWRhdEJveChkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdyJywgJ2UnLCAnZicpOgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcGFyc2VJcmVmQm94KGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ3AnLCAncicsICdvJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dXKCJpcHJvIGJveCBub3Qgc3VwcG9ydGVkISIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR1coInVucmVjb2duaXplZCBib3ggdHlwZTogMHgleCIsIHR5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBJdGVtVGFibGU6OnBhcnNlSWxvY0JveChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworCisgICAgSWxvY0JveCBpbG9jQm94KG1EYXRhU291cmNlLCAmbUl0ZW1Mb2NzKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbG9jQm94LnBhcnNlKG9mZnNldCwgc2l6ZSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmIChpbG9jQm94Lmhhc0NvbnN0cnVjdE1ldGhvZDEoKSkgeworICAgICAgICBtUmVxdWlyZWRCb3hlcy5pbnNlcnQoJ2lkYXQnKTsKKyAgICB9CisKKyAgICByZXR1cm4gYnVpbGRJbWFnZUl0ZW1zSWZQb3NzaWJsZSgnaWxvYycpOworfQorCitzdGF0dXNfdCBJdGVtVGFibGU6OnBhcnNlSWluZkJveChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworCisgICAgSWluZkJveCBpaW5mQm94KG1EYXRhU291cmNlLCAmbUl0ZW1JbmZvcyk7CisgICAgc3RhdHVzX3QgZXJyID0gaWluZkJveC5wYXJzZShvZmZzZXQsIHNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoaWluZkJveC5oYXNHcmlkcygpKSB7CisgICAgICAgIG1SZXF1aXJlZEJveGVzLmluc2VydCgnaXJlZicpOworICAgIH0KKworICAgIHJldHVybiBidWlsZEltYWdlSXRlbXNJZlBvc3NpYmxlKCdpaW5mJyk7Cit9CisKK3N0YXR1c190IEl0ZW1UYWJsZTo6cGFyc2VQaXRtQm94KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIEFMT0dWKCIlczogb2Zmc2V0ICVsbGQsIHNpemUgJXp1IiwgX19GVU5DVElPTl9fLCAobG9uZyBsb25nKW9mZnNldCwgc2l6ZSk7CisKKyAgICBQaXRtQm94IHBpdG1Cb3gobURhdGFTb3VyY2UpOworICAgIHN0YXR1c190IGVyciA9IHBpdG1Cb3gucGFyc2Uob2Zmc2V0LCBzaXplLCAmbVByaW1hcnlJdGVtSWQpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICByZXR1cm4gYnVpbGRJbWFnZUl0ZW1zSWZQb3NzaWJsZSgncGl0bScpOworfQorCitzdGF0dXNfdCBJdGVtVGFibGU6OnBhcnNlSXBycEJveChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworCisgICAgSXBycEJveCBpcHJwQm94KG1EYXRhU291cmNlLCAmbUl0ZW1Qcm9wZXJ0aWVzLCAmbUFzc29jaWF0aW9ucyk7CisgICAgc3RhdHVzX3QgZXJyID0gaXBycEJveC5wYXJzZShvZmZzZXQsIHNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICByZXR1cm4gYnVpbGRJbWFnZUl0ZW1zSWZQb3NzaWJsZSgnaXBycCcpOworfQorCitzdGF0dXNfdCBJdGVtVGFibGU6OnBhcnNlSWRhdEJveChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiJXM6IGlkYXQgb2Zmc2V0ICVsbGQsIHNpemUgJXp1IiwgX19GVU5DVElPTl9fLCAobG9uZyBsb25nKW9mZnNldCwgc2l6ZSk7CisKKyAgICAvLyBvbmx5IHJlbWVtYmVyIHRoZSBvZmZzZXQgYW5kIHNpemUgb2YgaWRhdCBib3ggZm9yIGxhdGVyIHVzZQorICAgIG1JZGF0T2Zmc2V0ID0gb2Zmc2V0OworICAgIG1JZGF0U2l6ZSA9IHNpemU7CisKKyAgICByZXR1cm4gYnVpbGRJbWFnZUl0ZW1zSWZQb3NzaWJsZSgnaWRhdCcpOworfQorCitzdGF0dXNfdCBJdGVtVGFibGU6OnBhcnNlSXJlZkJveChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworCisgICAgSXJlZkJveCBpcmVmQm94KG1EYXRhU291cmNlLCAmbUl0ZW1SZWZlcmVuY2VzKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBpcmVmQm94LnBhcnNlKG9mZnNldCwgc2l6ZSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybiBidWlsZEltYWdlSXRlbXNJZlBvc3NpYmxlKCdpcmVmJyk7Cit9CisKK3N0YXR1c190IEl0ZW1UYWJsZTo6YnVpbGRJbWFnZUl0ZW1zSWZQb3NzaWJsZSh1aW50MzJfdCB0eXBlKSB7CisgICAgaWYgKG1JbWFnZUl0ZW1zVmFsaWQpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIG1Cb3hlc1NlZW4uaW5zZXJ0KHR5cGUpOworCisgICAgLy8gbmVlZCBhdCBsZWFzdCAnaXBycCcsICdpbG9jJywgJ3BpdG0nLCAnaWluZic7CisgICAgLy8gbmVlZCAnaWRhdCcgaWYgYW55IGl0ZW1zIHVzZWQgY29uc3RydWN0aW9uX21ldGhvZCBvZiAyOworICAgIC8vIG5lZWQgJ2lyZWYnIGlmIHRoZXJlIGFyZSBncmlkcy4KKyAgICBpZiAoIXN0ZDo6aW5jbHVkZXMoCisgICAgICAgICAgICBtQm94ZXNTZWVuLmJlZ2luKCksIG1Cb3hlc1NlZW4uZW5kKCksCisgICAgICAgICAgICBtUmVxdWlyZWRCb3hlcy5iZWdpbigpLCBtUmVxdWlyZWRCb3hlcy5lbmQoKSkpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIEFMT0dWKCJidWlsZGluZyBpbWFnZSB0YWJsZS4uLiIpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSXRlbUluZm9zLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IEl0ZW1JbmZvICZpbmZvID0gbUl0ZW1JbmZvc1tpXTsKKworCisgICAgICAgIC8vIGlnbm9yZSBub24taW1hZ2UgaXRlbXMKKyAgICAgICAgaWYgKGluZm8uaXRlbVR5cGUgIT0gRk9VUkNDKCdnJywgJ3InLCAnaScsICdkJykgJiYKKyAgICAgICAgICAgIGluZm8uaXRlbVR5cGUgIT0gRk9VUkNDKCdoJywgJ3YnLCAnYycsICcxJykpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc3NpemVfdCBpbWFnZUluZGV4ID0gbUl0ZW1JZFRvSW1hZ2VNYXAuaW5kZXhPZktleShpbmZvLml0ZW1JZCk7CisgICAgICAgIGlmIChpbWFnZUluZGV4ID49IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJpZ25vcmluZyBkdXBsaWNhdGUgaW1hZ2UgaXRlbSBpZCAlZCIsIGluZm8uaXRlbUlkKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc3NpemVfdCBpbG9jSW5kZXggPSBtSXRlbUxvY3MuaW5kZXhPZktleShpbmZvLml0ZW1JZCk7CisgICAgICAgIGlmIChpbG9jSW5kZXggPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiaWxvYyBtaXNzaW5nIGZvciBpbWFnZSBpdGVtIGlkICVkIiwgaW5mby5pdGVtSWQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgSXRlbUxvYyAmaWxvYyA9IG1JdGVtTG9jc1tpbG9jSW5kZXhdOworCisgICAgICAgIG9mZjY0X3Qgb2Zmc2V0OworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgaWYgKGlsb2MuZ2V0TG9jKCZvZmZzZXQsICZzaXplLCBtSWRhdE9mZnNldCwgbUlkYXRTaXplKSAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIEltYWdlSXRlbSBpbWFnZShpbmZvLml0ZW1UeXBlKTsKKworICAgICAgICBBTE9HVigiYWRkaW5nICVzOiBpdGVtSWQgJWQiLCBpbWFnZS5pc0dyaWQoKSA/ICJncmlkIiA6ICJpbWFnZSIsIGluZm8uaXRlbUlkKTsKKworICAgICAgICBpZiAoaW1hZ2UuaXNHcmlkKCkpIHsKKyAgICAgICAgICAgIGlmIChzaXplID4gMTIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDhfdCBidWZbMTJdOworICAgICAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgYnVmLCBzaXplKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW1hZ2Uucm93cyA9IGJ1ZlsyXSArIDE7CisgICAgICAgICAgICBpbWFnZS5jb2x1bW5zID0gYnVmWzNdICsgMTsKKworICAgICAgICAgICAgQUxPR1YoInJvd3MgJWQsIGNvbHVtYW5zICVkIiwgaW1hZ2Uucm93cywgaW1hZ2UuY29sdW1ucyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbWFnZS5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgICAgICBpbWFnZS5zaXplID0gc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBtSXRlbUlkVG9JbWFnZU1hcC5hZGQoaW5mby5pdGVtSWQsIGltYWdlKTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Bc3NvY2lhdGlvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgYXR0YWNoUHJvcGVydHkobUFzc29jaWF0aW9uc1tpXSk7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSXRlbVJlZmVyZW5jZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUl0ZW1SZWZlcmVuY2VzW2ldLT5hcHBseShtSXRlbUlkVG9JbWFnZU1hcCk7CisgICAgfQorCisgICAgbUltYWdlSXRlbXNWYWxpZCA9IHRydWU7CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEl0ZW1UYWJsZTo6YXR0YWNoUHJvcGVydHkoY29uc3QgQXNzb2NpYXRpb25FbnRyeSAmYXNzb2NpYXRpb24pIHsKKyAgICBzc2l6ZV90IGltYWdlSW5kZXggPSBtSXRlbUlkVG9JbWFnZU1hcC5pbmRleE9mS2V5KGFzc29jaWF0aW9uLml0ZW1JZCk7CisKKyAgICAvLyBpZ25vcmUgbm9uLWltYWdlIGl0ZW1zCisgICAgaWYgKGltYWdlSW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50MTZfdCBwcm9wZXJ0eUluZGV4ID0gYXNzb2NpYXRpb24uaW5kZXg7CisgICAgaWYgKHByb3BlcnR5SW5kZXggPj0gbUl0ZW1Qcm9wZXJ0aWVzLnNpemUoKSkgeworICAgICAgICBBTE9HVygiSWdub3JpbmcgaW52YWxpZCBwcm9wZXJ0eSBpbmRleCAlZCIsIHByb3BlcnR5SW5kZXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1YoImF0dGFjaCBwcm9wZXJ0eSAlZCB0byBpdGVtIGlkICVkKSIsCisgICAgICAgICAgICBwcm9wZXJ0eUluZGV4LCBhc3NvY2lhdGlvbi5pdGVtSWQpOworCisgICAgbUl0ZW1Qcm9wZXJ0aWVzW3Byb3BlcnR5SW5kZXhdLT5hdHRhY2hUbygKKyAgICAgICAgICAgIG1JdGVtSWRUb0ltYWdlTWFwLmVkaXRWYWx1ZUF0KGltYWdlSW5kZXgpKTsKK30KKworc3A8TWV0YURhdGE+IEl0ZW1UYWJsZTo6Z2V0SW1hZ2VNZXRhKCkgeworICAgIGlmICghbUltYWdlSXRlbXNWYWxpZCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzc2l6ZV90IGltYWdlSW5kZXggPSBtSXRlbUlkVG9JbWFnZU1hcC5pbmRleE9mS2V5KG1QcmltYXJ5SXRlbUlkKTsKKyAgICBpZiAoaW1hZ2VJbmRleCA8IDApIHsKKyAgICAgICAgQUxPR0UoIlByaW1hcnkgaXRlbSBpZCAlZCBub3QgZm91bmQhIiwgbVByaW1hcnlJdGVtSWQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBBTE9HVigicHJpbWFyeSBpbWFnZSBpbmRleCAlenUiLCBpbWFnZUluZGV4KTsKKworICAgIGNvbnN0IEltYWdlSXRlbSAqaW1hZ2UgPSAmbUl0ZW1JZFRvSW1hZ2VNYXBbaW1hZ2VJbmRleF07CisKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKKyAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQyk7CisKKyAgICBBTE9HVigic2V0dGluZyBpbWFnZSBzaXplICVkeCVkIiwgaW1hZ2UtPndpZHRoLCBpbWFnZS0+aGVpZ2h0KTsKKyAgICBtZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIGltYWdlLT53aWR0aCk7CisgICAgbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaW1hZ2UtPmhlaWdodCk7CisgICAgaWYgKGltYWdlLT5yb3RhdGlvbiAhPSAwKSB7CisgICAgICAgIC8vIFJvdGF0aW9uIGFuZ2xlIGluIEhFSUYgaXMgQ0NXLCBjb252ZXJ0IHRvIENXIGhlcmUgdG8gYmUKKyAgICAgICAgLy8gY29uc2lzdGVudCB3aXRoIHRoZSBvdGhlciBtZWRpYSBmb3JtYXRzLgorICAgICAgICBzd2l0Y2goaW1hZ2UtPnJvdGF0aW9uKSB7CisgICAgICAgICAgICBjYXNlIDkwOiBtZXRhLT5zZXRJbnQzMihrS2V5Um90YXRpb24sIDI3MCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxODA6IG1ldGEtPnNldEludDMyKGtLZXlSb3RhdGlvbiwgMTgwKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI3MDogbWV0YS0+c2V0SW50MzIoa0tleVJvdGF0aW9uLCA5MCk7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogYnJlYWs7IC8vIGRvbid0IHNldCBpZiBpbnZhbGlkCisgICAgICAgIH0KKyAgICB9CisgICAgbWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgaW1hZ2UtPndpZHRoICogaW1hZ2UtPmhlaWdodCAqIDEuNSk7CisKKyAgICBpZiAoIWltYWdlLT50aHVtYm5haWxzLmVtcHR5KCkpIHsKKyAgICAgICAgc3NpemVfdCB0aHVtYm5haWxJbmRleCA9IG1JdGVtSWRUb0ltYWdlTWFwLmluZGV4T2ZLZXkoaW1hZ2UtPnRodW1ibmFpbHNbMF0pOworICAgICAgICBpZiAodGh1bWJuYWlsSW5kZXggPj0gMCkgeworICAgICAgICAgICAgY29uc3QgSW1hZ2VJdGVtICZ0aHVtYm5haWwgPSBtSXRlbUlkVG9JbWFnZU1hcFt0aHVtYm5haWxJbmRleF07CisKKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUaHVtYm5haWxXaWR0aCwgdGh1bWJuYWlsLndpZHRoKTsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUaHVtYm5haWxIZWlnaHQsIHRodW1ibmFpbC5oZWlnaHQpOworICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5VGh1bWJuYWlsSFZDQywga1R5cGVIVkNDLAorICAgICAgICAgICAgICAgICAgICB0aHVtYm5haWwuaHZjYy0+ZGF0YSgpLCB0aHVtYm5haWwuaHZjYy0+c2l6ZSgpKTsKKyAgICAgICAgICAgIEFMT0dWKCJ0aHVtYm5haWwgbWV0YTogJWR4JWQsIGluZGV4ICV6ZCIsCisgICAgICAgICAgICAgICAgICAgIHRodW1ibmFpbC53aWR0aCwgdGh1bWJuYWlsLmhlaWdodCwgdGh1bWJuYWlsSW5kZXgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIlJlZmVyZW5jZWQgdGh1bWJuYWlsIGRvZXMgbm90IGV4aXN0ISIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGltYWdlLT5pc0dyaWQoKSkgeworICAgICAgICBzc2l6ZV90IHRpbGVJbmRleCA9IG1JdGVtSWRUb0ltYWdlTWFwLmluZGV4T2ZLZXkoaW1hZ2UtPmRpbWdSZWZzWzBdKTsKKyAgICAgICAgaWYgKHRpbGVJbmRleCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIC8vIHdoZW4gdGhlcmUgYXJlIHRpbGVzLCAoa0tleVdpZHRoLCBrS2V5SGVpZ2h0KSBpcyB0aGUgZnVsbCB0aWxlZCBhcmVhLAorICAgICAgICAvLyBhbmQgKGtLZXlEaXNwbGF5V2lkdGgsIGtLZXlEaXNwbGF5SGVpZ2h0KSBtYXkgYmUgc21hbGxlciB0aGFuIHRoYXQuCisgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlEaXNwbGF5V2lkdGgsIGltYWdlLT53aWR0aCk7CisgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlEaXNwbGF5SGVpZ2h0LCBpbWFnZS0+aGVpZ2h0KTsKKyAgICAgICAgaW50MzJfdCBncmlkUm93cyA9IGltYWdlLT5yb3dzLCBncmlkQ29scyA9IGltYWdlLT5jb2x1bW5zOworCisgICAgICAgIC8vIHBvaW50IGltYWdlIHRvIHRoZSBmaXJzdCB0aWxlIGZvciBncmlkIHNpemUgYW5kIEhWQ0MKKyAgICAgICAgaW1hZ2UgPSAmbUl0ZW1JZFRvSW1hZ2VNYXAuZWRpdFZhbHVlQXQodGlsZUluZGV4KTsKKyAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCBpbWFnZS0+d2lkdGggKiBncmlkQ29scyk7CisgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGltYWdlLT5oZWlnaHQgKiBncmlkUm93cyk7CisgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlHcmlkV2lkdGgsIGltYWdlLT53aWR0aCk7CisgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlHcmlkSGVpZ2h0LCBpbWFnZS0+aGVpZ2h0KTsKKyAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgaW1hZ2UtPndpZHRoICogaW1hZ2UtPmhlaWdodCAqIDEuNSk7CisgICAgfQorCisgICAgaWYgKGltYWdlLT5odmNjID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImh2Y2MgaXMgbWlzc2luZyEiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1ldGEtPnNldERhdGEoa0tleUhWQ0MsIGtUeXBlSFZDQywgaW1hZ2UtPmh2Y2MtPmRhdGEoKSwgaW1hZ2UtPmh2Y2MtPnNpemUoKSk7CisKKyAgICBpZiAoaW1hZ2UtPmljYyAhPSBOVUxMKSB7CisgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUljY1Byb2ZpbGUsIDAsIGltYWdlLT5pY2MtPmRhdGEoKSwgaW1hZ2UtPmljYy0+c2l6ZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIG1ldGE7Cit9CisKK3VpbnQzMl90IEl0ZW1UYWJsZTo6Y291bnRJbWFnZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbWFnZUl0ZW1zVmFsaWQgPyBtSXRlbUlkVG9JbWFnZU1hcC5zaXplKCkgOiAwOworfQorCitzdGF0dXNfdCBJdGVtVGFibGU6OmZpbmRQcmltYXJ5SW1hZ2UodWludDMyX3QgKmltYWdlSW5kZXgpIHsKKyAgICBpZiAoIW1JbWFnZUl0ZW1zVmFsaWQpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHNzaXplX3QgaW5kZXggPSBtSXRlbUlkVG9JbWFnZU1hcC5pbmRleE9mS2V5KG1QcmltYXJ5SXRlbUlkKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgKmltYWdlSW5kZXggPSBpbmRleDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEl0ZW1UYWJsZTo6ZmluZFRodW1ibmFpbCh1aW50MzJfdCAqaW1hZ2VJbmRleCkgeworICAgIGlmICghbUltYWdlSXRlbXNWYWxpZCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3NpemVfdCBwcmltYXJ5SW5kZXggPSBtSXRlbUlkVG9JbWFnZU1hcC5pbmRleE9mS2V5KG1QcmltYXJ5SXRlbUlkKTsKKyAgICBpZiAocHJpbWFyeUluZGV4IDwgMCkgeworICAgICAgICBBTE9HRSgiUHJpbWFyeSBpdGVtIGlkICVkIG5vdCBmb3VuZCEiLCBtUHJpbWFyeUl0ZW1JZCk7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgY29uc3QgSW1hZ2VJdGVtICZwcmltYXJ5SW1hZ2UgPSBtSXRlbUlkVG9JbWFnZU1hcFtwcmltYXJ5SW5kZXhdOworICAgIGlmIChwcmltYXJ5SW1hZ2UudGh1bWJuYWlscy5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dXKCJVc2luZyBwcmltYXJ5IGluIHBsYWNlIG9mIHRodW1ibmFpbC4iKTsKKyAgICAgICAgKmltYWdlSW5kZXggPSBwcmltYXJ5SW5kZXg7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzc2l6ZV90IHRodW1ibmFpbEluZGV4ID0gbUl0ZW1JZFRvSW1hZ2VNYXAuaW5kZXhPZktleSgKKyAgICAgICAgICAgIHByaW1hcnlJbWFnZS50aHVtYm5haWxzWzBdKTsKKyAgICBpZiAodGh1bWJuYWlsSW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dFKCJUaHVtYm5haWwgaXRlbSBpZCAlZCBub3QgZm91bmQhIiwgcHJpbWFyeUltYWdlLnRodW1ibmFpbHNbMF0pOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgICppbWFnZUluZGV4ID0gdGh1bWJuYWlsSW5kZXg7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBJdGVtVGFibGU6OmdldEltYWdlT2Zmc2V0QW5kU2l6ZSgKKyAgICAgICAgdWludDMyX3QgKmltYWdlSW5kZXgsIG9mZjY0X3QgKm9mZnNldCwgc2l6ZV90ICpzaXplKSB7CisgICAgaWYgKCFtSW1hZ2VJdGVtc1ZhbGlkKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAoaW1hZ2VJbmRleCAhPSBOVUxMKSB7CisgICAgICAgIGlmICgqaW1hZ2VJbmRleCA+PSBtSXRlbUlkVG9JbWFnZU1hcC5zaXplKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJCYWQgaW1hZ2UgaW5kZXghIik7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIG1DdXJyZW50SW1hZ2VJbmRleCA9ICppbWFnZUluZGV4OworICAgIH0KKworICAgIEltYWdlSXRlbSAmaW1hZ2UgPSBtSXRlbUlkVG9JbWFnZU1hcC5lZGl0VmFsdWVBdChtQ3VycmVudEltYWdlSW5kZXgpOworICAgIGlmIChpbWFnZS5pc0dyaWQoKSkgeworICAgICAgICB1aW50MzJfdCB0aWxlSXRlbUlkOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBpbWFnZS5nZXROZXh0VGlsZUl0ZW1JZCgmdGlsZUl0ZW1JZCwgaW1hZ2VJbmRleCAhPSBOVUxMKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBzc2l6ZV90IHRpbGVJbWFnZUluZGV4ID0gbUl0ZW1JZFRvSW1hZ2VNYXAuaW5kZXhPZktleSh0aWxlSXRlbUlkKTsKKyAgICAgICAgaWYgKHRpbGVJbWFnZUluZGV4IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKyAgICAgICAgKm9mZnNldCA9IG1JdGVtSWRUb0ltYWdlTWFwW3RpbGVJbWFnZUluZGV4XS5vZmZzZXQ7CisgICAgICAgICpzaXplID0gbUl0ZW1JZFRvSW1hZ2VNYXBbdGlsZUltYWdlSW5kZXhdLnNpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGltYWdlSW5kZXggPT0gTlVMTCkgeworICAgICAgICAgICAgLy8gRm9yIHNpbmdsZSBpbWFnZXMsIHdlIG9ubHkgYWxsb3cgaXQgdG8gYmUgcmVhZCBvbmNlLCBhZnRlciB0aGF0CisgICAgICAgICAgICAvLyBpdCdzIEVPUy4gIE5ldyBpbWFnZSBpbmRleCBtdXN0IGJlIHJlcXVlc3RlZCBlYWNoIHRpbWUuCisgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgfQorICAgICAgICAqb2Zmc2V0ID0gbUl0ZW1JZFRvSW1hZ2VNYXBbbUN1cnJlbnRJbWFnZUluZGV4XS5vZmZzZXQ7CisgICAgICAgICpzaXplID0gbUl0ZW1JZFRvSW1hZ2VNYXBbbUN1cnJlbnRJbWFnZUluZGV4XS5zaXplOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworfSAvLyBuYW1lc3BhY2UgaGVpZgorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwCmluZGV4IDQ0NWE4NjEuLjEwNGIzMjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAKQEAgLTI4LDYgKzI4LDcgQEAKIAogI2luY2x1ZGUgImluY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJpbmNsdWRlL1NhbXBsZVRhYmxlLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9JdGVtVGFibGUuaCIKICNpbmNsdWRlICJpbmNsdWRlL0VTRFMuaCIKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgpAQCAtMzYsNiArMzcsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgpAQCAtNzIsNyArNzQsOCBAQAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPFNhbXBsZVRhYmxlPiAmc2FtcGxlVGFibGUsCiAgICAgICAgICAgICAgICAgVmVjdG9yPFNpZHhFbnRyeT4gJnNpZHgsCiAgICAgICAgICAgICAgICAgY29uc3QgVHJleCAqdHJleCwKLSAgICAgICAgICAgICAgICBvZmY2NF90IGZpcnN0TW9vZk9mZnNldCk7CisgICAgICAgICAgICAgICAgb2ZmNjRfdCBmaXJzdE1vb2ZPZmZzZXQsCisgICAgICAgICAgICAgICAgY29uc3Qgc3A8SXRlbVRhYmxlPiAmaXRlbVRhYmxlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXQoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOwpAQCAtMTM0LDYgKzEzNyw5IEBACiAKICAgICB1aW50OF90ICptU3JjQnVmZmVyOwogCisgICAgYm9vbCBtSXNIRUlGOworICAgIHNwPEl0ZW1UYWJsZT4gbUl0ZW1UYWJsZTsKKwogICAgIHNpemVfdCBwYXJzZU5BTFNpemUoY29uc3QgdWludDhfdCAqZGF0YSkgY29uc3Q7CiAgICAgc3RhdHVzX3QgcGFyc2VDaHVuayhvZmY2NF90ICpvZmZzZXQpOwogICAgIHN0YXR1c190IHBhcnNlVHJhY2tGcmFnbWVudEhlYWRlcihvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBzaXplKTsKQEAgLTI4NSw0NSArMjkxLDYgQEAKIAogc3RhdGljIGNvbnN0IGJvb2wga1VzZUhleER1bXAgPSBmYWxzZTsKIAotc3RhdGljIHZvaWQgaGV4ZHVtcChjb25zdCB2b2lkICpfZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBjb25zdCB1aW50OF90ICpkYXRhID0gKGNvbnN0IHVpbnQ4X3QgKilfZGF0YTsKLSAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKLSAgICB3aGlsZSAob2Zmc2V0IDwgc2l6ZSkgewotICAgICAgICBwcmludGYoIjB4JTA0enggICIsIG9mZnNldCk7Ci0KLSAgICAgICAgc2l6ZV90IG4gPSBzaXplIC0gb2Zmc2V0OwotICAgICAgICBpZiAobiA+IDE2KSB7Ci0gICAgICAgICAgICBuID0gMTY7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDE2OyArK2kpIHsKLSAgICAgICAgICAgIGlmIChpID09IDgpIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIiAiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG9mZnNldCArIGkgPCBzaXplKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIlMDJ4ICIsIGRhdGFbb2Zmc2V0ICsgaV0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIiAgICIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpbnRmKCIgIik7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgICAgIGlmIChpc3ByaW50KGRhdGFbb2Zmc2V0ICsgaV0pKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIlYyIsIGRhdGFbb2Zmc2V0ICsgaV0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIi4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaW50ZigiXG4iKTsKLQotICAgICAgICBvZmZzZXQgKz0gMTY7Ci0gICAgfQotfQotCiBzdGF0aWMgY29uc3QgY2hhciAqRm91ckNDMk1JTUUodWludDMyX3QgZm91cmNjKSB7CiAgICAgc3dpdGNoIChmb3VyY2MpIHsKICAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ2EnKToKQEAgLTM3OCw2ICszNDUsNyBAQAogICAgICAgbUluaXRDaGVjayhOT19JTklUKSwKICAgICAgIG1IZWFkZXJUaW1lc2NhbGUoMCksCiAgICAgICBtSXNRVChmYWxzZSksCisgICAgICBtSXNIRUlGKGZhbHNlKSwKICAgICAgIG1GaXJzdFRyYWNrKE5VTEwpLAogICAgICAgbUxhc3RUcmFjayhOVUxMKSwKICAgICAgIG1GaWxlTWV0YURhdGEobmV3IE1ldGFEYXRhKSwKQEAgLTM4Niw2ICszNTQsMTAgQEAKIH0KIAogTVBFRzRFeHRyYWN0b3I6On5NUEVHNEV4dHJhY3RvcigpIHsKKyAgICByZWxlYXNlKCk7Cit9CisKK3ZvaWQgTVBFRzRFeHRyYWN0b3I6OnJlbGVhc2UoKSB7CiAgICAgVHJhY2sgKnRyYWNrID0gbUZpcnN0VHJhY2s7CiAgICAgd2hpbGUgKHRyYWNrKSB7CiAgICAgICAgIFRyYWNrICpuZXh0ID0gdHJhY2stPm5leHQ7CkBAIC00MDcsNiArMzc5LDEyIEBACiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUHNzaC5zaXplKCk7IGkrKykgewogICAgICAgICBkZWxldGUgW10gbVBzc2hbaV0uZGF0YTsKICAgICB9CisgICAgbVBzc2guY2xlYXIoKTsKKworICAgIGlmIChtRGF0YVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIG1EYXRhU291cmNlLT5jbG9zZSgpOworICAgICAgICBtRGF0YVNvdXJjZS5jbGVhcigpOworICAgIH0KIH0KIAogdWludDMyX3QgTVBFRzRFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgewpAQCAtNTcyLDE0ICs1NTAsNiBAQAogICAgIHJldHVybiB0cmFjay0+bWV0YTsKIH0KIAotc3RhdGljIHZvaWQgTWFrZUZvdXJDQ1N0cmluZyh1aW50MzJfdCB4LCBjaGFyICpzKSB7Ci0gICAgc1swXSA9IHggPj4gMjQ7Ci0gICAgc1sxXSA9ICh4ID4+IDE2KSAmIDB4ZmY7Ci0gICAgc1syXSA9ICh4ID4+IDgpICYgMHhmZjsKLSAgICBzWzNdID0geCAmIDB4ZmY7Ci0gICAgc1s0XSA9ICdcMCc7Ci19Ci0KIHN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpyZWFkTWV0YURhdGEoKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gTk9fSU5JVCkgewogICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKQEAgLTU4OSw3ICs1NTksOCBAQAogICAgIHN0YXR1c190IGVycjsKICAgICBib29sIHNhd01vb3ZPclNpZHggPSBmYWxzZTsKIAotICAgIHdoaWxlICghKHNhd01vb3ZPclNpZHggJiYgKG1NZGF0Rm91bmQgfHwgbU1vb2ZGb3VuZCkpKSB7CisgICAgd2hpbGUgKCEoKHNhd01vb3ZPclNpZHggJiYgKG1NZGF0Rm91bmQgfHwgbU1vb2ZGb3VuZCkpIHx8CisgICAgICAgICAgICAobUlzSEVJRiAmJiAobUl0ZW1UYWJsZSAhPSBOVUxMKSAmJiBtSXRlbVRhYmxlLT5pc1ZhbGlkKCkpKSkgewogICAgICAgICBvZmY2NF90IG9yaWdfb2Zmc2V0ID0gb2Zmc2V0OwogICAgICAgICBlcnIgPSBwYXJzZUNodW5rKCZvZmZzZXQsIDApOwogCkBAIC02NDEsNiArNjEyLDI5IEBACiAgICAgICAgIG1GaWxlTWV0YURhdGEtPnNldERhdGEoa0tleVBzc2gsICdwc3NoJywgYnVmLCBwc3Noc2l6ZSk7CiAgICAgICAgIGZyZWUoYnVmKTsKICAgICB9CisKKyAgICBpZiAobUlzSEVJRikgeworICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1JdGVtVGFibGUtPmdldEltYWdlTWV0YSgpOworICAgICAgICBpZiAobWV0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgVHJhY2sgKnRyYWNrID0gbUxhc3RUcmFjazsKKyAgICAgICAgaWYgKHRyYWNrICE9IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dXKCJ0cmFjayBpcyBzZXQgYmVmb3JlIG1ldGFkYXRhIGlzIGZ1bGx5IHByb2Nlc3NlZCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJhY2sgPSBuZXcgVHJhY2s7CisgICAgICAgICAgICB0cmFjay0+bmV4dCA9IE5VTEw7CisgICAgICAgICAgICBtRmlyc3RUcmFjayA9IG1MYXN0VHJhY2sgPSB0cmFjazsKKyAgICAgICAgfQorCisgICAgICAgIHRyYWNrLT5tZXRhID0gbWV0YTsKKyAgICAgICAgdHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlUcmFja0lELCAwKTsKKyAgICAgICAgdHJhY2stPmluY2x1ZGVzX2V4cGVuc2l2ZV9tZXRhZGF0YSA9IGZhbHNlOworICAgICAgICB0cmFjay0+c2tpcFRyYWNrID0gZmFsc2U7CisgICAgICAgIHRyYWNrLT50aW1lc2NhbGUgPSAwOworICAgIH0KKwogICAgIHJldHVybiBtSW5pdENoZWNrOwogfQogCkBAIC0xMDI3LDggKzEwMjEsOSBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUgPSBuZXcgU2FtcGxlVGFibGUobURhdGFTb3VyY2UpOwogICAgICAgICAgICAgfQpAQCAtMTE4NCw4ICsxMTc5LDkgQEAKICAgICAgICAgICAgIG9yaWdpbmFsX2ZvdXJjYyA9IG50b2hsKG9yaWdpbmFsX2ZvdXJjYyk7CiAgICAgICAgICAgICBBTE9HVigicmVhZCBvcmlnaW5hbCBmb3JtYXQ6ICVkIiwgb3JpZ2luYWxfZm91cmNjKTsKIAotICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgRm91ckNDMk1JTUUob3JpZ2luYWxfZm91cmNjKSk7CiAgICAgICAgICAgICB1aW50MzJfdCBudW1fY2hhbm5lbHMgPSAwOwpAQCAtMTYyNSw4ICsxNjIxLDkgQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAndCcsICdjJywgJ28nKToKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2MnLCAnbycsICc2JywgJzQnKToKICAgICAgICAgewotICAgICAgICAgICAgaWYgKChtTGFzdFRyYWNrID09IE5VTEwpIHx8IChtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZSA9PSBOVUxMKSkKKyAgICAgICAgICAgIGlmICgobUxhc3RUcmFjayA9PSBOVUxMKSB8fCAobUxhc3RUcmFjay0+c2FtcGxlVGFibGUgPT0gTlVMTCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPQogICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5zZXRDaHVua09mZnNldFBhcmFtcygKQEAgLTE2NjIsOCArMTY1OSw5IEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAncycsICd6Jyk6CiAgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAneicsICcyJyk6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICgobUxhc3RUcmFjayA9PSBOVUxMKSB8fCAobUxhc3RUcmFjay0+c2FtcGxlVGFibGUgPT0gTlVMTCkpCisgICAgICAgICAgICBpZiAoKG1MYXN0VHJhY2sgPT0gTlVMTCkgfHwgKG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0KICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+c2V0U2FtcGxlU2l6ZVBhcmFtcygKQEAgLTE3MjIsNiArMTcyMCw5IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIHJhdGlvLiBVc2UgY29tcHJlc3Npb24gcmF0aW8gb2YgMS4KICAgICAgICAgICAgICAgICAgICAgbWF4X3NpemUgPSB3aWR0aCAqIGhlaWdodCAqIDMgLyAyOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBIQUNLOiBhbGxvdyAxMCUgb3ZlcmhlYWQKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiByZWFkIHNhbXBsZSBzaXplIGZyb20gdHJhZiBhdG9tIGZvciBmcmFnbWVudGVkIE1QRUc0LgorICAgICAgICAgICAgICAgIG1heF9zaXplICs9IG1heF9zaXplIC8gMTA7CiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgbWF4X3NpemUpOwogICAgICAgICAgICAgfQogCkBAIC0yMDc5LDYgKzIwODAsMjggQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAnbCcsICdvJywgJ2MnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAnaScsICduJywgJ2YnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAncCcsICdyJywgJ3AnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ3AnLCAnaScsICd0JywgJ20nKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAnZCcsICdhJywgJ3QnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAncicsICdlJywgJ2YnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAncCcsICdyJywgJ28nKToKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1Jc0hFSUYpIHsKKyAgICAgICAgICAgICAgICBpZiAobUl0ZW1UYWJsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIG1JdGVtVGFibGUgPSBuZXcgSXRlbVRhYmxlKG1EYXRhU291cmNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUl0ZW1UYWJsZS0+cGFyc2UoCisgICAgICAgICAgICAgICAgICAgICAgICBjaHVua190eXBlLCBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIEZPVVJDQygnbScsICdlJywgJ2EnLCAnbicpOgogICAgICAgICBjYXNlIEZPVVJDQygnbicsICdhJywgJ20nLCAnZScpOgogICAgICAgICBjYXNlIEZPVVJDQygnZCcsICdhJywgJ3QnLCAnYScpOgpAQCAtMjQyNiw2ICsyNDQ5LDcgQEAKIAogICAgICAgICAgICAgb2ZmNjRfdCBzdG9wX29mZnNldCA9ICpvZmZzZXQgKyBjaHVua19zaXplOwogICAgICAgICAgICAgdWludDMyX3QgbnVtQ29tcGF0aWJsZUJyYW5kcyA9IChjaHVua19kYXRhX3NpemUgLSA4KSAvIDQ7CisgICAgICAgICAgICBzdGQ6OnNldDx1aW50MzJfdD4gYnJhbmRTZXQ7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUNvbXBhdGlibGVCcmFuZHMgKyAyOyArK2kpIHsKICAgICAgICAgICAgICAgICBpZiAoaSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhpcyBpbmRleCwgaXQgcmVmZXJzIHRvIHRoZSBtaW5vclZlcnNpb24sCkBAIC0yNDM5LDEwICsyNDYzLDE1IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgYnJhbmQgPSBudG9obChicmFuZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJyYW5kID09IEZPVVJDQygncScsICd0JywgJyAnLCAnICcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Jc1FUID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyYW5kU2V0Lmluc2VydChicmFuZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChicmFuZFNldC5jb3VudChGT1VSQ0MoJ3EnLCAndCcsICcgJywgJyAnKSkgPiAwKSB7CisgICAgICAgICAgICAgICAgbUlzUVQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChicmFuZFNldC5jb3VudChGT1VSQ0MoJ20nLCAnaScsICdmJywgJzEnKSkgPiAwCisgICAgICAgICAgICAgICAgICAgICYmIGJyYW5kU2V0LmNvdW50KEZPVVJDQygnaCcsICdlJywgJ2knLCAnYycpKSA+IDApIHsKKyAgICAgICAgICAgICAgICBtSXNIRUlGID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBBTE9HVigiaWRlbnRpZmllZCBIRUlGIGltYWdlIik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICpvZmZzZXQgPSBzdG9wX29mZnNldDsKQEAgLTMzOTEsNyArMzQyMCw3IEBACiAKICAgICBzcDxNUEVHNFNvdXJjZT4gc291cmNlID0gIG5ldyBNUEVHNFNvdXJjZSh0aGlzLAogICAgICAgICAgICAgdHJhY2stPm1ldGEsIG1EYXRhU291cmNlLCB0cmFjay0+dGltZXNjYWxlLCB0cmFjay0+c2FtcGxlVGFibGUsCi0gICAgICAgICAgICBtU2lkeEVudHJpZXMsIHRyZXgsIG1Nb29mT2Zmc2V0KTsKKyAgICAgICAgICAgIG1TaWR4RW50cmllcywgdHJleCwgbU1vb2ZPZmZzZXQsIG1JdGVtVGFibGUpOwogICAgIGlmIChzb3VyY2UtPmluaXQoKSAhPSBPSykgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0zNzkyLDcgKzM4MjEsOCBAQAogICAgICAgICBjb25zdCBzcDxTYW1wbGVUYWJsZT4gJnNhbXBsZVRhYmxlLAogICAgICAgICBWZWN0b3I8U2lkeEVudHJ5PiAmc2lkeCwKICAgICAgICAgY29uc3QgVHJleCAqdHJleCwKLSAgICAgICAgb2ZmNjRfdCBmaXJzdE1vb2ZPZmZzZXQpCisgICAgICAgIG9mZjY0X3QgZmlyc3RNb29mT2Zmc2V0LAorICAgICAgICBjb25zdCBzcDxJdGVtVGFibGU+ICZpdGVtVGFibGUpCiAgICAgOiBtT3duZXIob3duZXIpLAogICAgICAgbUZvcm1hdChmb3JtYXQpLAogICAgICAgbURhdGFTb3VyY2UoZGF0YVNvdXJjZSksCkBAIC0zODE3LDcgKzM4NDcsOSBAQAogICAgICAgbUdyb3VwKE5VTEwpLAogICAgICAgbUJ1ZmZlcihOVUxMKSwKICAgICAgIG1XYW50c05BTEZyYWdtZW50cyhmYWxzZSksCi0gICAgICBtU3JjQnVmZmVyKE5VTEwpIHsKKyAgICAgIG1TcmNCdWZmZXIoTlVMTCksCisgICAgICBtSXNIRUlGKGl0ZW1UYWJsZSAhPSBOVUxMKSwKKyAgICAgIG1JdGVtVGFibGUoaXRlbVRhYmxlKSB7CiAKICAgICBtZW1zZXQoJm1UcmFja0ZyYWdtZW50SGVhZGVySW5mbywgMCwgc2l6ZW9mKG1UcmFja0ZyYWdtZW50SGVhZGVySW5mbykpOwogCkBAIC00NTkyLDc3ICs0NjI0LDkzIEBACiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwogICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwogICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7Ci0gICAgICAgIHVpbnQzMl90IGZpbmRGbGFncyA9IDA7Ci0gICAgICAgIHN3aXRjaCAobW9kZSkgewotICAgICAgICAgICAgY2FzZSBSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DOgotICAgICAgICAgICAgICAgIGZpbmRGbGFncyA9IFNhbXBsZVRhYmxlOjprRmxhZ0JlZm9yZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUmVhZE9wdGlvbnM6OlNFRUtfTkVYVF9TWU5DOgotICAgICAgICAgICAgICAgIGZpbmRGbGFncyA9IFNhbXBsZVRhYmxlOjprRmxhZ0FmdGVyOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkM6Ci0gICAgICAgICAgICBjYXNlIFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1Q6Ci0gICAgICAgICAgICAgICAgZmluZEZsYWdzID0gU2FtcGxlVGFibGU6OmtGbGFnQ2xvc2VzdDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgQ0hFQ0soISJTaG91bGQgbm90IGJlIGhlcmUuIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KKyAgICAgICAgaWYgKG1Jc0hFSUYpIHsKKyAgICAgICAgICAgIENIRUNLKG1TYW1wbGVUYWJsZSA9PSBOVUxMKTsKKyAgICAgICAgICAgIENIRUNLKG1JdGVtVGFibGUgIT0gTlVMTCk7CiAKLSAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXg7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IG1TYW1wbGVUYWJsZS0+ZmluZFNhbXBsZUF0VGltZSgKLSAgICAgICAgICAgICAgICBzZWVrVGltZVVzLCAxMDAwMDAwLCBtVGltZXNjYWxlLAotICAgICAgICAgICAgICAgICZzYW1wbGVJbmRleCwgZmluZEZsYWdzKTsKLQotICAgICAgICBpZiAobW9kZSA9PSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUKSB7Ci0gICAgICAgICAgICAvLyBXZSBmb3VuZCB0aGUgY2xvc2VzdCBzYW1wbGUgYWxyZWFkeSwgbm93IHdlIHdhbnQgdGhlIHN5bmMKLSAgICAgICAgICAgIC8vIHNhbXBsZSBwcmVjZWRpbmcgaXQgKG9yIHRoZSBzYW1wbGUgaXRzZWxmIG9mIGNvdXJzZSksIGV2ZW4KLSAgICAgICAgICAgIC8vIGlmIHRoZSBzdWJzZXF1ZW50IHN5bmMgc2FtcGxlIGlzIGNsb3Nlci4KLSAgICAgICAgICAgIGZpbmRGbGFncyA9IFNhbXBsZVRhYmxlOjprRmxhZ0JlZm9yZTsKLSAgICAgICAgfQotCi0gICAgICAgIHVpbnQzMl90IHN5bmNTYW1wbGVJbmRleDsKLSAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgZXJyID0gbVNhbXBsZVRhYmxlLT5maW5kU3luY1NhbXBsZU5lYXIoCi0gICAgICAgICAgICAgICAgICAgIHNhbXBsZUluZGV4LCAmc3luY1NhbXBsZUluZGV4LCBmaW5kRmxhZ3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgdWludDMyX3Qgc2FtcGxlVGltZTsKLSAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgZXJyID0gbVNhbXBsZVRhYmxlLT5nZXRNZXRhRGF0YUZvclNhbXBsZSgKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlSW5kZXgsIE5VTEwsIE5VTEwsICZzYW1wbGVUaW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfT1VUX09GX1JBTkdFKSB7Ci0gICAgICAgICAgICAgICAgLy8gQW4gYXR0ZW1wdCB0byBzZWVrIHBhc3QgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIHdvdWxkCi0gICAgICAgICAgICAgICAgLy8gbm9ybWFsbHkgY2F1c2UgdGhpcyBFUlJPUl9PVVRfT0ZfUkFOR0UgZXJyb3IuIFByb3BhZ2F0aW5nCi0gICAgICAgICAgICAgICAgLy8gdGhpcyBhbGwgdGhlIHdheSB0byB0aGUgTWVkaWFQbGF5ZXIgd291bGQgY2F1c2UgYWJub3JtYWwKLSAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hdGlvbi4gTGVnYWN5IGJlaGF2aW91ciBhcHBlYXJzIHRvIGJlIHRvIGJlaGF2ZSBhcyBpZgotICAgICAgICAgICAgICAgIC8vIHdlIGhhZCBzZWVrZWQgdG8gdGhlIGVuZCBvZiBzdHJlYW0sIGVuZGluZyBub3JtYWxseS4KLSAgICAgICAgICAgICAgICBlcnIgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICAgICAgaWYgKHNlZWtUaW1lVXMgPj0gMCkgeworICAgICAgICAgICAgICAgIGVyciA9IG1JdGVtVGFibGUtPmZpbmRQcmltYXJ5SW1hZ2UoJm1DdXJyZW50U2FtcGxlSW5kZXgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtSXRlbVRhYmxlLT5maW5kVGh1bWJuYWlsKCZtQ3VycmVudFNhbXBsZUluZGV4KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJlbmQgb2Ygc3RyZWFtIik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGZpbmRGbGFncyA9IDA7CisgICAgICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM6CisgICAgICAgICAgICAgICAgICAgIGZpbmRGbGFncyA9IFNhbXBsZVRhYmxlOjprRmxhZ0JlZm9yZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSZWFkT3B0aW9uczo6U0VFS19ORVhUX1NZTkM6CisgICAgICAgICAgICAgICAgICAgIGZpbmRGbGFncyA9IFNhbXBsZVRhYmxlOjprRmxhZ0FmdGVyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQzoKKyAgICAgICAgICAgICAgICBjYXNlIFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1Q6CisgICAgICAgICAgICAgICAgICAgIGZpbmRGbGFncyA9IFNhbXBsZVRhYmxlOjprRmxhZ0Nsb3Nlc3Q7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIENIRUNLKCEiU2hvdWxkIG5vdCBiZSBoZXJlLiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KIAotICAgICAgICBpZiAobW9kZSA9PSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUKSB7Ci0gICAgICAgICAgICB0YXJnZXRTYW1wbGVUaW1lVXMgPSAoc2FtcGxlVGltZSAqIDEwMDAwMDBsbCkgLyBtVGltZXNjYWxlOwotICAgICAgICB9CisgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleDsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1TYW1wbGVUYWJsZS0+ZmluZFNhbXBsZUF0VGltZSgKKyAgICAgICAgICAgICAgICAgICAgc2Vla1RpbWVVcywgMTAwMDAwMCwgbVRpbWVzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgJnNhbXBsZUluZGV4LCBmaW5kRmxhZ3MpOworCisgICAgICAgICAgICBpZiAobW9kZSA9PSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgdGhlIGNsb3Nlc3Qgc2FtcGxlIGFscmVhZHksIG5vdyB3ZSB3YW50IHRoZSBzeW5jCisgICAgICAgICAgICAgICAgLy8gc2FtcGxlIHByZWNlZGluZyBpdCAob3IgdGhlIHNhbXBsZSBpdHNlbGYgb2YgY291cnNlKSwgZXZlbgorICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBzdWJzZXF1ZW50IHN5bmMgc2FtcGxlIGlzIGNsb3Nlci4KKyAgICAgICAgICAgICAgICBmaW5kRmxhZ3MgPSBTYW1wbGVUYWJsZTo6a0ZsYWdCZWZvcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQzMl90IHN5bmNTYW1wbGVJbmRleDsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtU2FtcGxlVGFibGUtPmZpbmRTeW5jU2FtcGxlTmVhcigKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUluZGV4LCAmc3luY1NhbXBsZUluZGV4LCBmaW5kRmxhZ3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVUaW1lOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIGVyciA9IG1TYW1wbGVUYWJsZS0+Z2V0TWV0YURhdGFGb3JTYW1wbGUoCisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVJbmRleCwgTlVMTCwgTlVMTCwgJnNhbXBsZVRpbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9PVVRfT0ZfUkFOR0UpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQW4gYXR0ZW1wdCB0byBzZWVrIHBhc3QgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIHdvdWxkCisgICAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbGx5IGNhdXNlIHRoaXMgRVJST1JfT1VUX09GX1JBTkdFIGVycm9yLiBQcm9wYWdhdGluZworICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGFsbCB0aGUgd2F5IHRvIHRoZSBNZWRpYVBsYXllciB3b3VsZCBjYXVzZSBhYm5vcm1hbAorICAgICAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hdGlvbi4gTGVnYWN5IGJlaGF2aW91ciBhcHBlYXJzIHRvIGJlIHRvIGJlaGF2ZSBhcyBpZgorICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYWQgc2Vla2VkIHRvIHRoZSBlbmQgb2Ygc3RyZWFtLCBlbmRpbmcgbm9ybWFsbHkuCisgICAgICAgICAgICAgICAgICAgIGVyciA9IEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJlbmQgb2Ygc3RyZWFtIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1vZGUgPT0gUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVCkgeworICAgICAgICAgICAgICAgIHRhcmdldFNhbXBsZVRpbWVVcyA9IChzYW1wbGVUaW1lICogMTAwMDAwMGxsKSAvIG1UaW1lc2NhbGU7CisgICAgICAgICAgICB9CiAKICNpZiAwCi0gICAgICAgIHVpbnQzMl90IHN5bmNTYW1wbGVUaW1lOwotICAgICAgICBDSEVDS19FUShPSywgbVNhbXBsZVRhYmxlLT5nZXRNZXRhRGF0YUZvclNhbXBsZSgKLSAgICAgICAgICAgICAgICAgICAgc3luY1NhbXBsZUluZGV4LCBOVUxMLCBOVUxMLCAmc3luY1NhbXBsZVRpbWUpKTsKKyAgICAgICAgICAgIHVpbnQzMl90IHN5bmNTYW1wbGVUaW1lOworICAgICAgICAgICAgQ0hFQ0tfRVEoT0ssIG1TYW1wbGVUYWJsZS0+Z2V0TWV0YURhdGFGb3JTYW1wbGUoCisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jU2FtcGxlSW5kZXgsIE5VTEwsIE5VTEwsICZzeW5jU2FtcGxlVGltZSkpOwogCi0gICAgICAgIEFMT0dJKCJzZWVrIHRvIHRpbWUgJWxsZCB1cyA9PiBzYW1wbGUgYXQgdGltZSAlbGxkIHVzLCAiCi0gICAgICAgICAgICAgInN5bmMgc2FtcGxlIGF0IHRpbWUgJWxsZCB1cyIsCi0gICAgICAgICAgICAgc2Vla1RpbWVVcywKLSAgICAgICAgICAgICBzYW1wbGVUaW1lICogMTAwMDAwMGxsIC8gbVRpbWVzY2FsZSwKLSAgICAgICAgICAgICBzeW5jU2FtcGxlVGltZSAqIDEwMDAwMDBsbCAvIG1UaW1lc2NhbGUpOworICAgICAgICAgICAgQUxPR0koInNlZWsgdG8gdGltZSAlbGxkIHVzID0+IHNhbXBsZSBhdCB0aW1lICVsbGQgdXMsICIKKyAgICAgICAgICAgICAgICAgInN5bmMgc2FtcGxlIGF0IHRpbWUgJWxsZCB1cyIsCisgICAgICAgICAgICAgICAgIHNlZWtUaW1lVXMsCisgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUgKiAxMDAwMDAwbGwgLyBtVGltZXNjYWxlLAorICAgICAgICAgICAgICAgICBzeW5jU2FtcGxlVGltZSAqIDEwMDAwMDBsbCAvIG1UaW1lc2NhbGUpOwogI2VuZGlmCiAKLSAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IHN5bmNTYW1wbGVJbmRleDsKKyAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSBzeW5jU2FtcGxlSW5kZXg7CisgICAgICAgIH0KKwogICAgICAgICBpZiAobUJ1ZmZlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKQEAgLTQ2NzksOSArNDcyNywxOSBAQAogICAgIGlmIChtQnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgbmV3QnVmZmVyID0gdHJ1ZTsKIAotICAgICAgICBzdGF0dXNfdCBlcnIgPQotICAgICAgICAgICAgbVNhbXBsZVRhYmxlLT5nZXRNZXRhRGF0YUZvclNhbXBsZSgKKyAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICBpZiAoIW1Jc0hFSUYpIHsKKyAgICAgICAgICAgIGVyciA9IG1TYW1wbGVUYWJsZS0+Z2V0TWV0YURhdGFGb3JTYW1wbGUoCiAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXgsICZvZmZzZXQsICZzaXplLCAmY3RzLCAmaXNTeW5jU2FtcGxlLCAmc3R0cyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnIgPSBtSXRlbVRhYmxlLT5nZXRJbWFnZU9mZnNldEFuZFNpemUoCisgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ3VycmVudFNhbXBsZUluZGV4IDogTlVMTCwgJm9mZnNldCwgJnNpemUpOworCisgICAgICAgICAgICBjdHMgPSBzdHRzID0gMDsKKyAgICAgICAgICAgIGlzU3luY1NhbXBsZSA9IDA7CisgICAgICAgICAgICBBTE9HVigiaW1hZ2Ugb2Zmc2V0ICVsbGQsIHNpemUgJXp1IiwgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworICAgICAgICB9CiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTQ2OTUsNiArNDc1Myw4IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKHNpemUgPiBtQnVmZmVyLT5zaXplKCkpIHsKICAgICAgICAgICAgIEFMT0dFKCJidWZmZXIgdG9vIHNtYWxsOiAlenUgPiAlenUiLCBzaXplLCBtQnVmZmVyLT5zaXplKCkpOworICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfQlVGRkVSX1RPT19TTUFMTDsKICAgICAgICAgfQogICAgIH0KQEAgLTQ5ODcsNiArNTA0Nyw4IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKHNpemUgPiBtQnVmZmVyLT5zaXplKCkpIHsKICAgICAgICAgICAgIEFMT0dFKCJidWZmZXIgdG9vIHNtYWxsOiAlenUgPiAlenUiLCBzaXplLCBtQnVmZmVyLT5zaXplKCkpOworICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfQlVGRkVSX1RPT19TTUFMTDsKICAgICAgICAgfQogICAgIH0KQEAgLTUyMzUsNiArNTI5Nyw3IEBACiAKIHZvaWQgTVBFRzRFeHRyYWN0b3I6OnBvcHVsYXRlTWV0cmljcygpIHsKICAgICBBTE9HVigiTVBFRzRFeHRyYWN0b3I6OnBvcHVsYXRlTWV0cmljcyIpOworICAgIC8vIHdyaXRlIGludG8gbUFuYWx5dGljc0l0ZW0KIH0KIAogc3RhdGljIGJvb2wgTGVnYWN5U25pZmZNUEVHNCgKQEAgLTUyNTEsNyArNTMxNCw4IEBACiAgICAgICAgIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cDNnZTYiLCA4KSB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXAzZ2c2IiwgOCkKICAgICAgICAgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwaXNvbSIsIDgpIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cE00ViAiLCA4KQogICAgICAgICB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBNNEEgIiwgOCkgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwZjR2ICIsIDgpCi0gICAgICAgIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cGtkZGkiLCA4KSB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBNNFZQIiwgOCkpIHsKKyAgICAgICAgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwa2RkaSIsIDgpIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cE00VlAiLCA4KQorICAgICAgICB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBtaWYxIiwgOCkgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwaGVpYyIsIDgpKSB7CiAgICAgICAgICptaW1lVHlwZSA9IE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNDsKICAgICAgICAgKmNvbmZpZGVuY2UgPSAwLjQ7CiAKQEAgLTUyODAsNiArNTM0NCw4IEBACiAKICAgICAgICAgRk9VUkNDKCczJywgJ2cnLCAnMicsICdhJyksICAvLyAzR1BQMgogICAgICAgICBGT1VSQ0MoJzMnLCAnZycsICcyJywgJ2InKSwKKyAgICAgICAgRk9VUkNDKCdtJywgJ2knLCAnZicsICcxJyksICAvLyBIRUlGIGltYWdlCisgICAgICAgIEZPVVJDQygnaCcsICdlJywgJ2knLCAnYycpLCAgLy8gSEVJRiBpbWFnZQogICAgIH07CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcAppbmRleCA5M2Q0ZjU3Li43Nzg2YzRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCkBAIC00MzIsNyArNDMyLDcgQEAKIH07CiAKIE1QRUc0V3JpdGVyOjpNUEVHNFdyaXRlcihpbnQgZmQpIHsKLSAgICBpbml0SW50ZXJuYWwoZmQpOworICAgIGluaXRJbnRlcm5hbChmZCwgdHJ1ZSAvKmlzRmlyc3RTZXNzaW9uKi8pOwogfQogCiBNUEVHNFdyaXRlcjo6fk1QRUc0V3JpdGVyKCkgewpAQCAtNDUxLDE5ICs0NTEsMjYgQEAKICAgICB9CiB9CiAKLXZvaWQgTVBFRzRXcml0ZXI6OmluaXRJbnRlcm5hbChpbnQgZmQpIHsKK3ZvaWQgTVBFRzRXcml0ZXI6OmluaXRJbnRlcm5hbChpbnQgZmQsIGJvb2wgaXNGaXJzdFNlc3Npb24pIHsKICAgICBBTE9HVigiaW5pdEludGVybmFsIik7CiAgICAgbUZkID0gZHVwKGZkKTsKICAgICBtTmV4dEZkID0gLTE7CiAgICAgbUluaXRDaGVjayA9IG1GZCA8IDA/IE5PX0lOSVQ6IE9LOwotICAgIG1Jc1JlYWxUaW1lUmVjb3JkaW5nID0gdHJ1ZTsKLSAgICBtVXNlNEJ5dGVOYWxMZW5ndGggPSB0cnVlOwotICAgIG1Vc2UzMkJpdE9mZnNldCA9IHRydWU7Ci0gICAgbUlzRmlsZVNpemVMaW1pdEV4cGxpY2l0bHlSZXF1ZXN0ZWQgPSBmYWxzZTsKKworICAgIG1JbnRlcmxlYXZlRHVyYXRpb25VcyA9IDEwMDAwMDA7CisKKyAgICBtU3RhcnRUaW1lc3RhbXBVcyA9IC0xbGw7CisgICAgbVN0YXJ0VGltZU9mZnNldE1zID0gLTE7CiAgICAgbVBhdXNlZCA9IGZhbHNlOwogICAgIG1TdGFydGVkID0gZmFsc2U7CiAgICAgbVdyaXRlclRocmVhZFN0YXJ0ZWQgPSBmYWxzZTsKICAgICBtU2VuZE5vdGlmeSA9IGZhbHNlOworCisgICAgLy8gUmVzZXQgZm9sbG93aW5nIHZhcmlhYmxlcyBmb3IgYWxsIHRoZSBzZXNzaW9ucyBhbmQgdGhleSB3aWxsIGJlCisgICAgLy8gaW5pdGlhbGl6ZWQgaW4gc3RhcnQoTWV0YURhdGEgKnBhcmFtKS4KKyAgICBtSXNSZWFsVGltZVJlY29yZGluZyA9IHRydWU7CisgICAgbVVzZTRCeXRlTmFsTGVuZ3RoID0gdHJ1ZTsKKyAgICBtVXNlMzJCaXRPZmZzZXQgPSB0cnVlOwogICAgIG1PZmZzZXQgPSAwOwogICAgIG1NZGF0T2Zmc2V0ID0gMDsKICAgICBtTW9vdkJveEJ1ZmZlciA9IE5VTEw7CkBAIC00NzIsMTcgKzQ3OSwyMSBAQAogICAgIG1GcmVlQm94T2Zmc2V0ID0gMDsKICAgICBtU3RyZWFtYWJsZUZpbGUgPSBmYWxzZTsKICAgICBtRXN0aW1hdGVkTW9vdkJveFNpemUgPSAwOwotICAgIG1Nb292RXh0cmFTaXplID0gMDsKLSAgICBtSW50ZXJsZWF2ZUR1cmF0aW9uVXMgPSAxMDAwMDAwOwogICAgIG1UaW1lU2NhbGUgPSAtMTsKLSAgICBtU3RhcnRUaW1lc3RhbXBVcyA9IC0xbGw7Ci0gICAgbUxhdGl0dWRleDEwMDAwID0gMDsKLSAgICBtTG9uZ2l0dWRleDEwMDAwID0gMDsKLSAgICBtQXJlR2VvVGFnc0F2YWlsYWJsZSA9IGZhbHNlOwotICAgIG1TdGFydFRpbWVPZmZzZXRNcyA9IC0xOwotICAgIG1Td2l0Y2hQZW5kaW5nID0gZmFsc2U7Ci0gICAgbU1ldGFLZXlzID0gbmV3IEFNZXNzYWdlKCk7Ci0gICAgYWRkRGV2aWNlTWV0YSgpOworCisgICAgLy8gRm9sbG93aW5nIHZhcmlhYmxlcyBvbmx5IG5lZWQgdG8gYmUgc2V0IGZvciB0aGUgZmlyc3QgcmVjb3JkaW5nIHNlc3Npb24uCisgICAgLy8gQW5kIHRoZXkgd2lsbCBzdGF5IHRoZSBzYW1lIGZvciBhbGwgdGhlIHJlY29yZGluZyBzZXNzaW9ucy4KKyAgICBpZiAoaXNGaXJzdFNlc3Npb24pIHsKKyAgICAgICAgbU1vb3ZFeHRyYVNpemUgPSAwOworICAgICAgICBtTWV0YUtleXMgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICAgICAgYWRkRGV2aWNlTWV0YSgpOworICAgICAgICBtTGF0aXR1ZGV4MTAwMDAgPSAwOworICAgICAgICBtTG9uZ2l0dWRleDEwMDAwID0gMDsKKyAgICAgICAgbUFyZUdlb1RhZ3NBdmFpbGFibGUgPSBmYWxzZTsKKyAgICAgICAgbVN3aXRjaFBlbmRpbmcgPSBmYWxzZTsKKyAgICAgICAgbUlzRmlsZVNpemVMaW1pdEV4cGxpY2l0bHlSZXF1ZXN0ZWQgPSBmYWxzZTsKKyAgICB9CisKICAgICAvLyBWZXJpZnkgbUZkIGlzIHNlZWthYmxlCiAgICAgb2ZmNjRfdCBvZmYgPSBsc2VlazY0KG1GZCwgMCwgU0VFS19TRVQpOwogICAgIGlmIChvZmYgPCAwKSB7CkBAIC04NzMsMTkgKzg4NCw4IEBACiB9CiAKIHN0YXR1c190IE1QRUc0V3JpdGVyOjpwYXVzZSgpIHsKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotICAgIG1QYXVzZWQgPSB0cnVlOwotICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgIGZvciAoTGlzdDxUcmFjayAqPjo6aXRlcmF0b3IgaXQgPSBtVHJhY2tzLmJlZ2luKCk7Ci0gICAgICAgICBpdCAhPSBtVHJhY2tzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9ICgqaXQpLT5wYXVzZSgpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICBlcnIgPSBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKKyAgICBBTE9HVygiTVBFRzRXcml0ZXI6IHBhdXNlIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiB9CiAKIHZvaWQgTVBFRzRXcml0ZXI6OnN0b3BXcml0ZXJUaHJlYWQoKSB7CkBAIC0xODMzLDcgKzE4MzMsNyBAQAogICAgICAgICAgICAgaW50IGZkID0gbU5leHRGZDsKICAgICAgICAgICAgIG1OZXh0RmQgPSAtMTsKICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgaW5pdEludGVybmFsKGZkKTsKKyAgICAgICAgICAgIGluaXRJbnRlcm5hbChmZCwgZmFsc2UgLyppc0ZpcnN0U2Vzc2lvbiovKTsKICAgICAgICAgICAgIHN0YXJ0KG1TdGFydE1ldGEuZ2V0KCkpOwogICAgICAgICAgICAgbVN3aXRjaFBlbmRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgIG5vdGlmeShNRURJQV9SRUNPUkRFUl9FVkVOVF9JTkZPLCBNRURJQV9SRUNPUkRFUl9JTkZPX05FWFRfT1VUUFVUX0ZJTEVfU1RBUlRFRCwgMCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCmluZGV4IGJkNzE2MzIuLjc1OWU0MmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCkBAIC0yMyw3ICsyMyw4IEBACiAjaW5jbHVkZSAiaW5jbHVkZS9TaGFyZWRNZW1vcnlCdWZmZXIuaCIKICNpbmNsdWRlICJpbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaCIKIAotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSURlc2NyYW1ibGVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvbmF0aXZlLzEuMC9JRGVzY3JhbWJsZXIuaD4KKwogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgpAQCAtNzIsNiArNzMsMTMgQEAKIHN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNDcnlwdG8gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmNyeXB0byI7ICAgLyogMCwxICovCiBzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjRW5jb2RlciA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuZW5jb2RlciI7IC8qIDAsMSAqLwogCitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjQnl0ZXNJbiA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuYnl0ZXNpbiI7ICAvKiAwLi5uICovCitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjUHJvZmlsZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMucHJvZmlsZSI7ICAvKiAwLi5uICovCitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjTGV2ZWwgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmxldmVsIjsgIC8qIDAuLm4gKi8KK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNNYXhXaWR0aCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMubWF4d2lkdGgiOyAgLyogMC4ubiAqLworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY01heEhlaWdodCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMubWF4aGVpZ2h0IjsgIC8qIDAuLm4gKi8KK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNFcnJvciA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuZXJyY29kZSI7CitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjRXJyb3JTdGF0ZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuZXJyc3RhdGUiOwogCiAKIHN0YXRpYyBpbnQ2NF90IGdldElkKGNvbnN0IHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+ICZjbGllbnQpIHsKQEAgLTQyOCwyMiArNDM2LDYgQEAKIH0KIAogLy8gc3RhdGljCi1zdGF0dXNfdCBNZWRpYUNvZGVjOjpRdWVyeUNhcGFiaWxpdGllcygKLSAgICAgICAgY29uc3QgQVN0cmluZyAmbmFtZSwgY29uc3QgQVN0cmluZyAmbWltZSwgYm9vbCBpc0VuY29kZXIsCi0gICAgICAgIHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+ICpjYXBzIC8qIG5vbm51bGwgKi8pIHsKLSAgICAvLyBUUklDS1k6IHRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgTWVkaWFDb2RlY0xpc3QvSW5mbyBkdXJpbmcgaXRzCi0gICAgLy8gaW5pdGlhbGl6YXRpb24uIEFzIHN1Y2gsIHdlIGNhbm5vdCBjcmVhdGUgYSBNZWRpYUNvZGVjIGluc3RhbmNlCi0gICAgLy8gYmVjYXVzZSB0aGF0IHJlcXVpcmVzIGFuIGluaXRpYWxpemVkIE1lZGlhQ29kZWNMaXN0LgotCi0gICAgc3A8Q29kZWNCYXNlPiBjb2RlYyA9IEdldENvZGVjQmFzZShuYW1lKTsKLSAgICBpZiAoY29kZWMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNvZGVjLT5xdWVyeUNhcGFiaWxpdGllcyhuYW1lLCBtaW1lLCBpc0VuY29kZXIsIGNhcHMpOwotfQotCi0vLyBzdGF0aWMKIHNwPFBlcnNpc3RlbnRTdXJmYWNlPiBNZWRpYUNvZGVjOjpDcmVhdGVQZXJzaXN0ZW50SW5wdXRTdXJmYWNlKCkgewogICAgIE9NWENsaWVudCBjbGllbnQ7CiAgICAgaWYgKGNsaWVudC5jb25uZWN0KCkgIT0gT0spIHsKQEAgLTQ3NSw2ICs0NjcsNyBAQAogICAgICAgbUZsYWdzKDApLAogICAgICAgbVN0aWNreUVycm9yKE9LKSwKICAgICAgIG1Tb2Z0UmVuZGVyZXIoTlVMTCksCisgICAgICBtQW5hbHl0aWNzSXRlbShOVUxMKSwKICAgICAgIG1SZXNvdXJjZU1hbmFnZXJDbGllbnQobmV3IFJlc291cmNlTWFuYWdlckNsaWVudCh0aGlzKSksCiAgICAgICBtUmVzb3VyY2VNYW5hZ2VyU2VydmljZShuZXcgUmVzb3VyY2VNYW5hZ2VyU2VydmljZVByb3h5KHBpZCkpLAogICAgICAgbUJhdHRlcnlTdGF0Tm90aWZpZWQoZmFsc2UpLApAQCAtNDkzLDYgKzQ4NiwxOCBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIG1VaWQgPSB1aWQ7CiAgICAgfQorICAgIGluaXRBbmFseXRpY3NJdGVtKCk7Cit9CisKK01lZGlhQ29kZWM6On5NZWRpYUNvZGVjKCkgeworICAgIENIRUNLX0VRKG1TdGF0ZSwgVU5JTklUSUFMSVpFRCk7CisgICAgbVJlc291cmNlTWFuYWdlclNlcnZpY2UtPnJlbW92ZVJlc291cmNlKGdldElkKG1SZXNvdXJjZU1hbmFnZXJDbGllbnQpKTsKKworICAgIGZsdXNoQW5hbHl0aWNzSXRlbSgpOworfQorCit2b2lkIE1lZGlhQ29kZWM6OmluaXRBbmFseXRpY3NJdGVtKCkgeworICAgIENIRUNLKG1BbmFseXRpY3NJdGVtID09IE5VTEwpOwogICAgIC8vIHNldCB1cCBvdXIgbmV3IHJlY29yZCwgZ2V0IGEgc2Vzc2lvbklELCBwdXQgaXQgaW50byB0aGUgaW4tcHJvZ3Jlc3MgbGlzdAogICAgIG1BbmFseXRpY3NJdGVtID0gbmV3IE1lZGlhQW5hbHl0aWNzSXRlbShrQ29kZWNLZXlOYW1lKTsKICAgICBpZiAobUFuYWx5dGljc0l0ZW0gIT0gTlVMTCkgewpAQCAtNTAyLDExICs1MDcsOSBAQAogICAgIH0KIH0KIAotTWVkaWFDb2RlYzo6fk1lZGlhQ29kZWMoKSB7Ci0gICAgQ0hFQ0tfRVEobVN0YXRlLCBVTklOSVRJQUxJWkVEKTsKLSAgICBtUmVzb3VyY2VNYW5hZ2VyU2VydmljZS0+cmVtb3ZlUmVzb3VyY2UoZ2V0SWQobVJlc291cmNlTWFuYWdlckNsaWVudCkpOwotCi0gICAgaWYgKG1BbmFseXRpY3NJdGVtICE9IE5VTEwgKSB7Cit2b2lkIE1lZGlhQ29kZWM6OmZsdXNoQW5hbHl0aWNzSXRlbSgpIHsKKyAgICBpZiAobUFuYWx5dGljc0l0ZW0gIT0gTlVMTCkgeworICAgICAgICAvLyBkb24ndCBsb2cgZW1wdHkgcmVjb3JkcwogICAgICAgICBpZiAobUFuYWx5dGljc0l0ZW0tPmNvdW50KCkgPiAwKSB7CiAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0RmluYWxpemVkKHRydWUpOwogICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNlbGZyZWNvcmQoKTsKQEAgLTY5OSwxMCArNzAyLDIxIEBACiAgICAgICAgIHVpbnQzMl90IGZsYWdzKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbmZpZ3VyZSwgdGhpcyk7CiAKKyAgICBpZiAobUFuYWx5dGljc0l0ZW0gIT0gTlVMTCkgeworICAgICAgICBpbnQzMl90IHByb2ZpbGUgPSAwOworICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoInByb2ZpbGUiLCAmcHJvZmlsZSkpIHsKKyAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQ29kZWNQcm9maWxlLCBwcm9maWxlKTsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IGxldmVsID0gMDsKKyAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKCJsZXZlbCIsICZsZXZlbCkpIHsKKyAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQ29kZWNMZXZlbCwgbGV2ZWwpOworICAgICAgICB9CisgICAgfQorCiAgICAgaWYgKG1Jc1ZpZGVvKSB7CiAgICAgICAgIGZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZtVmlkZW9XaWR0aCk7CiAgICAgICAgIGZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmbVZpZGVvSGVpZ2h0KTsKLSAgICAgICAgaWYgKCFmb3JtYXQtPmZpbmRJbnQzMihrQ29kZWNSb3RhdGlvbiwgJm1Sb3RhdGlvbkRlZ3JlZXMpKSB7CisgICAgICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoInJvdGF0aW9uLWRlZ3JlZXMiLCAmbVJvdGF0aW9uRGVncmVlcykpIHsKICAgICAgICAgICAgIG1Sb3RhdGlvbkRlZ3JlZXMgPSAwOwogICAgICAgICB9CiAKQEAgLTcxMCw2ICs3MjQsMTQgQEAKICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQ29kZWNXaWR0aCwgbVZpZGVvV2lkdGgpOwogICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY0hlaWdodCwgbVZpZGVvSGVpZ2h0KTsKICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQ29kZWNSb3RhdGlvbiwgbVJvdGF0aW9uRGVncmVlcyk7CisgICAgICAgICAgICBpbnQzMl90IG1heFdpZHRoID0gMDsKKyAgICAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigibWF4LXdpZHRoIiwgJm1heFdpZHRoKSkgeworICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQ29kZWNNYXhXaWR0aCwgbWF4V2lkdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50MzJfdCBtYXhIZWlnaHQgPSAwOworICAgICAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKCJtYXgtaGVpZ2h0IiwgJm1heEhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0NvZGVjTWF4SGVpZ2h0LCBtYXhIZWlnaHQpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gUHJldmVudCBwb3NzaWJsZSBpbnRlZ2VyIG92ZXJmbG93IGluIGRvd25zdHJlYW0gY29kZS4KQEAgLTE0MTYsNiArMTQzOCwxMiBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENPTkZJR1VSSU5HOgogICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25Db2RlID09IEFDVElPTl9DT0RFX0ZBVEFMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQ29kZWNFcnJvciwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY0Vycm9yU3RhdGUsIG1TdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoQW5hbHl0aWNzSXRlbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0QW5hbHl0aWNzSXRlbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShhY3Rpb25Db2RlID09IEFDVElPTl9DT0RFX0ZBVEFMID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOSU5JVElBTElaRUQgOiBJTklUSUFMSVpFRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xNDIzLDYgKzE0NTEsMTIgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTVEFSVElORzoKICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uQ29kZSA9PSBBQ1RJT05fQ09ERV9GQVRBTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0NvZGVjRXJyb3IsIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQ29kZWNFcnJvclN0YXRlLCBtU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaEFuYWx5dGljc0l0ZW0oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdEFuYWx5dGljc0l0ZW0oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoYWN0aW9uQ29kZSA9PSBBQ1RJT05fQ09ERV9GQVRBTCA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTklOSVRJQUxJWkVEIDogQ09ORklHVVJFRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xNDU5LDYgKzE0OTMsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkxVU0hJTkc6CiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbkNvZGUgPT0gQUNUSU9OX0NPREVfRkFUQUwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY0Vycm9yLCBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0NvZGVjRXJyb3JTdGF0ZSwgbVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hBbmFseXRpY3NJdGVtKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRBbmFseXRpY3NJdGVtKCk7CisKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoVU5JTklUSUFMSVpFRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoCkBAIC0xNDg3LDYgKzE1MjYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoSU5JVElBTElaRUQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0NvZGVjRXJyb3IsIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQ29kZWNFcnJvclN0YXRlLCBtU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaEFuYWx5dGljc0l0ZW0oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdEFuYWx5dGljc0l0ZW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoVU5JTklUSUFMSVpFRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTE1OTEsNiArMTYzNCwxOSBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKENPTkZJR1VSRUQpOwogICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KG1SZXBseUlEKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBhdWdtZW50IG91ciBtZWRpYSBtZXRyaWNzIGluZm8sIG5vdyB0aGF0IHdlIGtub3cgbW9yZSB0aGluZ3MKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BbmFseXRpY3NJdGVtICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNvbmZpZ3VyZU1zZyAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZ3VyZU1zZy0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcm1hdCBpbmNsdWRlczogbWltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIG1pbWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtDb2RlY01pbWUsIG1pbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCkBAIC0yODE2LDYgKzI4NzIsOSBAQAogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobUJ1ZmZlckxvY2spOwogICAgICAgICBpbmZvLT5tT3duZWRCeUNsaWVudCA9IGZhbHNlOwogICAgICAgICBpbmZvLT5tRGF0YS5jbGVhcigpOworICAgICAgICBpZiAobUFuYWx5dGljc0l0ZW0gIT0gTlVMTCkgeworICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPmFkZEludDY0KGtDb2RlY0J5dGVzSW4sIHNpemUpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcAppbmRleCAxZGNiYTI5Li40NjUyNTk0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwCkBAIC0yNCwxNyArMjQsMTcgQEAKIAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUNvZGVjTGlzdC5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9JUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUNvZGVjU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNJbmZvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFSZXNvdXJjZVBvbGljeS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRGVmcy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgogCiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CkBAIC00MiwyMCArNDIsMjAgQEAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGV4cGF0Lmg+CiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RhdGljIE11dGV4IHNJbml0TXV0ZXg7CituYW1lc3BhY2UgewogCi1zdGF0aWMgYm9vbCBwYXJzZUJvb2xlYW4oY29uc3QgY2hhciAqcykgewotICAgIGlmICghc3RyY2FzZWNtcChzLCAidHJ1ZSIpIHx8ICFzdHJjYXNlY21wKHMsICJ5ZXMiKSB8fCAhc3RyY2FzZWNtcChzLCAieSIpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBjaGFyICplbmQ7Ci0gICAgdW5zaWduZWQgbG9uZyByZXMgPSBzdHJ0b3VsKHMsICZlbmQsIDEwKTsKLSAgICByZXR1cm4gKnMgIT0gJ1wwJyAmJiAqZW5kID09ICdcMCcgJiYgcmVzID4gMDsKLX0KK011dGV4IHNJbml0TXV0ZXg7CiAKLXN0YXRpYyBib29sIGlzUHJvZmlsaW5nTmVlZGVkKCkgeworTXV0ZXggc1JlbW90ZUluaXRNdXRleDsKKworY29uc3RleHByIGNvbnN0IGNoYXIqIGtQcm9maWxpbmdSZXN1bHRzID0KKyAgICAgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRQcm9maWxpbmdSZXN1bHRzWG1sUGF0aDsKKworYm9vbCBpc1Byb2ZpbGluZ05lZWRlZCgpIHsKICAgICBpbnQ4X3QgdmFsdWUgPSBwcm9wZXJ0eV9nZXRfYm9vbCgiZGVidWcuc3RhZ2VmcmlnaHQucHJvZmlsZWNvZGVjIiwgMCk7CiAgICAgaWYgKHZhbHVlID09IDApIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNzgsNiArNzgsMTAgQEAKICAgICByZXR1cm4gcHJvZmlsaW5nTmVlZGVkOwogfQogCitPbXhJbmZvQnVpbGRlciBzT214SW5mb0J1aWxkZXI7CisKK30gIC8vIHVubmFtZWQgbmFtZXNwYWNlCisKIC8vIHN0YXRpYwogc3A8SU1lZGlhQ29kZWNMaXN0PiBNZWRpYUNvZGVjTGlzdDo6c0NvZGVjTGlzdDsKIApAQCAtODYsNDIgKzkwLDQyIEBACiAgICAgQUxPR1YoIkVudGVyIHByb2ZpbGVyVGhyZWFkV3JhcHBlci4iKTsKICAgICByZW1vdmUoa1Byb2ZpbGluZ1Jlc3VsdHMpOyAgLy8gcmVtb3ZlIHByZXZpb3VzIHJlc3VsdCBzbyB0aGF0IGl0IHdvbid0IGJlIGxvYWRlZCB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbmV3IE1lZGlhQ29kZWNMaXN0Ci0gICAgTWVkaWFDb2RlY0xpc3QgKmNvZGVjTGlzdCA9IG5ldyBNZWRpYUNvZGVjTGlzdCgpOworICAgIHNwPE1lZGlhQ29kZWNMaXN0PiBjb2RlY0xpc3QobmV3IE1lZGlhQ29kZWNMaXN0KCZzT214SW5mb0J1aWxkZXIpKTsKICAgICBpZiAoY29kZWNMaXN0LT5pbml0Q2hlY2soKSAhPSBPSykgewogICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGNyZWF0ZSBhIG5ldyBNZWRpYUNvZGVjTGlzdCwgc2tpcHBpbmcgY29kZWMgcHJvZmlsaW5nLiIpOwotICAgICAgICBkZWxldGUgY29kZWNMaXN0OwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgfQogCi0gICAgVmVjdG9yPHNwPE1lZGlhQ29kZWNJbmZvPj4gaW5mb3M7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb2RlY0xpc3QtPmNvdW50Q29kZWNzKCk7ICsraSkgewotICAgICAgICBpbmZvcy5wdXNoX2JhY2soY29kZWNMaXN0LT5nZXRDb2RlY0luZm8oaSkpOwotICAgIH0KKyAgICBjb25zdCBhdXRvJiBpbmZvcyA9IGNvZGVjTGlzdC0+bUNvZGVjSW5mb3M7CiAgICAgQUxPR1YoIkNvZGVjIHByb2ZpbGluZyBzdGFydGVkLiIpOwotICAgIHByb2ZpbGVDb2RlY3MoaW5mb3MpOworICAgIHByb2ZpbGVDb2RlY3MoaW5mb3MsIGtQcm9maWxpbmdSZXN1bHRzKTsKICAgICBBTE9HVigiQ29kZWMgcHJvZmlsaW5nIGNvbXBsZXRlZC4iKTsKLSAgICBjb2RlY0xpc3QtPnBhcnNlVG9wTGV2ZWxYTUxGaWxlKGtQcm9maWxpbmdSZXN1bHRzLCB0cnVlIC8qIGlnbm9yZV9lcnJvcnMgKi8pOworICAgIGNvZGVjTGlzdCA9IG5ldyBNZWRpYUNvZGVjTGlzdCgmc09teEluZm9CdWlsZGVyKTsKKyAgICBpZiAoY29kZWNMaXN0LT5pbml0Q2hlY2soKSAhPSBPSykgeworICAgICAgICBBTE9HVygiRmFpbGVkIHRvIHBhcnNlIHByb2ZpbGluZyByZXN1bHRzLiIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CiAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhzSW5pdE11dGV4KTsKICAgICAgICAgc0NvZGVjTGlzdCA9IGNvZGVjTGlzdDsKICAgICB9Ci0gICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKIC8vIHN0YXRpYwogc3A8SU1lZGlhQ29kZWNMaXN0PiBNZWRpYUNvZGVjTGlzdDo6Z2V0TG9jYWxJbnN0YW5jZSgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soc0luaXRNdXRleCk7CiAKLSAgICBpZiAoc0NvZGVjTGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgIE1lZGlhQ29kZWNMaXN0ICpjb2RlY0xpc3QgPSBuZXcgTWVkaWFDb2RlY0xpc3Q7CisgICAgaWYgKHNDb2RlY0xpc3QgPT0gbnVsbHB0cikgeworICAgICAgICBNZWRpYUNvZGVjTGlzdCAqY29kZWNMaXN0ID0gbmV3IE1lZGlhQ29kZWNMaXN0KCZzT214SW5mb0J1aWxkZXIpOwogICAgICAgICBpZiAoY29kZWNMaXN0LT5pbml0Q2hlY2soKSA9PSBPSykgewogICAgICAgICAgICAgc0NvZGVjTGlzdCA9IGNvZGVjTGlzdDsKIAogICAgICAgICAgICAgaWYgKGlzUHJvZmlsaW5nTmVlZGVkKCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiQ29kZWMgcHJvZmlsaW5nIG5lZWRlZCwgd2lsbCBiZSBydW4gaW4gc2VwYXJhdGVkIHRocmVhZC4iKTsKICAgICAgICAgICAgICAgICBwdGhyZWFkX3QgcHJvZmlsZXI7Ci0gICAgICAgICAgICAgICAgaWYgKHB0aHJlYWRfY3JlYXRlKCZwcm9maWxlciwgTlVMTCwgcHJvZmlsZXJUaHJlYWRXcmFwcGVyLCBOVUxMKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHB0aHJlYWRfY3JlYXRlKCZwcm9maWxlciwgbnVsbHB0ciwgcHJvZmlsZXJUaHJlYWRXcmFwcGVyLCBudWxscHRyKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gY3JlYXRlIHRocmVhZCBmb3IgY29kZWMgcHJvZmlsaW5nLiIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTEzNCw4ICsxMzgsNiBAQAogICAgIHJldHVybiBzQ29kZWNMaXN0OwogfQogCi1zdGF0aWMgTXV0ZXggc1JlbW90ZUluaXRNdXRleDsKLQogc3A8SU1lZGlhQ29kZWNMaXN0PiBNZWRpYUNvZGVjTGlzdDo6c1JlbW90ZUxpc3Q7CiAKIHNwPE1lZGlhQ29kZWNMaXN0OjpCaW5kZXJEZWF0aE9ic2VydmVyPiBNZWRpYUNvZGVjTGlzdDo6c0JpbmRlckRlYXRoT2JzZXJ2ZXI7CkBAIC0xNDksMTkgKzE1MSwxOSBAQAogLy8gc3RhdGljCiBzcDxJTWVkaWFDb2RlY0xpc3Q+IE1lZGlhQ29kZWNMaXN0OjpnZXRJbnN0YW5jZSgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2woc1JlbW90ZUluaXRNdXRleCk7Ci0gICAgaWYgKHNSZW1vdGVMaXN0ID09IE5VTEwpIHsKKyAgICBpZiAoc1JlbW90ZUxpc3QgPT0gbnVsbHB0cikgewogICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPQogICAgICAgICAgICAgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLnBsYXllciIpKTsKICAgICAgICAgc3A8SU1lZGlhUGxheWVyU2VydmljZT4gc2VydmljZSA9CiAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPihiaW5kZXIpOwotICAgICAgICBpZiAoc2VydmljZS5nZXQoKSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChzZXJ2aWNlLmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgIHNSZW1vdGVMaXN0ID0gc2VydmljZS0+Z2V0Q29kZWNMaXN0KCk7Ci0gICAgICAgICAgICBpZiAoc1JlbW90ZUxpc3QgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKHNSZW1vdGVMaXN0ICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBzQmluZGVyRGVhdGhPYnNlcnZlciA9IG5ldyBCaW5kZXJEZWF0aE9ic2VydmVyKCk7CiAgICAgICAgICAgICAgICAgYmluZGVyLT5saW5rVG9EZWF0aChzQmluZGVyRGVhdGhPYnNlcnZlci5nZXQoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHNSZW1vdGVMaXN0ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKHNSZW1vdGVMaXN0ID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIC8vIGlmIGZhaWxlZCB0byBnZXQgcmVtb3RlIGxpc3QsIGNyZWF0ZSBsb2NhbCBsaXN0CiAgICAgICAgICAgICBzUmVtb3RlTGlzdCA9IGdldExvY2FsSW5zdGFuY2UoKTsKICAgICAgICAgfQpAQCAtMTY5LDE3NSArMTcxLDExIEBACiAgICAgcmV0dXJuIHNSZW1vdGVMaXN0OwogfQogCi0vLyBUcmVibGl6ZWQgbWVkaWEgY29kZWMgbGlzdCB3aWxsIGJlIGxvY2F0ZWQgaW4gL29kbS9ldGMgb3IgL3ZlbmRvci9ldGMuCi1zdGF0aWMgY29uc3QgY2hhciAqa0NvbmZpZ0xvY2F0aW9uTGlzdFtdID0KLSAgICAgICAgeyIvb2RtL2V0YyIsICIvdmVuZG9yL2V0YyIsICIvZXRjIn07Ci1zdGF0aWMgY29uc3QgaW50IGtDb25maWdMb2NhdGlvbkxpc3RTaXplID0KLSAgICAgICAgKHNpemVvZihrQ29uZmlnTG9jYXRpb25MaXN0KSAvIHNpemVvZihrQ29uZmlnTG9jYXRpb25MaXN0WzBdKSk7Ci0KLSNkZWZpbmUgTUVESUFfQ09ERUNTX0NPTkZJR19GSUxFX1BBVEhfTUFYX0xFTkdUSCAxMjgKLQotc3RhdGljIGJvb2wgZmluZE1lZGlhQ29kZWNMaXN0RmlsZUZ1bGxQYXRoKGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwgY2hhciAqb3V0X3BhdGgpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGtDb25maWdMb2NhdGlvbkxpc3RTaXplOyBpKyspIHsKLSAgICAgICAgc25wcmludGYob3V0X3BhdGgsCi0gICAgICAgICAgICAgICAgIE1FRElBX0NPREVDU19DT05GSUdfRklMRV9QQVRIX01BWF9MRU5HVEgsCi0gICAgICAgICAgICAgICAgICIlcy8lcyIsCi0gICAgICAgICAgICAgICAgIGtDb25maWdMb2NhdGlvbkxpc3RbaV0sCi0gICAgICAgICAgICAgICAgIGZpbGVfbmFtZSk7Ci0gICAgICAgIHN0cnVjdCBzdGF0IGZpbGVfc3RhdDsKLSAgICAgICAgaWYgKHN0YXQob3V0X3BhdGgsICZmaWxlX3N0YXQpID09IDAgJiYgU19JU1JFRyhmaWxlX3N0YXQuc3RfbW9kZSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotTWVkaWFDb2RlY0xpc3Q6Ok1lZGlhQ29kZWNMaXN0KCkKLSAgICA6IG1Jbml0Q2hlY2soTk9fSU5JVCksCi0gICAgICBtVXBkYXRlKGZhbHNlKSwKLSAgICAgIG1HbG9iYWxTZXR0aW5ncyhuZXcgQU1lc3NhZ2UoKSkgewotICAgIGNoYXIgY29uZmlnX2ZpbGVfcGF0aFtNRURJQV9DT0RFQ1NfQ09ORklHX0ZJTEVfUEFUSF9NQVhfTEVOR1RIXTsKLSAgICBpZiAoZmluZE1lZGlhQ29kZWNMaXN0RmlsZUZ1bGxQYXRoKCJtZWRpYV9jb2RlY3MueG1sIiwgY29uZmlnX2ZpbGVfcGF0aCkpIHsKLSAgICAgICAgcGFyc2VUb3BMZXZlbFhNTEZpbGUoY29uZmlnX2ZpbGVfcGF0aCk7Ci0gICAgfQotICAgIGlmIChmaW5kTWVkaWFDb2RlY0xpc3RGaWxlRnVsbFBhdGgoIm1lZGlhX2NvZGVjc19wZXJmb3JtYW5jZS54bWwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnX2ZpbGVfcGF0aCkpIHsKLSAgICAgICAgcGFyc2VUb3BMZXZlbFhNTEZpbGUoY29uZmlnX2ZpbGVfcGF0aCwgdHJ1ZS8qIGlnbm9yZV9lcnJvcnMgKi8pOwotICAgIH0KLSAgICBwYXJzZVRvcExldmVsWE1MRmlsZShrUHJvZmlsaW5nUmVzdWx0cywgdHJ1ZS8qIGlnbm9yZV9lcnJvcnMgKi8pOwotfQotCi12b2lkIE1lZGlhQ29kZWNMaXN0OjpwYXJzZVRvcExldmVsWE1MRmlsZShjb25zdCBjaGFyICpjb2RlY3NfeG1sLCBib29sIGlnbm9yZV9lcnJvcnMpIHsKLSAgICAvLyBnZXQgaHJlZl9iYXNlCi0gICAgY29uc3QgY2hhciAqaHJlZl9iYXNlX2VuZCA9IHN0cnJjaHIoY29kZWNzX3htbCwgJy8nKTsKLSAgICBpZiAoaHJlZl9iYXNlX2VuZCAhPSBOVUxMKSB7Ci0gICAgICAgIG1IcmVmQmFzZSA9IEFTdHJpbmcoY29kZWNzX3htbCwgaHJlZl9iYXNlX2VuZCAtIGNvZGVjc194bWwgKyAxKTsKLSAgICB9Ci0KLSAgICBtSW5pdENoZWNrID0gT0s7IC8vIGtlZXBpbmcgdGhpcyBoZXJlIGZvciBzYWZldHkKLSAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX1RPUExFVkVMOwotICAgIG1EZXB0aCA9IDA7Ci0KLSAgICBPTVhDbGllbnQgY2xpZW50OwotICAgIG1Jbml0Q2hlY2sgPSBjbGllbnQuY29ubmVjdCgpOwotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybjsgIC8vIHRoaXMgbWF5IGZhaWwgaWYgSU1lZGlhUGxheWVyU2VydmljZSBpcyBub3QgYXZhaWxhYmxlLgotICAgIH0KLSAgICBwYXJzZVhNTEZpbGUoY29kZWNzX3htbCk7Ci0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICBpZiAoaWdub3JlX2Vycm9ycykgewotICAgICAgICAgICAgbUluaXRDaGVjayA9IE9LOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1Db2RlY0luZm9zLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBWZWN0b3I8TWVkaWFSZXNvdXJjZVBvbGljeT4gcG9saWNpZXM7Ci0gICAgQVN0cmluZyB2YWx1ZTsKLSAgICBpZiAobUdsb2JhbFNldHRpbmdzLT5maW5kU3RyaW5nKGtQb2xpY3lTdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzLCAmdmFsdWUpKSB7Ci0gICAgICAgIHBvbGljaWVzLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlUG9saWN5KAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChrUG9saWN5U3VwcG9ydHNNdWx0aXBsZVNlY3VyZUNvZGVjcyksCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KHZhbHVlLmNfc3RyKCkpKSk7Ci0gICAgfQotICAgIGlmIChtR2xvYmFsU2V0dGluZ3MtPmZpbmRTdHJpbmcoa1BvbGljeVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjLCAmdmFsdWUpKSB7Ci0gICAgICAgIHBvbGljaWVzLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlUG9saWN5KAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChrUG9saWN5U3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWMpLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCh2YWx1ZS5jX3N0cigpKSkpOwotICAgIH0KLSAgICBpZiAocG9saWNpZXMuc2l6ZSgpID4gMCkgewotICAgICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7Ci0gICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5yZXNvdXJjZV9tYW5hZ2VyIikpOwotICAgICAgICBzcDxJUmVzb3VyY2VNYW5hZ2VyU2VydmljZT4gc2VydmljZSA9IGludGVyZmFjZV9jYXN0PElSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPihiaW5kZXIpOwotICAgICAgICBpZiAoc2VydmljZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiTWVkaWFDb2RlY0xpc3Q6IGZhaWxlZCB0byBnZXQgUmVzb3VyY2VNYW5hZ2VyU2VydmljZSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2VydmljZS0+Y29uZmlnKHBvbGljaWVzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSBtQ29kZWNJbmZvcy5zaXplKCk7IGkgPiAwOykgewotICAgICAgICBpLS07Ci0gICAgICAgIGNvbnN0IE1lZGlhQ29kZWNJbmZvICZpbmZvID0gKm1Db2RlY0luZm9zLml0ZW1BdChpKS5nZXQoKTsKLSAgICAgICAgaWYgKGluZm8ubUNhcHMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIC8vIE5vIHR5cGVzIHN1cHBvcnRlZCBieSB0aGlzIGNvbXBvbmVudD8/PwotICAgICAgICAgICAgQUxPR1coIkNvbXBvbmVudCAlcyBkb2VzIG5vdCBzdXBwb3J0IGFueSB0eXBlIG9mIG1lZGlhPyIsCi0gICAgICAgICAgICAgICAgICBpbmZvLm1OYW1lLmNfc3RyKCkpOwotCi0gICAgICAgICAgICBtQ29kZWNJbmZvcy5yZW1vdmVBdChpKTsKLSNpZiBMT0dfTkRFQlVHID09IDAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IHR5cGVfaXggPSAwOyB0eXBlX2l4IDwgaW5mby5tQ2Fwcy5zaXplKCk7ICsrdHlwZV9peCkgewotICAgICAgICAgICAgICAgIEFTdHJpbmcgbWltZSA9IGluZm8ubUNhcHMua2V5QXQodHlwZV9peCk7Ci0gICAgICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gJmNhcHMgPSBpbmZvLm1DYXBzLnZhbHVlQXQodHlwZV9peCk7Ci0KLSAgICAgICAgICAgICAgICBBTE9HVigiJXMgY29kZWMgaW5mbyBmb3IgJXM6ICVzIiwgaW5mby5tTmFtZS5jX3N0cigpLCBtaW1lLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5nZXREZXRhaWxzKCktPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiAgICBmbGFncz0lZCIsIGNhcHMtPmdldEZsYWdzKCkpOwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQzMl90PiBjb2xvckZvcm1hdHM7Ci0gICAgICAgICAgICAgICAgICAgIGNhcHMtPmdldFN1cHBvcnRlZENvbG9yRm9ybWF0cygmY29sb3JGb3JtYXRzKTsKLSAgICAgICAgICAgICAgICAgICAgQVN0cmluZyBuaWNlOwotICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgY29sb3JGb3JtYXRzLnNpemUoKTsgaXgrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pY2UuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbmljZS5hcHBlbmQoY29sb3JGb3JtYXRzLml0ZW1BdChpeCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCIgICAgY29sb3JzPVslc10iLCBuaWNlLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFZlY3RvcjxNZWRpYUNvZGVjSW5mbzo6UHJvZmlsZUxldmVsPiBwcm9maWxlTGV2ZWxzOwotICAgICAgICAgICAgICAgICAgICBjYXBzLT5nZXRTdXBwb3J0ZWRQcm9maWxlTGV2ZWxzKCZwcm9maWxlTGV2ZWxzKTsKLSAgICAgICAgICAgICAgICAgICAgQVN0cmluZyBuaWNlOwotICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgcHJvZmlsZUxldmVscy5zaXplKCk7IGl4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpeCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWNlLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lZGlhQ29kZWNJbmZvOjpQcm9maWxlTGV2ZWwgJnBsID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlTGV2ZWxzLml0ZW1BdChpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuaWNlLmFwcGVuZChwbC5tUHJvZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuaWNlLmFwcGVuZCgiLyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmljZS5hcHBlbmQocGwubUxldmVsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBBTE9HVigiICAgIGxldmVscz1bJXNdIiwgbmljZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIHF1aXJrczsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IGluZm8ubVF1aXJrcy5zaXplKCk7IGl4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpeCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWlya3MuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcXVpcmtzLmFwcGVuZChpbmZvLm1RdWlya3NbaXhdKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBBTE9HVigiICAgIHF1aXJrcz1bJXNdIiwgcXVpcmtzLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICB9Ci0gICAgfQotCi0jaWYgMAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvZGVjSW5mb3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgY29uc3QgQ29kZWNJbmZvICZpbmZvID0gbUNvZGVjSW5mb3MuaXRlbUF0KGkpOwotCi0gICAgICAgIEFTdHJpbmcgbGluZSA9IGluZm8ubU5hbWU7Ci0gICAgICAgIGxpbmUuYXBwZW5kKCIgc3VwcG9ydHMgIik7Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbVR5cGVzLnNpemUoKTsgKytqKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSA9IG1UeXBlcy52YWx1ZUF0KGopOwotCi0gICAgICAgICAgICBpZiAoaW5mby5tVHlwZXMgJiAoMXVsIDw8IHZhbHVlKSkgewotICAgICAgICAgICAgICAgIGxpbmUuYXBwZW5kKG1UeXBlcy5rZXlBdChqKSk7Ci0gICAgICAgICAgICAgICAgbGluZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEFMT0dJKCIlcyIsIGxpbmUuY19zdHIoKSk7Ci0gICAgfQotI2VuZGlmCitNZWRpYUNvZGVjTGlzdDo6TWVkaWFDb2RlY0xpc3QoTWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZSogYnVpbGRlcikgeworICAgIG1HbG9iYWxTZXR0aW5ncyA9IG5ldyBBTWVzc2FnZSgpOworICAgIG1Db2RlY0luZm9zLmNsZWFyKCk7CisgICAgTWVkaWFDb2RlY0xpc3RXcml0ZXIgd3JpdGVyKHRoaXMpOworICAgIG1Jbml0Q2hlY2sgPSBidWlsZGVyLT5idWlsZE1lZGlhQ29kZWNMaXN0KCZ3cml0ZXIpOwogfQogCiBNZWRpYUNvZGVjTGlzdDo6fk1lZGlhQ29kZWNMaXN0KCkgewpAQCAtMzQ3LDUzMSArMTg1LDIxIEBACiAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CiB9CiAKLXZvaWQgTWVkaWFDb2RlY0xpc3Q6OnBhcnNlWE1MRmlsZShjb25zdCBjaGFyICpwYXRoKSB7Ci0gICAgRklMRSAqZmlsZSA9IGZvcGVuKHBhdGgsICJyIik7Ci0KLSAgICBpZiAoZmlsZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJ1bmFibGUgdG8gb3BlbiBtZWRpYSBjb2RlY3MgY29uZmlndXJhdGlvbiB4bWwgZmlsZTogJXMiLCBwYXRoKTsKLSAgICAgICAgbUluaXRDaGVjayA9IE5BTUVfTk9UX0ZPVU5EOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgWE1MX1BhcnNlciBwYXJzZXIgPSA6OlhNTF9QYXJzZXJDcmVhdGUoTlVMTCk7Ci0gICAgQ0hFQ0socGFyc2VyICE9IE5VTEwpOwotCi0gICAgOjpYTUxfU2V0VXNlckRhdGEocGFyc2VyLCB0aGlzKTsKLSAgICA6OlhNTF9TZXRFbGVtZW50SGFuZGxlcigKLSAgICAgICAgICAgIHBhcnNlciwgU3RhcnRFbGVtZW50SGFuZGxlcldyYXBwZXIsIEVuZEVsZW1lbnRIYW5kbGVyV3JhcHBlcik7Ci0KLSAgICBjb25zdCBpbnQgQlVGRl9TSVpFID0gNTEyOwotICAgIHdoaWxlIChtSW5pdENoZWNrID09IE9LKSB7Ci0gICAgICAgIHZvaWQgKmJ1ZmYgPSA6OlhNTF9HZXRCdWZmZXIocGFyc2VyLCBCVUZGX1NJWkUpOwotICAgICAgICBpZiAoYnVmZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZmFpbGVkIGluIGNhbGwgdG8gWE1MX0dldEJ1ZmZlcigpIik7Ci0gICAgICAgICAgICBtSW5pdENoZWNrID0gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGJ5dGVzX3JlYWQgPSA6OmZyZWFkKGJ1ZmYsIDEsIEJVRkZfU0laRSwgZmlsZSk7Ci0gICAgICAgIGlmIChieXRlc19yZWFkIDwgMCkgewotICAgICAgICAgICAgQUxPR0UoImZhaWxlZCBpbiBjYWxsIHRvIHJlYWQiKTsKLSAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBFUlJPUl9JTzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgWE1MX1N0YXR1cyBzdGF0dXMgPSA6OlhNTF9QYXJzZUJ1ZmZlcihwYXJzZXIsIGJ5dGVzX3JlYWQsIGJ5dGVzX3JlYWQgPT0gMCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gWE1MX1NUQVRVU19PSykgewotICAgICAgICAgICAgQUxPR0UoIm1hbGZvcm1lZCAoJXMpIiwgOjpYTUxfRXJyb3JTdHJpbmcoOjpYTUxfR2V0RXJyb3JDb2RlKHBhcnNlcikpKTsKLSAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChieXRlc19yZWFkID09IDApIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgOjpYTUxfUGFyc2VyRnJlZShwYXJzZXIpOwotCi0gICAgZmNsb3NlKGZpbGUpOwotICAgIGZpbGUgPSBOVUxMOworTWVkaWFDb2RlY0xpc3RXcml0ZXI6Ok1lZGlhQ29kZWNMaXN0V3JpdGVyKE1lZGlhQ29kZWNMaXN0KiBsaXN0KSA6CisgICAgbUxpc3QobGlzdCkgewogfQogCi0vLyBzdGF0aWMKLXZvaWQgTWVkaWFDb2RlY0xpc3Q6OlN0YXJ0RWxlbWVudEhhbmRsZXJXcmFwcGVyKAotICAgICAgICB2b2lkICptZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmF0dHJzKSB7Ci0gICAgc3RhdGljX2Nhc3Q8TWVkaWFDb2RlY0xpc3QgKj4obWUpLT5zdGFydEVsZW1lbnRIYW5kbGVyKG5hbWUsIGF0dHJzKTsKK3ZvaWQgTWVkaWFDb2RlY0xpc3RXcml0ZXI6OmFkZEdsb2JhbFNldHRpbmcoCisgICAgICAgIGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFsdWUpIHsKKyAgICBtTGlzdC0+bUdsb2JhbFNldHRpbmdzLT5zZXRTdHJpbmcoa2V5LCB2YWx1ZSk7CiB9CiAKLS8vIHN0YXRpYwotdm9pZCBNZWRpYUNvZGVjTGlzdDo6RW5kRWxlbWVudEhhbmRsZXJXcmFwcGVyKHZvaWQgKm1lLCBjb25zdCBjaGFyICpuYW1lKSB7Ci0gICAgc3RhdGljX2Nhc3Q8TWVkaWFDb2RlY0xpc3QgKj4obWUpLT5lbmRFbGVtZW50SGFuZGxlcihuYW1lKTsKLX0KLQotc3RhdHVzX3QgTWVkaWFDb2RlY0xpc3Q6OmluY2x1ZGVYTUxGaWxlKGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIGNvbnN0IGNoYXIgKmhyZWYgPSBOVUxMOwotICAgIHNpemVfdCBpID0gMDsKLSAgICB3aGlsZSAoYXR0cnNbaV0gIT0gTlVMTCkgewotICAgICAgICBpZiAoIXN0cmNtcChhdHRyc1tpXSwgImhyZWYiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzW2kgKyAxXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBocmVmID0gYXR0cnNbaSArIDFdOwotICAgICAgICAgICAgKytpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICAgICAgKytpOwotICAgIH0KLQotICAgIC8vIEZvciBzZWN1cml0eSByZWFzb25zIGFuZCBmb3Igc2ltcGxpY2l0eSwgZmlsZSBuYW1lcyBjYW4gb25seSBjb250YWluCi0gICAgLy8gW2EtekEtWjAtOV8uXSBhbmQgbXVzdCBzdGFydCB3aXRoICBtZWRpYV9jb2RlY3NfIGFuZCBlbmQgd2l0aCAueG1sCi0gICAgZm9yIChpID0gMDsgaHJlZltpXSAhPSAnXDAnOyBpKyspIHsKLSAgICAgICAgaWYgKGhyZWZbaV0gPT0gJy4nIHx8IGhyZWZbaV0gPT0gJ18nIHx8Ci0gICAgICAgICAgICAgICAgKGhyZWZbaV0gPj0gJzAnICYmIGhyZWZbaV0gPD0gJzknKSB8fAotICAgICAgICAgICAgICAgIChocmVmW2ldID49ICdBJyAmJiBocmVmW2ldIDw9ICdaJykgfHwKLSAgICAgICAgICAgICAgICAoaHJlZltpXSA+PSAnYScgJiYgaHJlZltpXSA8PSAneicpKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBBTE9HRSgiaW52YWxpZCBpbmNsdWRlIGZpbGUgbmFtZTogJXMiLCBocmVmKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgQVN0cmluZyBmaWxlbmFtZSA9IGhyZWY7Ci0gICAgaWYgKCFmaWxlbmFtZS5zdGFydHNXaXRoKCJtZWRpYV9jb2RlY3NfIikgfHwKLSAgICAgICAgIWZpbGVuYW1lLmVuZHNXaXRoKCIueG1sIikpIHsKLSAgICAgICAgQUxPR0UoImludmFsaWQgaW5jbHVkZSBmaWxlIG5hbWU6ICVzIiwgaHJlZik7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBmaWxlbmFtZS5pbnNlcnQobUhyZWZCYXNlLCAwKTsKLQotICAgIHBhcnNlWE1MRmlsZShmaWxlbmFtZS5jX3N0cigpKTsKLSAgICByZXR1cm4gbUluaXRDaGVjazsKLX0KLQotdm9pZCBNZWRpYUNvZGVjTGlzdDo6c3RhcnRFbGVtZW50SGFuZGxlcigKLSAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmF0dHJzKSB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGJvb2wgaW5UeXBlID0gdHJ1ZTsKLQotICAgIGlmICghc3RyY21wKG5hbWUsICJJbmNsdWRlIikpIHsKLSAgICAgICAgbUluaXRDaGVjayA9IGluY2x1ZGVYTUxGaWxlKGF0dHJzKTsKLSAgICAgICAgaWYgKG1Jbml0Q2hlY2sgPT0gT0spIHsKLSAgICAgICAgICAgIG1QYXN0U2VjdGlvbnMucHVzaChtQ3VycmVudFNlY3Rpb24pOwotICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9JTkNMVURFOwotICAgICAgICB9Ci0gICAgICAgICsrbURlcHRoOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3dpdGNoIChtQ3VycmVudFNlY3Rpb24pIHsKLSAgICAgICAgY2FzZSBTRUNUSU9OX1RPUExFVkVMOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVjb2RlcnMiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fREVDT0RFUlM7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIkVuY29kZXJzIikpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0VOQ09ERVJTOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJTZXR0aW5ncyIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9TRVRUSU5HUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBTRUNUSU9OX1NFVFRJTkdTOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiU2V0dGluZyIpKSB7Ci0gICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IGFkZFNldHRpbmdGcm9tQXR0cmlidXRlcyhhdHRycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSUzoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIk1lZGlhQ29kZWMiKSkgewotICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPQotICAgICAgICAgICAgICAgICAgICBhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXMoZmFsc2UgLyogZW5jb2RlciAqLywgYXR0cnMpOwotCi0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9ERUNPREVSOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFNFQ1RJT05fRU5DT0RFUlM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJNZWRpYUNvZGVjIikpIHsKLSAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0KLSAgICAgICAgICAgICAgICAgICAgYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzKHRydWUgLyogZW5jb2RlciAqLywgYXR0cnMpOwotCi0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9FTkNPREVSOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFNFQ1RJT05fREVDT0RFUjoKLSAgICAgICAgY2FzZSBTRUNUSU9OX0VOQ09ERVI6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJRdWlyayIpKSB7Ci0gICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IGFkZFF1aXJrKGF0dHJzKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiVHlwZSIpKSB7Ci0gICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IGFkZFR5cGVGcm9tQXR0cmlidXRlcyhhdHRycyk7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgKG1DdXJyZW50U2VjdGlvbiA9PSBTRUNUSU9OX0RFQ09ERVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFNFQ1RJT05fREVDT0RFUl9UWVBFIDogU0VDVElPTl9FTkNPREVSX1RZUEUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGluVHlwZSA9IGZhbHNlOwotICAgICAgICAvLyBmYWxsIHRocm91Z2gKLQotICAgICAgICBjYXNlIFNFQ1RJT05fREVDT0RFUl9UWVBFOgotICAgICAgICBjYXNlIFNFQ1RJT05fRU5DT0RFUl9UWVBFOgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUgbGltaXRzIGFuZCBmZWF0dXJlcyBzcGVjaWZpZWQgb3V0c2lkZSBvZiB0eXBlCi0gICAgICAgICAgICBib29sIG91dHNpZGUgPSAhaW5UeXBlICYmICFtQ3VycmVudEluZm8tPm1IYXNTb2xlTWltZTsKLSAgICAgICAgICAgIGlmIChvdXRzaWRlICYmICghc3RyY21wKG5hbWUsICJMaW1pdCIpIHx8ICFzdHJjbXAobmFtZSwgIkZlYXR1cmUiKSkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiaWdub3JpbmcgJXMgc3BlY2lmaWVkIG91dHNpZGUgb2YgYSBUeXBlIiwgbmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIkxpbWl0IikpIHsKLSAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gYWRkTGltaXQoYXR0cnMpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJGZWF0dXJlIikpIHsKLSAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gYWRkRmVhdHVyZShhdHRycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICArK21EZXB0aDsKLX0KLQotdm9pZCBNZWRpYUNvZGVjTGlzdDo6ZW5kRWxlbWVudEhhbmRsZXIoY29uc3QgY2hhciAqbmFtZSkgewotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKG1DdXJyZW50U2VjdGlvbikgewotICAgICAgICBjYXNlIFNFQ1RJT05fU0VUVElOR1M6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJTZXR0aW5ncyIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9UT1BMRVZFTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBTRUNUSU9OX0RFQ09ERVJTOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiRGVjb2RlcnMiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fVE9QTEVWRUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSUzoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIkVuY29kZXJzIikpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX1RPUExFVkVMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFNFQ1RJT05fREVDT0RFUl9UWVBFOgotICAgICAgICBjYXNlIFNFQ1RJT05fRU5DT0RFUl9UWVBFOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiVHlwZSIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgKG1DdXJyZW50U2VjdGlvbiA9PSBTRUNUSU9OX0RFQ09ERVJfVFlQRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gU0VDVElPTl9ERUNPREVSIDogU0VDVElPTl9FTkNPREVSKTsKLQotICAgICAgICAgICAgICAgIG1DdXJyZW50SW5mby0+Y29tcGxldGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBTRUNUSU9OX0RFQ09ERVI6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJNZWRpYUNvZGVjIikpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0RFQ09ERVJTOwotICAgICAgICAgICAgICAgIG1DdXJyZW50SW5mby0+Y29tcGxldGUoKTsKLSAgICAgICAgICAgICAgICBtQ3VycmVudEluZm8gPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFNFQ1RJT05fRU5DT0RFUjoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIk1lZGlhQ29kZWMiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fRU5DT0RFUlM7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT5jb21wbGV0ZSgpOzsKLSAgICAgICAgICAgICAgICBtQ3VycmVudEluZm8gPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFNFQ1RJT05fSU5DTFVERToKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIkluY2x1ZGUiKSAmJiBtUGFzdFNlY3Rpb25zLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBtUGFzdFNlY3Rpb25zLnRvcCgpOwotICAgICAgICAgICAgICAgIG1QYXN0U2VjdGlvbnMucG9wKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAtLW1EZXB0aDsKLX0KLQotc3RhdHVzX3QgTWVkaWFDb2RlY0xpc3Q6OmFkZFNldHRpbmdGcm9tQXR0cmlidXRlcyhjb25zdCBjaGFyICoqYXR0cnMpIHsKLSAgICBjb25zdCBjaGFyICpuYW1lID0gTlVMTDsKLSAgICBjb25zdCBjaGFyICp2YWx1ZSA9IE5VTEw7Ci0gICAgY29uc3QgY2hhciAqdXBkYXRlID0gTlVMTDsKLQotICAgIHNpemVfdCBpID0gMDsKLSAgICB3aGlsZSAoYXR0cnNbaV0gIT0gTlVMTCkgewotICAgICAgICBpZiAoIXN0cmNtcChhdHRyc1tpXSwgIm5hbWUiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzW2kgKyAxXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuYW1lID0gYXR0cnNbaSArIDFdOwotICAgICAgICAgICAgKytpOwotICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJ2YWx1ZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhbHVlID0gYXR0cnNbaSArIDFdOwotICAgICAgICAgICAgKytpOwotICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJ1cGRhdGUiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzW2kgKyAxXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1cGRhdGUgPSBhdHRyc1tpICsgMV07Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgICsraTsKLSAgICB9Ci0KLSAgICBpZiAobmFtZSA9PSBOVUxMIHx8IHZhbHVlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgbVVwZGF0ZSA9ICh1cGRhdGUgIT0gTlVMTCkgJiYgcGFyc2VCb29sZWFuKHVwZGF0ZSk7Ci0gICAgaWYgKG1VcGRhdGUgIT0gbUdsb2JhbFNldHRpbmdzLT5jb250YWlucyhuYW1lKSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBtR2xvYmFsU2V0dGluZ3MtPnNldFN0cmluZyhuYW1lLCB2YWx1ZSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIE1lZGlhQ29kZWNMaXN0OjpzZXRDdXJyZW50Q29kZWNJbmZvKGJvb2wgZW5jb2RlciwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdHlwZSkgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvZGVjSW5mb3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgaWYgKEFTdHJpbmcobmFtZSkgPT0gbUNvZGVjSW5mb3NbaV0tPmdldENvZGVjTmFtZSgpKSB7Ci0gICAgICAgICAgICBpZiAobUNvZGVjSW5mb3NbaV0tPmdldENhcGFiaWxpdGllc0Zvcih0eXBlKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIk92ZXJyaWRlcyB3aXRoIGFuIHVuZXhwZWN0ZWQgbWltZSAlcyIsIHR5cGUpOwotICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBNZWRpYUNvZGVjSW5mbyAoYnV0IGRvbid0IGFkZCBpdCB0byBtQ29kZWNJbmZvcykgdG8gaG9sZCB0aGUKLSAgICAgICAgICAgICAgICAvLyBvdmVycmlkZXMgd2UgZG9uJ3Qgd2FudC4KLSAgICAgICAgICAgICAgICBtQ3VycmVudEluZm8gPSBuZXcgTWVkaWFDb2RlY0luZm8obmFtZSwgZW5jb2RlciwgdHlwZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1DdXJyZW50SW5mbyA9IG1Db2RlY0luZm9zLmVkaXRJdGVtQXQoaSk7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT51cGRhdGVNaW1lKHR5cGUpOyAgLy8gdG8gc2V0IHRoZSBjdXJyZW50IGNhcAotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotICAgIG1DdXJyZW50SW5mbyA9IG5ldyBNZWRpYUNvZGVjSW5mbyhuYW1lLCBlbmNvZGVyLCB0eXBlKTsKLSAgICAvLyBUaGUgbmV4dCBzdGVwIGludm9sdmVzIHRyeWluZyB0byBsb2FkIHRoZSBjb2RlYywgd2hpY2ggbWF5Ci0gICAgLy8gZmFpbC4gIE9ubHkgbGlzdCB0aGUgY29kZWMgaWYgdGhpcyBzdWNjZWVkcy4KLSAgICAvLyBIb3dldmVyLCBrZWVwIG1DdXJyZW50SW5mbyBvYmplY3QgYXJvdW5kIHVudGlsIHBhcnNpbmcKLSAgICAvLyBvZiBmdWxsIGNvZGVjIGluZm8gaXMgY29tcGxldGVkLgotICAgIGlmIChpbml0aWFsaXplQ2FwYWJpbGl0aWVzKHR5cGUpID09IE9LKSB7Ci0gICAgICAgIG1Db2RlY0luZm9zLnB1c2hfYmFjayhtQ3VycmVudEluZm8pOwotICAgIH0KLX0KLQotc3RhdHVzX3QgTWVkaWFDb2RlY0xpc3Q6OmFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlcygKLSAgICAgICAgYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICoqYXR0cnMpIHsKLSAgICBjb25zdCBjaGFyICpuYW1lID0gTlVMTDsKLSAgICBjb25zdCBjaGFyICp0eXBlID0gTlVMTDsKLSAgICBjb25zdCBjaGFyICp1cGRhdGUgPSBOVUxMOwotCi0gICAgc2l6ZV90IGkgPSAwOwotICAgIHdoaWxlIChhdHRyc1tpXSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICghc3RyY21wKGF0dHJzW2ldLCAibmFtZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5hbWUgPSBhdHRyc1tpICsgMV07Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyc1tpXSwgInR5cGUiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzW2kgKyAxXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0eXBlID0gYXR0cnNbaSArIDFdOwotICAgICAgICAgICAgKytpOwotICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJ1cGRhdGUiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzW2kgKyAxXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1cGRhdGUgPSBhdHRyc1tpICsgMV07Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgICsraTsKLSAgICB9Ci0KLSAgICBpZiAobmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIG1VcGRhdGUgPSAodXBkYXRlICE9IE5VTEwpICYmIHBhcnNlQm9vbGVhbih1cGRhdGUpOwotICAgIHNzaXplX3QgaW5kZXggPSAtMTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db2RlY0luZm9zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGlmIChBU3RyaW5nKG5hbWUpID09IG1Db2RlY0luZm9zW2ldLT5nZXRDb2RlY05hbWUoKSkgewotICAgICAgICAgICAgaW5kZXggPSBpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtVXBkYXRlICE9IChpbmRleCA+PSAwKSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAvLyBleGlzdGluZyBjb2RlYwotICAgICAgICBtQ3VycmVudEluZm8gPSBtQ29kZWNJbmZvcy5lZGl0SXRlbUF0KGluZGV4KTsKLSAgICAgICAgaWYgKHR5cGUgIT0gTlVMTCkgewotICAgICAgICAgICAgLy8gZXhpc3RpbmcgdHlwZQotICAgICAgICAgICAgaWYgKG1Db2RlY0luZm9zW2luZGV4XS0+Z2V0Q2FwYWJpbGl0aWVzRm9yKHR5cGUpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DdXJyZW50SW5mby0+dXBkYXRlTWltZSh0eXBlKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIG5ldyBjb2RlYwotICAgICAgICBtQ3VycmVudEluZm8gPSBuZXcgTWVkaWFDb2RlY0luZm8obmFtZSwgZW5jb2RlciwgdHlwZSk7Ci0gICAgICAgIC8vIFRoZSBuZXh0IHN0ZXAgaW52b2x2ZXMgdHJ5aW5nIHRvIGxvYWQgdGhlIGNvZGVjLCB3aGljaCBtYXkKLSAgICAgICAgLy8gZmFpbC4gIE9ubHkgbGlzdCB0aGUgY29kZWMgaWYgdGhpcyBzdWNjZWVkcy4KLSAgICAgICAgLy8gSG93ZXZlciwga2VlcCBtQ3VycmVudEluZm8gb2JqZWN0IGFyb3VuZCB1bnRpbCBwYXJzaW5nCi0gICAgICAgIC8vIG9mIGZ1bGwgY29kZWMgaW5mbyBpcyBjb21wbGV0ZWQuCi0gICAgICAgIGlmIChpbml0aWFsaXplQ2FwYWJpbGl0aWVzKHR5cGUpID09IE9LKSB7Ci0gICAgICAgICAgICBtQ29kZWNJbmZvcy5wdXNoX2JhY2sobUN1cnJlbnRJbmZvKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTWVkaWFDb2RlY0xpc3Q6OmluaXRpYWxpemVDYXBhYmlsaXRpZXMoY29uc3QgY2hhciAqdHlwZSkgewotICAgIGlmICh0eXBlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIEFMT0dWKCJpbml0aWFsaXplQ2FwYWJpbGl0aWVzICVzOiVzIiwKLSAgICAgICAgICAgIG1DdXJyZW50SW5mby0+bU5hbWUuY19zdHIoKSwgdHlwZSk7Ci0KLSAgICBzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPiBjYXBzOwotICAgIHN0YXR1c190IGVyciA9IE1lZGlhQ29kZWM6OlF1ZXJ5Q2FwYWJpbGl0aWVzKAotICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT5tTmFtZSwKLSAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICBtQ3VycmVudEluZm8tPm1Jc0VuY29kZXIsCi0gICAgICAgICAgICAmY2Fwcyk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0gZWxzZSBpZiAoY2FwcyA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJNZWRpYUNvZGVjOjpRdWVyeUNhcGFiaWxpdGllcyByZXR1cm5lZCBPSyBidXQgbm8gY2FwYWJpbGl0aWVzIGZvciAnJXMnOiclcyc6JyVzJyIsCi0gICAgICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT5tTmFtZS5jX3N0cigpLCB0eXBlLAotICAgICAgICAgICAgICAgIG1DdXJyZW50SW5mby0+bUlzRW5jb2RlciA/ICJlbmNvZGVyIiA6ICJkZWNvZGVyIik7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIHJldHVybiBtQ3VycmVudEluZm8tPmluaXRpYWxpemVDYXBhYmlsaXRpZXMoY2Fwcyk7Ci19Ci0KLXN0YXR1c190IE1lZGlhQ29kZWNMaXN0OjphZGRRdWlyayhjb25zdCBjaGFyICoqYXR0cnMpIHsKLSAgICBjb25zdCBjaGFyICpuYW1lID0gTlVMTDsKLQotICAgIHNpemVfdCBpID0gMDsKLSAgICB3aGlsZSAoYXR0cnNbaV0gIT0gTlVMTCkgewotICAgICAgICBpZiAoIXN0cmNtcChhdHRyc1tpXSwgIm5hbWUiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzW2kgKyAxXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuYW1lID0gYXR0cnNbaSArIDFdOwotICAgICAgICAgICAgKytpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICArK2k7Ci0gICAgfQotCi0gICAgaWYgKG5hbWUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBtQ3VycmVudEluZm8tPmFkZFF1aXJrKG5hbWUpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTWVkaWFDb2RlY0xpc3Q6OmFkZFR5cGVGcm9tQXR0cmlidXRlcyhjb25zdCBjaGFyICoqYXR0cnMpIHsKLSAgICBjb25zdCBjaGFyICpuYW1lID0gTlVMTDsKLSAgICBjb25zdCBjaGFyICp1cGRhdGUgPSBOVUxMOwotCi0gICAgc2l6ZV90IGkgPSAwOwotICAgIHdoaWxlIChhdHRyc1tpXSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICghc3RyY21wKGF0dHJzW2ldLCAibmFtZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5hbWUgPSBhdHRyc1tpICsgMV07Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyc1tpXSwgInVwZGF0ZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVwZGF0ZSA9IGF0dHJzW2kgKyAxXTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgKytpOwotICAgIH0KLQotICAgIGlmIChuYW1lID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgYm9vbCBpc0V4aXN0aW5nVHlwZSA9IChtQ3VycmVudEluZm8tPmdldENhcGFiaWxpdGllc0ZvcihuYW1lKSAhPSBOVUxMKTsKLSAgICBpZiAobVVwZGF0ZSAhPSBpc0V4aXN0aW5nVHlwZSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCByZXQ7Ci0gICAgaWYgKG1VcGRhdGUpIHsKLSAgICAgICAgcmV0ID0gbUN1cnJlbnRJbmZvLT51cGRhdGVNaW1lKG5hbWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldCA9IG1DdXJyZW50SW5mby0+YWRkTWltZShuYW1lKTsKLSAgICB9Ci0KLSAgICBpZiAocmV0ICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgLy8gVGhlIG5leHQgc3RlcCBpbnZvbHZlcyB0cnlpbmcgdG8gbG9hZCB0aGUgY29kZWMsIHdoaWNoIG1heQotICAgIC8vIGZhaWwuICBIYW5kbGUgdGhpcyBncmFjZWZ1bGx5IChieSBub3QgcmVwb3J0aW5nIHN1Y2ggbWltZSkuCi0gICAgaWYgKCFtVXBkYXRlICYmIGluaXRpYWxpemVDYXBhYmlsaXRpZXMobmFtZSkgIT0gT0spIHsKLSAgICAgICAgbUN1cnJlbnRJbmZvLT5yZW1vdmVNaW1lKG5hbWUpOwotICAgIH0KLSAgICByZXR1cm4gT0s7CitzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+CisgICAgICAgIE1lZGlhQ29kZWNMaXN0V3JpdGVyOjphZGRNZWRpYUNvZGVjSW5mbygpIHsKKyAgICBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IG5ldyBNZWRpYUNvZGVjSW5mbygpOworICAgIG1MaXN0LT5tQ29kZWNJbmZvcy5wdXNoX2JhY2soaW5mbyk7CisgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4oCisgICAgICAgICAgICBuZXcgTWVkaWFDb2RlY0luZm9Xcml0ZXIoaW5mby5nZXQoKSkpOwogfQogCiAvLyBsZWdhY3kgbWV0aG9kIGZvciBub24tYWR2YW5jZWQgY29kZWNzCkBAIC04ODIsMTUgKzIxMCwxNSBAQAogICAgICAgICAiZmVhdHVyZS10dW5uZWxlZC1wbGF5YmFjayIsCiAgICAgfTsKIAotICAgIHNpemVfdCBudW1Db2RlY3MgPSBtQ29kZWNJbmZvcy5zaXplKCk7Ci0gICAgZm9yICg7IHN0YXJ0SW5kZXggPCBudW1Db2RlY3M7ICsrc3RhcnRJbmRleCkgewotICAgICAgICBjb25zdCBNZWRpYUNvZGVjSW5mbyAmaW5mbyA9ICptQ29kZWNJbmZvcy5pdGVtQXQoc3RhcnRJbmRleCkuZ2V0KCk7CisgICAgc2l6ZV90IG51bUNvZGVjSW5mb3MgPSBtQ29kZWNJbmZvcy5zaXplKCk7CisgICAgZm9yICg7IHN0YXJ0SW5kZXggPCBudW1Db2RlY0luZm9zOyArK3N0YXJ0SW5kZXgpIHsKKyAgICAgICAgY29uc3QgTWVkaWFDb2RlY0luZm8gJmluZm8gPSAqbUNvZGVjSW5mb3Nbc3RhcnRJbmRleF07CiAKICAgICAgICAgaWYgKGluZm8uaXNFbmNvZGVyKCkgIT0gZW5jb2RlcikgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gY2FwYWJpbGl0aWVzID0gaW5mby5nZXRDYXBhYmlsaXRpZXNGb3IodHlwZSk7Ci0gICAgICAgIGlmIChjYXBhYmlsaXRpZXMgPT0gTlVMTCkgeworICAgICAgICBpZiAoY2FwYWJpbGl0aWVzID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZGV0YWlscyA9IGNhcGFiaWxpdGllcy0+Z2V0RGV0YWlscygpOwpAQCAtOTEzLDIyMyArMjQxLDkgQEAKICAgICByZXR1cm4gLUVOT0VOVDsKIH0KIAotc3RhdGljIHN0YXR1c190IGxpbWl0Rm91bmRNaXNzaW5nQXR0cihjb25zdCBBU3RyaW5nICZuYW1lLCBjb25zdCBjaGFyICphdHRyLCBib29sIGZvdW5kID0gdHJ1ZSkgewotICAgIEFMT0dFKCJsaW1pdCAnJXMnIHdpdGggJXMnJXMnIGF0dHJpYnV0ZSIsIG5hbWUuY19zdHIoKSwKLSAgICAgICAgICAgIChmb3VuZCA/ICIiIDogIm5vICIpLCBhdHRyKTsKLSAgICByZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIHN0YXR1c190IGxpbWl0RXJyb3IoY29uc3QgQVN0cmluZyAmbmFtZSwgY29uc3QgY2hhciAqbXNnKSB7Ci0gICAgQUxPR0UoImxpbWl0ICclcycgJXMiLCBuYW1lLmNfc3RyKCksIG1zZyk7Ci0gICAgcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBzdGF0dXNfdCBsaW1pdEludmFsaWRBdHRyKGNvbnN0IEFTdHJpbmcgJm5hbWUsIGNvbnN0IGNoYXIgKmF0dHIsIGNvbnN0IEFTdHJpbmcgJnZhbHVlKSB7Ci0gICAgQUxPR0UoImxpbWl0ICclcycgd2l0aCBpbnZhbGlkICclcycgYXR0cmlidXRlICglcykiLCBuYW1lLmNfc3RyKCksCi0gICAgICAgICAgICBhdHRyLCB2YWx1ZS5jX3N0cigpKTsKLSAgICByZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdHVzX3QgTWVkaWFDb2RlY0xpc3Q6OmFkZExpbWl0KGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoKTsKLQotICAgIHNpemVfdCBpID0gMDsKLSAgICB3aGlsZSAoYXR0cnNbaV0gIT0gTlVMTCkgewotICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYXR0cmlidXRlcyB3aXRoIHZhbHVlcwotICAgICAgICBpZiAoIXN0cmNtcChhdHRyc1tpXSwgIm5hbWUiKQotICAgICAgICAgICAgICAgIHx8ICFzdHJjbXAoYXR0cnNbaV0sICJkZWZhdWx0IikKLSAgICAgICAgICAgICAgICB8fCAhc3RyY21wKGF0dHJzW2ldLCAiaW4iKQotICAgICAgICAgICAgICAgIHx8ICFzdHJjbXAoYXR0cnNbaV0sICJtYXgiKQotICAgICAgICAgICAgICAgIHx8ICFzdHJjbXAoYXR0cnNbaV0sICJtaW4iKQotICAgICAgICAgICAgICAgIHx8ICFzdHJjbXAoYXR0cnNbaV0sICJyYW5nZSIpCi0gICAgICAgICAgICAgICAgfHwgIXN0cmNtcChhdHRyc1tpXSwgInJhbmdlcyIpCi0gICAgICAgICAgICAgICAgfHwgIXN0cmNtcChhdHRyc1tpXSwgInNjYWxlIikKLSAgICAgICAgICAgICAgICB8fCAhc3RyY21wKGF0dHJzW2ldLCAidmFsdWUiKSkgewotICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoYXR0cnNbaV0sIGF0dHJzW2kgKyAxXSk7Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICArK2k7Ci0gICAgfQotCi0gICAgQVN0cmluZyBuYW1lOwotICAgIGlmICghbXNnLT5maW5kU3RyaW5nKCJuYW1lIiwgJm5hbWUpKSB7Ci0gICAgICAgIEFMT0dFKCJsaW1pdCB3aXRoIG5vICduYW1lJyBhdHRyaWJ1dGUiKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgLy8gc2l6ZSwgYmxvY2tzLCBiaXRyYXRlLCBmcmFtZS1yYXRlLCBibG9ja3MtcGVyLXNlY29uZCwgYXNwZWN0LXJhdGlvLAotICAgIC8vIG1lYXN1cmVkLWZyYW1lLXJhdGUsIG1lYXN1cmVkLWJsb2Nrcy1wZXItc2Vjb25kOiByYW5nZQotICAgIC8vIHF1YWxpdHk6IHJhbmdlICsgZGVmYXVsdCArIFtzY2FsZV0KLSAgICAvLyBjb21wbGV4aXR5OiByYW5nZSArIGRlZmF1bHQKLSAgICBib29sIGZvdW5kOwotCi0gICAgaWYgKG5hbWUgPT0gImFzcGVjdC1yYXRpbyIgfHwgbmFtZSA9PSAiYml0cmF0ZSIgfHwgbmFtZSA9PSAiYmxvY2stY291bnQiCi0gICAgICAgICAgICB8fCBuYW1lID09ICJibG9ja3MtcGVyLXNlY29uZCIgfHwgbmFtZSA9PSAiY29tcGxleGl0eSIKLSAgICAgICAgICAgIHx8IG5hbWUgPT0gImZyYW1lLXJhdGUiIHx8IG5hbWUgPT0gInF1YWxpdHkiIHx8IG5hbWUgPT0gInNpemUiCi0gICAgICAgICAgICB8fCBuYW1lID09ICJtZWFzdXJlZC1ibG9ja3MtcGVyLXNlY29uZCIgfHwgbmFtZS5zdGFydHNXaXRoKCJtZWFzdXJlZC1mcmFtZS1yYXRlLSIpKSB7Ci0gICAgICAgIEFTdHJpbmcgbWluLCBtYXg7Ci0gICAgICAgIGlmIChtc2ctPmZpbmRTdHJpbmcoIm1pbiIsICZtaW4pICYmIG1zZy0+ZmluZFN0cmluZygibWF4IiwgJm1heCkpIHsKLSAgICAgICAgICAgIG1pbi5hcHBlbmQoIi0iKTsKLSAgICAgICAgICAgIG1pbi5hcHBlbmQobWF4KTsKLSAgICAgICAgICAgIGlmIChtc2ctPmNvbnRhaW5zKCJyYW5nZSIpIHx8IG1zZy0+Y29udGFpbnMoInZhbHVlIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbGltaXRFcnJvcihuYW1lLCAiaGFzICdtaW4nIGFuZCAnbWF4JyBhcyB3ZWxsIGFzICdyYW5nZScgb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgIid2YWx1ZScgYXR0cmlidXRlcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoInJhbmdlIiwgbWluKTsKLSAgICAgICAgfSBlbHNlIGlmIChtc2ctPmNvbnRhaW5zKCJtaW4iKSB8fCBtc2ctPmNvbnRhaW5zKCJtYXgiKSkgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0RXJyb3IobmFtZSwgImhhcyBvbmx5ICdtaW4nIG9yICdtYXgnIGF0dHJpYnV0ZSIpOwotICAgICAgICB9IGVsc2UgaWYgKG1zZy0+ZmluZFN0cmluZygidmFsdWUiLCAmbWF4KSkgewotICAgICAgICAgICAgbWluID0gbWF4OwotICAgICAgICAgICAgbWluLmFwcGVuZCgiLSIpOwotICAgICAgICAgICAgbWluLmFwcGVuZChtYXgpOwotICAgICAgICAgICAgaWYgKG1zZy0+Y29udGFpbnMoInJhbmdlIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbGltaXRFcnJvcihuYW1lLCAiaGFzIGJvdGggJ3JhbmdlJyBhbmQgJ3ZhbHVlJyBhdHRyaWJ1dGVzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtc2ctPnNldFN0cmluZygicmFuZ2UiLCBtaW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgQVN0cmluZyByYW5nZSwgc2NhbGUgPSAibGluZWFyIiwgZGVmLCBpbl87Ci0gICAgICAgIGlmICghbXNnLT5maW5kU3RyaW5nKCJyYW5nZSIsICZyYW5nZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEVycm9yKG5hbWUsICJ3aXRoIG5vICdyYW5nZScsICd2YWx1ZScgb3IgJ21pbicvJ21heCcgYXR0cmlidXRlcyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChuYW1lID09ICJxdWFsaXR5IiB8fCBuYW1lID09ICJjb21wbGV4aXR5IikgXgotICAgICAgICAgICAgICAgIChmb3VuZCA9IG1zZy0+ZmluZFN0cmluZygiZGVmYXVsdCIsICZkZWYpKSkgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAiZGVmYXVsdCIsIGZvdW5kKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmFtZSAhPSAicXVhbGl0eSIgJiYgbXNnLT5maW5kU3RyaW5nKCJzY2FsZSIsICZzY2FsZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgInNjYWxlIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChuYW1lID09ICJhc3BlY3QtcmF0aW8iKSBeIChmb3VuZCA9IG1zZy0+ZmluZFN0cmluZygiaW4iLCAmaW5fKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgImluIiwgZm91bmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5hbWUgPT0gImFzcGVjdC1yYXRpbyIpIHsKLSAgICAgICAgICAgIGlmICghKGluXyA9PSAicGl4ZWxzIikgJiYgIShpbl8gPT0gImJsb2NrcyIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0SW52YWxpZEF0dHIobmFtZSwgImluIiwgaW5fKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGluXy5lcmFzZSg1LCAxKTsgLy8gKHBpeGVsfGJsb2NrKS1hc3BlY3QtcmF0aW8KLSAgICAgICAgICAgIGluXy5hcHBlbmQoIi0iKTsKLSAgICAgICAgICAgIGluXy5hcHBlbmQobmFtZSk7Ci0gICAgICAgICAgICBuYW1lID0gaW5fOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuYW1lID09ICJxdWFsaXR5IikgewotICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT5hZGREZXRhaWwoInF1YWxpdHktc2NhbGUiLCBzY2FsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5hbWUgPT0gInF1YWxpdHkiIHx8IG5hbWUgPT0gImNvbXBsZXhpdHkiKSB7Ci0gICAgICAgICAgICBBU3RyaW5nIHRhZyA9IG5hbWU7Ci0gICAgICAgICAgICB0YWcuYXBwZW5kKCItZGVmYXVsdCIpOwotICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT5hZGREZXRhaWwodGFnLCBkZWYpOwotICAgICAgICB9Ci0gICAgICAgIEFTdHJpbmcgdGFnID0gbmFtZTsKLSAgICAgICAgdGFnLmFwcGVuZCgiLXJhbmdlIik7Ci0gICAgICAgIG1DdXJyZW50SW5mby0+YWRkRGV0YWlsKHRhZywgcmFuZ2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFTdHJpbmcgbWF4LCB2YWx1ZSwgcmFuZ2VzOwotICAgICAgICBpZiAobXNnLT5jb250YWlucygiZGVmYXVsdCIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJkZWZhdWx0Iik7Ci0gICAgICAgIH0gZWxzZSBpZiAobXNnLT5jb250YWlucygiaW4iKSkgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAiaW4iKTsKLSAgICAgICAgfSBlbHNlIGlmICgobmFtZSA9PSAiY2hhbm5lbC1jb3VudCIgfHwgbmFtZSA9PSAiY29uY3VycmVudC1pbnN0YW5jZXMiKSBeCi0gICAgICAgICAgICAgICAgKGZvdW5kID0gbXNnLT5maW5kU3RyaW5nKCJtYXgiLCAmbWF4KSkpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgIm1heCIsIGZvdW5kKTsKLSAgICAgICAgfSBlbHNlIGlmIChtc2ctPmNvbnRhaW5zKCJtaW4iKSkgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAibWluIik7Ci0gICAgICAgIH0gZWxzZSBpZiAobXNnLT5jb250YWlucygicmFuZ2UiKSkgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAicmFuZ2UiKTsKLSAgICAgICAgfSBlbHNlIGlmICgobmFtZSA9PSAic2FtcGxlLXJhdGUiKSBeCi0gICAgICAgICAgICAgICAgKGZvdW5kID0gbXNnLT5maW5kU3RyaW5nKCJyYW5nZXMiLCAmcmFuZ2VzKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgInJhbmdlcyIsIGZvdW5kKTsKLSAgICAgICAgfSBlbHNlIGlmIChtc2ctPmNvbnRhaW5zKCJzY2FsZSIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJzY2FsZSIpOwotICAgICAgICB9IGVsc2UgaWYgKChuYW1lID09ICJhbGlnbm1lbnQiIHx8IG5hbWUgPT0gImJsb2NrLXNpemUiKSBeCi0gICAgICAgICAgICAgICAgKGZvdW5kID0gbXNnLT5maW5kU3RyaW5nKCJ2YWx1ZSIsICZ2YWx1ZSkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJ2YWx1ZSIsIGZvdW5kKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtYXguc2l6ZSgpKSB7Ci0gICAgICAgICAgICBBU3RyaW5nIHRhZyA9ICJtYXgtIjsKLSAgICAgICAgICAgIHRhZy5hcHBlbmQobmFtZSk7Ci0gICAgICAgICAgICBtQ3VycmVudEluZm8tPmFkZERldGFpbCh0YWcsIG1heCk7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBtQ3VycmVudEluZm8tPmFkZERldGFpbChuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocmFuZ2VzLnNpemUoKSkgewotICAgICAgICAgICAgQVN0cmluZyB0YWcgPSBuYW1lOwotICAgICAgICAgICAgdGFnLmFwcGVuZCgiLXJhbmdlcyIpOwotICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT5hZGREZXRhaWwodGFnLCByYW5nZXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1coIklnbm9yaW5nIHVucmVjb2duaXplZCBsaW1pdCAnJXMnIiwgbmFtZS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE1lZGlhQ29kZWNMaXN0OjphZGRGZWF0dXJlKGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIHNpemVfdCBpID0gMDsKLSAgICBjb25zdCBjaGFyICpuYW1lID0gTlVMTDsKLSAgICBpbnQzMl90IG9wdGlvbmFsID0gLTE7Ci0gICAgaW50MzJfdCByZXF1aXJlZCA9IC0xOwotICAgIGNvbnN0IGNoYXIgKnZhbHVlID0gTlVMTDsKLQotICAgIHdoaWxlIChhdHRyc1tpXSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhdHRyaWJ1dGVzIHdpdGggdmFsdWVzCi0gICAgICAgIGlmICghc3RyY21wKGF0dHJzW2ldLCAibmFtZSIpKSB7Ci0gICAgICAgICAgICBuYW1lID0gYXR0cnNbaSArIDFdOwotICAgICAgICAgICAgKytpOwotICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJvcHRpb25hbCIpIHx8ICFzdHJjbXAoYXR0cnNbaV0sICJyZXF1aXJlZCIpKSB7Ci0gICAgICAgICAgICBpbnQgdmFsdWUgPSAoaW50KXBhcnNlQm9vbGVhbihhdHRyc1tpICsgMV0pOwotICAgICAgICAgICAgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJvcHRpb25hbCIpKSB7Ci0gICAgICAgICAgICAgICAgb3B0aW9uYWwgPSB2YWx1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGF0dHJzW2ldLCAidmFsdWUiKSkgewotICAgICAgICAgICAgdmFsdWUgPSBhdHRyc1tpICsgMV07Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICArK2k7Ci0gICAgfQotICAgIGlmIChuYW1lID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoImZlYXR1cmUgd2l0aCBubyAnbmFtZScgYXR0cmlidXRlIik7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGlmIChvcHRpb25hbCA9PSByZXF1aXJlZCAmJiBvcHRpb25hbCAhPSAtMSkgewotICAgICAgICBBTE9HRSgiZmVhdHVyZSAnJXMnIGlzIGJvdGgvbmVpdGhlciBvcHRpb25hbCBhbmQgcmVxdWlyZWQiLCBuYW1lKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgaWYgKChvcHRpb25hbCAhPSAtMSB8fCByZXF1aXJlZCAhPSAtMSkgJiYgKHZhbHVlICE9IE5VTEwpKSB7Ci0gICAgICAgIEFMT0dFKCJmZWF0dXJlICclcycgaGFzIGJvdGggYSB2YWx1ZSBhbmQgb3B0aW9uYWwvcmVxdWlyZWQgYXR0cmlidXRlIiwgbmFtZSk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1DdXJyZW50SW5mby0+YWRkRmVhdHVyZShuYW1lLCB2YWx1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUN1cnJlbnRJbmZvLT5hZGRGZWF0dXJlKG5hbWUsIChyZXF1aXJlZCA9PSAxKSB8fCAob3B0aW9uYWwgPT0gMCkpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KIHNzaXplX3QgTWVkaWFDb2RlY0xpc3Q6OmZpbmRDb2RlY0J5TmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdCB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29kZWNJbmZvcy5zaXplKCk7ICsraSkgewotICAgICAgICBjb25zdCBNZWRpYUNvZGVjSW5mbyAmaW5mbyA9ICptQ29kZWNJbmZvcy5pdGVtQXQoaSkuZ2V0KCk7Ci0KLSAgICAgICAgaWYgKGluZm8ubU5hbWUgPT0gbmFtZSkgeworICAgICAgICBpZiAoc3RyY21wKG1Db2RlY0luZm9zW2ldLT5nZXRDb2RlY05hbWUoKSwgbmFtZSkgPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMTY3LDExICsyODEsMTUgQEAKIAogLy9zdGF0aWMKIHZvaWQgTWVkaWFDb2RlY0xpc3Q6OmZpbmRNYXRjaGluZ0NvZGVjcygKLSAgICAgICAgY29uc3QgY2hhciAqbWltZSwgYm9vbCBlbmNvZGVyLCB1aW50MzJfdCBmbGFncywgVmVjdG9yPEFTdHJpbmc+ICptYXRjaGVzKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKm1pbWUsIGJvb2wgZW5jb2RlciwgdWludDMyX3QgZmxhZ3MsCisgICAgICAgIFZlY3RvcjxBU3RyaW5nPiAqbWF0Y2hlcywgVmVjdG9yPEFTdHJpbmc+ICpvd25lcnMpIHsKICAgICBtYXRjaGVzLT5jbGVhcigpOworICAgIGlmIChvd25lcnMgIT0gbnVsbHB0cikgeworICAgICAgICBvd25lcnMtPmNsZWFyKCk7CisgICAgfQogCiAgICAgY29uc3Qgc3A8SU1lZGlhQ29kZWNMaXN0PiBsaXN0ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICBpZiAobGlzdCA9PSBOVUxMKSB7CisgICAgaWYgKGxpc3QgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0xMTg3LDQ1ICszMDUsMjcgQEAKICAgICAgICAgaW5kZXggPSBtYXRjaEluZGV4ICsgMTsKIAogICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IGxpc3QtPmdldENvZGVjSW5mbyhtYXRjaEluZGV4KTsKLSAgICAgICAgQ0hFQ0soaW5mbyAhPSBOVUxMKTsKKyAgICAgICAgQ0hFQ0soaW5mbyAhPSBudWxscHRyKTsKICAgICAgICAgQVN0cmluZyBjb21wb25lbnROYW1lID0gaW5mby0+Z2V0Q29kZWNOYW1lKCk7CiAKICAgICAgICAgaWYgKChmbGFncyAmIGtIYXJkd2FyZUNvZGVjc09ubHkpICYmIGlzU29mdHdhcmVDb2RlYyhjb21wb25lbnROYW1lKSkgewogICAgICAgICAgICAgQUxPR1YoInNraXBwaW5nIFNXIGNvZGVjICclcyciLCBjb21wb25lbnROYW1lLmNfc3RyKCkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbWF0Y2hlcy0+cHVzaChjb21wb25lbnROYW1lKTsKKyAgICAgICAgICAgIGlmIChvd25lcnMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG93bmVycy0+cHVzaChBU3RyaW5nKGluZm8tPmdldE93bmVyTmFtZSgpKSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigibWF0Y2hpbmcgJyVzJyIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoZmxhZ3MgJiBrUHJlZmVyU29mdHdhcmVDb2RlY3MgfHwgcHJvcGVydHlfZ2V0X2Jvb2woImRlYnVnLnN0YWdlZnJpZ2h0LnN3Y29kZWMiLCBmYWxzZSkpIHsKKyAgICBpZiAoZmxhZ3MgJiBrUHJlZmVyU29mdHdhcmVDb2RlY3MgfHwKKyAgICAgICAgICAgIHByb3BlcnR5X2dldF9ib29sKCJkZWJ1Zy5zdGFnZWZyaWdodC5zd2NvZGVjIiwgZmFsc2UpKSB7CiAgICAgICAgIG1hdGNoZXMtPnNvcnQoY29tcGFyZVNvZnR3YXJlQ29kZWNzRmlyc3QpOwogICAgIH0KIH0KIAotLy8gc3RhdGljCi11aW50MzJfdCBNZWRpYUNvZGVjTGlzdDo6Z2V0UXVpcmtzRm9yKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUpIHsKLSAgICBjb25zdCBzcDxJTWVkaWFDb2RlY0xpc3Q+IGxpc3QgPSBnZXRJbnN0YW5jZSgpOwotICAgIGlmIChsaXN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgc3NpemVfdCBpeCA9IGxpc3QtPmZpbmRDb2RlY0J5TmFtZShjb21wb25lbnROYW1lKTsKLSAgICBpZiAoaXggPCAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gbGlzdC0+Z2V0Q29kZWNJbmZvKGl4KTsKLQotICAgIHVpbnQzMl90IHF1aXJrcyA9IDA7Ci0gICAgaWYgKGluZm8tPmhhc1F1aXJrKCJyZXF1aXJlcy1hbGxvY2F0ZS1vbi1pbnB1dC1wb3J0cyIpKSB7Ci0gICAgICAgIHF1aXJrcyB8PSBBQ29kZWM6OmtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25JbnB1dFBvcnRzOwotICAgIH0KLSAgICBpZiAoaW5mby0+aGFzUXVpcmsoInJlcXVpcmVzLWFsbG9jYXRlLW9uLW91dHB1dC1wb3J0cyIpKSB7Ci0gICAgICAgIHF1aXJrcyB8PSBBQ29kZWM6OmtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25PdXRwdXRQb3J0czsKLSAgICB9Ci0KLSAgICByZXR1cm4gcXVpcmtzOworTWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZTo6fk1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2UoKSB7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5jcHAKaW5kZXggMDk1ZmM2YS4uNjkyMGU1MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmNwcApAQCAtMzMsOCArMzMsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNvbnN0IGNoYXIgKmtQcm9maWxpbmdSZXN1bHRzID0gIi9kYXRhL21pc2MvbWVkaWEvbWVkaWFfY29kZWNzX3Byb2ZpbGluZ19yZXN1bHRzLnhtbCI7Ci0KIEFTdHJpbmcgZ2V0UHJvZmlsaW5nVmVyc2lvblN0cmluZygpIHsKICAgICBjaGFyIHZhbFtQUk9QRVJUWV9WQUxVRV9NQVhdOwogICAgIGlmIChwcm9wZXJ0eV9nZXQoInJvLmJ1aWxkLmRpc3BsYXkuaWQiLCB2YWwsIE5VTEwpICYmIChzdHJsZW4odmFsKSA+IDApKSB7CkBAIC0yMDUsMjQgKzIwMywyNCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIHByb2ZpbGVDb2RlY3MoY29uc3QgVmVjdG9yPHNwPE1lZGlhQ29kZWNJbmZvPj4gJmluZm9zKSB7Cit2b2lkIHByb2ZpbGVDb2RlY3MoY29uc3Qgc3RkOjp2ZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+PiAmaW5mb3MsCisgICAgICAgIGNvbnN0IGNoYXIqIHByb2ZpbGluZ1Jlc3VsdHMpIHsKICAgICBDb2RlY1NldHRpbmdzIGdsb2JhbF9yZXN1bHRzOwogICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIENvZGVjU2V0dGluZ3M+IGVuY29kZXJfcmVzdWx0czsKICAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBDb2RlY1NldHRpbmdzPiBkZWNvZGVyX3Jlc3VsdHM7CiAgICAgcHJvZmlsZUNvZGVjcyhpbmZvcywgJmdsb2JhbF9yZXN1bHRzLCAmZW5jb2Rlcl9yZXN1bHRzLCAmZGVjb2Rlcl9yZXN1bHRzKTsKLSAgICBleHBvcnRSZXN1bHRzVG9YTUwoa1Byb2ZpbGluZ1Jlc3VsdHMsIGdsb2JhbF9yZXN1bHRzLCBlbmNvZGVyX3Jlc3VsdHMsIGRlY29kZXJfcmVzdWx0cyk7CisgICAgZXhwb3J0UmVzdWx0c1RvWE1MKHByb2ZpbGluZ1Jlc3VsdHMsIGdsb2JhbF9yZXN1bHRzLCBlbmNvZGVyX3Jlc3VsdHMsIGRlY29kZXJfcmVzdWx0cyk7CiB9CiAKIHZvaWQgcHJvZmlsZUNvZGVjcygKLSAgICAgICAgY29uc3QgVmVjdG9yPHNwPE1lZGlhQ29kZWNJbmZvPj4gJmluZm9zLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzcDxNZWRpYUNvZGVjSW5mbz4+ICZpbmZvcywKICAgICAgICAgQ29kZWNTZXR0aW5ncyAqZ2xvYmFsX3Jlc3VsdHMsCiAgICAgICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIENvZGVjU2V0dGluZ3M+ICplbmNvZGVyX3Jlc3VsdHMsCiAgICAgICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIENvZGVjU2V0dGluZ3M+ICpkZWNvZGVyX3Jlc3VsdHMsCiAgICAgICAgIGJvb2wgZm9yY2VUb01lYXN1cmUpIHsKICAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPj4gY29kZWNzTmVlZE1lYXN1cmU7CiAgICAgQVN0cmluZyBzdXBwb3J0TXVsdGlwbGVTZWN1cmVDb2RlY3MgPSAidHJ1ZSI7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmZvcy5zaXplKCk7ICsraSkgewotICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IGluZm9zW2ldOworICAgIGZvciAoY29uc3QgYXV0byYgaW5mbyA6IGluZm9zKSB7CiAgICAgICAgIEFTdHJpbmcgbmFtZSA9IGluZm8tPmdldENvZGVjTmFtZSgpOwogICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJPTVguZ29vZ2xlLiIpIHx8CiAgICAgICAgICAgICAgICAgLy8gVE9ETzogcmVlbmFibGUgYmVsb3cgY29kZWNzIG9uY2UgZml4ZWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5oCmluZGV4IGQ0YmIyMjUuLjRmOGMyZjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuaApAQCAtMjMsMTIgKzIzLDEwIEBACiAKICNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotZXh0ZXJuIGNvbnN0IGNoYXIgKmtQcm9maWxpbmdWZXJzaW9uU3RyaW5nOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmtQcm9maWxpbmdSZXN1bHRzOwotCiBzdHJ1Y3QgTWVkaWFDb2RlY0luZm87CiAKIEFTdHJpbmcgZ2V0UHJvZmlsaW5nVmVyc2lvblN0cmluZygpOwpAQCAtMzYsMTEgKzM0LDEyIEBACiBib29sIHNwbGl0U3RyaW5nKGNvbnN0IEFTdHJpbmcgJnMsIGNvbnN0IEFTdHJpbmcgJmRlbGltaXRlciwgQVN0cmluZyAqczEsIEFTdHJpbmcgKnMyKTsKIAogLy8gcHJvZmlsZSBjb2RlY3MgYW5kIHNhdmUgdGhlIHJlc3VsdCB0byB4bWwgZmlsZSBuYW1lZCBrUHJvZmlsaW5nUmVzdWx0cy4KLXZvaWQgcHJvZmlsZUNvZGVjcyhjb25zdCBWZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+PiAmaW5mb3MpOwordm9pZCBwcm9maWxlQ29kZWNzKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPE1lZGlhQ29kZWNJbmZvPj4gJmluZm9zLAorICAgICAgICBjb25zdCBjaGFyKiBwcm9maWxpbmdSZXN1bHRzKTsKIAogLy8gcHJvZmlsZSBjb2RlY3MgYW5kIHNhdmUgdGhlIHJlc3VsdCB0byBnbG9iYWxfcmVzdWx0cywgZW5jb2Rlcl9yZXN1bHRzIGFuZCBkZWNvZGVyX3Jlc3VsdHMuCiB2b2lkIHByb2ZpbGVDb2RlY3MoCi0gICAgICAgIGNvbnN0IFZlY3RvcjxzcDxNZWRpYUNvZGVjSW5mbz4+ICZpbmZvcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+PiAmaW5mb3MsCiAgICAgICAgIENvZGVjU2V0dGluZ3MgKmdsb2JhbF9yZXN1bHRzLAogICAgICAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBDb2RlY1NldHRpbmdzPiAqZW5jb2Rlcl9yZXN1bHRzLAogICAgICAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBDb2RlY1NldHRpbmdzPiAqZGVjb2Rlcl9yZXN1bHRzLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcAppbmRleCA1MWYxYmEzLi42NDBjYjgyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcApAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTnVNZWRpYUV4dHJhY3RvciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIApAQCAtMzUsNyArMzUsNiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSUNhcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTgzLDggKzgyLDggQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KIAotICAgIGlmIChtQ2FzICE9IE5VTEwpIHsKLSAgICAgICAgbUltcGwtPnNldE1lZGlhQ2FzKG1DYXMpOworICAgIGlmICghbUNhc1Rva2VuLmVtcHR5KCkpIHsKKyAgICAgICAgbUltcGwtPnNldE1lZGlhQ2FzKG1DYXNUb2tlbik7CiAgICAgfQogCiAgICAgc3RhdHVzX3QgZXJyID0gdXBkYXRlRHVyYXRpb25BbmRCaXRyYXRlKCk7CkBAIC0xMTksOCArMTE4LDggQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KIAotICAgIGlmIChtQ2FzICE9IE5VTEwpIHsKLSAgICAgICAgbUltcGwtPnNldE1lZGlhQ2FzKG1DYXMpOworICAgIGlmICghbUNhc1Rva2VuLmVtcHR5KCkpIHsKKyAgICAgICAgbUltcGwtPnNldE1lZGlhQ2FzKG1DYXNUb2tlbik7CiAgICAgfQogCiAgICAgZXJyID0gdXBkYXRlRHVyYXRpb25BbmRCaXRyYXRlKCk7CkBAIC0xNDksOCArMTQ4LDggQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KIAotICAgIGlmIChtQ2FzICE9IE5VTEwpIHsKLSAgICAgICAgbUltcGwtPnNldE1lZGlhQ2FzKG1DYXMpOworICAgIGlmICghbUNhc1Rva2VuLmVtcHR5KCkpIHsKKyAgICAgICAgbUltcGwtPnNldE1lZGlhQ2FzKG1DYXNUb2tlbik7CiAgICAgfQogCiAgICAgZXJyID0gdXBkYXRlRHVyYXRpb25BbmRCaXRyYXRlKCk7CkBAIC0xNjEsMjQgKzE2MCwzNiBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKLXN0YXR1c190IE51TWVkaWFFeHRyYWN0b3I6OnNldE1lZGlhQ2FzKGNvbnN0IHNwPElDYXM+ICZjYXMpIHsKLSAgICBBTE9HVigic2V0TWVkaWFDYXM6IGNhcz0lcCIsIGNhcy5nZXQoKSk7CitzdGF0aWMgU3RyaW5nOCBhcnJheVRvU3RyaW5nKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZhcnJheSkgeworICAgIFN0cmluZzggcmVzdWx0OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJyYXkuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTAyeCAiLCBhcnJheVtpXSk7CisgICAgfQorICAgIGlmIChyZXN1bHQuaXNFbXB0eSgpKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIihudWxsKSIpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0dXNfdCBOdU1lZGlhRXh0cmFjdG9yOjpzZXRNZWRpYUNhcyhjb25zdCBISW50ZXJmYWNlVG9rZW4gJmNhc1Rva2VuKSB7CisgICAgQUxPR1YoInNldE1lZGlhQ2FzOiBjYXNUb2tlbj17JXN9IiwgYXJyYXlUb1N0cmluZyhjYXNUb2tlbikuY19zdHIoKSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgaWYgKGNhcyA9PSBOVUxMKSB7CisgICAgaWYgKGNhc1Rva2VuLmVtcHR5KCkpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKKyAgICBtQ2FzVG9rZW4gPSBjYXNUb2tlbjsKKwogICAgIGlmIChtSW1wbCAhPSBOVUxMKSB7Ci0gICAgICAgIG1JbXBsLT5zZXRNZWRpYUNhcyhjYXMpOworICAgICAgICBtSW1wbC0+c2V0TWVkaWFDYXMoY2FzVG9rZW4pOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSB1cGRhdGVEdXJhdGlvbkFuZEJpdHJhdGUoKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogICAgIH0KIAotICAgIG1DYXMgPSBjYXM7CiAgICAgcmV0dXJuIE9LOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDbGllbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ2xpZW50LmNwcAppbmRleCA1ZjlhYTAxLi41ZjUwZTQ2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENsaWVudC5jcHAKQEAgLTM4LDcgKzM4LDcgQEAKIH0KIAogc3RhdHVzX3QgT01YQ2xpZW50Ojpjb25uZWN0KCkgewotICAgIHJldHVybiBjb25uZWN0KG51bGxwdHIpOworICAgIHJldHVybiBjb25uZWN0KCJkZWZhdWx0IiwgbnVsbHB0cik7CiB9CiAKIHN0YXR1c190IE9NWENsaWVudDo6Y29ubmVjdChib29sKiB0cmVibGVGbGFnKSB7CkBAIC01NCw2ICs1NCwxOSBAQAogICAgIHJldHVybiBjb25uZWN0TGVnYWN5KCk7CiB9CiAKK3N0YXR1c190IE9NWENsaWVudDo6Y29ubmVjdChjb25zdCBjaGFyKiBuYW1lLCBib29sKiB0cmVibGVGbGFnKSB7CisgICAgaWYgKHByb3BlcnR5X2dldF9ib29sKCJwZXJzaXN0Lm1lZGlhLnRyZWJsZV9vbXgiLCB0cnVlKSkgeworICAgICAgICBpZiAodHJlYmxlRmxhZyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAqdHJlYmxlRmxhZyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbm5lY3RUcmVibGUobmFtZSk7CisgICAgfQorICAgIGlmICh0cmVibGVGbGFnICE9IG51bGxwdHIpIHsKKyAgICAgICAgKnRyZWJsZUZsYWcgPSBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGNvbm5lY3RMZWdhY3koKTsKK30KKwogc3RhdHVzX3QgT01YQ2xpZW50Ojpjb25uZWN0TGVnYWN5KCkgewogICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKICAgICBzcDxJQmluZGVyPiBjb2RlY2JpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5jb2RlYyIpKTsKQEAgLTczLDkgKzg2LDEyIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBPTVhDbGllbnQ6OmNvbm5lY3RUcmVibGUoKSB7CitzdGF0dXNfdCBPTVhDbGllbnQ6OmNvbm5lY3RUcmVibGUoY29uc3QgY2hhciogbmFtZSkgewogICAgIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOwotICAgIHNwPElPbXg+IHRPbXggPSBJT214OjpnZXRTZXJ2aWNlKCJkZWZhdWx0Iik7CisgICAgaWYgKG5hbWUgPT0gbnVsbHB0cikgeworICAgICAgICBuYW1lID0gImRlZmF1bHQiOworICAgIH0KKyAgICBzcDxJT214PiB0T214ID0gSU9teDo6Z2V0U2VydmljZShuYW1lKTsKICAgICBpZiAodE9teC5nZXQoKSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJDYW5ub3Qgb2J0YWluIFRyZWJsZSBJT214LiIpOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzE3YTc5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuY3BwCkBAIC0wLDAgKzEsMzIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJPbXhJbmZvQnVpbGRlciIKKworI2lmZGVmIF9fTFA2NF9fCisjZGVmaW5lIE9NWF9BTkRST0lEX0NPTVBJTEVfQVNfMzJCSVRfT05fNjRCSVRfUExBVEZPUk1TCisjZW5kaWYKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQ29kZWNTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214U3RvcmUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Tm9kZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oPgorCisjaW5jbHVkZSA8bWVkaWEvSU9NWFN0b3JlLmg+CisjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL29teC8xLjAvV09teC5oPgorCisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfSW5kZXguaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9JbmRleEV4dC5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0F1ZGlvLmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfQXVkaW9FeHQuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9WaWRlby5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX1ZpZGVvRXh0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCitzdGF0dXNfdCBxdWVyeUNhcGFiaWxpdGllcygKKyAgICAgICAgY29uc3QgSU9NWFN0b3JlOjpOb2RlSW5mbyYgbm9kZSwgY29uc3QgY2hhciogbWltZSwgYm9vbCBpc0VuY29kZXIsCisgICAgICAgIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXIqIGNhcHMpIHsKKyAgICBzcDxBQ29kZWM+IGNvZGVjID0gbmV3IEFDb2RlYygpOworICAgIHN0YXR1c190IGVyciA9IGNvZGVjLT5xdWVyeUNhcGFiaWxpdGllcygKKyAgICAgICAgICAgIG5vZGUub3duZXIuY19zdHIoKSwgbm9kZS5uYW1lLmNfc3RyKCksIG1pbWUsIGlzRW5jb2RlciwgY2Fwcyk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIGF0dHJpYnV0ZSA6IG5vZGUuYXR0cmlidXRlcykgeworICAgICAgICAvLyBBbGwgZmVhdHVyZXMgaGF2ZSBhbiBpbnQzMiB2YWx1ZSBleGNlcHQKKyAgICAgICAgLy8gImZlYXR1cmUtYml0cmF0ZS1tb2RlcyIsIHdoaWNoIGhhcyBhIHN0cmluZyB2YWx1ZS4KKyAgICAgICAgaWYgKChhdHRyaWJ1dGUua2V5LmNvbXBhcmUoMCwgOCwgImZlYXR1cmUtIikgPT0gMCkgJiYKKyAgICAgICAgICAgICAgICAoYXR0cmlidXRlLmtleS5jb21wYXJlKDgsIDE1LCAiYml0cmF0ZS1tb2RlcyIpCisgICAgICAgICAgICAgICAgICE9IDApKSB7CisgICAgICAgICAgICAvLyBJZiB0aGlzIGF0dHJpYnV0ZS5rZXkgaXMgYSBmZWF0dXJlIHRoYXQgaXMgbm90IGEgYml0cmF0ZQorICAgICAgICAgICAgLy8gY29udHJvbCwgYWRkIGFuIGludDMyIHZhbHVlLgorICAgICAgICAgICAgY2Fwcy0+YWRkRGV0YWlsKAorICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUua2V5LmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS52YWx1ZSA9PSAiMSIgPyAxIDogMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBOb24tZmVhdHVyZSBhdHRyaWJ1dGVzCisgICAgICAgICAgICBjYXBzLT5hZGREZXRhaWwoCisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5rZXkuY19zdHIoKSwgYXR0cmlidXRlLnZhbHVlLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworT214SW5mb0J1aWxkZXI6Ok9teEluZm9CdWlsZGVyKCkgeworfQorCitzdGF0dXNfdCBPbXhJbmZvQnVpbGRlcjo6YnVpbGRNZWRpYUNvZGVjTGlzdChNZWRpYUNvZGVjTGlzdFdyaXRlciogd3JpdGVyKSB7CisgICAgYm9vbCB0cmVibGU7CisgICAgc3A8SU9NWD4gb214OworICAgIHN0ZDo6dmVjdG9yPElPTVhTdG9yZTo6Um9sZUluZm8+IHJvbGVzOworCisgICAgdHJlYmxlID0gcHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QubWVkaWEudHJlYmxlX29teCIsIHRydWUpOworICAgIGlmICh0cmVibGUpIHsKKyAgICAgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA7CisgICAgICAgIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOworICAgICAgICB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKKworICAgICAgICAvLyBPYnRhaW4gSU9teFN0b3JlCisgICAgICAgIHNwPElPbXhTdG9yZT4gb214U3RvcmUgPSBJT214U3RvcmU6OmdldFNlcnZpY2UoKTsKKyAgICAgICAgaWYgKG9teFN0b3JlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgY29ubmVjdCB0byBhbiBJT214U3RvcmUgaW5zdGFuY2UuIik7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExpc3Qgc2VydmljZSBhdHRyaWJ1dGVzIChnbG9iYWwgc2V0dGluZ3MpCisgICAgICAgIFN0YXR1cyBzdGF0dXM7CisgICAgICAgIGhpZGxfdmVjPElPbXhTdG9yZTo6U2VydmljZUF0dHJpYnV0ZT4gc2VydmljZUF0dHJpYnV0ZXM7CisgICAgICAgIGF1dG8gdHJhbnNTdGF0dXMgPSBvbXhTdG9yZS0+bGlzdFNlcnZpY2VBdHRyaWJ1dGVzKAorICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmc2VydmljZUF0dHJpYnV0ZXNdCisgICAgICAgICAgICAgICAgKFN0YXR1cyBpblN0YXR1cywgY29uc3QgaGlkbF92ZWM8SU9teFN0b3JlOjpTZXJ2aWNlQXR0cmlidXRlPiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGluQXR0cmlidXRlcykgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBpblN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZUF0dHJpYnV0ZXMgPSBpbkF0dHJpYnV0ZXM7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbCB0byBvYnRhaW4gZ2xvYmFsIHNldHRpbmdzIGZyb20gSU9teFN0b3JlLiIpOworICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBBTE9HRSgiSU9teFN0b3JlIHJlcG9ydHMgcGFyc2luZyBlcnJvci4iKTsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgcCA6IHNlcnZpY2VBdHRyaWJ1dGVzKSB7CisgICAgICAgICAgICB3cml0ZXItPmFkZEdsb2JhbFNldHRpbmcoCisgICAgICAgICAgICAgICAgICAgIHAua2V5LmNfc3RyKCksIHAudmFsdWUuY19zdHIoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBMaXN0IHJvbGVzIGFuZCBjb252ZXJ0IHRvIElPTVhTdG9yZSdzIGZvcm1hdAorICAgICAgICB0cmFuc1N0YXR1cyA9IG9teFN0b3JlLT5saXN0Um9sZXMoCisgICAgICAgICAgICAgICAgWyZyb2xlc10KKyAgICAgICAgICAgICAgICAoY29uc3QgaGlkbF92ZWM8SU9teFN0b3JlOjpSb2xlSW5mbz4mIGluUm9sZUxpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgcm9sZXMucmVzZXJ2ZShpblJvbGVMaXN0LnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgaW5Sb2xlIDogaW5Sb2xlTGlzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgSU9NWFN0b3JlOjpSb2xlSW5mbyByb2xlOworICAgICAgICAgICAgICAgICAgICAgICAgcm9sZS5yb2xlID0gaW5Sb2xlLnJvbGU7CisgICAgICAgICAgICAgICAgICAgICAgICByb2xlLnR5cGUgPSBpblJvbGUudHlwZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvbGUuaXNFbmNvZGVyID0gaW5Sb2xlLmlzRW5jb2RlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvbGUucHJlZmVyUGxhdGZvcm1Ob2RlcyA9IGluUm9sZS5wcmVmZXJQbGF0Zm9ybU5vZGVzOworICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8SU9NWFN0b3JlOjpOb2RlSW5mbz4mIG5vZGVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZS5ub2RlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzLnJlc2VydmUoaW5Sb2xlLm5vZGVzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGluTm9kZSA6IGluUm9sZS5ub2RlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPTVhTdG9yZTo6Tm9kZUluZm8gbm9kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLm5hbWUgPSBpbk5vZGUubmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLm93bmVyID0gaW5Ob2RlLm93bmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPElPTVhTdG9yZTo6QXR0cmlidXRlPiYgYXR0cmlidXRlcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmF0dHJpYnV0ZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5yZXNlcnZlKGluTm9kZS5hdHRyaWJ1dGVzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpbkF0dHIgOiBpbk5vZGUuYXR0cmlidXRlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT01YU3RvcmU6OkF0dHJpYnV0ZSBhdHRyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmtleSA9IGluQXR0ci5rZXk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIudmFsdWUgPSBpbkF0dHIudmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMucHVzaF9iYWNrKHN0ZDo6bW92ZShhdHRyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzLnB1c2hfYmFjayhzdGQ6Om1vdmUobm9kZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcm9sZXMucHVzaF9iYWNrKHN0ZDo6bW92ZShyb2xlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsIHRvIG9idGFpbiBjb2RlYyByb2xlcyBmcm9tIElPbXhTdG9yZS4iKTsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gT2J0YWluIElPTVhTdG9yZQorICAgICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisgICAgICAgIGlmIChzbSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IG9idGFpbiB0aGUgZGVmYXVsdCBzZXJ2aWNlIG1hbmFnZXIuIik7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorICAgICAgICBzcDxJQmluZGVyPiBjb2RlY0JpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5jb2RlYyIpKTsKKyAgICAgICAgaWYgKGNvZGVjQmluZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW5ub3Qgb2J0YWluIHRoZSBtZWRpYSBjb2RlYyBzZXJ2aWNlLiIpOworICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0KKyAgICAgICAgc3A8SU1lZGlhQ29kZWNTZXJ2aWNlPiBjb2RlY1NlcnZpY2UgPQorICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElNZWRpYUNvZGVjU2VydmljZT4oY29kZWNCaW5kZXIpOworICAgICAgICBpZiAoY29kZWNTZXJ2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJXcm9uZyB0eXBlIG9mIG1lZGlhIGNvZGVjIHNlcnZpY2Ugb2J0YWluZWQuIik7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorICAgICAgICBvbXggPSBjb2RlY1NlcnZpY2UtPmdldE9NWCgpOworICAgICAgICBpZiAob214ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgY29ubmVjdCB0byBhbiBJT01YIGluc3RhbmNlLiIpOworICAgICAgICB9CisgICAgICAgIHNwPElPTVhTdG9yZT4gb214U3RvcmUgPSBjb2RlY1NlcnZpY2UtPmdldE9NWFN0b3JlKCk7CisgICAgICAgIGlmIChvbXhTdG9yZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IGNvbm5lY3QgdG8gYW4gSU9NWFN0b3JlIGluc3RhbmNlLiIpOworICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBMaXN0IHNlcnZpY2UgYXR0cmlidXRlcyAoZ2xvYmFsIHNldHRpbmdzKQorICAgICAgICBzdGQ6OnZlY3RvcjxJT01YU3RvcmU6OkF0dHJpYnV0ZT4gc2VydmljZUF0dHJpYnV0ZXM7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG9teFN0b3JlLT5saXN0U2VydmljZUF0dHJpYnV0ZXMoJnNlcnZpY2VBdHRyaWJ1dGVzKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWwgdG8gb2J0YWluIGdsb2JhbCBzZXR0aW5ncyBmcm9tIElPTVhTdG9yZS4iKTsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgcCA6IHNlcnZpY2VBdHRyaWJ1dGVzKSB7CisgICAgICAgICAgICB3cml0ZXItPmFkZEdsb2JhbFNldHRpbmcoCisgICAgICAgICAgICAgICAgICAgIHAua2V5LmNfc3RyKCksIHAudmFsdWUuY19zdHIoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBMaXN0IHJvbGVzCisgICAgICAgIHN0YXR1cyA9IG9teFN0b3JlLT5saXN0Um9sZXMoJnJvbGVzKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWwgdG8gb2J0YWluIGNvZGVjIHJvbGVzIGZyb20gSU9NWFN0b3JlLiIpOworICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDb252ZXJ0IHJvbGVzIHRvIGxpc3RzIG9mIGNvZGVjcworCisgICAgLy8gY29kZWMgbmFtZSAtPiBpbmRleCBpbnRvIHN3Q29kZWNzCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4gPgorICAgICAgICAgICAgc3dDb2RlY05hbWUySW5mbzsKKyAgICAvLyBjb2RlYyBuYW1lIC0+IGluZGV4IGludG8gaHdDb2RlY3MKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvV3JpdGVyPiA+CisgICAgICAgICAgICBod0NvZGVjTmFtZTJJbmZvOworICAgIC8vIG93bmVyIG5hbWUgLT4gTWVkaWFDb2RlY0luZm8KKyAgICAvLyBUaGlzIG1hcCB3aWxsIGJlIHVzZWQgdG8gb2J0YWluIHRoZSBjb3JyZWN0IElPbXggc2VydmljZShzKSBuZWVkZWQgZm9yCisgICAgLy8gY3JlYXRpbmcgSU9teE5vZGUgaW5zdGFuY2VzIGFuZCBxdWVyeWluZyBjYXBhYmlsaXRpZXMuCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPHNwPE1lZGlhQ29kZWNJbmZvPiA+ID4KKyAgICAgICAgICAgIG93bmVyMkNvZGVjSW5mbzsKKworICAgIGZvciAoY29uc3QgYXV0byYgcm9sZSA6IHJvbGVzKSB7CisgICAgICAgIGNvbnN0IGF1dG8mIHR5cGVOYW1lID0gcm9sZS50eXBlOworICAgICAgICBib29sIGlzRW5jb2RlciA9IHJvbGUuaXNFbmNvZGVyOworICAgICAgICBib29sIHByZWZlclBsYXRmb3JtTm9kZXMgPSByb2xlLnByZWZlclBsYXRmb3JtTm9kZXM7CisgICAgICAgIC8vIElmIHByZWZlclBsYXRmb3JtTm9kZXMgaXMgdHJ1ZSwgaGFyZHdhcmUgbm9kZXMgbXVzdCBiZSBhZGRlZCBhZnRlcgorICAgICAgICAvLyBwbGF0Zm9ybSAoc29mdHdhcmUpIG5vZGVzLiBod0NvZGVjcyBpcyB1c2VkIHRvIGhvbGQgaGFyZHdhcmUgbm9kZXMKKyAgICAgICAgLy8gdGhhdCBuZWVkIHRvIGJlIGFkZGVkIGFmdGVyIHNvZnR3YXJlIG5vZGVzIGZvciB0aGUgc2FtZSByb2xlLgorICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBJT01YU3RvcmU6Ok5vZGVJbmZvKj4gaHdDb2RlY3M7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgbm9kZSA6IHJvbGUubm9kZXMpIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8mIG5vZGVOYW1lID0gbm9kZS5uYW1lOworICAgICAgICAgICAgYm9vbCBpc1NvZnR3YXJlID0gbm9kZU5hbWUuY29tcGFyZSgwLCAxMCwgIk9NWC5nb29nbGUiKSA9PSAwOworICAgICAgICAgICAgTWVkaWFDb2RlY0luZm9Xcml0ZXIqIGluZm87CisgICAgICAgICAgICBpZiAoaXNTb2Z0d2FyZSkgeworICAgICAgICAgICAgICAgIGF1dG8gYzJpID0gc3dDb2RlY05hbWUySW5mby5maW5kKG5vZGVOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoYzJpID09IHN3Q29kZWNOYW1lMkluZm8uZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IE1lZGlhQ29kZWNJbmZvIGZvciBhIG5ldyBub2RlLgorICAgICAgICAgICAgICAgICAgICBjMmkgPSBzd0NvZGVjTmFtZTJJbmZvLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSwgd3JpdGVyLT5hZGRNZWRpYUNvZGVjSW5mbygpKSkuZmlyc3Q7CisgICAgICAgICAgICAgICAgICAgIGluZm8gPSBjMmktPnNlY29uZC5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0TmFtZShub2RlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0T3duZXIobm9kZS5vd25lci5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0RW5jb2Rlcihpc0VuY29kZXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBub2RlIGhhcyBiZWVuIHNlZW4gYmVmb3JlLiBTaW1wbHkgcmV0cmlldmUgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIE1lZGlhQ29kZWNJbmZvV3JpdGVyLgorICAgICAgICAgICAgICAgICAgICBpbmZvID0gYzJpLT5zZWNvbmQuZ2V0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdXRvIGMyaSA9IGh3Q29kZWNOYW1lMkluZm8uZmluZChub2RlTmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKGMyaSA9PSBod0NvZGVjTmFtZTJJbmZvLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBNZWRpYUNvZGVjSW5mbyBmb3IgYSBuZXcgbm9kZS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVmZXJQbGF0Zm9ybU5vZGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjMmkgPSBod0NvZGVjTmFtZTJJbmZvLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZU5hbWUsIHdyaXRlci0+YWRkTWVkaWFDb2RlY0luZm8oKSkpLmZpcnN0OworICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IGMyaS0+c2Vjb25kLmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0TmFtZShub2RlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNldE93bmVyKG5vZGUub3duZXIuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXRFbmNvZGVyKGlzRW5jb2Rlcik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBwcmVmZXJQbGF0Zm9ybU5vZGVzIGlzIHRydWUsIHRoaXMgbm9kZSBtdXN0IGJlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGRlZCBhZnRlciBhbGwgc29mdHdhcmUgbm9kZXMuCisgICAgICAgICAgICAgICAgICAgICAgICBod0NvZGVjcy5wdXNoX2JhY2soJm5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbm9kZSBoYXMgYmVlbiBzZWVuIGJlZm9yZS4gU2ltcGx5IHJldHJpZXZlIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBNZWRpYUNvZGVjSW5mb1dyaXRlci4KKyAgICAgICAgICAgICAgICAgICAgaW5mbyA9IGMyaS0+c2Vjb25kLmdldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyPiBjYXBzID0KKyAgICAgICAgICAgICAgICAgICAgaW5mby0+YWRkTWltZSh0eXBlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIGlmIChxdWVyeUNhcGFiaWxpdGllcygKKyAgICAgICAgICAgICAgICAgICAgbm9kZSwgdHlwZU5hbWUuY19zdHIoKSwgaXNFbmNvZGVyLCBjYXBzLmdldCgpKSAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dXKCJGYWlsIHRvIGFkZCBtaW1lICVzIHRvIGNvZGVjICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVOYW1lLmNfc3RyKCksIG5vZGVOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGluZm8tPnJlbW92ZU1pbWUodHlwZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiBwcmVmZXJQbGF0Zm9ybU5vZGVzIGlzIHRydWUsIGhhcmR3YXJlIG5vZGVzIHdpbGwgbm90IGhhdmUgYmVlbgorICAgICAgICAvLyBhZGRlZCBpbiB0aGUgbG9vcCBhYm92ZSwgYnV0IHJhdGhlciBzYXZlZCBpbiBod0NvZGVjcy4gVGhleSBhcmUKKyAgICAgICAgLy8gZ29pbmcgdG8gYmUgYWRkZWQgaGVyZS4KKyAgICAgICAgaWYgKHByZWZlclBsYXRmb3JtTm9kZXMpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgbm9kZSA6IGh3Q29kZWNzKSB7CisgICAgICAgICAgICAgICAgTWVkaWFDb2RlY0luZm9Xcml0ZXIqIGluZm87CisgICAgICAgICAgICAgICAgY29uc3QgYXV0byYgbm9kZU5hbWUgPSBub2RlLT5uYW1lOworICAgICAgICAgICAgICAgIGF1dG8gYzJpID0gaHdDb2RlY05hbWUySW5mby5maW5kKG5vZGVOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoYzJpID09IGh3Q29kZWNOYW1lMkluZm8uZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IE1lZGlhQ29kZWNJbmZvIGZvciBhIG5ldyBub2RlLgorICAgICAgICAgICAgICAgICAgICBjMmkgPSBod0NvZGVjTmFtZTJJbmZvLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSwgd3JpdGVyLT5hZGRNZWRpYUNvZGVjSW5mbygpKSkuZmlyc3Q7CisgICAgICAgICAgICAgICAgICAgIGluZm8gPSBjMmktPnNlY29uZC5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0TmFtZShub2RlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0T3duZXIobm9kZS0+b3duZXIuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPnNldEVuY29kZXIoaXNFbmNvZGVyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbm9kZSBoYXMgYmVlbiBzZWVuIGJlZm9yZS4gU2ltcGx5IHJldHJpZXZlIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBNZWRpYUNvZGVjSW5mb1dyaXRlci4KKyAgICAgICAgICAgICAgICAgICAgaW5mbyA9IGMyaS0+c2Vjb25kLmdldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcj4gY2FwcyA9CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5hZGRNaW1lKHR5cGVOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGlmIChxdWVyeUNhcGFiaWxpdGllcygKKyAgICAgICAgICAgICAgICAgICAgICAgICpub2RlLCB0eXBlTmFtZS5jX3N0cigpLCBpc0VuY29kZXIsIGNhcHMuZ2V0KCkpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJGYWlsIHRvIGFkZCBtaW1lICVzIHRvIGNvZGVjICVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFmdGVyIHNvZnR3YXJlIGNvZGVjcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVOYW1lLmNfc3RyKCksIG5vZGVOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5yZW1vdmVNaW1lKHR5cGVOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcAppbmRleCBmMGMyN2FjLi40ZmYyYmZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwCkBAIC04NSw3ICs4NSw4IEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgIGlmIChmZCA8IDApIHsKICAgICAgICAgLy8gY291bGRuJ3Qgb3BlbiBpdCBsb2NhbGx5LCBtYXliZSB0aGUgbWVkaWEgc2VydmVyIGNhbj8KLSAgICAgICAgc3RhdHVzID0gbVJldHJpZXZlci0+c2V0RGF0YVNvdXJjZShOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCBwYXRoKTsKKyAgICAgICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IG51bGxTZXJ2aWNlOworICAgICAgICBzdGF0dXMgPSBtUmV0cmlldmVyLT5zZXREYXRhU291cmNlKG51bGxTZXJ2aWNlLCBwYXRoKTsKICAgICB9IGVsc2UgewogICAgICAgICBzdGF0dXMgPSBtUmV0cmlldmVyLT5zZXREYXRhU291cmNlKGZkLCAwLCAweDdmZmZmZmZmZmZmZmZmZkwpOwogICAgICAgICBjbG9zZShmZCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCmluZGV4IDAzZGM5ZGYuLjEwM2RhOTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCkBAIC02MCw2ICs2MCwxMiBAQAogU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjo6flN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIoKSB7CiAgICAgQUxPR1YoIn5TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyKCkiKTsKICAgICBjbGVhck1ldGFkYXRhKCk7CisgICAgLy8gRXhwbGljaXRseSByZWxlYXNlIGV4dHJhY3RvciBiZWZvcmUgY29udGludWluZyB3aXRoIHRoZSBkZXN0cnVjdG9yLAorICAgIC8vIHNvbWUgZXh0cmFjdG9ycyBtaWdodCBuZWVkIHRvIGNhbGxiYWNrIHRvIGNsb3NlIG9mZiB0aGUgRGF0YVNvdXJjZQorICAgIC8vIGFuZCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBpdCdzIHN0aWxsIHRoZXJlLgorICAgIGlmIChtRXh0cmFjdG9yICE9IE5VTEwpIHsKKyAgICAgICAgbUV4dHJhY3Rvci0+cmVsZWFzZSgpOworICAgIH0KICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CiAgICAgICAgIG1Tb3VyY2UtPmNsb3NlKCk7CiAgICAgfQpAQCAtMTIxLDEyICsxMjcsMTIgQEAKIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4mIHNvdXJjZSkgeworICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiYgc291cmNlLCBjb25zdCBjaGFyICptaW1lKSB7CiAgICAgQUxPR1YoInNldERhdGFTb3VyY2UoRGF0YVNvdXJjZSkiKTsKIAogICAgIGNsZWFyTWV0YWRhdGEoKTsKICAgICBtU291cmNlID0gc291cmNlOwotICAgIG1FeHRyYWN0b3IgPSBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKG1Tb3VyY2UpOworICAgIG1FeHRyYWN0b3IgPSBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKG1Tb3VyY2UsIG1pbWUpOwogCiAgICAgaWYgKG1FeHRyYWN0b3IgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluc3RhbnRpYXRlIGEgTWVkaWFFeHRyYWN0b3IuIik7CkBAIC0xMzcsMTcgKzE0MywxNzMgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXRpYyBWaWRlb0ZyYW1lICphbGxvY1ZpZGVvRnJhbWUoCisgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmdHJhY2tNZXRhLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCBicHAsIGJvb2wgbWV0YU9ubHkpIHsKKyAgICBpbnQzMl90IHJvdGF0aW9uQW5nbGU7CisgICAgaWYgKCF0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5Um90YXRpb24sICZyb3RhdGlvbkFuZ2xlKSkgeworICAgICAgICByb3RhdGlvbkFuZ2xlID0gMDsgIC8vIEJ5IGRlZmF1bHQsIG5vIHJvdGF0aW9uCisgICAgfQorCisgICAgdWludDMyX3QgdHlwZTsKKyAgICBjb25zdCB2b2lkICppY2NEYXRhOworICAgIHNpemVfdCBpY2NTaXplOworICAgIGlmICghdHJhY2tNZXRhLT5maW5kRGF0YShrS2V5SWNjUHJvZmlsZSwgJnR5cGUsICZpY2NEYXRhLCAmaWNjU2l6ZSkpeworICAgICAgICBpY2NEYXRhID0gTlVMTDsKKyAgICAgICAgaWNjU2l6ZSA9IDA7CisgICAgfQorCisgICAgaW50MzJfdCBzYXJXaWR0aCwgc2FySGVpZ2h0OworICAgIGludDMyX3QgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0OworICAgIGlmICh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5U0FSV2lkdGgsICZzYXJXaWR0aCkKKyAgICAgICAgICAgICYmIHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlTQVJIZWlnaHQsICZzYXJIZWlnaHQpCisgICAgICAgICAgICAmJiBzYXJIZWlnaHQgIT0gMCkgeworICAgICAgICBkaXNwbGF5V2lkdGggPSAod2lkdGggKiBzYXJXaWR0aCkgLyBzYXJIZWlnaHQ7CisgICAgICAgIGRpc3BsYXlIZWlnaHQgPSBoZWlnaHQ7CisgICAgfSBlbHNlIGlmICh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5RGlzcGxheVdpZHRoLCAmZGlzcGxheVdpZHRoKQorICAgICAgICAgICAgICAgICYmIHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlEaXNwbGF5SGVpZ2h0LCAmZGlzcGxheUhlaWdodCkKKyAgICAgICAgICAgICAgICAmJiBkaXNwbGF5V2lkdGggPiAwICYmIGRpc3BsYXlIZWlnaHQgPiAwCisgICAgICAgICAgICAgICAgJiYgd2lkdGggPiAwICYmIGhlaWdodCA+IDApIHsKKyAgICAgICAgQUxPR1YoImZvdW5kIGRpc3BsYXkgc2l6ZSAlZHglZCIsIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGlzcGxheVdpZHRoID0gd2lkdGg7CisgICAgICAgIGRpc3BsYXlIZWlnaHQgPSBoZWlnaHQ7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBWaWRlb0ZyYW1lKHdpZHRoLCBoZWlnaHQsIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCwKKyAgICAgICAgICAgIHJvdGF0aW9uQW5nbGUsIGJwcCwgIW1ldGFPbmx5LCBpY2NEYXRhLCBpY2NTaXplKTsKK30KKworc3RhdGljIGJvb2wgZ2V0RHN0Q29sb3JGb3JtYXQoYW5kcm9pZF9waXhlbF9mb3JtYXRfdCBjb2xvckZvcm1hdCwKKyAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgKm9teENvbG9yRm9ybWF0LCBpbnQzMl90ICpicHApIHsKKyAgICBzd2l0Y2ggKGNvbG9yRm9ybWF0KSB7CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OgorICAgICAgICB7CisgICAgICAgICAgICAqb214Q29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjU7CisgICAgICAgICAgICAqYnBwID0gMjsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg6CisgICAgICAgIHsKKyAgICAgICAgICAgICpvbXhDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXQzMkJpdFJHQkE4ODg4OworICAgICAgICAgICAgKmJwcCA9IDQ7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQkdSQV84ODg4OgorICAgICAgICB7CisgICAgICAgICAgICAqb214Q29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODsKKyAgICAgICAgICAgICpicHAgPSA0OworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIGNvbG9yIGZvcm1hdDogJWQiLCBjb2xvckZvcm1hdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIHN0YXRpYyBWaWRlb0ZyYW1lICpleHRyYWN0VmlkZW9GcmFtZSgKICAgICAgICAgY29uc3QgQVN0cmluZyAmY29tcG9uZW50TmFtZSwKICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZ0cmFja01ldGEsCiAgICAgICAgIGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSwKICAgICAgICAgaW50NjRfdCBmcmFtZVRpbWVVcywKLSAgICAgICAgaW50IHNlZWtNb2RlKSB7Ci0KKyAgICAgICAgaW50IHNlZWtNb2RlLAorICAgICAgICBpbnQgY29sb3JGb3JtYXQsCisgICAgICAgIGJvb2wgbWV0YU9ubHkpIHsKICAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ID0gc291cmNlLT5nZXRGb3JtYXQoKTsKIAorICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZSA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlPihzZWVrTW9kZSk7CisgICAgaWYgKHNlZWtNb2RlIDwgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMgfHwKKyAgICAgICAgc2Vla01vZGUgPiBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVCkgeworICAgICAgICBBTE9HRSgiVW5rbm93biBzZWVrIG1vZGU6ICVkIiwgc2Vla01vZGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpbnQzMl90IGRzdEJwcDsKKyAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBkc3RGb3JtYXQ7CisgICAgaWYgKCFnZXREc3RDb2xvckZvcm1hdCgKKyAgICAgICAgICAgIChhbmRyb2lkX3BpeGVsX2Zvcm1hdF90KWNvbG9yRm9ybWF0LCAmZHN0Rm9ybWF0LCAmZHN0QnBwKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobWV0YU9ubHkpIHsKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgICAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCkpOworICAgICAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KSk7CisgICAgICAgIHJldHVybiBhbGxvY1ZpZGVvRnJhbWUodHJhY2tNZXRhLCB3aWR0aCwgaGVpZ2h0LCBkc3RCcHAsIHRydWUpOworICAgIH0KKworICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOworICAgIHNwPE1ldGFEYXRhPiBvdmVycmlkZU1ldGE7CisgICAgaWYgKGZyYW1lVGltZVVzIDwgMCkgeworICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICBjb25zdCB2b2lkICpkYXRhOworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgaW50NjRfdCB0aHVtYk5haWxUaW1lOworICAgICAgICBpbnQzMl90IHRodW1ibmFpbFdpZHRoLCB0aHVtYm5haWxIZWlnaHQ7CisKKyAgICAgICAgLy8gaWYgd2UgaGF2ZSBhIHN0YW5kLWFsb25lIHRodW1ibmFpbCwgc2V0IHVwIHRoZSBvdmVycmlkZSBtZXRhLAorICAgICAgICAvLyBhbmQgc2V0IHNlZWtUbyB0aW1lIHRvIC0xLgorICAgICAgICBpZiAodHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVRodW1ibmFpbFdpZHRoLCAmdGh1bWJuYWlsV2lkdGgpCisgICAgICAgICAmJiB0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5VGh1bWJuYWlsSGVpZ2h0LCAmdGh1bWJuYWlsSGVpZ2h0KQorICAgICAgICAgJiYgdHJhY2tNZXRhLT5maW5kRGF0YShrS2V5VGh1bWJuYWlsSFZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpeworICAgICAgICAgICAgb3ZlcnJpZGVNZXRhID0gbmV3IE1ldGFEYXRhKCp0cmFja01ldGEpOworICAgICAgICAgICAgb3ZlcnJpZGVNZXRhLT5yZW1vdmUoa0tleURpc3BsYXlXaWR0aCk7CisgICAgICAgICAgICBvdmVycmlkZU1ldGEtPnJlbW92ZShrS2V5RGlzcGxheUhlaWdodCk7CisgICAgICAgICAgICBvdmVycmlkZU1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgdGh1bWJuYWlsV2lkdGgpOworICAgICAgICAgICAgb3ZlcnJpZGVNZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCB0aHVtYm5haWxIZWlnaHQpOworICAgICAgICAgICAgb3ZlcnJpZGVNZXRhLT5zZXREYXRhKGtLZXlIVkNDLCB0eXBlLCBkYXRhLCBzaXplKTsKKyAgICAgICAgICAgIHRodW1iTmFpbFRpbWUgPSAtMWxsOworICAgICAgICAgICAgQUxPR1YoInRodW1ibmFpbDogJWR4JWQiLCB0aHVtYm5haWxXaWR0aCwgdGh1bWJuYWlsSGVpZ2h0KTsKKyAgICAgICAgfSBlbHNlIGlmICghdHJhY2tNZXRhLT5maW5kSW50NjQoa0tleVRodW1ibmFpbFRpbWUsICZ0aHVtYk5haWxUaW1lKQorICAgICAgICAgICAgICAgIHx8IHRodW1iTmFpbFRpbWUgPCAwKSB7CisgICAgICAgICAgICB0aHVtYk5haWxUaW1lID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKHRodW1iTmFpbFRpbWUsIG1vZGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKGZyYW1lVGltZVVzLCBtb2RlKTsKKyAgICB9CisKKyAgICBpbnQzMl90IGdyaWRSb3dzID0gMSwgZ3JpZENvbHMgPSAxOworICAgIGlmIChvdmVycmlkZU1ldGEgPT0gTlVMTCkgeworICAgICAgICAvLyBjaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSB0aWxlZCBoZWlmCisgICAgICAgIGludDMyX3QgZ3JpZFdpZHRoLCBncmlkSGVpZ2h0OworICAgICAgICBpZiAodHJhY2tNZXRhLT5maW5kSW50MzIoa0tleUdyaWRXaWR0aCwgJmdyaWRXaWR0aCkgJiYgZ3JpZFdpZHRoID4gMAorICAgICAgICAgJiYgdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleUdyaWRIZWlnaHQsICZncmlkSGVpZ2h0KSAmJiBncmlkSGVpZ2h0ID4gMCkgeworICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0LCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQ7CisgICAgICAgICAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCkpOworICAgICAgICAgICAgQ0hFQ0sodHJhY2tNZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmhlaWdodCkpOworICAgICAgICAgICAgQ0hFQ0sodHJhY2tNZXRhLT5maW5kSW50MzIoa0tleURpc3BsYXlXaWR0aCwgJmRpc3BsYXlXaWR0aCkpOworICAgICAgICAgICAgQ0hFQ0sodHJhY2tNZXRhLT5maW5kSW50MzIoa0tleURpc3BsYXlIZWlnaHQsICZkaXNwbGF5SGVpZ2h0KSk7CisKKyAgICAgICAgICAgIGlmICh3aWR0aCA+PSBkaXNwbGF5V2lkdGggJiYgaGVpZ2h0ID49IGRpc3BsYXlIZWlnaHQKKyAgICAgICAgICAgICAgICAgICAgJiYgKHdpZHRoICUgZ3JpZFdpZHRoID09IDApICYmIChoZWlnaHQgJSBncmlkSGVpZ2h0ID09IDApKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImdyaWQgY29uZmlnOiAlZHglZCwgZGlzcGxheSAlZHglZCwgZ3JpZCAlZHglZCIsCisgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQsIGdyaWRXaWR0aCwgZ3JpZEhlaWdodCk7CisKKyAgICAgICAgICAgICAgICBvdmVycmlkZU1ldGEgPSBuZXcgTWV0YURhdGEoKnRyYWNrTWV0YSk7CisgICAgICAgICAgICAgICAgb3ZlcnJpZGVNZXRhLT5yZW1vdmUoa0tleURpc3BsYXlXaWR0aCk7CisgICAgICAgICAgICAgICAgb3ZlcnJpZGVNZXRhLT5yZW1vdmUoa0tleURpc3BsYXlIZWlnaHQpOworICAgICAgICAgICAgICAgIG92ZXJyaWRlTWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCBncmlkV2lkdGgpOworICAgICAgICAgICAgICAgIG92ZXJyaWRlTWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgZ3JpZEhlaWdodCk7CisgICAgICAgICAgICAgICAgZ3JpZENvbHMgPSB3aWR0aCAvIGdyaWRXaWR0aDsKKyAgICAgICAgICAgICAgICBncmlkUm93cyA9IGhlaWdodCAvIGdyaWRIZWlnaHQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJCYWQgZ3JpZCBjb25maWc6ICVkeCVkLCBkaXNwbGF5ICVkeCVkLCBncmlkICVkeCVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCwgZ3JpZFdpZHRoLCBncmlkSGVpZ2h0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAob3ZlcnJpZGVNZXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIG92ZXJyaWRlTWV0YSA9IHRyYWNrTWV0YTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpbnQzMl90IG51bVRpbGVzID0gZ3JpZFJvd3MgKiBncmlkQ29sczsKKwogICAgIHNwPEFNZXNzYWdlPiB2aWRlb0Zvcm1hdDsKLSAgICBpZiAoY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKHRyYWNrTWV0YSwgJnZpZGVvRm9ybWF0KSAhPSBPSykgeworICAgIGlmIChjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2Uob3ZlcnJpZGVNZXRhLCAmdmlkZW9Gb3JtYXQpICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCJiLzIzNjgwNzgwIik7CiAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gY29udmVydCBtZXRhIGRhdGEgdG8gbWVzc2FnZSIpOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTE2MCw3ICszMjIsOCBAQAogICAgIC8vIGlucHV0IGFuZCBvdXRwdXQgcG9ydHMsIGlmIHNlZWtpbmcgdG8gYSBzeW5jIGZyYW1lLiBOT1RFOiBUaGlzIHJlcXVlc3QgbWF5CiAgICAgLy8gZmFpbCBpZiBjb21wb25lbnQgcmVxdWlyZXMgbW9yZSB0aGFuIHRoYXQgZm9yIGRlY29kaW5nLgogICAgIGJvb2wgaXNTZWVraW5nQ2xvc2VzdCA9IChzZWVrTW9kZSA9PSBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVCk7Ci0gICAgaWYgKCFpc1NlZWtpbmdDbG9zZXN0KSB7CisgICAgYm9vbCBkZWNvZGVTaW5nbGVGcmFtZSA9ICFpc1NlZWtpbmdDbG9zZXN0ICYmIChudW1UaWxlcyA9PSAxKTsKKyAgICBpZiAoZGVjb2RlU2luZ2xlRnJhbWUpIHsKICAgICAgICAgdmlkZW9Gb3JtYXQtPnNldEludDMyKCJhbmRyb2lkLl9udW0taW5wdXQtYnVmZmVycyIsIDEpOwogICAgICAgICB2aWRlb0Zvcm1hdC0+c2V0SW50MzIoImFuZHJvaWQuX251bS1vdXRwdXQtYnVmZmVycyIsIDEpOwogICAgIH0KQEAgLTE5MCwzMCArMzUzLDYgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7Ci0gICAgaWYgKHNlZWtNb2RlIDwgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMgfHwKLSAgICAgICAgc2Vla01vZGUgPiBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVCkgewotCi0gICAgICAgIEFMT0dFKCJVbmtub3duIHNlZWsgbW9kZTogJWQiLCBzZWVrTW9kZSk7Ci0gICAgICAgIGRlY29kZXItPnJlbGVhc2UoKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlID0KLSAgICAgICAgICAgIHN0YXRpY19jYXN0PE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGU+KHNlZWtNb2RlKTsKLQotICAgIGludDY0X3QgdGh1bWJOYWlsVGltZTsKLSAgICBpZiAoZnJhbWVUaW1lVXMgPCAwKSB7Ci0gICAgICAgIGlmICghdHJhY2tNZXRhLT5maW5kSW50NjQoa0tleVRodW1ibmFpbFRpbWUsICZ0aHVtYk5haWxUaW1lKQotICAgICAgICAgICAgICAgIHx8IHRodW1iTmFpbFRpbWUgPCAwKSB7Ci0gICAgICAgICAgICB0aHVtYk5haWxUaW1lID0gMDsKLSAgICAgICAgfQotICAgICAgICBvcHRpb25zLnNldFNlZWtUbyh0aHVtYk5haWxUaW1lLCBtb2RlKTsKLSAgICB9IGVsc2UgewotICAgICAgICB0aHVtYk5haWxUaW1lID0gLTE7Ci0gICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKGZyYW1lVGltZVVzLCBtb2RlKTsKLSAgICB9Ci0KICAgICBlcnIgPSBzb3VyY2UtPnN0YXJ0KCk7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICBBTE9HVygic291cmNlIGZhaWxlZCB0byBzdGFydDogJWQgKCVzKSIsIGVyciwgYXNTdHJpbmcoZXJyKSk7CkBAIC0yNTgsNiArMzk3LDkgQEAKICAgICBib29sIGZpcnN0U2FtcGxlID0gdHJ1ZTsKICAgICBpbnQ2NF90IHRhcmdldFRpbWVVcyA9IC0xbGw7CiAKKyAgICBWaWRlb0ZyYW1lICpmcmFtZSA9IE5VTEw7CisgICAgaW50MzJfdCB0aWxlc0RlY29kZWQgPSAwOworCiAgICAgZG8gewogICAgICAgICBzaXplX3QgaW5wdXRJbmRleCA9IC0xOwogICAgICAgICBpbnQ2NF90IHB0c1VzID0gMGxsOwpAQCAtMjgyLDYgKzQyNCw5IEBACiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIklucHV0IEVycm9yIG9yIEVPUyIpOwogICAgICAgICAgICAgICAgIGhhdmVNb3JlSW5wdXRzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChmaXJzdFNhbXBsZSAmJiBpc1NlZWtpbmdDbG9zZXN0KSB7CkBAIC0yOTMsNiArNDM4LDcgQEAKICAgICAgICAgICAgIGlmIChtZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPiBjb2RlY0J1ZmZlci0+Y2FwYWNpdHkoKSkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJidWZmZXIgc2l6ZSAoJXp1KSB0b28gbGFyZ2UgZm9yIGNvZGVjIGlucHV0IHNpemUgKCV6dSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpLCBjb2RlY0J1ZmZlci0+Y2FwYWNpdHkoKSk7CisgICAgICAgICAgICAgICAgaGF2ZU1vcmVJbnB1dHMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBlcnIgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5zZXRSYW5nZSgwLCBtZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwpAQCAtMzAxLDE5ICs0NDcsMjAgQEAKICAgICAgICAgICAgICAgICBtZW1jcHkoY29kZWNCdWZmZXItPmRhdGEoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KiltZWRpYUJ1ZmZlci0+ZGF0YSgpICsgbWVkaWFCdWZmZXItPnJhbmdlX29mZnNldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNBdmNPckhldmMgJiYgSXNJRFIoY29kZWNCdWZmZXIpICYmICFpc1NlZWtpbmdDbG9zZXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgbmVlZCB0byBkZWNvZGUgb25lIElEUiBmcmFtZSwgdW5sZXNzIHdlJ3JlIHNlZWtpbmcgd2l0aCBDTE9TRVNUCi0gICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbiwgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkIHRvIGFjdHVhbGx5IGRlY29kZSB0byB0YXJnZXRUaW1lVXMuCi0gICAgICAgICAgICAgICAgICAgIGhhdmVNb3JlSW5wdXRzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUzsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1lZGlhQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChlcnIgPT0gT0sgJiYgaW5wdXRJbmRleCA8IGlucHV0QnVmZmVycy5zaXplKCkpIHsKKyAgICAgICAgaWYgKGhhdmVNb3JlSW5wdXRzICYmIGlucHV0SW5kZXggPCBpbnB1dEJ1ZmZlcnMuc2l6ZSgpKSB7CisgICAgICAgICAgICBpZiAoaXNBdmNPckhldmMgJiYgSXNJRFIoY29kZWNCdWZmZXIpICYmIGRlY29kZVNpbmdsZUZyYW1lKSB7CisgICAgICAgICAgICAgICAgLy8gT25seSBuZWVkIHRvIGRlY29kZSBvbmUgSURSIGZyYW1lLCB1bmxlc3Mgd2UncmUgc2Vla2luZyB3aXRoIENMT1NFU1QKKyAgICAgICAgICAgICAgICAvLyBvcHRpb24sIGluIHdoaWNoIGNhc2Ugd2UgbmVlZCB0byBhY3R1YWxseSBkZWNvZGUgdG8gdGFyZ2V0VGltZVVzLgorICAgICAgICAgICAgICAgIGhhdmVNb3JlSW5wdXRzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBBTE9HVigiUXVldWVJbnB1dDogc2l6ZT0lenUgdHM9JSIgUFJJZDY0ICIgdXMgZmxhZ3M9JXgiLAogICAgICAgICAgICAgICAgICAgICBjb2RlY0J1ZmZlci0+c2l6ZSgpLCBwdHNVcywgZmxhZ3MpOwogICAgICAgICAgICAgZXJyID0gZGVjb2Rlci0+cXVldWVJbnB1dEJ1ZmZlcigKQEAgLTM1MiwxMSArNDk5LDcwIEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UncmUgc2Vla2luZyB3aXRoIENMT1NFU1Qgb3B0aW9uIGFuZCBvYnRhaW5lZCBhIHZhbGlkIHRhcmdldFRpbWVVcwogICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBleHRyYWN0b3IsIGRlY29kZSB0byB0aGUgc3BlY2lmaWVkIGZyYW1lLiBPdGhlcndpc2Ugd2UncmUgZG9uZS4KLSAgICAgICAgICAgICAgICAgICAgZG9uZSA9ICh0YXJnZXRUaW1lVXMgPCAwbGwpIHx8ICh0aW1lVXMgPj0gdGFyZ2V0VGltZVVzKTsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlJlY2VpdmVkIGFuIG91dHB1dCBidWZmZXIsIHRpbWVVcz0lbGxkIiwgKGxvbmcgbG9uZyl0aW1lVXMpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWRvbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGRlY29kZXItPnJlbGVhc2VPdXRwdXRCdWZmZXIoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiB2aWRlb0ZyYW1lQnVmZmVyID0gb3V0cHV0QnVmZmVycy5pdGVtQXQoaW5kZXgpOworCisgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0ICE9IE5VTEwpOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKTsKKworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3BfcmlnaHQsIGNyb3BfYm90dG9tOworICAgICAgICAgICAgICAgICAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZFJlY3QoImNyb3AiLCAmY3JvcF9sZWZ0LCAmY3JvcF90b3AsICZjcm9wX3JpZ2h0LCAmY3JvcF9ib3R0b20pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjcm9wX2xlZnQgPSBjcm9wX3RvcCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjcm9wX3JpZ2h0ID0gd2lkdGggLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgY3JvcF9ib3R0b20gPSBoZWlnaHQgLSAxOwogICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lID0gYWxsb2NWaWRlb0ZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja01ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjcm9wX3JpZ2h0IC0gY3JvcF9sZWZ0ICsgMSkgKiBncmlkQ29scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNyb3BfYm90dG9tIC0gY3JvcF90b3AgKyAxKSAqIGdyaWRSb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qbWV0YU9ubHkqLyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyY0Zvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZzcmNGb3JtYXQpKTsKKworICAgICAgICAgICAgICAgICAgICBDb2xvckNvbnZlcnRlciBjb252ZXJ0ZXIoKE9NWF9DT0xPUl9GT1JNQVRUWVBFKXNyY0Zvcm1hdCwgZHN0Rm9ybWF0KTsKKworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdExlZnQsIGRzdFRvcCwgZHN0UmlnaHQsIGRzdEJvdHRvbTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bVRpbGVzID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdExlZnQgPSBjcm9wX2xlZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBkc3RUb3AgPSBjcm9wX3RvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFJpZ2h0ID0gY3JvcF9yaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJvdHRvbSA9IGNyb3BfYm90dG9tOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZHN0TGVmdCA9IHRpbGVzRGVjb2RlZCAlIGdyaWRDb2xzICogd2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICBkc3RUb3AgPSB0aWxlc0RlY29kZWQgLyBncmlkQ29scyAqIGhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFJpZ2h0ID0gZHN0TGVmdCArIHdpZHRoIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJvdHRvbSA9IGRzdFRvcCArIGhlaWdodCAtIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoY29udmVydGVyLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gY29udmVydGVyLmNvbnZlcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopdmlkZW9GcmFtZUJ1ZmZlci0+ZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wX2xlZnQsIGNyb3BfdG9wLCBjcm9wX3JpZ2h0LCBjcm9wX2JvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPm1EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0TGVmdCwgZHN0VG9wLCBkc3RSaWdodCwgZHN0Qm90dG9tKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gY29udmVydCBmcm9tIGZvcm1hdCAweCUwOHggdG8gMHglMDh4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRm9ybWF0LCBkc3RGb3JtYXQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGRvbmUgPSAodGFyZ2V0VGltZVVzIDwgMGxsKSB8fCAodGltZVVzID49IHRhcmdldFRpbWVVcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChudW1UaWxlcyA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVzRGVjb2RlZCsrOworICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSAmPSAodGlsZXNEZWNvZGVkID49IG51bVRpbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSBkZWNvZGVyLT5yZWxlYXNlT3V0cHV0QnVmZmVyKGluZGV4KTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiUmVjZWl2ZWQgZXJyb3IgJWQgKCVzKSBpbnN0ZWFkIG9mIG91dHB1dCIsIGVyciwgYXNTdHJpbmcoZXJyKSk7CiAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOwpAQCAtMzY2LDEwMiArNTcyLDExIEBACiAgICAgICAgIH0KICAgICB9IHdoaWxlIChlcnIgPT0gT0sgJiYgIWRvbmUpOwogCi0gICAgaWYgKGVyciAhPSBPSyB8fCBzaXplIDw9IDAgfHwgb3V0cHV0Rm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBkZWNvZGUgdGh1bWJuYWlsIGZyYW1lIik7Ci0gICAgICAgIHNvdXJjZS0+c3RvcCgpOwotICAgICAgICBkZWNvZGVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIEFMT0dWKCJzdWNjZXNzZnVsbHkgZGVjb2RlZCB2aWRlbyBmcmFtZS4iKTsKLSAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiB2aWRlb0ZyYW1lQnVmZmVyID0gb3V0cHV0QnVmZmVycy5pdGVtQXQoaW5kZXgpOwotCi0gICAgaWYgKHRodW1iTmFpbFRpbWUgPj0gMCkgewotICAgICAgICBpZiAodGltZVVzICE9IHRodW1iTmFpbFRpbWUpIHsKLSAgICAgICAgICAgIEFTdHJpbmcgbWltZTsKLSAgICAgICAgICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7Ci0KLSAgICAgICAgICAgIEFMT0dWKCJ0aHVtYk5haWxUaW1lID0gJWxsZCB1cywgdGltZVVzID0gJWxsZCB1cywgbWltZSA9ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aHVtYk5haWxUaW1lLCAobG9uZyBsb25nKXRpbWVVcywgbWltZS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpKTsKLSAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpOwotCi0gICAgaW50MzJfdCBjcm9wX2xlZnQsIGNyb3BfdG9wLCBjcm9wX3JpZ2h0LCBjcm9wX2JvdHRvbTsKLSAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZFJlY3QoImNyb3AiLCAmY3JvcF9sZWZ0LCAmY3JvcF90b3AsICZjcm9wX3JpZ2h0LCAmY3JvcF9ib3R0b20pKSB7Ci0gICAgICAgIGNyb3BfbGVmdCA9IGNyb3BfdG9wID0gMDsKLSAgICAgICAgY3JvcF9yaWdodCA9IHdpZHRoIC0gMTsKLSAgICAgICAgY3JvcF9ib3R0b20gPSBoZWlnaHQgLSAxOwotICAgIH0KLQotICAgIGludDMyX3Qgcm90YXRpb25BbmdsZTsKLSAgICBpZiAoIXRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlSb3RhdGlvbiwgJnJvdGF0aW9uQW5nbGUpKSB7Ci0gICAgICAgIHJvdGF0aW9uQW5nbGUgPSAwOyAgLy8gQnkgZGVmYXVsdCwgbm8gcm90YXRpb24KLSAgICB9Ci0KLSAgICBWaWRlb0ZyYW1lICpmcmFtZSA9IG5ldyBWaWRlb0ZyYW1lOwotICAgIGZyYW1lLT5tV2lkdGggPSBjcm9wX3JpZ2h0IC0gY3JvcF9sZWZ0ICsgMTsKLSAgICBmcmFtZS0+bUhlaWdodCA9IGNyb3BfYm90dG9tIC0gY3JvcF90b3AgKyAxOwotICAgIGZyYW1lLT5tRGlzcGxheVdpZHRoID0gZnJhbWUtPm1XaWR0aDsKLSAgICBmcmFtZS0+bURpc3BsYXlIZWlnaHQgPSBmcmFtZS0+bUhlaWdodDsKLSAgICBmcmFtZS0+bVNpemUgPSBmcmFtZS0+bVdpZHRoICogZnJhbWUtPm1IZWlnaHQgKiAyOwotICAgIGZyYW1lLT5tRGF0YSA9IG5ldyB1aW50OF90W2ZyYW1lLT5tU2l6ZV07Ci0gICAgZnJhbWUtPm1Sb3RhdGlvbkFuZ2xlID0gcm90YXRpb25BbmdsZTsKLQotICAgIGludDMyX3Qgc2FyV2lkdGgsIHNhckhlaWdodDsKLSAgICBpZiAodHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVNBUldpZHRoLCAmc2FyV2lkdGgpCi0gICAgICAgICAgICAmJiB0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5U0FSSGVpZ2h0LCAmc2FySGVpZ2h0KQotICAgICAgICAgICAgJiYgc2FySGVpZ2h0ICE9IDApIHsKLSAgICAgICAgZnJhbWUtPm1EaXNwbGF5V2lkdGggPSAoZnJhbWUtPm1EaXNwbGF5V2lkdGggKiBzYXJXaWR0aCkgLyBzYXJIZWlnaHQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OwotICAgICAgICBpZiAodHJhY2tNZXRhLT5maW5kSW50MzIoa0tleURpc3BsYXlXaWR0aCwgJndpZHRoKQotICAgICAgICAgICAgICAgICYmIHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlEaXNwbGF5SGVpZ2h0LCAmaGVpZ2h0KQotICAgICAgICAgICAgICAgICYmIGZyYW1lLT5tRGlzcGxheVdpZHRoID4gMCAmJiBmcmFtZS0+bURpc3BsYXlIZWlnaHQgPiAwCi0gICAgICAgICAgICAgICAgJiYgd2lkdGggPiAwICYmIGhlaWdodCA+IDApIHsKLSAgICAgICAgICAgIGlmIChmcmFtZS0+bURpc3BsYXlIZWlnaHQgKiAoaW50NjRfdCl3aWR0aCAvIGhlaWdodCA+IChpbnQ2NF90KWZyYW1lLT5tRGlzcGxheVdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgZnJhbWUtPm1EaXNwbGF5SGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KShoZWlnaHQgKiAoaW50NjRfdClmcmFtZS0+bURpc3BsYXlXaWR0aCAvIHdpZHRoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZnJhbWUtPm1EaXNwbGF5V2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpKGZyYW1lLT5tRGlzcGxheUhlaWdodCAqIChpbnQ2NF90KXdpZHRoIC8gaGVpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJ0aHVtYk5haWwgd2lkdGggYW5kIGhlaWdodCBhcmUgb3ZlcnJpZGRlbiB0byAlZCB4ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgZnJhbWUtPm1EaXNwbGF5V2lkdGgsIGZyYW1lLT5tRGlzcGxheUhlaWdodCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQzMl90IHNyY0Zvcm1hdDsKLSAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJnNyY0Zvcm1hdCkpOwotCi0gICAgQ29sb3JDb252ZXJ0ZXIgY29udmVydGVyKChPTVhfQ09MT1JfRk9STUFUVFlQRSlzcmNGb3JtYXQsIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NSk7Ci0KLSAgICBpZiAoY29udmVydGVyLmlzVmFsaWQoKSkgewotICAgICAgICBlcnIgPSBjb252ZXJ0ZXIuY29udmVydCgKLSAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKXZpZGVvRnJhbWVCdWZmZXItPmRhdGEoKSwKLSAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgIGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3BfcmlnaHQsIGNyb3BfYm90dG9tLAotICAgICAgICAgICAgICAgIGZyYW1lLT5tRGF0YSwKLSAgICAgICAgICAgICAgICBmcmFtZS0+bVdpZHRoLAotICAgICAgICAgICAgICAgIGZyYW1lLT5tSGVpZ2h0LAotICAgICAgICAgICAgICAgIDAsIDAsIGZyYW1lLT5tV2lkdGggLSAxLCBmcmFtZS0+bUhlaWdodCAtIDEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gY29udmVydCBmcm9tIGZvcm1hdCAweCUwOHggdG8gUkdCNTY1Iiwgc3JjRm9ybWF0KTsKLQotICAgICAgICBlcnIgPSBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICB2aWRlb0ZyYW1lQnVmZmVyLmNsZWFyKCk7CiAgICAgc291cmNlLT5zdG9wKCk7Ci0gICAgZGVjb2Rlci0+cmVsZWFzZU91dHB1dEJ1ZmZlcihpbmRleCk7CiAgICAgZGVjb2Rlci0+cmVsZWFzZSgpOwogCiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HRSgiQ29sb3Jjb252ZXJ0ZXIgZmFpbGVkIHRvIGNvbnZlcnQgZnJhbWUuIik7Ci0KKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBnZXQgdmlkZW8gZnJhbWUgKGVyciAlZCkiLCBlcnIpOwogICAgICAgICBkZWxldGUgZnJhbWU7CiAgICAgICAgIGZyYW1lID0gTlVMTDsKICAgICB9CkBAIC00NzAsOSArNTg1LDEwIEBACiB9CiAKIFZpZGVvRnJhbWUgKlN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXI6OmdldEZyYW1lQXRUaW1lKAotICAgICAgICBpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbikgeworICAgICAgICBpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbiwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5KSB7CiAKLSAgICBBTE9HVigiZ2V0RnJhbWVBdFRpbWU6ICUiIFBSSWQ2NCAiIHVzIG9wdGlvbjogJWQiLCB0aW1lVXMsIG9wdGlvbik7CisgICAgQUxPR1YoImdldEZyYW1lQXRUaW1lOiAlIiBQUklkNjQgIiB1cyBvcHRpb246ICVkIGNvbG9yRm9ybWF0OiAlZCwgbWV0YU9ubHk6ICVkIiwKKyAgICAgICAgICAgIHRpbWVVcywgb3B0aW9uLCBjb2xvckZvcm1hdCwgbWV0YU9ubHkpOwogCiAgICAgaWYgKG1FeHRyYWN0b3IuZ2V0KCkgPT0gTlVMTCkgewogICAgICAgICBBTE9HVigibm8gZXh0cmFjdG9yLiIpOwpAQCAtNTQwLDggKzY1Niw4IEBACiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1hdGNoaW5nQ29kZWNzLnNpemUoKTsgKytpKSB7CiAgICAgICAgIGNvbnN0IEFTdHJpbmcgJmNvbXBvbmVudE5hbWUgPSBtYXRjaGluZ0NvZGVjc1tpXTsKLSAgICAgICAgVmlkZW9GcmFtZSAqZnJhbWUgPQotICAgICAgICAgICAgZXh0cmFjdFZpZGVvRnJhbWUoY29tcG9uZW50TmFtZSwgdHJhY2tNZXRhLCBzb3VyY2UsIHRpbWVVcywgb3B0aW9uKTsKKyAgICAgICAgVmlkZW9GcmFtZSAqZnJhbWUgPSBleHRyYWN0VmlkZW9GcmFtZSgKKyAgICAgICAgICAgICAgICBjb21wb25lbnROYW1lLCB0cmFja01ldGEsIHNvdXJjZSwgdGltZVVzLCBvcHRpb24sIGNvbG9yRm9ybWF0LCBtZXRhT25seSk7CiAKICAgICAgICAgaWYgKGZyYW1lICE9IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBmcmFtZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcAppbmRleCAwYWVhOGUxLi4zZWY4ZjJhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCkBAIC0yMzcsNiArMjM3LDExIEBACiAgICAgT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFIGNvZGVjUHJvZmlsZTsKICAgICBPTVhfVklERU9fQVZDTEVWRUxUWVBFIGNvZGVjTGV2ZWw7CiAgICAgaWYgKHByb2ZpbGVzLm1hcChwcm9maWxlLCAmY29kZWNQcm9maWxlKSkgeworICAgICAgICBpZiAocHJvZmlsZSA9PSA2NiAmJiAoY29uc3RyYWludHMgJiAweDQwKSkgeworICAgICAgICAgICAgY29kZWNQcm9maWxlID0gKE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSlPTVhfVklERU9fQVZDUHJvZmlsZUNvbnN0cmFpbmVkQmFzZWxpbmU7CisgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZSA9PSAxMDAgJiYgKGNvbnN0cmFpbnRzICYgMHgwQykgPT0gMHgwQykgeworICAgICAgICAgICAgY29kZWNQcm9maWxlID0gKE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSlPTVhfVklERU9fQVZDUHJvZmlsZUNvbnN0cmFpbmVkSGlnaDsKKyAgICAgICAgfQogICAgICAgICBmb3JtYXQtPnNldEludDMyKCJwcm9maWxlIiwgY29kZWNQcm9maWxlKTsKICAgICAgICAgaWYgKGxldmVscy5tYXAobGV2ZWwsICZjb2RlY0xldmVsKSkgewogICAgICAgICAgICAgLy8gZm9yIDkgJiYgMTEgZGVjaWRlIGxldmVsIGJhc2VkIG9uIHByb2ZpbGUgYW5kIGNvbnN0cmFpbnRfc2V0MyBmbGFnCkBAIC0xODc0LDUgKzE4NzksMTMgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCit2b2lkIE1ha2VGb3VyQ0NTdHJpbmcodWludDMyX3QgeCwgY2hhciAqcykgeworICAgIHNbMF0gPSB4ID4+IDI0OworICAgIHNbMV0gPSAoeCA+PiAxNikgJiAweGZmOworICAgIHNbMl0gPSAoeCA+PiA4KSAmIDB4ZmY7CisgICAgc1szXSA9IHggJiAweGZmOworICAgIHNbNF0gPSAnXDAnOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FuZHJvaWQuYnAKaW5kZXggNmUwNGMxZS4uMjFjMDBhMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQW5kcm9pZC5icApAQCAtMSw1ICsxLDkgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9hYWNkZWMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJTb2Z0QUFDMi5jcHAiLApAQCAtMzMsNCArMzcsNSBAQAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmNwcAppbmRleCA5ZmJkYjcyLi5lMGMwYzMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmNwcApAQCAtMjE4LDYgKzIxOCwzMCBAQAogT01YX0VSUk9SVFlQRSBTb2Z0QUFDMjo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CiAgICAgc3dpdGNoICgoT01YX1UzMikgaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5JbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyA9CisgICAgICAgICAgICAgICAgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwKQorICAgICAgICAgICAgICAgICAgICA/IE9NWF9BVURJT19Db2RpbmdBQUMgOiBPTVhfQVVESU9fQ29kaW5nUENNOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0FhYzoKICAgICAgICAgewogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFICphYWNQYXJhbXMgPQpAQCAtMzQyLDYgKzM2NiwyOSBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ0FBQykKKyAgICAgICAgICAgICAgICB8fCAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdQQ00pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BYWM6CiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRSAqYWFjUGFyYW1zID0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuaAppbmRleCBhMWNmMjg1Li43M2EzOTY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5oCkBAIC0xNyw3ICsxNyw3IEBACiAjaWZuZGVmIFNPRlRfQUFDXzJfSF8KICNkZWZpbmUgU09GVF9BQUNfMl9IXwogCi0jaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50Lmg+CiAKICNpbmNsdWRlICJhYWNkZWNvZGVyX2xpYi5oIgogI2luY2x1ZGUgIkRyY1ByZXNNb2RlV3JhcC5oIgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLmJwCmluZGV4IDQzMjA0N2IuLmQ3MzRiOWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw5IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfYWFjZW5jIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogCiAgICAgc3JjczogWyJTb2Z0QUFDRW5jb2RlcjIuY3BwIl0sCiAKQEAgLTI5LDQgKzMzLDUgQEAKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2Rlci5oCmluZGV4IDk4MWNiYmIuLmU2NGMxYjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyLmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2RlZmluZSBTT0ZUX0FBQ19FTkNPREVSX0hfCiAKLSNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaD4KIAogc3RydWN0IFZPX0FVRElPX0NPREVDQVBJOwogc3RydWN0IFZPX01FTV9PUEVSQVRPUjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyMi5oCmluZGV4IDEyM2ZkMjUuLjY4MWRjZjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2RlcjIuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNPRlRfQUFDX0VOQ09ERVJfMl9IXwogCi0jaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50Lmg+CiAKICNpbmNsdWRlICJhYWNlbmNfbGliLmgiCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5icAppbmRleCBjNWFjNTU4Li41MTc3NTkzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsOSBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJzcmMvYWRkLmNwcCIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQuYnAKaW5kZXggOWYzZmUwOC4uYjQ5M2UyMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5icApAQCAtMSw1ICsxLDYgQEAKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfYW1ybmJkZWMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJzcmMvYV9yZWZsLmNwcCIsCkBAIC01NSwxMyArNTYsMjAgQEAKICAgICAvLyAgICBdLAogICAgIC8vfSwKIAotICAgIHNoYXJlZF9saWJzOiBbImxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAogfQogCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2FtcmRlYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKIAogICAgIHNyY3M6IFsiU29mdEFNUi5jcHAiXSwKIApAQCAtOTYsNiArMTA0LDcgQEAKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAogICAgIF0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KIAogLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmNwcAppbmRleCA3NTUzMTUzLi5iN2U4NGVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5jcHAKQEAgLTE0Myw2ICsxNDMsMzAgQEAKIE9NWF9FUlJPUlRZUEUgU29mdEFNUjo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CiAgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nID0KKyAgICAgICAgICAgICAgICAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDApCisgICAgICAgICAgICAgICAgICAgID8gT01YX0FVRElPX0NvZGluZ0FNUiA6IE9NWF9BVURJT19Db2RpbmdQQ007CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvQW1yOgogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQU1SVFlQRSAqYW1yUGFyYW1zID0KQEAgLTIzNiw2ICsyNjAsMjkgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdBTVIpCisgICAgICAgICAgICAgICAgfHwgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nUENNKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvQW1yOgogICAgICAgICB7CiAgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fQU1SVFlQRSAqYWFjUGFyYW1zID0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmgKaW5kZXggNzU4ZDZhYy4uODY5YjgxZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2RlZmluZSBTT0ZUX0FNUl9IXwogCi0jaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLmJwCmluZGV4IGEwY2YyNjAuLjFlOGZkMzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw2IEBACiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZW5jIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogCiAgICAgc3JjczogWwogICAgICAgICAic3JjL2FtcmVuY29kZS5jcHAiLApAQCAtODMsNiArODQsMTAgQEAKIAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2Ftcm5iZW5jIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogCiAgICAgc3JjczogWyJTb2Z0QU1STkJFbmNvZGVyLmNwcCJdLAogCkBAIC0xMTAsNiArMTE1LDcgQEAKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAogICAgIF0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KIAogLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL1NvZnRBTVJOQkVuY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvU29mdEFNUk5CRW5jb2Rlci5oCmluZGV4IDUwMTc4YzQuLmM3M2U0ZGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvU29mdEFNUk5CRW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvU29mdEFNUk5CRW5jb2Rlci5oCkBAIC0xOCw3ICsxOCw3IEBACiAKICNkZWZpbmUgU09GVF9BTVJOQl9FTkNPREVSX0hfCiAKLSNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BbmRyb2lkLmJwCmluZGV4IGYyYWIwZGEuLjE0YTczZDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsNiBAQAogY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9hbXJ3YmRlYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgInNyYy9hZ2MyX2Ftcl93Yi5jcHAiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5icAppbmRleCBlYjI3Mzg4Li5iNmY2MzdmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5icApAQCAtMSw1ICsxLDYgQEAKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfYW1yd2JlbmMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJzcmMvYXV0b2NvcnIuYyIsCkBAIC0xNDQsNiArMTQ1LDEwIEBACiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9hbXJ3YmVuYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKIAogICAgIHNyY3M6IFsiU29mdEFNUldCRW5jb2Rlci5jcHAiXSwKIApAQCAtMTczLDYgKzE3OCw3IEBACiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZW5jX2NvbW1vbiIsCiAgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQogCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9Tb2Z0QU1SV0JFbmNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU29mdEFNUldCRW5jb2Rlci5oCmluZGV4IGQwYzFkYWIuLjg5NTBhOGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9Tb2Z0QU1SV0JFbmNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NvZnRBTVJXQkVuY29kZXIuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNPRlRfQU1SV0JfRU5DT0RFUl9IXwogCi0jaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50Lmg+CiAKICNpbmNsdWRlICJ2b0FNUldCLmgiCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvQW5kcm9pZC5icAppbmRleCBiNjcyNGJlLi4zNGRiMTliIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsOSBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2F2Y2RlYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKIAogICAgIHN0YXRpY19saWJzOiBbImxpYmF2Y2RlYyJdLAogICAgIHNyY3M6IFsiU29mdEFWQ0RlYy5jcHAiXSwKQEAgLTE4LDcgKzIyLDcgQEAKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCkBAIC0zNiw0ICs0MCw1IEBACiAgICAgfSwKIAogICAgIGxkZmxhZ3M6IFsiLVdsLC1Cc3ltYm9saWMiXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9Tb2Z0QVZDRGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5jcHAKaW5kZXggMjQ4YWI2ZC4uYzM0MmI2YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9Tb2Z0QVZDRGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL1NvZnRBVkNEZWMuY3BwCkBAIC00OCwxMCArNDgsMTQgQEAKICAgICAgICAgKElWRF9DT05UUk9MX0FQSV9DT01NQU5EX1RZUEVfVClJSDI2NERfQ01EX0NUTF9TRVRfTlVNX0NPUkVTCiAKIHN0YXRpYyBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCBrUHJvZmlsZUxldmVsc1tdID0geworICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWw1MiB9LAorCiAgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWw1MiB9LAogCiAgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sICAgICBPTVhfVklERU9fQVZDTGV2ZWw1MiB9LAogCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUNvbnN0cmFpbmVkSGlnaCwgICAgIE9NWF9WSURFT19BVkNMZXZlbDUyIH0sCisKICAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgICAgIE9NWF9WSURFT19BVkNMZXZlbDUyIH0sCiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL1NvZnRBVkNEZWMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5oCmluZGV4IDE4Yjc1NTYuLjY3OWVkM2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5oCkBAIC0xOCw3ICsxOCw3IEBACiAKICNkZWZpbmUgU09GVF9IMjY0X0RFQ19IXwogCi0jaW5jbHVkZSAiU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50Lmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9BbmRyb2lkLmJwCmluZGV4IGYwNTQyYTMuLjUyMDMxMjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw5IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfYXZjZW5jIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogCiAgICAgc3RhdGljX2xpYnM6IFsibGliYXZjZW5jIl0sCiAgICAgc3JjczogWyJTb2Z0QVZDRW5jLmNwcCJdLApAQCAtMTMsNyArMTcsNyBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLApAQCAtMzUsNCArMzksNSBAQAogICAgICAgICAiLVduby11bnVzZWQtdmFyaWFibGUiLAogICAgIF0sCiAgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmNwcAppbmRleCBiMWFmMTdiLi4zNThjNzQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5jcHAKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KICNpbmNsdWRlIDxPTVhfSW5kZXhFeHQuaD4KICNpbmNsdWRlIDxPTVhfVmlkZW9FeHQuaD4KIApAQCAtNzUsMzMgKzc0LDExIEBACiB9OwogCiBzdGF0aWMgY29uc3QgQ29kZWNQcm9maWxlTGV2ZWwga1Byb2ZpbGVMZXZlbHNbXSA9IHsKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDEgIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwxYiB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMTEgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDEyIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwxMyB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMiAgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDIxIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwyMiB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMyAgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDMxIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwzMiB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsNCAgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDQxIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDEgIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDFiIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDExIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDEyIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDEzIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDIgIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDIxIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDIyIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDMgIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDMxIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDMyIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDQgIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDQxIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUNvbnN0cmFpbmVkQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDQxIH0sCiAKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDQxIH0sCisKKyAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsNDEgfSwKIH07CiAKIHN0YXRpYyBzaXplX3QgR2V0Q1BVQ29yZUNvdW50KCkgewpAQCAtNjI5LDggKzYwNiwxMCBAQAogICAgICAgICBsZXZlbCA9IDMwOwogICAgIH0gZWxzZSBpZiAoZGlzcGxheVNpemVZID4gKDM1MiAqIDI4OCkpIHsKICAgICAgICAgbGV2ZWwgPSAyMTsKLSAgICB9IGVsc2UgeworICAgIH0gZWxzZSBpZiAoZGlzcGxheVNpemVZID4gKDE3NiAqIDE0NCkpIHsKICAgICAgICAgbGV2ZWwgPSAyMDsKKyAgICB9IGVsc2UgeworICAgICAgICBsZXZlbCA9IDEwOwogICAgIH0KICAgICBtQVZDRW5jTGV2ZWwgPSBNQVgobGV2ZWwsIG1BVkNFbmNMZXZlbCk7CiAKQEAgLTk2Myw3ICs5NDIsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGF2Y1BhcmFtcy0+ZVByb2ZpbGUgPSBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lOworICAgICAgICAgICAgLy8gVE9ETzogbWFpbnRhaW4gcHJvZmlsZQorICAgICAgICAgICAgYXZjUGFyYW1zLT5lUHJvZmlsZSA9IChPTVhfVklERU9fQVZDUFJPRklMRVRZUEUpT01YX1ZJREVPX0FWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lOwogICAgICAgICAgICAgYXZjUGFyYW1zLT5lTGV2ZWwgPSBvbXhMZXZlbDsKICAgICAgICAgICAgIGF2Y1BhcmFtcy0+blJlZkZyYW1lcyA9IDE7CiAgICAgICAgICAgICBhdmNQYXJhbXMtPmJVc2VIYWRhbWFyZCA9IE9NWF9UUlVFOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuaAppbmRleCA4MThlNGExLi5hNDNjZGYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuaApAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAotI2luY2x1ZGUgIlNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5icAppbmRleCAwMjFlNmFmLi4zNzI2OTIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsOSBAQAogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2VuY19jb21tb24iLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCiAKICAgICBzcmNzOiBbImNtbk1lbW9yeS5jIl0sCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL0FuZHJvaWQuYnAKaW5kZXggNmFjMjY0ZC4uNTk1Y2ZkYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw5IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfZmxhY2RlYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIlNvZnRGbGFjRGVjb2Rlci5jcHAiLApAQCAtMzMsNCArMzcsNSBAQAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmNwcAppbmRleCBjZmY0YTMzLi40YWIxYWIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmNwcApAQCAtMTI2LDYgKzEyNiwyOSBAQAogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgewogICAgIEFMT0dWKCJpbnRlcm5hbEdldFBhcmFtZXRlcjogaW5kZXgoJXgpIiwgaW5kZXgpOwogICAgIHN3aXRjaCAoKE9NWF9VMzIpaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5JbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyA9CisgICAgICAgICAgICAgICAgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwKQorICAgICAgICAgICAgICAgICAgICA/IE9NWF9BVURJT19Db2RpbmdGTEFDIDogT01YX0FVRElPX0NvZGluZ1BDTTsKKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvRmxhYzoKICAgICAgICAgewogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0ZMQUNUWVBFICpmbGFjUGFyYW1zID0KQEAgLTIxOSw2ICsyNDIsMjkgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdGTEFDKQorICAgICAgICAgICAgICAgIHx8IChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ1BDTSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BjbToKICAgICAgICAgewogICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQpAQCAtMjU2LDEwICszMDIsMjcgQEAKICAgICB3aGlsZSAoIWluUXVldWUuZW1wdHkoKSAmJiAhb3V0UXVldWUuZW1wdHkoKSkgewogICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOwogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisgICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CiAgICAgICAgIHVpbnQ4X3QqIGluQnVmZmVyID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKICAgICAgICAgdWludDMyX3QgaW5CdWZmZXJMZW5ndGggPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKICAgICAgICAgYm9vbCBlbmRPZklucHV0ID0gKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpICE9IDA7CiAKKyAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuID09IDApIHsKKyAgICAgICAgICAgIGlmIChlbmRPZklucHV0KSB7CisgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKKyAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIm9uUXVldWVGaWxsZWQ6IGVtcHR5SW5wdXRCdWZmZXIgcmVjZWl2ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMCAmJiAhKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykpIHsKICAgICAgICAgICAgIEFMT0dFKCJvblF1ZXVlRmlsbGVkOiBmaXJzdCBidWZmZXIgc2hvdWxkIGhhdmUgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcgc2V0Iik7CiAgICAgICAgICAgICBpbkhlYWRlci0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHOwpAQCAtMjk3LDggKzM2MCw2IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOwogICAgICAgICBzaG9ydCAqb3V0QnVmZmVyID0KICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHNob3J0ICo+KG91dEhlYWRlci0+cEJ1ZmZlciArIG91dEhlYWRlci0+bk9mZnNldCk7CiAgICAgICAgIHNpemVfdCBvdXRCdWZmZXJTaXplID0gb3V0SGVhZGVyLT5uQWxsb2NMZW4gLSBvdXRIZWFkZXItPm5PZmZzZXQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmgKaW5kZXggYzA5MDgxZC4uNGEyMWMzNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuaApAQCAtMTgsNyArMTgsNyBAQAogI2RlZmluZSBTT0ZUX0ZMQUNfREVDT0RFUl9ICiAKICNpbmNsdWRlICJGTEFDRGVjb2Rlci5oIgotI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL0FuZHJvaWQuYnAKaW5kZXggZDE0MTNmNi4uMDY2OTE3YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL0FuZHJvaWQuYnAKQEAgLTIyLDcgKzIyLDcgQEAKICAgICB9LAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCkBAIC0zMiw1ICszMiwxMCBAQAogICAgIHN0YXRpY19saWJzOiBbImxpYkZMQUMiXSwKIAogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2ZsYWNlbmMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCiAKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcAppbmRleCBjYWNlZGE5Li41NmQyZDY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcApAQCAtMTU0LDYgKzE1NCwzMCBAQAogICAgIEFMT0dWKCJTb2Z0RmxhY0VuY29kZXI6OmludGVybmFsR2V0UGFyYW1ldGVyKGluZGV4PTB4JXgpIiwgaW5kZXgpOwogCiAgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nID0KKyAgICAgICAgICAgICAgICAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDApCisgICAgICAgICAgICAgICAgICAgID8gT01YX0FVRElPX0NvZGluZ1BDTSA6IE9NWF9BVURJT19Db2RpbmdGTEFDOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BjbToKICAgICAgICAgewogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQpAQCAtMTYzLDcgKzE4Nyw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgIGlmIChwY21QYXJhbXMtPm5Qb3J0SW5kZXggIT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CiAKQEAgLTE4OSw2ICsyMTMsMTAgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoZmxhY1BhcmFtcy0+blBvcnRJbmRleCAhPSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgZmxhY1BhcmFtcy0+bkNvbXByZXNzaW9uTGV2ZWwgPSBtQ29tcHJlc3Npb25MZXZlbDsKICAgICAgICAgICAgIGZsYWNQYXJhbXMtPm5DaGFubmVscyA9IG1OdW1DaGFubmVsczsKICAgICAgICAgICAgIGZsYWNQYXJhbXMtPm5TYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CkBAIC0yMDMsNiArMjMxLDI5IEBACiBPTVhfRVJST1JUWVBFIFNvZnRGbGFjRW5jb2Rlcjo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSB7CiAgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ1BDTSkKKyAgICAgICAgICAgICAgICB8fCAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdGTEFDKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgogICAgICAgICB7CiAgICAgICAgICAgICBBTE9HVigiU29mdEZsYWNFbmNvZGVyOjppbnRlcm5hbFNldFBhcmFtZXRlcihPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtKSIpOwpAQCAtMjEyLDcgKzI2Myw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCAhPSAwICYmIHBjbVBhcmFtcy0+blBvcnRJbmRleCAhPSAxKSB7CisgICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5uUG9ydEluZGV4ICE9IDApIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiU29mdEZsYWNFbmNvZGVyOjppbnRlcm5hbFNldFBhcmFtZXRlcigpIEVycm9yICMxIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KQEAgLTI1OCw2ICszMDksMTAgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoZmxhY1BhcmFtcy0+blBvcnRJbmRleCAhPSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgbUNvbXByZXNzaW9uTGV2ZWwgPSBmbGFjUGFyYW1zLT5uQ29tcHJlc3Npb25MZXZlbDsgLy8gcmFuZ2UgY2xhbXBpbmcgZG9uZSBpbnNpZGUgZW5jb2RlcgogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuaAppbmRleCA2MDI3Zjc2Li5mNGYwNjU1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5oCkBAIC0xOCw3ICsxOCw3IEBACiAKICNkZWZpbmUgU09GVF9GTEFDX0VOQ19IXwogCi0jaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50Lmg+CiAKICNpbmNsdWRlICJGTEFDL3N0cmVhbV9lbmNvZGVyLmgiCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQuYnAKaW5kZXggYjc4YjY4OS4uZmZmNzJhOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw5IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfZzcxMWRlYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKIAogICAgIHNyY3M6IFsiU29mdEc3MTEuY3BwIl0sCiAKQEAgLTksNyArMTMsNyBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLApAQCAtMjcsNCArMzEsNSBAQAogICAgICAgICAgICAgY2ZpOiB0cnVlLAogICAgICAgICB9LAogICAgIH0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwCmluZGV4IGY3YzA0MjkuLjdhNGNjYTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcApAQCAtMTA1LDYgKzEwNSwzMCBAQAogT01YX0VSUk9SVFlQRSBTb2Z0RzcxMTo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CiAgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nID0KKyAgICAgICAgICAgICAgICAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDApCisgICAgICAgICAgICAgICAgICAgID8gT01YX0FVRElPX0NvZGluZ0c3MTEgOiBPTVhfQVVESU9fQ29kaW5nUENNOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BjbToKICAgICAgICAgewogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQpAQCAtMTczLDYgKzE5NywyOSBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ0c3MTEpCisgICAgICAgICAgICAgICAgfHwgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nUENNKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZToKICAgICAgICAgewogICAgICAgICAgICAgY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpyb2xlUGFyYW1zID0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmgKaW5kZXggMTZiNjM0MC4uM2VjZTI0NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2RlZmluZSBTT0ZUX0c3MTFfSF8KIAotI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9BbmRyb2lkLmJwCmluZGV4IDhlODZhZDYuLjc1M2VlZWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvQW5kcm9pZC5icApAQCAtMSw1ICsxLDkgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9nc21kZWMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCiAKICAgICBzcmNzOiBbIlNvZnRHU00uY3BwIl0sCiAKQEAgLTIzLDExICsyNywxMiBAQAogICAgIH0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWyJsaWJnc20iXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmNwcAppbmRleCAxMTk5OWI0Li5kNzc3MjI5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmNwcApAQCAtMTA1LDYgKzEwNSwzMCBAQAogT01YX0VSUk9SVFlQRSBTb2Z0R1NNOjppbnRlcm5hbEdldFBhcmFtZXRlcigKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKICAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uSW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgPQorICAgICAgICAgICAgICAgIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgPyBPTVhfQVVESU9fQ29kaW5nR1NNRlIgOiBPTVhfQVVESU9fQ29kaW5nUENNOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BjbToKICAgICAgICAgewogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQpAQCAtMTY0LDYgKzE4OCwyOSBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ0dTTUZSKQorICAgICAgICAgICAgICAgIHx8IChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ1BDTSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGU6CiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcm9sZVBhcmFtcyA9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmgKaW5kZXggMDMwM2RlYS4uZWY4NjkxNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNPRlRfR1NNX0hfCiAKLSNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaD4KIAogZXh0ZXJuICJDIiB7CiAjaW5jbHVkZSAiZ3NtLmgiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvQW5kcm9pZC5icAppbmRleCAzYmViNWQwLi5kOWE1ZWUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw5IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfaGV2Y2RlYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKIAogICAgIHN0YXRpY19saWJzOiBbImxpYmhldmNkZWMiXSwKICAgICBzcmNzOiBbIlNvZnRIRVZDLmNwcCJdLApAQCAtMjgsNyArMzIsNyBAQAogICAgIH0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKQEAgLTM5LDQgKzQzLDUgQEAKICAgICAvLyByZXF1aXJlcyB1bnN1cHBvcnRlZCBkeW5hbWljIHJlbG9jIFJfQVJNX1JFTDMyOyByZWNvbXBpbGUgd2l0aCAtZlBJQwogICAgIC8vIEJ1ZzogMTY4NTMyOTEKICAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5oCmluZGV4IGU3YzIxMjcuLjU4MDA0OTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvU29mdEhFVkMuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNPRlRfSEVWQ19IXwogCi0jaW5jbHVkZSAiU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50Lmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLmJwCmluZGV4IDA0ZWEwNzUuLjEyMTZhZTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw3IEBACiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X200dmgyNjNkZWMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgc2hhcmVkX2xpYnM6IFsibGlibG9nIl0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJzcmMvYWRhcHRpdmVfc21vb3RoX25vX21teC5jcHAiLApAQCAtNjYsNiArNjgsMTAgQEAKIAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X21wZWc0ZGVjIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogCiAgICAgc3JjczogWyJTb2Z0TVBFRzQuY3BwIl0sCiAKQEAgLTg3LDcgKzkzLDcgQEAKICAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIl0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKQEAgLTEwMyw0ICsxMDksNSBAQAogICAgICAgICAgICAgY2ZpOiB0cnVlLAogICAgICAgICB9LAogICAgIH0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmNwcAppbmRleCA0MTFhMjUxLi4zOWI2N2FiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuY3BwCkBAIC0zMSwyMCArMzEsMTIgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdGljIGNvbnN0IENvZGVjUHJvZmlsZUxldmVsIGtNNFZQcm9maWxlTGV2ZWxzW10gPSB7Ci0gICAgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDAgfSwKLSAgICB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMGIgfSwKLSAgICB7IE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMSB9LAotICAgIHsgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwyIH0sCiAgICAgeyBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDMgfSwKIH07CiAKIHN0YXRpYyBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCBrSDI2M1Byb2ZpbGVMZXZlbHNbXSA9IHsKLSAgICB7IE9NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fSDI2M0xldmVsMTAgfSwKLSAgICB7IE9NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fSDI2M0xldmVsMjAgfSwKICAgICB7IE9NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fSDI2M0xldmVsMzAgfSwKICAgICB7IE9NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fSDI2M0xldmVsNDUgfSwKLSAgICB7IE9NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YyLCAgICBPTVhfVklERU9fSDI2M0xldmVsMTAgfSwKLSAgICB7IE9NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YyLCAgICBPTVhfVklERU9fSDI2M0xldmVsMjAgfSwKICAgICB7IE9NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YyLCAgICBPTVhfVklERU9fSDI2M0xldmVsMzAgfSwKICAgICB7IE9NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YyLCAgICBPTVhfVklERU9fSDI2M0xldmVsNDUgfSwKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuaAppbmRleCA0MTE0ZTdkLi5lMzk5YWM5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2RlZmluZSBTT0ZUX01QRUc0X0hfCiAKLSNpbmNsdWRlICJTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaD4KIAogc3RydWN0IHRhZ3ZpZGVvRGVjQ29udHJvbHM7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZsY19kZWNvZGUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdmxjX2RlY29kZS5jcHAKaW5kZXggZjcxOTJiMWMuLjcyMDJmOTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZsY19kZWNvZGUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZsY19kZWNvZGUuY3BwCkBAIC01NjAsNyArNTYwLDcgQEAKIAogICAgIEJpdHN0cmVhbVNob3cxM0JpdHMoc3RyZWFtLCAmY29kZSk7CiAKLSAgICBpZiAoY29kZSA9PSAwKQorICAgIGlmIChjb2RlIDwgOCkKICAgICB7CiAgICAgICAgIHJldHVybiBWTENfQ09ERV9FUlJPUjsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQuYnAKaW5kZXggZDYzYzk0Ni4uYTk1YjgwNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5icApAQCAtMSw1ICsxLDYgQEAKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2VuYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgInNyYy9iaXRzdHJlYW1faW8uY3BwIiwKQEAgLTUyLDYgKzUzLDEwIEBACiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9tcGVnNGVuYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKIAogICAgIHNyY3M6IFsiU29mdE1QRUc0RW5jb2Rlci5jcHAiXSwKIApAQCAtNzUsNyArODAsNyBAQAogICAgIHN0YXRpY19saWJzOiBbImxpYnN0YWdlZnJpZ2h0X200dmgyNjNlbmMiXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCkBAIC05MCw2ICs5NSw3IEBACiAgICAgICAgICAgICBjZmk6IHRydWUsCiAgICAgICAgIH0sCiAgICAgfSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQogCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwCmluZGV4IDZkNGNiNjkuLjdiOTBhMDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmNwcApAQCAtMjksNyArMjksNiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogCiAjaW5jbHVkZSAiU29mdE1QRUc0RW5jb2Rlci5oIgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5oCmluZGV4IGFlOGNiNmYuLjAwZjJkZDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5oCkBAIC0xOSw3ICsxOSw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlICJTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaD4KICNpbmNsdWRlICJtcDRlbmNfYXBpLmgiCiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLmJwCmluZGV4IDMwNGZlZjguLmM1NTRhOTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw2IEBACiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X21wM2RlYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgInNyYy9wdm1wM19ub3JtYWxpemUuY3BwIiwKQEAgLTc3LDYgKzc4LDEwIEBACiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9tcDNkZWMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCiAKICAgICBzcmNzOiBbIlNvZnRNUDMuY3BwIl0sCiAKQEAgLTEwMiw3ICsxMDcsNyBAQAogICAgIH0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKQEAgLTExMCw2ICsxMTUsNyBAQAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9tcDNkZWMiXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQogCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwCmluZGV4IDNkZWYxZjAuLjIzNjQ2ODQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcApAQCAtMTM0LDYgKzEzNCwzMCBAQAogT01YX0VSUk9SVFlQRSBTb2Z0TVAzOjppbnRlcm5hbEdldFBhcmFtZXRlcigKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKICAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uSW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgPQorICAgICAgICAgICAgICAgIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgPyBPTVhfQVVESU9fQ29kaW5nTVAzIDogT01YX0FVRElPX0NvZGluZ1BDTTsKKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9QY206CiAgICAgICAgIHsKICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KQEAgLTIwOCw2ICsyMzIsMjkgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdNUDMpCisgICAgICAgICAgICAgICAgfHwgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nUENNKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgogICAgICAgICB7CiAgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5oCmluZGV4IDNiZmE2YzcuLjk3NmZkMDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5oCkBAIC0xOCw3ICsxOCw3IEBACiAKICNkZWZpbmUgU09GVF9NUDNfSF8KIAotI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oPgogCiBzdHJ1Y3QgdFBWTVAzRGVjb2RlckV4dGVybmFsOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLmJwCmluZGV4IDA1MWI4OWIuLjk1OTBlOWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsOSBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X21wZWcyZGVjIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogCiAgICAgc3RhdGljX2xpYnM6IFsibGlibXBlZzJkZWMiXSwKICAgICBzcmNzOiBbIlNvZnRNUEVHMi5jcHAiXSwKQEAgLTE4LDcgKzIyLDcgQEAKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCkBAIC0zNiw0ICs0MCw1IEBACiAgICAgICAgICAgICBjZmk6IHRydWUsCiAgICAgICAgIH0sCiAgICAgfSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL1NvZnRNUEVHMi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvU29mdE1QRUcyLmNwcAppbmRleCA5YTY5MjI2Li45ZDVmMzQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvU29mdE1QRUcyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvU29mdE1QRUcyLmNwcApAQCAtNzg5LDcgKzc4OSw3IEBACiAKICAgICAgICAgICAgIGlmIChzX2RlY19vcC51NF9vdXRwdXRfcHJlc2VudCkgewogICAgICAgICAgICAgICAgIHNzaXplX3QgdGltZVN0YW1wSWR4OwotICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IChtV2lkdGggKiBtSGVpZ2h0ICogMykgLyAyOworICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IChvdXRwdXRCdWZmZXJXaWR0aCgpICogb3V0cHV0QnVmZmVySGVpZ2h0KCkgKiAzKSAvIDI7CiAKICAgICAgICAgICAgICAgICB0aW1lU3RhbXBJZHggPSBnZXRNaW5UaW1lc3RhbXBJZHgobVRpbWVTdGFtcHMsIG1UaW1lU3RhbXBzVmFsaWQpOwogICAgICAgICAgICAgICAgIGlmICh0aW1lU3RhbXBJZHggPCAwKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvU29mdE1QRUcyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvU29mdE1QRUcyLmgKaW5kZXggNjcyOWE1NC4uMzM4ZmMzMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL1NvZnRNUEVHMi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9Tb2Z0TVBFRzIuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNPRlRfTVBFRzJfSF8KIAotI2luY2x1ZGUgIlNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oPgogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLmJwCmluZGV4IGM0MjQyYzIuLjU5YzFmNWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvQW5kcm9pZC5icApAQCAtMSw1ICsxLDkgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF92cHhkZWMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCiAKICAgICBzcmNzOiBbIlNvZnRWUFguY3BwIl0sCiAKQEAgLTExLDcgKzE1LDcgQEAKICAgICBzdGF0aWNfbGliczogWyJsaWJ2cHgiXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLApAQCAtMzAsNCArMzQsNSBAQAogICAgICAgICAgICAgY2ZpOiB0cnVlLAogICAgICAgICB9LAogICAgIH0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaAppbmRleCA4NGNmNzljLi5kNmJiOTAyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oCkBAIC0xOCw3ICsxOCw3IEBACiAKICNkZWZpbmUgU09GVF9WUFhfSF8KIAotI2luY2x1ZGUgIlNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oPgogCiAjaW5jbHVkZSAidnB4L3ZweF9kZWNvZGVyLmgiCiAjaW5jbHVkZSAidnB4L3ZweF9jb2RlYy5oIgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL0FuZHJvaWQuYnAKaW5kZXggYmE1MzA5MC4uNWE1MjIyNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsOSBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X3ZweGVuYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIlNvZnRWUFhFbmNvZGVyLmNwcCIsCkBAIC0yOCwxMCArMzIsMTEgQEAKICAgICBzdGF0aWNfbGliczogWyJsaWJ2cHgiXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICBdLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuaAppbmRleCA4NmRmYWQ3Li5kZDg2ZDM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2RlZmluZSBTT0ZUX1ZQWF9FTkNPREVSX0hfCiAKLSNpbmNsdWRlICJTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaD4KIAogI2luY2x1ZGUgPE9NWF9WaWRlb0V4dC5oPgogI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmgKaW5kZXggYjhjMTgwNy4uZmFkOTg4YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5oCkBAIC0xOCw3ICsxOCw3IEBACiAKICNkZWZpbmUgU09GVF9BVkNfSF8KIAotI2luY2x1ZGUgIlNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAKICNpbmNsdWRlICJIMjY0U3dEZWNBcGkuaCIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL0FuZHJvaWQuYnAKaW5kZXggZWNkNzNmNi4uODhkNmVjNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw5IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfb3B1c2RlYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKIAogICAgIHNyY3M6IFsiU29mdE9wdXMuY3BwIl0sCiAKQEAgLTEwLDcgKzE0LDcgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJvcHVzIiwKLSAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCkBAIC0yOSw0ICszMyw1IEBACiAgICAgICAgICAgICBjZmk6IHRydWUsCiAgICAgICAgIH0sCiAgICAgfSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAKaW5kZXggMmFjNmNlMC4uODEzMDA0YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwCkBAIC02Miw2ICs2Miw3IEBACiAgICAgICBtU2Vla1ByZVJvbGwoMCksCiAgICAgICBtQW5jaG9yVGltZVVzKDApLAogICAgICAgbU51bUZyYW1lc091dHB1dCgwKSwKKyAgICAgIG1IYXZlRU9TKGZhbHNlKSwKICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UoTk9ORSkgewogICAgIGluaXRQb3J0cygpOwogICAgIENIRUNLX0VRKGluaXREZWNvZGVyKCksIChzdGF0dXNfdClPSyk7CkBAIC0xMjksNiArMTMwLDMxIEBACiBPTVhfRVJST1JUWVBFIFNvZnRPcHVzOjppbnRlcm5hbEdldFBhcmFtZXRlcigKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKICAgICBzd2l0Y2ggKChpbnQpaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5JbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyA9CisgICAgICAgICAgICAgICAgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwKQorICAgICAgICAgICAgICAgICAgICA/IChPTVhfQVVESU9fQ09ESU5HVFlQRSlPTVhfQVVESU9fQ29kaW5nQW5kcm9pZE9QVVMgOgorICAgICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fQ29kaW5nUENNOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRPcHVzOgogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9PUFVTVFlQRSAqb3B1c1BhcmFtcyA9CkBAIC0yMTIsNiArMjM4LDMwIEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9BVURJT19DT0RJTkdUWVBFKU9NWF9BVURJT19Db2RpbmdBbmRyb2lkT1BVUykKKyAgICAgICAgICAgICAgICB8fCAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdQQ00pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkT3B1czoKICAgICAgICAgewogICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX0FORFJPSURfT1BVU1RZUEUgKm9wdXNQYXJhbXMgPQpAQCAtMzM1LDcgKzM4NSwzMSBAQAogICAgIHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KG5zKSAqIGtSYXRlIC8gMTAwMDAwMDAwMDsKIH0KIAotdm9pZCBTb2Z0T3B1czo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewordm9pZCBTb2Z0T3B1czo6aGFuZGxlRU9TKCkgeworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZSgwKTsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDEpOworICAgIENIRUNLKCFpblF1ZXVlLmVtcHR5KCkgJiYgIW91dFF1ZXVlLmVtcHR5KCkpOworCisgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOworICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgbUhhdmVFT1MgPSB0cnVlOworCisgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CisgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisKKyAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKKyAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKworICAgICsrbUlucHV0QnVmZmVyQ291bnQ7Cit9CisKK3ZvaWQgU29mdE9wdXM6Om9uUXVldWVGaWxsZWQoT01YX1UzMiAvKiBwb3J0SW5kZXggKi8pIHsKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoMCk7CiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZSgxKTsKIApAQCAtMzQzLDEwNCArNDE3LDEwOCBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaWYgKHBvcnRJbmRleCA9PSAwICYmIG1JbnB1dEJ1ZmZlckNvdW50IDwgMykgewotICAgICAgICBCdWZmZXJJbmZvICppbmZvID0gKmluUXVldWUuYmVnaW4oKTsKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IGluZm8tPm1IZWFkZXI7Ci0KLSAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGhlYWRlci0+cEJ1ZmZlciArIGhlYWRlci0+bk9mZnNldDsKLSAgICAgICAgc2l6ZV90IHNpemUgPSBoZWFkZXItPm5GaWxsZWRMZW47Ci0KLSAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDApIHsKLSAgICAgICAgICAgIENIRUNLKG1IZWFkZXIgPT0gTlVMTCk7Ci0gICAgICAgICAgICBtSGVhZGVyID0gbmV3IE9wdXNIZWFkZXIoKTsKLSAgICAgICAgICAgIG1lbXNldChtSGVhZGVyLCAwLCBzaXplb2YoKm1IZWFkZXIpKTsKLSAgICAgICAgICAgIGlmICghUGFyc2VPcHVzSGVhZGVyKGRhdGEsIHNpemUsIG1IZWFkZXIpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlBhcnNpbmcgT3B1cyBIZWFkZXIgZmFpbGVkLiIpOwotICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVpbnQ4X3QgY2hhbm5lbF9tYXBwaW5nW2tNYXhDaGFubmVsc10gPSB7MH07Ci0gICAgICAgICAgICBpZiAobUhlYWRlci0+Y2hhbm5lbHMgPD0ga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQpIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoJmNoYW5uZWxfbWFwcGluZywKLSAgICAgICAgICAgICAgICAgICAgICAga0RlZmF1bHRPcHVzQ2hhbm5lbExheW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoJmNoYW5uZWxfbWFwcGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+c3RyZWFtX21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+Y2hhbm5lbHMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgc3RhdHVzID0gT1BVU19JTlZBTElEX1NUQVRFOwotICAgICAgICAgICAgbURlY29kZXIgPSBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlKGtSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPmNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPm51bV9zdHJlYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPm51bV9jb3VwbGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfbWFwcGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKLSAgICAgICAgICAgIGlmICghbURlY29kZXIgfHwgc3RhdHVzICE9IE9QVVNfT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HVigib3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2NyZWF0ZSBmYWlsZWQgc3RhdHVzPSVzIiwKLSAgICAgICAgICAgICAgICAgICAgICBvcHVzX3N0cmVycm9yKHN0YXR1cykpOwotICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXMgPQotICAgICAgICAgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jdGwobURlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUFVTX1NFVF9HQUlOKG1IZWFkZXItPmdhaW5fZGIpKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gT1BVU19PSykgewotICAgICAgICAgICAgICAgIEFMT0dWKCJGYWlsZWQgdG8gc2V0IE9QVVMgaGVhZGVyIGdhaW47IHN0YXR1cz0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgb3B1c19zdHJlcnJvcihzdGF0dXMpKTsKLSAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDEpIHsKLSAgICAgICAgICAgIG1Db2RlY0RlbGF5ID0gbnNfdG9fc2FtcGxlcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocmVpbnRlcnByZXRfY2FzdDxpbnQ2NF90Kj4oaGVhZGVyLT5wQnVmZmVyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLT5uT2Zmc2V0KSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmF0ZSk7Ci0gICAgICAgICAgICBtU2FtcGxlc1RvRGlzY2FyZCA9IG1Db2RlY0RlbGF5OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVNlZWtQcmVSb2xsID0gbnNfdG9fc2FtcGxlcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdCo+KGhlYWRlci0+cEJ1ZmZlciArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXItPm5PZmZzZXQpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmF0ZSk7Ci0gICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgMSwgMCwgTlVMTCk7Ci0gICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgIGluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGhlYWRlcik7Ci0gICAgICAgICsrbUlucHV0QnVmZmVyQ291bnQ7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB3aGlsZSAoIWluUXVldWUuZW1wdHkoKSAmJiAhb3V0UXVldWUuZW1wdHkoKSkgeworICAgIHdoaWxlICghbUhhdmVFT1MgJiYgIWluUXVldWUuZW1wdHkoKSAmJiAhb3V0UXVldWUuZW1wdHkoKSkgewogICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOwogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CiAKLSAgICAgICAgLy8gSWdub3JlIENTRCByZS1zdWJtaXNzaW9ucy4KLSAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykgeworICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPCAzKSB7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgICAgIHNpemVfdCBzaXplID0gaW5IZWFkZXItPm5GaWxsZWRMZW47CisKKyAgICAgICAgICAgIGlmICgoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgJiYgc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlRU9TKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIENIRUNLKG1IZWFkZXIgPT0gTlVMTCk7CisgICAgICAgICAgICAgICAgbUhlYWRlciA9IG5ldyBPcHVzSGVhZGVyKCk7CisgICAgICAgICAgICAgICAgbWVtc2V0KG1IZWFkZXIsIDAsIHNpemVvZigqbUhlYWRlcikpOworICAgICAgICAgICAgICAgIGlmICghUGFyc2VPcHVzSGVhZGVyKGRhdGEsIHNpemUsIG1IZWFkZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJQYXJzaW5nIE9wdXMgSGVhZGVyIGZhaWxlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdWludDhfdCBjaGFubmVsX21hcHBpbmdba01heENoYW5uZWxzXSA9IHswfTsKKyAgICAgICAgICAgICAgICBpZiAobUhlYWRlci0+Y2hhbm5lbHMgPD0ga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZjaGFubmVsX21hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGVmYXVsdE9wdXNDaGFubmVsTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmY2hhbm5lbF9tYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+c3RyZWFtX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPmNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQgc3RhdHVzID0gT1BVU19JTlZBTElEX1NUQVRFOworICAgICAgICAgICAgICAgIG1EZWNvZGVyID0gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2NyZWF0ZShrUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+Y2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPm51bV9zdHJlYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5udW1fY291cGxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9tYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1EZWNvZGVyIHx8IHN0YXR1cyAhPSBPUFVTX09LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlIGZhaWxlZCBzdGF0dXM9JXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvcHVzX3N0cmVycm9yKHN0YXR1cykpOworICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhdHVzID0KKyAgICAgICAgICAgICAgICAgICAgb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2N0bChtRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUFVTX1NFVF9HQUlOKG1IZWFkZXItPmdhaW5fZGIpKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE9QVVNfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkZhaWxlZCB0byBzZXQgT1BVUyBoZWFkZXIgZ2Fpbjsgc3RhdHVzPSVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3B1c19zdHJlcnJvcihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAxKSB7CisgICAgICAgICAgICAgICAgbUNvZGVjRGVsYXkgPSBuc190b19zYW1wbGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocmVpbnRlcnByZXRfY2FzdDxpbnQ2NF90Kj4oaW5IZWFkZXItPnBCdWZmZXIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPm5PZmZzZXQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmF0ZSk7CisgICAgICAgICAgICAgICAgbVNhbXBsZXNUb0Rpc2NhcmQgPSBtQ29kZWNEZWxheTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVNlZWtQcmVSb2xsID0gbnNfdG9fc2FtcGxlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihyZWludGVycHJldF9jYXN0PGludDY0X3QqPihpbkhlYWRlci0+cEJ1ZmZlciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPm5PZmZzZXQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1JhdGUpOworICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAxLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlRU9TKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CiAgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICArK21JbnB1dEJ1ZmZlckNvdW50OworCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElnbm9yZSBDU0QgcmUtc3VibWlzc2lvbnMuCisgICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA+PSAzICYmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcpKSB7CisgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgICAgIGhhbmRsZUVPUygpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAogICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CiAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOwogCiAgICAgICAgIGlmICgoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgJiYgaW5IZWFkZXItPm5GaWxsZWRMZW4gPT0gMCkgewotICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwotICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOwotCi0gICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOwotICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7Ci0KLSAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOwotICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgICAgIGhhbmRsZUVPUygpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTQ5MCw3ICs1NjgsNiBAQAogICAgICAgICB9CiAKICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gbnVtRnJhbWVzICogc2l6ZW9mKGludDE2X3QpICogbUhlYWRlci0+Y2hhbm5lbHM7Ci0gICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gMDsKIAogICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSBtQW5jaG9yVGltZVVzICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1OdW1GcmFtZXNPdXRwdXQgKiAxMDAwMDAwbGwpIC8KQEAgLTQ5OSwyMiArNTc2LDIwIEBACiAgICAgICAgIG1OdW1GcmFtZXNPdXRwdXQgKz0gbnVtRnJhbWVzOwogCiAgICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7Ci0gICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgICAgIG1IYXZlRU9TID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwotICAgICAgICAgICAgaW5JbmZvID0gTlVMTDsKLSAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7Ci0gICAgICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CiAgICAgICAgIH0KIAorICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICArK21JbnB1dEJ1ZmZlckNvdW50OworCiAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7Ci0gICAgICAgIG91dEluZm8gPSBOVUxMOwogICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOwotICAgICAgICBvdXRIZWFkZXIgPSBOVUxMOwotCi0gICAgICAgICsrbUlucHV0QnVmZmVyQ291bnQ7CiAgICAgfQogfQogCkBAIC01MjYsNiArNjAxLDcgQEAKICAgICAgICAgb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2N0bChtRGVjb2RlciwgT1BVU19SRVNFVF9TVEFURSk7CiAgICAgICAgIG1BbmNob3JUaW1lVXMgPSAwOwogICAgICAgICBtU2FtcGxlc1RvRGlzY2FyZCA9IG1TZWVrUHJlUm9sbDsKKyAgICAgICAgbUhhdmVFT1MgPSBmYWxzZTsKICAgICB9CiB9CiAKQEAgLTU0Miw2ICs2MTgsNyBAQAogICAgIH0KIAogICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBOT05FOworICAgIG1IYXZlRU9TID0gZmFsc2U7CiB9CiAKIHZvaWQgU29mdE9wdXM6Om9uUG9ydEVuYWJsZUNvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCwgYm9vbCBlbmFibGVkKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5oCmluZGV4IDk3ZjY1NjEuLjkxY2FmYTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5oCkBAIC0yMyw3ICsyMyw3IEBACiAKICNkZWZpbmUgU09GVF9PUFVTX0hfCiAKLSNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaD4KIAogc3RydWN0IE9wdXNNU0RlY29kZXI7CiAKQEAgLTc1LDYgKzc1LDcgQEAKICAgICBpbnQ2NF90IG1TYW1wbGVzVG9EaXNjYXJkOwogICAgIGludDY0X3QgbUFuY2hvclRpbWVVczsKICAgICBpbnQ2NF90IG1OdW1GcmFtZXNPdXRwdXQ7CisgICAgYm9vbCBtSGF2ZUVPUzsKIAogICAgIGVudW0gewogICAgICAgICBOT05FLApAQCAtODUsNiArODYsNyBAQAogICAgIHZvaWQgaW5pdFBvcnRzKCk7CiAgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKICAgICBib29sIGlzQ29uZmlndXJlZCgpIGNvbnN0OworICAgIHZvaWQgaGFuZGxlRU9TKCk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb2Z0T3B1cyk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9BbmRyb2lkLmJwCmluZGV4IGM2NDAyN2IuLmYyMWQ0NmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L0FuZHJvaWQuYnAKQEAgLTEsNSArMSw5IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfcmF3ZGVjIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogCiAgICAgc3JjczogWyJTb2Z0UmF3LmNwcCJdLAogCkBAIC0yNyw0ICszMSw1IEBACiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgIF0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvU29mdFJhdy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L1NvZnRSYXcuY3BwCmluZGV4IGFjYjJiMzcuLjFhNTI3YjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvU29mdFJhdy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9Tb2Z0UmF3LmNwcApAQCAtNjAsNyArNjAsNyBAQAogICAgIGRlZi5lRGlyID0gT01YX0RpcklucHV0OwogICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtQnVmZmVyczsKICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gZGVmLm5CdWZmZXJDb3VudE1pbjsKLSAgICBkZWYubkJ1ZmZlclNpemUgPSAzMiAqIDEwMjQ7CisgICAgZGVmLm5CdWZmZXJTaXplID0gNjQgKiAxMDI0OwogICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOwogICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOwogICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5BdWRpbzsKQEAgLTc4LDcgKzc4LDcgQEAKICAgICBkZWYuZURpciA9IE9NWF9EaXJPdXRwdXQ7CiAgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1CdWZmZXJzOwogICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOwotICAgIGRlZi5uQnVmZmVyU2l6ZSA9IDMyICogMTAyNDsKKyAgICBkZWYubkJ1ZmZlclNpemUgPSA2NCAqIDEwMjQ7CiAgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CiAgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CiAgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpbkF1ZGlvOwpAQCAtMTAwLDYgKzEwMCwyOCBAQAogT01YX0VSUk9SVFlQRSBTb2Z0UmF3OjppbnRlcm5hbEdldFBhcmFtZXRlcigKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKICAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShmb3JtYXRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uSW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgPSBPTVhfQVVESU9fQ29kaW5nUENNOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BjbToKICAgICAgICAgewogICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQpAQCAtMTUzLDYgKzE3NSwyNiBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdQQ00pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BjbToKICAgICAgICAgewogICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9Tb2Z0UmF3LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L1NvZnRSYXcuaAppbmRleCA4MDkwNmI0Li5lYmMyNzQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L1NvZnRSYXcuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L1NvZnRSYXcuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNPRlRfUkFXX0hfCiAKLSNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaD4KIAogc3RydWN0IHRQVk1QNEF1ZGlvRGVjb2RlckV4dGVybmFsOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvQW5kcm9pZC5icAppbmRleCAxYTRkZTYwLi42MjhiMzZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw5IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfdm9yYmlzZGVjIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogCiAgICAgc3JjczogWyJTb2Z0Vm9yYmlzLmNwcCJdLAogCkBAIC0xMCw3ICsxNCw3IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlidm9yYmlzaWRlYyIsCi0gICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLApAQCAtMjUsNCArMjksNSBAQAogICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgIH0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKaW5kZXggMTRkZDI1MC4uODkxMmY4YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKQEAgLTEyOSw2ICsxMjksMzAgQEAKIE9NWF9FUlJPUlRZUEUgU29mdFZvcmJpczo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CiAgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+bkluZGV4ID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nID0KKyAgICAgICAgICAgICAgICAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDApCisgICAgICAgICAgICAgICAgICAgID8gT01YX0FVRElPX0NvZGluZ1ZPUkJJUyA6IE9NWF9BVURJT19Db2RpbmdQQ007CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvVm9yYmlzOgogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fVk9SQklTVFlQRSAqdm9yYmlzUGFyYW1zID0KQEAgLTIyMSw2ICsyNDUsMjkgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdWT1JCSVMpCisgICAgICAgICAgICAgICAgfHwgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyAhPSBPTVhfQVVESU9fQ29kaW5nUENNKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvVm9yYmlzOgogICAgICAgICB7CiAgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fVk9SQklTVFlQRSAqdm9yYmlzUGFyYW1zID0KQEAgLTI2Miw3ICszMDksMzMgQEAKICAgICBvZ2dwYWNrX3JlYWRpbml0KGJpdHMsIHJlZik7CiB9CiAKLXZvaWQgU29mdFZvcmJpczo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewordm9pZCBTb2Z0Vm9yYmlzOjpoYW5kbGVFT1MoKSB7CisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7CisKKyAgICBDSEVDSyghaW5RdWV1ZS5lbXB0eSgpICYmICFvdXRRdWV1ZS5lbXB0eSgpKTsKKworICAgIG1TYXdJbnB1dEVvcyA9IHRydWU7CisKKyAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CisgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKKyAgICBvdXRIZWFkZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKworICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworCisgICAgQnVmZmVySW5mbyAqaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKK30KKwordm9pZCBTb2Z0Vm9yYmlzOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOwogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7CiAKQEAgLTI3MCw2OSArMzQzLDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGlmIChwb3J0SW5kZXggPT0gMCAmJiBtSW5wdXRCdWZmZXJDb3VudCA8IDIpIHsKLSAgICAgICAgQnVmZmVySW5mbyAqaW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSBpbmZvLT5tSGVhZGVyOwotCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBoZWFkZXItPnBCdWZmZXIgKyBoZWFkZXItPm5PZmZzZXQ7Ci0gICAgICAgIHNpemVfdCBzaXplID0gaGVhZGVyLT5uRmlsbGVkTGVuOwotICAgICAgICBpZiAoc2l6ZSA8IDcpIHsKLSAgICAgICAgICAgIEFMT0dFKCJUb28gc21hbGwgaW5wdXQgYnVmZmVyOiAlenUgYnl0ZXMiLCBzaXplKTsKLSAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjc4MzM2MTYiKTsKLSAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKLSAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBvZ2dfYnVmZmVyIGJ1ZjsKLSAgICAgICAgb2dnX3JlZmVyZW5jZSByZWY7Ci0gICAgICAgIG9nZ3BhY2tfYnVmZmVyIGJpdHM7Ci0KLSAgICAgICAgbWFrZUJpdFJlYWRlcigKLSAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWRhdGEgKyA3LCBzaXplIC0gNywKLSAgICAgICAgICAgICAgICAmYnVmLCAmcmVmLCAmYml0cyk7Ci0KLSAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDApIHsKLSAgICAgICAgICAgIENIRUNLKG1WaSA9PSBOVUxMKTsKLSAgICAgICAgICAgIG1WaSA9IG5ldyB2b3JiaXNfaW5mbzsKLSAgICAgICAgICAgIHZvcmJpc19pbmZvX2luaXQobVZpKTsKLQotICAgICAgICAgICAgaW50IHJldCA9IF92b3JiaXNfdW5wYWNrX2luZm8obVZpLCAmYml0cyk7Ci0gICAgICAgICAgICBpZiAocmV0ICE9IDApIHsKLSAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgcmV0LCBOVUxMKTsKLSAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCByZXQgPSBfdm9yYmlzX3VucGFja19ib29rcyhtVmksICZiaXRzKTsKLSAgICAgICAgICAgIGlmIChyZXQgIT0gMCkgewotICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCByZXQsIE5VTEwpOwotICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDSEVDSyhtU3RhdGUgPT0gTlVMTCk7Ci0gICAgICAgICAgICBtU3RhdGUgPSBuZXcgdm9yYmlzX2RzcF9zdGF0ZTsKLSAgICAgICAgICAgIENIRUNLX0VRKDAsIHZvcmJpc19kc3BfaW5pdChtU3RhdGUsIG1WaSkpOwotCi0gICAgICAgICAgICBpZiAobVZpLT5yYXRlICE9IGtEZWZhdWx0U2FtcGxpbmdSYXRlIHx8Ci0gICAgICAgICAgICAgICAgICAgIG1WaS0+Y2hhbm5lbHMgIT0ga0RlZmF1bHRDaGFubmVsQ291bnQpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigidm9yYmlzOiByYXRlL2NoYW5uZWxzIGNoYW5nZWQ6ICVsZC8lZCIsIG1WaS0+cmF0ZSwgbVZpLT5jaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOwotICAgICAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19ESVNBQkxFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgaW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaGVhZGVyKTsKLQotICAgICAgICArK21JbnB1dEJ1ZmZlckNvdW50OwotCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB3aGlsZSAoKCFpblF1ZXVlLmVtcHR5KCkgfHwgKG1TYXdJbnB1dEVvcyAmJiAhbVNpZ25hbGxlZE91dHB1dEVvcykpICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7CisgICAgd2hpbGUgKCFtU2lnbmFsbGVkT3V0cHV0RW9zICYmICghaW5RdWV1ZS5lbXB0eSgpIHx8IG1TYXdJbnB1dEVvcykgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKICAgICAgICAgQnVmZmVySW5mbyAqaW5JbmZvID0gTlVMTDsKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyID0gTlVMTDsKICAgICAgICAgaWYgKCFpblF1ZXVlLmVtcHR5KCkpIHsKQEAgLTM0Niw2ICszNTcsNzMgQEAKICAgICAgICAgaW50MzJfdCBudW1QYWdlU2FtcGxlcyA9IDA7CiAKICAgICAgICAgaWYgKGluSGVhZGVyKSB7CisgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPCAyKSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7CisgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKKworICAgICAgICAgICAgICAgIGlmICgoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgJiYgc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZUVPUygpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHNpemUgPCA3KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJUb28gc21hbGwgaW5wdXQgYnVmZmVyOiAlenUgYnl0ZXMiLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzgzMzYxNiIpOworICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBvZ2dfYnVmZmVyIGJ1ZjsKKyAgICAgICAgICAgICAgICBvZ2dfcmVmZXJlbmNlIHJlZjsKKyAgICAgICAgICAgICAgICBvZ2dwYWNrX2J1ZmZlciBiaXRzOworCisgICAgICAgICAgICAgICAgbWFrZUJpdFJlYWRlcigoY29uc3QgdWludDhfdCAqKWRhdGEgKyA3LCBzaXplIC0gNywgJmJ1ZiwgJnJlZiwgJmJpdHMpOworCisgICAgICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobVZpID09IE5VTEwpOworICAgICAgICAgICAgICAgICAgICBtVmkgPSBuZXcgdm9yYmlzX2luZm87CisgICAgICAgICAgICAgICAgICAgIHZvcmJpc19pbmZvX2luaXQobVZpKTsKKworICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gX3ZvcmJpc191bnBhY2tfaW5mbyhtVmksICZiaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgcmV0LCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gX3ZvcmJpc191bnBhY2tfYm9va3MobVZpLCAmYml0cyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIHJldCwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobVN0YXRlID09IE5VTEwpOworICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBuZXcgdm9yYmlzX2RzcF9zdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoMCwgdm9yYmlzX2RzcF9pbml0KG1TdGF0ZSwgbVZpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1WaS0+cmF0ZSAhPSBrRGVmYXVsdFNhbXBsaW5nUmF0ZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WaS0+Y2hhbm5lbHMgIT0ga0RlZmF1bHRDaGFubmVsQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJ2b3JiaXM6IHJhdGUvY2hhbm5lbHMgY2hhbmdlZDogJWxkLyVkIiwgbVZpLT5yYXRlLCBtVmktPmNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAxLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19ESVNBQkxFRDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZUVPUygpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgICAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKKworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgewogICAgICAgICAgICAgICAgIG1TYXdJbnB1dEVvcyA9IHRydWU7CiAgICAgICAgICAgICB9CkBAIC0zNTksOCArNDM3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtZW1jcHkoJm51bVBhZ2VTYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+cEJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgKyBpbkhlYWRlci0+bk9mZnNldCArIGluSGVhZGVyLT5uRmlsbGVkTGVuIC0gNCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldCArIGluSGVhZGVyLT5uRmlsbGVkTGVuIC0gNCwKICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG51bVBhZ2VTYW1wbGVzKSk7CiAKICAgICAgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5PZmZzZXQgPT0gMCkgewpAQCAtMzk5LDYgKzQ3NiwxNCBAQAogICAgICAgICBpbnQgbnVtRnJhbWVzID0gMDsKIAogICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CisKKyAgICAgICAgaWYgKG1TdGF0ZSA9PSBudWxscHRyIHx8IG1WaSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclN0cmVhbUNvcnJ1cHQsIDAsIE5VTEwpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dFKCJvblF1ZXVlRmlsbGVkLCBpbnB1dCBkb2VzIG5vdCBoYXZlIENTRCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKICAgICAgICAgaW50IGVyciA9IHZvcmJpc19kc3Bfc3ludGhlc2lzKG1TdGF0ZSwgJnBhY2ssIDEpOwogICAgICAgICBpZiAoZXJyICE9IDApIHsKICAgICAgICAgICAgIC8vIEZJWE1FIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBsb2cgc3BhbQpAQCAtNDQ4LDE4ICs1MzMsMTMgQEAKICAgICAgICAgaWYgKGluSGVhZGVyKSB7CiAgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKICAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgICAgIGluSW5mbyA9IE5VTEw7CiAgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOwotICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKICAgICAgICAgfQogCiAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7Ci0gICAgICAgIG91dEluZm8gPSBOVUxMOwogICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOwotICAgICAgICBvdXRIZWFkZXIgPSBOVUxMOwotCi0gICAgICAgICsrbUlucHV0QnVmZmVyQ291bnQ7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmgKaW5kZXggMzBkMTM3Yi4uNWZmOGVhNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNPRlRfVk9SQklTX0hfCiAKLSNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaD4KIAogc3RydWN0IHZvcmJpc19kc3Bfc3RhdGU7CiBzdHJ1Y3Qgdm9yYmlzX2luZm87CkBAIC03Miw2ICs3Miw3IEBACiAgICAgdm9pZCBpbml0UG9ydHMoKTsKICAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOwogICAgIGJvb2wgaXNDb25maWd1cmVkKCkgY29uc3Q7CisgICAgdm9pZCBoYW5kbGVFT1MoKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRWb3JiaXMpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwCmluZGV4IDNjYTdjYzAuLjA5ODIwMDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAKICNpbmNsdWRlICJsaWJ5dXYvY29udmVydF9mcm9tLmgiCisjaW5jbHVkZSAibGlieXV2L3ZpZGVvX2NvbW1vbi5oIgogCiAjZGVmaW5lIFVTRV9MSUJZVVYKIApAQCAtNDEsMTcgKzQyLDE3IEBACiB9CiAKIGJvb2wgQ29sb3JDb252ZXJ0ZXI6OmlzVmFsaWQoKSBjb25zdCB7Ci0gICAgaWYgKG1Ec3RGb3JtYXQgIT0gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KICAgICBzd2l0Y2ggKG1TcmNGb3JtYXQpIHsKICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgorICAgICAgICAgICAgcmV0dXJuIG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1CisgICAgICAgICAgICAgICAgICAgIHx8IG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODgKKyAgICAgICAgICAgICAgICAgICAgfHwgbURzdEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODsKKwogICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRDYllDclk6CiAgICAgICAgIGNhc2UgT01YX1FDT01fQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hcjoKICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKICAgICAgICAgY2FzZSBPTVhfVElfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjoKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1OwogCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC02MiwxNCArNjMsNDMgQEAKICAgICAgICAgdm9pZCAqYml0cywKICAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LAogICAgICAgICBzaXplX3QgY3JvcExlZnQsIHNpemVfdCBjcm9wVG9wLAotICAgICAgICBzaXplX3QgY3JvcFJpZ2h0LCBzaXplX3QgY3JvcEJvdHRvbSkKKyAgICAgICAgc2l6ZV90IGNyb3BSaWdodCwgc2l6ZV90IGNyb3BCb3R0b20sCisgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRnJvbWF0KQogICAgIDogbUJpdHMoYml0cyksCisgICAgICBtQ29sb3JGb3JtYXQoY29sb3JGcm9tYXQpLAogICAgICAgbVdpZHRoKHdpZHRoKSwKICAgICAgIG1IZWlnaHQoaGVpZ2h0KSwKICAgICAgIG1Dcm9wTGVmdChjcm9wTGVmdCksCiAgICAgICBtQ3JvcFRvcChjcm9wVG9wKSwKICAgICAgIG1Dcm9wUmlnaHQoY3JvcFJpZ2h0KSwKICAgICAgIG1Dcm9wQm90dG9tKGNyb3BCb3R0b20pIHsKKyAgICBzd2l0Y2gobUNvbG9yRm9ybWF0KSB7CisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjU6CisgICAgICAgIG1CcHAgPSAyOworICAgICAgICBtU3RyaWRlID0gMiAqIG1XaWR0aDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4OgorICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODg6CisgICAgICAgIG1CcHAgPSA0OworICAgICAgICBtU3RyaWRlID0gNCAqIG1XaWR0aDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0Q2JZQ3JZOgorICAgIGNhc2UgT01YX1FDT01fQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hcjoKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorICAgIGNhc2UgT01YX1RJX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6CisgICAgICAgIG1CcHAgPSAxOworICAgICAgICBtU3RyaWRlID0gbVdpZHRoOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBjb2xvciBmb3JtYXQgJWQiLCBtQ29sb3JGb3JtYXQpOworICAgICAgICBtQnBwID0gMTsKKyAgICAgICAgbVN0cmlkZSA9IG1XaWR0aDsKKyAgICAgICAgYnJlYWs7CisgICAgfQogfQogCiBzaXplX3QgQ29sb3JDb252ZXJ0ZXI6OkJpdG1hcFBhcmFtczo6Y3JvcFdpZHRoKCkgY29uc3QgewpAQCAtODksMTkgKzExOSwxNSBAQAogICAgICAgICBzaXplX3QgZHN0V2lkdGgsIHNpemVfdCBkc3RIZWlnaHQsCiAgICAgICAgIHNpemVfdCBkc3RDcm9wTGVmdCwgc2l6ZV90IGRzdENyb3BUb3AsCiAgICAgICAgIHNpemVfdCBkc3RDcm9wUmlnaHQsIHNpemVfdCBkc3RDcm9wQm90dG9tKSB7Ci0gICAgaWYgKG1Ec3RGb3JtYXQgIT0gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1KSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KICAgICBCaXRtYXBQYXJhbXMgc3JjKAogICAgICAgICAgICAgY29uc3RfY2FzdDx2b2lkICo+KHNyY0JpdHMpLAogICAgICAgICAgICAgc3JjV2lkdGgsIHNyY0hlaWdodCwKLSAgICAgICAgICAgIHNyY0Nyb3BMZWZ0LCBzcmNDcm9wVG9wLCBzcmNDcm9wUmlnaHQsIHNyY0Nyb3BCb3R0b20pOworICAgICAgICAgICAgc3JjQ3JvcExlZnQsIHNyY0Nyb3BUb3AsIHNyY0Nyb3BSaWdodCwgc3JjQ3JvcEJvdHRvbSwgbVNyY0Zvcm1hdCk7CiAKICAgICBCaXRtYXBQYXJhbXMgZHN0KAogICAgICAgICAgICAgZHN0Qml0cywKICAgICAgICAgICAgIGRzdFdpZHRoLCBkc3RIZWlnaHQsCi0gICAgICAgICAgICBkc3RDcm9wTGVmdCwgZHN0Q3JvcFRvcCwgZHN0Q3JvcFJpZ2h0LCBkc3RDcm9wQm90dG9tKTsKKyAgICAgICAgICAgIGRzdENyb3BMZWZ0LCBkc3RDcm9wVG9wLCBkc3RDcm9wUmlnaHQsIGRzdENyb3BCb3R0b20sIG1Ec3RGb3JtYXQpOwogCiAgICAgc3RhdHVzX3QgZXJyOwogCkBAIC0yMTIsMjYgKzIzOCwxMDQgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KIAotICAgIHVpbnQxNl90ICpkc3RfcHRyID0gKHVpbnQxNl90ICopZHN0Lm1CaXRzCi0gICAgICAgICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1XaWR0aCArIGRzdC5tQ3JvcExlZnQ7CisgICAgdWludDhfdCAqZHN0X3B0ciA9ICh1aW50OF90ICopZHN0Lm1CaXRzCisgICAgICAgICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1TdHJpZGUgKyBkc3QubUNyb3BMZWZ0ICogZHN0Lm1CcHA7CiAKICAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9Ci0gICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1Dcm9wVG9wICogc3JjLm1XaWR0aCArIHNyYy5tQ3JvcExlZnQ7CisgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1Dcm9wVG9wICogc3JjLm1TdHJpZGUgKyBzcmMubUNyb3BMZWZ0OwogCiAgICAgY29uc3QgdWludDhfdCAqc3JjX3UgPQotICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyY195ICsgc3JjLm1XaWR0aCAqIHNyYy5tSGVpZ2h0Ci0gICAgICAgICsgc3JjLm1Dcm9wVG9wICogKHNyYy5tV2lkdGggLyAyKSArIHNyYy5tQ3JvcExlZnQgLyAyOworICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyYy5tQml0cyArIHNyYy5tU3RyaWRlICogc3JjLm1IZWlnaHQKKyAgICAgICAgKyAoc3JjLm1Dcm9wVG9wIC8gMikgKiAoc3JjLm1TdHJpZGUgLyAyKSArIChzcmMubUNyb3BMZWZ0IC8gMik7CiAKICAgICBjb25zdCB1aW50OF90ICpzcmNfdiA9Ci0gICAgICAgIHNyY191ICsgKHNyYy5tV2lkdGggLyAyKSAqIChzcmMubUhlaWdodCAvIDIpOworICAgICAgICBzcmNfdSArIChzcmMubVN0cmlkZSAvIDIpICogKHNyYy5tSGVpZ2h0IC8gMik7CiAKKyAgICBzd2l0Y2ggKG1Ec3RGb3JtYXQpIHsKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NToKKyAgICAgICAgbGlieXV2OjpJNDIwVG9SR0I1NjUoc3JjX3ksIHNyYy5tU3RyaWRlLCBzcmNfdSwgc3JjLm1TdHJpZGUgLyAyLCBzcmNfdiwgc3JjLm1TdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICh1aW50OCAqKWRzdF9wdHIsIGRzdC5tU3RyaWRlLCBzcmMuY3JvcFdpZHRoKCksIHNyYy5jcm9wSGVpZ2h0KCkpOworICAgICAgICBicmVhazsKIAotICAgIGxpYnl1djo6STQyMFRvUkdCNTY1KHNyY195LCBzcmMubVdpZHRoLCBzcmNfdSwgc3JjLm1XaWR0aCAvIDIsIHNyY192LCBzcmMubVdpZHRoIC8gMiwKLSAgICAgICAgICAgICh1aW50OCAqKWRzdF9wdHIsIGRzdC5tV2lkdGggKiAyLCBkc3QubVdpZHRoLCBkc3QubUhlaWdodCk7CisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MzJCaXRSR0JBODg4ODoKKyAgICAgICAgbGlieXV2OjpDb252ZXJ0RnJvbUk0MjAoc3JjX3ksIHNyYy5tU3RyaWRlLCBzcmNfdSwgc3JjLm1TdHJpZGUgLyAyLCBzcmNfdiwgc3JjLm1TdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICh1aW50OCAqKWRzdF9wdHIsIGRzdC5tU3RyaWRlLCBzcmMuY3JvcFdpZHRoKCksIHNyYy5jcm9wSGVpZ2h0KCksIGxpYnl1djo6Rk9VUkNDX0FCR1IpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODg6CisgICAgICAgIGxpYnl1djo6Q29udmVydEZyb21JNDIwKHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlIC8gMiwgc3JjX3YsIHNyYy5tU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAodWludDggKilkc3RfcHRyLCBkc3QubVN0cmlkZSwgc3JjLmNyb3BXaWR0aCgpLCBzcmMuY3JvcEhlaWdodCgpLCBsaWJ5dXY6OkZPVVJDQ19BUkdCKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIENvbG9yQ29udmVydGVyOjp3cml0ZVRvRHN0KAorICAgICAgICB2b2lkICpkc3RfcHRyLCB1aW50OF90ICprQWRqdXN0ZWRDbGlwLCBib29sIHVuY3JvcHBlZCwKKyAgICAgICAgc2lnbmVkIHIxLCBzaWduZWQgZzEsIHNpZ25lZCBiMSwKKyAgICAgICAgc2lnbmVkIHIyLCBzaWduZWQgZzIsIHNpZ25lZCBiMikgeworICAgIHN3aXRjaCAobURzdEZvcm1hdCkgeworICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1OgorICAgIHsKKyAgICAgICAgdWludDMyX3QgcmdiMSA9CisgICAgICAgICAgICAoKGtBZGp1c3RlZENsaXBbcjFdID4+IDMpIDw8IDExKQorICAgICAgICAgICAgfCAoKGtBZGp1c3RlZENsaXBbZzFdID4+IDIpIDw8IDUpCisgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW2IxXSA+PiAzKTsKKworICAgICAgICBpZiAodW5jcm9wcGVkKSB7CisgICAgICAgICAgICB1aW50MzJfdCByZ2IyID0KKyAgICAgICAgICAgICAgICAoKGtBZGp1c3RlZENsaXBbcjJdID4+IDMpIDw8IDExKQorICAgICAgICAgICAgICAgIHwgKChrQWRqdXN0ZWRDbGlwW2cyXSA+PiAyKSA8PCA1KQorICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbYjJdID4+IDMpOworCisgICAgICAgICAgICAqKHVpbnQzMl90ICopZHN0X3B0ciA9IChyZ2IyIDw8IDE2KSB8IHJnYjE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqKHVpbnQxNl90ICopZHN0X3B0ciA9IHJnYjE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODg6CisgICAgeworICAgICAgICAoKHVpbnQzMl90ICopZHN0X3B0cilbMF0gPQorICAgICAgICAgICAgICAgIChrQWRqdXN0ZWRDbGlwW3IxXSkKKyAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW2cxXSA8PCA4KQorICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbYjFdIDw8IDE2KQorICAgICAgICAgICAgICAgIHwgKDB4RkYgPDwgMjQpOworCisgICAgICAgIGlmICh1bmNyb3BwZWQpIHsKKyAgICAgICAgICAgICgodWludDMyX3QgKilkc3RfcHRyKVsxXSA9CisgICAgICAgICAgICAgICAgICAgIChrQWRqdXN0ZWRDbGlwW3IyXSkKKyAgICAgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtnMl0gPDwgOCkKKyAgICAgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtiMl0gPDwgMTYpCisgICAgICAgICAgICAgICAgICAgIHwgKDB4RkYgPDwgMjQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4OgorICAgIHsKKyAgICAgICAgKCh1aW50MzJfdCAqKWRzdF9wdHIpWzBdID0KKyAgICAgICAgICAgICAgICAoa0FkanVzdGVkQ2xpcFtiMV0pCisgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtnMV0gPDwgOCkKKyAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW3IxXSA8PCAxNikKKyAgICAgICAgICAgICAgICB8ICgweEZGIDw8IDI0KTsKKworICAgICAgICBpZiAodW5jcm9wcGVkKSB7CisgICAgICAgICAgICAoKHVpbnQzMl90ICopZHN0X3B0cilbMV0gPQorICAgICAgICAgICAgICAgICAgICAoa0FkanVzdGVkQ2xpcFtiMl0pCisgICAgICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbZzJdIDw8IDgpCisgICAgICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbcjJdIDw8IDE2KQorICAgICAgICAgICAgICAgICAgICB8ICgweEZGIDw8IDI0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQogc3RhdHVzX3QgQ29sb3JDb252ZXJ0ZXI6OmNvbnZlcnRZVVY0MjBQbGFuYXIoCiAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCkgewogICAgIGlmICghKChzcmMubUNyb3BMZWZ0ICYgMSkgPT0gMApAQCAtMjQyLDE4ICszNDYsMTggQEAKIAogICAgIHVpbnQ4X3QgKmtBZGp1c3RlZENsaXAgPSBpbml0Q2xpcCgpOwogCi0gICAgdWludDE2X3QgKmRzdF9wdHIgPSAodWludDE2X3QgKilkc3QubUJpdHMKLSAgICAgICAgKyBkc3QubUNyb3BUb3AgKiBkc3QubVdpZHRoICsgZHN0Lm1Dcm9wTGVmdDsKKyAgICB1aW50OF90ICpkc3RfcHRyID0gKHVpbnQ4X3QgKilkc3QubUJpdHMKKyAgICAgICAgKyBkc3QubUNyb3BUb3AgKiBkc3QubVN0cmlkZSArIGRzdC5tQ3JvcExlZnQgKiBkc3QubUJwcDsKIAogICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0KLSAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubUNyb3BUb3AgKiBzcmMubVdpZHRoICsgc3JjLm1Dcm9wTGVmdDsKKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubUNyb3BUb3AgKiBzcmMubVN0cmlkZSArIHNyYy5tQ3JvcExlZnQ7CiAKICAgICBjb25zdCB1aW50OF90ICpzcmNfdSA9Ci0gICAgICAgIChjb25zdCB1aW50OF90ICopc3JjX3kgKyBzcmMubVdpZHRoICogc3JjLm1IZWlnaHQKLSAgICAgICAgKyBzcmMubUNyb3BUb3AgKiAoc3JjLm1XaWR0aCAvIDIpICsgc3JjLm1Dcm9wTGVmdCAvIDI7CisgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1TdHJpZGUgKiBzcmMubUhlaWdodAorICAgICAgICArIChzcmMubUNyb3BUb3AgLyAyKSAqIChzcmMubVN0cmlkZSAvIDIpICsgc3JjLm1Dcm9wTGVmdCAvIDI7CiAKICAgICBjb25zdCB1aW50OF90ICpzcmNfdiA9Ci0gICAgICAgIHNyY191ICsgKHNyYy5tV2lkdGggLyAyKSAqIChzcmMubUhlaWdodCAvIDIpOworICAgICAgICBzcmNfdSArIChzcmMubVN0cmlkZSAvIDIpICogKHNyYy5tSGVpZ2h0IC8gMik7CiAKICAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IHNyYy5jcm9wSGVpZ2h0KCk7ICsreSkgewogICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHNyYy5jcm9wV2lkdGgoKTsgeCArPSAyKSB7CkBAIC0yOTYsMzEgKzQwMCwxOSBAQAogICAgICAgICAgICAgc2lnbmVkIGcyID0gKHRtcDIgKyB2X2cgKyB1X2cpIC8gMjU2OwogICAgICAgICAgICAgc2lnbmVkIHIyID0gKHRtcDIgKyB2X3IpIC8gMjU2OwogCi0gICAgICAgICAgICB1aW50MzJfdCByZ2IxID0KLSAgICAgICAgICAgICAgICAoKGtBZGp1c3RlZENsaXBbcjFdID4+IDMpIDw8IDExKQotICAgICAgICAgICAgICAgIHwgKChrQWRqdXN0ZWRDbGlwW2cxXSA+PiAyKSA8PCA1KQotICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbYjFdID4+IDMpOwotCi0gICAgICAgICAgICB1aW50MzJfdCByZ2IyID0KLSAgICAgICAgICAgICAgICAoKGtBZGp1c3RlZENsaXBbcjJdID4+IDMpIDw8IDExKQotICAgICAgICAgICAgICAgIHwgKChrQWRqdXN0ZWRDbGlwW2cyXSA+PiAyKSA8PCA1KQotICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbYjJdID4+IDMpOwotCi0gICAgICAgICAgICBpZiAoeCArIDEgPCBzcmMuY3JvcFdpZHRoKCkpIHsKLSAgICAgICAgICAgICAgICAqKHVpbnQzMl90ICopKCZkc3RfcHRyW3hdKSA9IChyZ2IyIDw8IDE2KSB8IHJnYjE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRzdF9wdHJbeF0gPSByZ2IxOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbCB1bmNyb3BwZWQgPSB4ICsgMSA8IHNyYy5jcm9wV2lkdGgoKTsKKyAgICAgICAgICAgICh2b2lkKXdyaXRlVG9Ec3QoZHN0X3B0ciArIHggKiBkc3QubUJwcCwKKyAgICAgICAgICAgICAgICAgICAga0FkanVzdGVkQ2xpcCwgdW5jcm9wcGVkLCByMSwgZzEsIGIxLCByMiwgZzIsIGIyKTsKICAgICAgICAgfQogCi0gICAgICAgIHNyY195ICs9IHNyYy5tV2lkdGg7CisgICAgICAgIHNyY195ICs9IHNyYy5tU3RyaWRlOwogCiAgICAgICAgIGlmICh5ICYgMSkgewotICAgICAgICAgICAgc3JjX3UgKz0gc3JjLm1XaWR0aCAvIDI7Ci0gICAgICAgICAgICBzcmNfdiArPSBzcmMubVdpZHRoIC8gMjsKKyAgICAgICAgICAgIHNyY191ICs9IHNyYy5tU3RyaWRlIC8gMjsKKyAgICAgICAgICAgIHNyY192ICs9IHNyYy5tU3RyaWRlIC8gMjsKICAgICAgICAgfQogCi0gICAgICAgIGRzdF9wdHIgKz0gZHN0Lm1XaWR0aDsKKyAgICAgICAgZHN0X3B0ciArPSBkc3QubVN0cmlkZTsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfdmlkZW8ueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX3ZpZGVvLnhtbAppbmRleCBjZTE2NGEyLi44MjlmNDAzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfdmlkZW8ueG1sCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV92aWRlby54bWwKQEAgLTM0LDIwICszNCwyMSBAQAogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5oMjY0LmRlY29kZXIiIHR5cGU9InZpZGVvL2F2YyI+Ci0gICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlSGlnaCA6IExldmVsNDEgLS0+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIxNngxNiIgbWF4PSIxOTIweDEwODgiIC8+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlSGlnaCA6IExldmVsNTIgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iNDA4MHg0MDgwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTI0NDgwMCIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMjAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMzI3NjgiIC8+IDwhLS0gbWF4IDQwOTZ4MjA0OCBlcXVpdmFsZW50IC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0xOTY2MDgwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTQ4MDAwMDAwIiAvPgogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5oZXZjLmRlY29kZXIiIHR5cGU9InZpZGVvL2hldmMiPgogICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBNYWluVGllckxldmVsNTEgLS0+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMjA0OHgyMDQ4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjQwOTZ4NDA5NiIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9Ijh4OCIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMTM5MjY0IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS0xOTY2MDgiIC8+IDwhLS0gbWF4IDQwOTZ4MzA3MiAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMjAwMDAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMDAwMDAwMCIgLz4KICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgpAQCAtNTYsNiArNTcsNyBAQAogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS0xNjM4NCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMTAwMDAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00MDAwMDAwMCIgLz4KICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgpAQCAtNjQsNiArNjYsNyBAQAogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS0xNjM4NCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtNTAwMDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTQwMDAwMDAwIiAvPgogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CkBAIC03OSwxMCArODIsMTEgQEAKICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmgyNjQuZW5jb2RlciIgdHlwZT0idmlkZW8vYXZjIj4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVCYXNlbGluZSA6IExldmVsNDEgLS0+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIxNngxNiIgbWF4PSIxOTIweDEwODgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIxNngxNiIgbWF4PSIyMDQ4eDIwNDgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMjQ0ODAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS04MTkyIiAvPiA8IS0tIG1heCAyMDQ4eDEwMjQgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTI0NTc2MCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMjAwMDAwMCIgLz4KICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImludHJhLXJlZnJlc2giIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KQEAgLTk4LDYgKzEwMiw5IEBACiAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlTWFpbiA6IExldmVsX1ZlcnNpb24wLTMgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMjA0OHgyMDQ4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8IS0tIDIwMTYgZGV2aWNlcyBjYW4gZW5jb2RlIGF0IGFib3V0IDEwZnBzIGF0IHRoaXMgYmxvY2sgY291bnQgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTE2Mzg0IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTQwMDAwMDAwIiAvPgogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IlZCUixDQlIiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KQEAgLTEwNSw2ICsxMTIsOSBAQAogICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBMZXZlbF9WZXJzaW9uMC0zIC0tPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPCEtLSAyMDE2IGRldmljZXMgY2FuIGVuY29kZSBhdCBhYm91dCA4ZnBzIGF0IHRoaXMgYmxvY2sgY291bnQgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTM2MDAiIC8+IDwhLS0gbWF4IDEyODB4NzIwIC0tPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTQwMDAwMDAwIiAvPgogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IlZCUixDQlIiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV92aWRlb19sZS54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfdmlkZW9fbGUueG1sCmluZGV4IDAzNGEwMzguLmQ3YzY1NzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV92aWRlb19sZS54bWwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX3ZpZGVvX2xlLnhtbApAQCAtMzQsMjIgKzM0LDIyIEBACiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmgyNjQuZGVjb2RlciIgdHlwZT0idmlkZW8vYXZjIj4KLSAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVCYXNlbGluZSA6IExldmVsNTEgLS0+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlSGlnaCA6IExldmVsNTEgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMjA0OHgyMDQ4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTgxNjAiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTQ4OTYwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMTYzODQiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTQ5MTUyMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00MDAwMDAwMCIgLz4KICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuaGV2Yy5kZWNvZGVyIiB0eXBlPSJ2aWRlby9oZXZjIj4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTWFpblRpZXJMZXZlbDUxIC0tPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjEyODB4MTI4MCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSI4eDgiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTEzOTI2NCIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtNDMyMDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS02NTUzNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtNDkxNTIwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTUwMDAwMDAiIC8+CiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgpAQCAtNTcsNyArNTcsNyBAQAogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS04MTYwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS04MTkyIiAvPiA8IS0tIG1heCAyMDQ4eDEwMjQgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTUwMDAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00MDAwMDAwMCIgLz4KICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgpAQCAtNjYsNyArNjYsNyBAQAogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjEyODB4MTI4MCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS0zNjAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS0zNjAwIiAvPiA8IS0tIG1heCAxMjgweDcyMCAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMTA4MDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTUwMDAwMDAiIC8+CiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KQEAgLTgxLDEyICs4MSwxNCBAQAogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTEyODAwMCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmgyNjQuZW5jb2RlciIgdHlwZT0idmlkZW8vYXZjIj4KLSAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVCYXNlbGluZSA6IExldmVsMiAtLT4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE2eDE2IiBtYXg9Ijg5Nng4OTYiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDMgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIxNngxNiIgbWF4PSIxODA4eDE4MDgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMTE4ODAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTE2MjAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTQwNTAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTIwMDAwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJpbnRyYS1yZWZyZXNoIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUubXBlZzQuZW5jb2RlciIgdHlwZT0idmlkZW8vbXA0di1lcyI+CiAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQ29yZSA6IExldmVsMiAtLT4KQEAgLTEwMCw3ICsxMDIsOCBAQAogICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBMZXZlbF9WZXJzaW9uMC0zIC0tPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjEyODB4MTI4MCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTM2MDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS0zNjAwIiAvPiA8IS0tIG1heCAxMjgweDcyMCAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0yMDAwMDAwMCIgLz4KICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImJpdHJhdGUtbW9kZXMiIHZhbHVlPSJWQlIsQ0JSIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvQW5kcm9pZC5icAppbmRleCAyODRjMjVmLi4xYjlmZTBmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw5IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2ZsYWNkZWMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJGTEFDRGVjb2Rlci5jcHAiLApAQCAtMzEsNCArMzUsNSBAQAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKKyAgICBoZWFkZXJfbGliczogWyJsaWJtZWRpYV9oZWFkZXJzIl0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKaW5kZXggNjU3ZjAyYy4uMjIxYWYxZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icApAQCAtMSwzICsxLDkgQEAKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25faGVhZGVycyIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLApAQCAtMTMsMTIgKzE5LDEzIEBACiAgICAgICAgICJpbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24iLAogICAgIF0sCiAKLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJpbmNsdWRlIiwKLSAgICBdLAotCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmhhcmR3YXJlX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuY3BwCmluZGV4IGNjODkwNjQuLjhmMzI1ODIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKIAogc3A8QUJ1ZmZlcj4gZGVjb2RlQmFzZTY0KGNvbnN0IEFTdHJpbmcgJnMpIHsKICAgICBzaXplX3QgbiA9IHMuc2l6ZSgpOworCiAgICAgaWYgKChuICUgNCkgIT0gMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC00NSw3ICs0Niw2IEBACiAgICAgc2l6ZV90IG91dExlbiA9IChuIC8gNCkgKiAzIC0gcGFkZGluZzsKIAogICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKG91dExlbik7Ci0KICAgICB1aW50OF90ICpvdXQgPSBidWZmZXItPmRhdGEoKTsKICAgICBpZiAob3V0ID09IE5VTEwgfHwgYnVmZmVyLT5zaXplKCkgPCBvdXRMZW4pIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC02MSw5ICs2MSw5IEBACiAgICAgICAgICAgICB2YWx1ZSA9IDI2ICsgYyAtICdhJzsKICAgICAgICAgfSBlbHNlIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykgewogICAgICAgICAgICAgdmFsdWUgPSA1MiArIGMgLSAnMCc7Ci0gICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnKycpIHsKKyAgICAgICAgfSBlbHNlIGlmIChjID09ICcrJyB8fCBjID09ICctJykgewogICAgICAgICAgICAgdmFsdWUgPSA2MjsKLSAgICAgICAgfSBlbHNlIGlmIChjID09ICcvJykgeworICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJy8nIHx8IGMgPT0gJ18nKSB7CiAgICAgICAgICAgICB2YWx1ZSA9IDYzOwogICAgICAgICB9IGVsc2UgaWYgKGMgIT0gJz0nKSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTE0NCw0ICsxNDQsMjYgQEAKICAgICB9CiB9CiAKK3ZvaWQgZW5jb2RlQmFzZTY0VXJsKAorICAgICAgICBjb25zdCB2b2lkICpfZGF0YSwgc2l6ZV90IHNpemUsIEFTdHJpbmcgKm91dCkgeworICAgIGVuY29kZUJhc2U2NChfZGF0YSwgc2l6ZSwgb3V0KTsKKworICAgIGlmICgoLTEgIT0gb3V0LT5maW5kKCIrIikpIHx8ICgtMSAhPSBvdXQtPmZpbmQoIi8iKSkpIHsKKyAgICAgICAgc2l6ZV90IG91dExlbiA9IG91dC0+c2l6ZSgpOworICAgICAgICBjaGFyICpiYXNlNjR1cmwgPSBuZXcgY2hhcltvdXRMZW5dOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dExlbjsgKytpKSB7CisgICAgICAgICAgICBpZiAob3V0LT5jX3N0cigpW2ldID09ICcrJykKKyAgICAgICAgICAgICAgICBiYXNlNjR1cmxbaV0gPSAnLSc7CisgICAgICAgICAgICBlbHNlIGlmIChvdXQtPmNfc3RyKClbaV0gPT0gJy8nKQorICAgICAgICAgICAgICAgIGJhc2U2NHVybFtpXSA9ICdfJzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBiYXNlNjR1cmxbaV0gPSBvdXQtPmNfc3RyKClbaV07CisgICAgICAgIH0KKworICAgICAgICBvdXQtPnNldFRvKGJhc2U2NHVybCwgb3V0TGVuKTsKKyAgICAgICAgZGVsZXRlW10gYmFzZTY0dXJsOworICAgIH0KK30KKworCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaAppbmRleCBlMzQwYjg5Li5hYmM5NWUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaApAQCAtMjgsNiArMjgsOCBAQAogc3A8QUJ1ZmZlcj4gZGVjb2RlQmFzZTY0KGNvbnN0IEFTdHJpbmcgJnMpOwogdm9pZCBlbmNvZGVCYXNlNjQoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIEFTdHJpbmcgKm91dCk7CiAKK3ZvaWQgZW5jb2RlQmFzZTY0VXJsKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBBU3RyaW5nICpvdXQpOworCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIEJBU0VfNjRfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQW5kcm9pZC5tawppbmRleCBkNzQxYzZmLi5hOWUzYzc2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BbmRyb2lkLm1rCkBAIC05LDExICs5LDEzIEBACiAKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCiAJQURhdGFfdGVzdC5jcHAgXAorCUJhc2U2NF90ZXN0LmNwcCBcCiAJRmxhZ2dlZF90ZXN0LmNwcCBcCiAJVHlwZVRyYWl0c190ZXN0LmNwcCBcCiAJVXRpbHNfdGVzdC5jcHAgXAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJsb2cgXAogCWxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAogCWxpYnV0aWxzIFwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9CYXNlNjRfdGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0Jhc2U2NF90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTQyODllCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9CYXNlNjRfdGVzdC5jcHAKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZ1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK25hbWVzcGFjZSB7Citjb25zdCBhbmRyb2lkOjpTdHJpbmc4IGtCYXNlNjRQYWRkaW5nKCI9Iik7Cit9OworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEJhc2U2NFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK307CisKK3ZvaWQgdmVyaWZ5RGVjb2RlKGNvbnN0IEFTdHJpbmcqIGV4cGVjdGVkLCBjb25zdCBBU3RyaW5nKiBpbikgeworICAgIHNpemVfdCBudW1UZXN0cyA9IDA7CisgICAgd2hpbGUgKCFleHBlY3RlZFtudW1UZXN0c10uZW1wdHkoKSkKKyAgICAgICAgKytudW1UZXN0czsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtVGVzdHM7ICsraSkgeworICAgICAgICAvLyBTaW5jZSBhbmRyb2lkOjpkZWNvZGVCYXNlNjQoKSByZXF1aXJlcyBwYWRkaW5nIGNoYXJhY3RlcnMsCisgICAgICAgIC8vIGFkZCB0aGVtIHNvIGxlbmd0aCBvZiBlbmNvZGVkIHRleHQgaXMgZXhhY3RseSBhIG11bHRpcGxlIG9mIDQuCisgICAgICAgIGludCByZW1haW5kZXIgPSBpbltpXS5zaXplKCkgJSA0OworICAgICAgICBTdHJpbmc4IHBhZGRlZFRleHQoaW5baV0uY19zdHIoKSk7CisgICAgICAgIGlmIChyZW1haW5kZXIgPiAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQgLSByZW1haW5kZXI7ICsraSkgeworICAgICAgICAgICAgICAgIHBhZGRlZFRleHQuYXBwZW5kKGtCYXNlNjRQYWRkaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzcDxBQnVmZmVyPiByZXN1bHQgPSBkZWNvZGVCYXNlNjQoQVN0cmluZyhwYWRkZWRUZXh0LnN0cmluZygpKSk7CisKKyAgICAgICAgQVNTRVJUX0VRKEFTdHJpbmdVdGlsczo6Q29tcGFyZShleHBlY3RlZFtpXS5jX3N0cigpLAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHJlc3VsdC0+ZGF0YSgpKSwKKyAgICAgICAgICAgICAgICBleHBlY3RlZFtpXS5zaXplKCksIGZhbHNlKSwgMCk7CisgICAgfQorfQorCit2b2lkIHZlcmlmeUVuY29kZShjb25zdCBBU3RyaW5nKiBleHBlY3RlZCwgY29uc3QgQVN0cmluZyogaW4pIHsKKyAgICBzaXplX3QgbnVtVGVzdHMgPSAwOworICAgIHdoaWxlICghZXhwZWN0ZWRbbnVtVGVzdHNdLmVtcHR5KCkpCisgICAgICAgICsrbnVtVGVzdHM7CisKKyAgICBBU3RyaW5nIG91dCA9IEFTdHJpbmcoIiIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtVGVzdHM7ICsraSkgeworICAgICAgICBlbmNvZGVCYXNlNjRVcmwoaW5baV0uY19zdHIoKSwgaW5baV0uc2l6ZSgpLCAmb3V0KTsKKworICAgICAgICBBU1NFUlRfRVEoQVN0cmluZ1V0aWxzOjpDb21wYXJlKGV4cGVjdGVkW2ldLmNfc3RyKCksIG91dC5jX3N0cigpLAorICAgICAgICAgICAgICAgIGV4cGVjdGVkW2ldLnNpemUoKSwgZmFsc2UpLCAwKTsKKyAgICB9Cit9CisKK1RFU1RfRihCYXNlNjRUZXN0LCBUZXN0RGVjb2RlQmFzZTY0KSB7CisgICAgY29uc3QgQVN0cmluZyBiYXNlNjRbXSA9IHsKKyAgICAgICAgQVN0cmluZygiU0dWc2JHOGdSbkpwWlc1a0lRIiksCisgICAgICAgIEFTdHJpbmcoIlIyOXZaQ0JrWVhraCIpLAorICAgICAgICBBU3RyaW5nKCIiKSAgLy8gc3RyaW5nIHRvIHNpZ25hbCBlbmQgb2YgYXJyYXkKKyAgICB9OworCisgICAgY29uc3QgQVN0cmluZyBjbGVhclRleHRbXSA9IHsKKyAgICAgICAgQVN0cmluZygiSGVsbG8gRnJpZW5kISIpLAorICAgICAgICBBU3RyaW5nKCJHb29kIGRheSEiKSwKKyAgICAgICAgQVN0cmluZygiIikKKyAgICB9OworCisgICAgdmVyaWZ5RGVjb2RlKGNsZWFyVGV4dCwgYmFzZTY0KTsKK30KKworVEVTVF9GKEJhc2U2NFRlc3QsIFRlc3REZWNvZGVCYXNlNjRVcmwpIHsKKyAgICBjb25zdCBBU3RyaW5nIGJhc2U2NFVybFtdID0geworICAgICAgICBBU3RyaW5nKCJTR1ZzYkc4Z1JuSnBaVzVrSUNFLVB3IiksCisgICAgICAgIEFTdHJpbmcoIlNHVnNiRzhnUm5KcFpXNWtJQ0VfIiksCisgICAgICAgIEFTdHJpbmcoIlNHVnNiRzhnUHo0LUlFWnlhV1Z1WkNBX1BnIiksCisgICAgICAgIEFTdHJpbmcoIiIpCisgICAgfTsKKworICAgIGNvbnN0IEFTdHJpbmcgY2xlYXJUZXh0W10gPSB7CisgICAgICAgIEFTdHJpbmcoIkhlbGxvIEZyaWVuZCAhPj8iKSwKKyAgICAgICAgQVN0cmluZygiSGVsbG8gRnJpZW5kICE/IiksCisgICAgICAgIEFTdHJpbmcoIkhlbGxvID8+PiBGcmllbmQgPz4iKSwKKyAgICAgICAgQVN0cmluZygiIikKKyAgICB9OworCisgICAgdmVyaWZ5RGVjb2RlKGNsZWFyVGV4dCwgYmFzZTY0VXJsKTsKK30KKworVEVTVF9GKEJhc2U2NFRlc3QsIFRlc3REZWNvZGVNYWxmb3JtZWRCYXNlNjQpIHsKKyAgICBjb25zdCBBU3RyaW5nIGJhc2U2NFVybFtdID0geworICAgICAgICBBU3RyaW5nKCIxP0dhd2dndUZ5R3JXS2F2N0FYNFZLVWciKSwgIC8vIGZhaWwgb24gcGFyc2luZworICAgICAgICBBU3RyaW5nKCJHYXdnZ3VGeUdyV0thdjdBWDRWPz8/IiksICAgIC8vIGZhaWwgb24gbGVuZ3RoIG5vdCBtdWx0aXBsZSBvZiA0CisgICAgICAgIEFTdHJpbmcoIkdhd2dndUZ5R3JXS2F2N0FYNFZLVWciKSwgICAgLy8gZGl0dG8KKyAgICB9OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gcmVzdWx0ID0gZGVjb2RlQmFzZTY0KEFTdHJpbmcoYmFzZTY0VXJsW2ldKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHJlc3VsdCA9PSBudWxscHRyKTsKKyAgICB9Cit9CisKK1RFU1RfRihCYXNlNjRUZXN0LCBUZXN0RW5jb2RlQmFzZTY0KSB7CisgICAgY29uc3QgQVN0cmluZyBjbGVhclRleHRbXSA9IHsKKyAgICAgICAgQVN0cmluZygiSGVsbG8gRnJpZW5kISIpLAorICAgICAgICBBU3RyaW5nKCJHb29kIGRheSEiKSwKKyAgICAgICAgQVN0cmluZygiIikKKyAgICB9OworCisgICAgY29uc3QgQVN0cmluZyBiYXNlNjRbXSA9IHsKKyAgICAgICAgQVN0cmluZygiU0dWc2JHOGdSbkpwWlc1a0lRPT0iKSwKKyAgICAgICAgQVN0cmluZygiUjI5dlpDQmtZWGtoIiksCisgICAgICAgIEFTdHJpbmcoIiIpCisgICAgfTsKKworICAgIHZlcmlmeUVuY29kZShiYXNlNjQsIGNsZWFyVGV4dCk7Cit9CisKK1RFU1RfRihCYXNlNjRUZXN0LCBUZXN0RW5jb2RlQmFzZTY0VXJsKSB7CisgICAgY29uc3QgQVN0cmluZyBjbGVhclRleHRbXSA9IHsKKyAgICAgICAgQVN0cmluZygiSGVsbG8gRnJpZW5kICE+PyIpLAorICAgICAgICBBU3RyaW5nKCJIZWxsbyBGcmllbmQgIT8iKSwKKyAgICAgICAgQVN0cmluZygiSGVsbG8gPz4+IEZyaWVuZCA/PiIpLAorICAgICAgICBBU3RyaW5nKCIiKQorICAgIH07CisKKyAgICBjb25zdCBBU3RyaW5nIGJhc2U2NFVybFtdID0geworICAgICAgICBBU3RyaW5nKCJTR1ZzYkc4Z1JuSnBaVzVrSUNFLVB3PT0iKSwKKyAgICAgICAgQVN0cmluZygiU0dWc2JHOGdSbkpwWlc1a0lDRV8iKSwKKyAgICAgICAgQVN0cmluZygiU0dWc2JHOGdQejQtSUVaeWFXVnVaQ0FfUGciKSwKKyAgICAgICAgQVN0cmluZygiIikKKyAgICB9OworCisgICAgdmVyaWZ5RW5jb2RlKGJhc2U2NFVybCwgY2xlYXJUZXh0KTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BQ29kZWNCdWZmZXJDaGFubmVsLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FDb2RlY0J1ZmZlckNoYW5uZWwuaAppbmRleCAwZGEyZTgxLi5mMjUzYTUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FDb2RlY0J1ZmZlckNoYW5uZWwuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FDb2RlY0J1ZmZlckNoYW5uZWwuaApAQCAtMzAsNiArMzAsOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX21lbW9yeTsKKwogLyoqCiAgKiBCdWZmZXJDaGFubmVsQmFzZSBpbXBsZW1lbnRhdGlvbiBmb3IgQUNvZGVjLgogICovCkBAIC0xMTcsNiArMTE5LDcgQEAKICAgICBzcDxNZW1vcnlEZWFsZXI+IG1EZWFsZXI7CiAgICAgc3A8SU1lbW9yeT4gbURlY3J5cHREZXN0aW5hdGlvbjsKICAgICBpbnQzMl90IG1IZWFwU2VxTnVtOworICAgIGhpZGxfbWVtb3J5IG1IaWRsTWVtb3J5OwogCiAgICAgLy8gVGhlc2Ugc2hvdWxkIG9ubHkgYmUgYWNjZXNzZWQgdmlhIHN0ZDo6YXRvbWljXyogZnVuY3Rpb25zLgogICAgIC8vCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0l0ZW1UYWJsZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JdGVtVGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTZhZjVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JdGVtVGFibGUuaApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJVEVNX1RBQkxFX0hfCisjZGVmaW5lIElURU1fVEFCTEVfSF8KKworI2luY2x1ZGUgPHNldD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRGF0YVNvdXJjZTsKK2NsYXNzIE1ldGFEYXRhOworCituYW1lc3BhY2UgaGVpZiB7CisKK3N0cnVjdCBBc3NvY2lhdGlvbkVudHJ5Oworc3RydWN0IEltYWdlSXRlbTsKK3N0cnVjdCBJdGVtTG9jOworc3RydWN0IEl0ZW1JbmZvOworc3RydWN0IEl0ZW1Qcm9wZXJ0eTsKK3N0cnVjdCBJdGVtUmVmZXJlbmNlOworCisvKgorICogSXRlbVRhYmxlIGtlZXBzIHRyYWNrIG9mIGFsbCBpbWFnZSBpdGVtcyAoaW5jbHVkaW5nIGNvZGVkIGltYWdlcywgZ3JpZHMgYW5kCisgKiB0aWxlcykgaW5zaWRlIGEgSEVJRiBzdGlsbCBpbWFnZSAoSVNPL0lFQyBGRElTIDIzMDA4LTEyLjI6MjAxNyhFKSkuCisgKi8KKworY2xhc3MgSXRlbVRhYmxlIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IEl0ZW1UYWJsZShjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKTsKKworICAgIHN0YXR1c190IHBhcnNlKHVpbnQzMl90IHR5cGUsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisKKyAgICBib29sIGlzVmFsaWQoKSB7IHJldHVybiBtSW1hZ2VJdGVtc1ZhbGlkOyB9CisgICAgc3A8TWV0YURhdGE+IGdldEltYWdlTWV0YSgpOworICAgIHVpbnQzMl90IGNvdW50SW1hZ2VzKCkgY29uc3Q7CisgICAgc3RhdHVzX3QgZmluZFByaW1hcnlJbWFnZSh1aW50MzJfdCAqaW1hZ2VJbmRleCk7CisgICAgc3RhdHVzX3QgZmluZFRodW1ibmFpbCh1aW50MzJfdCAqdGh1bWJuYWlsSW5kZXgpOworICAgIHN0YXR1c190IGdldEltYWdlT2Zmc2V0QW5kU2l6ZSgKKyAgICAgICAgICAgIHVpbnQzMl90ICppbWFnZUluZGV4LCBvZmY2NF90ICpvZmZzZXQsIHNpemVfdCAqc2l6ZSk7CisKK3Byb3RlY3RlZDoKKyAgICB+SXRlbVRhYmxlKCk7CisKK3ByaXZhdGU6CisgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CisKKyAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSXRlbUxvYz4gbUl0ZW1Mb2NzOworICAgIFZlY3RvcjxJdGVtSW5mbz4gbUl0ZW1JbmZvczsKKyAgICBWZWN0b3I8QXNzb2NpYXRpb25FbnRyeT4gbUFzc29jaWF0aW9uczsKKyAgICBWZWN0b3I8c3A8SXRlbVByb3BlcnR5PiA+IG1JdGVtUHJvcGVydGllczsKKyAgICBWZWN0b3I8c3A8SXRlbVJlZmVyZW5jZT4gPiBtSXRlbVJlZmVyZW5jZXM7CisKKyAgICB1aW50MzJfdCBtUHJpbWFyeUl0ZW1JZDsKKyAgICBvZmY2NF90IG1JZGF0T2Zmc2V0OworICAgIHNpemVfdCBtSWRhdFNpemU7CisKKyAgICBzdGQ6OnNldDx1aW50MzJfdD4gbVJlcXVpcmVkQm94ZXM7CisgICAgc3RkOjpzZXQ8dWludDMyX3Q+IG1Cb3hlc1NlZW47CisKKyAgICBib29sIG1JbWFnZUl0ZW1zVmFsaWQ7CisgICAgdWludDMyX3QgbUN1cnJlbnRJbWFnZUluZGV4OworICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBJbWFnZUl0ZW0+IG1JdGVtSWRUb0ltYWdlTWFwOworCisgICAgc3RhdHVzX3QgcGFyc2VJbG9jQm94KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VJaW5mQm94KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VQaXRtQm94KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VJcHJwQm94KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VJZGF0Qm94KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VJcmVmQm94KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisKKyAgICB2b2lkIGF0dGFjaFByb3BlcnR5KGNvbnN0IEFzc29jaWF0aW9uRW50cnkgJmFzc29jaWF0aW9uKTsKKyAgICBzdGF0dXNfdCBidWlsZEltYWdlSXRlbXNJZlBvc3NpYmxlKHVpbnQzMl90IHR5cGUpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSXRlbVRhYmxlKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGhlaWYKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBJVEVNX1RBQkxFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oCmluZGV4IDJhNzUyOThmLi5hYzkzYjVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaApAQCAtNDUsNyArNDUsNyBAQAogCiAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0TWV0YURhdGEoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3Qgc3A8SUNhcz4gJmNhcykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBISW50ZXJmYWNlVG9rZW4gJmNhc1Rva2VuKSBvdmVycmlkZTsKIAogICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1QRUcyVFNFeHRyYWN0b3IiOyB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUc0RXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgKaW5kZXggMWVmZTZiOS4uMjE0YTNkZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaApAQCAtMjgsMTEgKzI4LDE0IEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIHN0cnVjdCBBTWVzc2FnZTsKIGNsYXNzIERhdGFTb3VyY2U7CiBjbGFzcyBTYW1wbGVUYWJsZTsKIGNsYXNzIFN0cmluZzg7CituYW1lc3BhY2UgaGVpZiB7CitjbGFzcyBJdGVtVGFibGU7Cit9Cit1c2luZyBoZWlmOjpJdGVtVGFibGU7CiAKIHN0cnVjdCBTaWR4RW50cnkgewogICAgIHNpemVfdCBtU2l6ZTsKQEAgLTU5LDYgKzYyLDcgQEAKICAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRNZXRhRGF0YSgpOwogICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1QRUc0RXh0cmFjdG9yIjsgfQorICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCk7CiAKICAgICAvLyBmb3IgRFJNCiAgICAgdmlydHVhbCBjaGFyKiBnZXREcm1UcmFja0luZm8oc2l6ZV90IHRyYWNrSUQsIGludCAqbGVuKTsKQEAgLTEwMCw2ICsxMDQsNyBAQAogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAgICAgdWludDMyX3QgbUhlYWRlclRpbWVzY2FsZTsKICAgICBib29sIG1Jc1FUOworICAgIGJvb2wgbUlzSEVJRjsKIAogICAgIFRyYWNrICptRmlyc3RUcmFjaywgKm1MYXN0VHJhY2s7CiAKQEAgLTEzNyw2ICsxNDIsOCBAQAogICAgIFNJTkYgKm1GaXJzdFNJTkY7CiAKICAgICBib29sIG1Jc0RybTsKKyAgICBzcDxJdGVtVGFibGU+IG1JdGVtVGFibGU7CisKICAgICBzdGF0dXNfdCBwYXJzZURybVNJTkYob2ZmNjRfdCAqb2Zmc2V0LCBvZmY2NF90IGRhdGFfb2Zmc2V0KTsKIAogICAgIHN0YXR1c190IHBhcnNlVHJhY2tIZWFkZXIob2ZmNjRfdCBkYXRhX29mZnNldCwgb2ZmNjRfdCBkYXRhX3NpemUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaAppbmRleCBiN2FjNzE4Li4yNzdlYjNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaApAQCAtMzgsOSArMzgsOSBAQAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4mIHNvdXJjZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+JiBzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpOwogCi0gICAgdmlydHVhbCBWaWRlb0ZyYW1lICpnZXRGcmFtZUF0VGltZShpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbik7CisgICAgdmlydHVhbCBWaWRlb0ZyYW1lICpnZXRGcmFtZUF0VGltZShpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbiwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5KTsKICAgICB2aXJ0dWFsIE1lZGlhQWxidW1BcnQgKmV4dHJhY3RBbGJ1bUFydCgpOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZXh0cmFjdE1ldGFkYXRhKGludCBrZXlDb2RlKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKaW5kZXggZDA0OWRmNS4uNDI0MjQ2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93Lmg+CiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvTWV0YWRhdGFCdWZmZXJUeXBlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0luZm8uaD4KICNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmg+CkBAIC0zMCw2ICszMSw4IEBACiAjaW5jbHVkZSA8T01YX0F1ZGlvLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgogI2luY2x1ZGUgPG5hdGl2ZWJhc2UvbmF0aXZlYmFzZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9hbGxvY2F0b3IvMS4wL0lBbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+CiAKICNkZWZpbmUgVFJBQ0tfQlVGRkVSX1RJTUlORyAgICAgMAogCkBAIC00MiwyMCArNDUsNiBAQAogc3RydWN0IERlc2NyaWJlQ29sb3JGb3JtYXQyUGFyYW1zOwogc3RydWN0IERhdGFDb252ZXJ0ZXI7CiAKLS8vIFRyZWJsZSBzaGFyZWQgbWVtb3J5Ci1uYW1lc3BhY2UgaGlkbCB7Ci1uYW1lc3BhY2UgYWxsb2NhdG9yIHsKLW5hbWVzcGFjZSBWMV8wIHsKLXN0cnVjdCBJQWxsb2NhdG9yOwotfSAvLyBWMV8wCi19IC8vIGFsbG9jYXRvcgotbmFtZXNwYWNlIG1lbW9yeSB7Ci1uYW1lc3BhY2UgVjFfMCB7Ci1zdHJ1Y3QgSU1lbW9yeTsKLX0gLy8gVjFfMAotfSAvLyBtZW1vcnkKLX0gLy8gaGlkbAotCiB0eXBlZGVmIGhpZGw6OmFsbG9jYXRvcjo6VjFfMDo6SUFsbG9jYXRvciBUQWxsb2NhdG9yOwogdHlwZWRlZiBoaWRsOjptZW1vcnk6OlYxXzA6OklNZW1vcnkgVE1lbW9yeTsKIApAQCAtNzIsOSArNjEsMTAgQEAKICAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTdGFydCgpOwogICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVNodXRkb3duKGJvb2wga2VlcENvbXBvbmVudEFsbG9jYXRlZCA9IGZhbHNlKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlDYXBhYmlsaXRpZXMoCi0gICAgICAgICAgICBjb25zdCBBU3RyaW5nICZuYW1lLCBjb25zdCBBU3RyaW5nICZtaW1lLCBib29sIGlzRW5jb2RlciwKLSAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+ICpjYXBzKTsKKyAgICBzdGF0dXNfdCBxdWVyeUNhcGFiaWxpdGllcygKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIG93bmVyLCBjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgY29uc3QgY2hhciogbWltZSwgYm9vbCBpc0VuY29kZXIsCisgICAgICAgICAgICBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyKiBjYXBzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSk7CiAKQEAgLTk0LDcgKzg0LDggQEAKICAgICAvLyBzb21lIE9NWCBjb21wb25lbnRzIGFzIGF1dG8gbGV2ZWwsIGFuZCBieSBvdGhlcnMgYXMgaW52YWxpZCBsZXZlbC4KICAgICBzdGF0aWMgaW50IC8qIE9NWF9WSURFT19BVkNMRVZFTFRZUEUgKi8gZ2V0QVZDTGV2ZWxGb3IoCiAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCByYXRlLCBpbnQgYml0cmF0ZSwKLSAgICAgICAgICAgIE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSBwcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSk7CisgICAgICAgICAgICBPTVhfVklERU9fQVZDUFJPRklMRUVYVFRZUEUgcHJvZmlsZSA9CisgICAgICAgICAgICAgICAgKE9NWF9WSURFT19BVkNQUk9GSUxFRVhUVFlQRSlPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lKTsKIAogICAgIC8vIFF1aXJrIHN0aWxsIHN1cHBvcnRlZCwgZXZlbiB0aG91Z2ggZGVwcmVjYXRlZAogICAgIGVudW0gUXVpcmtzIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oCmluZGV4IDJhYWE4ODQuLmQ2MTQ5YzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaApAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KLSNpbmNsdWRlIDxNZXRhZGF0YUJ1ZmZlclR5cGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaAppbmRleCAwZGQ3N2JhLi45MTk3ZjdiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmgKQEAgLTI0LDI3ICsyNCwzMSBAQAogCiAjZGVmaW5lIFNUUklOR0lGWV9FTlVNUwogCi0jaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0NyeXB0b0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNJbmZvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KLQorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTmF0aXZlSGFuZGxlLmg+CiAKLSNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0lEZXNjcmFtYmxlci5oPgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci11c2luZyBuYW1lc3BhY2UgbWVkaWE7CiBjbGFzcyBCdWZmZXJDaGFubmVsQmFzZTsKIHN0cnVjdCBCdWZmZXJQcm9kdWNlcldyYXBwZXI7CiBjbGFzcyBNZWRpYUNvZGVjQnVmZmVyOwogc3RydWN0IFBlcnNpc3RlbnRTdXJmYWNlOwogc3RydWN0IFJlbmRlcmVkRnJhbWVJbmZvOwogY2xhc3MgU3VyZmFjZTsKK3N0cnVjdCBJQ3J5cHRvOworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBjYXMgeworbmFtZXNwYWNlIG5hdGl2ZSB7CituYW1lc3BhY2UgVjFfMCB7CitzdHJ1Y3QgSURlc2NyYW1ibGVyOworfX19fQordXNpbmcgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpJRGVzY3JhbWJsZXI7CiAKIHN0cnVjdCBDb2RlY0Jhc2UgOiBwdWJsaWMgQUhhbmRsZXIsIC8qIHN0YXRpYyAqLyBDb2xvclV0aWxzIHsKICAgICAvKioKQEAgLTIwOSwxMCArMjEzLDYgQEAKICAgICAvLyByZXF1aXJlIGFuIGV4cGxpY2l0IG1lc3NhZ2UgaGFuZGxlcgogICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeUNhcGFiaWxpdGllcygKLSAgICAgICAgICAgIGNvbnN0IEFTdHJpbmcmIC8qbmFtZSovLCBjb25zdCBBU3RyaW5nJiAvKm1pbWUqLywgYm9vbCAvKmlzRW5jb2RlciovLAotICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4qIC8qY2FwcyovIC8qIG5vbm51bGwgKi8pIHsgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyB9Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIC8qc3VyZmFjZSovKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfQogCiAgICAgdmlydHVhbCB2b2lkIHNpZ25hbEZsdXNoKCkgPSAwOwpAQCAtMjU2LDEzICsyNTYsOSBAQAogICAgICAgICBtQ2FsbGJhY2sgPSBzdGQ6Om1vdmUoY2FsbGJhY2spOwogICAgIH0KIAotICAgIGlubGluZSB2b2lkIHNldENyeXB0byhjb25zdCBzcDxJQ3J5cHRvPiAmY3J5cHRvKSB7Ci0gICAgICAgIG1DcnlwdG8gPSBjcnlwdG87Ci0gICAgfQorICAgIHZvaWQgc2V0Q3J5cHRvKGNvbnN0IHNwPElDcnlwdG8+ICZjcnlwdG8pOwogCi0gICAgaW5saW5lIHZvaWQgc2V0RGVzY3JhbWJsZXIoY29uc3Qgc3A8SURlc2NyYW1ibGVyPiAmZGVzY3JhbWJsZXIpIHsKLSAgICAgICAgbURlc2NyYW1ibGVyID0gZGVzY3JhbWJsZXI7Ci0gICAgfQorICAgIHZvaWQgc2V0RGVzY3JhbWJsZXIoY29uc3Qgc3A8SURlc2NyYW1ibGVyPiAmZGVzY3JhbWJsZXIpOwogCiAgICAgLyoqCiAgICAgICogUXVldWUgYW4gaW5wdXQgYnVmZmVyIGludG8gdGhlIGJ1ZmZlciBjaGFubmVsLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oCmluZGV4IDI3MGM4MDkuLjdhYzliMzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmgKQEAgLTQ5LDE0ICs0OSwxNyBAQAogICAgICAgICAgICAgICAgIHZvaWQgKmJpdHMsCiAgICAgICAgICAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LAogICAgICAgICAgICAgICAgIHNpemVfdCBjcm9wTGVmdCwgc2l6ZV90IGNyb3BUb3AsCi0gICAgICAgICAgICAgICAgc2l6ZV90IGNyb3BSaWdodCwgc2l6ZV90IGNyb3BCb3R0b20pOworICAgICAgICAgICAgICAgIHNpemVfdCBjcm9wUmlnaHQsIHNpemVfdCBjcm9wQm90dG9tLAorICAgICAgICAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRnJvbWF0KTsKIAogICAgICAgICBzaXplX3QgY3JvcFdpZHRoKCkgY29uc3Q7CiAgICAgICAgIHNpemVfdCBjcm9wSGVpZ2h0KCkgY29uc3Q7CiAKICAgICAgICAgdm9pZCAqbUJpdHM7CisgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIG1Db2xvckZvcm1hdDsKICAgICAgICAgc2l6ZV90IG1XaWR0aCwgbUhlaWdodDsKICAgICAgICAgc2l6ZV90IG1Dcm9wTGVmdCwgbUNyb3BUb3AsIG1Dcm9wUmlnaHQsIG1Dcm9wQm90dG9tOworICAgICAgICBzaXplX3QgbUJwcCwgbVN0cmlkZTsKICAgICB9OwogCiAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgbVNyY0Zvcm1hdCwgbURzdEZvcm1hdDsKQEAgLTgyLDYgKzg1LDEwIEBACiAgICAgc3RhdHVzX3QgY29udmVydFRJWVVWNDIwUGFja2VkU2VtaVBsYW5hcigKICAgICAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCk7CiAKKyAgICB2b2lkIHdyaXRlVG9Ec3Qodm9pZCAqZHN0X3B0ciwgdWludDhfdCAqa0FkanVzdGVkQ2xpcCwgYm9vbCB1bmNyb3BwZWQsCisgICAgICAgICAgICBzaWduZWQgcjEsIHNpZ25lZCBnMSwgc2lnbmVkIGIxLAorICAgICAgICAgICAgc2lnbmVkIHIyLCBzaWduZWQgZzIsIHNpZ25lZCBiMik7CisKICAgICBDb2xvckNvbnZlcnRlcihjb25zdCBDb2xvckNvbnZlcnRlciAmKTsKICAgICBDb2xvckNvbnZlcnRlciAmb3BlcmF0b3I9KGNvbnN0IENvbG9yQ29udmVydGVyICYpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKaW5kZXggNjNlY2NlYS4uYmQ4NjNiYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKQEAgLTczLDYgKzczLDExIEBACiAgICAgYm9vbCBnZXRVSW50MzIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KTsKICAgICBib29sIGdldFVJbnQ2NChvZmY2NF90IG9mZnNldCwgdWludDY0X3QgKngpOwogCisgICAgLy8gcmVhZCBlaXRoZXIgaW50PE4+IG9yIGludDwyTj4gaW50byBhIHVpbnQ8Mk4+X3QsIHNpemUgaXMgdGhlIGludCBzaXplIGluIGJ5dGVzLgorICAgIGJvb2wgZ2V0VUludDE2VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCwgc2l6ZV90IHNpemUpOworICAgIGJvb2wgZ2V0VUludDMyVmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCwgc2l6ZV90IHNpemUpOworICAgIGJvb2wgZ2V0VUludDY0VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCwgc2l6ZV90IHNpemUpOworCiAgICAgLy8gUmVhZHMgaW4gImNvdW50IiBlbnRyaWVzIG9mIHR5cGUgVCBpbnRvIHZlY3RvciAqeC4KICAgICAvLyBSZXR1cm5zIHRydWUgaWYgImNvdW50IiBlbnRyaWVzIGNhbiBiZSByZWFkLgogICAgIC8vIElmIGZld2VyIHRoYW4gImNvdW50IiBlbnRyaWVzIGNhbiBiZSByZWFkLCByZXR1cm4gZmFsc2UuIEluIHRoaXMgY2FzZSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZyYW1lUmVuZGVyVHJhY2tlci5oCmluZGV4IDA0NDY5OWMuLmMxNDc1NWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9GcmFtZVJlbmRlclRyYWNrZXIuaApAQCAtMjMsNiArMjMsOCBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKyNpbmNsdWRlIDx1aS9GZW5jZS5oPgorI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KIAogI2luY2x1ZGUgPGxpc3Q+CiAKQEAgLTMwLDkgKzMyLDYgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBGZW5jZTsKLWNsYXNzIEdyYXBoaWNCdWZmZXI7Ci0KIC8vIFRyYWNrcyB0aGUgcmVuZGVyIGluZm9ybWF0aW9uIGFib3V0IGEgZnJhbWUuIEZyYW1lcyBnbyB0aHJvdWdoIHNldmVyYWwgc3RhdGVzIHdoaWxlCiAvLyB0aGUgcmVuZGVyIGluZm9ybWF0aW9uIGlzIHRyYWNrZWQ6CiAvLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oCmluZGV4IGRkMzU3Y2MuLjFjN2I0YTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmgKQEAgLTIwNCw3ICsyMDQsMTAgQEAKICAgICB2b2lkIGxvY2soKTsKICAgICB2b2lkIHVubG9jaygpOwogCi0gICAgdm9pZCBpbml0SW50ZXJuYWwoaW50IGZkKTsKKyAgICAvLyBJbml0IGFsbCB0aGUgaW50ZXJuYWwgdmFyaWFibGVzIGZvciBlYWNoIHJlY29yZGluZyBzZXNzaW9uLiBTb21lIHZhcmlhYmxlcworICAgIC8vIHdpbGwgb25seSBuZWVkIHRvIGJlIHNldCBmb3IgdGhlIGZpcnN0IHJlY29yZGluZyBzZXNzaW9uIGFuZCB0aGV5IHdpbGwgc3RheQorICAgIC8vIHRoZSBzYW1lIGFjcm9zcyBhbGwgdGhlIHJlY29yZGluZyBzZXNzaW9ucy4KKyAgICB2b2lkIGluaXRJbnRlcm5hbChpbnQgZmQsIGJvb2wgaXNGaXJzdFNlc3Npb24pOwogCiAgICAgLy8gQWNxdWlyZSBsb2NrIGJlZm9yZSBjYWxsaW5nIHRoZXNlIG1ldGhvZHMKICAgICBvZmY2NF90IGFkZFNhbXBsZV9sKE1lZGlhQnVmZmVyICpidWZmZXIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaAppbmRleCA0MTQwMjY2Li4xMDMwNDA3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaApAQCAtNDcsMTAgKzQ3LDEzIEBACiBzdHJ1Y3QgUGVyc2lzdGVudFN1cmZhY2U7CiBjbGFzcyBTb2Z0d2FyZVJlbmRlcmVyOwogY2xhc3MgU3VyZmFjZTsKLW5hbWVzcGFjZSBtZWRpYSB7Ci1jbGFzcyBJRGVzY3JhbWJsZXI7Ci19OwotdXNpbmcgbmFtZXNwYWNlIG1lZGlhOworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBjYXMgeworbmFtZXNwYWNlIG5hdGl2ZSB7CituYW1lc3BhY2UgVjFfMCB7CitzdHJ1Y3QgSURlc2NyYW1ibGVyOworfX19fQordXNpbmcgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpJRGVzY3JhbWJsZXI7CiAKIHN0cnVjdCBNZWRpYUNvZGVjIDogcHVibGljIEFIYW5kbGVyIHsKICAgICBlbnVtIENvbmZpZ3VyZUZsYWdzIHsKQEAgLTg0LDExICs4Nyw2IEBACiAKICAgICBzdGF0aWMgc3A8UGVyc2lzdGVudFN1cmZhY2U+IENyZWF0ZVBlcnNpc3RlbnRJbnB1dFN1cmZhY2UoKTsKIAotICAgIC8vIHV0aWxpdHkgbWV0aG9kIHRvIHF1ZXJ5IGNhcGFiaWxpdGllcwotICAgIHN0YXRpYyBzdGF0dXNfdCBRdWVyeUNhcGFiaWxpdGllcygKLSAgICAgICAgICAgIGNvbnN0IEFTdHJpbmcgJm5hbWUsIGNvbnN0IEFTdHJpbmcgJm1pbWUsIGJvb2wgaXNFbmNvZGVyLAotICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gKmNhcHMgLyogbm9ubnVsbCAqLyk7Ci0KICAgICBzdGF0dXNfdCBjb25maWd1cmUoCiAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKICAgICAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZuYXRpdmVXaW5kb3csCkBAIC0zMTYsNiArMzE0LDggQEAKICAgICBTb2Z0d2FyZVJlbmRlcmVyICptU29mdFJlbmRlcmVyOwogCiAgICAgTWVkaWFBbmFseXRpY3NJdGVtICptQW5hbHl0aWNzSXRlbTsKKyAgICB2b2lkIGluaXRBbmFseXRpY3NJdGVtKCk7CisgICAgdm9pZCBmbHVzaEFuYWx5dGljc0l0ZW0oKTsKIAogICAgIHNwPEFNZXNzYWdlPiBtT3V0cHV0Rm9ybWF0OwogICAgIHNwPEFNZXNzYWdlPiBtSW5wdXRGb3JtYXQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmgKaW5kZXggNDMwYmMxNi4uZjJiZDQ5NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaApAQCAtMjEsNyArMjEsNiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY0xpc3QuaD4KLSNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0luZm8uaD4KIAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpAQCAtMzYsNiArMzUsOCBAQAogCiBzdHJ1Y3QgQU1lc3NhZ2U7CiAKK3N0cnVjdCBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlOworCiBzdHJ1Y3QgTWVkaWFDb2RlY0xpc3QgOiBwdWJsaWMgQm5NZWRpYUNvZGVjTGlzdCB7CiAgICAgc3RhdGljIHNwPElNZWRpYUNvZGVjTGlzdD4gZ2V0SW5zdGFuY2UoKTsKIApAQCAtNTEsNyArNTIsNyBAQAogICAgICAgICAgICAgQUxPR0UoImIvMjQ0NDUxMjciKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQ29kZWNJbmZvcy5pdGVtQXQoaW5kZXgpOworICAgICAgICByZXR1cm4gbUNvZGVjSW5mb3NbaW5kZXhdOwogICAgIH0KIAogICAgIHZpcnR1YWwgY29uc3Qgc3A8QU1lc3NhZ2U+IGdldEdsb2JhbFNldHRpbmdzKCkgY29uc3Q7CkBAIC02Miw5ICs2Myw2IEBACiAgICAgLy8gb25seSB0byBiZSB1c2VkIGJ5IGdldExvY2FsSW5zdGFuY2UKICAgICBzdGF0aWMgdm9pZCAqcHJvZmlsZXJUaHJlYWRXcmFwcGVyKHZvaWQgKiAvKmFyZyovKTsKIAotICAgIC8vIG9ubHkgdG8gYmUgdXNlZCBieSBNZWRpYVBsYXllclNlcnZpY2UKLSAgICB2b2lkIHBhcnNlVG9wTGV2ZWxYTUxGaWxlKGNvbnN0IGNoYXIgKnBhdGgsIGJvb2wgaWdub3JlX2Vycm9ycyA9IGZhbHNlKTsKLQogICAgIGVudW0gRmxhZ3MgewogICAgICAgICBrUHJlZmVyU29mdHdhcmVDb2RlY3MgICA9IDEsCiAgICAgICAgIGtIYXJkd2FyZUNvZGVjc09ubHkgICAgID0gMiwKQEAgLTc0LDEzICs3MiwxMSBAQAogICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZSwKICAgICAgICAgICAgIGJvb2wgY3JlYXRlRW5jb2RlciwKICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAotICAgICAgICAgICAgVmVjdG9yPEFTdHJpbmc+ICptYXRjaGluZyk7Ci0KLSAgICBzdGF0aWMgdWludDMyX3QgZ2V0UXVpcmtzRm9yKGNvbnN0IGNoYXIgKm1Db21wb25lbnROYW1lKTsKKyAgICAgICAgICAgIFZlY3RvcjxBU3RyaW5nPiAqbWF0Y2hpbmdDb2RlY3MsCisgICAgICAgICAgICBWZWN0b3I8QVN0cmluZz4gKm93bmVycyA9IG51bGxwdHIpOwogCiAgICAgc3RhdGljIGJvb2wgaXNTb2Z0d2FyZUNvZGVjKGNvbnN0IEFTdHJpbmcgJmNvbXBvbmVudE5hbWUpOwogCi0KIHByaXZhdGU6CiAgICAgY2xhc3MgQmluZGVyRGVhdGhPYnNlcnZlciA6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7CiAgICAgICAgIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmdGhlX2xhdGVfd2hvIF9fdW51c2VkKTsKQEAgLTg4LDY0ICs4NCw4NiBAQAogCiAgICAgc3RhdGljIHNwPEJpbmRlckRlYXRoT2JzZXJ2ZXI+IHNCaW5kZXJEZWF0aE9ic2VydmVyOwogCi0gICAgZW51bSBTZWN0aW9uIHsKLSAgICAgICAgU0VDVElPTl9UT1BMRVZFTCwKLSAgICAgICAgU0VDVElPTl9TRVRUSU5HUywKLSAgICAgICAgU0VDVElPTl9ERUNPREVSUywKLSAgICAgICAgU0VDVElPTl9ERUNPREVSLAotICAgICAgICBTRUNUSU9OX0RFQ09ERVJfVFlQRSwKLSAgICAgICAgU0VDVElPTl9FTkNPREVSUywKLSAgICAgICAgU0VDVElPTl9FTkNPREVSLAotICAgICAgICBTRUNUSU9OX0VOQ09ERVJfVFlQRSwKLSAgICAgICAgU0VDVElPTl9JTkNMVURFLAotICAgIH07Ci0KICAgICBzdGF0aWMgc3A8SU1lZGlhQ29kZWNMaXN0PiBzQ29kZWNMaXN0OwogICAgIHN0YXRpYyBzcDxJTWVkaWFDb2RlY0xpc3Q+IHNSZW1vdGVMaXN0OwogCiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKLSAgICBTZWN0aW9uIG1DdXJyZW50U2VjdGlvbjsKLSAgICBib29sIG1VcGRhdGU7Ci0gICAgVmVjdG9yPFNlY3Rpb24+IG1QYXN0U2VjdGlvbnM7Ci0gICAgaW50MzJfdCBtRGVwdGg7Ci0gICAgQVN0cmluZyBtSHJlZkJhc2U7CiAKICAgICBzcDxBTWVzc2FnZT4gbUdsb2JhbFNldHRpbmdzOwotICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIENvZGVjU2V0dGluZ3M+IG1PdmVycmlkZXM7CisgICAgc3RkOjp2ZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+ID4gbUNvZGVjSW5mb3M7CiAKLSAgICBWZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+ID4gbUNvZGVjSW5mb3M7Ci0gICAgc3A8TWVkaWFDb2RlY0luZm8+IG1DdXJyZW50SW5mbzsKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIHdpbGwgY2FsbCBgYnVpbGRNZWRpYUNvZGVjTGlzdCgpYCBmcm9tIHRoZSBnaXZlbgorICAgICAqIGBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlYCBvYmplY3QuCisgICAgICovCisgICAgTWVkaWFDb2RlY0xpc3QoTWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZSogYnVpbGRlcik7CiAKLSAgICBNZWRpYUNvZGVjTGlzdCgpOwogICAgIH5NZWRpYUNvZGVjTGlzdCgpOwogCiAgICAgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7Ci0gICAgdm9pZCBwYXJzZVhNTEZpbGUoY29uc3QgY2hhciAqcGF0aCk7CiAKLSAgICBzdGF0aWMgdm9pZCBTdGFydEVsZW1lbnRIYW5kbGVyV3JhcHBlcigKLSAgICAgICAgICAgIHZvaWQgKm1lLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cnMpOworICAgIE1lZGlhQ29kZWNMaXN0KGNvbnN0IE1lZGlhQ29kZWNMaXN0JikgPSBkZWxldGU7CisgICAgTWVkaWFDb2RlY0xpc3QmIG9wZXJhdG9yPShjb25zdCBNZWRpYUNvZGVjTGlzdCYpID0gZGVsZXRlOwogCi0gICAgc3RhdGljIHZvaWQgRW5kRWxlbWVudEhhbmRsZXJXcmFwcGVyKHZvaWQgKm1lLCBjb25zdCBjaGFyICpuYW1lKTsKKyAgICBmcmllbmQgTWVkaWFDb2RlY0xpc3RXcml0ZXI7Cit9OwogCi0gICAgdm9pZCBzdGFydEVsZW1lbnRIYW5kbGVyKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiphdHRycyk7Ci0gICAgdm9pZCBlbmRFbGVtZW50SGFuZGxlcihjb25zdCBjaGFyICpuYW1lKTsKKy8qKgorICogVGhpcyBjbGFzcyBpcyB0byBiZSB1c2VkIGJ5IGEgYE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2VgIGluc3RhbmNlIHRvIGFkZAorICogaW5mb3JtYXRpb24gdG8gdGhlIGFzc29jaWF0ZWQgYE1lZGlhQ29kZWNMaXN0YCBvYmplY3QuCisgKi8KK3N0cnVjdCBNZWRpYUNvZGVjTGlzdFdyaXRlciB7CisgICAgLyoqCisgICAgICogQWRkIGEga2V5LXZhbHVlIHBhaXIgdG8gYSBgTWVkaWFDb2RlY0xpc3RgJ3MgZ2xvYmFsIHNldHRpbmdzLgorICAgICAqCisgICAgICogQHBhcmFtIGtleSBLZXkuCisgICAgICogQHBhcmFtIHZhbHVlIFZhbHVlLgorICAgICAqLworICAgIHZvaWQgYWRkR2xvYmFsU2V0dGluZyhjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gYWRkIGEgbmV3IGBNZWRpYUNvZGVjSW5mb2Agb2JqZWN0IHRvIGEgYE1lZGlhQ29kZWNMaXN0YCwgYW5kCisgICAgICogcmV0dXJuIGEgYE1lZGlhQ29kZWNJbmZvV3JpdGVyYCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXdseSBhZGRlZAorICAgICAqIGBNZWRpYUNvZGVjSW5mb2AuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBgTWVkaWFDb2RlY0luZm9Xcml0ZXJgIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIG5ld2x5CisgICAgICogYWRkZWQgYE1lZGlhQ29kZWNJbmZvYCBvYmplY3QuCisgICAgICovCisgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvV3JpdGVyPiBhZGRNZWRpYUNvZGVjSW5mbygpOworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBUaGUgYXNzb2NpYXRlZCBgTWVkaWFDb2RlY0xpc3RgIG9iamVjdC4KKyAgICAgKi8KKyAgICBNZWRpYUNvZGVjTGlzdCogbUxpc3Q7CiAKLSAgICBzdGF0dXNfdCBpbmNsdWRlWE1MRmlsZShjb25zdCBjaGFyICoqYXR0cnMpOwotICAgIHN0YXR1c190IGFkZFNldHRpbmdGcm9tQXR0cmlidXRlcyhjb25zdCBjaGFyICoqYXR0cnMpOwotICAgIHN0YXR1c190IGFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlcyhib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKiphdHRycyk7Ci0gICAgdm9pZCBhZGRNZWRpYUNvZGVjKGJvb2wgZW5jb2RlciwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdHlwZSA9IE5VTEwpOworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCB0aGlzIHdyaXRlciBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBgTWVkaWFDb2RlY0xpc3RgCisgICAgICogb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3QgVGhlICJiYXNlIiBgTWVkaWFDb2RlY0xpc3RgIG9iamVjdC4KKyAgICAgKi8KKyAgICBNZWRpYUNvZGVjTGlzdFdyaXRlcihNZWRpYUNvZGVjTGlzdCogbGlzdCk7CiAKLSAgICB2b2lkIHNldEN1cnJlbnRDb2RlY0luZm8oYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp0eXBlKTsKKyAgICBmcmllbmQgTWVkaWFDb2RlY0xpc3Q7Cit9OwogCi0gICAgc3RhdHVzX3QgYWRkUXVpcmsoY29uc3QgY2hhciAqKmF0dHJzKTsKLSAgICBzdGF0dXNfdCBhZGRUeXBlRnJvbUF0dHJpYnV0ZXMoY29uc3QgY2hhciAqKmF0dHJzKTsKLSAgICBzdGF0dXNfdCBhZGRMaW1pdChjb25zdCBjaGFyICoqYXR0cnMpOwotICAgIHN0YXR1c190IGFkZEZlYXR1cmUoY29uc3QgY2hhciAqKmF0dHJzKTsKLSAgICB2b2lkIGFkZFR5cGUoY29uc3QgY2hhciAqbmFtZSk7CisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIHRvIGJlIHVzZWQgYnkgYE1lZGlhQ29kZWNMaXN0YCB0byBmaWxsIGl0cyBtZW1iZXJzIHdpdGgKKyAqIGFwcHJvcHJpYXRlIGluZm9ybWF0aW9uLiBgYnVpbGRNZWRpYUNvZGVjTGlzdCgpYCB3aWxsIGJlIGNhbGxlZCBmcm9tIGEKKyAqIGBNZWRpYUNvZGVjTGlzdGAgb2JqZWN0IGR1cmluZyBpdHMgY29uc3RydWN0aW9uLgorICovCitzdHJ1Y3QgTWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZSB7CisgICAgLyoqCisgICAgICogQnVpbGQgdGhlIGBNZWRpYUNvZGVjTGlzdGAgdmlhIHRoZSBnaXZlbiBgTWVkaWFDb2RlY0xpc3RXcml0ZXJgIGludGVyZmFjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cml0ZXIgVGhlIHdyaXRlciBpbnRlcmZhY2UuCisgICAgICogQHJldHVybiBUaGUgc3RhdHVzIG9mIHRoZSBjb25zdHJ1Y3Rpb24uIGBOT19FUlJPUmAgbWVhbnMgc3VjY2Vzcy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGJ1aWxkTWVkaWFDb2RlY0xpc3QoTWVkaWFDb2RlY0xpc3RXcml0ZXIqIHdyaXRlcikgPSAwOwogCi0gICAgc3RhdHVzX3QgaW5pdGlhbGl6ZUNhcGFiaWxpdGllcyhjb25zdCBjaGFyICp0eXBlKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lZGlhQ29kZWNMaXN0KTsKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBkZXN0cnVjdG9yIGRvZXMgbm90aGluZy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIH5NZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlKCk7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oCmluZGV4IDJlNjYzZWMuLjZhNWM2YjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmgKQEAgLTc5LDYgKzc5LDI2IEBACiAgICAgSEVBUlRCRUFUX0VSUk9SX0JBU0UgPSAtMzAwMCwKICAgICBFUlJPUl9IRUFSVEJFQVRfVEVSTUlOQVRFX1JFUVVFU1RFRCAgICAgICAgICAgICAgICAgICAgID0gSEVBUlRCRUFUX0VSUk9SX0JBU0UsCiAKKyAgICAvLyBDQVMtcmVsYXRlZCBlcnJvciBjb2RlcworICAgIENBU19FUlJPUl9CQVNFID0gLTQwMDAsCisKKyAgICBFUlJPUl9DQVNfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UsCisgICAgRVJST1JfQ0FTX05PX0xJQ0VOU0UgICAgICAgICAgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFIC0gMSwKKyAgICBFUlJPUl9DQVNfTElDRU5TRV9FWFBJUkVEICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSAyLAorICAgIEVSUk9SX0NBU19TRVNTSU9OX05PVF9PUEVORUQgICAgICAgICAgICAgPSBDQVNfRVJST1JfQkFTRSAtIDMsCisgICAgRVJST1JfQ0FTX0RFQ1JZUFRfVU5JVF9OT1RfSU5JVElBTElaRUQgICA9IENBU19FUlJPUl9CQVNFIC0gNCwKKyAgICBFUlJPUl9DQVNfREVDUllQVCAgICAgICAgICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSA1LAorICAgIEVSUk9SX0NBU19DQU5OT1RfSEFORExFICAgICAgICAgICAgICAgICAgPSBDQVNfRVJST1JfQkFTRSAtIDYsCisgICAgRVJST1JfQ0FTX1RBTVBFUl9ERVRFQ1RFRCAgICAgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFIC0gNywKKyAgICBFUlJPUl9DQVNfTk9UX1BST1ZJU0lPTkVEICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSA4LAorICAgIEVSUk9SX0NBU19ERVZJQ0VfUkVWT0tFRCAgICAgICAgICAgICAgICAgPSBDQVNfRVJST1JfQkFTRSAtIDksCisgICAgRVJST1JfQ0FTX1JFU09VUkNFX0JVU1kgICAgICAgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFIC0gMTAsCisgICAgRVJST1JfQ0FTX0lOU1VGRklDSUVOVF9PVVRQVVRfUFJPVEVDVElPTiA9IENBU19FUlJPUl9CQVNFIC0gMTEsCisgICAgRVJST1JfQ0FTX0xBU1RfVVNFRF9FUlJPUkNPREUgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFIC0gMTEsCisKKyAgICBFUlJPUl9DQVNfVkVORE9SX01BWCAgICAgICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSA1MDAsCisgICAgRVJST1JfQ0FTX1ZFTkRPUl9NSU4gICAgICAgICAgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFIC0gOTk5LAorCiAgICAgLy8gTkRLIEVycm9yIGNvZGVzCiAgICAgLy8gZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL25kay9OZGtNZWRpYUVycm9yLmgKICAgICAvLyBmcm9tIC0xMDAwMCAoMHhGRkZGRDhGMCAtIDB4RkZGRkQ4RUMpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmgKaW5kZXggYTg1NmIyYi4uNmVjN2VhZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaApAQCAtMjMsMTAgKzIzLDYgQEAKICNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG1lZGlhIHsKLWNsYXNzIElDYXM7Ci19OwotdXNpbmcgbmFtZXNwYWNlIG1lZGlhOwogY2xhc3MgRGF0YVNvdXJjZTsKIHN0cnVjdCBNZWRpYVNvdXJjZTsKIGNsYXNzIE1ldGFEYXRhOwpAQCAtNzAsMTIgKzY2LDE0IEBACiAgICAgfQogICAgIHZpcnR1YWwgdm9pZCBzZXRVSUQodWlkX3QgLyp1aWQqLykgewogICAgIH0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHNwPElDYXM+JiAvKmNhcyovKSBvdmVycmlkZSB7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBISW50ZXJmYWNlVG9rZW4gJi8qY2FzVG9rZW4qLykgb3ZlcnJpZGUgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICI8dW5zcGVjaWZpZWQ+IjsgfQogCisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSB7fQorCiBwcm90ZWN0ZWQ6CiAgICAgTWVkaWFFeHRyYWN0b3IoKTsKICAgICB2aXJ0dWFsIH5NZWRpYUV4dHJhY3RvcigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCmluZGV4IDk2NzZiOTcuLjZjZmRlOWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKQEAgLTM4LDYgKzM4LDggQEAKICAgICBrS2V5RGlzcGxheUhlaWdodCAgICAgPSAnZEhndCcsICAvLyBpbnQzMl90LCBkaXNwbGF5L3ByZXNlbnRhdGlvbgogICAgIGtLZXlTQVJXaWR0aCAgICAgICAgICA9ICdzYXJXJywgIC8vIGludDMyX3QsIHNhbXBsZUFzcGVjdFJhdGlvIHdpZHRoCiAgICAga0tleVNBUkhlaWdodCAgICAgICAgID0gJ3NhckgnLCAgLy8gaW50MzJfdCwgc2FtcGxlQXNwZWN0UmF0aW8gaGVpZ2h0CisgICAga0tleVRodW1ibmFpbFdpZHRoICAgID0gJ3RoYlcnLCAgLy8gaW50MzJfdCwgdGh1bWJuYWlsIHdpZHRoCisgICAga0tleVRodW1ibmFpbEhlaWdodCAgID0gJ3RoYkgnLCAgLy8gaW50MzJfdCwgdGh1bWJuYWlsIGhlaWdodAogCiAgICAgLy8gYSByZWN0YW5nbGUsIGlmIGFic2VudCBhc3N1bWVkIHRvIGJlICgwLCAwLCB3aWR0aCAtIDEsIGhlaWdodCAtIDEpCiAgICAga0tleUNyb3BSZWN0ICAgICAgICAgID0gJ2Nyb3AnLApAQCAtNTgsNiArNjAsNyBAQAogICAgIGtLZXlBQUNQcm9maWxlICAgICAgICA9ICdhYWNwJywgIC8vIGludDMyX3QKICAgICBrS2V5QVZDQyAgICAgICAgICAgICAgPSAnYXZjYycsICAvLyByYXcgZGF0YQogICAgIGtLZXlIVkNDICAgICAgICAgICAgICA9ICdodmNjJywgIC8vIHJhdyBkYXRhCisgICAga0tleVRodW1ibmFpbEhWQ0MgICAgID0gJ3RodmMnLCAgLy8gcmF3IGRhdGEKICAgICBrS2V5RDI2MyAgICAgICAgICAgICAgPSAnZDI2MycsICAvLyByYXcgZGF0YQogICAgIGtLZXlWb3JiaXNJbmZvICAgICAgICA9ICd2aW5mJywgIC8vIHJhdyBkYXRhCiAgICAga0tleVZvcmJpc0Jvb2tzICAgICAgID0gJ3Zib28nLCAgLy8gcmF3IGRhdGEKQEAgLTIwOSw2ICsyMTIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sb3IgTWF0cml4LCB2YWx1ZSBkZWZpbmVkIGJ5IENvbG9yQXNwZWN0cy5NYXRyaXhDb2VmZnMuCiAgICAga0tleVRlbXBvcmFsTGF5ZXJJZCAgPSAnaUx5cicsIC8vIGludDMyX3QsIHRlbXBvcmFsIGxheWVyLWlkLiAwLWJhc2VkICgwID0+IGJhc2UgbGF5ZXIpCiAgICAga0tleVRlbXBvcmFsTGF5ZXJDb3VudCA9ICdjTHlyJywgLy8gaW50MzJfdCwgbnVtYmVyIG9mIHRlbXBvcmFsIGxheWVycyBlbmNvZGVkCisKKyAgICBrS2V5R3JpZFdpZHRoICAgICAgICA9ICdncmRXJywgLy8gaW50MzJfdCwgSEVJRiBncmlkIHdpZHRoCisgICAga0tleUdyaWRIZWlnaHQgICAgICAgPSAnZ3JkSCcsIC8vIGludDMyX3QsIEhFSUYgZ3JpZCBoZWlnaHQKKyAgICBrS2V5SWNjUHJvZmlsZSAgICAgICA9ICdwcm9mJywgLy8gcmF3IGRhdGEsIElDQyBwcmlmaWxlIGRhdGEKIH07CiAKIGVudW0gewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaAppbmRleCAzZTNjYzE3Li42YTkzYmQ1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaApAQCAtMjgsMTAgKzI4LDYgQEAKICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG1lZGlhIHsKLWNsYXNzIElDYXM7Ci19Ci11c2luZyBuYW1lc3BhY2UgbWVkaWE7CiAKIHN0cnVjdCBBQnVmZmVyOwogc3RydWN0IEFNZXNzYWdlOwpAQCAtNjQsNyArNjAsNyBAQAogCiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YXNvdXJjZSk7CiAKLSAgICBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBzcDxJQ2FzPiAmY2FzKTsKKyAgICBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBISW50ZXJmYWNlVG9rZW4gJmNhc1Rva2VuKTsKIAogICAgIHNpemVfdCBjb3VudFRyYWNrcygpIGNvbnN0OwogICAgIHN0YXR1c190IGdldFRyYWNrRm9ybWF0KHNpemVfdCBpbmRleCwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQsIHVpbnQzMl90IGZsYWdzID0gMCkgY29uc3Q7CkBAIC0xMTUsNyArMTExLDcgQEAKICAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKIAogICAgIHNwPElNZWRpYUV4dHJhY3Rvcj4gbUltcGw7Ci0gICAgc3A8SUNhcz4gbUNhczsKKyAgICBISW50ZXJmYWNlVG9rZW4gbUNhc1Rva2VuOwogCiAgICAgVmVjdG9yPFRyYWNrSW5mbz4gbVNlbGVjdGVkVHJhY2tzOwogICAgIGludDY0X3QgbVRvdGFsQml0cmF0ZTsgIC8vIGluIGJpdHMvc2VjCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaAppbmRleCAyMDNhMTgxLi4yZjE1OWIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50LmgKQEAgLTI4LDkgKzI4LDEwIEBACiAKICAgICBzdGF0dXNfdCBjb25uZWN0KCk7CiAgICAgc3RhdHVzX3QgY29ubmVjdChib29sKiB0cmVibGVGbGFnKTsKKyAgICBzdGF0dXNfdCBjb25uZWN0KGNvbnN0IGNoYXIqIG5hbWUsIGJvb2wqIHRyZWJsZUZsYWcgPSBudWxscHRyKTsKIAogICAgIHN0YXR1c190IGNvbm5lY3RMZWdhY3koKTsKLSAgICBzdGF0dXNfdCBjb25uZWN0VHJlYmxlKCk7CisgICAgc3RhdHVzX3QgY29ubmVjdFRyZWJsZShjb25zdCBjaGFyKiBuYW1lID0gImRlZmF1bHQiKTsKICAgICB2b2lkIGRpc2Nvbm5lY3QoKTsKIAogICAgIHNwPElPTVg+IGludGVyZmFjZSgpIHsKQEAgLTQwLDggKzQxLDggQEAKIHByaXZhdGU6CiAgICAgc3A8SU9NWD4gbU9NWDsKIAotICAgIE9NWENsaWVudChjb25zdCBPTVhDbGllbnQgJik7Ci0gICAgT01YQ2xpZW50ICZvcGVyYXRvcj0oY29uc3QgT01YQ2xpZW50ICYpOworICAgIE9NWENsaWVudChjb25zdCBPTVhDbGllbnQgJikgPSBkZWxldGU7CisgICAgT01YQ2xpZW50ICZvcGVyYXRvcj0oY29uc3QgT01YQ2xpZW50ICYpID0gZGVsZXRlOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSURlc2NyYW1ibGVyLmFpZGwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmgKc2ltaWxhcml0eSBpbmRleCA2MiUKcmVuYW1lIGZyb20gZHJtL2xpYm1lZGlhZHJtL2FpZGwvYW5kcm9pZC9tZWRpYS9JRGVzY3JhbWJsZXIuYWlkbApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5oCmluZGV4IGZkZjk5ZWIuLjFiNGQ4NzMgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9haWRsL2FuZHJvaWQvbWVkaWEvSURlc2NyYW1ibGVyLmFpZGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5oCkBAIC0xNCwxNCArMTQsMjAgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKyNpZm5kZWYgT01YX0lORk9fQlVJTERFUl9IXworI2RlZmluZSBPTVhfSU5GT19CVUlMREVSX0hfCiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRGVzY3JhbWJsZXI7CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KIAotLyoqIEBoaWRlICovCi1pbnRlcmZhY2UgSURlc2NyYW1ibGVyIHsKLSAgICB2b2lkIHNldE1lZGlhQ2FzU2Vzc2lvbihpbiBieXRlW10gc2Vzc2lvbklkKTsKLSAgICBib29sZWFuIHJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChTdHJpbmcgbWltZSk7Ci0gICAgaW50IGRlc2NyYW1ibGUoaW4gTWVkaWFEZXNjcmFtYmxlci5EZXNjcmFtYmxlSW5mbyBkZXNjcmFtYmxlSW5mbyk7Ci0gICAgdm9pZCByZWxlYXNlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBPbXhJbmZvQnVpbGRlciA6IHB1YmxpYyBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlIHsKK3B1YmxpYzoKKyAgICBPbXhJbmZvQnVpbGRlcigpOworICAgIHN0YXR1c190IGJ1aWxkTWVkaWFDb2RlY0xpc3QoTWVkaWFDb2RlY0xpc3RXcml0ZXIqIHdyaXRlcikgb3ZlcnJpZGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE9NWF9JTkZPX0JVSUxERVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5oCmluZGV4IGQzOGMzMzcuLmQxNjc3ZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuaApAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KIAotI2luY2x1ZGUgPE1ldGFkYXRhQnVmZmVyVHlwZS5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgogCiAjaW5jbHVkZSAiZm91bmRhdGlvbi9BQmFzZS5oIgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmgKaW5kZXggODhhNDE2YS4uNzdjYmQ0YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaApAQCAtOTUsNyArOTUsNyBAQAogdm9pZCByZWFkRnJvbUFNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBCdWZmZXJpbmdTZXR0aW5ncyAqYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pOwogCiBBU3RyaW5nIG5hbWVGb3JGZChpbnQgZmQpOwotCit2b2lkIE1ha2VGb3VyQ0NTdHJpbmcodWludDMyX3QgeCwgY2hhciAqcyk7CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIFVUSUxTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKaW5kZXggMzFlZGIyMS4uYTI1NmE0ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcApAQCAtMjMsOCArMjMsOCBAQAogI2luY2x1ZGUgIkVTUXVldWUuaCIKICNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgogCi0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JRGVzY3JhbWJsZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvbmF0aXZlLzEuMC9JRGVzY3JhbWJsZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC00MSw4ICs0MSwxMiBAQAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLXVzaW5nIGJpbmRlcjo6U3RhdHVzOwotdXNpbmcgTWVkaWFEZXNjcmFtYmxlcjo6RGVzY3JhbWJsZUluZm87Cit1c2luZyBoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhczo6VjFfMDsKK3VzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA7CiAKIC8vIEkgd2FudCB0aGUgZXhwcmVzc2lvbiAieSIgZXZhbHVhdGVkIGV2ZW4gaWYgdmVyYm9zZSBsb2dnaW5nIGlzIG9mZi4KICNkZWZpbmUgTVlfTE9HVih4LCB5KSBcCkBAIC0yMDMsNiArMjA3LDcgQEAKICAgICBzcDxBTWVzc2FnZT4gbVNhbXBsZUFlc0tleUl0ZW07CiAgICAgc3A8SU1lbW9yeT4gbU1lbTsKICAgICBzcDxNZW1vcnlEZWFsZXI+IG1EZWFsZXI7CisgICAgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpTaGFyZWRCdWZmZXIgbURlc2NyYW1ibGVyU3JjQnVmZmVyOwogICAgIHNwPEFCdWZmZXI+IG1EZXNjcmFtYmxlZEJ1ZmZlcjsKICAgICBMaXN0PFN1YlNhbXBsZUluZm8+IG1TdWJTYW1wbGVzOwogICAgIHNwPElEZXNjcmFtYmxlcj4gbURlc2NyYW1ibGVyOwpAQCAtMjM1LDcgKzI0MCw3IEBACiAKICAgICAvLyBFbnN1cmUgaW50ZXJuYWwgYnVmZmVycyBjYW4gaG9sZCBzcGVjaWZpZWQgc2l6ZSwgYW5kIHdpbGwgcmUtYWxsb2NhdGUKICAgICAvLyBhcyBuZWVkZWQuCi0gICAgdm9pZCBlbnN1cmVCdWZmZXJDYXBhY2l0eShzaXplX3Qgc2l6ZSk7CisgICAgYm9vbCBlbnN1cmVCdWZmZXJDYXBhY2l0eShzaXplX3Qgc2l6ZSk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTdHJlYW0pOwogfTsKQEAgLTgwNyw5ICs4MTIsOSBAQAogICAgIG1RdWV1ZSA9IE5VTEw7CiB9CiAKLXZvaWQgQVRTUGFyc2VyOjpTdHJlYW06OmVuc3VyZUJ1ZmZlckNhcGFjaXR5KHNpemVfdCBuZWVkZWRTaXplKSB7Citib29sIEFUU1BhcnNlcjo6U3RyZWFtOjplbnN1cmVCdWZmZXJDYXBhY2l0eShzaXplX3QgbmVlZGVkU2l6ZSkgewogICAgIGlmIChtQnVmZmVyICE9IE5VTEwgJiYgbUJ1ZmZlci0+Y2FwYWNpdHkoKSA+PSBuZWVkZWRTaXplKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgQUxPR1YoImVuc3VyZUJ1ZmZlckNhcGFjaXR5OiBjdXJyZW50IHNpemUgJXp1LCBuZXcgc2l6ZSAlenUsIHNjcmFtYmxlZCAlZCIsCkBAIC04MzcsNiArODQyLDI2IEBACiAgICAgICAgIG1NZW0gPSBuZXdNZW07CiAgICAgICAgIG1EZWFsZXIgPSBuZXdEZWFsZXI7CiAgICAgICAgIG1EZXNjcmFtYmxlZEJ1ZmZlciA9IG5ld1NjcmFtYmxlZEJ1ZmZlcjsKKworICAgICAgICBzc2l6ZV90IG9mZnNldDsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gbmV3TWVtLT5nZXRNZW1vcnkoJm9mZnNldCwgJnNpemUpOworICAgICAgICBpZiAoaGVhcCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBuYXRpdmVIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICAgICAgaWYgKCFuYXRpdmVIYW5kbGUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJbc3RyZWFtICVkXSBmYWlsZWQgdG8gY3JlYXRlIG5hdGl2ZSBoYW5kbGUiLCBtRWxlbWVudGFyeVBJRCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbmF0aXZlSGFuZGxlLT5kYXRhWzBdID0gaGVhcC0+Z2V0SGVhcElEKCk7CisgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5oZWFwQmFzZSA9IGhpZGxfbWVtb3J5KCJhc2htZW0iLAorICAgICAgICAgICAgICAgIGhpZGxfaGFuZGxlKG5hdGl2ZUhhbmRsZSksIGhlYXAtPmdldFNpemUoKSk7CisgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5vZmZzZXQgPSAodWludDY0X3QpIG9mZnNldDsKKyAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLnNpemUgPSAodWludDY0X3QpIHNpemU7CisKKyAgICAgICAgQUxPR0QoIltzdHJlYW0gJWRdIGNyZWF0ZWQgc2hhcmVkIGJ1ZmZlciBmb3IgZGVzY3JhbWJsaW5nLCBvZmZzZXQgJXpkLCBzaXplICV6dSIsCisgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIG9mZnNldCwgc2l6ZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gQWxpZ24gdG8gbXVsdGlwbGVzIG9mIDY0Sy4KICAgICAgICAgbmVlZGVkU2l6ZSA9IChuZWVkZWRTaXplICsgNjU1MzUpICYgfjY1NTM1OwpAQCAtODUwLDYgKzg3NSw3IEBACiAgICAgICAgIG5ld0J1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CiAgICAgfQogICAgIG1CdWZmZXIgPSBuZXdCdWZmZXI7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHN0YXR1c190IEFUU1BhcnNlcjo6U3RyZWFtOjpwYXJzZSgKQEAgLTkyMyw3ICs5NDksOSBAQAogICAgIH0KIAogICAgIHNpemVfdCBuZWVkZWRTaXplID0gbUJ1ZmZlci0+c2l6ZSgpICsgcGF5bG9hZFNpemVCaXRzIC8gODsKLSAgICBlbnN1cmVCdWZmZXJDYXBhY2l0eShuZWVkZWRTaXplKTsKKyAgICBpZiAoIWVuc3VyZUJ1ZmZlckNhcGFjaXR5KG5lZWRlZFNpemUpKSB7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQogCiAgICAgbWVtY3B5KG1CdWZmZXItPmRhdGEoKSArIG1CdWZmZXItPnNpemUoKSwgYnItPmRhdGEoKSwgcGF5bG9hZFNpemVCaXRzIC8gOCk7CiAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpICsgcGF5bG9hZFNpemVCaXRzIC8gOCk7CkBAIC0xMzY1LDQ3ICsxMzkzLDU5IEBACiAgICAgICAgIG1lbWNweShtRGVzY3JhbWJsZWRCdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpLCBkZXNjcmFtYmxlQnl0ZXMpOwogICAgICAgICBtRGVzY3JhbWJsZWRCdWZmZXItPnNldFJhbmdlKDAsIGRlc2NyYW1ibGVCeXRlcyk7CiAKLSAgICAgICAgc3A8QUJ1ZmZlcj4gc3ViU2FtcGxlcyA9IG5ldyBBQnVmZmVyKAotICAgICAgICAgICAgICAgIHNpemVvZihEZXNjcmFtYmxlclBsdWdpbjo6U3ViU2FtcGxlKSAqIGRlc2NyYW1ibGVTdWJTYW1wbGVzKTsKLQotICAgICAgICBEZXNjcmFtYmxlSW5mbyBpbmZvOwotICAgICAgICBpbmZvLmRzdFR5cGUgPSBEZXNjcmFtYmxlSW5mbzo6a0Rlc3RpbmF0aW9uVHlwZVZtUG9pbnRlcjsKLSAgICAgICAgaW5mby5zY3JhbWJsaW5nQ29udHJvbCA9IChEZXNjcmFtYmxlclBsdWdpbjo6U2NyYW1ibGluZ0NvbnRyb2wpc2N0cmw7Ci0gICAgICAgIGluZm8ubnVtU3ViU2FtcGxlcyA9IGRlc2NyYW1ibGVTdWJTYW1wbGVzOwotICAgICAgICBpbmZvLnN1YlNhbXBsZXMgPSAoRGVzY3JhbWJsZXJQbHVnaW46OlN1YlNhbXBsZSAqKXN1YlNhbXBsZXMtPmRhdGEoKTsKLSAgICAgICAgaW5mby5zcmNNZW0gPSBtTWVtOwotICAgICAgICBpbmZvLnNyY09mZnNldCA9IDA7Ci0gICAgICAgIGluZm8uZHN0UHRyID0gTlVMTDsgLy8gaW4tcGxhY2UgZGVzY3JhbWJsaW5nIGludG8gc3JjTWVtCi0gICAgICAgIGluZm8uZHN0T2Zmc2V0ID0gMDsKKyAgICAgICAgaGlkbF92ZWM8U3ViU2FtcGxlPiBzdWJTYW1wbGVzOworICAgICAgICBzdWJTYW1wbGVzLnJlc2l6ZShkZXNjcmFtYmxlU3ViU2FtcGxlcyk7CiAKICAgICAgICAgaW50MzJfdCBpID0gMDsKICAgICAgICAgZm9yIChhdXRvIGl0ID0gbVN1YlNhbXBsZXMuYmVnaW4oKTsKICAgICAgICAgICAgICAgICBpdCAhPSBtU3ViU2FtcGxlcy5lbmQoKSAmJiBpIDwgZGVzY3JhbWJsZVN1YlNhbXBsZXM7IGl0KyssIGkrKykgewogICAgICAgICAgICAgaWYgKGl0LT50cmFuc3BvcnRfc2NyYW1ibGluZ19tb2RlICE9IDAgfHwgcGVzU2NyYW1ibGluZ0NvbnRyb2wgIT0gMCkgewotICAgICAgICAgICAgICAgIGluZm8uc3ViU2FtcGxlc1tpXS5tTnVtQnl0ZXNPZkNsZWFyRGF0YSA9IDA7Ci0gICAgICAgICAgICAgICAgaW5mby5zdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mRW5jcnlwdGVkRGF0YSA9IGl0LT5zdWJTYW1wbGVTaXplOworICAgICAgICAgICAgICAgIHN1YlNhbXBsZXNbaV0ubnVtQnl0ZXNPZkNsZWFyRGF0YSA9IDA7CisgICAgICAgICAgICAgICAgc3ViU2FtcGxlc1tpXS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YSA9IGl0LT5zdWJTYW1wbGVTaXplOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbmZvLnN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZDbGVhckRhdGEgPSBpdC0+c3ViU2FtcGxlU2l6ZTsKLSAgICAgICAgICAgICAgICBpbmZvLnN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhID0gMDsKKyAgICAgICAgICAgICAgICBzdWJTYW1wbGVzW2ldLm51bUJ5dGVzT2ZDbGVhckRhdGEgPSBpdC0+c3ViU2FtcGxlU2l6ZTsKKyAgICAgICAgICAgICAgICBzdWJTYW1wbGVzW2ldLm51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhID0gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIHVpbnQ2NF90IHNyY09mZnNldCA9IDAsIGRzdE9mZnNldCA9IDA7CiAgICAgICAgIC8vIElmIHNjcmFtYmxlZCBhdCBQRVMtbGV2ZWwsIFBFUyBoZWFkZXIgc2hvdWxkIGJlIHNraXBwZWQKICAgICAgICAgaWYgKHBlc1NjcmFtYmxpbmdDb250cm9sICE9IDApIHsKLSAgICAgICAgICAgIGluZm8uc3JjT2Zmc2V0ID0gaW5mby5kc3RPZmZzZXQgPSBwZXNPZmZzZXQ7Ci0gICAgICAgICAgICBpbmZvLnN1YlNhbXBsZXNbMF0ubU51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhIC09IHBlc09mZnNldDsKKyAgICAgICAgICAgIHNyY09mZnNldCA9IGRzdE9mZnNldCA9IHBlc09mZnNldDsKKyAgICAgICAgICAgIHN1YlNhbXBsZXNbMF0ubnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEgLT0gcGVzT2Zmc2V0OwogICAgICAgICB9CiAKLSAgICAgICAgaW50MzJfdCByZXN1bHQ7Ci0gICAgICAgIFN0YXR1cyBzdGF0dXMgPSBtRGVzY3JhbWJsZXItPmRlc2NyYW1ibGUoaW5mbywgJnJlc3VsdCk7CisgICAgICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6Ok9LOworICAgICAgICB1aW50MzJfdCBieXRlc1dyaXR0ZW4gPSAwOworICAgICAgICBoaWRsX3N0cmluZyBkZXRhaWxlZEVycm9yOwogCi0gICAgICAgIGlmICghc3RhdHVzLmlzT2soKSkgewotICAgICAgICAgICAgQUxPR0UoIltzdHJlYW0gJWRdIGRlc2NyYW1ibGUgZmFpbGVkLCBleGNlcHRpb25Db2RlPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIHN0YXR1cy5leGNlcHRpb25Db2RlKCkpOworICAgICAgICBEZXN0aW5hdGlvbkJ1ZmZlciBkc3RCdWZmZXI7CisgICAgICAgIGRzdEJ1ZmZlci50eXBlID0gQnVmZmVyVHlwZTo6U0hBUkVEX01FTU9SWTsKKyAgICAgICAgZHN0QnVmZmVyLm5vbnNlY3VyZU1lbW9yeSA9IG1EZXNjcmFtYmxlclNyY0J1ZmZlcjsKKworICAgICAgICBhdXRvIHJldHVyblZvaWQgPSBtRGVzY3JhbWJsZXItPmRlc2NyYW1ibGUoCisgICAgICAgICAgICAgICAgKFNjcmFtYmxpbmdDb250cm9sKSBzY3RybCwKKyAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlciwKKyAgICAgICAgICAgICAgICBzcmNPZmZzZXQsCisgICAgICAgICAgICAgICAgZHN0QnVmZmVyLAorICAgICAgICAgICAgICAgIGRzdE9mZnNldCwKKyAgICAgICAgICAgICAgICBbJnN0YXR1cywgJmJ5dGVzV3JpdHRlbiwgJmRldGFpbGVkRXJyb3JdICgKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBfc3RhdHVzLCB1aW50MzJfdCBfYnl0ZXNXcml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIF9kZXRhaWxlZEVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IF9zdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IF9ieXRlc1dyaXR0ZW47CisgICAgICAgICAgICAgICAgICAgIGRldGFpbGVkRXJyb3IgPSBfZGV0YWlsZWRFcnJvcjsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBpZiAoIXJldHVyblZvaWQuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gZGVzY3JhbWJsZSBmYWlsZWQsIHRyYW5zPSVzIiwKKyAgICAgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIHJldHVyblZvaWQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICB9CiAKICAgICAgICAgQUxPR1YoIltzdHJlYW0gJWRdIGRlc2NyYW1ibGUgc3VjY2VlZGVkLCAlZCBieXRlcyIsCi0gICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIGJ5dGVzV3JpdHRlbik7CiAgICAgICAgIG1lbWNweShtQnVmZmVyLT5kYXRhKCksIG1EZXNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpLCBkZXNjcmFtYmxlQnl0ZXMpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKaW5kZXggMzc0ZTAxMS4uNDFjMTljZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCkBAIC0yOSwxMSArMjksMTMgQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBtZWRpYSB7Ci1jbGFzcyBJQ2FzOwotY2xhc3MgSURlc2NyYW1ibGVyOwotfTsKLXVzaW5nIG5hbWVzcGFjZSBtZWRpYTsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgY2FzIHsKK25hbWVzcGFjZSBWMV8wIHsKK3N0cnVjdCBJQ2FzOworfX19Cit1c2luZyBoYXJkd2FyZTo6Y2FzOjpWMV8wOjpJQ2FzOworCiBjbGFzcyBBQml0UmVhZGVyOwogc3RydWN0IEFCdWZmZXI7CiBzdHJ1Y3QgQW5vdGhlclBhY2tldFNvdXJjZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icAppbmRleCA5NmViNWJmLi4yMTI1OWM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwCkBAIC0zNSw1ICszNSw4IEBACiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmNyeXB0byIsCiAgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzLm5hdGl2ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAogICAgIF0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Nhc01hbmFnZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9DYXNNYW5hZ2VyLmNwcAppbmRleCAwNDdiMWIzLi45ZmY0NTIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Nhc01hbmFnZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQ2FzTWFuYWdlci5jcHAKQEAgLTE4LDE1ICsxOCwxOSBAQAogI2RlZmluZSBMT0dfVEFHICJDYXNNYW5hZ2VyIgogI2luY2x1ZGUgIkNhc01hbmFnZXIuaCIKIAotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSUNhcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSURlc2NyYW1ibGVyLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JTWVkaWFDYXNTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzLzEuMC9JQ2FzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvMS4wL0lNZWRpYUNhc1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy9uYXRpdmUvMS4wL0lEZXNjcmFtYmxlci5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotdXNpbmcgYmluZGVyOjpTdGF0dXM7CisKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIGhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhczo6VjFfMDsKK3VzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA7CiAKIHN0cnVjdCBBVFNQYXJzZXI6OkNhc01hbmFnZXI6OlByb2dyYW1DYXNNYW5hZ2VyIDogcHVibGljIFJlZkJhc2UgewogICAgIFByb2dyYW1DYXNNYW5hZ2VyKHVuc2lnbmVkIHByb2dyYW1OdW1iZXIsIGNvbnN0IENBRGVzY3JpcHRvciAmZGVzY3JpcHRvcik7CkBAIC0xMjUsNDUgKzEyOSw2MCBAQAogICAgICAgICAgY29uc3Qgc3A8SUNhcz4mIGNhcywKICAgICAgICAgIFBpZFRvU2Vzc2lvbk1hcCAmc2Vzc2lvbk1hcCwKICAgICAgICAgIENhc1Nlc3Npb24gKnNlc3Npb24pIHsKLSAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7Ci0gICAgc3A8SUJpbmRlcj4gY2FzU2VydmljZUJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5jYXMiKSk7Ci0gICAgc3A8SU1lZGlhQ2FzU2VydmljZT4gY2FzU2VydmljZSA9Ci0gICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJTWVkaWFDYXNTZXJ2aWNlPihjYXNTZXJ2aWNlQmluZGVyKTsKLQorICAgIHNwPElNZWRpYUNhc1NlcnZpY2U+IGNhc1NlcnZpY2UgPSBJTWVkaWFDYXNTZXJ2aWNlOjpnZXRTZXJ2aWNlKCJkZWZhdWx0Iik7CiAgICAgaWYgKGNhc1NlcnZpY2UgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiQ2Fubm90IG9idGFpbiBJTWVkaWFDYXNTZXJ2aWNlIik7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KIAorICAgIFN0YXR1cyBzdGF0dXM7CiAgICAgc3A8SURlc2NyYW1ibGVyPiBkZXNjcmFtYmxlcjsKKyAgICBzcDxJRGVzY3JhbWJsZXJCYXNlPiBkZXNjcmFtYmxlckJhc2U7CisgICAgUmV0dXJuPFN0YXR1cz4gcmV0dXJuU3RhdHVzKFN0YXR1czo6T0spOworICAgIFJldHVybjxzcDxJRGVzY3JhbWJsZXJCYXNlPiA+IHJldHVybkRlc2NyYW1ibGVyKE5VTEwpOwogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZDsKICAgICBjb25zdCBDQURlc2NyaXB0b3IgJmRlc2NyaXB0b3IgPSBzZXNzaW9uLT5tQ0FEZXNjcmlwdG9yOwogCi0gICAgU3RhdHVzIHN0YXR1cyA9IGNhcy0+b3BlblNlc3Npb24oJnNlc3Npb25JZCk7Ci0gICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb3BlbiBzZXNzaW9uOiBleGNlcHRpb249JWQsIGVycm9yPSVkIiwKLSAgICAgICAgICAgICAgICBzdGF0dXMuZXhjZXB0aW9uQ29kZSgpLCBzdGF0dXMuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkpOworICAgIGF1dG8gcmV0dXJuVm9pZCA9IGNhcy0+b3BlblNlc3Npb24oCisgICAgICAgICAgICBbJnN0YXR1cywgJnNlc3Npb25JZF0gKFN0YXR1cyBfc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgX3Nlc3Npb25JZCkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IF9zdGF0dXM7CisgICAgICAgICAgICAgICAgc2Vzc2lvbklkID0gX3Nlc3Npb25JZDsKKyAgICAgICAgICAgIH0pOworICAgIGlmICghcmV0dXJuVm9pZC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvcGVuIHNlc3Npb246IHRyYW5zPSVzLCBzdGF0dXM9JWQiLAorICAgICAgICAgICAgICAgIHJldHVyblZvaWQuZGVzY3JpcHRpb24oKS5jX3N0cigpLCBzdGF0dXMpOwogICAgICAgICBnb3RvIGxfZmFpbDsKICAgICB9CiAKLSAgICBjYXMtPnNldFNlc3Npb25Qcml2YXRlRGF0YShzZXNzaW9uSWQsIGRlc2NyaXB0b3IubVByaXZhdGVEYXRhKTsKLSAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgcHJpdmF0ZSBkYXRhOiBleGNlcHRpb249JWQsIGVycm9yPSVkIiwKLSAgICAgICAgICAgICAgICBzdGF0dXMuZXhjZXB0aW9uQ29kZSgpLCBzdGF0dXMuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkpOworICAgIHJldHVyblN0YXR1cyA9IGNhcy0+c2V0U2Vzc2lvblByaXZhdGVEYXRhKHNlc3Npb25JZCwgZGVzY3JpcHRvci5tUHJpdmF0ZURhdGEpOworICAgIGlmICghcmV0dXJuU3RhdHVzLmlzT2soKSB8fCByZXR1cm5TdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBwcml2YXRlIGRhdGE6IHRyYW5zPSVzLCBzdGF0dXM9JWQiLAorICAgICAgICAgICAgICAgIHJldHVyblN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCksIChTdGF0dXMpcmV0dXJuU3RhdHVzKTsKICAgICAgICAgZ290byBsX2ZhaWw7CiAgICAgfQogCi0gICAgc3RhdHVzID0gY2FzU2VydmljZS0+Y3JlYXRlRGVzY3JhbWJsZXIoZGVzY3JpcHRvci5tU3lzdGVtSUQsICZkZXNjcmFtYmxlcik7Ci0gICAgaWYgKCFzdGF0dXMuaXNPaygpIHx8IGRlc2NyYW1ibGVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgZGVzY3JhbWJsZXI6IDogZXhjZXB0aW9uPSVkLCBlcnJvcj0lZCIsCi0gICAgICAgICAgICAgICAgc3RhdHVzLmV4Y2VwdGlvbkNvZGUoKSwgc3RhdHVzLnNlcnZpY2VTcGVjaWZpY0Vycm9yQ29kZSgpKTsKKyAgICByZXR1cm5EZXNjcmFtYmxlciA9IGNhc1NlcnZpY2UtPmNyZWF0ZURlc2NyYW1ibGVyKGRlc2NyaXB0b3IubVN5c3RlbUlEKTsKKyAgICBpZiAoIXJldHVybkRlc2NyYW1ibGVyLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBkZXNjcmFtYmxlcjogdHJhbnM9JXMiLAorICAgICAgICAgICAgICAgIHJldHVybkRlc2NyYW1ibGVyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIGdvdG8gbF9mYWlsOworICAgIH0KKyAgICBkZXNjcmFtYmxlckJhc2UgPSAoc3A8SURlc2NyYW1ibGVyQmFzZT4pIHJldHVybkRlc2NyYW1ibGVyOworICAgIGlmIChkZXNjcmFtYmxlckJhc2UgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBkZXNjcmFtYmxlcjogbnVsbCBwdHIiKTsKICAgICAgICAgZ290byBsX2ZhaWw7CiAgICAgfQogCi0gICAgc3RhdHVzID0gZGVzY3JhbWJsZXItPnNldE1lZGlhQ2FzU2Vzc2lvbihzZXNzaW9uSWQpOwotICAgIGlmICghc3RhdHVzLmlzT2soKSkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXQgZGVzY3JhbWJsZXI6IDogZXhjZXB0aW9uPSVkLCBlcnJvcj0lZCIsCi0gICAgICAgICAgICAgICAgc3RhdHVzLmV4Y2VwdGlvbkNvZGUoKSwgc3RhdHVzLnNlcnZpY2VTcGVjaWZpY0Vycm9yQ29kZSgpKTsKKyAgICByZXR1cm5TdGF0dXMgPSBkZXNjcmFtYmxlckJhc2UtPnNldE1lZGlhQ2FzU2Vzc2lvbihzZXNzaW9uSWQpOworICAgIGlmICghcmV0dXJuU3RhdHVzLmlzT2soKSB8fCAoU3RhdHVzKSByZXR1cm5TdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXQgZGVzY3JhbWJsZXI6IDogdHJhbnM9JXMsIHN0YXR1cz0lZCIsCisgICAgICAgICAgICAgICAgcmV0dXJuU3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSwgKFN0YXR1cykgcmV0dXJuU3RhdHVzKTsKKyAgICAgICAgZ290byBsX2ZhaWw7CisgICAgfQorCisgICAgZGVzY3JhbWJsZXIgPSBJRGVzY3JhbWJsZXI6OmNhc3RGcm9tKGRlc2NyYW1ibGVyQmFzZSk7CisgICAgaWYgKGRlc2NyYW1ibGVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjYXN0IGZyb20gSURlc2NyYW1ibGVyQmFzZSB0byBJRGVzY3JhbWJsZXIiKTsKICAgICAgICAgZ290byBsX2ZhaWw7CiAgICAgfQogCkBAIC0xNzcsOCArMTk2LDggQEAKICAgICBpZiAoIXNlc3Npb25JZC5lbXB0eSgpKSB7CiAgICAgICAgIGNhcy0+Y2xvc2VTZXNzaW9uKHNlc3Npb25JZCk7CiAgICAgfQotICAgIGlmIChkZXNjcmFtYmxlciAhPSBOVUxMKSB7Ci0gICAgICAgIGRlc2NyYW1ibGVyLT5yZWxlYXNlKCk7CisgICAgaWYgKGRlc2NyYW1ibGVyQmFzZSAhPSBOVUxMKSB7CisgICAgICAgIGRlc2NyYW1ibGVyQmFzZS0+cmVsZWFzZSgpOwogICAgIH0KICAgICByZXR1cm4gTk9fSU5JVDsKIH0KQEAgLTMxNiwxMSArMzM1LDEyIEBACiAgICAgaWYgKGluZGV4IDwgMCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIE1lZGlhQ2FzOjpQYXJjZWxhYmxlQ2FzRGF0YSBlY20oYnItPmRhdGEoKSwgYnItPm51bUJpdHNMZWZ0KCkgLyA4KTsKLSAgICBTdGF0dXMgc3RhdHVzID0gbUlDYXMtPnByb2Nlc3NFY20obUNBUGlkVG9TZXNzaW9uSWRNYXBbaW5kZXhdLCBlY20pOwotICAgIGlmICghc3RhdHVzLmlzT2soKSkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHByb2Nlc3MgRUNNOiBleGNlcHRpb249JWQsIGVycm9yPSVkIiwKLSAgICAgICAgICAgICAgICBzdGF0dXMuZXhjZXB0aW9uQ29kZSgpLCBzdGF0dXMuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkpOworICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IGVjbTsKKyAgICBlY20uc2V0VG9FeHRlcm5hbCgodWludDhfdCopYnItPmRhdGEoKSwgYnItPm51bUJpdHNMZWZ0KCkgLyA4KTsKKyAgICBhdXRvIHJldHVyblN0YXR1cyA9IG1JQ2FzLT5wcm9jZXNzRWNtKG1DQVBpZFRvU2Vzc2lvbklkTWFwW2luZGV4XSwgZWNtKTsKKyAgICBpZiAoIXJldHVyblN0YXR1cy5pc09rKCkgfHwgKFN0YXR1cykgcmV0dXJuU3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBwcm9jZXNzIEVDTTogdHJhbnM9JXMsIHN0YXR1cz0lZCIsCisgICAgICAgICAgICAgICAgcmV0dXJuU3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSwgKFN0YXR1cykgcmV0dXJuU3RhdHVzKTsKICAgICB9CiAgICAgcmV0dXJuIHRydWU7IC8vIGhhbmRsZWQKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQ2FzTWFuYWdlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9DYXNNYW5hZ2VyLmgKaW5kZXggODA4OGRlYy4uODFmNjU0NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9DYXNNYW5hZ2VyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9DYXNNYW5hZ2VyLmgKQEAgLTIxLDEwICsyMSwxMyBAQAogI2luY2x1ZGUgPHNldD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG1lZGlhIHsKLWNsYXNzIElDYXM7Ci1jbGFzcyBJRGVzY3JhbWJsZXI7Ci19CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGNhcyB7CituYW1lc3BhY2UgbmF0aXZlIHsKK25hbWVzcGFjZSBWMV8wIHsKK3N0cnVjdCBJRGVzY3JhbWJsZXI7Cit9fX19Cit1c2luZyBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA6OklEZXNjcmFtYmxlcjsKIAogc3RydWN0IEFUU1BhcnNlcjo6Q2FzTWFuYWdlciA6IHB1YmxpYyBSZWZCYXNlIHsKICAgICBDYXNNYW5hZ2VyKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyVFNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlRTRXh0cmFjdG9yLmNwcAppbmRleCBjM2YxMjc0Li45ZDY4NGUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyVFNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJUU0V4dHJhY3Rvci5jcHAKQEAgLTM4LDggKzM4LDEzIEBACiAjaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgogI2luY2x1ZGUgIkFUU1BhcnNlci5oIgogCisjaW5jbHVkZSA8aGlkbC9IeWJyaWRJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy8xLjAvSUNhcy5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3VzaW5nIGhhcmR3YXJlOjpjYXM6OlYxXzA6OklDYXM7CisKIHN0YXRpYyBjb25zdCBzaXplX3Qga1RTUGFja2V0U2l6ZSA9IDE4ODsKIHN0YXRpYyBjb25zdCBpbnQga01heER1cmF0aW9uUmVhZFNpemUgPSAyNTAwMDBMTDsKIHN0YXRpYyBjb25zdCBpbnQga01heER1cmF0aW9uUmV0cnkgPSA2OwpAQCAtMTU2LDcgKzE2MSwxMCBAQAogICAgICAgICAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQsIG1pbWUpKTsKIH0KIAotc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6c2V0TWVkaWFDYXMoY29uc3Qgc3A8SUNhcz4gJmNhcykgeworc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6c2V0TWVkaWFDYXMoY29uc3QgSEludGVyZmFjZVRva2VuICZjYXNUb2tlbikgeworICAgIEhhbFRva2VuIGhhbFRva2VuOworICAgIGhhbFRva2VuLnNldFRvRXh0ZXJuYWwoKHVpbnQ4X3QqKWNhc1Rva2VuLmRhdGEoKSwgY2FzVG9rZW4uc2l6ZSgpKTsKKyAgICBzcDxJQ2FzPiBjYXMgPSBJQ2FzOjpjYXN0RnJvbShyZXRyaWV2ZUhhbEludGVyZmFjZShoYWxUb2tlbikpOwogICAgIEFMT0dEKCJzZXRNZWRpYUNhczogJXAiLCBjYXMuZ2V0KCkpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gbVBhcnNlci0+c2V0TWVkaWFDYXMoY2FzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214LmNwcAppbmRleCA3ODkzNzlhLi5mZTUwNjU2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXguY3BwCkBAIC0xOSwyMCArMTksMTkgQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KLSNpbmNsdWRlIDxPTVhfQ29yZS5oPgotI2luY2x1ZGUgPE9NWF9Bc1N0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0NvcmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Bc1N0cmluZy5oPgogCi0jaW5jbHVkZSAiLi4vT01YVXRpbHMuaCIKLSNpbmNsdWRlICIuLi9PTVhNYXN0ZXIuaCIKLSNpbmNsdWRlICIuLi9HcmFwaGljQnVmZmVyU291cmNlLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmg+CiAKLSNpbmNsdWRlICJXT214Tm9kZS5oIgotI2luY2x1ZGUgIldPbXhPYnNlcnZlci5oIgotI2luY2x1ZGUgIldHcmFwaGljQnVmZmVyUHJvZHVjZXIuaCIKLSNpbmNsdWRlICJXR3JhcGhpY0J1ZmZlclNvdXJjZS5oIgotI2luY2x1ZGUgIkNvbnZlcnNpb24uaCIKLQotI2luY2x1ZGUgIk9teC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV09teE5vZGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhPYnNlcnZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewpAQCAtMTE1LDE1ICsxMTQsMjMgQEAKICAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgICAgIH0KICAgICAgICAgaW5zdGFuY2UtPnNldEhhbmRsZShoYW5kbGUpOwotICAgICAgICBzdGQ6OnZlY3RvcjxBU3RyaW5nPiBxdWlya1ZlY3RvcjsKLSAgICAgICAgaWYgKG1QYXJzZXIuZ2V0UXVpcmtzKG5hbWUuY19zdHIoKSwgJnF1aXJrVmVjdG9yKSA9PSBPSykgeworCisgICAgICAgIC8vIEZpbmQgcXVpcmtzIGZyb20gbVBhcnNlcgorICAgICAgICBjb25zdCBhdXRvJiBjb2RlYyA9IG1QYXJzZXIuZ2V0Q29kZWNNYXAoKS5maW5kKG5hbWUuY19zdHIoKSk7CisgICAgICAgIGlmIChjb2RlYyA9PSBtUGFyc2VyLmdldENvZGVjTWFwKCkuY2VuZCgpKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkZhaWxlZCB0byBvYnRhaW4gcXVpcmtzIGZvciBvbXggY29tcG9uZW50ICIKKyAgICAgICAgICAgICAgICAgICAgIiciIDw8IG5hbWUuY19zdHIoKSA8PCAiJyAiCisgICAgICAgICAgICAgICAgICAgICJmcm9tIFhNTCBmaWxlcyI7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB1aW50MzJfdCBxdWlya3MgPSAwOwotICAgICAgICAgICAgZm9yIChjb25zdCBBU3RyaW5nIHF1aXJrIDogcXVpcmtWZWN0b3IpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgcXVpcmsgOiBjb2RlYy0+c2Vjb25kLnF1aXJrU2V0KSB7CiAgICAgICAgICAgICAgICAgaWYgKHF1aXJrID09ICJyZXF1aXJlcy1hbGxvY2F0ZS1vbi1pbnB1dC1wb3J0cyIpIHsKLSAgICAgICAgICAgICAgICAgICAgcXVpcmtzIHw9IGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25JbnB1dFBvcnRzOworICAgICAgICAgICAgICAgICAgICBxdWlya3MgfD0gT01YTm9kZUluc3RhbmNlOjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uSW5wdXRQb3J0czsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKHF1aXJrID09ICJyZXF1aXJlcy1hbGxvY2F0ZS1vbi1vdXRwdXQtcG9ydHMiKSB7Ci0gICAgICAgICAgICAgICAgICAgIHF1aXJrcyB8PSBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uT3V0cHV0UG9ydHM7CisgICAgICAgICAgICAgICAgICAgIHF1aXJrcyB8PSBPTVhOb2RlSW5zdGFuY2U6OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25PdXRwdXRQb3J0czsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpbnN0YW5jZS0+c2V0UXVpcmtzKHF1aXJrcyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuY3BwCmluZGV4IDBlMzdhZjkuLjQ0N2FmNmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuY3BwCkBAIC0xOSw4ICsxOSw5IEBACiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogCi0jaW5jbHVkZSAiQ29udmVyc2lvbi5oIgotI2luY2x1ZGUgIk9teFN0b3JlLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewpAQCAtMjksMjQgKzMwLDg3IEBACiBuYW1lc3BhY2UgVjFfMCB7CiBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24gewogCi1PbXhTdG9yZTo6T214U3RvcmUoKSB7CitPbXhTdG9yZTo6T214U3RvcmUoCisgICAgICAgIGNvbnN0IGNoYXIqIG93bmVyLAorICAgICAgICBjb25zdCBjaGFyKiBjb25zdCogc2VhcmNoRGlycywKKyAgICAgICAgY29uc3QgY2hhciogbWFpblhtbE5hbWUsCisgICAgICAgIGNvbnN0IGNoYXIqIHBlcmZvcm1hbmNlWG1sTmFtZSwKKyAgICAgICAgY29uc3QgY2hhciogcHJvZmlsaW5nUmVzdWx0c1htbFBhdGgpIHsKKyAgICBNZWRpYUNvZGVjc1htbFBhcnNlciBwYXJzZXIoc2VhcmNoRGlycywKKyAgICAgICAgICAgIG1haW5YbWxOYW1lLAorICAgICAgICAgICAgcGVyZm9ybWFuY2VYbWxOYW1lLAorICAgICAgICAgICAgcHJvZmlsaW5nUmVzdWx0c1htbFBhdGgpOworICAgIG1QYXJzaW5nU3RhdHVzID0gdG9TdGF0dXMocGFyc2VyLmdldFBhcnNpbmdTdGF0dXMoKSk7CisKKyAgICBjb25zdCBhdXRvJiBzZXJ2aWNlQXR0cmlidXRlTWFwID0gcGFyc2VyLmdldFNlcnZpY2VBdHRyaWJ1dGVNYXAoKTsKKyAgICBtU2VydmljZUF0dHJpYnV0ZUxpc3QucmVzaXplKHNlcnZpY2VBdHRyaWJ1dGVNYXAuc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChjb25zdCBhdXRvJiBhdHRyaWJ1dGVQYWlyIDogc2VydmljZUF0dHJpYnV0ZU1hcCkgeworICAgICAgICBTZXJ2aWNlQXR0cmlidXRlIGF0dHJpYnV0ZTsKKyAgICAgICAgYXR0cmlidXRlLmtleSA9IGF0dHJpYnV0ZVBhaXIuZmlyc3Q7CisgICAgICAgIGF0dHJpYnV0ZS52YWx1ZSA9IGF0dHJpYnV0ZVBhaXIuc2Vjb25kOworICAgICAgICBtU2VydmljZUF0dHJpYnV0ZUxpc3RbaV0gPSBzdGQ6Om1vdmUoYXR0cmlidXRlKTsKKyAgICAgICAgKytpOworICAgIH0KKworICAgIGNvbnN0IGF1dG8mIHJvbGVNYXAgPSBwYXJzZXIuZ2V0Um9sZU1hcCgpOworICAgIG1Sb2xlTGlzdC5yZXNpemUocm9sZU1hcC5zaXplKCkpOworICAgIGkgPSAwOworICAgIGZvciAoY29uc3QgYXV0byYgcm9sZVBhaXIgOiByb2xlTWFwKSB7CisgICAgICAgIFJvbGVJbmZvIHJvbGU7CisgICAgICAgIHJvbGUucm9sZSA9IHJvbGVQYWlyLmZpcnN0OworICAgICAgICByb2xlLnR5cGUgPSByb2xlUGFpci5zZWNvbmQudHlwZTsKKyAgICAgICAgcm9sZS5pc0VuY29kZXIgPSByb2xlUGFpci5zZWNvbmQuaXNFbmNvZGVyOworICAgICAgICAvLyBUT0RPOiBDdXJyZW50bHksIHByZWZlclBsYXRmb3JtTm9kZXMgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSBpbgorICAgICAgICAvLyB0aGUgeG1sIGZpbGUuIE9uY2Ugd2UgaGF2ZSBhIHdheSB0byBwcm92aWRlIHRoaXMgaW5mb3JtYXRpb24sIGl0CisgICAgICAgIC8vIHNob3VsZCBiZSBwYXJzZWQgcHJvcGVybHkuCisgICAgICAgIHJvbGUucHJlZmVyUGxhdGZvcm1Ob2RlcyA9IHJvbGVQYWlyLmZpcnN0LmNvbXBhcmUoMCwgNSwgImF1ZGlvIikgPT0gMDsKKyAgICAgICAgaGlkbF92ZWM8Tm9kZUluZm8+JiBub2RlTGlzdCA9IHJvbGUubm9kZXM7CisgICAgICAgIG5vZGVMaXN0LnJlc2l6ZShyb2xlUGFpci5zZWNvbmQubm9kZUxpc3Quc2l6ZSgpKTsKKyAgICAgICAgc2l6ZV90IGogPSAwOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIG5vZGVQYWlyIDogcm9sZVBhaXIuc2Vjb25kLm5vZGVMaXN0KSB7CisgICAgICAgICAgICBOb2RlSW5mbyBub2RlOworICAgICAgICAgICAgbm9kZS5uYW1lID0gbm9kZVBhaXIuc2Vjb25kLm5hbWU7CisgICAgICAgICAgICBub2RlLm93bmVyID0gb3duZXI7CisgICAgICAgICAgICBoaWRsX3ZlYzxOb2RlQXR0cmlidXRlPiYgYXR0cmlidXRlTGlzdCA9IG5vZGUuYXR0cmlidXRlczsKKyAgICAgICAgICAgIGF0dHJpYnV0ZUxpc3QucmVzaXplKG5vZGVQYWlyLnNlY29uZC5hdHRyaWJ1dGVMaXN0LnNpemUoKSk7CisgICAgICAgICAgICBzaXplX3QgayA9IDA7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGF0dHJpYnV0ZVBhaXIgOiBub2RlUGFpci5zZWNvbmQuYXR0cmlidXRlTGlzdCkgeworICAgICAgICAgICAgICAgIE5vZGVBdHRyaWJ1dGUgYXR0cmlidXRlOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5rZXkgPSBhdHRyaWJ1dGVQYWlyLmZpcnN0OworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS52YWx1ZSA9IGF0dHJpYnV0ZVBhaXIuc2Vjb25kOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUxpc3Rba10gPSBzdGQ6Om1vdmUoYXR0cmlidXRlKTsKKyAgICAgICAgICAgICAgICArK2s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlTGlzdFtqXSA9IHN0ZDo6bW92ZShub2RlKTsKKyAgICAgICAgICAgICsrajsKKyAgICAgICAgfQorICAgICAgICBtUm9sZUxpc3RbaV0gPSBzdGQ6Om1vdmUocm9sZSk7CisgICAgICAgICsraTsKKyAgICB9CisKKyAgICBtUHJlZml4ID0gcGFyc2VyLmdldENvbW1vblByZWZpeCgpOwogfQogCiBPbXhTdG9yZTo6fk9teFN0b3JlKCkgewogfQogCiBSZXR1cm48dm9pZD4gT214U3RvcmU6Omxpc3RTZXJ2aWNlQXR0cmlidXRlcyhsaXN0U2VydmljZUF0dHJpYnV0ZXNfY2IgX2hpZGxfY2IpIHsKLSAgICBfaGlkbF9jYih0b1N0YXR1cyhOT19FUlJPUiksIGhpZGxfdmVjPFNlcnZpY2VBdHRyaWJ1dGU+KCkpOworICAgIGlmIChtUGFyc2luZ1N0YXR1cyA9PSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6Tk9fRVJST1IsIG1TZXJ2aWNlQXR0cmlidXRlTGlzdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX2hpZGxfY2IobVBhcnNpbmdTdGF0dXMsIGhpZGxfdmVjPFNlcnZpY2VBdHRyaWJ1dGU+KCkpOworICAgIH0KICAgICByZXR1cm4gVm9pZCgpOwogfQogCiBSZXR1cm48dm9pZD4gT214U3RvcmU6OmdldE5vZGVQcmVmaXgoZ2V0Tm9kZVByZWZpeF9jYiBfaGlkbF9jYikgewotICAgIF9oaWRsX2NiKGhpZGxfc3RyaW5nKCkpOworICAgIF9oaWRsX2NiKG1QcmVmaXgpOwogICAgIHJldHVybiBWb2lkKCk7CiB9CiAKIFJldHVybjx2b2lkPiBPbXhTdG9yZTo6bGlzdFJvbGVzKGxpc3RSb2xlc19jYiBfaGlkbF9jYikgewotICAgIF9oaWRsX2NiKGhpZGxfdmVjPFJvbGVJbmZvPigpKTsKKyAgICBfaGlkbF9jYihtUm9sZUxpc3QpOwogICAgIHJldHVybiBWb2lkKCk7CiB9CiAKQEAgLTU0LDEyICsxMTgsNiBAQAogICAgIHJldHVybiBJT214Ojp0cnlHZXRTZXJ2aWNlKG9teE5hbWUpOwogfQogCi0vLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZSBmb2xsb3cuCi0KLUlPbXhTdG9yZSogSElETF9GRVRDSF9JT214U3RvcmUoY29uc3QgY2hhciogLyogbmFtZSAqLykgewotICAgIHJldHVybiBuZXcgT214U3RvcmUoKTsKLX0KLQogfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCiB9ICAvLyBuYW1lc3BhY2UgVjFfMAogfSAgLy8gbmFtZXNwYWNlIG9teApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5jcHAKaW5kZXggYWNkYTA2MC4uYzQ0OTlkYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuY3BwCkBAIC0xOCw5ICsxOCw5IEBACiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogCi0jaW5jbHVkZSAiV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oIgotI2luY2x1ZGUgIldQcm9kdWNlckxpc3RlbmVyLmgiCi0jaW5jbHVkZSAiQ29udmVyc2lvbi5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV1Byb2R1Y2VyTGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaD4KICNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTQxLDcgKzQxLDkgQEAKICAgICBzcDxHcmFwaGljQnVmZmVyPiBidWY7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUJhc2UtPnJlcXVlc3RCdWZmZXIoc2xvdCwgJmJ1Zik7CiAgICAgQW53QnVmZmVyIGFud0J1ZmZlcjsKLSAgICB3cmFwQXMoJmFud0J1ZmZlciwgKmJ1Zik7CisgICAgaWYgKGJ1ZiAhPSBudWxscHRyKSB7CisgICAgICAgIHdyYXBBcygmYW53QnVmZmVyLCAqYnVmKTsKKyAgICB9CiAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwgYW53QnVmZmVyKTsKICAgICByZXR1cm4gVm9pZCgpOwogfQpAQCAtNjQsMTAgKzY2LDkgQEAKICAgICBzcDxGZW5jZT4gZmVuY2U7CiAgICAgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIG91dFRpbWVzdGFtcHM7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUJhc2UtPmRlcXVldWVCdWZmZXIoCi0gICAgICAgICAgICAmc2xvdCwgJmZlbmNlLAotICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PDo6YW5kcm9pZDo6UGl4ZWxGb3JtYXQ+KGZvcm1hdCksIHVzYWdlLAotICAgICAgICAgICAgZ2V0RnJhbWVUaW1lc3RhbXBzID8gJm91dFRpbWVzdGFtcHMgOiBudWxscHRyKTsKKyAgICAgICAgJnNsb3QsICZmZW5jZSwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgc3RhdGljX2Nhc3Q8OjphbmRyb2lkOjpQaXhlbEZvcm1hdD4oZm9ybWF0KSwgdXNhZ2UsIG51bGxwdHIsCisgICAgICAgIGdldEZyYW1lVGltZXN0YW1wcyA/ICZvdXRUaW1lc3RhbXBzIDogbnVsbHB0cik7CiAgICAgaGlkbF9oYW5kbGUgdEZlbmNlOwogICAgIEZyYW1lRXZlbnRIaXN0b3J5RGVsdGEgdE91dFRpbWVzdGFtcHM7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKaW5kZXggZDg1NDBmOC4uMzIwMWMzMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKQEAgLTE3LDE1ICsxNywxNCBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJUV0dyYXBoaWNCdWZmZXJTb3VyY2UiCiAKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XT214Tm9kZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214QnVmZmVyU291cmNlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXhOb2RlLmg+Ci0jaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgotI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgotCi0jaW5jbHVkZSAib214L09NWFV0aWxzLmgiCi0jaW5jbHVkZSAiV0dyYXBoaWNCdWZmZXJTb3VyY2UuaCIKLSNpbmNsdWRlICJXT214Tm9kZS5oIgotI2luY2x1ZGUgIkNvbnZlcnNpb24uaCIKKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Db21wb25lbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9JbmRleEV4dC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewpAQCAtNjgsNyArNjcsMTQgQEAKICAgICAgICAgdE1zZy5kYXRhLmV2ZW50RGF0YS5kYXRhMSA9IGRhdGFTcGFjZTsKICAgICAgICAgdE1zZy5kYXRhLmV2ZW50RGF0YS5kYXRhMiA9IGFzcGVjdHM7CiAgICAgICAgIHRNc2cuZGF0YS5ldmVudERhdGEuZGF0YTMgPSBwaXhlbEZvcm1hdDsKLSAgICAgICAgbU9teE5vZGUtPmRpc3BhdGNoTWVzc2FnZSh0TXNnKTsKKyAgICAgICAgaWYgKCFtT214Tm9kZS0+ZGlzcGF0Y2hNZXNzYWdlKHRNc2cpLmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoIlRXT214Tm9kZVdyYXBwZXIgZmFpbGVkIHRvIGRpc3BhdGNoIG1lc3NhZ2UgIgorICAgICAgICAgICAgICAgICAgICAiT01YX0V2ZW50RGF0YVNwYWNlQ2hhbmdlZDogIgorICAgICAgICAgICAgICAgICAgICAiZGF0YVNwYWNlID0gJWxkLCBhc3BlY3RzID0gJWxkLCBwaXhlbEZvcm1hdCA9ICVsZCIsCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmc+KGRhdGFTcGFjZSksCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmc+KGFzcGVjdHMpLAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nPihwaXhlbEZvcm1hdCkpOworICAgICAgICB9CiAgICAgfQogfTsKIApAQCAtMTQ0LDEwICsxNTAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG91dFBhcmFtcy5kYXRhKCkgKyBvdXRQYXJhbXMuc2l6ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zKTsKICAgICAgICAgICAgIH0pOwotICAgIG9teE5vZGUtPmdldFBhcmFtZXRlcigKKyAgICBhdXRvIHRyYW5zU3RhdHVzID0gb214Tm9kZS0+Z2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE9NWF9JbmRleFBhcmFtQ29uc3VtZXJVc2FnZUJpdHMpLAogICAgICAgICAgICAgaW5IaWRsQnl0ZXMoJmNvbnN1bWVyVXNhZ2UsIHNpemVvZihjb25zdW1lclVzYWdlKSksCiAgICAgICAgICAgICBfaGlkbF9jYik7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIHRvU3RhdHVzKEZBSUxFRF9UUkFOU0FDVElPTik7CisgICAgfQogICAgIGlmIChmblN0YXR1cyAhPSBPSykgewogICAgICAgICBjb25zdW1lclVzYWdlID0gMDsKICAgICB9CkBAIC0xNTgsMTAgKzE2NywxMyBAQAogCiAgICAgX3BhcmFtcyA9ICZkZWY7CiAgICAgcGFyYW1zID0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KF9wYXJhbXMpOwotICAgIG9teE5vZGUtPmdldFBhcmFtZXRlcigKKyAgICB0cmFuc1N0YXR1cyA9IG9teE5vZGUtPmdldFBhcmFtZXRlcigKICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uKSwKICAgICAgICAgICAgIGluSGlkbEJ5dGVzKCZkZWYsIHNpemVvZihkZWYpKSwKICAgICAgICAgICAgIF9oaWRsX2NiKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICByZXR1cm4gdG9TdGF0dXMoRkFJTEVEX1RSQU5TQUNUSU9OKTsKKyAgICB9CiAgICAgaWYgKGZuU3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IHBvcnQgZGVmaW5pdGlvbjogJWQiLCBmblN0YXR1cyk7CiAgICAgICAgIHJldHVybiB0b1N0YXR1cyhmblN0YXR1cyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhCdWZmZXJTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XT214QnVmZmVyU291cmNlLmNwcAppbmRleCA4MDMyODNhLi5jOGM5NjNmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhCdWZmZXJTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV09teEJ1ZmZlclNvdXJjZS5jcHAKQEAgLTE2LDggKzE2LDggQEAKIAogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAotI2luY2x1ZGUgIldPbXhCdWZmZXJTb3VyY2UuaCIKLSNpbmNsdWRlICJDb252ZXJzaW9uLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XT214QnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhOb2RlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV09teE5vZGUuY3BwCmluZGV4IDkxZDEwMTAuLjlmODIyODMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV09teE5vZGUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV09teE5vZGUuY3BwCkBAIC0xNiw5ICsxNiw5IEBACiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAKLSNpbmNsdWRlICJXT214Tm9kZS5oIgotI2luY2x1ZGUgIldPbXhCdWZmZXJTb3VyY2UuaCIKLSNpbmNsdWRlICJDb252ZXJzaW9uLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XT214Tm9kZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV09teEJ1ZmZlclNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XT214T2JzZXJ2ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XT214T2JzZXJ2ZXIuY3BwCmluZGV4IDM1NGRiMjkuLmNjYmUyNWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV09teE9ic2VydmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhPYnNlcnZlci5jcHAKQEAgLTE2LDE0ICsxNiwxNCBAQAogCiAjZGVmaW5lIExPR19UQUcgIldPbXhPYnNlcnZlci1pbXBsIgogCi0jaW5jbHVkZSA8dmVjdG9yPgotCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgogI2luY2x1ZGUgPGJpbmRlci9CaW5kZXIuaD4KIAotI2luY2x1ZGUgIldPbXhPYnNlcnZlci5oIgotI2luY2x1ZGUgIkNvbnZlcnNpb24uaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhPYnNlcnZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oPgorCisjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XUHJvZHVjZXJMaXN0ZW5lci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dQcm9kdWNlckxpc3RlbmVyLmNwcAppbmRleCBiZTBkNGQ1Li5iZGMzYWExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dQcm9kdWNlckxpc3RlbmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dQcm9kdWNlckxpc3RlbmVyLmNwcApAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgIldQcm9kdWNlckxpc3RlbmVyLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XUHJvZHVjZXJMaXN0ZW5lci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5icAppbmRleCA2OWVkZTNkLi5iZDNjMWM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5icApAQCAtMSwxMiArMSwxNiBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9vbXgiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJGcmFtZURyb3BwZXIuY3BwIiwKICAgICAgICAgIkdyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIiwKICAgICAgICAgIkJXR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAiLAogICAgICAgICAiT01YLmNwcCIsCisgICAgICAgICJPTVhTdG9yZS5jcHAiLAogICAgICAgICAiT01YTWFzdGVyLmNwcCIsCiAgICAgICAgICJPTVhOb2RlSW5zdGFuY2UuY3BwIiwKICAgICAgICAgIk9NWFV0aWxzLmNwcCIsCkBAIC0yNSwxNCArMjksMTYgQEAKICAgICAgICAgIjEuMC9XT214QnVmZmVyU291cmNlLmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIiwgLy8gZm9yIG1lZGlhL3ZuZGsveG1scGFyc2VyLzEuMC9NZWRpYUNvZGVjc1htbFBhcnNlci5oCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUvbWVkaWEvIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUiLCAvLyBmb3IgbWVkaWEvaGFyZHdhcmUvTWV0YWRhdGFCdWZmZXJUeXBlLmgKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvaGFyZHdhcmUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwpAQCAtNDUsMTIgKzUxLDEyIEBACiAgICAgICAgICJsaWJndWkiLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIiwKICAgICAgICAgImxpYmRsIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCiAgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLCAvLyBUT0RPKGIvNjI5MjM0NzkpOiB1c2UgaGVhZGVyIGxpYnJhcnkKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlckAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhQDEuMCIsCkBAIC01OSw3ICs2NSwxMiBAQAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAogICAgIF0sCiAKLSAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIl0sCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAorICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIiwKKyAgICBdLAogCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKQEAgLTgwLDE1ICs5MSwyOSBAQAogICAgIH0sCiB9CiAKLWNjX2xpYnJhcnlfc3RhdGljIHsKK2NjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfb214X3V0aWxzIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAogICAgIHNyY3M6IFsiT01YVXRpbHMuY3BwIl0sCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvaGFyZHdhcmUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKICAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbImxpYm1lZGlhIl0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgXSwKICAgICBzYW5pdGl6ZTogewogICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9CV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0JXR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKaW5kZXggNzlmNmQ5My4uOTRlZjU5OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0JXR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0JXR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKQEAgLTE3LDE1ICsxNywxMyBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJCV0dyYXBoaWNCdWZmZXJTb3VyY2UiCiAKLSNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+Ci0jaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+Ci0KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvQldHcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfSW5kZXhFeHQuaD4KICNpbmNsdWRlIDxtZWRpYS9PTVhCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CiAKLSNpbmNsdWRlICJPTVhVdGlscy5oIgotI2luY2x1ZGUgIkJXR3JhcGhpY0J1ZmZlclNvdXJjZS5oIgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBjb25zdCBPTVhfVTMyIGtQb3J0SW5kZXhJbnB1dCA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvRnJhbWVEcm9wcGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9GcmFtZURyb3BwZXIuY3BwCmluZGV4IDlhNDk1MmUuLjBjNTBjNTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9GcmFtZURyb3BwZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9GcmFtZURyb3BwZXIuY3BwCkBAIC0xOCw4ICsxOCw3IEBACiAjZGVmaW5lIExPR19UQUcgIkZyYW1lRHJvcHBlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIkZyYW1lRHJvcHBlci5oIgotCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L0ZyYW1lRHJvcHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmNwcAppbmRleCBkODVlZjg5Li4xOTE3ZDJhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCkBAIC0yMiw3ICsyMiw5IEBACiAKICNkZWZpbmUgU1RSSU5HSUZZX0VOVU1TIC8vIGZvciBhc1N0cmluZyBpbiBIYXJkd2FyZUFQSS5oL1ZpZGVvQVBJLmgKIAotI2luY2x1ZGUgIkdyYXBoaWNCdWZmZXJTb3VyY2UuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9GcmFtZURyb3BwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KQEAgLTMxLDE0ICszMywxMiBAQAogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgogI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KICNpbmNsdWRlIDxndWkvQnVmZmVySXRlbS5oPgotI2luY2x1ZGUgPEhhcmR3YXJlQVBJLmg+Ci0jaW5jbHVkZSAib214L09NWFV0aWxzLmgiCi0jaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgotI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgotI2luY2x1ZGUgIm1lZGlhL09NWEJ1ZmZlci5oIgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfSW5kZXhFeHQuaD4KKyNpbmNsdWRlIDxtZWRpYS9PTVhCdWZmZXIuaD4KIAogI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSAiRnJhbWVEcm9wcGVyLmgiCiAKICNpbmNsdWRlIDxmdW5jdGlvbmFsPgogI2luY2x1ZGUgPG1lbW9yeT4KQEAgLTczMyw3ICs3MzMsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gc25hcCB0byBuZWFyZXN0IGNhcHR1cmUgcG9pbnQKICAgICAgICAgICAgIGludDY0X3QgbkZyYW1lcyA9IHN0ZDo6bGxyb3VuZCgKLSAgICAgICAgICAgICAgICAgICAgKHRpbWVVcyAtIG1QcmV2Q2FwdHVyZVVzKSAqIG1DYXB0dXJlRnBzKTsKKyAgICAgICAgICAgICAgICAgICAgKHRpbWVVcyAtIG1QcmV2Q2FwdHVyZVVzKSAqIG1DYXB0dXJlRnBzIC8gMTAwMDAwMCk7CiAgICAgICAgICAgICBpZiAobkZyYW1lcyA8PSAwKSB7CiAgICAgICAgICAgICAgICAgLy8gc2tpcCB0aGlzIGZyYW1lIGFzIGl0J3MgdG9vIGNsb3NlIHRvIHByZXZpb3VzIGNhcHR1cmUKICAgICAgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgZnJhbWUsIHRpbWVVcyAlbGxkIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih0aW1lVXMpKTsKQEAgLTc0MSw5ICs3NDEsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUZyYW1lQ291bnQgKz0gbkZyYW1lczsKICAgICAgICAgICAgIG1QcmV2Q2FwdHVyZVVzID0gbUJhc2VDYXB0dXJlVXMgKyBzdGQ6Omxscm91bmQoCi0gICAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50IC8gbUNhcHR1cmVGcHMpOworICAgICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCAqIDEwMDAwMDAgLyBtQ2FwdHVyZUZwcyk7CiAgICAgICAgICAgICBtUHJldkZyYW1lVXMgPSBtQmFzZUZyYW1lVXMgKyBzdGQ6Omxscm91bmQoCi0gICAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50IC8gbUZwcyk7CisgICAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50ICogMTAwMDAwMCAvIG1GcHMpOwogICAgICAgICB9CiAKICAgICAgICAgQUxPR1YoInRpbWVVcyAlbGxkLCBjYXB0dXJlVXMgJWxsZCwgZnJhbWVVcyAlbGxkIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAKaW5kZXggOGMxMTQxZC4uMDljNDAxOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAKQEAgLTIyLDE1ICsyMiwxMiBAQAogCiAjaW5jbHVkZSA8ZGxmY24uaD4KIAotI2luY2x1ZGUgIi4uL2luY2x1ZGUvT01YLmgiCi0KLSNpbmNsdWRlICIuLi9pbmNsdWRlL09NWE5vZGVJbnN0YW5jZS5oIgotCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvQldHcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSAiQldHcmFwaGljQnVmZmVyU291cmNlLmgiCi0KLSNpbmNsdWRlICJPTVhNYXN0ZXIuaCIKLSNpbmNsdWRlICJPTVhVdGlscy5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTExOCwxNSArMTE1LDIyIEBACiAgICAgICAgIHJldHVybiBTdGF0dXNGcm9tT01YRXJyb3IoZXJyKTsKICAgICB9CiAgICAgaW5zdGFuY2UtPnNldEhhbmRsZShoYW5kbGUpOwotICAgIHN0ZDo6dmVjdG9yPEFTdHJpbmc+IHF1aXJrVmVjdG9yOwotICAgIGlmIChtUGFyc2VyLmdldFF1aXJrcyhuYW1lLCAmcXVpcmtWZWN0b3IpID09IE9LKSB7CisKKyAgICAvLyBGaW5kIHF1aXJrcyBmcm9tIG1QYXJzZXIKKyAgICBjb25zdCBhdXRvJiBjb2RlYyA9IG1QYXJzZXIuZ2V0Q29kZWNNYXAoKS5maW5kKG5hbWUpOworICAgIGlmIChjb2RlYyA9PSBtUGFyc2VyLmdldENvZGVjTWFwKCkuY2VuZCgpKSB7CisgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gb2J0YWluIHF1aXJrcyBmb3Igb214IGNvbXBvbmVudCAnJXMnIGZyb20gWE1MIGZpbGVzIiwKKyAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICB9IGVsc2UgewogICAgICAgICB1aW50MzJfdCBxdWlya3MgPSAwOwotICAgICAgICBmb3IgKGNvbnN0IEFTdHJpbmcgcXVpcmsgOiBxdWlya1ZlY3RvcikgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHF1aXJrIDogY29kZWMtPnNlY29uZC5xdWlya1NldCkgewogICAgICAgICAgICAgaWYgKHF1aXJrID09ICJyZXF1aXJlcy1hbGxvY2F0ZS1vbi1pbnB1dC1wb3J0cyIpIHsKLSAgICAgICAgICAgICAgICBxdWlya3MgfD0ga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbklucHV0UG9ydHM7CisgICAgICAgICAgICAgICAgcXVpcmtzIHw9IE9NWE5vZGVJbnN0YW5jZTo6CisgICAgICAgICAgICAgICAgICAgICAgICBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uSW5wdXRQb3J0czsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChxdWlyayA9PSAicmVxdWlyZXMtYWxsb2NhdGUtb24tb3V0cHV0LXBvcnRzIikgewotICAgICAgICAgICAgICAgIHF1aXJrcyB8PSBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uT3V0cHV0UG9ydHM7CisgICAgICAgICAgICAgICAgcXVpcmtzIHw9IE9NWE5vZGVJbnN0YW5jZTo6CisgICAgICAgICAgICAgICAgICAgICAgICBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uT3V0cHV0UG9ydHM7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaW5zdGFuY2UtPnNldFF1aXJrcyhxdWlya3MpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcAppbmRleCBhYzliMGMzLi5mZDk3ZmRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcApAQCAtMTgsMTUgKzE4LDEzIEBACiAjZGVmaW5lIExPR19UQUcgIk9NWE1hc3RlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIk9NWE1hc3Rlci5oIgotCi0jaW5jbHVkZSAiU29mdE9NWFBsdWdpbi5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAKICNpbmNsdWRlIDxkbGZjbi5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIE9NWE1hc3Rlcjo6T01YTWFzdGVyKCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAKaW5kZXggMjJkN2QyNy4uMDE1YTE0OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAKQEAgLTIwLDIwICsyMCwyMCBAQAogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAotI2luY2x1ZGUgIi4uL2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmgiCi0jaW5jbHVkZSAiT01YTWFzdGVyLmgiCi0jaW5jbHVkZSAiT01YVXRpbHMuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvSU9NWEJ1ZmZlclNvdXJjZS5oPgogCi0jaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgotI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgotI2luY2x1ZGUgPE9NWF9WaWRlb0V4dC5oPgotI2luY2x1ZGUgPE9NWF9Bc1N0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0NvbXBvbmVudC5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0luZGV4RXh0Lmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfVmlkZW9FeHQuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Bc1N0cmluZy5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGd1aS9CdWZmZXJRdWV1ZS5oPgotI2luY2x1ZGUgPEhhcmR3YXJlQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgpAQCAtNDEsNyArNDEsNyBAQAogI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KICNpbmNsdWRlIDx1dGlscy9OYXRpdmVIYW5kbGUuaD4KICNpbmNsdWRlIDxtZWRpYS9PTVhCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS92bmRrL3htbHBhcnNlci8xLjAvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaD4KIAogI2luY2x1ZGUgPGhpZGxtZW1vcnkvbWFwcGluZy5oPgogCkBAIC0yNDYsNiArMjQ2LDE1IEBACiAgICAgdmlydHVhbCB+Q2FsbGJhY2tEaXNwYXRjaGVyKCk7CiAKIHByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIC8vIFRoaXMgaXMgdXNlZCBmb3IgZnJhbWVfcmVuZGVyZWQgbWVzc2FnZSBiYXRjaGluZywgd2hpY2ggd2lsbCBldmVudHVhbGx5IGVuZCB1cCBpbiBhCisgICAgICAgIC8vIHNpbmdsZSBBTWVzc2FnZSBpbiBNZWRpYUNvZGVjIHdoZW4gaXQgaXMgc2lnbmFsZWQgdG8gdGhlIGFwcC4gQU1lc3NhZ2UgY2FuIGNvbnRhaW4KKyAgICAgICAgLy8gdXAtdG8gNjQga2V5LXZhbHVlIHBhaXJzLCBhbmQgZWFjaCBmcmFtZV9yZW5kZXJlZCBtZXNzYWdlIHVzZXMgMiBrZXlzLCBzbyB0aGUgbWF4CisgICAgICAgIC8vIHZhbHVlIGZvciB0aGlzIHdvdWxkIGJlIDMyLiBOb25ldGhlbGVzcywgbGltaXQgdGhpcyB0byAxMiB0byB3aGljaCBnaXZlcyBhdCBsZWFzdCAxMAorICAgICAgICAvLyBtc2Vjb25kcyBvZiBiYXRjaGluZyBhdCAxMjBIei4KKyAgICAgICAga01heFF1ZXVlU2l6ZSA9IDEyLAorICAgIH07CisKICAgICBNdXRleCBtTG9jazsKIAogICAgIHNwPE9NWE5vZGVJbnN0YW5jZT4gY29uc3QgbU93bmVyOwpAQCAtMjkwLDcgKzI5OSw3IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIG1RdWV1ZS5wdXNoX2JhY2sobXNnKTsKLSAgICBpZiAocmVhbFRpbWUpIHsKKyAgICBpZiAocmVhbFRpbWUgfHwgbVF1ZXVlLnNpemUoKSA+PSBrTWF4UXVldWVTaXplKSB7CiAgICAgICAgIG1RdWV1ZUNoYW5nZWQuc2lnbmFsKCk7CiAgICAgfQogfQpAQCAtMzYzLDYgKzM3Miw4IEBACiAgICAgbVBvcnRNb2RlWzFdID0gSU9NWDo6a1BvcnRNb2RlUHJlc2V0Qnl0ZUJ1ZmZlcjsKICAgICBtU2VjdXJlQnVmZmVyVHlwZVswXSA9IGtTZWN1cmVCdWZmZXJUeXBlVW5rbm93bjsKICAgICBtU2VjdXJlQnVmZmVyVHlwZVsxXSA9IGtTZWN1cmVCdWZmZXJUeXBlVW5rbm93bjsKKyAgICBtR3JhcGhpY0J1ZmZlckVuYWJsZWRbMF0gPSBmYWxzZTsKKyAgICBtR3JhcGhpY0J1ZmZlckVuYWJsZWRbMV0gPSBmYWxzZTsKICAgICBtSXNTZWN1cmUgPSBBU3RyaW5nKG5hbWUpLmVuZHNXaXRoKCIuc2VjdXJlIik7CiAgICAgbUxlZ2FjeUFkYXB0aXZlRXhwZXJpbWVudCA9IEFEZWJ1Zzo6aXNFeHBlcmltZW50RW5hYmxlZCgibGVnYWN5LWFkYXB0aXZlIik7CiB9CkBAIC00ODYsNiArNDk3LDkgQEAKICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoInVua25vd24gc3RhdGUgJXMoJSN4KS4iLCBhc1N0cmluZyhzdGF0ZSksIHN0YXRlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKICAgICBzdGF0dXNfdCBlcnIgPSBtT3duZXItPmZyZWVOb2RlKHRoaXMpOwogCiAgICAgbURpc3BhdGNoZXIuY2xlYXIoKTsKQEAgLTY2NSw2ICs2NzksMTEgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKKyAgICBpZiAobVNhaWxlZCB8fCBtTnVtUG9ydEJ1ZmZlcnNbcG9ydEluZGV4XSA+IDApIHsKKyAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyOTQyMjAyMCIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCiAgICAgQ0xPR19DT05GSUcoc2V0UG9ydE1vZGUsICIlcyglZCksIHBvcnQgJWQiLCBhc1N0cmluZyhtb2RlKSwgbW9kZSwgcG9ydEluZGV4KTsKIAogICAgIHN3aXRjaCAobW9kZSkgewpAQCAtNzk2LDYgKzgxNSwxMiBAQAogICAgICAgICAgICAgfSBlbHNlIGlmIChtU2VjdXJlQnVmZmVyVHlwZVtwb3J0SW5kZXhdID09IGtTZWN1cmVCdWZmZXJUeXBlVW5rbm93bikgewogICAgICAgICAgICAgICAgIG1TZWN1cmVCdWZmZXJUeXBlW3BvcnRJbmRleF0gPSBrU2VjdXJlQnVmZmVyVHlwZU9wYXF1ZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgICAgIG1HcmFwaGljQnVmZmVyRW5hYmxlZFtwb3J0SW5kZXhdID0gZW5hYmxlOworICAgICAgICAgICAgfSBlbHNlIGlmIChlbmFibGUpIHsKKyAgICAgICAgICAgICAgICBtR3JhcGhpY0J1ZmZlckVuYWJsZWRbcG9ydEluZGV4XSA9IGZhbHNlOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgQ0xPR19FUlJPUl9JRihlbmFibGUsIGdldEV4dGVuc2lvbkluZGV4LCBlcnIsICIlcyIsIG5hbWUpOwpAQCAtMTA2NCw2ICsxMDg5LDEyIEBACiAgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBPTVhfRXJyb3JOb25lOwogICAgIGJvb2wgaXNNZXRhZGF0YSA9IG1NZXRhZGF0YVR5cGVbcG9ydEluZGV4XSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZDsKIAorICAgIGlmICghaXNNZXRhZGF0YSAmJiBtR3JhcGhpY0J1ZmZlckVuYWJsZWRbcG9ydEluZGV4XSkgeworICAgICAgICBBTE9HRSgiYi82Mjk0ODY3MCIpOworICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjYyOTQ4NjcwIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKICAgICBzaXplX3QgcGFyYW1zU2l6ZTsKICAgICB2b2lkKiBwYXJhbXNQb2ludGVyOwogICAgIGlmIChwYXJhbXMgIT0gTlVMTCAmJiBoUGFyYW1zICE9IE5VTEwpIHsKQEAgLTEyNDksNiArMTI4MCwxMyBAQAogICAgICAgICAgICAgICAgIHBvcnRJbmRleCwgZ3JhcGhpY0J1ZmZlciwgYnVmZmVyKTsKICAgICB9CiAKKyAgICBpZiAoIW1HcmFwaGljQnVmZmVyRW5hYmxlZFtwb3J0SW5kZXhdKSB7CisgICAgICAgIC8vIFJlcG9ydCBlcnJvciBpZiB0aGlzIGlzIG5vdCBpbiBncmFwaGljIGJ1ZmZlciBtb2RlLgorICAgICAgICBBTE9HRSgiYi82Mjk0ODY3MCIpOworICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjYyOTQ4NjcwIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKICAgICAvLyBTZWUgaWYgdGhlIG5ld2VyIHZlcnNpb24gb2YgdGhlIGV4dGVuc2lvbiBpcyBwcmVzZW50LgogICAgIE9NWF9JTkRFWFRZUEUgaW5kZXg7CiAgICAgaWYgKE9NWF9HZXRFeHRlbnNpb25JbmRleCgKQEAgLTIxNjgsOCArMjIwNiw4IEBACiAgICAgICAgICAgICBtc2cuZmVuY2VGZCA9IC0xOwogICAgICAgICAgICAgbXNnLnUucmVuZGVyX2RhdGEudGltZXN0YW1wID0gcmVuZGVyRGF0YVtpXS5uTWVkaWFUaW1lVXM7CiAgICAgICAgICAgICBtc2cudS5yZW5kZXJfZGF0YS5uYW5vVGltZSA9IHJlbmRlckRhdGFbaV0ublN5c3RlbVRpbWVOczsKLQotICAgICAgICAgICAgaW5zdGFuY2UtPm1EaXNwYXRjaGVyLT5wb3N0KG1zZywgZmFsc2UgLyogcmVhbFRpbWUgKi8pOworICAgICAgICAgICAgYm9vbCByZWFsVGltZSA9IG1zZy51LnJlbmRlcl9kYXRhLnRpbWVzdGFtcCA9PSBJTlQ2NF9NQVg7CisgICAgICAgICAgICBpbnN0YW5jZS0+bURpc3BhdGNoZXItPnBvc3QobXNnLCByZWFsVGltZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ1MzM2ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5jcHAKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk9NWFN0b3JlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworICAgIHN0cnVjdCBSb2xlUHJvcGVydGllcyB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHR5cGU7CisgICAgICAgIGJvb2wgaXNFbmNvZGVyOworICAgICAgICBib29sIHByZWZlclBsYXRmb3JtTm9kZXM7CisgICAgICAgIHN0ZDo6bXVsdGltYXA8c2l6ZV90LCBJT01YU3RvcmU6Ok5vZGVJbmZvPiBub2RlTGlzdDsKKyAgICB9OworfSAgLy8gVW5uYW1lZCBuYW1lc3BhY2UKKworT01YU3RvcmU6Ok9NWFN0b3JlKAorICAgICAgICBjb25zdCBjaGFyKiBvd25lciwKKyAgICAgICAgY29uc3QgY2hhciogY29uc3QqIHNlYXJjaERpcnMsCisgICAgICAgIGNvbnN0IGNoYXIqIG1haW5YbWxOYW1lLAorICAgICAgICBjb25zdCBjaGFyKiBwZXJmb3JtYW5jZVhtbE5hbWUsCisgICAgICAgIGNvbnN0IGNoYXIqIHByb2ZpbGluZ1Jlc3VsdHNYbWxQYXRoKSB7CisgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXIgcGFyc2VyKAorICAgICAgICAgICAgc2VhcmNoRGlycywKKyAgICAgICAgICAgIG1haW5YbWxOYW1lLAorICAgICAgICAgICAgcGVyZm9ybWFuY2VYbWxOYW1lLAorICAgICAgICAgICAgcHJvZmlsaW5nUmVzdWx0c1htbFBhdGgpOworICAgIG1QYXJzaW5nU3RhdHVzID0gcGFyc2VyLmdldFBhcnNpbmdTdGF0dXMoKTsKKworICAgIGNvbnN0IGF1dG8mIHNlcnZpY2VBdHRyaWJ1dGVNYXAgPSBwYXJzZXIuZ2V0U2VydmljZUF0dHJpYnV0ZU1hcCgpOworICAgIG1TZXJ2aWNlQXR0cmlidXRlTGlzdC5yZXNlcnZlKHNlcnZpY2VBdHRyaWJ1dGVNYXAuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGF0dHJpYnV0ZVBhaXIgOiBzZXJ2aWNlQXR0cmlidXRlTWFwKSB7CisgICAgICAgIEF0dHJpYnV0ZSBhdHRyaWJ1dGU7CisgICAgICAgIGF0dHJpYnV0ZS5rZXkgPSBhdHRyaWJ1dGVQYWlyLmZpcnN0OworICAgICAgICBhdHRyaWJ1dGUudmFsdWUgPSBhdHRyaWJ1dGVQYWlyLnNlY29uZDsKKyAgICAgICAgbVNlcnZpY2VBdHRyaWJ1dGVMaXN0LnB1c2hfYmFjayhzdGQ6Om1vdmUoYXR0cmlidXRlKSk7CisgICAgfQorCisgICAgY29uc3QgYXV0byYgcm9sZU1hcCA9IHBhcnNlci5nZXRSb2xlTWFwKCk7CisgICAgbVJvbGVMaXN0LnJlc2VydmUocm9sZU1hcC5zaXplKCkpOworICAgIGZvciAoY29uc3QgYXV0byYgcm9sZVBhaXIgOiByb2xlTWFwKSB7CisgICAgICAgIFJvbGVJbmZvIHJvbGU7CisgICAgICAgIHJvbGUucm9sZSA9IHJvbGVQYWlyLmZpcnN0OworICAgICAgICByb2xlLnR5cGUgPSByb2xlUGFpci5zZWNvbmQudHlwZTsKKyAgICAgICAgcm9sZS5pc0VuY29kZXIgPSByb2xlUGFpci5zZWNvbmQuaXNFbmNvZGVyOworICAgICAgICAvLyBUT0RPOiBDdXJyZW50bHksIHByZWZlclBsYXRmb3JtTm9kZXMgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSBpbgorICAgICAgICAvLyB0aGUgeG1sIGZpbGUuIE9uY2Ugd2UgaGF2ZSBhIHdheSB0byBwcm92aWRlIHRoaXMgaW5mb3JtYXRpb24sIGl0CisgICAgICAgIC8vIHNob3VsZCBiZSBwYXJzZWQgcHJvcGVybHkuCisgICAgICAgIHJvbGUucHJlZmVyUGxhdGZvcm1Ob2RlcyA9IHJvbGVQYWlyLmZpcnN0LmNvbXBhcmUoMCwgNSwgImF1ZGlvIikgPT0gMDsKKyAgICAgICAgc3RkOjp2ZWN0b3I8Tm9kZUluZm8+JiBub2RlTGlzdCA9IHJvbGUubm9kZXM7CisgICAgICAgIG5vZGVMaXN0LnJlc2VydmUocm9sZVBhaXIuc2Vjb25kLm5vZGVMaXN0LnNpemUoKSk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgbm9kZVBhaXIgOiByb2xlUGFpci5zZWNvbmQubm9kZUxpc3QpIHsKKyAgICAgICAgICAgIE5vZGVJbmZvIG5vZGU7CisgICAgICAgICAgICBub2RlLm5hbWUgPSBub2RlUGFpci5zZWNvbmQubmFtZTsKKyAgICAgICAgICAgIG5vZGUub3duZXIgPSBvd25lcjsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEF0dHJpYnV0ZT4mIGF0dHJpYnV0ZUxpc3QgPSBub2RlLmF0dHJpYnV0ZXM7CisgICAgICAgICAgICBhdHRyaWJ1dGVMaXN0LnJlc2VydmUobm9kZVBhaXIuc2Vjb25kLmF0dHJpYnV0ZUxpc3Quc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgYXR0cmlidXRlUGFpciA6IG5vZGVQYWlyLnNlY29uZC5hdHRyaWJ1dGVMaXN0KSB7CisgICAgICAgICAgICAgICAgQXR0cmlidXRlIGF0dHJpYnV0ZTsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUua2V5ID0gYXR0cmlidXRlUGFpci5maXJzdDsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUudmFsdWUgPSBhdHRyaWJ1dGVQYWlyLnNlY29uZDsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVMaXN0LnB1c2hfYmFjayhzdGQ6Om1vdmUoYXR0cmlidXRlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlTGlzdC5wdXNoX2JhY2soc3RkOjptb3ZlKG5vZGUpKTsKKyAgICAgICAgfQorICAgICAgICBtUm9sZUxpc3QucHVzaF9iYWNrKHN0ZDo6bW92ZShyb2xlKSk7CisgICAgfQorCisgICAgbVByZWZpeCA9IHBhcnNlci5nZXRDb21tb25QcmVmaXgoKTsKK30KKworc3RhdHVzX3QgT01YU3RvcmU6Omxpc3RTZXJ2aWNlQXR0cmlidXRlcyhzdGQ6OnZlY3RvcjxBdHRyaWJ1dGU+KiBhdHRyaWJ1dGVzKSB7CisgICAgKmF0dHJpYnV0ZXMgPSBtU2VydmljZUF0dHJpYnV0ZUxpc3Q7CisgICAgcmV0dXJuIG1QYXJzaW5nU3RhdHVzOworfQorCitzdGF0dXNfdCBPTVhTdG9yZTo6Z2V0Tm9kZVByZWZpeChzdGQ6OnN0cmluZyogcHJlZml4KSB7CisgICAgKnByZWZpeCA9IG1QcmVmaXg7CisgICAgcmV0dXJuIG1QYXJzaW5nU3RhdHVzOworfQorCitzdGF0dXNfdCBPTVhTdG9yZTo6bGlzdFJvbGVzKHN0ZDo6dmVjdG9yPFJvbGVJbmZvPiogcm9sZUxpc3QpIHsKKyAgICAqcm9sZUxpc3QgPSBtUm9sZUxpc3Q7CisgICAgcmV0dXJuIG1QYXJzaW5nU3RhdHVzOworfQorCitzdGF0dXNfdCBPTVhTdG9yZTo6Z2V0T214KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBzcDxJT01YPiogb214KSB7CisgICAgKm9teCA9IG5ldyBPTVgoKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK09NWFN0b3JlOjp+T01YU3RvcmUoKSB7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuY3BwCmluZGV4IGE2NmQ1NjUuLjU4OTQ4MzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmNwcApAQCAtMTksMTMgKzE5LDEzIEBACiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KIAotI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MtYmFzZS5oPgotI2luY2x1ZGUgIk9NWFV0aWxzLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuY3BwCmluZGV4IDViYWU3ZTguLjFiYTU4NTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAKQEAgLTE4LDggKzE4LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiU2ltcGxlU29mdE9NWENvbXBvbmVudCIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgImluY2x1ZGUvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgotCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YQ29tcG9uZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YQ29tcG9uZW50LmNwcAppbmRleCBkZjk3OGY4Li5lZTI2OWUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWENvbXBvbmVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhDb21wb25lbnQuY3BwCkBAIC0xOCw4ICsxOCw3IEBACiAjZGVmaW5lIExPR19UQUcgIlNvZnRPTVhDb21wb25lbnQiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJpbmNsdWRlL1NvZnRPTVhDb21wb25lbnQuaCIKLQorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0T01YQ29tcG9uZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwCmluZGV4IGZjY2IxMmIuLjQ5NDZhZGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5jcHAKQEAgLTE4LDggKzE4LDggQEAKICNkZWZpbmUgTE9HX1RBRyAiU29mdE9NWFBsdWdpbiIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIlNvZnRPTVhQbHVnaW4uaCIKLSNpbmNsdWRlICJpbmNsdWRlL1NvZnRPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0T01YQ29tcG9uZW50Lmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgpAQCAtODUsNyArODUsMjEgQEAKICAgICAgICAgbGliTmFtZS5hcHBlbmQoa0NvbXBvbmVudHNbaV0ubUxpYk5hbWVTdWZmaXgpOwogICAgICAgICBsaWJOYW1lLmFwcGVuZCgiLnNvIik7CiAKLSAgICAgICAgdm9pZCAqbGliSGFuZGxlID0gZGxvcGVuKGxpYk5hbWUuY19zdHIoKSwgUlRMRF9OT1cpOworICAgICAgICAvLyBSVExEX05PREVMRVRFIG1lYW5zIHdlIGtlZXAgdGhlIHNoYXJlZCBsaWJyYXJ5IGFyb3VuZCBmb3JldmVyLgorICAgICAgICAvLyB0aGlzIGVsaW1pbmF0ZXMgdGhyYXNoaW5nIGR1cmluZyBzZXF1ZW5jZXMgbGlrZSBsb2FkaW5nIHNvdW5kcG9vbHMuCisgICAgICAgIC8vIEl0IGFsc28gbGVhdmVzIHRoZSByZXN0IG9mIHRoZSBsb2dpYyBhcm91bmQgdGhlIGRsb3BlbigpL2RsY2xvc2UoKQorICAgICAgICAvLyBjYWxscyBpbiB0aGlzIGZpbGUgdW5jaGFuZ2VkLgorICAgICAgICAvLworICAgICAgICAvLyBJbXBsaWNhdGlvbnMgb2YgdGhlIGNoYW5nZToKKyAgICAgICAgLy8gLS0gdGhlIGNvZGVjIHByb2Nlc3MgKHdoZXJlIHRoaXMgaGFwcGVucykgd2lsbCBoYXZlIGEgc2xpZ2h0bHkgbGFyZ2VyCisgICAgICAgIC8vICAgIGxvbmctdGVybSBtZW1vcnkgZm9vdHByaW50IGFzIGl0IGFjY3VtdWxhdGVzIHRoZSBsb2FkZWQgc2hhcmVkIGxpYnJhcmllcy4KKyAgICAgICAgLy8gICAgVGhpcyBpcyBleHBlY3RlZCB0byBiZSBhIHNtYWxsIGFtb3VudCBvZiBtZW1vcnkuCisgICAgICAgIC8vIC0tIHBsdWdpbiBjb2RlY3MgY2FuIG5vIGxvbmdlciAoYW5kIG5ldmVyIHNob3VsZCBoYXZlKSBkZXBlbmQgb24gYQorICAgICAgICAvLyAgICBmcmVlIHJlc2V0IG9mIGFueSBzdGF0aWMgZGF0YSBhcyB0aGUgbGlicmFyeSB3b3VsZCBoYXZlIGNyb3NzZWQKKyAgICAgICAgLy8gICAgYSBkbGNsb3NlL2Rsb3BlbiBjeWNsZS4KKyAgICAgICAgLy8KKworICAgICAgICB2b2lkICpsaWJIYW5kbGUgPSBkbG9wZW4obGliTmFtZS5jX3N0cigpLCBSVExEX05PV3xSVExEX05PREVMRVRFKTsKIAogICAgICAgICBpZiAobGliSGFuZGxlID09IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dFKCJ1bmFibGUgdG8gZGxvcGVuICVzOiAlcyIsIGxpYk5hbWUuY19zdHIoKSwgZGxlcnJvcigpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcAppbmRleCA5MjBkZDE4Li5jYjgxMWEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwCkBAIC0yMCwxNCArMjAsMTQgQEAKICNkZWZpbmUgTE9HX1RBRyAiU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudCIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgImluY2x1ZGUvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50Lmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYURlZnMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0xODIsMTEgKzE4MiwxMSBAQAogCiAKIHVpbnQzMl90IFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6Om91dHB1dEJ1ZmZlcldpZHRoKCkgewotICAgIHJldHVybiBtSXNBZGFwdGl2ZSA/IG1BZGFwdGl2ZU1heFdpZHRoIDogbVdpZHRoOworICAgIHJldHVybiBtYXgobUlzQWRhcHRpdmUgPyBtQWRhcHRpdmVNYXhXaWR0aCA6IDAsIG1XaWR0aCk7CiB9CiAKIHVpbnQzMl90IFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6Om91dHB1dEJ1ZmZlckhlaWdodCgpIHsKLSAgICByZXR1cm4gbUlzQWRhcHRpdmUgPyBtQWRhcHRpdmVNYXhIZWlnaHQgOiBtSGVpZ2h0OworICAgIHJldHVybiBtYXgobUlzQWRhcHRpdmUgPyBtQWRhcHRpdmVNYXhIZWlnaHQgOiAwLCBtSGVpZ2h0KTsKIH0KIAogdm9pZCBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAKaW5kZXggN2VjZmJiYi4uZjMzYmRjMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmNwcApAQCAtMjEsMjUgKzIxLDIyIEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgogCi0jaW5jbHVkZSAiaW5jbHVkZS9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0luZGV4RXh0Lmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFEZWZzLmg+CiAKICNpbmNsdWRlIDx1aS9GZW5jZS5oPgogI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXJNYXBwZXIuaD4KICNpbmNsdWRlIDx1aS9SZWN0Lmg+CiAKICNpbmNsdWRlIDxoYXJkd2FyZS9ncmFsbG9jLmg+Ci0KICNpbmNsdWRlIDxuYXRpdmViYXNlL25hdGl2ZWJhc2UuaD4KIAotI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNvbnN0IHN0YXRpYyBPTVhfQ09MT1JfRk9STUFUVFlQRSBrU3VwcG9ydGVkQ29sb3JGb3JtYXRzW10gPSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaAppbmRleCBmZDkxNTc0Li44ZDhhMmQ5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaApAQCAtMjksMTIgKzI5LDEyIEBACiAjaW5jbHVkZSA8YmluZGVyL0JpbmRlci5oPgogI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KICNpbmNsdWRlIDx1aS9GZW5jZVRpbWUuaD4KLSNpbmNsdWRlIDxtZWRpYS9PTVhGZW5jZVBhcmNlbGFibGUuaD4KICNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgogI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9PTVhGZW5jZVBhcmNlbGFibGUuaD4KICNpbmNsdWRlIDxtZWRpYS9PTVhCdWZmZXIuaD4KLSNpbmNsdWRlIDxWaWRlb0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9idWZmZXJxdWV1ZS8xLjAvSVByb2R1Y2VyTGlzdGVuZXIuaD4KQEAgLTIwNjQsOCArMjA2NCwxMCBAQAogICAgIGludCBjb25zdCogY29uc3RGZHMgPSBzdGF0aWNfY2FzdDxpbnQgY29uc3QqPihiYXNlRmRzLmdldCgpKTsKICAgICBudW1GZHMgPSBiYXNlTnVtRmRzOwogICAgIGlmIChsLT51bmZsYXR0ZW4oY29uc3RCdWZmZXIsIHNpemUsIGNvbnN0RmRzLCBudW1GZHMpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UobmgpOwotICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7CisgICAgICAgIGlmIChuaCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKG5oKTsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXguaApzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teC5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teC5oCmluZGV4IDIzNzg0YWEuLmE2YTlkM2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXguaApAQCAtMjAsMTAgKzIwLDkgQEAKICNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL09NWE5vZGVJbnN0YW5jZS5oIgotCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvdm5kay94bWxwYXJzZXIvMS4wL01lZGlhQ29kZWNzWG1sUGFyc2VyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5oCnNpbWlsYXJpdHkgaW5kZXggNzElCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5oCmluZGV4IGYzNzdmNWEuLjAwNmQyZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXhTdG9yZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewpAQCAtNDEsMTcgKzQyLDMxIEBACiB1c2luZyA6OmFuZHJvaWQ6OndwOwogCiBzdHJ1Y3QgT214U3RvcmUgOiBwdWJsaWMgSU9teFN0b3JlIHsKLSAgICBPbXhTdG9yZSgpOworICAgIE9teFN0b3JlKAorICAgICAgICAgICAgY29uc3QgY2hhciogb3duZXIgPSAiZGVmYXVsdCIsCisgICAgICAgICAgICBjb25zdCBjaGFyKiBjb25zdCogc2VhcmNoRGlycworICAgICAgICAgICAgICAgID0gTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRTZWFyY2hEaXJzLAorICAgICAgICAgICAgY29uc3QgY2hhciogbWFpblhtbE5hbWUKKyAgICAgICAgICAgICAgICA9IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpkZWZhdWx0TWFpblhtbE5hbWUsCisgICAgICAgICAgICBjb25zdCBjaGFyKiBwZXJmb3JtYW5jZVhtbE5hbWUKKyAgICAgICAgICAgICAgICA9IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpkZWZhdWx0UGVyZm9ybWFuY2VYbWxOYW1lLAorICAgICAgICAgICAgY29uc3QgY2hhciogcHJvZmlsaW5nUmVzdWx0c1htbFBhdGgKKyAgICAgICAgICAgICAgICA9IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpkZWZhdWx0UHJvZmlsaW5nUmVzdWx0c1htbFBhdGgpOworCiAgICAgdmlydHVhbCB+T214U3RvcmUoKTsKIAotICAgIC8vIE1ldGhvZHMgZnJvbSBJT214CisgICAgLy8gTWV0aG9kcyBmcm9tIElPbXhTdG9yZQogICAgIFJldHVybjx2b2lkPiBsaXN0U2VydmljZUF0dHJpYnV0ZXMobGlzdFNlcnZpY2VBdHRyaWJ1dGVzX2NiKSBvdmVycmlkZTsKICAgICBSZXR1cm48dm9pZD4gZ2V0Tm9kZVByZWZpeChnZXROb2RlUHJlZml4X2NiKSBvdmVycmlkZTsKICAgICBSZXR1cm48dm9pZD4gbGlzdFJvbGVzKGxpc3RSb2xlc19jYikgb3ZlcnJpZGU7CiAgICAgUmV0dXJuPHNwPElPbXg+PiBnZXRPbXgoaGlkbF9zdHJpbmcgY29uc3QmKSBvdmVycmlkZTsKLX07CiAKLWV4dGVybiAiQyIgSU9teFN0b3JlKiBISURMX0ZFVENIX0lPbXhTdG9yZShjb25zdCBjaGFyKiBuYW1lKTsKK3Byb3RlY3RlZDoKKyAgICBTdGF0dXMgbVBhcnNpbmdTdGF0dXM7CisgICAgaGlkbF9zdHJpbmcgbVByZWZpeDsKKyAgICBoaWRsX3ZlYzxTZXJ2aWNlQXR0cmlidXRlPiBtU2VydmljZUF0dHJpYnV0ZUxpc3Q7CisgICAgaGlkbF92ZWM8Um9sZUluZm8+IG1Sb2xlTGlzdDsKK307CiAKIH0gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgogfSAgLy8gbmFtZXNwYWNlIFYxXzAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5oCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5oCmluZGV4IDQ1NDljOTcuLmI5ZjIyYWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmgKQEAgLTI4LDcgKzI4LDcgQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQvQm5HcmFwaGljQnVmZmVyU291cmNlLmg+CiAKLSNpbmNsdWRlICIuLi9HcmFwaGljQnVmZmVyU291cmNlLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV09teEJ1ZmZlclNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XT214QnVmZmVyU291cmNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV09teEJ1ZmZlclNvdXJjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhCdWZmZXJTb3VyY2UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XT214Tm9kZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XT214Tm9kZS5oCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV09teE5vZGUuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XT214Tm9kZS5oCmluZGV4IGQ3MTUzNzQuLjM4ZDU4ODUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV09teE5vZGUuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhOb2RlLmgKQEAgLTIyLDcgKzIyLDcgQEAKIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9PTVhOb2RlSW5zdGFuY2UuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teE5vZGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teE9ic2VydmVyLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhPYnNlcnZlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XT214T2JzZXJ2ZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XT214T2JzZXJ2ZXIuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XT214T2JzZXJ2ZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XUHJvZHVjZXJMaXN0ZW5lci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XUHJvZHVjZXJMaXN0ZW5lci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dQcm9kdWNlckxpc3RlbmVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV1Byb2R1Y2VyTGlzdGVuZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0JXR3JhcGhpY0J1ZmZlclNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L0JXR3JhcGhpY0J1ZmZlclNvdXJjZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQldHcmFwaGljQnVmZmVyU291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9CV0dyYXBoaWNCdWZmZXJTb3VyY2UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0ZyYW1lRHJvcHBlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L0ZyYW1lRHJvcHBlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvRnJhbWVEcm9wcGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9GcmFtZURyb3BwZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmgKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuaAppbmRleCAwMDk2OTFkLi44NGZlZTZmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmgKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxndWkvQnVmZmVyUXVldWUuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAKLSNpbmNsdWRlIDxWaWRlb0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgogI2luY2x1ZGUgPG1lZGlhL09NWEZlbmNlUGFyY2VsYWJsZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9JT214Tm9kZVdyYXBwZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9JT214Tm9kZVdyYXBwZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0lPbXhOb2RlV3JhcHBlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvSU9teE5vZGVXcmFwcGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YLmgKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVguaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWC5oCmluZGV4IDRhZjNkMzkuLjU5NGI0YzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWC5oCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3ZuZGsveG1scGFyc2VyLzEuMC9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgogI2luY2x1ZGUgIk9teE5vZGVPd25lci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmgKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmgKaW5kZXggM2Y5YzBjYS4uODk3ZjI4NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIE9NWF9NQVNURVJfSF8KIAotI2luY2x1ZGUgPE9NWFBsdWdpbkJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9PTVhQbHVnaW5CYXNlLmg+CiAKICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmgKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVhOb2RlSW5zdGFuY2UuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5oCmluZGV4IDhlMDhkMTUuLjEwNjVjYTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5oCkBAIC05Miw2ICs5MiwxNSBAQAogICAgIHN0YXR1c190IGdldEV4dGVuc2lvbkluZGV4KAogICAgICAgICAgICAgY29uc3QgY2hhciAqcGFyYW1ldGVyTmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpOwogCisgICAgLy8gUXVpcmsgc3RpbGwgc3VwcG9ydGVkLCBldmVuIHRob3VnaCBkZXByZWNhdGVkCisgICAgZW51bSBRdWlya3MgeworICAgICAgICBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uSW5wdXRQb3J0cyAgID0gMSwKKyAgICAgICAga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbk91dHB1dFBvcnRzICA9IDIsCisKKyAgICAgICAga1F1aXJrc01hc2sgPSBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uSW5wdXRQb3J0cworICAgICAgICAgICAgICAgICAgICB8IGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25PdXRwdXRQb3J0cywKKyAgICB9OworCiAgICAgc3RhdHVzX3Qgc2V0UXVpcmtzKE9NWF9VMzIgcXVpcmtzKTsKIAogICAgIGJvb2wgaXNTZWN1cmUoKSBjb25zdCB7CkBAIC0xNDMsNyArMTUyLDcgQEAKIAogICAgIGJvb2wgbUxlZ2FjeUFkYXB0aXZlRXhwZXJpbWVudDsKICAgICBJT01YOjpQb3J0TW9kZSBtUG9ydE1vZGVbMl07Ci0gICAgLy8gbWV0YWRhdGEgYW5kIHNlY3VyZSBidWZmZXIgdHlwZSB0cmFja2luZworICAgIC8vIG1ldGFkYXRhIGFuZCBzZWN1cmUgYnVmZmVyIHR5cGVzIGFuZCBncmFwaGljIGJ1ZmZlciBtb2RlIHRyYWNraW5nCiAgICAgTWV0YWRhdGFCdWZmZXJUeXBlIG1NZXRhZGF0YVR5cGVbMl07CiAgICAgZW51bSBTZWN1cmVCdWZmZXJUeXBlIHsKICAgICAgICAga1NlY3VyZUJ1ZmZlclR5cGVVbmtub3duLApAQCAtMTUxLDYgKzE2MCw3IEBACiAgICAgICAgIGtTZWN1cmVCdWZmZXJUeXBlTmF0aXZlSGFuZGxlLAogICAgIH07CiAgICAgU2VjdXJlQnVmZmVyVHlwZSBtU2VjdXJlQnVmZmVyVHlwZVsyXTsKKyAgICBib29sIG1HcmFwaGljQnVmZmVyRW5hYmxlZFsyXTsKIAogICAgIC8vIEZvbGxvd2luZyBhcmUgT01YIHBhcmFtZXRlcnMgbWFuYWdlZCBieSB1cyAoaW5zdGVhZCBvZiB0aGUgY29tcG9uZW50KQogICAgIC8vIE9NWF9JbmRleFBhcmFtTWF4RnJhbWVEdXJhdGlvbkZvckJpdHJhdGVDb250cm9sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMGQ3MTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuaApAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX09NWFNUT1JFX0hfCisjZGVmaW5lIEFORFJPSURfT01YU1RPUkVfSF8KKworI2luY2x1ZGUgPG1lZGlhL0lPTVhTdG9yZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaD4KKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgT01YU3RvcmUgOiBwdWJsaWMgQm5PTVhTdG9yZSB7CitwdWJsaWM6CisgICAgT01YU3RvcmUoCisgICAgICAgICAgICBjb25zdCBjaGFyKiBvd25lciA9ICJkZWZhdWx0IiwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0KiBzZWFyY2hEaXJzCisgICAgICAgICAgICAgICAgPSBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZGVmYXVsdFNlYXJjaERpcnMsCisgICAgICAgICAgICBjb25zdCBjaGFyKiBtYWluWG1sTmFtZQorICAgICAgICAgICAgICAgID0gTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRNYWluWG1sTmFtZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBlcmZvcm1hbmNlWG1sTmFtZQorICAgICAgICAgICAgICAgID0gTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRQZXJmb3JtYW5jZVhtbE5hbWUsCisgICAgICAgICAgICBjb25zdCBjaGFyKiBwcm9maWxpbmdSZXN1bHRzWG1sUGF0aAorICAgICAgICAgICAgICAgID0gTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRQcm9maWxpbmdSZXN1bHRzWG1sUGF0aCk7CisKKyAgICBzdGF0dXNfdCBsaXN0U2VydmljZUF0dHJpYnV0ZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBdHRyaWJ1dGU+KiBhdHRyaWJ1dGVzKSBvdmVycmlkZTsKKworICAgIHN0YXR1c190IGdldE5vZGVQcmVmaXgoc3RkOjpzdHJpbmcqIHByZWZpeCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCBsaXN0Um9sZXMoc3RkOjp2ZWN0b3I8Um9sZUluZm8+KiByb2xlTGlzdCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCBnZXRPbXgoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHNwPElPTVg+KiBvbXgpIG92ZXJyaWRlOworCisgICAgfk9NWFN0b3JlKCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICBzdGF0dXNfdCBtUGFyc2luZ1N0YXR1czsKKyAgICBzdGQ6OnN0cmluZyBtUHJlZml4OworICAgIHN0ZDo6dmVjdG9yPEF0dHJpYnV0ZT4gbVNlcnZpY2VBdHRyaWJ1dGVMaXN0OworICAgIHN0ZDo6dmVjdG9yPFJvbGVJbmZvPiBtUm9sZUxpc3Q7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfT01YU1RPUkVfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0T01YQ29tcG9uZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdE9NWENvbXBvbmVudC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnRPTVhDb21wb25lbnQuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRPTVhDb21wb25lbnQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmgKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uaAppbmRleCBjODljZDg3Li44ZWM3MTdlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmgKQEAgLTE5LDcgKzE5LDcgQEAKICNkZWZpbmUgU09GVF9PTVhfUExVR0lOX0hfCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8T01YUGx1Z2luQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL09NWFBsdWdpbkJhc2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvRnJhbWVEcm9wcGVyX3Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0ZyYW1lRHJvcHBlcl90ZXN0LmNwcAppbmRleCBmOTY2YjVlLi5hOTI1ZGE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvRnJhbWVEcm9wcGVyX3Rlc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9GcmFtZURyb3BwZXJfdGVzdC5jcHAKQEAgLTIwLDcgKzIwLDcgQEAKIAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAKLSNpbmNsdWRlICJGcmFtZURyb3BwZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvRnJhbWVEcm9wcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXNfdGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlc190ZXN0LmNwcAppbmRleCAyNTk5NjA4Li4wYzIyYTQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlc190ZXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlc190ZXN0LmNwcApAQCAtMjYsNiArMjYsOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgogCisjaW5jbHVkZSA8dmVjdG9yPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBjb25zdCBjaGFyIGtUZXN0T3ZlcnJpZGVzU3RyW10gPQpAQCAtMTE3LDcgKzExOSw3IEBACiAvLyBUT0RPOiB0aGUgY29kZWMgY29tcG9uZW50IG5ldmVyIHJldHVybnMgT01YX0V2ZW50Q21kQ29tcGxldGUgaW4gdW5pdCB0ZXN0LgogVEVTVF9GKE1lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzVGVzdCwgRElTQUJMRURfcHJvZmlsZUNvZGVjcykgewogICAgIHNwPElNZWRpYUNvZGVjTGlzdD4gbGlzdCA9IE1lZGlhQ29kZWNMaXN0OjpnZXRJbnN0YW5jZSgpOwotICAgIFZlY3RvcjxzcDxNZWRpYUNvZGVjSW5mbz4+IGluZm9zOworICAgIHN0ZDo6dmVjdG9yPHNwPE1lZGlhQ29kZWNJbmZvPj4gaW5mb3M7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0LT5jb3VudENvZGVjcygpOyArK2kpIHsKICAgICAgICAgaW5mb3MucHVzaF9iYWNrKGxpc3QtPmdldENvZGVjSW5mbyhpKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdm5kay94bWxwYXJzZXIvMS4wL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvQW5kcm9pZC5icApzaW1pbGFyaXR5IGluZGV4IDY3JQpyZW5hbWUgZnJvbSBtZWRpYS92bmRrL3htbHBhcnNlci8xLjAvQW5kcm9pZC5icApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAKaW5kZXggMmYxMGNiMS4uMzUwNzI4NCAxMDA2NDQKLS0tIGEvbWVkaWEvdm5kay94bWxwYXJzZXIvMS4wL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAKQEAgLTEsMTQgKzEsMTYgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyQDEuMCIsCisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlciIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIk1lZGlhQ29kZWNzWG1sUGFyc2VyLmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwpAQCAtMTcsNiArMTksNyBAQAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teF91dGlscyIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpAQCAtMzEsNiArMzQsMTAgQEAKICAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgZGlhZzogeworICAgICAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICB9LAogICAgIH0sCiAKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZDMwZWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwCkBAIC0wLDAgKzEsMTA1NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYUNvZGVjc1htbFBhcnNlciIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGV4cGF0Lmg+CisKKyNpbmNsdWRlIDxjY3R5cGU+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKKy8qKgorICogU2VhcmNoIGZvciBhIGZpbGUgaW4gYSBsaXN0IG9mIHNlYXJjaCBkaXJlY3Rvcmllcy4KKyAqCisgKiBGb3IgZWFjaCBzdHJpbmcgYHNlYXJjaERpcmAgaW4gYHNlYXJjaERpcnNgLCBgc2VhcmNoRGlyL2ZpbGVOYW1lYCB3aWxsIGJlCisgKiB0ZXN0ZWQgd2hldGhlciBpdCBpcyBhIHZhbGlkIGZpbGUgbmFtZSBvciBub3QuIElmIGl0IGlzIGEgdmFsaWQgZmlsZSBuYW1lLAorICogdGhlIGNvbmNhdGVuYXRlZCBuYW1lIChgc2VhcmNoRGlyL2ZpbGVOYW1lYCkgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIG91dHB1dAorICogdmFyaWFibGUgYG91dFBhdGhgLCBhbmQgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGB0cnVlYC4gT3RoZXJ3aXNlLCB0aGUKKyAqIHNlYXJjaCBjb250aW51ZXMgdW50aWwgdGhlIGBudWxscHRyYCBlbGVtZW50IGluIGBzZWFyY2hEaXJzYCBpcyByZWFjaGVkLCBhdAorICogd2hpY2ggcG9pbnQgdGhlIGZ1bmN0aW9uIHJldHVybnMgYGZhbHNlYC4KKyAqCisgKiBccGFyYW1baW5dIHNlYXJjaERpcnMgTnVsbC10ZXJtaW5hdGVkIGFycmF5IG9mIHNlYXJjaCBwYXRocy4KKyAqIFxwYXJhbVtpbl0gZmlsZU5hbWUgTmFtZSBvZiB0aGUgZmlsZSB0byBzZWFyY2guCisgKiBccGFyYW1bb3V0XSBvdXRQYXRoIEZ1bGwgcGF0aCBvZiB0aGUgZmlsZS4gYG91dFBhdGhgIHdpbGwgaG9sZCBhIHZhbGlkIGZpbGUKKyAqIG5hbWUgaWYgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIGB0cnVlYC4KKyAqIFxyZXR1cm4gYHRydWVgIGlmIHNvbWUgZWxlbWVudCBpbiBgc2VhcmNoRGlyc2AgY29tYmluZWQgd2l0aCBgZmlsZU5hbWVgIGlzIGEKKyAqIHZhbGlkIGZpbGUgbmFtZTsgYGZhbHNlYCBvdGhlcndpc2UuCisgKi8KK2Jvb2wgZmluZEZpbGVJbkRpcnMoCisgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0KiBzZWFyY2hEaXJzLAorICAgICAgICBjb25zdCBjaGFyICpmaWxlTmFtZSwKKyAgICAgICAgc3RkOjpzdHJpbmcgKm91dFBhdGgpIHsKKyAgICBmb3IgKDsgKnNlYXJjaERpcnMgIT0gbnVsbHB0cjsgKytzZWFyY2hEaXJzKSB7CisgICAgICAgICpvdXRQYXRoID0gc3RkOjpzdHJpbmcoKnNlYXJjaERpcnMpICsgIi8iICsgZmlsZU5hbWU7CisgICAgICAgIHN0cnVjdCBzdGF0IGZpbGVTdGF0OworICAgICAgICBpZiAoc3RhdChvdXRQYXRoLT5jX3N0cigpLCAmZmlsZVN0YXQpID09IDAgJiYKKyAgICAgICAgICAgICAgICBTX0lTUkVHKGZpbGVTdGF0LnN0X21vZGUpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgc3RybkVxKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMiwgc2l6ZV90IGNvdW50KSB7CisgICAgcmV0dXJuIHN0cm5jbXAoczEsIHMyLCBjb3VudCkgPT0gMDsKK30KKworYm9vbCBzdHJFcShjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpIHsKKyAgICByZXR1cm4gc3RyY21wKHMxLCBzMikgPT0gMDsKK30KKworYm9vbCBzdHJpRXEoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSB7CisgICAgcmV0dXJuIHN0cmNhc2VjbXAoczEsIHMyKSA9PSAwOworfQorCitib29sIHN0ckhhc1ByZWZpeChjb25zdCBjaGFyKiB0ZXN0LCBjb25zdCBjaGFyKiBwcmVmaXgpIHsKKyAgICByZXR1cm4gc3RybkVxKHRlc3QsIHByZWZpeCwgc3RybGVuKHByZWZpeCkpOworfQorCitib29sIHBhcnNlQm9vbGVhbihjb25zdCBjaGFyKiBzKSB7CisgICAgcmV0dXJuIHN0cmlFcShzLCAieSIpIHx8CisgICAgICAgICAgICBzdHJpRXEocywgInllcyIpIHx8CisgICAgICAgICAgICBzdHJpRXEocywgInQiKSB8fAorICAgICAgICAgICAgc3RyaUVxKHMsICJ0cnVlIikgfHwKKyAgICAgICAgICAgIHN0cmlFcShzLCAiMSIpOworfQorCitzdGF0dXNfdCBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciAqYXR0ciwgYm9vbCBmb3VuZCA9IHRydWUpIHsKKyAgICBBTE9HRSgibGltaXQgJyVzJyB3aXRoICVzJyVzJyBhdHRyaWJ1dGUiLCBuYW1lLAorICAgICAgICAgICAgKGZvdW5kID8gIiIgOiAibm8gIiksIGF0dHIpOworICAgIHJldHVybiAtRUlOVkFMOworfQorCitzdGF0dXNfdCBsaW1pdEVycm9yKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIgKm1zZykgeworICAgIEFMT0dFKCJsaW1pdCAnJXMnICVzIiwgbmFtZSwgbXNnKTsKKyAgICByZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdHVzX3QgbGltaXRJbnZhbGlkQXR0cihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiBhdHRyLCBjb25zdCBjaGFyKiB2YWx1ZSkgeworICAgIEFMT0dFKCJsaW1pdCAnJXMnIHdpdGggaW52YWxpZCAnJXMnIGF0dHJpYnV0ZSAoJXMpIiwgbmFtZSwKKyAgICAgICAgICAgIGF0dHIsIHZhbHVlKTsKKyAgICByZXR1cm4gLUVJTlZBTDsKK30KKworfTsgLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworY29uc3RleHByIGNoYXIgY29uc3QqIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpkZWZhdWx0U2VhcmNoRGlyc1tdOworY29uc3RleHByIGNoYXIgY29uc3QqIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpkZWZhdWx0TWFpblhtbE5hbWU7Citjb25zdGV4cHIgY2hhciBjb25zdCogTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRQZXJmb3JtYW5jZVhtbE5hbWU7Citjb25zdGV4cHIgY2hhciBjb25zdCogTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRQcm9maWxpbmdSZXN1bHRzWG1sUGF0aDsKKworTWVkaWFDb2RlY3NYbWxQYXJzZXI6Ok1lZGlhQ29kZWNzWG1sUGFyc2VyKAorICAgICAgICBjb25zdCBjaGFyKiBjb25zdCogc2VhcmNoRGlycywKKyAgICAgICAgY29uc3QgY2hhciogbWFpblhtbE5hbWUsCisgICAgICAgIGNvbnN0IGNoYXIqIHBlcmZvcm1hbmNlWG1sTmFtZSwKKyAgICAgICAgY29uc3QgY2hhciogcHJvZmlsaW5nUmVzdWx0c1htbFBhdGgpIDoKKyAgICBtUGFyc2luZ1N0YXR1cyhOT19JTklUKSwKKyAgICBtVXBkYXRlKGZhbHNlKSwKKyAgICBtQ29kZWNDb3VudGVyKDApIHsKKyAgICBzdGQ6OnN0cmluZyBwYXRoOworICAgIGlmIChmaW5kRmlsZUluRGlycyhzZWFyY2hEaXJzLCBtYWluWG1sTmFtZSwgJnBhdGgpKSB7CisgICAgICAgIHBhcnNlVG9wTGV2ZWxYTUxGaWxlKHBhdGguY19zdHIoKSwgZmFsc2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJDYW5ub3QgZmluZCAlcyIsIG1haW5YbWxOYW1lKTsKKyAgICAgICAgbVBhcnNpbmdTdGF0dXMgPSBOQU1FX05PVF9GT1VORDsKKyAgICB9CisgICAgaWYgKGZpbmRGaWxlSW5EaXJzKHNlYXJjaERpcnMsIHBlcmZvcm1hbmNlWG1sTmFtZSwgJnBhdGgpKSB7CisgICAgICAgIHBhcnNlVG9wTGV2ZWxYTUxGaWxlKHBhdGguY19zdHIoKSwgdHJ1ZSk7CisgICAgfQorICAgIGlmIChwcm9maWxpbmdSZXN1bHRzWG1sUGF0aCAhPSBudWxscHRyKSB7CisgICAgICAgIHBhcnNlVG9wTGV2ZWxYTUxGaWxlKHByb2ZpbGluZ1Jlc3VsdHNYbWxQYXRoLCB0cnVlKTsKKyAgICB9Cit9CisKK2Jvb2wgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OnBhcnNlVG9wTGV2ZWxYTUxGaWxlKAorICAgICAgICBjb25zdCBjaGFyICpjb2RlY3NfeG1sLAorICAgICAgICBib29sIGlnbm9yZV9lcnJvcnMpIHsKKyAgICAvLyBnZXQgaHJlZl9iYXNlCisgICAgY29uc3QgY2hhciAqaHJlZl9iYXNlX2VuZCA9IHN0cnJjaHIoY29kZWNzX3htbCwgJy8nKTsKKyAgICBpZiAoaHJlZl9iYXNlX2VuZCAhPSBudWxscHRyKSB7CisgICAgICAgIG1IcmVmQmFzZSA9IHN0ZDo6c3RyaW5nKGNvZGVjc194bWwsIGhyZWZfYmFzZV9lbmQgLSBjb2RlY3NfeG1sICsgMSk7CisgICAgfQorCisgICAgbVBhcnNpbmdTdGF0dXMgPSBPSzsgLy8ga2VlcGluZyB0aGlzIGhlcmUgZm9yIHNhZmV0eQorICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fVE9QTEVWRUw7CisKKyAgICBwYXJzZVhNTEZpbGUoY29kZWNzX3htbCk7CisKKyAgICBpZiAobVBhcnNpbmdTdGF0dXMgIT0gT0spIHsKKyAgICAgICAgQUxPR1coInBhcnNlVG9wTGV2ZWxYTUxGaWxlKCVzKSBmYWlsZWQiLCBjb2RlY3NfeG1sKTsKKyAgICAgICAgaWYgKGlnbm9yZV9lcnJvcnMpIHsKKyAgICAgICAgICAgIG1QYXJzaW5nU3RhdHVzID0gT0s7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbUNvZGVjTWFwLmNsZWFyKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK01lZGlhQ29kZWNzWG1sUGFyc2VyOjp+TWVkaWFDb2RlY3NYbWxQYXJzZXIoKSB7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OnBhcnNlWE1MRmlsZShjb25zdCBjaGFyICpwYXRoKSB7CisgICAgRklMRSAqZmlsZSA9IGZvcGVuKHBhdGgsICJyIik7CisKKyAgICBpZiAoZmlsZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCJ1bmFibGUgdG8gb3BlbiBtZWRpYSBjb2RlY3MgY29uZmlndXJhdGlvbiB4bWwgZmlsZTogJXMiLCBwYXRoKTsKKyAgICAgICAgbVBhcnNpbmdTdGF0dXMgPSBOQU1FX05PVF9GT1VORDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFhNTF9QYXJzZXIgcGFyc2VyID0gOjpYTUxfUGFyc2VyQ3JlYXRlKG51bGxwdHIpOworICAgIExPR19GQVRBTF9JRihwYXJzZXIgPT0gbnVsbHB0ciwgIlhNTF9NZWRpYUNvZGVjc1htbFBhcnNlckNyZWF0ZSgpIGZhaWxlZC4iKTsKKworICAgIDo6WE1MX1NldFVzZXJEYXRhKHBhcnNlciwgdGhpcyk7CisgICAgOjpYTUxfU2V0RWxlbWVudEhhbmRsZXIoCisgICAgICAgICAgICBwYXJzZXIsIFN0YXJ0RWxlbWVudEhhbmRsZXJXcmFwcGVyLCBFbmRFbGVtZW50SGFuZGxlcldyYXBwZXIpOworCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgQlVGRl9TSVpFID0gNTEyOworICAgIHdoaWxlIChtUGFyc2luZ1N0YXR1cyA9PSBPSykgeworICAgICAgICB2b2lkICpidWZmID0gOjpYTUxfR2V0QnVmZmVyKHBhcnNlciwgQlVGRl9TSVpFKTsKKyAgICAgICAgaWYgKGJ1ZmYgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCBpbiBjYWxsIHRvIFhNTF9HZXRCdWZmZXIoKSIpOworICAgICAgICAgICAgbVBhcnNpbmdTdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpbnQgYnl0ZXNfcmVhZCA9IDo6ZnJlYWQoYnVmZiwgMSwgQlVGRl9TSVpFLCBmaWxlKTsKKyAgICAgICAgaWYgKGJ5dGVzX3JlYWQgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIGluIGNhbGwgdG8gcmVhZCIpOworICAgICAgICAgICAgbVBhcnNpbmdTdGF0dXMgPSBFUlJPUl9JTzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgWE1MX1N0YXR1cyBzdGF0dXMgPSA6OlhNTF9QYXJzZUJ1ZmZlcihwYXJzZXIsIGJ5dGVzX3JlYWQsIGJ5dGVzX3JlYWQgPT0gMCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gWE1MX1NUQVRVU19PSykgeworICAgICAgICAgICAgQUxPR0UoIm1hbGZvcm1lZCAoJXMpIiwgOjpYTUxfRXJyb3JTdHJpbmcoOjpYTUxfR2V0RXJyb3JDb2RlKHBhcnNlcikpKTsKKyAgICAgICAgICAgIG1QYXJzaW5nU3RhdHVzID0gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYnl0ZXNfcmVhZCA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIDo6WE1MX1BhcnNlckZyZWUocGFyc2VyKTsKKworICAgIGZjbG9zZShmaWxlKTsKKyAgICBmaWxlID0gbnVsbHB0cjsKK30KKworLy8gc3RhdGljCit2b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpTdGFydEVsZW1lbnRIYW5kbGVyV3JhcHBlcigKKyAgICAgICAgdm9pZCAqbWUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiphdHRycykgeworICAgIHN0YXRpY19jYXN0PE1lZGlhQ29kZWNzWG1sUGFyc2VyKj4obWUpLT5zdGFydEVsZW1lbnRIYW5kbGVyKG5hbWUsIGF0dHJzKTsKK30KKworLy8gc3RhdGljCit2b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpFbmRFbGVtZW50SGFuZGxlcldyYXBwZXIodm9pZCAqbWUsIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICBzdGF0aWNfY2FzdDxNZWRpYUNvZGVjc1htbFBhcnNlcio+KG1lKS0+ZW5kRWxlbWVudEhhbmRsZXIobmFtZSk7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjppbmNsdWRlWE1MRmlsZShjb25zdCBjaGFyICoqYXR0cnMpIHsKKyAgICBjb25zdCBjaGFyICpocmVmID0gbnVsbHB0cjsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgd2hpbGUgKGF0dHJzW2ldICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKHN0ckVxKGF0dHJzW2ldLCAiaHJlZiIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBocmVmID0gYXR0cnNbaV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiaW5jbHVkZVhNTEZpbGU6IHVucmVjb2duaXplZCBhdHRyaWJ1dGU6ICVzIiwgYXR0cnNbaV0pOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKytpOworICAgIH0KKworICAgIC8vIEZvciBzZWN1cml0eSByZWFzb25zIGFuZCBmb3Igc2ltcGxpY2l0eSwgZmlsZSBuYW1lcyBjYW4gb25seSBjb250YWluCisgICAgLy8gW2EtekEtWjAtOV8uXSBhbmQgbXVzdCBzdGFydCB3aXRoICBtZWRpYV9jb2RlY3NfIGFuZCBlbmQgd2l0aCAueG1sCisgICAgZm9yIChpID0gMDsgaHJlZltpXSAhPSAnXDAnOyBpKyspIHsKKyAgICAgICAgaWYgKGhyZWZbaV0gPT0gJy4nIHx8IGhyZWZbaV0gPT0gJ18nIHx8CisgICAgICAgICAgICAgICAgKGhyZWZbaV0gPj0gJzAnICYmIGhyZWZbaV0gPD0gJzknKSB8fAorICAgICAgICAgICAgICAgIChocmVmW2ldID49ICdBJyAmJiBocmVmW2ldIDw9ICdaJykgfHwKKyAgICAgICAgICAgICAgICAoaHJlZltpXSA+PSAnYScgJiYgaHJlZltpXSA8PSAneicpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBBTE9HRSgiaW52YWxpZCBpbmNsdWRlIGZpbGUgbmFtZTogJXMiLCBocmVmKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgZmlsZW5hbWUgPSBocmVmOworICAgIGlmIChmaWxlbmFtZS5jb21wYXJlKDAsIDEzLCAibWVkaWFfY29kZWNzXyIpICE9IDAgfHwKKyAgICAgICAgICAgIGZpbGVuYW1lLmNvbXBhcmUoZmlsZW5hbWUuc2l6ZSgpIC0gNCwgNCwgIi54bWwiKSAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJpbnZhbGlkIGluY2x1ZGUgZmlsZSBuYW1lOiAlcyIsIGhyZWYpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgZmlsZW5hbWUuaW5zZXJ0KDAsIG1IcmVmQmFzZSk7CisKKyAgICBwYXJzZVhNTEZpbGUoZmlsZW5hbWUuY19zdHIoKSk7CisgICAgcmV0dXJuIG1QYXJzaW5nU3RhdHVzOworfQorCit2b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpzdGFydEVsZW1lbnRIYW5kbGVyKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cnMpIHsKKyAgICBpZiAobVBhcnNpbmdTdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgaW5UeXBlID0gdHJ1ZTsKKworICAgIGlmIChzdHJFcShuYW1lLCAiSW5jbHVkZSIpKSB7CisgICAgICAgIG1QYXJzaW5nU3RhdHVzID0gaW5jbHVkZVhNTEZpbGUoYXR0cnMpOworICAgICAgICBpZiAobVBhcnNpbmdTdGF0dXMgPT0gT0spIHsKKyAgICAgICAgICAgIG1TZWN0aW9uU3RhY2sucHVzaF9iYWNrKG1DdXJyZW50U2VjdGlvbik7CisgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0lOQ0xVREU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN3aXRjaCAobUN1cnJlbnRTZWN0aW9uKSB7CisgICAgICAgIGNhc2UgU0VDVElPTl9UT1BMRVZFTDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJEZWNvZGVycyIpKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9ERUNPREVSUzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEobmFtZSwgIkVuY29kZXJzIikpIHsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0VOQ09ERVJTOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShuYW1lLCAiU2V0dGluZ3MiKSkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fU0VUVElOR1M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VDVElPTl9TRVRUSU5HUzoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJTZXR0aW5nIikpIHsKKyAgICAgICAgICAgICAgICBtUGFyc2luZ1N0YXR1cyA9IGFkZFNldHRpbmdGcm9tQXR0cmlidXRlcyhhdHRycyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSUzoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJNZWRpYUNvZGVjIikpIHsKKyAgICAgICAgICAgICAgICBtUGFyc2luZ1N0YXR1cyA9CisgICAgICAgICAgICAgICAgICAgIGFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlcyhmYWxzZSAvKiBlbmNvZGVyICovLCBhdHRycyk7CisKKyAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0RFQ09ERVI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSUzoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJNZWRpYUNvZGVjIikpIHsKKyAgICAgICAgICAgICAgICBtUGFyc2luZ1N0YXR1cyA9CisgICAgICAgICAgICAgICAgICAgIGFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlcyh0cnVlIC8qIGVuY29kZXIgKi8sIGF0dHJzKTsKKworICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fRU5DT0RFUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTRUNUSU9OX0RFQ09ERVI6CisgICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RyRXEobmFtZSwgIlF1aXJrIikpIHsKKyAgICAgICAgICAgICAgICBtUGFyc2luZ1N0YXR1cyA9IGFkZFF1aXJrKGF0dHJzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEobmFtZSwgIlR5cGUiKSkgeworICAgICAgICAgICAgICAgIG1QYXJzaW5nU3RhdHVzID0gYWRkVHlwZUZyb21BdHRyaWJ1dGVzKGF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgKG1DdXJyZW50U2VjdGlvbiA9PSBTRUNUSU9OX0VOQ09ERVIpKTsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgKG1DdXJyZW50U2VjdGlvbiA9PSBTRUNUSU9OX0RFQ09ERVIgPworICAgICAgICAgICAgICAgICAgICAgICAgU0VDVElPTl9ERUNPREVSX1RZUEUgOiBTRUNUSU9OX0VOQ09ERVJfVFlQRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW5UeXBlID0gZmFsc2U7CisgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorCisgICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSX1RZUEU6CisgICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSX1RZUEU6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZSBsaW1pdHMgYW5kIGZlYXR1cmVzIHNwZWNpZmllZCBvdXRzaWRlIG9mIHR5cGUKKyAgICAgICAgICAgIGJvb2wgb3V0c2lkZSA9ICFpblR5cGUgJiYKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUeXBlID09IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmVuZCgpOworICAgICAgICAgICAgaWYgKG91dHNpZGUgJiYKKyAgICAgICAgICAgICAgICAgICAgKHN0ckVxKG5hbWUsICJMaW1pdCIpIHx8IHN0ckVxKG5hbWUsICJGZWF0dXJlIikpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nICVzIHNwZWNpZmllZCBvdXRzaWRlIG9mIGEgVHlwZSIsIG5hbWUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShuYW1lLCAiTGltaXQiKSkgeworICAgICAgICAgICAgICAgIG1QYXJzaW5nU3RhdHVzID0gYWRkTGltaXQoYXR0cnMpOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShuYW1lLCAiRmVhdHVyZSIpKSB7CisgICAgICAgICAgICAgICAgbVBhcnNpbmdTdGF0dXMgPSBhZGRGZWF0dXJlKGF0dHJzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworfQorCit2b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjplbmRFbGVtZW50SGFuZGxlcihjb25zdCBjaGFyICpuYW1lKSB7CisgICAgaWYgKG1QYXJzaW5nU3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1DdXJyZW50U2VjdGlvbikgeworICAgICAgICBjYXNlIFNFQ1RJT05fU0VUVElOR1M6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiU2V0dGluZ3MiKSkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fVE9QTEVWRUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSUzoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJEZWNvZGVycyIpKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9UT1BMRVZFTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTRUNUSU9OX0VOQ09ERVJTOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RyRXEobmFtZSwgIkVuY29kZXJzIikpIHsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX1RPUExFVkVMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNFQ1RJT05fREVDT0RFUl9UWVBFOgorICAgICAgICBjYXNlIFNFQ1RJT05fRU5DT0RFUl9UWVBFOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RyRXEobmFtZSwgIlR5cGUiKSkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9CisgICAgICAgICAgICAgICAgICAgICAgICAobUN1cnJlbnRTZWN0aW9uID09IFNFQ1RJT05fREVDT0RFUl9UWVBFID8KKyAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RJT05fREVDT0RFUiA6IFNFQ1RJT05fRU5DT0RFUik7CisKKyAgICAgICAgICAgICAgICBtQ3VycmVudFR5cGUgPSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5lbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTRUNUSU9OX0RFQ09ERVI6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiTWVkaWFDb2RlYyIpKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9ERUNPREVSUzsKKyAgICAgICAgICAgICAgICBtQ3VycmVudE5hbWUuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTRUNUSU9OX0VOQ09ERVI6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiTWVkaWFDb2RlYyIpKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9FTkNPREVSUzsKKyAgICAgICAgICAgICAgICBtQ3VycmVudE5hbWUuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTRUNUSU9OX0lOQ0xVREU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiSW5jbHVkZSIpICYmIChtU2VjdGlvblN0YWNrLnNpemUoKSA+IDApKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gbVNlY3Rpb25TdGFjay5iYWNrKCk7CisgICAgICAgICAgICAgICAgbVNlY3Rpb25TdGFjay5wb3BfYmFjaygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjphZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXMoY29uc3QgY2hhciAqKmF0dHJzKSB7CisgICAgY29uc3QgY2hhciAqbmFtZSA9IG51bGxwdHI7CisgICAgY29uc3QgY2hhciAqdmFsdWUgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIgKnVwZGF0ZSA9IG51bGxwdHI7CisKKyAgICBzaXplX3QgaSA9IDA7CisgICAgd2hpbGUgKGF0dHJzW2ldICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKHN0ckVxKGF0dHJzW2ldLCAibmFtZSIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZFNldHRpbmdGcm9tQXR0cmlidXRlczogbmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuYW1lID0gYXR0cnNbaV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJ2YWx1ZSIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZFNldHRpbmdGcm9tQXR0cmlidXRlczogdmFsdWUgaXMgbnVsbCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsdWUgPSBhdHRyc1tpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInVwZGF0ZSIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZFNldHRpbmdGcm9tQXR0cmlidXRlczogdXBkYXRlIGlzIG51bGwiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwZGF0ZSA9IGF0dHJzW2ldOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoImFkZFNldHRpbmdGcm9tQXR0cmlidXRlczogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJXMiLCBhdHRyc1tpXSk7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICArK2k7CisgICAgfQorCisgICAgaWYgKG5hbWUgPT0gbnVsbHB0ciB8fCB2YWx1ZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXM6IG5hbWUgb3IgdmFsdWUgdW5zcGVjaWZpZWQiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLy8gQm9vbGVhbiB2YWx1ZXMgYXJlIGNvbnZlcnRlZCB0byAiMCIgb3IgIjEiLgorICAgIGlmIChzdHJIYXNQcmVmaXgobmFtZSwgInN1cHBvcnRzLSIpKSB7CisgICAgICAgIHZhbHVlID0gcGFyc2VCb29sZWFuKHZhbHVlKSA/ICIxIiA6ICIwIjsKKyAgICB9CisKKyAgICBtVXBkYXRlID0gKHVwZGF0ZSAhPSBudWxscHRyKSAmJiBwYXJzZUJvb2xlYW4odXBkYXRlKTsKKyAgICBhdXRvIGF0dHJpYnV0ZSA9IG1TZXJ2aWNlQXR0cmlidXRlTWFwLmZpbmQobmFtZSk7CisgICAgaWYgKGF0dHJpYnV0ZSA9PSBtU2VydmljZUF0dHJpYnV0ZU1hcC5lbmQoKSkgeyAvLyBOZXcgYXR0cmlidXRlIG5hbWUKKyAgICAgICAgaWYgKG1VcGRhdGUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXM6IHVwZGF0aW5nIG5vbi1leGlzdGluZyBzZXR0aW5nIik7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBtU2VydmljZUF0dHJpYnV0ZU1hcC5pbnNlcnQoQXR0cmlidXRlKG5hbWUsIHZhbHVlKSk7CisgICAgfSBlbHNlIHsgLy8gRXhpc3RpbmcgYXR0cmlidXRlIG5hbWUKKyAgICAgICAgaWYgKCFtVXBkYXRlKSB7CisgICAgICAgICAgICBBTE9HRSgiYWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzOiBhZGRpbmcgZXhpc3Rpbmcgc2V0dGluZyIpOworICAgICAgICB9CisgICAgICAgIGF0dHJpYnV0ZS0+c2Vjb25kID0gdmFsdWU7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6YWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzKAorICAgICAgICBib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKiphdHRycykgeworICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIgKnR5cGUgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIgKnVwZGF0ZSA9IG51bGxwdHI7CisKKyAgICBzaXplX3QgaSA9IDA7CisgICAgd2hpbGUgKGF0dHJzW2ldICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKHN0ckVxKGF0dHJzW2ldLCAibmFtZSIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogbmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuYW1lID0gYXR0cnNbaV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJ0eXBlIikpIHsKKyAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiB0eXBlIGlzIG51bGwiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHR5cGUgPSBhdHRyc1tpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInVwZGF0ZSIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogdXBkYXRlIGlzIG51bGwiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwZGF0ZSA9IGF0dHJzW2ldOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJXMiLCBhdHRyc1tpXSk7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICArK2k7CisgICAgfQorCisgICAgaWYgKG5hbWUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiBuYW1lIG5vdCBmb3VuZCIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBtVXBkYXRlID0gKHVwZGF0ZSAhPSBudWxscHRyKSAmJiBwYXJzZUJvb2xlYW4odXBkYXRlKTsKKyAgICBtQ3VycmVudENvZGVjID0gbUNvZGVjTWFwLmZpbmQobmFtZSk7CisgICAgaWYgKG1DdXJyZW50Q29kZWMgPT0gbUNvZGVjTWFwLmVuZCgpKSB7IC8vIE5ldyBjb2RlYyBuYW1lCisgICAgICAgIGlmIChtVXBkYXRlKSB7CisgICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiB1cGRhdGluZyBub24tZXhpc3RpbmcgY29kZWMiKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBjb2RlYyBpbiBtQ29kZWNNYXAKKyAgICAgICAgbUN1cnJlbnRDb2RlYyA9IG1Db2RlY01hcC5pbnNlcnQoCisgICAgICAgICAgICAgICAgQ29kZWMobmFtZSwgQ29kZWNQcm9wZXJ0aWVzKCkpKS5maXJzdDsKKyAgICAgICAgaWYgKHR5cGUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUN1cnJlbnRUeXBlID0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuaW5zZXJ0KAorICAgICAgICAgICAgICAgICAgICBUeXBlKHR5cGUsIEF0dHJpYnV0ZU1hcCgpKSkuZmlyc3Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQ3VycmVudFR5cGUgPSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5lbmQoKTsKKyAgICAgICAgfQorICAgICAgICBtQ3VycmVudENvZGVjLT5zZWNvbmQuaXNFbmNvZGVyID0gZW5jb2RlcjsKKyAgICAgICAgbUN1cnJlbnRDb2RlYy0+c2Vjb25kLm9yZGVyID0gbUNvZGVjQ291bnRlcisrOworICAgIH0gZWxzZSB7IC8vIEV4aXN0aW5nIGNvZGVjIG5hbWUKKyAgICAgICAgaWYgKCFtVXBkYXRlKSB7CisgICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiBhZGRpbmcgZXhpc3RpbmcgY29kZWMiKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1DdXJyZW50VHlwZSA9IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmZpbmQodHlwZSk7CisgICAgICAgICAgICBpZiAobUN1cnJlbnRUeXBlID09IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogdXBkYXRpbmcgbm9uLWV4aXN0aW5nIHR5cGUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGhhcHBlbiBvbmx5IHdoZW4gdGhlIGNvZGVjIGhhcyBhdCBtb3N0IG9uZSB0eXBlLgorICAgICAgICAgICAgbUN1cnJlbnRUeXBlID0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuYmVnaW4oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmFkZFF1aXJrKGNvbnN0IGNoYXIgKiphdHRycykgeworICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBudWxscHRyOworCisgICAgc2l6ZV90IGkgPSAwOworICAgIHdoaWxlIChhdHRyc1tpXSAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChzdHJFcShhdHRyc1tpXSwgIm5hbWUiKSkgeworICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRRdWlyazogbmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuYW1lID0gYXR0cnNbaV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiYWRkUXVpcms6IHVucmVjb2duaXplZCBhdHRyaWJ1dGU6ICVzIiwgYXR0cnNbaV0pOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKytpOworICAgIH0KKworICAgIGlmIChuYW1lID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoImFkZFF1aXJrOiBuYW1lIG5vdCBmb3VuZCIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBtQ3VycmVudENvZGVjLT5zZWNvbmQucXVpcmtTZXQuZW1wbGFjZShuYW1lKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjphZGRUeXBlRnJvbUF0dHJpYnV0ZXMoY29uc3QgY2hhciAqKmF0dHJzLCBib29sIGVuY29kZXIpIHsKKyAgICBjb25zdCBjaGFyICpuYW1lID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyICp1cGRhdGUgPSBudWxscHRyOworCisgICAgc2l6ZV90IGkgPSAwOworICAgIHdoaWxlIChhdHRyc1tpXSAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChzdHJFcShhdHRyc1tpXSwgIm5hbWUiKSkgeworICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRUeXBlRnJvbUF0dHJpYnV0ZXM6IG5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2ldOworICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAidXBkYXRlIikpIHsKKyAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYWRkVHlwZUZyb21BdHRyaWJ1dGVzOiB1cGRhdGUgaXMgbnVsbCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXBkYXRlID0gYXR0cnNbaV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiYWRkVHlwZUZyb21BdHRyaWJ1dGVzOiB1bnJlY29nbml6ZWQgYXR0cmlidXRlOiAlcyIsIGF0dHJzW2ldKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgICsraTsKKyAgICB9CisKKyAgICBpZiAobmFtZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIG1DdXJyZW50Q29kZWMtPnNlY29uZC5pc0VuY29kZXIgPSBlbmNvZGVyOworICAgIG1DdXJyZW50VHlwZSA9IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmZpbmQobmFtZSk7CisgICAgaWYgKCFtVXBkYXRlKSB7CisgICAgICAgIGlmIChtQ3VycmVudFR5cGUgIT0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJhZGRUeXBlRnJvbUF0dHJpYnV0ZXM6IHJlLWRlZmluaW5nIGV4aXN0aW5nIHR5cGUgd2l0aG91dCB1cGRhdGUiKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIG1DdXJyZW50VHlwZSA9IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmluc2VydCgKKyAgICAgICAgICAgICAgICBUeXBlKG5hbWUsIEF0dHJpYnV0ZU1hcCgpKSkuZmlyc3Q7CisgICAgfSBlbHNlIGlmIChtQ3VycmVudFR5cGUgPT0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoImFkZFR5cGVGcm9tQXR0cmlidXRlczogdXBkYXRpbmcgbm9uLWV4aXN0aW5nIHR5cGUiKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6YWRkTGltaXQoY29uc3QgY2hhciAqKmF0dHJzKSB7CisgICAgY29uc3QgY2hhciogYV9uYW1lID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyKiBhX2RlZmF1bHQgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIqIGFfaW4gPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIqIGFfbWF4ID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyKiBhX21pbiA9IG51bGxwdHI7CisgICAgY29uc3QgY2hhciogYV9yYW5nZSA9IG51bGxwdHI7CisgICAgY29uc3QgY2hhciogYV9yYW5nZXMgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIqIGFfc2NhbGUgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIqIGFfdmFsdWUgPSBudWxscHRyOworCisgICAgc2l6ZV90IGkgPSAwOworICAgIHdoaWxlIChhdHRyc1tpXSAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChzdHJFcShhdHRyc1tpXSwgIm5hbWUiKSkgeworICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogbmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhX25hbWUgPSBhdHRyc1tpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgImRlZmF1bHQiKSkgeworICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogZGVmYXVsdCBpcyBudWxsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhX2RlZmF1bHQgPSBhdHRyc1tpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgImluIikpIHsKKyAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IGluIGlzIG51bGwiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFfaW4gPSBhdHRyc1tpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgIm1heCIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZExpbWl0OiBtYXggaXMgbnVsbCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYV9tYXggPSBhdHRyc1tpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgIm1pbiIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZExpbWl0OiBtaW4gaXMgbnVsbCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYV9taW4gPSBhdHRyc1tpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInJhbmdlIikpIHsKKyAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IHJhbmdlIGlzIG51bGwiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFfcmFuZ2UgPSBhdHRyc1tpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInJhbmdlcyIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZExpbWl0OiByYW5nZXMgaXMgbnVsbCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYV9yYW5nZXMgPSBhdHRyc1tpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInNjYWxlIikpIHsKKyAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IHNjYWxlIGlzIG51bGwiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFfc2NhbGUgPSBhdHRyc1tpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInZhbHVlIikpIHsKKyAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IHZhbHVlIGlzIG51bGwiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFfdmFsdWUgPSBhdHRyc1tpXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogdW5yZWNvZ25pemVkIGxpbWl0OiAlcyIsIGF0dHJzW2ldKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgICsraTsKKyAgICB9CisKKyAgICBpZiAoYV9uYW1lID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoImxpbWl0IHdpdGggbm8gJ25hbWUnIGF0dHJpYnV0ZSIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICAvLyBzaXplLCBibG9ja3MsIGJpdHJhdGUsIGZyYW1lLXJhdGUsIGJsb2Nrcy1wZXItc2Vjb25kLCBhc3BlY3QtcmF0aW8sCisgICAgLy8gbWVhc3VyZWQtZnJhbWUtcmF0ZSwgbWVhc3VyZWQtYmxvY2tzLXBlci1zZWNvbmQ6IHJhbmdlCisgICAgLy8gcXVhbGl0eTogcmFuZ2UgKyBkZWZhdWx0ICsgW3NjYWxlXQorICAgIC8vIGNvbXBsZXhpdHk6IHJhbmdlICsgZGVmYXVsdAorICAgIGlmIChtQ3VycmVudFR5cGUgPT0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZW5kKCkpIHsKKyAgICAgICAgQUxPR1coImlnbm9yaW5nIG51bGwgdHlwZSIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgcmFuZ2U7CisgICAgaWYgKHN0ckVxKGFfbmFtZSwgImFzcGVjdC1yYXRpbyIpIHx8CisgICAgICAgICAgICBzdHJFcShhX25hbWUsICJiaXRyYXRlIikgfHwKKyAgICAgICAgICAgIHN0ckVxKGFfbmFtZSwgImJsb2NrLWNvdW50IikgfHwKKyAgICAgICAgICAgIHN0ckVxKGFfbmFtZSwgImJsb2Nrcy1wZXItc2Vjb25kIikgfHwKKyAgICAgICAgICAgIHN0ckVxKGFfbmFtZSwgImNvbXBsZXhpdHkiKSB8fAorICAgICAgICAgICAgc3RyRXEoYV9uYW1lLCAiZnJhbWUtcmF0ZSIpIHx8CisgICAgICAgICAgICBzdHJFcShhX25hbWUsICJxdWFsaXR5IikgfHwKKyAgICAgICAgICAgIHN0ckVxKGFfbmFtZSwgInNpemUiKSB8fAorICAgICAgICAgICAgc3RyRXEoYV9uYW1lLCAibWVhc3VyZWQtYmxvY2tzLXBlci1zZWNvbmQiKSB8fAorICAgICAgICAgICAgc3RySGFzUHJlZml4KGFfbmFtZSwgIm1lYXN1cmVkLWZyYW1lLXJhdGUtIikpIHsKKyAgICAgICAgLy8gInJhbmdlIiBpcyBzcGVjaWZpZWQgaW4gZXhhY3RseSBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtczoKKyAgICAgICAgLy8gMSkgbWluLW1heAorICAgICAgICAvLyAyKSB2YWx1ZS12YWx1ZQorICAgICAgICAvLyAzKSByYW5nZQorICAgICAgICBpZiAoYV9taW4gIT0gbnVsbHB0ciAmJiBhX21heCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBtaW4tbWF4CisgICAgICAgICAgICBpZiAoYV9yYW5nZSAhPSBudWxscHRyIHx8IGFfdmFsdWUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEVycm9yKGFfbmFtZSwgImhhcyAnbWluJyBhbmQgJ21heCcgYXMgd2VsbCBhcyAncmFuZ2UnIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIndmFsdWUnIGF0dHJpYnV0ZXMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJhbmdlID0gYV9taW47CisgICAgICAgICAgICByYW5nZSArPSAnLSc7CisgICAgICAgICAgICByYW5nZSArPSBhX21heDsKKyAgICAgICAgfSBlbHNlIGlmIChhX21pbiAhPSBudWxscHRyIHx8IGFfbWF4ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdEVycm9yKGFfbmFtZSwgImhhcyBvbmx5ICdtaW4nIG9yICdtYXgnIGF0dHJpYnV0ZSIpOworICAgICAgICB9IGVsc2UgaWYgKGFfdmFsdWUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gdmFsdWUtdmFsdWUKKyAgICAgICAgICAgIGlmIChhX3JhbmdlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGltaXRFcnJvcihhX25hbWUsICJoYXMgYm90aCAncmFuZ2UnIGFuZCAndmFsdWUnIGF0dHJpYnV0ZXMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJhbmdlID0gYV92YWx1ZTsKKyAgICAgICAgICAgIHJhbmdlICs9ICctJzsKKyAgICAgICAgICAgIHJhbmdlICs9IGFfdmFsdWU7CisgICAgICAgIH0gZWxzZSBpZiAoYV9yYW5nZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbGltaXRFcnJvcihhX25hbWUsICJ3aXRoIG5vICdyYW5nZScsICd2YWx1ZScgb3IgJ21pbicvJ21heCcgYXR0cmlidXRlcyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gcmFuZ2UKKyAgICAgICAgICAgIHJhbmdlID0gYV9yYW5nZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vICJhc3BlY3QtcmF0aW8iIHJlcXVpcmVzIHNvbWUgc3BlY2lhbCB0cmVhdG1lbnQuCisgICAgICAgIGlmIChzdHJFcShhX25hbWUsICJhc3BlY3QtcmF0aW8iKSkgeworICAgICAgICAgICAgLy8gImFzcGVjdC1yYXRpbyIgbXVzdCBoYXZlICJpbiIuCisgICAgICAgICAgICBpZiAoYV9pbiA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihhX25hbWUsICJpbiIsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vICJpbiIgbXVzdCBiZSBlaXRoZXIgInBpeGVscyIgb3IgImJsb2NrcyIuCisgICAgICAgICAgICBpZiAoIXN0ckVxKGFfaW4sICJwaXhlbHMiKSAmJiAhc3RyRXEoYV9pbiwgImJsb2NrcyIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0SW52YWxpZEF0dHIoYV9uYW1lLCAiaW4iLCBhX2luKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIG5hbWUgd2lsbCBiZSAicGl4ZWwtYXNwZWN0LXJhdGlvLXJhbmdlIiBvcgorICAgICAgICAgICAgLy8gImJsb2NrLWFzcGVjdC1yYXRpby1yYW5nZSIuCisgICAgICAgICAgICBtQ3VycmVudFR5cGUtPnNlY29uZFsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoYV9pbikuc3Vic3RyKDAsIHN0cmxlbihhX2luKSAtIDEpICsKKyAgICAgICAgICAgICAgICAgICAgIi1hc3BlY3QtcmF0aW8tcmFuZ2UiXSA9IHJhbmdlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRm9yIGV2ZXJ5dGhpbmcgZWxzZSAoYXBhcnQgZnJvbSAiYXNwZWN0LXJhdGlvIiksIHNpbXBseSBhcHBlbmQKKyAgICAgICAgICAgIC8vICItcmFuZ2UiIHRvIHRoZSBuYW1lIGZvciB0aGUgcmFuZ2UtdHlwZSBwcm9wZXJ0eS4KKyAgICAgICAgICAgIG1DdXJyZW50VHlwZS0+c2Vjb25kW3N0ZDo6c3RyaW5nKGFfbmFtZSkgKyAiLXJhbmdlIl0gPSByYW5nZTsKKworICAgICAgICAgICAgLy8gT25seSAicXVhbGl0eSIgbWF5IGhhdmUgInNjYWxlIi4KKyAgICAgICAgICAgIGlmICghc3RyRXEoYV9uYW1lLCAicXVhbGl0eSIpICYmIGFfc2NhbGUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAic2NhbGUiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYV9uYW1lLCAicXVhbGl0eSIpKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGRlZmF1bHQgdmFsdWUgb2YgInF1YWxpdHktc2NhbGUiIGlzICJsaW5lYXIiLgorICAgICAgICAgICAgICAgIG1DdXJyZW50VHlwZS0+c2Vjb25kWyJxdWFsaXR5LXNjYWxlIl0gPSBhX3NjYWxlID09IG51bGxwdHIgPworICAgICAgICAgICAgICAgICAgICAgICAgImxpbmVhciIgOiBhX3NjYWxlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAicXVhbGl0eSIgYW5kICJjb21wbGV4aXR5IiBtdXN0IGhhdmUgImRlZmF1bHQiLgorICAgICAgICAgICAgLy8gT3RoZXIgbGltaXRzIG11c3Qgbm90IGhhdmUgImRlZmF1bHQiLgorICAgICAgICAgICAgaWYgKHN0ckVxKGFfbmFtZSwgInF1YWxpdHkiKSB8fCBzdHJFcShhX25hbWUsICJjb21wbGV4aXR5IikpIHsKKyAgICAgICAgICAgICAgICBpZiAoYV9kZWZhdWx0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihhX25hbWUsICJkZWZhdWx0IiwgZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBuYW1lIHdpbGwgYmUgInF1YWxpdHktZGVmYXVsdCIgb3IgImNvbXBsZXhpdHktZGVmYXVsdCIuCisgICAgICAgICAgICAgICAgbUN1cnJlbnRUeXBlLT5zZWNvbmRbc3RkOjpzdHJpbmcoYV9uYW1lKSArICItZGVmYXVsdCJdID0gYV9kZWZhdWx0OworICAgICAgICAgICAgfSBlbHNlIGlmIChhX2RlZmF1bHQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAiZGVmYXVsdCIsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGFfZGVmYXVsdCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKGFfbmFtZSwgImRlZmF1bHQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYV9pbiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKGFfbmFtZSwgImluIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFfc2NhbGUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihhX25hbWUsICJzY2FsZSIpOworICAgICAgICB9CisgICAgICAgIGlmIChhX3JhbmdlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAicmFuZ2UiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYV9taW4gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihhX25hbWUsICJtaW4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhX21heCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyAibWF4IiBtdXN0IGV4aXN0IGlmIGFuZCBvbmx5IGlmIG5hbWUgaXMgImNoYW5uZWwtY291bnQiIG9yCisgICAgICAgICAgICAvLyAiY29uY3VycmVudC1pbnN0YW5jZXMiLgorICAgICAgICAgICAgLy8gIm1pbiIgaXMgbm90IG5jZXNzYXJ5LgorICAgICAgICAgICAgaWYgKHN0ckVxKGFfbmFtZSwgImNoYW5uZWwtY291bnQiKSB8fAorICAgICAgICAgICAgICAgICAgICBzdHJFcShhX25hbWUsICJjb25jdXJyZW50LWluc3RhbmNlcyIpKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRUeXBlLT5zZWNvbmRbc3RkOjpzdHJpbmcoIm1heC0iKSArIGFfbmFtZV0gPSBhX21heDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihhX25hbWUsICJtYXgiLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYV9uYW1lLCAiY2hhbm5lbC1jb3VudCIpIHx8CisgICAgICAgICAgICAgICAgc3RyRXEoYV9uYW1lLCAiY29uY3VycmVudC1pbnN0YW5jZXMiKSkgeworICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihhX25hbWUsICJtYXgiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhX3JhbmdlcyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyAicmFuZ2VzIiBtdXN0IGV4aXN0IGlmIGFuZCBvbmx5IGlmIG5hbWUgaXMgInNhbXBsZS1yYXRlIi4KKyAgICAgICAgICAgIGlmIChzdHJFcShhX25hbWUsICJzYW1wbGUtcmF0ZSIpKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRUeXBlLT5zZWNvbmRbInNhbXBsZS1yYXRlLXJhbmdlcyJdID0gYV9yYW5nZXM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAicmFuZ2VzIiwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGFfbmFtZSwgInNhbXBsZS1yYXRlIikpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAicmFuZ2VzIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYV92YWx1ZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyAidmFsdWUiIG11c3QgZXhpc3QgaWYgYW5kIG9ubHkgaWYgbmFtZSBpcyAiYWxpZ25tZW50IiBvcgorICAgICAgICAgICAgLy8gImJsb2NrLXNpemUiLgorICAgICAgICAgICAgaWYgKHN0ckVxKGFfbmFtZSwgImFsaWdubWVudCIpIHx8IHN0ckVxKGFfbmFtZSwgImJsb2NrLXNpemUiKSkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50VHlwZS0+c2Vjb25kW2FfbmFtZV0gPSBhX3ZhbHVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKGFfbmFtZSwgInZhbHVlIiwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGFfbmFtZSwgImFsaWdubWVudCIpIHx8IHN0ckVxKGFfbmFtZSwgImJsb2NrLXNpemUiKSkgeworICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihhX25hbWUsICJ2YWx1ZSIsIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6YWRkRmVhdHVyZShjb25zdCBjaGFyICoqYXR0cnMpIHsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgY29uc3QgY2hhciAqbmFtZSA9IG51bGxwdHI7CisgICAgaW50MzJfdCBvcHRpb25hbCA9IC0xOworICAgIGludDMyX3QgcmVxdWlyZWQgPSAtMTsKKyAgICBjb25zdCBjaGFyICp2YWx1ZSA9IG51bGxwdHI7CisKKyAgICB3aGlsZSAoYXR0cnNbaV0gIT0gbnVsbHB0cikgeworICAgICAgICBpZiAoc3RyRXEoYXR0cnNbaV0sICJuYW1lIikpIHsKKyAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYWRkRmVhdHVyZTogbmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuYW1lID0gYXR0cnNbaV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJvcHRpb25hbCIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZEZlYXR1cmU6IG9wdGlvbmFsIGlzIG51bGwiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wdGlvbmFsID0gcGFyc2VCb29sZWFuKGF0dHJzW2ldKSA/IDEgOiAwOworICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAicmVxdWlyZWQiKSkgeworICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRGZWF0dXJlOiByZXF1aXJlZCBpcyBudWxsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXF1aXJlZCA9IHBhcnNlQm9vbGVhbihhdHRyc1tpXSkgPyAxIDogMDsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInZhbHVlIikpIHsKKyAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYWRkRmVhdHVyZTogdmFsdWUgaXMgbnVsbCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsdWUgPSBhdHRyc1tpXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJhZGRGZWF0dXJlOiB1bnJlY29nbml6ZWQgYXR0cmlidXRlOiAlcyIsIGF0dHJzW2ldKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgICsraTsKKyAgICB9CisKKyAgICAvLyBFdmVyeSBmZWF0dXJlIG11c3QgaGF2ZSBhIG5hbWUuCisgICAgaWYgKG5hbWUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiZmVhdHVyZSB3aXRoIG5vICduYW1lJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKG1DdXJyZW50VHlwZSA9PSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5lbmQoKSkgeworICAgICAgICBBTE9HVygiaWdub3JpbmcgbnVsbCB0eXBlIik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBpZiAoKG9wdGlvbmFsICE9IC0xKSB8fCAocmVxdWlyZWQgIT0gLTEpKSB7CisgICAgICAgIGlmIChvcHRpb25hbCA9PSByZXF1aXJlZCkgeworICAgICAgICAgICAgQUxPR0UoImZlYXR1cmUgJyVzJyBpcyBib3RoL25laXRoZXIgb3B0aW9uYWwgYW5kIHJlcXVpcmVkIiwgbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKG9wdGlvbmFsID09IDEpIHx8IChyZXF1aXJlZCA9PSAxKSkgeworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZmVhdHVyZSAnJXMnIGNhbm5vdCBoYXZlIGV4dHJhICd2YWx1ZSciLCBuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DdXJyZW50VHlwZS0+c2Vjb25kW3N0ZDo6c3RyaW5nKCJmZWF0dXJlLSIpICsgbmFtZV0gPQorICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCA9PSAxID8gIjAiIDogIjEiOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgfQorICAgIG1DdXJyZW50VHlwZS0+c2Vjb25kW3N0ZDo6c3RyaW5nKCJmZWF0dXJlLSIpICsgbmFtZV0gPSB2YWx1ZSA9PSBudWxscHRyID8KKyAgICAgICAgICAgICIwIiA6IHZhbHVlOworICAgIHJldHVybiBPSzsKK30KKworY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkF0dHJpYnV0ZU1hcCYKKyAgICAgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdldFNlcnZpY2VBdHRyaWJ1dGVNYXAoKSBjb25zdCB7CisgICAgcmV0dXJuIG1TZXJ2aWNlQXR0cmlidXRlTWFwOworfQorCitjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Q29kZWNNYXAmCisgICAgICAgIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpnZXRDb2RlY01hcCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNvZGVjTWFwOworfQorCitjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Um9sZU1hcCYKKyAgICAgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdldFJvbGVNYXAoKSBjb25zdCB7CisgICAgaWYgKG1Sb2xlTWFwLmVtcHR5KCkpIHsKKyAgICAgICAgZ2VuZXJhdGVSb2xlTWFwKCk7CisgICAgfQorICAgIHJldHVybiBtUm9sZU1hcDsKK30KKworY29uc3QgY2hhciogTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdldENvbW1vblByZWZpeCgpIGNvbnN0IHsKKyAgICBpZiAobUNvbW1vblByZWZpeC5lbXB0eSgpKSB7CisgICAgICAgIGdlbmVyYXRlQ29tbW9uUHJlZml4KCk7CisgICAgfQorICAgIHJldHVybiBtQ29tbW9uUHJlZml4LmRhdGEoKTsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdldFBhcnNpbmdTdGF0dXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1QYXJzaW5nU3RhdHVzOworfQorCit2b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpnZW5lcmF0ZVJvbGVNYXAoKSBjb25zdCB7CisgICAgZm9yIChjb25zdCBhdXRvJiBjb2RlYyA6IG1Db2RlY01hcCkgeworICAgICAgICBjb25zdCBhdXRvJiBjb2RlY05hbWUgPSBjb2RlYy5maXJzdDsKKyAgICAgICAgYm9vbCBpc0VuY29kZXIgPSBjb2RlYy5zZWNvbmQuaXNFbmNvZGVyOworICAgICAgICBzaXplX3Qgb3JkZXIgPSBjb2RlYy5zZWNvbmQub3JkZXI7CisgICAgICAgIGNvbnN0IGF1dG8mIHR5cGVNYXAgPSBjb2RlYy5zZWNvbmQudHlwZU1hcDsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiB0eXBlIDogdHlwZU1hcCkgeworICAgICAgICAgICAgY29uc3QgYXV0byYgdHlwZU5hbWUgPSB0eXBlLmZpcnN0OworICAgICAgICAgICAgY29uc3QgY2hhciogcm9sZU5hbWUgPSBHZXRDb21wb25lbnRSb2xlKGlzRW5jb2RlciwgdHlwZU5hbWUuZGF0YSgpKTsKKyAgICAgICAgICAgIGlmIChyb2xlTmFtZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBmaW5kIHRoZSByb2xlIGZvciAlcyBvZiB0eXBlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzRW5jb2RlciA/ICJhbiBlbmNvZGVyIiA6ICJhIGRlY29kZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU5hbWUuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IGF1dG8mIHR5cGVBdHRyaWJ1dGVNYXAgPSB0eXBlLnNlY29uZDsKKworICAgICAgICAgICAgYXV0byByb2xlSXRlcmF0b3IgPSBtUm9sZU1hcC5maW5kKHJvbGVOYW1lKTsKKyAgICAgICAgICAgIHN0ZDo6bXVsdGltYXA8c2l6ZV90LCBOb2RlSW5mbz4qIG5vZGVMaXN0OworICAgICAgICAgICAgaWYgKHJvbGVJdGVyYXRvciA9PSBtUm9sZU1hcC5lbmQoKSkgeworICAgICAgICAgICAgICAgIFJvbGVQcm9wZXJ0aWVzIHJvbGVQcm9wZXJ0aWVzOworICAgICAgICAgICAgICAgIHJvbGVQcm9wZXJ0aWVzLnR5cGUgPSB0eXBlTmFtZTsKKyAgICAgICAgICAgICAgICByb2xlUHJvcGVydGllcy5pc0VuY29kZXIgPSBpc0VuY29kZXI7CisgICAgICAgICAgICAgICAgYXV0byBpbnNlcnRSZXN1bHQgPSBtUm9sZU1hcC5pbnNlcnQoCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihyb2xlTmFtZSwgcm9sZVByb3BlcnRpZXMpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWluc2VydFJlc3VsdC5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBhZGQgcm9sZSAlcyIsIHJvbGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5vZGVMaXN0ID0gJmluc2VydFJlc3VsdC5maXJzdC0+c2Vjb25kLm5vZGVMaXN0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocm9sZUl0ZXJhdG9yLT5zZWNvbmQudHlwZSAhPSB0eXBlTmFtZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiUm9sZSAlcyBoYXMgbWlzbWF0Y2hpbmcgdHlwZXM6ICVzIGFuZCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZUl0ZXJhdG9yLT5zZWNvbmQudHlwZS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU5hbWUuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyb2xlSXRlcmF0b3ItPnNlY29uZC5pc0VuY29kZXIgIT0gaXNFbmNvZGVyKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJSb2xlICVzIGNhbm5vdCBiZSBib3RoIGFuIGVuY29kZXIgYW5kIGEgZGVjb2RlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZU5hbWUpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbm9kZUxpc3QgPSAmcm9sZUl0ZXJhdG9yLT5zZWNvbmQubm9kZUxpc3Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE5vZGVJbmZvIG5vZGVJbmZvOworICAgICAgICAgICAgbm9kZUluZm8ubmFtZSA9IGNvZGVjTmFtZTsKKyAgICAgICAgICAgIG5vZGVJbmZvLmF0dHJpYnV0ZUxpc3QucmVzZXJ2ZSh0eXBlQXR0cmlidXRlTWFwLnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGF0dHJpYnV0ZSA6IHR5cGVBdHRyaWJ1dGVNYXApIHsKKyAgICAgICAgICAgICAgICBub2RlSW5mby5hdHRyaWJ1dGVMaXN0LnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXthdHRyaWJ1dGUuZmlyc3QsIGF0dHJpYnV0ZS5zZWNvbmR9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGVMaXN0LT5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShvcmRlciksIHN0ZDo6bW92ZShub2RlSW5mbykpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Z2VuZXJhdGVDb21tb25QcmVmaXgoKSBjb25zdCB7CisgICAgaWYgKG1Db2RlY01hcC5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYXV0byBpID0gbUNvZGVjTWFwLmNiZWdpbigpOworICAgIGF1dG8gZmlyc3QgPSBpLT5maXJzdC5jYmVnaW4oKTsKKyAgICBhdXRvIGxhc3QgPSBpLT5maXJzdC5jZW5kKCk7CisgICAgZm9yICgrK2k7IGkgIT0gbUNvZGVjTWFwLmNlbmQoKTsgKytpKSB7CisgICAgICAgIGxhc3QgPSBzdGQ6Om1pc21hdGNoKAorICAgICAgICAgICAgICAgIGZpcnN0LCBsYXN0LCBpLT5maXJzdC5jYmVnaW4oKSwgaS0+Zmlyc3QuY2VuZCgpKS5maXJzdDsKKyAgICB9CisgICAgbUNvbW1vblByZWZpeC5pbnNlcnQobUNvbW1vblByZWZpeC5iZWdpbigpLCBmaXJzdCwgbGFzdCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzY5ZTUyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmgKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfU1RBR0VGUklHSFRfWE1MUEFSU0VSX0hfCisjZGVmaW5lIE1FRElBX1NUQUdFRlJJR0hUX1hNTFBBUlNFUl9IXworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lZGlhQ29kZWNzWG1sUGFyc2VyIHsKK3B1YmxpYzoKKworICAgIC8vIFRyZWJsaXplZCBtZWRpYSBjb2RlYyBsaXN0IHdpbGwgYmUgbG9jYXRlZCBpbiAvb2RtL2V0YyBvciAvdmVuZG9yL2V0Yy4KKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIgY29uc3QqIGRlZmF1bHRTZWFyY2hEaXJzW10gPQorICAgICAgICAgICAgeyIvb2RtL2V0YyIsICIvdmVuZG9yL2V0YyIsICIvZXRjIiwgbnVsbHB0cn07CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGNvbnN0KiBkZWZhdWx0TWFpblhtbE5hbWUgPQorICAgICAgICAgICAgIm1lZGlhX2NvZGVjcy54bWwiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBjb25zdCogZGVmYXVsdFBlcmZvcm1hbmNlWG1sTmFtZSA9CisgICAgICAgICAgICAibWVkaWFfY29kZWNzX3BlcmZvcm1hbmNlLnhtbCI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGNvbnN0KiBkZWZhdWx0UHJvZmlsaW5nUmVzdWx0c1htbFBhdGggPQorICAgICAgICAgICAgIi9kYXRhL21pc2MvbWVkaWEvbWVkaWFfY29kZWNzX3Byb2ZpbGluZ19yZXN1bHRzLnhtbCI7CisKKyAgICBNZWRpYUNvZGVjc1htbFBhcnNlcigKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0KiBzZWFyY2hEaXJzID0gZGVmYXVsdFNlYXJjaERpcnMsCisgICAgICAgICAgICBjb25zdCBjaGFyKiBtYWluWG1sTmFtZSA9IGRlZmF1bHRNYWluWG1sTmFtZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBlcmZvcm1hbmNlWG1sTmFtZSA9IGRlZmF1bHRQZXJmb3JtYW5jZVhtbE5hbWUsCisgICAgICAgICAgICBjb25zdCBjaGFyKiBwcm9maWxpbmdSZXN1bHRzWG1sUGF0aCA9IGRlZmF1bHRQcm9maWxpbmdSZXN1bHRzWG1sUGF0aCk7CisgICAgfk1lZGlhQ29kZWNzWG1sUGFyc2VyKCk7CisKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IEF0dHJpYnV0ZTsKKyAgICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gQXR0cmlidXRlTWFwOworCisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIEF0dHJpYnV0ZU1hcD4gVHlwZTsKKyAgICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBBdHRyaWJ1dGVNYXA+IFR5cGVNYXA7CisKKyAgICB0eXBlZGVmIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBRdWlya1NldDsKKworICAgIC8qKgorICAgICAqIFByb3BlcnRpZXMgb2YgYSBjb2RlYyAobm9kZSkKKyAgICAgKi8KKyAgICBzdHJ1Y3QgQ29kZWNQcm9wZXJ0aWVzIHsKKyAgICAgICAgYm9vbCBpc0VuY29kZXI7ICAgIC8vLzwgV2hldGhlciB0aGlzIGNvZGVjIGlzIGFuIGVuY29kZXIgb3IgYSBkZWNvZGVyCisgICAgICAgIHNpemVfdCBvcmRlcjsgICAgICAvLy88IE9yZGVyIG9mIGFwcGVhcmFuY2UgaW4gdGhlIGZpbGUgKHN0YXJ0aW5nIGZyb20gMCkKKyAgICAgICAgUXVpcmtTZXQgcXVpcmtTZXQ7IC8vLzwgU2V0IG9mIHF1aXJrcyByZXF1ZXN0ZWQgYnkgdGhpcyBjb2RlYworICAgICAgICBUeXBlTWFwIHR5cGVNYXA7ICAgLy8vPCBNYXAgb2YgdHlwZXMgc3VwcG9ydGVkIGJ5IHRoaXMgY29kZWMKKyAgICB9OworCisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIENvZGVjUHJvcGVydGllcz4gQ29kZWM7CisgICAgdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgQ29kZWNQcm9wZXJ0aWVzPiBDb2RlY01hcDsKKworICAgIC8qKgorICAgICAqIFByb3BlcnRpZXMgb2YgYSBub2RlIChmb3IgSU9teFN0b3JlKQorICAgICAqLworICAgIHN0cnVjdCBOb2RlSW5mbyB7CisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgICAgIHN0ZDo6dmVjdG9yPEF0dHJpYnV0ZT4gYXR0cmlidXRlTGlzdDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogUHJvcGVydGllcyBvZiBhIHJvbGUgKGZvciBJT214U3RvcmUpCisgICAgICovCisgICAgc3RydWN0IFJvbGVQcm9wZXJ0aWVzIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgdHlwZTsKKyAgICAgICAgYm9vbCBpc0VuY29kZXI7CisgICAgICAgIHN0ZDo6bXVsdGltYXA8c2l6ZV90LCBOb2RlSW5mbz4gbm9kZUxpc3Q7CisgICAgfTsKKworICAgIHR5cGVkZWYgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBSb2xlUHJvcGVydGllcz4gUm9sZTsKKyAgICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBSb2xlUHJvcGVydGllcz4gUm9sZU1hcDsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIG1hcCBmb3IgYXR0cmlidXRlcyB0aGF0IGFyZSBzZXJ2aWNlLXNwZWNpZmljLgorICAgICAqLworICAgIGNvbnN0IEF0dHJpYnV0ZU1hcCYgZ2V0U2VydmljZUF0dHJpYnV0ZU1hcCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbWFwIGZvciBjb2RlY3MgYW5kIHRoZWlyIHByb3BlcnRpZXMuCisgICAgICovCisgICAgY29uc3QgQ29kZWNNYXAmIGdldENvZGVjTWFwKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBtYXAgZm9yIHJvbGVzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLgorICAgICAqIFRoaXMgbWFwIGlzIGdlbmVyYXRlZCBmcm9tIHRoZSBDb2RlY01hcC4KKyAgICAgKi8KKyAgICBjb25zdCBSb2xlTWFwJiBnZXRSb2xlTWFwKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBjb21tb24gcHJlZml4IG9mIGFsbCBub2RlIG5hbWVzLgorICAgICAqCisgICAgICogVGhlIHByZWZpeCBpcyBub3QgcHJvdmlkZWQgaW4gdGhlIHhtbCwgc28gaXQgaGFzIHRvIGJlIGNvbXB1dGVkIGJ5IHRha2luZworICAgICAqIHRoZSBsb25nZXN0IGNvbW1vbiBwcmVmaXggb2YgYWxsIG5vZGUgbmFtZXMuCisgICAgICovCisgICAgY29uc3QgY2hhciogZ2V0Q29tbW9uUHJlZml4KCkgY29uc3Q7CisKKyAgICBzdGF0dXNfdCBnZXRQYXJzaW5nU3RhdHVzKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZW51bSBTZWN0aW9uIHsKKyAgICAgICAgU0VDVElPTl9UT1BMRVZFTCwKKyAgICAgICAgU0VDVElPTl9TRVRUSU5HUywKKyAgICAgICAgU0VDVElPTl9ERUNPREVSUywKKyAgICAgICAgU0VDVElPTl9ERUNPREVSLAorICAgICAgICBTRUNUSU9OX0RFQ09ERVJfVFlQRSwKKyAgICAgICAgU0VDVElPTl9FTkNPREVSUywKKyAgICAgICAgU0VDVElPTl9FTkNPREVSLAorICAgICAgICBTRUNUSU9OX0VOQ09ERVJfVFlQRSwKKyAgICAgICAgU0VDVElPTl9JTkNMVURFLAorICAgIH07CisKKyAgICBzdGF0dXNfdCBtUGFyc2luZ1N0YXR1czsKKyAgICBTZWN0aW9uIG1DdXJyZW50U2VjdGlvbjsKKyAgICBib29sIG1VcGRhdGU7CisgICAgc3RkOjp2ZWN0b3I8U2VjdGlvbj4gbVNlY3Rpb25TdGFjazsKKyAgICBzdGQ6OnN0cmluZyBtSHJlZkJhc2U7CisKKyAgICAvLyBTZXJ2aWNlIGF0dHJpYnV0ZXMKKyAgICBBdHRyaWJ1dGVNYXAgbVNlcnZpY2VBdHRyaWJ1dGVNYXA7CisKKyAgICAvLyBDb2RlYyBhdHRyaWJ1dGVzCisgICAgc3RkOjpzdHJpbmcgbUN1cnJlbnROYW1lOworICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBtQ29kZWNTZXQ7CisgICAgQ29kZWMgbUNvZGVjTGlzdFRlbXBbMjA0OF07CisgICAgQ29kZWNNYXAgbUNvZGVjTWFwOworICAgIHNpemVfdCBtQ29kZWNDb3VudGVyOworICAgIENvZGVjTWFwOjppdGVyYXRvciBtQ3VycmVudENvZGVjOworICAgIFR5cGVNYXA6Oml0ZXJhdG9yIG1DdXJyZW50VHlwZTsKKworICAgIC8vIFJvbGUgbWFwCisgICAgbXV0YWJsZSBSb2xlTWFwIG1Sb2xlTWFwOworCisgICAgLy8gQ29tcHV0ZWQgbG9uZ2VzdCBjb21tb24gcHJlZml4CisgICAgbXV0YWJsZSBzdGQ6OnN0cmluZyBtQ29tbW9uUHJlZml4OworCisgICAgYm9vbCBwYXJzZVRvcExldmVsWE1MRmlsZShjb25zdCBjaGFyICpwYXRoLCBib29sIGlnbm9yZV9lcnJvcnMgPSBmYWxzZSk7CisKKyAgICB2b2lkIHBhcnNlWE1MRmlsZShjb25zdCBjaGFyICpwYXRoKTsKKworICAgIHN0YXRpYyB2b2lkIFN0YXJ0RWxlbWVudEhhbmRsZXJXcmFwcGVyKAorICAgICAgICAgICAgdm9pZCAqbWUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiphdHRycyk7CisKKyAgICBzdGF0aWMgdm9pZCBFbmRFbGVtZW50SGFuZGxlcldyYXBwZXIodm9pZCAqbWUsIGNvbnN0IGNoYXIgKm5hbWUpOworCisgICAgdm9pZCBzdGFydEVsZW1lbnRIYW5kbGVyKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiphdHRycyk7CisgICAgdm9pZCBlbmRFbGVtZW50SGFuZGxlcihjb25zdCBjaGFyICpuYW1lKTsKKworICAgIHN0YXR1c190IGluY2x1ZGVYTUxGaWxlKGNvbnN0IGNoYXIgKiphdHRycyk7CisgICAgc3RhdHVzX3QgYWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzKGNvbnN0IGNoYXIgKiphdHRycyk7CisgICAgc3RhdHVzX3QgYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzKGJvb2wgZW5jb2RlciwgY29uc3QgY2hhciAqKmF0dHJzKTsKKyAgICB2b2lkIGFkZE1lZGlhQ29kZWMoYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgY29uc3QgY2hhciAqdHlwZSA9IG51bGxwdHIpOworCisgICAgc3RhdHVzX3QgYWRkUXVpcmsoY29uc3QgY2hhciAqKmF0dHJzKTsKKyAgICBzdGF0dXNfdCBhZGRUeXBlRnJvbUF0dHJpYnV0ZXMoY29uc3QgY2hhciAqKmF0dHJzLCBib29sIGVuY29kZXIpOworICAgIHN0YXR1c190IGFkZExpbWl0KGNvbnN0IGNoYXIgKiphdHRycyk7CisgICAgc3RhdHVzX3QgYWRkRmVhdHVyZShjb25zdCBjaGFyICoqYXR0cnMpOworICAgIHZvaWQgYWRkVHlwZShjb25zdCBjaGFyICpuYW1lKTsKKworICAgIHZvaWQgZ2VuZXJhdGVSb2xlTWFwKCkgY29uc3Q7CisgICAgdm9pZCBnZW5lcmF0ZUNvbW1vblByZWZpeCgpIGNvbnN0OworCisgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXIoY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXImKSA9IGRlbGV0ZTsKKyAgICBNZWRpYUNvZGVjc1htbFBhcnNlciYgb3BlcmF0b3I9KGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyJikgPSBkZWxldGU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBNRURJQV9TVEFHRUZSSUdIVF9YTUxQQVJTRVJfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERlYnVnLmNwcCBiL21lZGlhL210cC9NdHBEZWJ1Zy5jcHAKaW5kZXggMWMwNGJjZi4uZDJlZGUxYyAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cERlYnVnLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwRGVidWcuY3BwCkBAIC0xMDIsNiArMTAyLDcgQEAKICAgICB7ICJNVFBfRk9STUFUX0pQMiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MEYgfSwKICAgICB7ICJNVFBfRk9STUFUX0pQWCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MTAgfSwKICAgICB7ICJNVFBfRk9STUFUX0RORyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MTEgfSwKKyAgICB7ICJNVFBfRk9STUFUX0hFSUYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MTIgfSwKICAgICB7ICJNVFBfRk9STUFUX1VOREVGSU5FRF9GSVJNV0FSRSIsICAgICAgICAgICAgICAweEI4MDIgfSwKICAgICB7ICJNVFBfRk9STUFUX1dJTkRPV1NfSU1BR0VfRk9STUFUIiwgICAgICAgICAgICAweEI4ODEgfSwKICAgICB7ICJNVFBfRk9STUFUX1VOREVGSU5FRF9BVURJTyIsICAgICAgICAgICAgICAgICAweEI5MDAgfSwKZGlmZiAtLWdpdCBhL21lZGlhL210cC9tdHAuaCBiL21lZGlhL210cC9tdHAuaAppbmRleCA2NDQ3ODBmLi4xYzc4MjlkIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvbXRwLmgKKysrIGIvbWVkaWEvbXRwL210cC5oCkBAIC05NCw2ICs5NCw3IEBACiAjZGVmaW5lIE1UUF9GT1JNQVRfSlAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwRiAgIC8vIEpQRUcyMDAwIEJhc2VsaW5lIEZpbGUgRm9ybWF0CiAjZGVmaW5lIE1UUF9GT1JNQVRfSlBYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgxMCAgIC8vIEpQRUcyMDAwIEV4dGVuZGVkIEZpbGUgRm9ybWF0CiAjZGVmaW5lIE1UUF9GT1JNQVRfRE5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgxMSAgIC8vIERpZ2l0YWwgTmVnYXRpdmUKKyNkZWZpbmUgTVRQX0ZPUk1BVF9IRUlGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODEyICAgLy8gSEVJRiBpbWFnZXMKICNkZWZpbmUgTVRQX0ZPUk1BVF9VTkRFRklORURfRklSTVdBUkUgICAgICAgICAgICAgICAgICAgMHhCODAyCiAjZGVmaW5lIE1UUF9GT1JNQVRfV0lORE9XU19JTUFHRV9GT1JNQVQgICAgICAgICAgICAgICAgIDB4Qjg4MQogI2RlZmluZSBNVFBfRk9STUFUX1VOREVGSU5FRF9BVURJTyAgICAgICAgICAgICAgICAgICAgICAweEI5MDAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtJbWFnZS5jcHAgYi9tZWRpYS9uZGsvTmRrSW1hZ2UuY3BwCmluZGV4IDZkMjhkMWIuLjg3YjY0OWEgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtJbWFnZS5jcHAKKysrIGIvbWVkaWEvbmRrL05ka0ltYWdlLmNwcApAQCAtNTMsMjEgKzUzLDI1IEBACiAKIHZvaWQKIEFJbWFnZTo6Y2xvc2UoaW50IHJlbGVhc2VGZW5jZUZkKSB7CisgICAgbG9ja1JlYWRlcigpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1Jc0Nsb3NlZCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIHNwPEFJbWFnZVJlYWRlcj4gcmVhZGVyID0gbVJlYWRlci5wcm9tb3RlKCk7Ci0gICAgaWYgKHJlYWRlciA9PSBudWxscHRyKSB7Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkVycm9yOiBBSW1hZ2Ugbm90IGNsb3NlZCBiZWZvcmUgQUltYWdlUmVhZGVyIGNsb3NlISIpOwotICAgICAgICByZXR1cm47CisgICAgaWYgKHJlYWRlciAhPSBudWxscHRyKSB7CisgICAgICAgIHJlYWRlci0+cmVsZWFzZUltYWdlTG9ja2VkKHRoaXMsIHJlbGVhc2VGZW5jZUZkKTsKKyAgICB9IGVsc2UgaWYgKG1CdWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlczogcGFyZW50IEFJbWFnZVJlYWRlciBjbG9zZWQgd2l0aG91dCByZWxlYXNpbmcgaW1hZ2UgJXAiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdGhpcyk7CiAgICAgfQotICAgIHJlYWRlci0+cmVsZWFzZUltYWdlTG9ja2VkKHRoaXMsIHJlbGVhc2VGZW5jZUZkKTsKKwogICAgIC8vIFNob3VsZCBoYXZlIGJlZW4gc2V0IHRvIG51bGxwdHIgaW4gcmVsZWFzZUltYWdlTG9ja2VkCiAgICAgLy8gU2V0IHRvIG51bGxwdHIgaGVyZSBmb3IgZXh0cmEgc2FmZXR5IG9ubHkKICAgICBtQnVmZmVyID0gbnVsbHB0cjsKICAgICBtTG9ja2VkQnVmZmVyID0gbnVsbHB0cjsKICAgICBtSXNDbG9zZWQgPSB0cnVlOworICAgIHVubG9ja1JlYWRlcigpOwogfQogCiB2b2lkCkBAIC02MTgsOSArNjIyLDcgQEAKIHZvaWQgQUltYWdlX2RlbGV0ZUFzeW5jKEFJbWFnZSogaW1hZ2UsIGludCByZWxlYXNlRmVuY2VGZCkgewogICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiAgICAgaWYgKGltYWdlICE9IG51bGxwdHIpIHsKLSAgICAgICAgaW1hZ2UtPmxvY2tSZWFkZXIoKTsKICAgICAgICAgaW1hZ2UtPmNsb3NlKHJlbGVhc2VGZW5jZUZkKTsKLSAgICAgICAgaW1hZ2UtPnVubG9ja1JlYWRlcigpOwogICAgICAgICBpZiAoIWltYWdlLT5pc0Nsb3NlZCgpKSB7CiAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJJbWFnZSBjbG9zZSBmYWlsZWQhIik7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtJbWFnZVJlYWRlci5jcHAgYi9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXIuY3BwCmluZGV4IDVkMWEyMGIuLmU5MDc4M2QgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtJbWFnZVJlYWRlci5jcHAKKysrIGIvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyLmNwcApAQCAtNDQsNyArNDQsMTEgQEAKIGNvbnN0IGNoYXIqIEFJbWFnZVJlYWRlcjo6a0dyYXBoaWNCdWZmZXJLZXkgPSAiR3JhcGhpY0J1ZmZlciI7CiAKIGJvb2wKLUFJbWFnZVJlYWRlcjo6aXNTdXBwb3J0ZWRGb3JtYXQoaW50MzJfdCBmb3JtYXQpIHsKK0FJbWFnZVJlYWRlcjo6aXNTdXBwb3J0ZWRGb3JtYXRBbmRVc2FnZShpbnQzMl90IGZvcm1hdCwgdWludDY0X3QgdXNhZ2UpIHsKKyAgICAvLyBDaGVjayB3aGV0aGVyIHVzYWdlIGhhcyBlaXRoZXIgQ1BVX1JFQURfT0ZURU4gb3IgQ1BVX1JFQUQgc2V0LiBOb3RlIHRoYXQgY2hlY2sgYWdhaW5zdAorICAgIC8vIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfUkVBRF9PRlRFTiAoMHg2KSBpcyBzdWZmaWNpZW50IGFzIGl0IGltcGxpZXMKKyAgICAvLyBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ1BVX1JFQUQgKDB4MikuCisgICAgYm9vbCBoYXNDcHVVc2FnZSA9IHVzYWdlICYgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0NQVV9SRUFEX09GVEVOOwogICAgIHN3aXRjaCAoZm9ybWF0KSB7CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9SR0JBXzg4ODg6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9SR0JYXzg4ODg6CkBAIC02MCw2ICs2NCw5IEBACiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9ERVBUSDE2OgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfREVQVEhfUE9JTlRfQ0xPVUQ6CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1BSSVZBVEU6CisgICAgICAgICAgICAvLyBGb3IgcHJpdmF0ZSBmb3JtYXQsIGNwdSB1c2FnZSBpcyBwcm9oaWJpdGVkLgorICAgICAgICAgICAgcmV0dXJuICFoYXNDcHVVc2FnZTsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC04Myw2ICs5MCw4IEBACiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9ERVBUSDE2OgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfREVQVEhfUE9JTlRfQ0xPVUQ6CiAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1BSSVZBVEU6CisgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICB9CkBAIC0zNDAsNiArMzQ5LDcgQEAKICAgICBmb3IgKGF1dG8gaXQgPSBtQWNxdWlyZWRJbWFnZXMuYmVnaW4oKTsKICAgICAgICAgICAgICAgaXQgIT0gbUFjcXVpcmVkSW1hZ2VzLmVuZCgpOyBpdCsrKSB7CiAgICAgICAgIEFJbWFnZSogaW1hZ2UgPSAqaXQ7CisgICAgICAgIHJlbGVhc2VJbWFnZUxvY2tlZChpbWFnZSwgLypyZWxlYXNlRmVuY2VGZCovLTEpOwogICAgICAgICBpbWFnZS0+Y2xvc2UoKTsKICAgICB9CiAKQEAgLTYwNiw5ICs2MTYsOSBAQAogICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwogICAgIH0KIAotICAgIGlmICghQUltYWdlUmVhZGVyOjppc1N1cHBvcnRlZEZvcm1hdChmb3JtYXQpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogZm9ybWF0ICVkIGlzIG5vdCBzdXBwb3J0ZWQgYnkgQUltYWdlUmVhZGVyIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGZvcm1hdCk7CisgICAgaWYgKCFBSW1hZ2VSZWFkZXI6OmlzU3VwcG9ydGVkRm9ybWF0QW5kVXNhZ2UoZm9ybWF0LCB1c2FnZSkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBmb3JtYXQgJWQgaXMgbm90IHN1cHBvcnRlZCB3aXRoIHVzYWdlIDB4JSIgUFJJeDY0ICIgYnkgQUltYWdlUmVhZGVyIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGZvcm1hdCwgdXNhZ2UpOwogICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyUHJpdi5oIGIvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyUHJpdi5oCmluZGV4IDk4OWMxZmQuLjk4OWI5MzcgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtJbWFnZVJlYWRlclByaXYuaAorKysgYi9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXJQcml2LmgKQEAgLTQ5LDcgKzQ5LDcgQEAKIAogc3RydWN0IEFJbWFnZVJlYWRlciA6IHB1YmxpYyBSZWZCYXNlIHsKICAgcHVibGljOgotICAgIHN0YXRpYyBib29sIGlzU3VwcG9ydGVkRm9ybWF0KGludDMyX3QgZm9ybWF0KTsKKyAgICBzdGF0aWMgYm9vbCBpc1N1cHBvcnRlZEZvcm1hdEFuZFVzYWdlKGludDMyX3QgZm9ybWF0LCB1aW50NjRfdCB1c2FnZTApOwogICAgIHN0YXRpYyBpbnQgZ2V0TnVtUGxhbmVzRm9yRm9ybWF0KGludDMyX3QgZm9ybWF0KTsKIAogICAgIEFJbWFnZVJlYWRlcihpbnQzMl90IHdpZHRoLApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAKaW5kZXggNTExNDNhYy4uZWVjYzg1OCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwCkBAIC00MjEsNyArNDIxLDcgQEAKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU9iai0+bVF1ZXJ5UmVzdWx0cy5zaXplKCk7IGkrKykgewogICAgICAgICBrZXlWYWx1ZVBhaXJzW2ldLm1LZXkgPSBtT2JqLT5tUXVlcnlSZXN1bHRzLmtleUF0KGkpLnN0cmluZygpOwotICAgICAgICBrZXlWYWx1ZVBhaXJzW2ldLm1WYWx1ZSA9IG1PYmotPm1RdWVyeVJlc3VsdHMua2V5QXQoaSkuc3RyaW5nKCk7CisgICAgICAgIGtleVZhbHVlUGFpcnNbaV0ubVZhbHVlID0gbU9iai0+bVF1ZXJ5UmVzdWx0cy52YWx1ZUF0KGkpLnN0cmluZygpOwogICAgIH0KICAgICAqbnVtUGFpcnMgPSBtT2JqLT5tUXVlcnlSZXN1bHRzLnNpemUoKTsKICAgICByZXR1cm4gQU1FRElBX09LOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2UuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlLmgKaW5kZXggZDMwMWQ4My4uOTljZjVkNSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2UuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZS5oCkBAIC00OTEsNyArNDkxLDEzIEBACiAgICAgLyoqCiAgICAgICogQW5kcm9pZCBwcml2YXRlIG9wYXF1ZSBpbWFnZSBmb3JtYXQuCiAgICAgICoKLSAgICAgKiA8cD5UaGlzIGZvcm1hdCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBieSB7QGxpbmsgQUltYWdlUmVhZGVyfS48L3A+CisgICAgICogPHA+VGhlIGNob2ljZXMgb2YgdGhlIGFjdHVhbCBmb3JtYXQgYW5kIHBpeGVsIGRhdGEgbGF5b3V0IGFyZSBlbnRpcmVseSB1cCB0byB0aGUKKyAgICAgKiBkZXZpY2Utc3BlY2lmaWMgYW5kIGZyYW1ld29yayBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbnMsIGFuZCBtYXkgdmFyeSBkZXBlbmRpbmcgb24gdXNlIGNhc2VzCisgICAgICogZXZlbiBmb3IgdGhlIHNhbWUgZGV2aWNlLiBBbHNvIG5vdGUgdGhhdCB0aGUgY29udGVudHMgb2YgdGhlc2UgYnVmZmVycyBhcmUgbm90IGRpcmVjdGx5CisgICAgICogYWNjZXNzaWJsZSB0byB0aGUgYXBwbGljYXRpb24uPC9wPgorICAgICAqCisgICAgICogPHA+V2hlbiBhbiB7QGxpbmsgQUltYWdlfSBvZiB0aGlzIGZvcm1hdCBpcyBvYnRhaW5lZCBmcm9tIGFuIHtAbGluayBBSW1hZ2VSZWFkZXJ9IG9yCisgICAgICoge0BsaW5rIEFJbWFnZV9nZXROdW1iZXJPZlBsYW5lcygpfSBtZXRob2Qgd2lsbCByZXR1cm4gemVyby48L3A+CiAgICAgICovCiAgICAgQUlNQUdFX0ZPUk1BVF9QUklWQVRFICAgICAgICAgICA9IDB4MjIKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZVJlYWRlci5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2VSZWFkZXIuaAppbmRleCBjOWM3YTZiLi5hODY2N2M5IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZVJlYWRlci5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlUmVhZGVyLmgKQEAgLTY4LDcgKzY4LDkgQEAKICAqIEBwYXJhbSBoZWlnaHQgVGhlIGRlZmF1bHQgaGVpZ2h0IGluIHBpeGVscyBvZiB0aGUgSW1hZ2VzIHRoYXQgdGhpcyByZWFkZXIgd2lsbCBwcm9kdWNlLgogICogQHBhcmFtIGZvcm1hdCBUaGUgZm9ybWF0IG9mIHRoZSBJbWFnZSB0aGF0IHRoaXMgcmVhZGVyIHdpbGwgcHJvZHVjZS4gVGhpcyBtdXN0IGJlIG9uZSBvZiB0aGUKICAqICAgICAgICAgICAgQUlNQUdFX0ZPUk1BVF8qIGVudW0gdmFsdWUgZGVmaW5lZCBpbiB7QGxpbmsgQUlNQUdFX0ZPUk1BVFN9LiBOb3RlIHRoYXQgbm90IGFsbAotICogICAgICAgICAgICBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQsIGxpa2Uge0BsaW5rIEFJTUFHRV9GT1JNQVRfUFJJVkFURX0uCisgKiAgICAgICAgICAgIGZvcm1hdHMgYXJlIHN1cHBvcnRlZC4gT25lIGV4YW1wbGUgaXMge0BsaW5rIEFJTUFHRV9GT1JNQVRfUFJJVkFURX0sIGFzIGl0IGlzIG5vdAorICogICAgICAgICAgICBpbnRlbmRlZCB0byBiZSByZWFkIGJ5IGFwcGxpY2F0aW9ucyBkaXJlY3RseS4gVGhhdCBmb3JtYXQgaXMgc3VwcG9ydGVkIGJ5CisgKiAgICAgICAgICAgIHtAbGluayBBSW1hZ2VSZWFkZXJfbmV3V2l0aFVzYWdlfSBpbnRyb2R1Y2VkIGluIEFQSSAyNi4KICAqIEBwYXJhbSBtYXhJbWFnZXMgVGhlIG1heGltdW0gbnVtYmVyIG9mIGltYWdlcyB0aGUgdXNlciB3aWxsIHdhbnQgdG8gYWNjZXNzIHNpbXVsdGFuZW91c2x5LiBUaGlzCiAgKiAgICAgICAgICAgIHNob3VsZCBiZSBhcyBzbWFsbCBhcyBwb3NzaWJsZSB0byBsaW1pdCBtZW1vcnkgdXNlLiBPbmNlIG1heEltYWdlcyBJbWFnZXMgYXJlIG9idGFpbmVkCiAgKiAgICAgICAgICAgIGJ5IHRoZSB1c2VyLCBvbmUgb2YgdGhlbSBoYXMgdG8gYmUgcmVsZWFzZWQgYmVmb3JlIGEgbmV3IHtAbGluayBBSW1hZ2V9IHdpbGwgYmVjb21lCkBAIC0zMDUsNiArMzA3LDI4IEBACiAgKiBmb3IgdGhlIGNvbnN1bWVyIHVzYWdlLiBBbGwgb3RoZXIgcGFyYW1ldGVycyBhbmQgdGhlIHJldHVybiB2YWx1ZXMgYXJlIGlkZW50aWNhbCB0byB0aG9zZSBwYXNzZWQKICAqIHRvIHtAbGluZSBBSW1hZ2VSZWFkZXJfbmV3fS4KICAqCisgKiA8cD5JZiB0aGUge0Bjb2RlIGZvcm1hdH0gaXMge0BsaW5rIEFJTUFHRV9GT1JNQVRfUFJJVkFURX0sIHRoZSBjcmVhdGVkIHtAbGluayBBSW1hZ2VSZWFkZXJ9CisgKiB3aWxsIHByb2R1Y2UgaW1hZ2VzIHdob3NlIGNvbnRlbnRzIGFyZSBub3QgZGlyZWN0bHkgYWNjZXNzaWJsZSBieSB0aGUgYXBwbGljYXRpb24uIFRoZSBhcHBsaWNhdGlvbiBjYW4KKyAqIHN0aWxsIGFjcXVpcmUgaW1hZ2VzIGZyb20gdGhpcyB7QGxpbmsgQUltYWdlUmVhZGVyfSBhbmQgYWNjZXNzIHtAbGluayBBSGFyZHdhcmVCdWZmZXJ9IHZpYQorICoge0BsaW5rIEFJbWFnZV9nZXRIYXJkd2FyZUJ1ZmZlcigpfS4gVGhlIHtAbGluayBBSGFyZHdhcmVCdWZmZXJ9IGdhaW5lZCB0aGlzIHdheSBjYW4gdGhlbgorICogYmUgcGFzc2VkIGJhY2sgdG8gaGFyZHdhcmUgKHN1Y2ggYXMgR1BVIG9yIGhhcmR3YXJlIGVuY29kZXIgaWYgc3VwcG9ydGVkKSBmb3IgZnV0dXJlIHByb2Nlc3NpbmcuCisgKiBGb3IgZXhhbXBsZSwgeW91IGNhbiBvYnRhaW4gYW4ge0BsaW5rIEVHTENsaWVudEJ1ZmZlcn0gZnJvbSB0aGUge0BsaW5rIEFIYXJkd2FyZUJ1ZmZlcn0gYnkgdXNpbmcKKyAqIHtAbGluayBlZ2xHZXROYXRpdmVDbGllbnRCdWZmZXJBTkRST0lEfSBleHRlbnNpb24gYW5kIHBhc3MgdGhhdCB7QGxpbmsgRUdMQ2xpZW50QnVmZmVyfSB0byB7QGxpbmsKKyAqIGVnbENyZWF0ZUltYWdlS0hSfSB0byBjcmVhdGUgYW4ge0BsaW5rIEVHTEltYWdlfSByZXNvdXJjZSB0eXBlLCB3aGljaCBtYXkgdGhlbiBiZSBib3VuZCB0byBhCisgKiB0ZXh0dXJlIHZpYSB7QGxpbmsgZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FU30gb24gc3VwcG9ydGVkIGRldmljZXMuIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IKKyAqIHRyYW5zcG9ydGluZyB0ZXh0dXJlcyB0aGF0IG1heSBiZSBzaGFyZWQgY3Jvc3MtcHJvY2Vzcy48L3A+CisgKiA8cD5JbiBnZW5lcmFsLCB3aGVuIHNvZnR3YXJlIGFjY2VzcyB0byBpbWFnZSBkYXRhIGlzIG5vdCBuZWNlc3NhcnksIGFuIHtAbGluayBBSW1hZ2VSZWFkZXJ9CisgKiBjcmVhdGVkIHdpdGgge0BsaW5rIEFJTUFHRV9GT1JNQVRfUFJJVkFURX0gZm9ybWF0IGlzIG1vcmUgZWZmaWNpZW50LCBjb21wYXJlZCB3aXRoIHtAbGluaworICogQUltYWdlUmVhZGVyfXMgdXNpbmcgb3RoZXIgZm9ybWF0IHN1Y2ggYXMge0BsaW5rIEFJTUFHRV9GT1JNQVRfWVVWXzQyMF84ODh9LjwvcD4KKyAqCisgKiA8cD5Ob3RlIHRoYXQgbm90IGFsbCBmb3JtYXQgYW5kIHVzYWdlIGZsYWcgY29tYmluYXRpb24gaXMgc3VwcG9ydGVkIGJ5IHRoZSB7QGxpbmsgQUltYWdlUmVhZGVyfSwKKyAqIGVzcGVjaWFsbHkgaWYge0Bjb2RlIGZvcm1hdH0gaXMge0BsaW5rIEFJTUFHRV9GT1JNQVRfUFJJVkFURX0sIHtAY29kZSB1c2FnZX0gbXVzdCBub3QgaW5jbHVkZSBlaXRoZXIKKyAqIHtAbGluayBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfUkVBRF9SQVJFTFl9IG9yIHtAbGluayBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfUkVBRF9PRlRFTn08L3A+CisgKgorICogQHBhcmFtIHdpZHRoIFRoZSBkZWZhdWx0IHdpZHRoIGluIHBpeGVscyBvZiB0aGUgSW1hZ2VzIHRoYXQgdGhpcyByZWFkZXIgd2lsbCBwcm9kdWNlLgorICogQHBhcmFtIGhlaWdodCBUaGUgZGVmYXVsdCBoZWlnaHQgaW4gcGl4ZWxzIG9mIHRoZSBJbWFnZXMgdGhhdCB0aGlzIHJlYWRlciB3aWxsIHByb2R1Y2UuCisgKiBAcGFyYW0gZm9ybWF0IFRoZSBmb3JtYXQgb2YgdGhlIEltYWdlIHRoYXQgdGhpcyByZWFkZXIgd2lsbCBwcm9kdWNlLiBUaGlzIG11c3QgYmUgb25lIG9mIHRoZQorICogICAgICAgICAgICBBSU1BR0VfRk9STUFUXyogZW51bSB2YWx1ZSBkZWZpbmVkIGluIHtAbGluayBBSU1BR0VfRk9STUFUU30uCiAgKiBAcGFyYW0gdXNhZ2Ugc3BlY2lmaWVzIGhvdyB0aGUgY29uc3VtZXIgd2lsbCBhY2Nlc3MgdGhlIEFJbWFnZSwgdXNpbmcgY29tYmluYXRpb24gb2YgdGhlCiAgKiAgICAgICAgICAgIEFIQVJEV0FSRUJVRkZFUl9VU0FHRSBmbGFncyBkZXNjcmliZWQgaW4ge0BsaW5rIGhhcmR3YXJlX2J1ZmZlci5ofS4KICAqICAgICAgICAgICAgUGFzc2luZyB7QGxpbmsgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0NQVV9SRUFEX09GVEVOfSBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcKQEAgLTMyOSw2ICszNTMsMTEgQEAKICAqICAge0BsaW5rIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9HUFVfU0FNUExFRF9JTUFHRX0sIG9yIGNvbWJpbmVkPC90ZD4KICAqIDwvdHI+CiAgKiA8L3RhYmxlPgorICogQHJldHVybiA8dWw+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQU1FRElBX09LfSBpZiB0aGUgbWV0aG9kIGNhbGwgc3VjY2VlZHMuPC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIHJlYWRlciBpcyBOVUxMLCBvciBvbmUgb3IgbW9yZSBvZiB3aWR0aCwKKyAqICAgICAgICAgICAgICAgICBoZWlnaHQsIGZvcm1hdCwgbWF4SW1hZ2VzLCBvciB1c2FnZSBhcmd1bWVudHMgaXMgbm90IHN1cHBvcnRlZC48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFNRURJQV9FUlJPUl9VTktOT1dOfSBpZiB0aGUgbWV0aG9kIGZhaWxzIGZvciBzb21lIG90aGVyIHJlYXNvbnMuPC9saT48L3VsPgogICoKICAqIEBzZWUgQUltYWdlCiAgKiBAc2VlIEFJbWFnZVJlYWRlcl9uZXcKZGlmZiAtLWdpdCBhL21lZGlhL3ZuZGsvQW5kcm9pZC5icCBiL21lZGlhL3ZuZGsvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkzZmQxNi4uMDAwMDAwMAotLS0gYS9tZWRpYS92bmRrL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXN1YmRpcnMgPSBbCi0gICAgInhtbHBhcnNlci8xLjAiLAotXQotCmRpZmYgLS1naXQgYS9tZWRpYS92bmRrL3htbHBhcnNlci8xLjAvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwIGIvbWVkaWEvdm5kay94bWxwYXJzZXIvMS4wL01lZGlhQ29kZWNzWG1sUGFyc2VyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRlNTUxNC4uMDAwMDAwMAotLS0gYS9tZWRpYS92bmRrL3htbHBhcnNlci8xLjAvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTWVkaWFDb2RlY3NYbWxQYXJzZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS92bmRrL3htbHBhcnNlci8xLjAvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaD4KLQotI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNJbmZvLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaW5jbHVkZSA8ZXhwYXQuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNkZWZpbmUgTUVESUFfQ09ERUNTX0NPTkZJR19GSUxFX1BBVEhfTUFYX0xFTkdUSCAyNTYKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1uYW1lc3BhY2UgeyAvLyBMb2NhbCB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucwotCi1jb25zdCBjaGFyICprUHJvZmlsaW5nUmVzdWx0cyA9Ci0gICAgICAgICIvZGF0YS9taXNjL21lZGlhL21lZGlhX2NvZGVjc19wcm9maWxpbmdfcmVzdWx0cy54bWwiOwotCi0vLyBUcmVibGl6ZWQgbWVkaWEgY29kZWMgbGlzdCB3aWxsIGJlIGxvY2F0ZWQgaW4gL29kbS9ldGMgb3IgL3ZlbmRvci9ldGMuCi1jb25zdCBjaGFyICprQ29uZmlnTG9jYXRpb25MaXN0W10gPQotICAgICAgICB7Ii9vZG0vZXRjIiwgIi92ZW5kb3IvZXRjIiwgIi9ldGMifTsKLWNvbnN0ZXhwciBpbnQga0NvbmZpZ0xvY2F0aW9uTGlzdFNpemUgPQotICAgICAgICAoc2l6ZW9mKGtDb25maWdMb2NhdGlvbkxpc3QpIC8gc2l6ZW9mKGtDb25maWdMb2NhdGlvbkxpc3RbMF0pKTsKLQotYm9vbCBmaW5kTWVkaWFDb2RlY0xpc3RGaWxlRnVsbFBhdGgoCi0gICAgICAgIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwgc3RkOjpzdHJpbmcgKm91dF9wYXRoKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQ29uZmlnTG9jYXRpb25MaXN0U2l6ZTsgaSsrKSB7Ci0gICAgICAgICpvdXRfcGF0aCA9IHN0ZDo6c3RyaW5nKGtDb25maWdMb2NhdGlvbkxpc3RbaV0pICsgIi8iICsgZmlsZV9uYW1lOwotICAgICAgICBzdHJ1Y3Qgc3RhdCBmaWxlX3N0YXQ7Ci0gICAgICAgIGlmIChzdGF0KG91dF9wYXRoLT5jX3N0cigpLCAmZmlsZV9zdGF0KSA9PSAwICYmCi0gICAgICAgICAgICAgICAgU19JU1JFRyhmaWxlX3N0YXQuc3RfbW9kZSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLy8gRmluZCBUeXBlSW5mbyBieSBuYW1lLgotc3RkOjp2ZWN0b3I8VHlwZUluZm8+OjppdGVyYXRvciBmaW5kVHlwZUluZm8oCi0gICAgICAgIENvZGVjSW5mbyAmY29kZWNJbmZvLCBjb25zdCBBU3RyaW5nICZ0eXBlTmFtZSkgewotICAgIHJldHVybiBzdGQ6OmZpbmRfaWYoCi0gICAgICAgICAgICBjb2RlY0luZm8ubVR5cGVzLmJlZ2luKCksIGNvZGVjSW5mby5tVHlwZXMuZW5kKCksCi0gICAgICAgICAgICBbdHlwZU5hbWVdKGNvbnN0IGF1dG8gJnR5cGVJbmZvKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVJbmZvLm1OYW1lID09IHR5cGVOYW1lOwotICAgICAgICAgICAgfSk7Ci19Ci0KLS8vIENvbnZlcnQgYSBzdHJpbmcgaW50byBhIGJvb2xlYW4gdmFsdWUuCi1ib29sIFBhcnNlQm9vbGVhbihjb25zdCBjaGFyICpzKSB7Ci0gICAgaWYgKCFzdHJjYXNlY21wKHMsICJ0cnVlIikgfHwgIXN0cmNhc2VjbXAocywgInllcyIpIHx8ICFzdHJjYXNlY21wKHMsICJ5IikpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGNoYXIgKmVuZDsKLSAgICB1bnNpZ25lZCBsb25nIHJlcyA9IHN0cnRvdWwocywgJmVuZCwgMTApOwotICAgIHJldHVybiAqcyAhPSAnXDAnICYmICplbmQgPT0gJ1wwJyAmJiByZXMgPiAwOwotfQotCi19IC8vIHVubmFtZWQgbmFtZXNwYWNlCi0KLU1lZGlhQ29kZWNzWG1sUGFyc2VyOjpNZWRpYUNvZGVjc1htbFBhcnNlcigpIDoKLSAgICBtSW5pdENoZWNrKE5PX0lOSVQpLAotICAgIG1VcGRhdGUoZmFsc2UpIHsKLSAgICBzdGQ6OnN0cmluZyBjb25maWdfZmlsZV9wYXRoOwotICAgIGlmIChmaW5kTWVkaWFDb2RlY0xpc3RGaWxlRnVsbFBhdGgoCi0gICAgICAgICAgICAibWVkaWFfY29kZWNzLnhtbCIsICZjb25maWdfZmlsZV9wYXRoKSkgewotICAgICAgICBwYXJzZVRvcExldmVsWE1MRmlsZShjb25maWdfZmlsZV9wYXRoLmNfc3RyKCksIGZhbHNlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtSW5pdENoZWNrID0gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgfQotICAgIGlmIChmaW5kTWVkaWFDb2RlY0xpc3RGaWxlRnVsbFBhdGgoCi0gICAgICAgICAgICAibWVkaWFfY29kZWNzX3BlcmZvcm1hbmNlLnhtbCIsICZjb25maWdfZmlsZV9wYXRoKSkgewotICAgICAgICBwYXJzZVRvcExldmVsWE1MRmlsZShjb25maWdfZmlsZV9wYXRoLmNfc3RyKCksIHRydWUpOwotICAgIH0KLSAgICBwYXJzZVRvcExldmVsWE1MRmlsZShrUHJvZmlsaW5nUmVzdWx0cywgdHJ1ZSk7Ci19Ci0KLXZvaWQgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OnBhcnNlVG9wTGV2ZWxYTUxGaWxlKAotICAgICAgICBjb25zdCBjaGFyICpjb2RlY3NfeG1sLCBib29sIGlnbm9yZV9lcnJvcnMpIHsKLSAgICAvLyBnZXQgaHJlZl9iYXNlCi0gICAgY29uc3QgY2hhciAqaHJlZl9iYXNlX2VuZCA9IHN0cnJjaHIoY29kZWNzX3htbCwgJy8nKTsKLSAgICBpZiAoaHJlZl9iYXNlX2VuZCAhPSBOVUxMKSB7Ci0gICAgICAgIG1IcmVmQmFzZSA9IEFTdHJpbmcoY29kZWNzX3htbCwgaHJlZl9iYXNlX2VuZCAtIGNvZGVjc194bWwgKyAxKTsKLSAgICB9Ci0KLSAgICBtSW5pdENoZWNrID0gT0s7IC8vIGtlZXBpbmcgdGhpcyBoZXJlIGZvciBzYWZldHkKLSAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX1RPUExFVkVMOwotICAgIG1EZXB0aCA9IDA7Ci0KLSAgICBwYXJzZVhNTEZpbGUoY29kZWNzX3htbCk7Ci0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICBpZiAoaWdub3JlX2Vycm9ycykgewotICAgICAgICAgICAgbUluaXRDaGVjayA9IE9LOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1Db2RlY0luZm9zLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci19Ci0KLU1lZGlhQ29kZWNzWG1sUGFyc2VyOjp+TWVkaWFDb2RlY3NYbWxQYXJzZXIoKSB7Ci19Ci0KLXN0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjppbml0Q2hlY2soKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci19Ci0KLXZvaWQgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OnBhcnNlWE1MRmlsZShjb25zdCBjaGFyICpwYXRoKSB7Ci0gICAgRklMRSAqZmlsZSA9IGZvcGVuKHBhdGgsICJyIik7Ci0KLSAgICBpZiAoZmlsZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJ1bmFibGUgdG8gb3BlbiBtZWRpYSBjb2RlY3MgY29uZmlndXJhdGlvbiB4bWwgZmlsZTogJXMiLCBwYXRoKTsKLSAgICAgICAgbUluaXRDaGVjayA9IE5BTUVfTk9UX0ZPVU5EOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQUxPR1YoIlN0YXJ0IHBhcnNpbmcgJXMiLCBwYXRoKTsKLSAgICBYTUxfUGFyc2VyIHBhcnNlciA9IDo6WE1MX1BhcnNlckNyZWF0ZShOVUxMKTsKLSAgICBDSEVDSyhwYXJzZXIgIT0gTlVMTCk7Ci0KLSAgICA6OlhNTF9TZXRVc2VyRGF0YShwYXJzZXIsIHRoaXMpOwotICAgIDo6WE1MX1NldEVsZW1lbnRIYW5kbGVyKAotICAgICAgICAgICAgcGFyc2VyLCBTdGFydEVsZW1lbnRIYW5kbGVyV3JhcHBlciwgRW5kRWxlbWVudEhhbmRsZXJXcmFwcGVyKTsKLQotICAgIGNvbnN0IGludCBCVUZGX1NJWkUgPSA1MTI7Ci0gICAgd2hpbGUgKG1Jbml0Q2hlY2sgPT0gT0spIHsKLSAgICAgICAgdm9pZCAqYnVmZiA9IDo6WE1MX0dldEJ1ZmZlcihwYXJzZXIsIEJVRkZfU0laRSk7Ci0gICAgICAgIGlmIChidWZmID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgaW4gY2FsbCB0byBYTUxfR2V0QnVmZmVyKCkiKTsKLSAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBVTktOT1dOX0VSUk9SOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgYnl0ZXNfcmVhZCA9IDo6ZnJlYWQoYnVmZiwgMSwgQlVGRl9TSVpFLCBmaWxlKTsKLSAgICAgICAgaWYgKGJ5dGVzX3JlYWQgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZmFpbGVkIGluIGNhbGwgdG8gcmVhZCIpOwotICAgICAgICAgICAgbUluaXRDaGVjayA9IEVSUk9SX0lPOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBYTUxfU3RhdHVzIHN0YXR1cyA9IDo6WE1MX1BhcnNlQnVmZmVyKHBhcnNlciwgYnl0ZXNfcmVhZCwgYnl0ZXNfcmVhZCA9PSAwKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBYTUxfU1RBVFVTX09LKSB7Ci0gICAgICAgICAgICBBTE9HRSgibWFsZm9ybWVkICglcykiLCA6OlhNTF9FcnJvclN0cmluZyg6OlhNTF9HZXRFcnJvckNvZGUocGFyc2VyKSkpOwotICAgICAgICAgICAgbUluaXRDaGVjayA9IEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJ5dGVzX3JlYWQgPT0gMCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICA6OlhNTF9QYXJzZXJGcmVlKHBhcnNlcik7Ci0KLSAgICBmY2xvc2UoZmlsZSk7Ci0gICAgZmlsZSA9IE5VTEw7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6U3RhcnRFbGVtZW50SGFuZGxlcldyYXBwZXIoCi0gICAgICAgIHZvaWQgKm1lLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cnMpIHsKLSAgICBzdGF0aWNfY2FzdDxNZWRpYUNvZGVjc1htbFBhcnNlciAqPihtZSktPnN0YXJ0RWxlbWVudEhhbmRsZXIobmFtZSwgYXR0cnMpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkVuZEVsZW1lbnRIYW5kbGVyV3JhcHBlcih2b2lkICptZSwgY29uc3QgY2hhciAqbmFtZSkgewotICAgIHN0YXRpY19jYXN0PE1lZGlhQ29kZWNzWG1sUGFyc2VyICo+KG1lKS0+ZW5kRWxlbWVudEhhbmRsZXIobmFtZSk7Ci19Ci0KLXN0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjppbmNsdWRlWE1MRmlsZShjb25zdCBjaGFyICoqYXR0cnMpIHsKLSAgICBjb25zdCBjaGFyICpocmVmID0gTlVMTDsKLSAgICBzaXplX3QgaSA9IDA7Ci0gICAgd2hpbGUgKGF0dHJzW2ldICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJocmVmIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaHJlZiA9IGF0dHJzW2kgKyAxXTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJpbmNsdWRlWE1MRmlsZTogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJXMiLCBhdHRyc1tpXSk7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICArK2k7Ci0gICAgfQotCi0gICAgLy8gRm9yIHNlY3VyaXR5IHJlYXNvbnMgYW5kIGZvciBzaW1wbGljaXR5LCBmaWxlIG5hbWVzIGNhbiBvbmx5IGNvbnRhaW4KLSAgICAvLyBbYS16QS1aMC05Xy5dIGFuZCBtdXN0IHN0YXJ0IHdpdGggIG1lZGlhX2NvZGVjc18gYW5kIGVuZCB3aXRoIC54bWwKLSAgICBmb3IgKGkgPSAwOyBocmVmW2ldICE9ICdcMCc7IGkrKykgewotICAgICAgICBpZiAoaHJlZltpXSA9PSAnLicgfHwgaHJlZltpXSA9PSAnXycgfHwKLSAgICAgICAgICAgICAgICAoaHJlZltpXSA+PSAnMCcgJiYgaHJlZltpXSA8PSAnOScpIHx8Ci0gICAgICAgICAgICAgICAgKGhyZWZbaV0gPj0gJ0EnICYmIGhyZWZbaV0gPD0gJ1onKSB8fAotICAgICAgICAgICAgICAgIChocmVmW2ldID49ICdhJyAmJiBocmVmW2ldIDw9ICd6JykpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dFKCJpbnZhbGlkIGluY2x1ZGUgZmlsZSBuYW1lOiAlcyIsIGhyZWYpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBBU3RyaW5nIGZpbGVuYW1lID0gaHJlZjsKLSAgICBpZiAoIWZpbGVuYW1lLnN0YXJ0c1dpdGgoIm1lZGlhX2NvZGVjc18iKSB8fAotICAgICAgICAhZmlsZW5hbWUuZW5kc1dpdGgoIi54bWwiKSkgewotICAgICAgICBBTE9HRSgiaW52YWxpZCBpbmNsdWRlIGZpbGUgbmFtZTogJXMiLCBocmVmKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIGZpbGVuYW1lLmluc2VydChtSHJlZkJhc2UsIDApOwotCi0gICAgcGFyc2VYTUxGaWxlKGZpbGVuYW1lLmNfc3RyKCkpOwotICAgIHJldHVybiBtSW5pdENoZWNrOwotfQotCi12b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpzdGFydEVsZW1lbnRIYW5kbGVyKAotICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cnMpIHsKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYm9vbCBpblR5cGUgPSB0cnVlOwotCi0gICAgaWYgKCFzdHJjbXAobmFtZSwgIkluY2x1ZGUiKSkgewotICAgICAgICBtSW5pdENoZWNrID0gaW5jbHVkZVhNTEZpbGUoYXR0cnMpOwotICAgICAgICBpZiAobUluaXRDaGVjayA9PSBPSykgewotICAgICAgICAgICAgbVBhc3RTZWN0aW9ucy5wdXNoKG1DdXJyZW50U2VjdGlvbik7Ci0gICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0lOQ0xVREU7Ci0gICAgICAgIH0KLSAgICAgICAgKyttRGVwdGg7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKG1DdXJyZW50U2VjdGlvbikgewotICAgICAgICBjYXNlIFNFQ1RJT05fVE9QTEVWRUw6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJEZWNvZGVycyIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9ERUNPREVSUzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiRW5jb2RlcnMiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fRU5DT0RFUlM7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIlNldHRpbmdzIikpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX1NFVFRJTkdTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFNFQ1RJT05fU0VUVElOR1M6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJTZXR0aW5nIikpIHsKLSAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gYWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzKGF0dHJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBTRUNUSU9OX0RFQ09ERVJTOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiTWVkaWFDb2RlYyIpKSB7Ci0gICAgICAgICAgICAgICAgbUluaXRDaGVjayA9Ci0gICAgICAgICAgICAgICAgICAgIGFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlcyhmYWxzZSAvKiBlbmNvZGVyICovLCBhdHRycyk7Ci0KLSAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0RFQ09ERVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSUzoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIk1lZGlhQ29kZWMiKSkgewotICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPQotICAgICAgICAgICAgICAgICAgICBhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXModHJ1ZSAvKiBlbmNvZGVyICovLCBhdHRycyk7Ci0KLSAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0VOQ09ERVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSOgotICAgICAgICBjYXNlIFNFQ1RJT05fRU5DT0RFUjoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIlF1aXJrIikpIHsKLSAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gYWRkUXVpcmsoYXR0cnMpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJUeXBlIikpIHsKLSAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gYWRkVHlwZUZyb21BdHRyaWJ1dGVzKGF0dHJzLCAobUN1cnJlbnRTZWN0aW9uID09IFNFQ1RJT05fRU5DT0RFUikpOwotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIChtQ3VycmVudFNlY3Rpb24gPT0gU0VDVElPTl9ERUNPREVSCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBTRUNUSU9OX0RFQ09ERVJfVFlQRSA6IFNFQ1RJT05fRU5DT0RFUl9UWVBFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpblR5cGUgPSBmYWxzZTsKLSAgICAgICAgLy8gZmFsbCB0aHJvdWdoCi0KLSAgICAgICAgY2FzZSBTRUNUSU9OX0RFQ09ERVJfVFlQRToKLSAgICAgICAgY2FzZSBTRUNUSU9OX0VOQ09ERVJfVFlQRToKLSAgICAgICAgewotICAgICAgICAgICAgLy8gaWdub3JlIGxpbWl0cyBhbmQgZmVhdHVyZXMgc3BlY2lmaWVkIG91dHNpZGUgb2YgdHlwZQotICAgICAgICAgICAgYm9vbCBvdXRzaWRlID0gIWluVHlwZSAmJiBtQ3VycmVudFR5cGUgPT0gbUNvZGVjSW5mb3NbbUN1cnJlbnROYW1lXS5tVHlwZXMuZW5kKCk7Ci0gICAgICAgICAgICBpZiAob3V0c2lkZSAmJiAoIXN0cmNtcChuYW1lLCAiTGltaXQiKSB8fCAhc3RyY21wKG5hbWUsICJGZWF0dXJlIikpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nICVzIHNwZWNpZmllZCBvdXRzaWRlIG9mIGEgVHlwZSIsIG5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJMaW1pdCIpKSB7Ci0gICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IGFkZExpbWl0KGF0dHJzKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiRmVhdHVyZSIpKSB7Ci0gICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IGFkZEZlYXR1cmUoYXR0cnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgKyttRGVwdGg7Ci19Ci0KLXZvaWQgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmVuZEVsZW1lbnRIYW5kbGVyKGNvbnN0IGNoYXIgKm5hbWUpIHsKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3dpdGNoIChtQ3VycmVudFNlY3Rpb24pIHsKLSAgICAgICAgY2FzZSBTRUNUSU9OX1NFVFRJTkdTOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiU2V0dGluZ3MiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fVE9QTEVWRUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSUzoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIkRlY29kZXJzIikpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX1RPUExFVkVMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFNFQ1RJT05fRU5DT0RFUlM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJFbmNvZGVycyIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9UT1BMRVZFTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBTRUNUSU9OX0RFQ09ERVJfVFlQRToKLSAgICAgICAgY2FzZSBTRUNUSU9OX0VOQ09ERVJfVFlQRToKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIlR5cGUiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIChtQ3VycmVudFNlY3Rpb24gPT0gU0VDVElPTl9ERUNPREVSX1RZUEUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFNFQ1RJT05fREVDT0RFUiA6IFNFQ1RJT05fRU5DT0RFUik7Ci0KLSAgICAgICAgICAgICAgICBtQ3VycmVudFR5cGUgPSBtQ29kZWNJbmZvc1ttQ3VycmVudE5hbWVdLm1UeXBlcy5lbmQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBTRUNUSU9OX0RFQ09ERVI6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJNZWRpYUNvZGVjIikpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0RFQ09ERVJTOwotICAgICAgICAgICAgICAgIG1DdXJyZW50TmFtZS5jbGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFNFQ1RJT05fRU5DT0RFUjoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIk1lZGlhQ29kZWMiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fRU5DT0RFUlM7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnROYW1lLmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU0VDVElPTl9JTkNMVURFOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiSW5jbHVkZSIpICYmIG1QYXN0U2VjdGlvbnMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IG1QYXN0U2VjdGlvbnMudG9wKCk7Ci0gICAgICAgICAgICAgICAgbVBhc3RTZWN0aW9ucy5wb3AoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC0tbURlcHRoOwotfQotCi1zdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6YWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzKGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKnZhbHVlID0gTlVMTDsKLSAgICBjb25zdCBjaGFyICp1cGRhdGUgPSBOVUxMOwotCi0gICAgc2l6ZV90IGkgPSAwOwotICAgIHdoaWxlIChhdHRyc1tpXSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICghc3RyY21wKGF0dHJzW2ldLCAibmFtZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzOiBuYW1lIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5hbWUgPSBhdHRyc1tpICsgMV07Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyc1tpXSwgInZhbHVlIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXM6IHZhbHVlIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhbHVlID0gYXR0cnNbaSArIDFdOwotICAgICAgICAgICAgKytpOwotICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJ1cGRhdGUiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzW2kgKyAxXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImFkZFNldHRpbmdGcm9tQXR0cmlidXRlczogdXBkYXRlIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVwZGF0ZSA9IGF0dHJzW2kgKyAxXTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXM6IHVucmVjb2duaXplZCBhdHRyaWJ1dGU6ICVzIiwgYXR0cnNbaV0pOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICArK2k7Ci0gICAgfQotCi0gICAgaWYgKG5hbWUgPT0gTlVMTCB8fCB2YWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXM6IG5hbWUgb3IgdmFsdWUgdW5zcGVjaWZpZWQiKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgbVVwZGF0ZSA9ICh1cGRhdGUgIT0gTlVMTCkgJiYgUGFyc2VCb29sZWFuKHVwZGF0ZSk7Ci0gICAgaWYgKG1VcGRhdGUgIT0gKG1HbG9iYWxTZXR0aW5ncy5jb3VudChuYW1lKSA+IDApKSB7Ci0gICAgICAgIEFMT0dFKCJhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXM6IHVwZGF0aW5nIG5vbi1leGlzdGluZyBzZXR0aW5nIik7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBtR2xvYmFsU2V0dGluZ3NbbmFtZV0gPSB2YWx1ZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlcygKLSAgICAgICAgYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICoqYXR0cnMpIHsKLSAgICBjb25zdCBjaGFyICpuYW1lID0gTlVMTDsKLSAgICBjb25zdCBjaGFyICp0eXBlID0gTlVMTDsKLSAgICBjb25zdCBjaGFyICp1cGRhdGUgPSBOVUxMOwotCi0gICAgc2l6ZV90IGkgPSAwOwotICAgIHdoaWxlIChhdHRyc1tpXSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICghc3RyY21wKGF0dHJzW2ldLCAibmFtZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiBuYW1lIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5hbWUgPSBhdHRyc1tpICsgMV07Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyc1tpXSwgInR5cGUiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzW2kgKyAxXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogdHlwZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0eXBlID0gYXR0cnNbaSArIDFdOwotICAgICAgICAgICAgKytpOwotICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJ1cGRhdGUiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzW2kgKyAxXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogdXBkYXRlIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVwZGF0ZSA9IGF0dHJzW2kgKyAxXTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXM6IHVucmVjb2duaXplZCBhdHRyaWJ1dGU6ICVzIiwgYXR0cnNbaV0pOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICArK2k7Ci0gICAgfQotCi0gICAgaWYgKG5hbWUgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiBuYW1lIG5vdCBmb3VuZCIpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBtVXBkYXRlID0gKHVwZGF0ZSAhPSBOVUxMKSAmJiBQYXJzZUJvb2xlYW4odXBkYXRlKTsKLSAgICBpZiAobVVwZGF0ZSAhPSAobUNvZGVjSW5mb3MuY291bnQobmFtZSkgPiAwKSkgewotICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiB1cGRhdGluZyBub24tZXhpc3RpbmcgY29kZWMgb3IgdmljZSB2ZXJzYSIpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBDb2RlY0luZm8gKmluZm8gPSAmbUNvZGVjSW5mb3NbbmFtZV07Ci0gICAgaWYgKG1VcGRhdGUpIHsKLSAgICAgICAgLy8gZXhpc3RpbmcgY29kZWMKLSAgICAgICAgbUN1cnJlbnROYW1lID0gbmFtZTsKLSAgICAgICAgbUN1cnJlbnRUeXBlID0gaW5mby0+bVR5cGVzLmJlZ2luKCk7Ci0gICAgICAgIGlmICh0eXBlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIC8vIGV4aXN0aW5nIHR5cGUKLSAgICAgICAgICAgIG1DdXJyZW50VHlwZSA9IGZpbmRUeXBlSW5mbygqaW5mbywgdHlwZSk7Ci0gICAgICAgICAgICBpZiAobUN1cnJlbnRUeXBlID09IGluZm8tPm1UeXBlcy5lbmQoKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXM6IHVwZGF0aW5nIG5vbi1leGlzdGluZyB0eXBlIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICAvLyBuZXcgY29kZWMKLSAgICAgICAgbUN1cnJlbnROYW1lID0gbmFtZTsKLSAgICAgICAgbVF1aXJrc1tuYW1lXS5jbGVhcigpOwotICAgICAgICBpbmZvLT5tVHlwZXMuY2xlYXIoKTsKLSAgICAgICAgaW5mby0+bVR5cGVzLmVtcGxhY2VfYmFjaygpOwotICAgICAgICBtQ3VycmVudFR5cGUgPSAtLWluZm8tPm1UeXBlcy5lbmQoKTsKLSAgICAgICAgbUN1cnJlbnRUeXBlLT5tTmFtZSA9IHR5cGU7Ci0gICAgICAgIGluZm8tPm1Jc0VuY29kZXIgPSBlbmNvZGVyOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmFkZFF1aXJrKGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOwotCi0gICAgc2l6ZV90IGkgPSAwOwotICAgIHdoaWxlIChhdHRyc1tpXSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICghc3RyY21wKGF0dHJzW2ldLCAibmFtZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkUXVpcms6IG5hbWUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2kgKyAxXTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJhZGRRdWlyazogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJXMiLCBhdHRyc1tpXSk7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgICsraTsKLSAgICB9Ci0KLSAgICBpZiAobmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJhZGRRdWlyazogbmFtZSBub3QgZm91bmQiKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgbVF1aXJrc1ttQ3VycmVudE5hbWVdLmVtcGxhY2VfYmFjayhuYW1lKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjphZGRUeXBlRnJvbUF0dHJpYnV0ZXMoY29uc3QgY2hhciAqKmF0dHJzLCBib29sIGVuY29kZXIpIHsKLSAgICBjb25zdCBjaGFyICpuYW1lID0gTlVMTDsKLSAgICBjb25zdCBjaGFyICp1cGRhdGUgPSBOVUxMOwotCi0gICAgc2l6ZV90IGkgPSAwOwotICAgIHdoaWxlIChhdHRyc1tpXSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICghc3RyY21wKGF0dHJzW2ldLCAibmFtZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkVHlwZUZyb21BdHRyaWJ1dGVzOiBuYW1lIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5hbWUgPSBhdHRyc1tpICsgMV07Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyc1tpXSwgInVwZGF0ZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkVHlwZUZyb21BdHRyaWJ1dGVzOiB1cGRhdGUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXBkYXRlID0gYXR0cnNbaSArIDFdOwotICAgICAgICAgICAgKytpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoImFkZFR5cGVGcm9tQXR0cmlidXRlczogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJXMiLCBhdHRyc1tpXSk7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgICsraTsKLSAgICB9Ci0KLSAgICBpZiAobmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIENvZGVjSW5mbyAqaW5mbyA9ICZtQ29kZWNJbmZvc1ttQ3VycmVudE5hbWVdOwotICAgIGluZm8tPm1Jc0VuY29kZXIgPSBlbmNvZGVyOwotICAgIG1DdXJyZW50VHlwZSA9IGZpbmRUeXBlSW5mbygqaW5mbywgbmFtZSk7Ci0gICAgaWYgKCFtVXBkYXRlKSB7Ci0gICAgICAgIGlmIChtQ3VycmVudFR5cGUgIT0gaW5mby0+bVR5cGVzLmVuZCgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiYWRkVHlwZUZyb21BdHRyaWJ1dGVzOiByZS1kZWZpbmluZyBleGlzdGluZyB0eXBlIHdpdGhvdXQgdXBkYXRlIik7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICBpbmZvLT5tVHlwZXMuZW1wbGFjZV9iYWNrKCk7Ci0gICAgICAgIG1DdXJyZW50VHlwZSA9IC0taW5mby0+bVR5cGVzLmVuZCgpOwotICAgIH0gZWxzZSBpZiAobUN1cnJlbnRUeXBlID09IGluZm8tPm1UeXBlcy5lbmQoKSkgewotICAgICAgICBBTE9HRSgiYWRkVHlwZUZyb21BdHRyaWJ1dGVzOiB1cGRhdGluZyBub24tZXhpc3RpbmcgdHlwZSIpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXRpYyBzdGF0dXNfdCBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoY29uc3QgQVN0cmluZyAmbmFtZSwgY29uc3QgY2hhciAqYXR0ciwgYm9vbCBmb3VuZCA9IHRydWUpIHsKLSAgICBBTE9HRSgibGltaXQgJyVzJyB3aXRoICVzJyVzJyBhdHRyaWJ1dGUiLCBuYW1lLmNfc3RyKCksCi0gICAgICAgICAgICAoZm91bmQgPyAiIiA6ICJubyAiKSwgYXR0cik7Ci0gICAgcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBzdGF0dXNfdCBsaW1pdEVycm9yKGNvbnN0IEFTdHJpbmcgJm5hbWUsIGNvbnN0IGNoYXIgKm1zZykgewotICAgIEFMT0dFKCJsaW1pdCAnJXMnICVzIiwgbmFtZS5jX3N0cigpLCBtc2cpOwotICAgIHJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgc3RhdHVzX3QgbGltaXRJbnZhbGlkQXR0cihjb25zdCBBU3RyaW5nICZuYW1lLCBjb25zdCBjaGFyICphdHRyLCBjb25zdCBBU3RyaW5nICZ2YWx1ZSkgewotICAgIEFMT0dFKCJsaW1pdCAnJXMnIHdpdGggaW52YWxpZCAnJXMnIGF0dHJpYnV0ZSAoJXMpIiwgbmFtZS5jX3N0cigpLAotICAgICAgICAgICAgYXR0ciwgdmFsdWUuY19zdHIoKSk7Ci0gICAgcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjphZGRMaW1pdChjb25zdCBjaGFyICoqYXR0cnMpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCk7Ci0KLSAgICBzaXplX3QgaSA9IDA7Ci0gICAgd2hpbGUgKGF0dHJzW2ldICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKGF0dHJzW2kgKyAxXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IGxpbWl0IGlzIG5vdCBnaXZlbiIpOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhdHRyaWJ1dGVzIHdpdGggdmFsdWVzCi0gICAgICAgIGlmICghc3RyY21wKGF0dHJzW2ldLCAibmFtZSIpCi0gICAgICAgICAgICAgICAgfHwgIXN0cmNtcChhdHRyc1tpXSwgImRlZmF1bHQiKQotICAgICAgICAgICAgICAgIHx8ICFzdHJjbXAoYXR0cnNbaV0sICJpbiIpCi0gICAgICAgICAgICAgICAgfHwgIXN0cmNtcChhdHRyc1tpXSwgIm1heCIpCi0gICAgICAgICAgICAgICAgfHwgIXN0cmNtcChhdHRyc1tpXSwgIm1pbiIpCi0gICAgICAgICAgICAgICAgfHwgIXN0cmNtcChhdHRyc1tpXSwgInJhbmdlIikKLSAgICAgICAgICAgICAgICB8fCAhc3RyY21wKGF0dHJzW2ldLCAicmFuZ2VzIikKLSAgICAgICAgICAgICAgICB8fCAhc3RyY21wKGF0dHJzW2ldLCAic2NhbGUiKQotICAgICAgICAgICAgICAgIHx8ICFzdHJjbXAoYXR0cnNbaV0sICJ2YWx1ZSIpKSB7Ci0gICAgICAgICAgICBtc2ctPnNldFN0cmluZyhhdHRyc1tpXSwgYXR0cnNbaSArIDFdKTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogdW5yZWNvZ25pemVkIGxpbWl0OiAlcyIsIGF0dHJzW2ldKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgICsraTsKLSAgICB9Ci0KLSAgICBBU3RyaW5nIG5hbWU7Ci0gICAgaWYgKCFtc2ctPmZpbmRTdHJpbmcoIm5hbWUiLCAmbmFtZSkpIHsKLSAgICAgICAgQUxPR0UoImxpbWl0IHdpdGggbm8gJ25hbWUnIGF0dHJpYnV0ZSIpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICAvLyBzaXplLCBibG9ja3MsIGJpdHJhdGUsIGZyYW1lLXJhdGUsIGJsb2Nrcy1wZXItc2Vjb25kLCBhc3BlY3QtcmF0aW8sCi0gICAgLy8gbWVhc3VyZWQtZnJhbWUtcmF0ZSwgbWVhc3VyZWQtYmxvY2tzLXBlci1zZWNvbmQ6IHJhbmdlCi0gICAgLy8gcXVhbGl0eTogcmFuZ2UgKyBkZWZhdWx0ICsgW3NjYWxlXQotICAgIC8vIGNvbXBsZXhpdHk6IHJhbmdlICsgZGVmYXVsdAotICAgIGJvb2wgZm91bmQ7Ci0gICAgaWYgKG1DdXJyZW50VHlwZSA9PSBtQ29kZWNJbmZvc1ttQ3VycmVudE5hbWVdLm1UeXBlcy5lbmQoKSkgewotICAgICAgICBBTE9HVygiaWdub3JpbmcgbnVsbCB0eXBlIik7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBpZiAobmFtZSA9PSAiYXNwZWN0LXJhdGlvIiB8fCBuYW1lID09ICJiaXRyYXRlIiB8fCBuYW1lID09ICJibG9jay1jb3VudCIKLSAgICAgICAgICAgIHx8IG5hbWUgPT0gImJsb2Nrcy1wZXItc2Vjb25kIiB8fCBuYW1lID09ICJjb21wbGV4aXR5IgotICAgICAgICAgICAgfHwgbmFtZSA9PSAiZnJhbWUtcmF0ZSIgfHwgbmFtZSA9PSAicXVhbGl0eSIgfHwgbmFtZSA9PSAic2l6ZSIKLSAgICAgICAgICAgIHx8IG5hbWUgPT0gIm1lYXN1cmVkLWJsb2Nrcy1wZXItc2Vjb25kIiB8fCBuYW1lLnN0YXJ0c1dpdGgoIm1lYXN1cmVkLWZyYW1lLXJhdGUtIikpIHsKLSAgICAgICAgQVN0cmluZyBtaW4sIG1heDsKLSAgICAgICAgaWYgKG1zZy0+ZmluZFN0cmluZygibWluIiwgJm1pbikgJiYgbXNnLT5maW5kU3RyaW5nKCJtYXgiLCAmbWF4KSkgewotICAgICAgICAgICAgbWluLmFwcGVuZCgiLSIpOwotICAgICAgICAgICAgbWluLmFwcGVuZChtYXgpOwotICAgICAgICAgICAgaWYgKG1zZy0+Y29udGFpbnMoInJhbmdlIikgfHwgbXNnLT5jb250YWlucygidmFsdWUiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEVycm9yKG5hbWUsICJoYXMgJ21pbicgYW5kICdtYXgnIGFzIHdlbGwgYXMgJ3JhbmdlJyBvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiJ3ZhbHVlJyBhdHRyaWJ1dGVzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtc2ctPnNldFN0cmluZygicmFuZ2UiLCBtaW4pOwotICAgICAgICB9IGVsc2UgaWYgKG1zZy0+Y29udGFpbnMoIm1pbiIpIHx8IG1zZy0+Y29udGFpbnMoIm1heCIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRFcnJvcihuYW1lLCAiaGFzIG9ubHkgJ21pbicgb3IgJ21heCcgYXR0cmlidXRlIik7Ci0gICAgICAgIH0gZWxzZSBpZiAobXNnLT5maW5kU3RyaW5nKCJ2YWx1ZSIsICZtYXgpKSB7Ci0gICAgICAgICAgICBtaW4gPSBtYXg7Ci0gICAgICAgICAgICBtaW4uYXBwZW5kKCItIik7Ci0gICAgICAgICAgICBtaW4uYXBwZW5kKG1heCk7Ci0gICAgICAgICAgICBpZiAobXNnLT5jb250YWlucygicmFuZ2UiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEVycm9yKG5hbWUsICJoYXMgYm90aCAncmFuZ2UnIGFuZCAndmFsdWUnIGF0dHJpYnV0ZXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1zZy0+c2V0U3RyaW5nKCJyYW5nZSIsIG1pbik7Ci0gICAgICAgIH0KLQotICAgICAgICBBU3RyaW5nIHJhbmdlLCBzY2FsZSA9ICJsaW5lYXIiLCBkZWYsIGluXzsKLSAgICAgICAgaWYgKCFtc2ctPmZpbmRTdHJpbmcoInJhbmdlIiwgJnJhbmdlKSkgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0RXJyb3IobmFtZSwgIndpdGggbm8gJ3JhbmdlJywgJ3ZhbHVlJyBvciAnbWluJy8nbWF4JyBhdHRyaWJ1dGVzIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKG5hbWUgPT0gInF1YWxpdHkiIHx8IG5hbWUgPT0gImNvbXBsZXhpdHkiKSBeCi0gICAgICAgICAgICAgICAgKGZvdW5kID0gbXNnLT5maW5kU3RyaW5nKCJkZWZhdWx0IiwgJmRlZikpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJkZWZhdWx0IiwgZm91bmQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuYW1lICE9ICJxdWFsaXR5IiAmJiBtc2ctPmZpbmRTdHJpbmcoInNjYWxlIiwgJnNjYWxlKSkgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAic2NhbGUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKG5hbWUgPT0gImFzcGVjdC1yYXRpbyIpIF4gKGZvdW5kID0gbXNnLT5maW5kU3RyaW5nKCJpbiIsICZpbl8pKSkgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAiaW4iLCBmb3VuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmFtZSA9PSAiYXNwZWN0LXJhdGlvIikgewotICAgICAgICAgICAgaWYgKCEoaW5fID09ICJwaXhlbHMiKSAmJiAhKGluXyA9PSAiYmxvY2tzIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbGltaXRJbnZhbGlkQXR0cihuYW1lLCAiaW4iLCBpbl8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5fLmVyYXNlKDUsIDEpOyAvLyAocGl4ZWx8YmxvY2spLWFzcGVjdC1yYXRpbwotICAgICAgICAgICAgaW5fLmFwcGVuZCgiLSIpOwotICAgICAgICAgICAgaW5fLmFwcGVuZChuYW1lKTsKLSAgICAgICAgICAgIG5hbWUgPSBpbl87Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5hbWUgPT0gInF1YWxpdHkiKSB7Ci0gICAgICAgICAgICBtQ3VycmVudFR5cGUtPm1EZXRhaWxzWyJxdWFsaXR5LXNjYWxlIl0gPSBzY2FsZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmFtZSA9PSAicXVhbGl0eSIgfHwgbmFtZSA9PSAiY29tcGxleGl0eSIpIHsKLSAgICAgICAgICAgIEFTdHJpbmcgdGFnID0gbmFtZTsKLSAgICAgICAgICAgIHRhZy5hcHBlbmQoIi1kZWZhdWx0Iik7Ci0gICAgICAgICAgICBtQ3VycmVudFR5cGUtPm1EZXRhaWxzW3RhZ10gPSBkZWY7Ci0gICAgICAgIH0KLSAgICAgICAgQVN0cmluZyB0YWcgPSBuYW1lOwotICAgICAgICB0YWcuYXBwZW5kKCItcmFuZ2UiKTsKLSAgICAgICAgbUN1cnJlbnRUeXBlLT5tRGV0YWlsc1t0YWddID0gcmFuZ2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQVN0cmluZyBtYXgsIHZhbHVlLCByYW5nZXM7Ci0gICAgICAgIGlmIChtc2ctPmNvbnRhaW5zKCJkZWZhdWx0IikpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgImRlZmF1bHQiKTsKLSAgICAgICAgfSBlbHNlIGlmIChtc2ctPmNvbnRhaW5zKCJpbiIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJpbiIpOwotICAgICAgICB9IGVsc2UgaWYgKChuYW1lID09ICJjaGFubmVsLWNvdW50IiB8fCBuYW1lID09ICJjb25jdXJyZW50LWluc3RhbmNlcyIpIF4KLSAgICAgICAgICAgICAgICAoZm91bmQgPSBtc2ctPmZpbmRTdHJpbmcoIm1heCIsICZtYXgpKSkgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAibWF4IiwgZm91bmQpOwotICAgICAgICB9IGVsc2UgaWYgKG1zZy0+Y29udGFpbnMoIm1pbiIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJtaW4iKTsKLSAgICAgICAgfSBlbHNlIGlmIChtc2ctPmNvbnRhaW5zKCJyYW5nZSIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJyYW5nZSIpOwotICAgICAgICB9IGVsc2UgaWYgKChuYW1lID09ICJzYW1wbGUtcmF0ZSIpIF4KLSAgICAgICAgICAgICAgICAoZm91bmQgPSBtc2ctPmZpbmRTdHJpbmcoInJhbmdlcyIsICZyYW5nZXMpKSkgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAicmFuZ2VzIiwgZm91bmQpOwotICAgICAgICB9IGVsc2UgaWYgKG1zZy0+Y29udGFpbnMoInNjYWxlIikpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgInNjYWxlIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoKG5hbWUgPT0gImFsaWdubWVudCIgfHwgbmFtZSA9PSAiYmxvY2stc2l6ZSIpIF4KLSAgICAgICAgICAgICAgICAoZm91bmQgPSBtc2ctPmZpbmRTdHJpbmcoInZhbHVlIiwgJnZhbHVlKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgInZhbHVlIiwgZm91bmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1heC5zaXplKCkpIHsKLSAgICAgICAgICAgIEFTdHJpbmcgdGFnID0gIm1heC0iOwotICAgICAgICAgICAgdGFnLmFwcGVuZChuYW1lKTsKLSAgICAgICAgICAgIG1DdXJyZW50VHlwZS0+bURldGFpbHNbdGFnXSA9IG1heDsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5zaXplKCkpIHsKLSAgICAgICAgICAgIG1DdXJyZW50VHlwZS0+bURldGFpbHNbbmFtZV0gPSB2YWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChyYW5nZXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBBU3RyaW5nIHRhZyA9IG5hbWU7Ci0gICAgICAgICAgICB0YWcuYXBwZW5kKCItcmFuZ2VzIik7Ci0gICAgICAgICAgICBtQ3VycmVudFR5cGUtPm1EZXRhaWxzW3RhZ10gPSByYW5nZXM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygiSWdub3JpbmcgdW5yZWNvZ25pemVkIGxpbWl0ICclcyciLCBuYW1lLmNfc3RyKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6YWRkRmVhdHVyZShjb25zdCBjaGFyICoqYXR0cnMpIHsKLSAgICBzaXplX3QgaSA9IDA7Ci0gICAgY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7Ci0gICAgaW50MzJfdCBvcHRpb25hbCA9IC0xOwotICAgIGludDMyX3QgcmVxdWlyZWQgPSAtMTsKLSAgICBjb25zdCBjaGFyICp2YWx1ZSA9IE5VTEw7Ci0KLSAgICB3aGlsZSAoYXR0cnNbaV0gIT0gTlVMTCkgewotICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJhZGRGZWF0dXJlOiBmZWF0dXJlIGlzIG5vdCBnaXZlbiIpOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhdHRyaWJ1dGVzIHdpdGggdmFsdWVzCi0gICAgICAgIGlmICghc3RyY21wKGF0dHJzW2ldLCAibmFtZSIpKSB7Ci0gICAgICAgICAgICBuYW1lID0gYXR0cnNbaSArIDFdOwotICAgICAgICAgICAgKytpOwotICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJvcHRpb25hbCIpIHx8ICFzdHJjbXAoYXR0cnNbaV0sICJyZXF1aXJlZCIpKSB7Ci0gICAgICAgICAgICBpbnQgdmFsdWUgPSAoaW50KVBhcnNlQm9vbGVhbihhdHRyc1tpICsgMV0pOwotICAgICAgICAgICAgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJvcHRpb25hbCIpKSB7Ci0gICAgICAgICAgICAgICAgb3B0aW9uYWwgPSB2YWx1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGF0dHJzW2ldLCAidmFsdWUiKSkgewotICAgICAgICAgICAgdmFsdWUgPSBhdHRyc1tpICsgMV07Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiYWRkRmVhdHVyZTogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJXMiLCBhdHRyc1tpXSk7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICArK2k7Ci0gICAgfQotICAgIGlmIChuYW1lID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoImZlYXR1cmUgd2l0aCBubyAnbmFtZScgYXR0cmlidXRlIik7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGlmIChvcHRpb25hbCA9PSByZXF1aXJlZCAmJiBvcHRpb25hbCAhPSAtMSkgewotICAgICAgICBBTE9HRSgiZmVhdHVyZSAnJXMnIGlzIGJvdGgvbmVpdGhlciBvcHRpb25hbCBhbmQgcmVxdWlyZWQiLCBuYW1lKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgaWYgKG1DdXJyZW50VHlwZSA9PSBtQ29kZWNJbmZvc1ttQ3VycmVudE5hbWVdLm1UeXBlcy5lbmQoKSkgewotICAgICAgICBBTE9HVygiaWdub3JpbmcgbnVsbCB0eXBlIik7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKLSAgICAgICAgbUN1cnJlbnRUeXBlLT5tU3RyaW5nRmVhdHVyZXNbbmFtZV0gPSB2YWx1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBtQ3VycmVudFR5cGUtPm1Cb29sRmVhdHVyZXNbbmFtZV0gPSAocmVxdWlyZWQgPT0gMSkgfHwgKG9wdGlvbmFsID09IDApOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdldEdsb2JhbFNldHRpbmdzKAotICAgICAgICBzdGQ6Om1hcDxBU3RyaW5nLCBBU3RyaW5nPiAqc2V0dGluZ3MpIGNvbnN0IHsKLSAgICBzZXR0aW5ncy0+Y2xlYXIoKTsKLSAgICBzZXR0aW5ncy0+aW5zZXJ0KG1HbG9iYWxTZXR0aW5ncy5iZWdpbigpLCBtR2xvYmFsU2V0dGluZ3MuZW5kKCkpOwotfQotCi1zdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Z2V0Q29kZWNJbmZvKGNvbnN0IGNoYXIgKm5hbWUsIENvZGVjSW5mbyAqaW5mbykgY29uc3QgewotICAgIGlmIChtQ29kZWNJbmZvcy5jb3VudChuYW1lKSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJDb2RlYyBub3QgZm91bmQgd2l0aCBuYW1lICclcyciLCBuYW1lKTsKLSAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotICAgIH0KLSAgICAqaW5mbyA9IG1Db2RlY0luZm9zLmF0KG5hbWUpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdldFF1aXJrcyhjb25zdCBjaGFyICpuYW1lLCBzdGQ6OnZlY3RvcjxBU3RyaW5nPiAqcXVpcmtzKSBjb25zdCB7Ci0gICAgaWYgKG1RdWlya3MuY291bnQobmFtZSkgPT0gMCkgewotICAgICAgICBBTE9HRSgiQ29kZWMgbm90IGZvdW5kIHdpdGggbmFtZSAnJXMnIiwgbmFtZSk7Ci0gICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKLSAgICB9Ci0gICAgcXVpcmtzLT5jbGVhcigpOwotICAgIHF1aXJrcy0+aW5zZXJ0KHF1aXJrcy0+ZW5kKCksIG1RdWlya3MuYXQobmFtZSkuYmVnaW4oKSwgbVF1aXJrcy5hdChuYW1lKS5lbmQoKSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvcmFkaW8vQW5kcm9pZC5icCBiL3JhZGlvL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNjE0ZjIuLjAwMDAwMDAKLS0tIGEvcmFkaW8vQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWNjX2xpYnJhcnlfc2hhcmVkIHsKLSAgICBuYW1lOiAibGlicmFkaW8iLAotCi0gICAgc3JjczogWwotICAgICAgICAiUmFkaW8uY3BwIiwKLSAgICAgICAgIklSYWRpby5jcHAiLAotICAgICAgICAiSVJhZGlvQ2xpZW50LmNwcCIsCi0gICAgICAgICJJUmFkaW9TZXJ2aWNlLmNwcCIsCi0gICAgXSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJyYWRpb19tZXRhZGF0YSIsCi0gICAgXSwKLQotICAgIGNmbGFnczogWwotICAgICAgICAiLVdlcnJvciIsCi0gICAgICAgICItV2FsbCIsCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL3JhZGlvL0lSYWRpby5jcHAgYi9yYWRpby9JUmFkaW8uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmYzYjY4Li4wMDAwMDAwCi0tLSBhL3JhZGlvL0lSYWRpby5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMzcgKzAsMCBAQAotLyoKLSoqCi0qKiBDb3B5cmlnaHQgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2RlZmluZSBMT0dfVEFHICJJUmFkaW8iCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW8uaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW9TZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8cmFkaW8vSVJhZGlvQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3JhZGlvLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL1JhZGlvTWV0YWRhdGFXcmFwcGVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotZW51bSB7Ci0gICAgREVUQUNIID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKLSAgICBTRVRfQ09ORklHVVJBVElPTiwKLSAgICBHRVRfQ09ORklHVVJBVElPTiwKLSAgICBTRVRfTVVURSwKLSAgICBHRVRfTVVURSwKLSAgICBTQ0FOLAotICAgIFNURVAsCi0gICAgVFVORSwKLSAgICBDQU5DRUwsCi0gICAgR0VUX1BST0dSQU1fSU5GT1JNQVRJT04sCi0gICAgSEFTX0NPTlRST0wKLX07Ci0KLWNsYXNzIEJwUmFkaW86IHB1YmxpYyBCcEludGVyZmFjZTxJUmFkaW8+Ci17Ci1wdWJsaWM6Ci0gICAgZXhwbGljaXQgQnBSYWRpbyhjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJUmFkaW8+KGltcGwpCi0gICAgewotICAgIH0KLQotICAgIHZvaWQgZGV0YWNoKCkKLSAgICB7Ci0gICAgICAgIEFMT0dWKCJkZXRhY2giKTsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoREVUQUNILCBkYXRhLCAmcmVwbHkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q29uZmlndXJhdGlvbihjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZykKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgaWYgKGNvbmZpZyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGUoY29uZmlnLCBzaXplb2Yoc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQ09ORklHVVJBVElPTiwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDb25maWd1cmF0aW9uKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBpZiAoY29uZmlnID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpbzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9DT05GSUdVUkFUSU9OLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHkucmVhZChjb25maWcsIHNpemVvZihzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TXV0ZShib29sIG11dGUpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihtdXRlID8gMSA6IDApOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX01VVEUsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TXV0ZShib29sICptdXRlKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBpZiAobXV0ZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfTVVURSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGludDMyX3QgbXV0ZXJlYWQgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgICAgICAqbXV0ZSA9IG11dGVyZWFkICE9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNjYW4ocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJDaGFubmVsKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoZGlyZWN0aW9uKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNraXBTdWJDaGFubmVsID8gMSA6IDApOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0NBTiwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwU3ViQ2hhbm5lbCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpbzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGRpcmVjdGlvbik7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihza2lwU3ViQ2hhbm5lbCA/IDEgOiAwKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNURVAsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgdHVuZSh1aW50MzJfdCBjaGFubmVsLCB1aW50MzJfdCBzdWJDaGFubmVsKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlVWludDMyKGNoYW5uZWwpOwotICAgICAgICBkYXRhLndyaXRlVWludDMyKHN1YkNoYW5uZWwpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoVFVORSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjYW5jZWwoKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQ0FOQ0VMLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb2dyYW1JbmZvcm1hdGlvbihzdHJ1Y3QgcmFkaW9fcHJvZ3JhbV9pbmZvICppbmZvKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBpZiAoaW5mbyA9PSBudWxscHRyIHx8IGluZm8tPm1ldGFkYXRhID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgcmFkaW9fbWV0YWRhdGFfdCAqbWV0YWRhdGEgPSBpbmZvLT5tZXRhZGF0YTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpbzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9QUk9HUkFNX0lORk9STUFUSU9OLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHkucmVhZChpbmZvLCBzaXplb2Yoc3RydWN0IHJhZGlvX3Byb2dyYW1faW5mbykpOwotICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgbG9jYWwgbWV0YWRhdGEgcG9pbnRlcgotICAgICAgICAgICAgICAgIGluZm8tPm1ldGFkYXRhID0gbWV0YWRhdGE7Ci0KLSAgICAgICAgICAgICAgICB1aW50MzJfdCBtZXRhZGF0YVNpemUgPSByZXBseS5yZWFkVWludDMyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhU2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJhZGlvX21ldGFkYXRhX3QgKm5ld01ldGFkYXRhID0gKHJhZGlvX21ldGFkYXRhX3QgKiltYWxsb2MobWV0YWRhdGFTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01ldGFkYXRhID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmVwbHkucmVhZChuZXdNZXRhZGF0YSwgbWV0YWRhdGFTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gcmFkaW9fbWV0YWRhdGFfYWRkX21ldGFkYXRhKCZpbmZvLT5tZXRhZGF0YSwgbmV3TWV0YWRhdGEpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKG5ld01ldGFkYXRhKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGhhc0NvbnRyb2woYm9vbCAqaGFzQ29udHJvbCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgaWYgKGhhc0NvbnRyb2wgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoSEFTX0NPTlRST0wsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAqaGFzQ29udHJvbCA9IHJlcGx5LnJlYWRJbnQzMigpICE9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci19OwotCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoUmFkaW8sICJhbmRyb2lkLmhhcmR3YXJlLklSYWRpbyIpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXR1c190IEJuUmFkaW86Om9uVHJhbnNhY3QoCi0gICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKLXsKLSAgICBzd2l0Y2goY29kZSkgewotICAgICAgICBjYXNlIERFVEFDSDogewotICAgICAgICAgICAgQUxPR1YoIkRFVEFDSCIpOwotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgZGV0YWNoKCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VUX0NPTkZJR1VSQVRJT046IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW8sIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyBjb25maWc7Ci0gICAgICAgICAgICBkYXRhLnJlYWQoJmNvbmZpZywgc2l6ZW9mKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZykpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0Q29uZmlndXJhdGlvbigmY29uZmlnKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBHRVRfQ09ORklHVVJBVElPTjogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnIGNvbmZpZzsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldENvbmZpZ3VyYXRpb24oJmNvbmZpZyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSgmY29uZmlnLCBzaXplb2Yoc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTRVRfTVVURTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYm9vbCBtdXRlID0gZGF0YS5yZWFkSW50MzIoKSAhPSAwOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0TXV0ZShtdXRlKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBHRVRfTVVURTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYm9vbCBtdXRlOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0TXV0ZSgmbXV0ZSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG11dGUgPyAxIDogMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTQ0FOOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24gPSAocmFkaW9fZGlyZWN0aW9uX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJvb2wgc2tpcFN1YkNoYW5uZWwgPSBkYXRhLnJlYWRJbnQzMigpID09IDE7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzY2FuKGRpcmVjdGlvbiwgc2tpcFN1YkNoYW5uZWwpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNURVA6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW8sIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiA9IChyYWRpb19kaXJlY3Rpb25fdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYm9vbCBza2lwU3ViQ2hhbm5lbCA9IGRhdGEucmVhZEludDMyKCkgPT0gMTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0ZXAoZGlyZWN0aW9uLCBza2lwU3ViQ2hhbm5lbCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgVFVORTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbCA9IGRhdGEucmVhZFVpbnQzMigpOwotICAgICAgICAgICAgdWludDMyX3Qgc3ViQ2hhbm5lbCA9IGRhdGEucmVhZFVpbnQzMigpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gdHVuZShjaGFubmVsLCBzdWJDaGFubmVsKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDQU5DRUw6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW8sIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNhbmNlbCgpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEdFVF9QUk9HUkFNX0lORk9STUFUSU9OOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzdHJ1Y3QgcmFkaW9fcHJvZ3JhbV9pbmZvIGluZm87Ci0gICAgICAgICAgICBSYWRpb01ldGFkYXRhV3JhcHBlciBtZXRhZGF0YVdyYXBwZXIoJmluZm8ubWV0YWRhdGEpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRQcm9ncmFtSW5mb3JtYXRpb24oJmluZm8pOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoJmluZm8sIHNpemVvZihzdHJ1Y3QgcmFkaW9fcHJvZ3JhbV9pbmZvKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJhZGlvX21ldGFkYXRhX2dldF9jb3VudChpbmZvLm1ldGFkYXRhKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUgPSByYWRpb19tZXRhZGF0YV9nZXRfc2l6ZShpbmZvLm1ldGFkYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlVWludDMyKCh1aW50MzJfdClzaXplKTsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKGluZm8ubWV0YWRhdGEsIHNpemUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVVpbnQzMigwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBIQVNfQ09OVFJPTDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYm9vbCBjb250cm9sOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaGFzQ29udHJvbCgmY29udHJvbCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGNvbnRyb2wgPyAxIDogMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9yYWRpby9JUmFkaW9DbGllbnQuY3BwIGIvcmFkaW8vSVJhZGlvQ2xpZW50LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EyMTk0OS4uMDAwMDAwMAotLS0gYS9yYWRpby9JUmFkaW9DbGllbnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSoqCi0qKiBDb3B5cmlnaHQgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW9DbGllbnQuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1lbnVtIHsKLSAgICBPTl9FVkVOVCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCi19OwotCi1jbGFzcyBCcFJhZGlvQ2xpZW50OiBwdWJsaWMgQnBJbnRlcmZhY2U8SVJhZGlvQ2xpZW50PgotewotCi1wdWJsaWM6Ci0gICAgZXhwbGljaXQgQnBSYWRpb0NsaWVudChjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJUmFkaW9DbGllbnQ+KGltcGwpCi0gICAgewotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBvbkV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpb0NsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihldmVudE1lbW9yeSkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoT05fRVZFTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5KTsKLSAgICB9Ci19OwotCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoUmFkaW9DbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuSVJhZGlvQ2xpZW50Iik7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgQm5SYWRpb0NsaWVudDo6b25UcmFuc2FjdCgKLSAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIHN3aXRjaChjb2RlKSB7Ci0gICAgICAgIGNhc2UgT05fRVZFTlQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW9DbGllbnQsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4oCi0gICAgICAgICAgICAgICAgZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICAgICAgb25FdmVudChldmVudE1lbW9yeSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotICAgIH0gICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3JhZGlvL0lSYWRpb1NlcnZpY2UuY3BwIGIvcmFkaW8vSVJhZGlvU2VydmljZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZTNhNjEuLjAwMDAwMDAKLS0tIGEvcmFkaW8vSVJhZGlvU2VydmljZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoKLSoqCi0qKiBDb3B5cmlnaHQgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2RlZmluZSBMT0dfVEFHICJCcFJhZGlvU2VydmljZSIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotCi0jaW5jbHVkZSA8cmFkaW8vSVJhZGlvU2VydmljZS5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpby5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpb0NsaWVudC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWVudW0gewotICAgIExJU1RfTU9EVUxFUyA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCi0gICAgQVRUQUNILAotfTsKLQotI2RlZmluZSBNQVhfSVRFTVNfUEVSX0xJU1QgMTAyNAotCi1jbGFzcyBCcFJhZGlvU2VydmljZTogcHVibGljIEJwSW50ZXJmYWNlPElSYWRpb1NlcnZpY2U+Ci17Ci1wdWJsaWM6Ci0gICAgZXhwbGljaXQgQnBSYWRpb1NlcnZpY2UoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCi0gICAgICAgIDogQnBJbnRlcmZhY2U8SVJhZGlvU2VydmljZT4oaW1wbCkKLSAgICB7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0TW9kdWxlcyhzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyAqcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKQotICAgIHsKLSAgICAgICAgaWYgKG51bU1vZHVsZXMgPT0gTlVMTCB8fCAoKm51bU1vZHVsZXMgIT0gMCAmJiBwcm9wZXJ0aWVzID09IE5VTEwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpb1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHVpbnQzMl90IG51bU1vZHVsZXNSZXEgPSAocHJvcGVydGllcyA9PSBOVUxMKSA/IDAgOiAqbnVtTW9kdWxlczsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKG51bU1vZHVsZXNSZXEpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTElTVF9NT0RVTEVTLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICAqbnVtTW9kdWxlcyA9ICh1aW50MzJfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigibGlzdE1vZHVsZXMoKSBzdGF0dXMgJWQgZ290ICpudW1Nb2R1bGVzICVkIiwgc3RhdHVzLCAqbnVtTW9kdWxlcyk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGlmIChudW1Nb2R1bGVzUmVxID4gKm51bU1vZHVsZXMpIHsKLSAgICAgICAgICAgICAgICBudW1Nb2R1bGVzUmVxID0gKm51bU1vZHVsZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobnVtTW9kdWxlc1JlcSA+IDApIHsKLSAgICAgICAgICAgICAgICByZXBseS5yZWFkKHByb3BlcnRpZXMsIG51bU1vZHVsZXNSZXEgKiBzaXplb2Yoc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgYXR0YWNoKHJhZGlvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJUmFkaW9DbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3aXRoQXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVJhZGlvPiYgcmFkaW8pCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW9TZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoaGFuZGxlKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihjbGllbnQpKTsKLSAgICAgICAgQUxPR1YoImF0dGFjaCgpIGNvbmZpZyAlcCB3aXRoQXVkaW8gJWQgcmVnaW9uICVkIHR5cGUgJWQiLAotICAgICAgICAgICAgICBjb25maWcgPT0gTlVMTCA/IDAgOiBjb25maWcsIHdpdGhBdWRpbywKLSAgICAgICAgICAgICAgY29uZmlnID09IE5VTEwgPyAwIDogY29uZmlnLT5yZWdpb24sCi0gICAgICAgICAgICAgIGNvbmZpZyA9PSBOVUxMID8gMCA6IGNvbmZpZy0+YmFuZC50eXBlKTsKLSAgICAgICAgaWYgKGNvbmZpZyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMSk7Ci0gICAgICAgICAgICBkYXRhLndyaXRlKGNvbmZpZywgc2l6ZW9mKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZykpOwotICAgICAgICB9Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMih3aXRoQXVkaW8gPyAxIDogMCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChBVFRBQ0gsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChyZXBseS5yZWFkSW50MzIoKSAhPSAwKSB7Ci0gICAgICAgICAgICByYWRpbyA9IGludGVyZmFjZV9jYXN0PElSYWRpbz4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLX07Ci0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShSYWRpb1NlcnZpY2UsICJhbmRyb2lkLmhhcmR3YXJlLklSYWRpb1NlcnZpY2UiKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0dXNfdCBCblJhZGlvU2VydmljZTo6b25UcmFuc2FjdCgKLSAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIHN3aXRjaChjb2RlKSB7Ci0gICAgICAgIGNhc2UgTElTVF9NT0RVTEVTOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvU2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgdWludDMyX3QgbnVtTW9kdWxlc1JlcSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAobnVtTW9kdWxlc1JlcSA+IE1BWF9JVEVNU19QRVJfTElTVCkgewotICAgICAgICAgICAgICAgIG51bU1vZHVsZXNSZXEgPSBNQVhfSVRFTVNfUEVSX0xJU1Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1aW50MzJfdCBudW1Nb2R1bGVzID0gbnVtTW9kdWxlc1JlcTsKLSAgICAgICAgICAgIHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzID0KLSAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzICopY2FsbG9jKG51bU1vZHVsZXNSZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMpKTsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihOT19NRU1PUlkpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOwotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbGlzdE1vZHVsZXMocHJvcGVydGllcywgJm51bU1vZHVsZXMpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG51bU1vZHVsZXMpOwotICAgICAgICAgICAgQUxPR1YoIkxJU1RfTU9EVUxFUyBzdGF0dXMgJWQgZ290IG51bU1vZHVsZXMgJWQiLCBzdGF0dXMsIG51bU1vZHVsZXMpOwotCi0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG51bU1vZHVsZXNSZXEgPiBudW1Nb2R1bGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG51bU1vZHVsZXNSZXEgPSBudW1Nb2R1bGVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUocHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtTW9kdWxlc1JlcSAqIHNpemVvZihzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcykpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJlZShwcm9wZXJ0aWVzKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIEFUVEFDSDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpb1NlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJhZGlvX2hhbmRsZV90IGhhbmRsZSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzcDxJUmFkaW9DbGllbnQ+IGNsaWVudCA9Ci0gICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElSYWRpb0NsaWVudD4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICAgICAgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnIGNvbmZpZzsKLSAgICAgICAgICAgIHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnUHRyID0gTlVMTDsKLSAgICAgICAgICAgIGlmIChkYXRhLnJlYWRJbnQzMigpICE9IDApIHsKLSAgICAgICAgICAgICAgICBkYXRhLnJlYWQoJmNvbmZpZywgc2l6ZW9mKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZykpOwotICAgICAgICAgICAgICAgIGNvbmZpZ1B0ciA9ICZjb25maWc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBib29sIHdpdGhBdWRpbyA9IGRhdGEucmVhZEludDMyKCkgIT0gMDsKLSAgICAgICAgICAgIEFMT0dWKCJBVFRBQ0ggY29uZmlnUHRyICVwIHdpdGhBdWRpbyAlZCIsIGNvbmZpZ1B0ciwgd2l0aEF1ZGlvKTsKLSAgICAgICAgICAgIHNwPElSYWRpbz4gcmFkaW87Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdHRhY2goaGFuZGxlLCBjbGllbnQsIGNvbmZpZ1B0ciwgd2l0aEF1ZGlvLCByYWRpbyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHJhZGlvICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigxKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIocmFkaW8pKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvcmFkaW8vT1dORVJTIGIvcmFkaW8vT1dORVJTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjM4YTM1Li4wMDAwMDAwCi0tLSBhL3JhZGlvL09XTkVSUworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotZWxhdXJlbnRAZ29vZ2xlLmNvbQotdHdhc2lsY3p5a0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9yYWRpby9SYWRpby5jcHAgYi9yYWRpby9SYWRpby5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZGQyMjEuLjAwMDAwMDAKLS0tIGEvcmFkaW8vUmFkaW8uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qCi0qKgotKiogQ29weXJpZ2h0IChDKSAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jZGVmaW5lIExPR19UQUcgIlJhZGlvIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotCi0jaW5jbHVkZSA8cmFkaW8vUmFkaW8uaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW8uaD4KLSNpbmNsdWRlIDxyYWRpby9JUmFkaW9TZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8cmFkaW8vSVJhZGlvQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8cmFkaW8vUmFkaW9DYWxsYmFjay5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLW5hbWVzcGFjZSB7Ci0gICAgc3A8SVJhZGlvU2VydmljZT4gICAgICAgICAgZ1JhZGlvU2VydmljZTsKLSAgICBjb25zdCBpbnQgICAgICAgICAgICAgICAgICBrUmFkaW9TZXJ2aWNlUG9sbERlbGF5ID0gNTAwMDAwOyAvLyAwLjVzCi0gICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAga1JhZGlvU2VydmljZU5hbWUgICAgICA9ICJtZWRpYS5yYWRpbyI7Ci0gICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgZ0xvY2s7Ci0KLSAgICBjbGFzcyBEZWF0aE5vdGlmaWVyIDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50Ci0gICAgewotICAgIHB1YmxpYzoKLSAgICAgICAgRGVhdGhOb3RpZmllcigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpIHsKLSAgICAgICAgICAgIEFMT0dWKCJiaW5kZXJEaWVkIik7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOwotICAgICAgICAgICAgZ1JhZGlvU2VydmljZS5jbGVhcigpOwotICAgICAgICAgICAgQUxPR1coIlJhZGlvIHNlcnZpY2UgZGllZCEiKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBzcDxEZWF0aE5vdGlmaWVyPiAgICAgICAgIGdEZWF0aE5vdGlmaWVyOwotfTsgLy8gbmFtZXNwYWNlIGFub255bW91cwotCi1jb25zdCBzcDxJUmFkaW9TZXJ2aWNlPiBSYWRpbzo6Z2V0UmFkaW9TZXJ2aWNlKCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOwotICAgIGlmIChnUmFkaW9TZXJ2aWNlLmdldCgpID09IDApIHsKLSAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwotICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXI7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KGtSYWRpb1NlcnZpY2VOYW1lKSk7Ci0gICAgICAgICAgICBpZiAoYmluZGVyICE9IDApIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dXKCJSYWRpb1NlcnZpY2Ugbm90IHB1Ymxpc2hlZCwgd2FpdGluZy4uLiIpOwotICAgICAgICAgICAgdXNsZWVwKGtSYWRpb1NlcnZpY2VQb2xsRGVsYXkpOwotICAgICAgICB9IHdoaWxlKHRydWUpOwotICAgICAgICBpZiAoZ0RlYXRoTm90aWZpZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgZ0RlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcigpOwotICAgICAgICB9Ci0gICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgoZ0RlYXRoTm90aWZpZXIpOwotICAgICAgICBnUmFkaW9TZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SVJhZGlvU2VydmljZT4oYmluZGVyKTsKLSAgICB9Ci0gICAgQUxPR0VfSUYoZ1JhZGlvU2VydmljZSA9PSAwLCAibm8gUmFkaW9TZXJ2aWNlIT8iKTsKLSAgICByZXR1cm4gZ1JhZGlvU2VydmljZTsKLX0KLQotLy8gU3RhdGljIG1ldGhvZHMKLXN0YXR1c190IFJhZGlvOjpsaXN0TW9kdWxlcyhzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyAqcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcykKLXsKLSAgICBBTE9HVigibGlzdE1vZHVsZXMoKSIpOwotICAgIGNvbnN0IHNwPElSYWRpb1NlcnZpY2U+IHNlcnZpY2UgPSBnZXRSYWRpb1NlcnZpY2UoKTsKLSAgICBpZiAoc2VydmljZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gc2VydmljZS0+bGlzdE1vZHVsZXMocHJvcGVydGllcywgbnVtTW9kdWxlcyk7Ci19Ci0KLXNwPFJhZGlvPiBSYWRpbzo6YXR0YWNoKHJhZGlvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3aXRoQXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxSYWRpb0NhbGxiYWNrPiYgY2FsbGJhY2spCi17Ci0gICAgQUxPR1YoImF0dGFjaCgpIik7Ci0gICAgc3A8UmFkaW8+IHJhZGlvOwotICAgIGNvbnN0IHNwPElSYWRpb1NlcnZpY2U+IHNlcnZpY2UgPSBnZXRSYWRpb1NlcnZpY2UoKTsKLSAgICBpZiAoc2VydmljZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiByYWRpbzsKLSAgICB9Ci0gICAgcmFkaW8gPSBuZXcgUmFkaW8oaGFuZGxlLCBjYWxsYmFjayk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gc2VydmljZS0+YXR0YWNoKGhhbmRsZSwgcmFkaW8sIGNvbmZpZywgd2l0aEF1ZGlvLCByYWRpby0+bUlSYWRpbyk7Ci0KLSAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIHJhZGlvLT5tSVJhZGlvICE9IDApIHsKLSAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIocmFkaW8tPm1JUmFkaW8pLT5saW5rVG9EZWF0aChyYWRpbyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1coIkVycm9yICVkIGNvbm5lY3RpbmcgdG8gcmFkaW8gc2VydmljZSIsIHN0YXR1cyk7Ci0gICAgICAgIHJhZGlvLmNsZWFyKCk7Ci0gICAgfQotICAgIHJldHVybiByYWRpbzsKLX0KLQotCi0KLS8vIFJhZGlvCi1SYWRpbzo6UmFkaW8ocmFkaW9faGFuZGxlX3QgLypoYW5kbGUqLywgY29uc3Qgc3A8UmFkaW9DYWxsYmFjaz4mIGNhbGxiYWNrKQotICAgIDogbUNhbGxiYWNrKGNhbGxiYWNrKQotewotfQotCi1SYWRpbzo6flJhZGlvKCkKLXsKLSAgICBpZiAobUlSYWRpbyAhPSAwKSB7Ci0gICAgICAgIG1JUmFkaW8tPmRldGFjaCgpOwotICAgIH0KLX0KLQotCi12b2lkIFJhZGlvOjpkZXRhY2goKSB7Ci0gICAgQUxPR1YoImRldGFjaCgpIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtQ2FsbGJhY2suY2xlYXIoKTsKLSAgICBpZiAobUlSYWRpbyAhPSAwKSB7Ci0gICAgICAgIG1JUmFkaW8tPmRldGFjaCgpOwotICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtSVJhZGlvKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKLSAgICAgICAgbUlSYWRpbyA9IDA7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBSYWRpbzo6c2V0Q29uZmlndXJhdGlvbihjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZykKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtSVJhZGlvID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtSVJhZGlvLT5zZXRDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci19Ci0KLXN0YXR1c190IFJhZGlvOjpnZXRDb25maWd1cmF0aW9uKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1JUmFkaW8gPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1JUmFkaW8tPmdldENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLX0KLQotc3RhdHVzX3QgUmFkaW86OnNldE11dGUoYm9vbCBtdXRlKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1JUmFkaW8gPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1JUmFkaW8tPnNldE11dGUobXV0ZSk7Ci19Ci0KLXN0YXR1c190IFJhZGlvOjpnZXRNdXRlKGJvb2wgKm11dGUpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUlSYWRpbyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbUlSYWRpby0+Z2V0TXV0ZShtdXRlKTsKLX0KLQotc3RhdHVzX3QgUmFkaW86OnNjYW4ocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJjaGFubmVsKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1JUmFkaW8gPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1JUmFkaW8tPnNjYW4oZGlyZWN0aW9uLCBza2lwU3ViY2hhbm5lbCk7Ci19Ci0KLXN0YXR1c190IFJhZGlvOjpzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwU3ViY2hhbm5lbCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtSVJhZGlvID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtSVJhZGlvLT5zdGVwKGRpcmVjdGlvbiwgc2tpcFN1YmNoYW5uZWwpOwotfQotCi1zdGF0dXNfdCBSYWRpbzo6dHVuZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IHN1YkNoYW5uZWwpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUlSYWRpbyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbUlSYWRpby0+dHVuZShjaGFubmVsLCBzdWJDaGFubmVsKTsKLX0KLQotc3RhdHVzX3QgUmFkaW86OmNhbmNlbCgpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUlSYWRpbyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbUlSYWRpby0+Y2FuY2VsKCk7Ci19Ci0KLXN0YXR1c190IFJhZGlvOjpnZXRQcm9ncmFtSW5mb3JtYXRpb24oc3RydWN0IHJhZGlvX3Byb2dyYW1faW5mbyAqaW5mbykKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtSVJhZGlvID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtSVJhZGlvLT5nZXRQcm9ncmFtSW5mb3JtYXRpb24oaW5mbyk7Ci19Ci0KLXN0YXR1c190IFJhZGlvOjpoYXNDb250cm9sKGJvb2wgKmhhc0NvbnRyb2wpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUlSYWRpbyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbUlSYWRpby0+aGFzQ29udHJvbChoYXNDb250cm9sKTsKLX0KLQotCi0vLyBCcFJhZGlvQ2xpZW50Ci12b2lkIFJhZGlvOjpvbkV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChldmVudE1lbW9yeSA9PSAwIHx8IGV2ZW50TWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gVGhlIGV2ZW50IGxheW91dCBpbiBzaGFyZWQgbWVtb3J5IGlzOgotICAgIC8vIHNpemVvZihzdHJ1Y3QgcmFkaW9fZXZlbnQpIGJ5dGVzIDogdGhlIGV2ZW50IGl0c2VsZgotICAgIC8vIDQgYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgIDogbWV0YWRhdGEgc2l6ZSBvciAwCi0gICAgLy8gTiBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtZXRhZGF0YSBpZiBwcmVzZW50Ci0gICAgc3RydWN0IHJhZGlvX2V2ZW50ICpldmVudCA9IChzdHJ1Y3QgcmFkaW9fZXZlbnQgKilldmVudE1lbW9yeS0+cG9pbnRlcigpOwotICAgIHVpbnQzMl90IG1ldGFkYXRhT2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCByYWRpb19ldmVudCkgKyBzaXplb2YodWludDMyX3QpOwotICAgIHVpbnQzMl90IG1ldGFkYXRhU2l6ZSA9ICoodWludDMyX3QgKikoKHVpbnQ4X3QgKilldmVudCArIG1ldGFkYXRhT2Zmc2V0IC0gc2l6ZW9mKHVpbnQzMl90KSk7Ci0KLSAgICAvLyByZXN0b3JlIGxvY2FsIG1ldGFkYXRhIHBvaW50ZXIgZnJvbSBvZmZzZXQKLSAgICBzd2l0Y2ggKGV2ZW50LT50eXBlKSB7Ci0gICAgY2FzZSBSQURJT19FVkVOVF9UVU5FRDoKLSAgICBjYXNlIFJBRElPX0VWRU5UX0FGX1NXSVRDSDoKLSAgICAgICAgaWYgKG1ldGFkYXRhU2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICBldmVudC0+aW5mby5tZXRhZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgIChyYWRpb19tZXRhZGF0YV90ICopKCh1aW50OF90ICopZXZlbnQgKyBtZXRhZGF0YU9mZnNldCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBldmVudC0+aW5mby5tZXRhZGF0YSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSQURJT19FVkVOVF9NRVRBREFUQToKLSAgICAgICAgaWYgKG1ldGFkYXRhU2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICBldmVudC0+bWV0YWRhdGEgPQotICAgICAgICAgICAgICAgICAgICAocmFkaW9fbWV0YWRhdGFfdCAqKSgodWludDhfdCAqKWV2ZW50ICsgbWV0YWRhdGFPZmZzZXQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZXZlbnQtPm1ldGFkYXRhID0gMDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAobUNhbGxiYWNrICE9IDApIHsKLSAgICAgICAgbUNhbGxiYWNrLT5vbkV2ZW50KGV2ZW50KTsKLSAgICB9Ci19Ci0KLQotLy9JQmluZGVyOjpEZWF0aFJlY2lwaWVudAotdm9pZCBSYWRpbzo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBBTE9HVygiUmFkaW8gc2VydmVyIGJpbmRlciBEaWVkICIpOwotICAgIG1JUmFkaW8gPSAwOwotICAgIHN0cnVjdCByYWRpb19ldmVudCBldmVudDsKLSAgICBtZW1zZXQoJmV2ZW50LCAwLCBzaXplb2Yoc3RydWN0IHJhZGlvX2V2ZW50KSk7Ci0gICAgZXZlbnQudHlwZSA9IFJBRElPX0VWRU5UX1NFUlZFUl9ESUVEOwotICAgIGV2ZW50LnN0YXR1cyA9IERFQURfT0JKRUNUOwotICAgIGlmIChtQ2FsbGJhY2sgIT0gMCkgewotICAgICAgICBtQ2FsbGJhY2stPm9uRXZlbnQoJmV2ZW50KTsKLSAgICB9Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCmluZGV4IDBkZjlhMzkuLjM5ZjA0ZmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCkBAIC0zMjYsOSArMzI2LDE0IEBACiAgICAgc3A8TW1hcFRocmVhZD4gdGhyZWFkID0gbU1tYXBUaHJlYWRzLnZhbHVlRm9yKGlvKTsKICAgICBpZiAodGhyZWFkICE9IDApIHsKICAgICAgICAgaW50ZXJmYWNlID0gbmV3IE1tYXBUaHJlYWRIYW5kbGUodGhyZWFkKTsKLSAgICAgICAgdGhyZWFkLT5jb25maWd1cmUoYXR0ciwgc3RyZWFtVHlwZSwgc2Vzc2lvbklkLCBjYWxsYmFjaywgcG9ydElkKTsKKyAgICAgICAgdGhyZWFkLT5jb25maWd1cmUoYXR0ciwgc3RyZWFtVHlwZSwgc2Vzc2lvbklkLCBjYWxsYmFjaywgKmRldmljZUlkLCBwb3J0SWQpOwogICAgICAgICAqaGFuZGxlID0gcG9ydElkOwogICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gTW1hcFN0cmVhbUludGVyZmFjZTo6RElSRUNUSU9OX09VVFBVVCkgeworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQoaW8sIHN0cmVhbVR5cGUsIHNlc3Npb25JZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KGlvLCBzZXNzaW9uSWQpOworICAgICAgICB9CiAgICAgICAgIHJldCA9IE5PX0lOSVQ7CiAgICAgfQogCkBAIC0xMzk3LDExICsxNDAyLDExIEBACiAgICAgLy8gdGhlIGNvbmZpZyBjaGFuZ2UgaXMgYWx3YXlzIHNlbnQgZnJvbSBwbGF5YmFjayBvciByZWNvcmQgdGhyZWFkcyB0byBhdm9pZCBkZWFkbG9jawogICAgIC8vIHdpdGggQXVkaW9TeXN0ZW06OmdMb2NrCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS0+c2VuZElvQ29uZmlnRXZlbnQoQVVESU9fT1VUUFVUX09QRU5FRCwgcGlkKTsKKyAgICAgICAgbVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLT5zZW5kSW9Db25maWdFdmVudChBVURJT19PVVRQVVRfUkVHSVNURVJFRCwgcGlkKTsKICAgICB9CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1SZWNvcmRUaHJlYWRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1SZWNvcmRUaHJlYWRzLnZhbHVlQXQoaSktPnNlbmRJb0NvbmZpZ0V2ZW50KEFVRElPX0lOUFVUX09QRU5FRCwgcGlkKTsKKyAgICAgICAgbVJlY29yZFRocmVhZHMudmFsdWVBdChpKS0+c2VuZElvQ29uZmlnRXZlbnQoQVVESU9fSU5QVVRfUkVHSVNURVJFRCwgcGlkKTsKICAgICB9CiB9CiAKQEAgLTI2MDMsNyArMjYwOCw3IEBACiAgICAgICAgICAgICB3aGlsZSAoZWMtPm1FZmZlY3RzLnNpemUoKSkgewogICAgICAgICAgICAgICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0ID0gZWMtPm1FZmZlY3RzWzBdOwogICAgICAgICAgICAgICAgIGVmZmVjdC0+dW5QaW4oKTsKLSAgICAgICAgICAgICAgICB0LT5yZW1vdmVFZmZlY3RfbChlZmZlY3QpOworICAgICAgICAgICAgICAgIHQtPnJlbW92ZUVmZmVjdF9sKGVmZmVjdCwgLypyZWxlYXNlKi8gdHJ1ZSk7CiAgICAgICAgICAgICAgICAgaWYgKGVmZmVjdC0+cHVyZ2VIYW5kbGVzKCkpIHsKICAgICAgICAgICAgICAgICAgICAgdC0+Y2hlY2tTdXNwZW5kT25FZmZlY3RFbmFibGVkX2woZWZmZWN0LCBmYWxzZSwgZWZmZWN0LT5zZXNzaW9uSWQoKSk7CiAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCmluZGV4IDkwMjNiMmQuLjYzODk4YTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKQEAgLTYwNCw3ICs2MDQsNyBAQAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YW5kYnkoKTsKIAogICAgIHByaXZhdGU6Ci0gICAgICAgIHNwPE1tYXBUaHJlYWQ+IG1UaHJlYWQ7CisgICAgICAgIGNvbnN0IHNwPE1tYXBUaHJlYWQ+IG1UaHJlYWQ7CiAgICAgfTsKIAogICAgICAgICAgICAgICBUaHJlYWRCYXNlICpjaGVja1RocmVhZF9sKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSBjb25zdDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcAppbmRleCBmMmMxYzRmLi5iZDVmMTQ2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvZWZmZWN0X25zLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvZWZmZWN0X3Zpc3VhbGl6ZXIuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RIYWxJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oPgogCkBAIC0xMDksNyArMTEwLDEwIEBACiB7CiAgICAgQUxPR1YoIkRlc3RydWN0b3IgJXAiLCB0aGlzKTsKICAgICBpZiAobUVmZmVjdEludGVyZmFjZSAhPSAwKSB7Ci0gICAgICAgIEFMT0dXKCJFZmZlY3RNb2R1bGUgJXAgZGVzdHJ1Y3RvciBjYWxsZWQgd2l0aCB1bnJlbGVhc2VkIGludGVyZmFjZSIsIHRoaXMpOworICAgICAgICBjaGFyIHV1aWRTdHJbNjRdOworICAgICAgICBBdWRpb0VmZmVjdDo6Z3VpZFRvU3RyaW5nKCZtRGVzY3JpcHRvci51dWlkLCB1dWlkU3RyLCBzaXplb2YodXVpZFN0cikpOworICAgICAgICBBTE9HVygiRWZmZWN0TW9kdWxlICVwIGRlc3RydWN0b3IgY2FsbGVkIHdpdGggdW5yZWxlYXNlZCBpbnRlcmZhY2UsIGVmZmVjdCAlcyIsCisgICAgICAgICAgICAgICAgdGhpcywgdXVpZFN0cik7CiAgICAgICAgIHJlbGVhc2VfbCgpOwogICAgIH0KIApAQCAtMTA4MSwxOCArMTA4NSwxMiBAQAogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKIAogICAgIHJlc3VsdC5hcHBlbmQoIlx0XHREZXNjcmlwdG9yOlxuIik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdC0gVVVJRDogJTA4WC0lMDRYLSUwNFgtJTA0WC0lMDJYJTAyWCUwMlglMDJYJTAyWCUwMlhcbiIsCi0gICAgICAgICAgICBtRGVzY3JpcHRvci51dWlkLnRpbWVMb3csIG1EZXNjcmlwdG9yLnV1aWQudGltZU1pZCwgbURlc2NyaXB0b3IudXVpZC50aW1lSGlBbmRWZXJzaW9uLAotICAgICAgICAgICAgbURlc2NyaXB0b3IudXVpZC5jbG9ja1NlcSwgbURlc2NyaXB0b3IudXVpZC5ub2RlWzBdLCBtRGVzY3JpcHRvci51dWlkLm5vZGVbMV0sCi0gICAgICAgICAgICAgICAgICAgIG1EZXNjcmlwdG9yLnV1aWQubm9kZVsyXSwKLSAgICAgICAgICAgIG1EZXNjcmlwdG9yLnV1aWQubm9kZVszXSxtRGVzY3JpcHRvci51dWlkLm5vZGVbNF0sbURlc2NyaXB0b3IudXVpZC5ub2RlWzVdKTsKKyAgICBjaGFyIHV1aWRTdHJbNjRdOworICAgIEF1ZGlvRWZmZWN0OjpndWlkVG9TdHJpbmcoJm1EZXNjcmlwdG9yLnV1aWQsIHV1aWRTdHIsIHNpemVvZih1dWlkU3RyKSk7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdC0gVVVJRDogJXNcbiIsIHV1aWRTdHIpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0LSBUWVBFOiAlMDhYLSUwNFgtJTA0WC0lMDRYLSUwMlglMDJYJTAyWCUwMlglMDJYJTAyWFxuIiwKLSAgICAgICAgICAgICAgICBtRGVzY3JpcHRvci50eXBlLnRpbWVMb3csIG1EZXNjcmlwdG9yLnR5cGUudGltZU1pZCwKLSAgICAgICAgICAgICAgICAgICAgbURlc2NyaXB0b3IudHlwZS50aW1lSGlBbmRWZXJzaW9uLAotICAgICAgICAgICAgICAgIG1EZXNjcmlwdG9yLnR5cGUuY2xvY2tTZXEsIG1EZXNjcmlwdG9yLnR5cGUubm9kZVswXSwgbURlc2NyaXB0b3IudHlwZS5ub2RlWzFdLAotICAgICAgICAgICAgICAgICAgICBtRGVzY3JpcHRvci50eXBlLm5vZGVbMl0sCi0gICAgICAgICAgICAgICAgbURlc2NyaXB0b3IudHlwZS5ub2RlWzNdLG1EZXNjcmlwdG9yLnR5cGUubm9kZVs0XSxtRGVzY3JpcHRvci50eXBlLm5vZGVbNV0pOworICAgIEF1ZGlvRWZmZWN0OjpndWlkVG9TdHJpbmcoJm1EZXNjcmlwdG9yLnR5cGUsIHV1aWRTdHIsIHNpemVvZih1dWlkU3RyKSk7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdC0gVFlQRTogJXNcbiIsIHV1aWRTdHIpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0LSBhcGlWZXJzaW9uOiAlMDhYXG5cdFx0LSBmbGFnczogJTA4WCAoJXMpXG4iLAogICAgICAgICAgICAgbURlc2NyaXB0b3IuYXBpVmVyc2lvbiwKQEAgLTEzMDYsMTEgKzEzMDQsMTAgQEAKICAgICBpZiAodGhyZWFkICE9IDApIHsKICAgICAgICAgdGhyZWFkLT5kaXNjb25uZWN0RWZmZWN0SGFuZGxlKHRoaXMsIHVucGluSWZMYXN0KTsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygiJXMgRWZmZWN0IGhhbmRsZSAlcCBkaXNjb25uZWN0ZWQgYWZ0ZXIgdGhyZWFkIGRlc3RydWN0aW9uIiwgX19GVU5DVElPTl9fLCB0aGlzKTsKICAgICAgICAgLy8gdHJ5IHRvIGNsZWFudXAgYXMgbXVjaCBhcyB3ZSBjYW4KICAgICAgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3QgPSBtRWZmZWN0LnByb21vdGUoKTsKLSAgICAgICAgaWYgKGVmZmVjdCAhPSAwKSB7Ci0gICAgICAgICAgICBlZmZlY3QtPmRpc2Nvbm5lY3RIYW5kbGUodGhpcywgdW5waW5JZkxhc3QpOworICAgICAgICBpZiAoZWZmZWN0ICE9IDAgJiYgZWZmZWN0LT5kaXNjb25uZWN0SGFuZGxlKHRoaXMsIHVucGluSWZMYXN0KSA+IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcyBFZmZlY3QgaGFuZGxlICVwIGRpc2Nvbm5lY3RlZCBhZnRlciB0aHJlYWQgZGVzdHJ1Y3Rpb24iLCBfX0ZVTkNUSU9OX18sIHRoaXMpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCmluZGV4IGM0ZjFhZjMuLmMxMGZhMDUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCkBAIC0xMzgsNyArMTM4LDggQEAKIAogdm9pZCBGYXN0TWl4ZXI6Om9uU3RhdGVDaGFuZ2UoKQogewotICAgIExPR19ISVNUX0ZMVVNIKCk7CisgICAgLy8gbG9nIHRoYXQgYXVkaW8gd2FzIHR1cm5lZCBvbi9vZmYKKyAgICBMT0dfQVVESU9fU1RBVEUoKTsKICAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdE1peGVyU3RhdGUgKikgbUN1cnJlbnQ7CiAgICAgY29uc3QgRmFzdE1peGVyU3RhdGUgKiBjb25zdCBwcmV2aW91cyA9IChjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKSBtUHJldmlvdXM7CiAgICAgRmFzdE1peGVyRHVtcFN0YXRlICogY29uc3QgZHVtcFN0YXRlID0gKEZhc3RNaXhlckR1bXBTdGF0ZSAqKSBtRHVtcFN0YXRlOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL01tYXBUcmFja3MuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9NbWFwVHJhY2tzLmgKaW5kZXggMmEyN2RmZC4uMzY2YTE2NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL01tYXBUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTW1hcFRyYWNrcy5oCkBAIC0yOCw2ICsyOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+TW1hcFRyYWNrKCk7CiAKQEAgLTM5LDcgKzQwLDcgQEAKICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzRmFzdFRyYWNrKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KIAogICAgICBzdGF0aWMgdm9pZCAgICAgICAgYXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSk7CiAKIHByaXZhdGU6CiAgICAgZnJpZW5kIGNsYXNzIE1tYXBUaHJlYWQ7CkBAIC01NSw1ICs1Niw2IEBACiAgICAgdmlydHVhbCBpbnQ2NF90IGZyYW1lc1JlbGVhc2VkKCkgY29uc3Q7CiAgICAgdmlydHVhbCB2b2lkIG9uVGltZXN0YW1wKGNvbnN0IEV4dGVuZGVkVGltZXN0YW1wICZ0aW1lc3RhbXApOwogCisgICAgcGlkX3QgbVBpZDsKIH07ICAvLyBlbmQgb2YgVHJhY2sKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL09XTkVSUyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAzZTRkMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9PV05FUlMKQEAgLTAsMCArMSwzIEBACitodW5nYUBnb29nbGUuY29tCitqbXRyaXZpQGdvb2dsZS5jb20KK21uYWdhbm92QGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcAppbmRleCBkN2MwNzI4Li4yN2M2ZDM1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCkBAIC00NzQsNiArNDc0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUpOwogICAgIGlmIChwYXRjaC0+bVBhdGNoUmVjb3JkID09IDApIHsKICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKQEAgLTQ5NCw2ICs0OTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQtPmJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQtPmJ1ZmZlclNpemUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FKTsKICAgICBpZiAocGF0Y2gtPm1QYXRjaFRyYWNrID09IDApIHsKICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmgKaW5kZXggM2YxYTBjMC4uMWMxYTk4OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmgKQEAgLTMwLDYgKzMwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCkBAIC00MCw3ICs0MSw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBpbml0Q2hlY2soKSBjb25zdDsKIAogICAgIHN0YXRpYyAgdm9pZCAgICAgICAgYXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGFjdGl2ZSk7CisgICAgICAgICAgICB2b2lkICAgICAgICBhcHBlbmREdW1wKFN0cmluZzgmIHJlc3VsdCwgYm9vbCBhY3RpdmUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24gPSBBVURJT19TRVNTSU9OX05PTkUpOwpAQCAtMjQwLDYgKzI0MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5QYXRjaFRyYWNrKCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaAppbmRleCAzZjgzY2E4Li5mOGRhNzgwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oCkBAIC0yOSw2ICsyOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLApAQCAtNTAsNyArNTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRtcDsgfQogCiAgICAgc3RhdGljICB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYWN0aXZlKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSk7CiAKICAgICAgICAgICAgIHZvaWQgICAgICAgIGhhbmRsZVN5bmNTdGFydEV2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIGNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKQEAgLTEwMiw2ICsxMDMsNyBAQAogICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+UGF0Y2hSZWNvcmQoKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwCmluZGV4IDNjNzM1NDMuLmMxMDQ0ZWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAKQEAgLTExMywxMCArMTEzLDE1IEBACiAgICAgcmV0dXJuIG9rOwogfQogCi1ib29sIGNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpIHsKLSAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0NhcHR1cmVIb3R3b3JkQWxsb3dlZCgiYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fSE9UV09SRCIpOwotICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCi0gICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzQ2FwdHVyZUhvdHdvcmRBbGxvd2VkKTsKK2Jvb2wgY2FwdHVyZUhvdHdvcmRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7CisgICAgLy8gQ0FQVFVSRV9BVURJT19IT1RXT1JEIHBlcm1pc3Npb24gaW1wbGllcyBSRUNPUkRfQVVESU8gcGVybWlzc2lvbgorICAgIGJvb2wgb2sgPSByZWNvcmRpbmdBbGxvd2VkKFN0cmluZzE2KCIiKSwgcGlkLCB1aWQpOworCisgICAgaWYgKG9rKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQ2FwdHVyZUhvdHdvcmRBbGxvd2VkKCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEIik7CisgICAgICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCisgICAgICAgIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNDYXB0dXJlSG90d29yZEFsbG93ZWQpOworICAgIH0KICAgICBpZiAoIW9rKSBBTE9HRSgiYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fSE9UV09SRCIpOwogICAgIHJldHVybiBvazsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5oCmluZGV4IDhiMWJjMDAuLjA0Y2I5Y2QgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaApAQCAtMjIsNyArMjIsNyBAQAogYm9vbCBpc1RydXN0ZWRDYWxsaW5nVWlkKHVpZF90IHVpZCk7CiBib29sIHJlY29yZGluZ0FsbG93ZWQoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKIGJvb2wgY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7Ci1ib29sIGNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpOworYm9vbCBjYXB0dXJlSG90d29yZEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpOwogYm9vbCBzZXR0aW5nc0FsbG93ZWQoKTsKIGJvb2wgbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpOwogYm9vbCBkdW1wQWxsb3dlZCgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCmluZGV4IDRiOGU1NDIuLmUyMDJjYTQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKQEAgLTE1NDQsNiArMTU0NCw3IEBACiAgICAgICAgIEFMT0dXKCJBY3RpdmVUcmFja3M8VD46OmFkZCB0cmFjayAlcCBhbHJlYWR5IHRoZXJlIiwgdHJhY2suZ2V0KCkpOwogICAgICAgICByZXR1cm4gaW5kZXg7CiAgICAgfQorICAgIGxvZ1RyYWNrKCJhZGQiLCB0cmFjayk7CiAgICAgbUFjdGl2ZVRyYWNrc0dlbmVyYXRpb24rKzsKICAgICBtTGF0ZXN0QWN0aXZlVHJhY2sgPSB0cmFjazsKICAgICArK21CYXR0ZXJ5Q291bnRlclt0cmFjay0+dWlkKCldLnNlY29uZDsKQEAgLTE1NTcsNiArMTU1OCw3IEBACiAgICAgICAgIEFMT0dXKCJBY3RpdmVUcmFja3M8VD46OnJlbW92ZSBub25leGlzdGVudCB0cmFjayAlcCIsIHRyYWNrLmdldCgpKTsKICAgICAgICAgcmV0dXJuIGluZGV4OwogICAgIH0KKyAgICBsb2dUcmFjaygicmVtb3ZlIiwgdHJhY2spOwogICAgIG1BY3RpdmVUcmFja3NHZW5lcmF0aW9uKys7CiAgICAgLS1tQmF0dGVyeUNvdW50ZXJbdHJhY2stPnVpZCgpXS5zZWNvbmQ7CiAgICAgLy8gbUxhdGVzdEFjdGl2ZVRyYWNrIGlzIG5vdCBjbGVhcmVkIGV2ZW4gaWYgaXMgdGhlIHNhbWUgYXMgdHJhY2suCkBAIC0xNTY3LDYgKzE1NjksNyBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OkFjdGl2ZVRyYWNrczxUPjo6Y2xlYXIoKSB7CiAgICAgZm9yIChjb25zdCBzcDxUPiAmdHJhY2sgOiBtQWN0aXZlVHJhY2tzKSB7CiAgICAgICAgIEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKS5ub3RlU3RvcEF1ZGlvKHRyYWNrLT51aWQoKSk7CisgICAgICAgIGxvZ1RyYWNrKCJjbGVhciIsIHRyYWNrKTsKICAgICB9CiAgICAgbUxhc3RBY3RpdmVUcmFja3NHZW5lcmF0aW9uID0gbUFjdGl2ZVRyYWNrc0dlbmVyYXRpb247CiAgICAgbUFjdGl2ZVRyYWNrcy5jbGVhcigpOwpAQCAtMTYwNSw2ICsxNjA4LDE2IEBACiAgICAgfQogfQogCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpBY3RpdmVUcmFja3M8VD46OmxvZ1RyYWNrKAorICAgICAgICBjb25zdCBjaGFyICpmdW5jTmFtZSwgY29uc3Qgc3A8VD4gJnRyYWNrKSBjb25zdCB7CisgICAgaWYgKG1Mb2NhbExvZyAhPSBudWxscHRyKSB7CisgICAgICAgIFN0cmluZzggcmVzdWx0OworICAgICAgICB0cmFjay0+YXBwZW5kRHVtcChyZXN1bHQsIGZhbHNlIC8qIGFjdGl2ZSAqLyk7CisgICAgICAgIG1Mb2NhbExvZy0+bG9nKCJBVDo6JS0xMHMoJXApICVzIiwgZnVuY05hbWUsIHRyYWNrLmdldCgpLCByZXN1bHQuc3RyaW5nKCkpOworICAgIH0KK30KKwogdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmJyb2FkY2FzdF9sKCkKIHsKICAgICAvLyBUaHJlYWQgY291bGQgYmUgYmxvY2tlZCB3YWl0aW5nIGZvciBhc3luYwpAQCAtMTY0MCw2ICsxNjUzLDcgQEAKICAgICAgICAgbVN1c3BlbmRlZCgwKSwgbUJ5dGVzV3JpdHRlbigwKSwKICAgICAgICAgbUZyYW1lc1dyaXR0ZW4oMCksCiAgICAgICAgIG1TdXNwZW5kZWRGcmFtZXMoMCksCisgICAgICAgIG1BY3RpdmVUcmFja3MoJnRoaXMtPm1Mb2NhbExvZyksCiAgICAgICAgIC8vIG1TdHJlYW1UeXBlc1tdIGluaXRpYWxpemVkIGluIGNvbnN0cnVjdG9yIGJvZHkKICAgICAgICAgbU91dHB1dChvdXRwdXQpLAogICAgICAgICBtTGFzdFdyaXRlVGltZSgtMSksIG1OdW1Xcml0ZXMoMCksIG1OdW1EZWxheWVkV3JpdGVzKDApLCBtSW5Xcml0ZShmYWxzZSksCkBAIC0xNjU0LDcgKzE2NjgsOCBAQAogICAgICAgICBtU2NyZWVuU3RhdGUoQXVkaW9GbGluZ2VyOjptU2NyZWVuU3RhdGUpLAogICAgICAgICAvLyBpbmRleCAwIGlzIHJlc2VydmVkIGZvciBub3JtYWwgbWl4ZXIncyBzdWJtaXgKICAgICAgICAgbUZhc3RUcmFja0F2YWlsTWFzaygoKDEgPDwgRmFzdE1peGVyU3RhdGU6OnNNYXhGYXN0VHJhY2tzKSAtIDEpICYgfjEpLAotICAgICAgICBtSHdTdXBwb3J0c1BhdXNlKGZhbHNlKSwgbUh3UGF1c2VkKGZhbHNlKSwgbUZsdXNoUGVuZGluZyhmYWxzZSkKKyAgICAgICAgbUh3U3VwcG9ydHNQYXVzZShmYWxzZSksIG1Id1BhdXNlZChmYWxzZSksIG1GbHVzaFBlbmRpbmcoZmFsc2UpLAorICAgICAgICBtTGVmdFZvbEZsb2F0KC0xLjApLCBtUmlnaHRWb2xGbG9hdCgtMS4wKQogewogICAgIHNucHJpbnRmKG1UaHJlYWROYW1lLCBrVGhyZWFkTmFtZUxlbmd0aCwgIkF1ZGlvT3V0XyVYIiwgaWQpOwogICAgIG1OQkxvZ1dyaXRlciA9IGF1ZGlvRmxpbmdlci0+bmV3V3JpdGVyX2woa0xvZ1NpemUsIG1UaHJlYWROYW1lKTsKQEAgLTE3MDcsOCArMTcyMiw2IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6ZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07CiAgICAgU3RyaW5nOCByZXN1bHQ7CiAKICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIFN0cmVhbSB2b2x1bWVzIGluIGRCOiAiKTsKQEAgLTE3MzUsOCArMTc0OCwxMCBAQAogICAgIHNpemVfdCBudW1hY3RpdmUgPSBtQWN0aXZlVHJhY2tzLnNpemUoKTsKICAgICBkcHJpbnRmKGZkLCAiICAlenUgVHJhY2tzIiwgbnVtdHJhY2tzKTsKICAgICBzaXplX3QgbnVtYWN0aXZlc2VlbiA9IDA7CisgICAgY29uc3QgY2hhciAqcHJlZml4ID0gIiAgICAiOwogICAgIGlmIChudW10cmFja3MpIHsKICAgICAgICAgZHByaW50ZihmZCwgIiBvZiB3aGljaCAlenUgYXJlIGFjdGl2ZVxuIiwgbnVtYWN0aXZlKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwogICAgICAgICBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bXRyYWNrczsgKytpKSB7CiAgICAgICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwpAQCAtMTc0NSw4ICsxNzYwLDggQEAKICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlKSB7CiAgICAgICAgICAgICAgICAgICAgIG51bWFjdGl2ZXNlZW4rKzsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFLCBhY3RpdmUpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7CisgICAgICAgICAgICAgICAgdHJhY2stPmFwcGVuZER1bXAocmVzdWx0LCBhY3RpdmUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTE3NTQsMTUgKzE3NjksMTUgQEAKICAgICB9CiAgICAgaWYgKG51bWFjdGl2ZXNlZW4gIT0gbnVtYWN0aXZlKSB7CiAgICAgICAgIC8vIHNvbWUgdHJhY2tzIGluIHRoZSBhY3RpdmUgbGlzdCB3ZXJlIG5vdCBpbiB0aGUgdHJhY2tzIGxpc3QKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICBUaGUgZm9sbG93aW5nIHRyYWNrcyBhcmUgaW4gdGhlIGFjdGl2ZSBsaXN0IGJ1dCIKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICBUaGUgZm9sbG93aW5nIHRyYWNrcyBhcmUgaW4gdGhlIGFjdGl2ZSBsaXN0IGJ1dCIKICAgICAgICAgICAgICAgICAiIG5vdCBpbiB0aGUgdHJhY2sgbGlzdFxuIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwogICAgICAgICBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWFjdGl2ZTsgKytpKSB7CiAgICAgICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldOwogICAgICAgICAgICAgaWYgKG1UcmFja3MuaW5kZXhPZih0cmFjaykgPCAwKSB7Ci0gICAgICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFLCB0cnVlKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOworICAgICAgICAgICAgICAgIHRyYWNrLT5hcHBlbmREdW1wKHJlc3VsdCwgdHJ1ZSAvKiBhY3RpdmUgKi8pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMjAxMyw3ICsyMDI4LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIHRyYWNrID0gbmV3IFRyYWNrKHRoaXMsIGNsaWVudCwgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgTlVMTCwgc2hhcmVkQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBidWZmZXIgKi8sIChzaXplX3QpMCAvKiBidWZmZXJTaXplICovLCBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgdWlkLCAqZmxhZ3MsIFRyYWNrQmFzZTo6VFlQRV9ERUZBVUxULCBwb3J0SWQpOwogCiAgICAgICAgIGxTdGF0dXMgPSB0cmFjayAhPSAwID8gdHJhY2stPmluaXRDaGVjaygpIDogKHN0YXR1c190KSBOT19NRU1PUlk7CkBAIC0yMTcyLDEwICsyMTg4LDYgQEAKICAgICAgICAgICAgIGNoYWluLT5pbmNBY3RpdmVUcmFja0NudCgpOwogICAgICAgICB9CiAKLSAgICAgICAgY2hhciBidWZmZXJbMjU2XTsKLSAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBhcnJheXNpemUoYnVmZmVyKSwgZmFsc2UgLyogYWN0aXZlICovKTsKLSAgICAgICAgbUxvY2FsTG9nLmxvZygiYWRkVHJhY2tfbCAgICAoJXApICVzIiwgdHJhY2suZ2V0KCksIGJ1ZmZlciArIDQpOyAvLyBsb2cgZm9yIGFuYWx5c2lzCi0KICAgICAgICAgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgfQogCkBAIC0yMjAyLDkgKzIyMTQsOSBAQAogewogICAgIHRyYWNrLT50cmlnZ2VyRXZlbnRzKEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX1BSRVNFTlRBVElPTl9DT01QTEVURSk7CiAKLSAgICBjaGFyIGJ1ZmZlclsyNTZdOwotICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgYXJyYXlzaXplKGJ1ZmZlciksIGZhbHNlIC8qIGFjdGl2ZSAqLyk7Ci0gICAgbUxvY2FsTG9nLmxvZygicmVtb3ZlVHJhY2tfbCAoJXApICVzIiwgdHJhY2suZ2V0KCksIGJ1ZmZlciArIDQpOyAvLyBsb2cgZm9yIGFuYWx5c2lzCisgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgdHJhY2stPmFwcGVuZER1bXAocmVzdWx0LCBmYWxzZSAvKiBhY3RpdmUgKi8pOworICAgIG1Mb2NhbExvZy5sb2coInJlbW92ZVRyYWNrX2wgKCVwKSAlcyIsIHRyYWNrLmdldCgpLCByZXN1bHQuc3RyaW5nKCkpOwogCiAgICAgbVRyYWNrcy5yZW1vdmUodHJhY2spOwogICAgIGRlbGV0ZVRyYWNrTmFtZV9sKHRyYWNrLT5uYW1lKCkpOwpAQCAtMjI0Miw2ICsyMjU0LDcgQEAKIAogICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICBjYXNlIEFVRElPX09VVFBVVF9PUEVORUQ6CisgICAgY2FzZSBBVURJT19PVVRQVVRfUkVHSVNURVJFRDoKICAgICBjYXNlIEFVRElPX09VVFBVVF9DT05GSUdfQ0hBTkdFRDoKICAgICAgICAgZGVzYy0+bVBhdGNoID0gbVBhdGNoOwogICAgICAgICBkZXNjLT5tQ2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2s7CkBAIC0zNDA0LDEwICszNDE3LDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICh0cmFjay0+aXNUZXJtaW5hdGVkKCkpIHsKICAgICAgICAgICAgICAgICByZW1vdmVUcmFja19sKHRyYWNrKTsKLSAgICAgICAgICAgIH0gZWxzZSB7IC8vIGluYWN0aXZlIGJ1dCBub3QgdGVybWluYXRlZAotICAgICAgICAgICAgICAgIGNoYXIgYnVmZmVyWzI1Nl07Ci0gICAgICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBhcnJheXNpemUoYnVmZmVyKSwgZmFsc2UgLyogYWN0aXZlICovKTsKLSAgICAgICAgICAgICAgICBtTG9jYWxMb2cubG9nKCJyZW1vdmVUcmFja3NfbCglcCkgJXMiLCB0cmFjay5nZXQoKSwgYnVmZmVyICsgNCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC00Mjg3LDYgKzQyOTYsNyBAQAogICAgICAgICAgICAgICAgICAgICBwYXJhbSA9IEF1ZGlvTWl4ZXI6OlJBTVBfVk9MVU1FOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlJFU0FNUExFLCBBdWRpb01peGVyOjpSRVNFVCwgTlVMTCk7CisgICAgICAgICAgICAgICAgbUxlZnRWb2xGbG9hdCA9IC0xLjA7CiAgICAgICAgICAgICAvLyBGSVhNRSBzaG91bGQgbm90IG1ha2UgYSBkZWNpc2lvbiBiYXNlZCBvbiBtU2VydmVyCiAgICAgICAgICAgICB9IGVsc2UgaWYgKGNibGstPm1TZXJ2ZXIgIT0gMCkgewogICAgICAgICAgICAgICAgIC8vIElmIHRoZSB0cmFjayBpcyBzdG9wcGVkIGJlZm9yZSB0aGUgZmlyc3QgZnJhbWUgd2FzIG1peGVkLApAQCAtNDI5Nyw2ICs0MzA3LDEwIEBACiAgICAgICAgICAgICAvLyBjb21wdXRlIHZvbHVtZSBmb3IgdGhpcyB0cmFjawogICAgICAgICAgICAgdWludDMyX3QgdmwsIHZyOyAgICAgICAvLyBpbiBVOC4yNCBpbnRlZ2VyIGZvcm1hdAogICAgICAgICAgICAgZmxvYXQgdmxmLCB2cmYsIHZhZjsgICAvLyBpbiBbMC4wLCAxLjBdIGZsb2F0IGZvcm1hdAorICAgICAgICAgICAgLy8gcmVhZCBvcmlnaW5hbCB2b2x1bWVzIHdpdGggdm9sdW1lIGNvbnRyb2wKKyAgICAgICAgICAgIGZsb2F0IHR5cGVWb2x1bWUgPSBtU3RyZWFtVHlwZXNbdHJhY2stPnN0cmVhbVR5cGUoKV0udm9sdW1lOworICAgICAgICAgICAgZmxvYXQgdiA9IG1hc3RlclZvbHVtZSAqIHR5cGVWb2x1bWU7CisKICAgICAgICAgICAgIGlmICh0cmFjay0+aXNQYXVzaW5nKCkgfHwgbVN0cmVhbVR5cGVzW3RyYWNrLT5zdHJlYW1UeXBlKCldLm11dGUpIHsKICAgICAgICAgICAgICAgICB2bCA9IHZyID0gMDsKICAgICAgICAgICAgICAgICB2bGYgPSB2cmYgPSB2YWYgPSAwLjsKQEAgLTQzMDQsMTAgKzQzMTgsNiBAQAogICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2V0UGF1c2VkKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgICAgIC8vIHJlYWQgb3JpZ2luYWwgdm9sdW1lcyB3aXRoIHZvbHVtZSBjb250cm9sCi0gICAgICAgICAgICAgICAgZmxvYXQgdHlwZVZvbHVtZSA9IG1TdHJlYW1UeXBlc1t0cmFjay0+c3RyZWFtVHlwZSgpXS52b2x1bWU7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdiA9IG1hc3RlclZvbHVtZSAqIHR5cGVWb2x1bWU7CiAgICAgICAgICAgICAgICAgc3A8QXVkaW9UcmFja1NlcnZlclByb3h5PiBwcm94eSA9IHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5OwogICAgICAgICAgICAgICAgIGdhaW5fbWluaWZsb2F0X3BhY2tlZF90IHZsciA9IHByb3h5LT5nZXRWb2x1bWVMUigpOwogICAgICAgICAgICAgICAgIHZsZiA9IGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfbGVmdCh2bHIpKTsKQEAgLTQzNTksNiArNDM2OSwyNSBAQAogICAgICAgICAgICAgICAgIHRyYWNrLT5tSGFzVm9sdW1lQ29udHJvbGxlciA9IGZhbHNlOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICAvLyBGb3IgZGVkaWNhdGVkIFZvSVAgb3V0cHV0cywgbGV0IHRoZSBIQUwgYXBwbHkgdGhlIHN0cmVhbSB2b2x1bWUuIFRyYWNrIHZvbHVtZSBpcworICAgICAgICAgICAgLy8gc3RpbGwgYXBwbGllZCBieSB0aGUgbWl4ZXIuCisgICAgICAgICAgICBpZiAoKG1PdXRwdXQtPmZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfVk9JUF9SWCkgIT0gMCkgeworICAgICAgICAgICAgICAgIHYgPSBtU3RyZWFtVHlwZXNbdHJhY2stPnN0cmVhbVR5cGUoKV0ubXV0ZSA/IDAuMGYgOiB2OworICAgICAgICAgICAgICAgIGlmICh2ICE9IG1MZWZ0Vm9sRmxvYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gbU91dHB1dC0+c3RyZWFtLT5zZXRWb2x1bWUodiwgdik7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFX0lGKHJlc3VsdCAhPSBPSywgIkVycm9yIHdoZW4gc2V0dGluZyBvdXRwdXQgc3RyZWFtIHZvbHVtZTogJWQiLCByZXN1bHQpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTGVmdFZvbEZsb2F0ID0gdjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBpZiBzdHJlYW0gdm9sdW1lIHdhcyBzdWNjZXNzZnVsbHkgc2VudCB0byB0aGUgSEFMLCBtTGVmdFZvbEZsb2F0ID09IHYgaGVyZSBhbmQgd2UKKyAgICAgICAgICAgICAgICAvLyByZW1vdmUgc3RyZWFtIHZvbHVtZSBjb250cmlidXRpb24gZnJvbSBzb2Z0d2FyZSB2b2x1bWUuCisgICAgICAgICAgICAgICAgaWYgKHYgIT0gMC4wZiAmJiBtTGVmdFZvbEZsb2F0ID09IHYpIHsKKyAgICAgICAgICAgICAgICAgICB2bGYgPSBtaW4oMS4wZiwgdmxmIC8gdik7CisgICAgICAgICAgICAgICAgICAgdnJmID0gbWluKDEuMGYsIHZyZiAvIHYpOworICAgICAgICAgICAgICAgICAgIHZhZiA9IG1pbigxLjBmLCB2YWYgLyB2KTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFhYWDogdGhlc2UgdGhpbmdzIERPTidUIG5lZWQgdG8gYmUgZG9uZSBlYWNoIHRpbWUKICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRCdWZmZXJQcm92aWRlcihuYW1lLCB0cmFjayk7CiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+ZW5hYmxlKG5hbWUpOwpAQCAtNDgwMCw3ICs0ODI5LDYgQEAKIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpEaXJlY3RPdXRwdXRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLAogICAgICAgICBBdWRpb1N0cmVhbU91dCogb3V0cHV0LCBhdWRpb19pb19oYW5kbGVfdCBpZCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgYm9vbCBzeXN0ZW1SZWFkeSkKICAgICA6ICAgUGxheWJhY2tUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCBkZXZpY2UsIERJUkVDVCwgc3lzdGVtUmVhZHkpCi0gICAgICAgIC8vIG1MZWZ0Vm9sRmxvYXQsIG1SaWdodFZvbEZsb2F0CiB7CiB9CiAKQEAgLTQ4MDgsNyArNDgzNiw2IEBACiAgICAgICAgIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCB1aW50MzJfdCBkZXZpY2UsCiAgICAgICAgIFRocmVhZEJhc2U6OnR5cGVfdCB0eXBlLCBib29sIHN5c3RlbVJlYWR5KQogICAgIDogICBQbGF5YmFja1RocmVhZChhdWRpb0ZsaW5nZXIsIG91dHB1dCwgaWQsIGRldmljZSwgdHlwZSwgc3lzdGVtUmVhZHkpCi0gICAgICAgIC8vIG1MZWZ0Vm9sRmxvYXQsIG1SaWdodFZvbEZsb2F0CiAgICAgICAgICwgbVZvbHVtZVNoYXBlckFjdGl2ZShmYWxzZSkKIHsKIH0KQEAgLTU5MjUsNyArNTk1Miw5IEBACiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6CiAgICAgVGhyZWFkQmFzZShhdWRpb0ZsaW5nZXIsIGlkLCBvdXREZXZpY2UsIGluRGV2aWNlLCBSRUNPUkQsIHN5c3RlbVJlYWR5KSwKLSAgICBtSW5wdXQoaW5wdXQpLCBtUnNtcEluQnVmZmVyKE5VTEwpLAorICAgIG1JbnB1dChpbnB1dCksCisgICAgbUFjdGl2ZVRyYWNrcygmdGhpcy0+bUxvY2FsTG9nKSwKKyAgICBtUnNtcEluQnVmZmVyKE5VTEwpLAogICAgIC8vIG1Sc21wSW5GcmFtZXMsIG1Sc21wSW5GcmFtZXNQMiwgYW5kIG1Sc21wSW5GcmFtZXNPQSBhcmUgc2V0IGJ5IHJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpCiAgICAgbVJzbXBJblJlYXIoMCkKICNpZmRlZiBURUVfU0lOSwpAQCAtNjY5Niw3ICs2NzI1LDggQEAKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAogICAgICAgICB0cmFjayA9IG5ldyBSZWNvcmRUcmFjayh0aGlzLCBjbGllbnQsIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgTlVMTCwgc2Vzc2lvbklkLCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIGJ1ZmZlciAqLywgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sIHNlc3Npb25JZCwgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICpmbGFncywgVHJhY2tCYXNlOjpUWVBFX0RFRkFVTFQsIHBvcnRJZCk7CiAKICAgICAgICAgbFN0YXR1cyA9IHRyYWNrLT5pbml0Q2hlY2soKTsKQEAgLTY4ODgsNiArNjkxOCwxMCBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpyZW1vdmVUcmFja19sKGNvbnN0IHNwPFJlY29yZFRyYWNrPiYgdHJhY2spCiB7CisgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgdHJhY2stPmFwcGVuZER1bXAocmVzdWx0LCBmYWxzZSAvKiBhY3RpdmUgKi8pOworICAgIG1Mb2NhbExvZy5sb2coInJlbW92ZVRyYWNrX2wgKCVwKSAlcyIsIHRyYWNrLmdldCgpLCByZXN1bHQuc3RyaW5nKCkpOworCiAgICAgbVRyYWNrcy5yZW1vdmUodHJhY2spOwogICAgIC8vIG5lZWQgYW55dGhpbmcgcmVsYXRlZCB0byBlZmZlY3RzIGhlcmU/CiAgICAgaWYgKHRyYWNrLT5pc0Zhc3RUcmFjaygpKSB7CkBAIC02OTAxLDYgKzY5MzUsOCBAQAogICAgIGR1bXBJbnRlcm5hbHMoZmQsIGFyZ3MpOwogICAgIGR1bXBUcmFja3MoZmQsIGFyZ3MpOwogICAgIGR1bXBFZmZlY3RDaGFpbnMoZmQsIGFyZ3MpOworICAgIGRwcmludGYoZmQsICIgIExvY2FsIGxvZzpcbiIpOworICAgIG1Mb2NhbExvZy5kdW1wKGZkLCAiICAgIiAvKiBwcmVmaXggKi8sIDQwIC8qIGxpbmVzICovKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6ZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCkBAIC02OTE0LDYgKzY5NTAsMTIgQEAKICAgICBpZiAobUFjdGl2ZVRyYWNrcy5zaXplKCkgPT0gMCkgewogICAgICAgICBkcHJpbnRmKGZkLCAiICBObyBhY3RpdmUgcmVjb3JkIGNsaWVudHNcbiIpOwogICAgIH0KKworICAgIGlmIChpbnB1dCAhPSBudWxscHRyKSB7CisgICAgICAgIGRwcmludGYoZmQsICIgIEhhbCBzdHJlYW0gZHVtcDpcbiIpOworICAgICAgICAodm9pZClpbnB1dC0+c3RyZWFtLT5kdW1wKGZkKTsKKyAgICB9CisKICAgICBkcHJpbnRmKGZkLCAiICBGYXN0IGNhcHR1cmUgdGhyZWFkOiAlc1xuIiwgaGFzRmFzdENhcHR1cmUoKSA/ICJ5ZXMiIDogIm5vIik7CiAgICAgZHByaW50ZihmZCwgIiAgRmFzdCB0cmFjayBhdmFpbGFibGU6ICVzXG4iLCBtRmFzdFRyYWNrQXZhaWwgPyAieWVzIiA6ICJubyIpOwogCkBAIC02OTI4LDE2ICs2OTcwLDE1IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwotCiAgICAgc2l6ZV90IG51bXRyYWNrcyA9IG1UcmFja3Muc2l6ZSgpOwogICAgIHNpemVfdCBudW1hY3RpdmUgPSBtQWN0aXZlVHJhY2tzLnNpemUoKTsKICAgICBzaXplX3QgbnVtYWN0aXZlc2VlbiA9IDA7CiAgICAgZHByaW50ZihmZCwgIiAgJXp1IFRyYWNrcyIsIG51bXRyYWNrcyk7CisgICAgY29uc3QgY2hhciAqcHJlZml4ID0gIiAgICAiOwogICAgIGlmIChudW10cmFja3MpIHsKICAgICAgICAgZHByaW50ZihmZCwgIiBvZiB3aGljaCAlenUgYXJlIGFjdGl2ZVxuIiwgbnVtYWN0aXZlKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwogICAgICAgICBSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bXRyYWNrcyA7ICsraSkgewogICAgICAgICAgICAgc3A8UmVjb3JkVHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKQEAgLTY5NDYsOCArNjk4Nyw4IEBACiAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZSkgewogICAgICAgICAgICAgICAgICAgICBudW1hY3RpdmVzZWVuKys7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSwgYWN0aXZlKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOworICAgICAgICAgICAgICAgIHRyYWNrLT5hcHBlbmREdW1wKHJlc3VsdCwgYWN0aXZlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7CkBAIC02OTU1LDE1ICs2OTk2LDE1IEBACiAgICAgfQogCiAgICAgaWYgKG51bWFjdGl2ZXNlZW4gIT0gbnVtYWN0aXZlKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgVGhlIGZvbGxvd2luZyB0cmFja3MgYXJlIGluIHRoZSBhY3RpdmUgbGlzdCBidXQiCisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgVGhlIGZvbGxvd2luZyB0cmFja3MgYXJlIGluIHRoZSBhY3RpdmUgbGlzdCBidXQiCiAgICAgICAgICAgICAgICAgIiBub3QgaW4gdGhlIHRyYWNrIGxpc3RcbiIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKICAgICAgICAgUmVjb3JkVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1hY3RpdmU7ICsraSkgewogICAgICAgICAgICAgc3A8UmVjb3JkVHJhY2s+IHRyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXTsKICAgICAgICAgICAgIGlmIChtVHJhY2tzLmluZGV4T2YodHJhY2spIDwgMCkgewotICAgICAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKKyAgICAgICAgICAgICAgICB0cmFjay0+YXBwZW5kRHVtcChyZXN1bHQsIHRydWUgLyogYWN0aXZlICovKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC03MjIxLDYgKzcyNjIsNyBAQAogCiAgICAgc3dpdGNoIChldmVudCkgewogICAgIGNhc2UgQVVESU9fSU5QVVRfT1BFTkVEOgorICAgIGNhc2UgQVVESU9fSU5QVVRfUkVHSVNURVJFRDoKICAgICBjYXNlIEFVRElPX0lOUFVUX0NPTkZJR19DSEFOR0VEOgogICAgICAgICBkZXNjLT5tUGF0Y2ggPSBtUGF0Y2g7CiAgICAgICAgIGRlc2MtPm1DaGFubmVsTWFzayA9IG1DaGFubmVsTWFzazsKQEAgLTc0ODIsMzQgKzc1MjQsMjIgQEAKIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZEhhbmRsZTo6TW1hcFRocmVhZEhhbmRsZShjb25zdCBzcDxNbWFwVGhyZWFkPiYgdGhyZWFkKQogICAgIDogbVRocmVhZCh0aHJlYWQpCiB7CisgICAgYXNzZXJ0KHRocmVhZCAhPSAwKTsgLy8gdGhyZWFkIG11c3Qgc3RhcnQgbm9uLW51bGwgYW5kIHN0YXkgbm9uLW51bGwKIH0KIAogQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkSGFuZGxlOjp+TW1hcFRocmVhZEhhbmRsZSgpCiB7Ci0gICAgTW1hcFRocmVhZCAqdGhyZWFkID0gbVRocmVhZC5nZXQoKTsKLSAgICAvLyBjbGVhciBvdXIgc3Ryb25nIHJlZmVyZW5jZSBiZWZvcmUgZGlzY29ubmVjdGluZyB0aGUgdGhyZWFkOiB0aGUgbGFzdCBzdHJvbmcgcmVmZXJlbmNlCi0gICAgLy8gd2lsbCBiZSByZW1vdmVkIHdoZW4gY2xvc2VJbnB1dC9jbG9zZU91dHB1dCBpcyBleGVjdXRlZCB1cG9uIGNhbGwgZnJvbSBhdWRpbyBwb2xpY3kgbWFuYWdlcgotICAgIC8vIGFuZCB0aGUgdGhyZWFkIHJlbW92ZWQgZnJvbSBtTU1hcFRocmVhZHMgbGlzdCBjYXVzaW5nIHRoZSB0aHJlYWQgZGVzdHJ1Y3Rpb24uCi0gICAgbVRocmVhZC5jbGVhcigpOwotICAgIGlmICh0aHJlYWQgIT0gbnVsbHB0cikgewotICAgICAgICB0aHJlYWQtPmRpc2Nvbm5lY3QoKTsKLSAgICB9CisgICAgbVRocmVhZC0+ZGlzY29ubmVjdCgpOwogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWRIYW5kbGU6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKQogewotICAgIGlmIChtVGhyZWFkID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQogICAgIHJldHVybiBtVGhyZWFkLT5jcmVhdGVNbWFwQnVmZmVyKG1pblNpemVGcmFtZXMsIGluZm8pOwogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWRIYW5kbGU6OmdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pCiB7Ci0gICAgaWYgKG1UaHJlYWQgPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9CiAgICAgcmV0dXJuIG1UaHJlYWQtPmdldE1tYXBQb3NpdGlvbihwb3NpdGlvbik7CiB9CiAKQEAgLTc1MTcsMjUgKzc1NDcsMTYgQEAKICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqaGFuZGxlKQogCiB7Ci0gICAgaWYgKG1UaHJlYWQgPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9CiAgICAgcmV0dXJuIG1UaHJlYWQtPnN0YXJ0KGNsaWVudCwgaGFuZGxlKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkSGFuZGxlOjpzdG9wKGF1ZGlvX3BvcnRfaGFuZGxlX3QgaGFuZGxlKQogewotICAgIGlmIChtVGhyZWFkID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQogICAgIHJldHVybiBtVGhyZWFkLT5zdG9wKGhhbmRsZSk7CiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZEhhbmRsZTo6c3RhbmRieSgpCiB7Ci0gICAgaWYgKG1UaHJlYWQgPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9CiAgICAgcmV0dXJuIG1UaHJlYWQtPnN0YW5kYnkoKTsKIH0KIApAQCAtNzU0NSw3ICs3NTY2LDEwIEBACiAgICAgICAgIEF1ZGlvSHdEZXZpY2UgKmh3RGV2LCBzcDxTdHJlYW1IYWxJbnRlcmZhY2U+IHN0cmVhbSwKICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dERldmljZSwgYXVkaW9fZGV2aWNlc190IGluRGV2aWNlLCBib29sIHN5c3RlbVJlYWR5KQogICAgIDogVGhyZWFkQmFzZShhdWRpb0ZsaW5nZXIsIGlkLCBvdXREZXZpY2UsIGluRGV2aWNlLCBNTUFQLCBzeXN0ZW1SZWFkeSksCi0gICAgICBtSGFsU3RyZWFtKHN0cmVhbSksIG1IYWxEZXZpY2UoaHdEZXYtPmh3RGV2aWNlKCkpLCBtQXVkaW9Id0Rldihod0RldikKKyAgICAgIG1TZXNzaW9uSWQoQVVESU9fU0VTU0lPTl9OT05FKSwKKyAgICAgIG1EZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwgbVBvcnRJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwKKyAgICAgIG1IYWxTdHJlYW0oc3RyZWFtKSwgbUhhbERldmljZShod0Rldi0+aHdEZXZpY2UoKSksIG1BdWRpb0h3RGV2KGh3RGV2KSwKKyAgICAgIG1BY3RpdmVUcmFja3MoJnRoaXMtPm1Mb2NhbExvZykKIHsKICAgICBtU3RhbmRieSA9IHRydWU7CiAgICAgcmVhZEhhbFBhcmFtZXRlcnNfbCgpOwpAQCAtNzU2Niw3ICs3NTkwLDcgQEAKICAgICBmb3IgKGNvbnN0IHNwPE1tYXBUcmFjaz4gJnQgOiBtQWN0aXZlVHJhY2tzKSB7CiAgICAgICAgIHN0b3AodC0+cG9ydElkKCkpOwogICAgIH0KLSAgICAvLyB0aGlzIHdpbGwgY2F1c2UgdGhlIGRlc3RydWN0aW9uIG9mIHRoaXMgdGhyZWFkLgorICAgIC8vIFRoaXMgd2lsbCBkZWNyZW1lbnQgcmVmZXJlbmNlcyBhbmQgbWF5IGNhdXNlIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGlzIHRocmVhZC4KICAgICBpZiAoaXNPdXRwdXQoKSkgewogICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChtSWQsIHN0cmVhbVR5cGUoKSwgbVNlc3Npb25JZCk7CiAgICAgfSBlbHNlIHsKQEAgLTc1NzksMTEgKzc2MDMsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxNbWFwU3RyZWFtQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBtQXR0ciA9ICphdHRyOwogICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CiAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgbURldmljZUlkID0gZGV2aWNlSWQ7CiAgICAgbVBvcnRJZCA9IHBvcnRJZDsKIH0KIApAQCAtNzYyOCw2ICs3NjU0LDEwIEBACiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKKyAgICBpZiAoIWlzT3V0cHV0KCkgJiYgIXJlY29yZGluZ0FsbG93ZWQoY2xpZW50LnBhY2thZ2VOYW1lLCBjbGllbnQuY2xpZW50UGlkLCBjbGllbnQuY2xpZW50VWlkKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogCiAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSBtSWQ7CkBAIC03NjM5LDcgKzc2NjksNyBAQAogICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IHN0cmVhbVR5cGUoKTsKICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPQogICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoQVVESU9fT1VUUFVUX0ZMQUdfTU1BUF9OT0lSUSB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7Ci0gICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkID0gbURldmljZUlkOwogICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cigmbUF0dHIsICZpbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbSwKQEAgLTc2NTMsNyArNzY4Myw3IEBACiAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IG1TYW1wbGVSYXRlOwogICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gbUNoYW5uZWxNYXNrOwogICAgICAgICBjb25maWcuZm9ybWF0ID0gbUZvcm1hdDsKLSAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQgPSBtRGV2aWNlSWQ7CiAgICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dEZvckF0dHIoJm1BdHRyLCAmaW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuY2xpZW50UGlkLApAQCAtNzY5Myw3ICs3NzIzLDcgQEAKICAgICB9CiAKICAgICBzcDxNbWFwVHJhY2s+IHRyYWNrID0gbmV3IE1tYXBUcmFjayh0aGlzLCBtU2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLCBtU2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5jbGllbnRVaWQsIHBvcnRJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LmNsaWVudFVpZCwgY2xpZW50LmNsaWVudFBpZCwgcG9ydElkKTsKIAogICAgIG1BY3RpdmVUcmFja3MuYWRkKHRyYWNrKTsKICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKG1TZXNzaW9uSWQpOwpAQCAtNzkwNCw4ICs3OTM0LDEwIEBACiAKICAgICBzd2l0Y2ggKGV2ZW50KSB7CiAgICAgY2FzZSBBVURJT19JTlBVVF9PUEVORUQ6CisgICAgY2FzZSBBVURJT19JTlBVVF9SRUdJU1RFUkVEOgogICAgIGNhc2UgQVVESU9fSU5QVVRfQ09ORklHX0NIQU5HRUQ6CiAgICAgY2FzZSBBVURJT19PVVRQVVRfT1BFTkVEOgorICAgIGNhc2UgQVVESU9fT1VUUFVUX1JFR0lTVEVSRUQ6CiAgICAgY2FzZSBBVURJT19PVVRQVVRfQ09ORklHX0NIQU5HRUQ6CiAgICAgICAgIGRlc2MtPm1QYXRjaCA9IG1QYXRjaDsKICAgICAgICAgZGVzYy0+bUNoYW5uZWxNYXNrID0gbUNoYW5uZWxNYXNrOwpAQCAtNzk5MCwxNyArODAyMiwxOSBAQAogICAgICAgICBtUHJldk91dERldmljZSA9IHR5cGU7CiAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEKTsKICAgICAgICAgc3A8TW1hcFN0cmVhbUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChjYWxsYmFjayAhPSAwKSB7CisgICAgICAgIGlmIChtRGV2aWNlSWQgIT0gZGV2aWNlSWQgJiYgY2FsbGJhY2sgIT0gMCkgewogICAgICAgICAgICAgY2FsbGJhY2stPm9uUm91dGluZ0NoYW5nZWQoZGV2aWNlSWQpOwogICAgICAgICB9CisgICAgICAgIG1EZXZpY2VJZCA9IGRldmljZUlkOwogICAgIH0KICAgICBpZiAoIWlzT3V0cHV0KCkgJiYgbVByZXZJbkRldmljZSAhPSBtSW5EZXZpY2UpIHsKICAgICAgICAgbVByZXZJbkRldmljZSA9IHR5cGU7CiAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQVVESU9fSU5QVVRfQ09ORklHX0NIQU5HRUQpOwogICAgICAgICBzcDxNbWFwU3RyZWFtQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICAgICAgaWYgKGNhbGxiYWNrICE9IDApIHsKKyAgICAgICAgaWYgKG1EZXZpY2VJZCAhPSBkZXZpY2VJZCAmJiBjYWxsYmFjayAhPSAwKSB7CiAgICAgICAgICAgICBjYWxsYmFjay0+b25Sb3V0aW5nQ2hhbmdlZChkZXZpY2VJZCk7CiAgICAgICAgIH0KKyAgICAgICAgbURldmljZUlkID0gZGV2aWNlSWQ7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC04MTE0LDEwICs4MTQ4LDggQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6OnRocmVhZExvb3BfZXhpdCgpCiB7Ci0gICAgc3A8TW1hcFN0cmVhbUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7Ci0gICAgaWYgKGNhbGxiYWNrICE9IDApIHsKLSAgICAgICAgY2FsbGJhY2stPm9uVGVhckRvd24oKTsKLSAgICB9CisgICAgLy8gRG8gbm90IGNhbGwgY2FsbGJhY2stPm9uVGVhckRvd24oKSBiZWNhdXNlIGl0IGlzIHJlZHVuZGFudCBmb3IgdGhyZWFkIGV4aXQKKyAgICAvLyBhbmQgYmVjYXVzZSBpdCBjYW4gY2F1c2UgYSByZWN1cnNpdmUgbXV0ZXggbG9jayBvbiBzdG9wKCkuCiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6c2V0U3luY0V2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50IF9fdW51c2VkKQpAQCAtODE3OCw2ICs4MjEwLDggQEAKICAgICBkdW1wSW50ZXJuYWxzKGZkLCBhcmdzKTsKICAgICBkdW1wVHJhY2tzKGZkLCBhcmdzKTsKICAgICBkdW1wRWZmZWN0Q2hhaW5zKGZkLCBhcmdzKTsKKyAgICBkcHJpbnRmKGZkLCAiICBMb2NhbCBsb2c6XG4iKTsKKyAgICBtTG9jYWxMb2cuZHVtcChmZCwgIiAgICIgLyogcHJlZml4ICovLCA0MCAvKiBsaW5lcyAqLyk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKQEAgLTgxOTQsMTggKzgyMjgsMTcgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6OmR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwotCiAgICAgc2l6ZV90IG51bXRyYWNrcyA9IG1BY3RpdmVUcmFja3Muc2l6ZSgpOwotICAgIGRwcmludGYoZmQsICIgICV6dSBUcmFja3MiLCBudW10cmFja3MpOworICAgIGRwcmludGYoZmQsICIgICV6dSBUcmFja3NcbiIsIG51bXRyYWNrcyk7CisgICAgY29uc3QgY2hhciAqcHJlZml4ID0gIiAgICAiOwogICAgIGlmIChudW10cmFja3MpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwogICAgICAgICBNbWFwVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW10cmFja3MgOyArK2kpIHsKICAgICAgICAgICAgIHNwPE1tYXBUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldOwotICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKKyAgICAgICAgICAgIHRyYWNrLT5hcHBlbmREdW1wKHJlc3VsdCwgdHJ1ZSAvKiBhY3RpdmUgKi8pOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgZHByaW50ZihmZCwgIlxuIik7CkBAIC04MjQwLDkgKzgyNzMsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxNbWFwU3RyZWFtQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICBNbWFwVGhyZWFkOjpjb25maWd1cmUoYXR0ciwgc3RyZWFtVHlwZSwgc2Vzc2lvbklkLCBjYWxsYmFjaywgcG9ydElkKTsKKyAgICBNbWFwVGhyZWFkOjpjb25maWd1cmUoYXR0ciwgc3RyZWFtVHlwZSwgc2Vzc2lvbklkLCBjYWxsYmFjaywgZGV2aWNlSWQsIHBvcnRJZCk7CiAgICAgbVN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaAppbmRleCAwNjJiYWQ2Li5kZDJiODliIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKQEAgLTUwOCw5ICs1MDgsMTAgQEAKICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgICAgICAgICAgICAgICBjbGFzcyBBY3RpdmVUcmFja3MgewogICAgICAgICAgICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgQWN0aXZlVHJhY2tzKCkKKyAgICAgICAgICAgICAgICAgICAgZXhwbGljaXQgQWN0aXZlVHJhY2tzKFNpbXBsZUxvZyAqbG9jYWxMb2cgPSBudWxscHRyKQogICAgICAgICAgICAgICAgICAgICAgICAgOiBtQWN0aXZlVHJhY2tzR2VuZXJhdGlvbigwKQogICAgICAgICAgICAgICAgICAgICAgICAgLCBtTGFzdEFjdGl2ZVRyYWNrc0dlbmVyYXRpb24oMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICwgbUxvY2FsTG9nKGxvY2FsTG9nKQogICAgICAgICAgICAgICAgICAgICB7IH0KIAogICAgICAgICAgICAgICAgICAgICB+QWN0aXZlVHJhY2tzKCkgewpAQCAtNTYyLDYgKzU2Myw4IEBACiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICB1cGRhdGVQb3dlclN0YXRlKHNwPFRocmVhZEJhc2U+IHRocmVhZCwgYm9vbCBmb3JjZSA9IGZhbHNlKTsKIAogICAgICAgICAgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBsb2dUcmFjayhjb25zdCBjaGFyICpmdW5jTmFtZSwgY29uc3Qgc3A8VD4gJnRyYWNrKSBjb25zdDsKKwogICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8dWlkX3Q+IGdldFdha2VMb2NrVWlkcygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3Rvcjx1aWRfdD4gd2FrZUxvY2tVaWRzOwogICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzcDxUPiAmdHJhY2sgOiBtQWN0aXZlVHJhY2tzKSB7CkBAIC01NzYsNiArNTc5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2tzR2VuZXJhdGlvbjsKICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBtTGFzdEFjdGl2ZVRyYWNrc0dlbmVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgIHdwPFQ+ICAgICAgICAgICAgICAgbUxhdGVzdEFjdGl2ZVRyYWNrOyAvLyBsYXRlc3QgdHJhY2sgYWRkZWQgdG8gQWN0aXZlVHJhY2tzCisgICAgICAgICAgICAgICAgICAgIFNpbXBsZUxvZyAqIGNvbnN0ICAgbUxvY2FsTG9nOwogICAgICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgICAgICBTaW1wbGVMb2cgbUxvY2FsTG9nOwpAQCAtOTk1LDYgKzk5OSw5IEBACiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgbUh3U3VwcG9ydHNQYXVzZTsKICAgICAgICAgICAgICAgICBib29sICAgICAgICBtSHdQYXVzZWQ7CiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgbUZsdXNoUGVuZGluZzsKKyAgICAgICAgICAgICAgICAvLyB2b2x1bWVzIGxhc3Qgc2VudCB0byBhdWRpbyBIQUwgd2l0aCBzdHJlYW0tPnNldFZvbHVtZSgpCisgICAgICAgICAgICAgICAgZmxvYXQgbUxlZnRWb2xGbG9hdDsKKyAgICAgICAgICAgICAgICBmbG9hdCBtUmlnaHRWb2xGbG9hdDsKIH07CiAKIGNsYXNzIE1peGVyVGhyZWFkIDogcHVibGljIFBsYXliYWNrVGhyZWFkIHsKQEAgLTExMTIsOSArMTExOSw2IEBACiAKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBvbkFkZE5ld1RyYWNrX2woKTsKIAotICAgIC8vIHZvbHVtZXMgbGFzdCBzZW50IHRvIGF1ZGlvIEhBTCB3aXRoIHN0cmVhbS0+c2V0X3ZvbHVtZSgpCi0gICAgZmxvYXQgbUxlZnRWb2xGbG9hdDsKLSAgICBmbG9hdCBtUmlnaHRWb2xGbG9hdDsKICAgICBib29sIG1Wb2x1bWVTaGFwZXJBY3RpdmU7CiAKICAgICBEaXJlY3RPdXRwdXRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLCBBdWRpb1N0cmVhbU91dCogb3V0cHV0LApAQCAtMTQ3NSw2ICsxNDc5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxNbWFwU3RyZWFtQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZGlzY29ubmVjdCgpOwpAQCAtMTUzNiw2ICsxNTQxLDcgQEAKIAogICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAgICAgIG1BdHRyOwogICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgIG1TZXNzaW9uSWQ7CisgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbURldmljZUlkOwogICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1Qb3J0SWQ7CiAKICAgICAgICAgICAgICAgICB3cDxNbWFwU3RyZWFtQ2FsbGJhY2s+ICBtQ2FsbGJhY2s7CkBAIC0xNTU4LDYgKzE1NjQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPE1tYXBTdHJlYW1DYWxsYmFjaz4mIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAKICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbU91dCogY2xlYXJPdXRwdXQoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaAppbmRleCBjYjU0MGNhLi5kNGNlMGI0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oCkBAIC02MSw2ICs2MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzT3V0LApAQCAtODIsNiArODMsNyBAQAogCiAgICAgICAgICAgICBzcDxJTWVtb3J5PiBnZXRCdWZmZXJzKCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlck1lbW9yeTsgfQogICAgICAgICAgICAgdm9pZCogICAgICAgYnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlcjsgfQorICAgICAgICAgICAgc2l6ZV90ICAgICAgYnVmZmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1CdWZmZXJTaXplOyB9CiAgICAgdmlydHVhbCBib29sICAgICAgICBpc0Zhc3RUcmFjaygpIGNvbnN0ID0gMDsKICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzT3V0cHV0VHJhY2soKSBjb25zdCB7IHJldHVybiAobVR5cGUgPT0gVFlQRV9PVVRQVVQpOyB9CiAgICAgICAgICAgICBib29sICAgICAgICBpc1BhdGNoVHJhY2soKSBjb25zdCB7IHJldHVybiAobVR5cGUgPT0gVFlQRV9QQVRDSCk7IH0KQEAgLTEzMyw2ICsxMzUsNDAgQEAKICAgICAgICAgbVRlcm1pbmF0ZWQgPSB0cnVlOwogICAgIH0KIAorICAgIC8vIFVwcGVyIGNhc2UgY2hhcmFjdGVycyBhcmUgZmluYWwgc3RhdGVzLgorICAgIC8vIExvd2VyIGNhc2UgY2hhcmFjdGVycyBhcmUgdHJhbnNpdG9yeS4KKyAgICBjb25zdCBjaGFyICpnZXRUcmFja1N0YXRlU3RyaW5nKCkgY29uc3QgeworICAgICAgICBpZiAoaXNUZXJtaW5hdGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAiVCAiOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAobVN0YXRlKSB7CisgICAgICAgIGNhc2UgSURMRToKKyAgICAgICAgICAgIHJldHVybiAiSSAiOworICAgICAgICBjYXNlIFNUT1BQSU5HXzE6IC8vIGZvciBGYXN0IGFuZCBPZmZsb2FkCisgICAgICAgICAgICByZXR1cm4gInMxIjsKKyAgICAgICAgY2FzZSBTVE9QUElOR18yOiAvLyBmb3IgRmFzdCBhbmQgT2ZmbG9hZAorICAgICAgICAgICAgcmV0dXJuICJzMiI7CisgICAgICAgIGNhc2UgU1RPUFBFRDoKKyAgICAgICAgICAgIHJldHVybiAiUyAiOworICAgICAgICBjYXNlIFJFU1VNSU5HOgorICAgICAgICAgICAgcmV0dXJuICJyICI7CisgICAgICAgIGNhc2UgQUNUSVZFOgorICAgICAgICAgICAgcmV0dXJuICJBICI7CisgICAgICAgIGNhc2UgUEFVU0lORzoKKyAgICAgICAgICAgIHJldHVybiAicCAiOworICAgICAgICBjYXNlIFBBVVNFRDoKKyAgICAgICAgICAgIHJldHVybiAiUCAiOworICAgICAgICBjYXNlIEZMVVNIRUQ6CisgICAgICAgICAgICByZXR1cm4gIkYgIjsKKyAgICAgICAgY2FzZSBTVEFSVElOR18xOiAvLyBmb3IgUmVjb3JkVHJhY2sKKyAgICAgICAgICAgIHJldHVybiAicjEiOworICAgICAgICBjYXNlIFNUQVJUSU5HXzI6IC8vIGZvciBSZWNvcmRUcmFjaworICAgICAgICAgICAgcmV0dXJuICJyMiI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIj8gIjsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGJvb2wgaXNPdXQoKSBjb25zdCB7IHJldHVybiBtSXNPdXQ7IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRydWUgZm9yIFRyYWNrLCBmYWxzZSBmb3IgUmVjb3JkVHJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGNvdWxkIGJlIGEgdHJhY2sgdHlwZSBpZiBuZWVkZWQgbGF0ZXIKQEAgLTE0NCw2ICsxODAsNyBAQAogICAgIHNwPElNZW1vcnk+ICAgICAgICAgbUJ1ZmZlck1lbW9yeTsgIC8vIGN1cnJlbnRseSBub24tMCBmb3IgZmFzdCBSZWNvcmRUcmFjayBvbmx5CiAgICAgdm9pZCogICAgICAgICAgICAgICBtQnVmZmVyOyAgICAvLyBzdGFydCBvZiB0cmFjayBidWZmZXIsIHR5cGljYWxseSBpbiBzaGFyZWQgbWVtb3J5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGNlcHQgZm9yIE91dHB1dFRyYWNrIHdoZW4gaXQgaXMgaW4gbG9jYWwgbWVtb3J5CisgICAgc2l6ZV90ICAgICAgICAgICAgICBtQnVmZmVyU2l6ZTsgLy8gc2l6ZSBvZiBtQnVmZmVyIGluIGJ5dGVzCiAgICAgLy8gd2UgZG9uJ3QgcmVhbGx5IG5lZWQgYSBsb2NrIGZvciB0aGVzZQogICAgIHRyYWNrX3N0YXRlICAgICAgICAgbVN0YXRlOwogICAgIGNvbnN0IHVpbnQzMl90ICAgICAgbVNhbXBsZVJhdGU7ICAgIC8vIGluaXRpYWwgc2FtcGxlIHJhdGUgb25seTsgZm9yIHRyYWNrcyB3aGljaApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcAppbmRleCA5NzYzYmYyLi4wZjI1MTUzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcApAQCAtNTAsMTAgKzUwLDYgQEAKICNkZWZpbmUgQUxPR1ZWKGEuLi4pIGRvIHsgfSB3aGlsZSgwKQogI2VuZGlmCiAKLS8vIFRPRE8gbW92ZSB0byBhIGNvbW1vbiBoZWFkZXIgIChBbHNvIHNoYXJlZCB3aXRoIEF1ZGlvVHJhY2suY3BwKQotI2RlZmluZSBOQU5PU19QRVJfU0VDT05EICAgIDEwMDAwMDAwMDAKLSNkZWZpbmUgVElNRV9UT19OQU5PUyh0aW1lKSAoKHVpbnQ2NF90KSh0aW1lKS50dl9zZWMgKiBOQU5PU19QRVJfU0VDT05EICsgKHRpbWUpLnR2X25zZWMpCi0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNzEsNiArNjcsNyBAQAogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAogICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKICAgICAgICAgICAgIGJvb2wgaXNPdXQsCkBAIC04MSw3ICs3OCw3IEBACiAgICAgICAgIG1UaHJlYWQodGhyZWFkKSwKICAgICAgICAgbUNsaWVudChjbGllbnQpLAogICAgICAgICBtQ2JsayhOVUxMKSwKLSAgICAgICAgLy8gbUJ1ZmZlcgorICAgICAgICAvLyBtQnVmZmVyLCBtQnVmZmVyU2l6ZQogICAgICAgICBtU3RhdGUoSURMRSksCiAgICAgICAgIG1TYW1wbGVSYXRlKHNhbXBsZVJhdGUpLAogICAgICAgICBtRm9ybWF0KGZvcm1hdCksCkBAIC0xMTMsMTUgKzExMCwyMiBAQAogCiAgICAgLy8gQUxPR0QoIkNyZWF0aW5nIHRyYWNrIHdpdGggJWQgYnVmZmVycyBAICVkIGJ5dGVzIiwgYnVmZmVyQ291bnQsIGJ1ZmZlclNpemUpOwogCi0gICAgc2l6ZV90IGJ1ZmZlclNpemUgPSBidWZmZXIgPT0gTlVMTCA/IHJvdW5kdXAoZnJhbWVDb3VudCkgOiBmcmFtZUNvdW50OworICAgIHNpemVfdCBtaW5CdWZmZXJTaXplID0gYnVmZmVyID09IE5VTEwgPyByb3VuZHVwKGZyYW1lQ291bnQpIDogZnJhbWVDb3VudDsKICAgICAvLyBjaGVjayBvdmVyZmxvdyB3aGVuIGNvbXB1dGluZyBidWZmZXJTaXplIGR1ZSB0byBtdWx0aXBsaWNhdGlvbiBieSBtRnJhbWVTaXplLgotICAgIGlmIChidWZmZXJTaXplIDwgZnJhbWVDb3VudCAgLy8gcm91bmR1cCByb3VuZHMgZG93biBmb3IgdmFsdWVzIGFib3ZlIFVJTlRfTUFYIC8gMgorICAgIGlmIChtaW5CdWZmZXJTaXplIDwgZnJhbWVDb3VudCAgLy8gcm91bmR1cCByb3VuZHMgZG93biBmb3IgdmFsdWVzIGFib3ZlIFVJTlRfTUFYIC8gMgogICAgICAgICAgICAgfHwgbUZyYW1lU2l6ZSA9PSAwICAgLy8gZm9ybWF0IG5lZWRzIHRvIGJlIGNvcnJlY3QKLSAgICAgICAgICAgIHx8IGJ1ZmZlclNpemUgPiBTSVpFX01BWCAvIG1GcmFtZVNpemUpIHsKKyAgICAgICAgICAgIHx8IG1pbkJ1ZmZlclNpemUgPiBTSVpFX01BWCAvIG1GcmFtZVNpemUpIHsKICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzNDc0OTU3MSIpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGJ1ZmZlclNpemUgKj0gbUZyYW1lU2l6ZTsKKyAgICBtaW5CdWZmZXJTaXplICo9IG1GcmFtZVNpemU7CisKKyAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgYnVmZmVyU2l6ZSA9IG1pbkJ1ZmZlclNpemU7IC8vIGFsbG9jYXRlZCBoZXJlLgorICAgIH0gZWxzZSBpZiAobWluQnVmZmVyU2l6ZSA+IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzODM0MDExNyIpOworICAgICAgICByZXR1cm47CisgICAgfQogCiAgICAgc2l6ZV90IHNpemUgPSBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKICAgICBpZiAoYnVmZmVyID09IE5VTEwgJiYgYWxsb2MgPT0gQUxMT0NfQ0JMSykgewpAQCAtMTc3LDYgKzE4MSw3IEBACiAgICAgICAgICAgICAvLyBJdCBzaG91bGQgcmVmZXJlbmNlcyB0aGUgYnVmZmVyIHZpYSB0aGUgcGlwZS4KICAgICAgICAgICAgIC8vIFRoZXJlZm9yZSwgdG8gZGV0ZWN0IGluY29ycmVjdCB1c2FnZSBvZiB0aGUgYnVmZmVyLCB3ZSBzZXQgbUJ1ZmZlciB0byBOVUxMLgogICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICBidWZmZXJTaXplID0gMDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFMTE9DX0NCTEs6CiAgICAgICAgICAgICAvLyBjbGVhciBhbGwgYnVmZmVycwpAQCAtMTk2LDcgKzIwMSwxMCBAQAogICAgICAgICBjYXNlIEFMTE9DX05PTkU6CiAgICAgICAgICAgICBtQnVmZmVyID0gYnVmZmVyOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJpbnZhbGlkIGFsbG9jYXRpb24gdHlwZTogJWQiLCAoaW50KWFsbG9jKTsKICAgICAgICAgfQorICAgICAgICBtQnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemU7CiAKICNpZmRlZiBURUVfU0lOSwogICAgICAgICBpZiAobVRlZVNpbmtUcmFja0VuYWJsZWQpIHsKQEAgLTM2OCw2ICszNzYsNyBAQAogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAogICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgICAgICB1aWRfdCB1aWQsCkBAIC0zNzYsNiArMzg1LDcgQEAKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBjbGllbnQsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAoc2hhcmVkQnVmZmVyICE9IDApID8gc2hhcmVkQnVmZmVyLT5wb2ludGVyKCkgOiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAoc2hhcmVkQnVmZmVyICE9IDApID8gc2hhcmVkQnVmZmVyLT5zaXplKCkgOiBidWZmZXJTaXplLAogICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCB1aWQsIHRydWUgLyppc091dCovLAogICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gVFlQRV9QQVRDSCkgPyAoIGJ1ZmZlciA9PSBOVUxMID8gQUxMT0NfTE9DQUwgOiBBTExPQ19OT05FKSA6IEFMTE9DX0NCTEssCiAgICAgICAgICAgICAgICAgICB0eXBlLCBwb3J0SWQpLApAQCAtNDExLDIxICs0MjEsNiBAQAogICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5ID0gbmV3IEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICBtRnJhbWVTaXplLCAhaXNFeHRlcm5hbFRyYWNrKCksIHNhbXBsZVJhdGUpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIElzIHRoZSBzaGFyZWQgYnVmZmVyIG9mIHN1ZmZpY2llbnQgc2l6ZT8KLSAgICAgICAgLy8gKGZyYW1lQ291bnQgKiBtRnJhbWVTaXplKSBpcyA8PSBTSVpFX01BWCwgY2hlY2tlZCBpbiBUcmFja0Jhc2UuCi0gICAgICAgIGlmIChzaGFyZWRCdWZmZXItPnNpemUoKSA8IGZyYW1lQ291bnQgKiBtRnJhbWVTaXplKSB7Ci0gICAgICAgICAgICAvLyBXb3JrYXJvdW5kOiBjbGVhciBvdXQgbUNibGsgdG8gaW5kaWNhdGUgdHJhY2sgaGFzbid0IGJlZW4gcHJvcGVybHkgY3JlYXRlZC4KLSAgICAgICAgICAgIG1DYmxrLT5+YXVkaW9fdHJhY2tfY2Jsa190KCk7ICAgLy8gZGVzdHJveSBvdXIgc2hhcmVkLXN0cnVjdHVyZS4KLSAgICAgICAgICAgIGlmIChtQ2xpZW50ID09IDApIHsKLSAgICAgICAgICAgICAgICBmcmVlKG1DYmxrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYmxrID0gTlVMTDsKLQotICAgICAgICAgICAgbVNoYXJlZEJ1ZmZlci5jbGVhcigpOyAvLyByZWxlYXNlIHNoYXJlZCBidWZmZXIgZWFybHkKLSAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzgzNDAxMTciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCiAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHkgPSBuZXcgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgIG1GcmFtZVNpemUpOwogICAgIH0KQEAgLTUwMyw1OCArNDk4LDQwIEBACiAKIC8qc3RhdGljKi8gdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICAgIE5hbWUgQWN0aXZlIENsaWVudCBUeXBlICAgICAgRm10IENobiBtYXNrIFNlc3Npb24gZkNvdW50IFMgRiBTUmF0ZSAgIgotICAgICAgICAgICAgICAgICAgIkwgZEIgIFIgZEIgIFZTIGRCICAgIFNlcnZlciBNYWluIGJ1ZiAgQXV4IGJ1ZiBGbGFncyBVbmRGcm1DbnQgIEZsdXNoZWRcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoIlQgTmFtZSBBY3RpdmUgQ2xpZW50IFNlc3Npb24gUyAgRmxhZ3MgIgorICAgICAgICAgICAgICAgICAgIiAgRm9ybWF0IENobiBtYXNrICBTUmF0ZSAiCisgICAgICAgICAgICAgICAgICAiU1QgIEwgZEIgIFIgZEIgIFZTIGRCICIKKyAgICAgICAgICAgICAgICAgICIgIFNlcnZlciBGcm1DbnQgIEZybVJkeSBGIFVuZGVycnVucyAgRmx1c2hlZCAiCisgICAgICAgICAgICAgICAgICAiTWFpbiBCdWYgIEF1eCBCdWZcbiIpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYWN0aXZlKQordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6YXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlKQogewotICAgIGdhaW5fbWluaWZsb2F0X3BhY2tlZF90IHZsciA9IG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFZvbHVtZUxSKCk7Ci0gICAgaWYgKGlzRmFzdFRyYWNrKCkpIHsKLSAgICAgICAgc3ByaW50ZihidWZmZXIsICIgICAgRiAlMmQiLCBtRmFzdEluZGV4KTsKLSAgICB9IGVsc2UgaWYgKG1OYW1lID49IEF1ZGlvTWl4ZXI6OlRSQUNLMCkgewotICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiAgICAlNGQiLCBtTmFtZSAtIEF1ZGlvTWl4ZXI6OlRSQUNLMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3ByaW50ZihidWZmZXIsICIgICAgbm9uZSIpOwotICAgIH0KLSAgICB0cmFja19zdGF0ZSBzdGF0ZSA9IG1TdGF0ZTsKLSAgICBjaGFyIHN0YXRlQ2hhcjsKLSAgICBpZiAoaXNUZXJtaW5hdGVkKCkpIHsKLSAgICAgICAgc3RhdGVDaGFyID0gJ1QnOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgY2FzZSBJRExFOgotICAgICAgICAgICAgc3RhdGVDaGFyID0gJ0knOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RPUFBJTkdfMToKLSAgICAgICAgICAgIHN0YXRlQ2hhciA9ICdzJzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUT1BQSU5HXzI6Ci0gICAgICAgICAgICBzdGF0ZUNoYXIgPSAnNSc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVE9QUEVEOgotICAgICAgICAgICAgc3RhdGVDaGFyID0gJ1MnOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUkVTVU1JTkc6Ci0gICAgICAgICAgICBzdGF0ZUNoYXIgPSAnUic7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBQ1RJVkU6Ci0gICAgICAgICAgICBzdGF0ZUNoYXIgPSAnQSc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQQVVTSU5HOgotICAgICAgICAgICAgc3RhdGVDaGFyID0gJ3AnOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUEFVU0VEOgotICAgICAgICAgICAgc3RhdGVDaGFyID0gJ1AnOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRkxVU0hFRDoKLSAgICAgICAgICAgIHN0YXRlQ2hhciA9ICdGJzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgc3RhdGVDaGFyID0gJz8nOwotICAgICAgICAgICAgYnJlYWs7CisgICAgY2hhciB0cmFja1R5cGU7CisgICAgc3dpdGNoIChtVHlwZSkgeworICAgIGNhc2UgVFlQRV9ERUZBVUxUOgorICAgIGNhc2UgVFlQRV9PVVRQVVQ6CisgICAgICAgIGlmIChtU2hhcmVkQnVmZmVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHRyYWNrVHlwZSA9ICdTJzsgLy8gc3RhdGljCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cmFja1R5cGUgPSAnICc7IC8vIG5vcm1hbAogICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVFlQRV9QQVRDSDoKKyAgICAgICAgdHJhY2tUeXBlID0gJ1AnOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICB0cmFja1R5cGUgPSAnPyc7CiAgICAgfQorCisgICAgaWYgKGlzRmFzdFRyYWNrKCkpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiRiVjICUzZCIsIHRyYWNrVHlwZSwgbUZhc3RJbmRleCk7CisgICAgfSBlbHNlIGlmIChtTmFtZSA+PSBBdWRpb01peGVyOjpUUkFDSzApIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJWMgJTRkIiwgdHJhY2tUeXBlLCBtTmFtZSAtIEF1ZGlvTWl4ZXI6OlRSQUNLMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJWMgbm9uZSIsIHRyYWNrVHlwZSk7CisgICAgfQorCiAgICAgY2hhciBub3dJblVuZGVycnVuOwogICAgIHN3aXRjaCAobU9ic2VydmVkVW5kZXJydW5zLm1CaXRGaWVsZHMubU1vc3RSZWNlbnQpIHsKICAgICBjYXNlIFVOREVSUlVOX0ZVTEw6CkBAIC01NzEsMzEgKzU0OCw3NSBAQAogICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBzdGQ6OnBhaXI8ZmxvYXQgLyogdm9sdW1lICovLCBib29sIC8qIGFjdGl2ZSAqLz4gdnNWb2x1bWUgPSBtVm9sdW1lSGFuZGxlci0+Z2V0TGFzdFZvbHVtZSgpOwotICAgIHNucHJpbnRmKCZidWZmZXJbOF0sIHNpemUgLSA4LCAiICU2cyAlNnUgJTR1ICUwOFggJTA4WCAlN3UgJTZ6dSAlMWMgJTFkICU1dSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlNS4yZyAlNS4yZyAlNS4yZyVjICAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMDhYICUwOHpYICUwOHpYIDB4JTAzWCAlOXUlYyAlN3VcbiIsCisgICAgY2hhciBmaWxsaW5nU3RhdHVzOworICAgIHN3aXRjaCAobUZpbGxpbmdVcFN0YXR1cykgeworICAgIGNhc2UgRlNfSU5WQUxJRDoKKyAgICAgICAgZmlsbGluZ1N0YXR1cyA9ICdJJzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGU19GSUxMSU5HOgorICAgICAgICBmaWxsaW5nU3RhdHVzID0gJ2YnOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZTX0ZJTExFRDoKKyAgICAgICAgZmlsbGluZ1N0YXR1cyA9ICdGJzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGU19BQ1RJVkU6CisgICAgICAgIGZpbGxpbmdTdGF0dXMgPSAnQSc7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGZpbGxpbmdTdGF0dXMgPSAnPyc7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIGNsaXAgZnJhbWVzUmVhZHlTYWZlIHRvIG1heCByZXByZXNlbnRhdGlvbiBpbiBkdW1wCisgICAgY29uc3Qgc2l6ZV90IGZyYW1lc1JlYWR5U2FmZSA9CisgICAgICAgICAgICBzdGQ6Om1pbihtQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNSZWFkeVNhZmUoKSwgKHNpemVfdCk5OTk5OTk5OSk7CisKKyAgICAvLyBvYnRhaW4gdm9sdW1lcworICAgIGNvbnN0IGdhaW5fbWluaWZsb2F0X3BhY2tlZF90IHZsciA9IG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFZvbHVtZUxSKCk7CisgICAgY29uc3Qgc3RkOjpwYWlyPGZsb2F0IC8qIHZvbHVtZSAqLywgYm9vbCAvKiBhY3RpdmUgKi8+IHZzVm9sdW1lID0KKyAgICAgICAgICAgIG1Wb2x1bWVIYW5kbGVyLT5nZXRMYXN0Vm9sdW1lKCk7CisKKyAgICAvLyBPdXIgZWZmZWN0aXZlIGZyYW1lIGNvdW50IGlzIG9idGFpbmVkIGJ5IFNlcnZlclByb3h5OjpnZXRCdWZmZXJTaXplSW5GcmFtZXMoKQorICAgIC8vIGFzIGl0IG1heSBiZSByZWR1Y2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAgICBjb25zdCBzaXplX3QgYnVmZmVyU2l6ZUluRnJhbWVzID0gKHNpemVfdCltQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRCdWZmZXJTaXplSW5GcmFtZXMoKTsKKyAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBidWZmZXIgc2l6ZSBoYXMgYmVlbiBtb2RpZmllZCBieSB0aGUgYXBwLgorICAgIGNvbnN0IGNoYXIgbW9kaWZpZWRCdWZmZXJDaGFyID0gYnVmZmVyU2l6ZUluRnJhbWVzIDwgbUZyYW1lQ291bnQKKyAgICAgICAgICAgID8gJ3InIC8qIGJ1ZmZlciByZWR1Y2VkICovOiBidWZmZXJTaXplSW5GcmFtZXMgPiBtRnJhbWVDb3VudAorICAgICAgICAgICAgICAgICAgICA/ICdlJyAvKiBlcnJvciAqLyA6ICcgJyAvKiBpZGVudGljYWwgKi87CisKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlN3MgJTZ1ICU3dSAlMnMgMHglMDNYICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMDhYICUwOFggJTZ1ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMnUgJTUuMmcgJTUuMmcgJTUuMmclYyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTA4WCAlNnp1JWMgJTZ6dSAlYyAlOXUlYyAlN3UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwOHpYICUwOHpYXG4iLAogICAgICAgICAgICAgYWN0aXZlID8gInllcyIgOiAibm8iLAogICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWRfY2FjaGVkIDogbUNsaWVudC0+cGlkKCksCi0gICAgICAgICAgICBtU3RyZWFtVHlwZSwKKyAgICAgICAgICAgIG1TZXNzaW9uSWQsCisgICAgICAgICAgICBnZXRUcmFja1N0YXRlU3RyaW5nKCksCisgICAgICAgICAgICBtQ2Jsay0+bUZsYWdzLAorCiAgICAgICAgICAgICBtRm9ybWF0LAogICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAotICAgICAgICAgICAgbVNlc3Npb25JZCwKLSAgICAgICAgICAgIG1GcmFtZUNvdW50LAotICAgICAgICAgICAgc3RhdGVDaGFyLAotICAgICAgICAgICAgbUZpbGxpbmdVcFN0YXR1cywKICAgICAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFNhbXBsZVJhdGUoKSwKKworICAgICAgICAgICAgbVN0cmVhbVR5cGUsCiAgICAgICAgICAgICAyMC4wICogbG9nMTAoZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19sZWZ0KHZscikpKSwKICAgICAgICAgICAgIDIwLjAgKiBsb2cxMChmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX3JpZ2h0KHZscikpKSwKICAgICAgICAgICAgIDIwLjAgKiBsb2cxMCh2c1ZvbHVtZS5maXJzdCksIC8vIFZvbHVtZVNoYXBlcihzKSB0b3RhbCB2b2x1bWUKICAgICAgICAgICAgIHZzVm9sdW1lLnNlY29uZCA/ICdBJyA6ICcgJywgIC8vIGlmIGFueSBWb2x1bWVTaGFwZXJzIGFjdGl2ZQorCiAgICAgICAgICAgICBtQ2Jsay0+bVNlcnZlciwKLSAgICAgICAgICAgIChzaXplX3QpbU1haW5CdWZmZXIsIC8vIHVzZSAlelggYXMgJXAgYXBwZW5kcyAweAotICAgICAgICAgICAgKHNpemVfdCltQXV4QnVmZmVyLCAgLy8gdXNlICV6WCBhcyAlcCBhcHBlbmRzIDB4Ci0gICAgICAgICAgICBtQ2Jsay0+bUZsYWdzLAorICAgICAgICAgICAgYnVmZmVyU2l6ZUluRnJhbWVzLAorICAgICAgICAgICAgbW9kaWZpZWRCdWZmZXJDaGFyLAorICAgICAgICAgICAgZnJhbWVzUmVhZHlTYWZlLAorICAgICAgICAgICAgZmlsbGluZ1N0YXR1cywKICAgICAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFVuZGVycnVuRnJhbWVzKCksCiAgICAgICAgICAgICBub3dJblVuZGVycnVuLAotICAgICAgICAgICAgKHVuc2lnbmVkKW1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc0ZsdXNoZWQoKSAlIDEwMDAwMDAwKTsgLy8gNyBkaWdpdHMKKyAgICAgICAgICAgICh1bnNpZ25lZCltQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNGbHVzaGVkKCkgJSAxMDAwMDAwMCwKKworICAgICAgICAgICAgKHNpemVfdCltTWFpbkJ1ZmZlciwgLy8gdXNlICV6WCBhcyAlcCBhcHBlbmRzIDB4CisgICAgICAgICAgICAoc2l6ZV90KW1BdXhCdWZmZXIgICAvLyB1c2UgJXpYIGFzICVwIGFwcGVuZHMgMHgKKyAgICAgICAgICAgICk7CiB9CiAKIHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpzYW1wbGVSYXRlKCkgY29uc3QgewpAQCAtMTIzNSw3ICsxMjU2LDggQEAKICAgICAgICAgICAgIHVpZF90IHVpZCkKICAgICA6ICAgVHJhY2socGxheWJhY2tUaHJlYWQsIE5VTEwsIEFVRElPX1NUUkVBTV9QQVRDSCwKICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgTlVMTCwgMCwgQVVESU9fU0VTU0lPTl9OT05FLCB1aWQsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgIG51bGxwdHIgLyogYnVmZmVyICovLCAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywgbnVsbHB0ciAvKiBzaGFyZWRCdWZmZXIgKi8sCisgICAgICAgICAgICAgIEFVRElPX1NFU1NJT05fTk9ORSwgdWlkLCBBVURJT19PVVRQVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICBUWVBFX09VVFBVVCksCiAgICAgbUFjdGl2ZShmYWxzZSksIG1Tb3VyY2VUaHJlYWQoc291cmNlVGhyZWFkKQogewpAQCAtMTM1MSw3ICsxMzczLDkgQEAKICAgICAgICAgICAgIGlmIChtQnVmZmVyUXVldWUuc2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlclF1ZXVlLnJlbW92ZUF0KDApOwogICAgICAgICAgICAgICAgIGZyZWUocEluQnVmZmVyLT5tQnVmZmVyKTsKLSAgICAgICAgICAgICAgICBkZWxldGUgcEluQnVmZmVyOworICAgICAgICAgICAgICAgIGlmIChwSW5CdWZmZXIgIT0gJmluQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwSW5CdWZmZXI7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEFMT0dWKCJPdXRwdXRUcmFjazo6d3JpdGUoKSAlcCB0aHJlYWQgJXAgcmVsZWFzZWQgb3ZlcmZsb3cgYnVmZmVyICV6dSIsIHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkLnVuc2FmZV9nZXQoKSwgbUJ1ZmZlclF1ZXVlLnNpemUoKSk7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTQzMCwxMCArMTQ1NCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykKICAgICA6ICAgVHJhY2socGxheWJhY2tUaHJlYWQsIE5VTEwsIHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgIGJ1ZmZlciwgMCwgQVVESU9fU0VTU0lPTl9OT05FLCBnZXR1aWQoKSwgZmxhZ3MsIFRZUEVfUEFUQ0gpLAorICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZlclNpemUsIG51bGxwdHIgLyogc2hhcmVkQnVmZmVyICovLAorICAgICAgICAgICAgICBBVURJT19TRVNTSU9OX05PTkUsIGdldHVpZCgpLCBmbGFncywgVFlQRV9QQVRDSCksCiAgICAgICAgICAgICAgIG1Qcm94eShuZXcgQ2xpZW50UHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsIG1GcmFtZVNpemUsIHRydWUsIHRydWUpKQogewogICAgIHVpbnQ2NF90IG1peEJ1ZmZlck5zID0gKCh1aW50NjRfdCkyICogcGxheWJhY2tUaHJlYWQtPmZyYW1lQ291bnQoKSAqIDEwMDAwMDAwMDApIC8KQEAgLTE1NjcsMTMgKzE1OTMsMTQgQEAKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgdHJhY2tfdHlwZSB0eXBlLAogICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiAgICAgOiAgIFRyYWNrQmFzZSh0aHJlYWQsIGNsaWVudCwgc2FtcGxlUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIGJ1ZmZlciwgc2Vzc2lvbklkLCB1aWQsIGZhbHNlIC8qaXNPdXQqLywKKyAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBidWZmZXIsIGJ1ZmZlclNpemUsIHNlc3Npb25JZCwgdWlkLCBmYWxzZSAvKmlzT3V0Ki8sCiAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBUWVBFX0RFRkFVTFQpID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgKChmbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgPyBBTExPQ19QSVBFIDogQUxMT0NfQ0JMSykgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJ1ZmZlciA9PSBOVUxMKSA/IEFMTE9DX0xPQ0FMIDogQUxMT0NfTk9ORSksCkBAIC0xNzAxLDIyICsxNzI4LDI4IEBACiAKIC8qc3RhdGljKi8gdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KQogewotICAgIHJlc3VsdC5hcHBlbmQoIiAgICBBY3RpdmUgQ2xpZW50IEZtdCBDaG4gbWFzayBTZXNzaW9uIFMgICBTZXJ2ZXIgZkNvdW50IFNSYXRlXG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKCJBY3RpdmUgQ2xpZW50IFNlc3Npb24gUyAgRmxhZ3MgICBGb3JtYXQgQ2huIG1hc2sgIFNSYXRlICAgU2VydmVyIEZybUNudFxuIik7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYWN0aXZlKQordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSkKIHsKLSAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIgICAgJTZzICU2dSAlM3UgJTA4WCAlN3UgJTFkICUwOFggJTZ6dSAlNXVcbiIsCisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJWMlNXMgJTZ1ICU3dSAlMnMgMHglMDNYICIKKyAgICAgICAgICAgICIlMDhYICUwOFggJTZ1ICIKKyAgICAgICAgICAgICIlMDhYICU2enVcbiIsCisgICAgICAgICAgICBpc0Zhc3RUcmFjaygpID8gJ0YnIDogJyAnLAogICAgICAgICAgICAgYWN0aXZlID8gInllcyIgOiAibm8iLAogICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWRfY2FjaGVkIDogbUNsaWVudC0+cGlkKCksCisgICAgICAgICAgICBtU2Vzc2lvbklkLAorICAgICAgICAgICAgZ2V0VHJhY2tTdGF0ZVN0cmluZygpLAorICAgICAgICAgICAgbUNibGstPm1GbGFncywKKwogICAgICAgICAgICAgbUZvcm1hdCwKICAgICAgICAgICAgIG1DaGFubmVsTWFzaywKLSAgICAgICAgICAgIG1TZXNzaW9uSWQsCi0gICAgICAgICAgICBtU3RhdGUsCi0gICAgICAgICAgICBtQ2Jsay0+bVNlcnZlciwKLSAgICAgICAgICAgIG1GcmFtZUNvdW50LAotICAgICAgICAgICAgbVNhbXBsZVJhdGUpOworICAgICAgICAgICAgbVNhbXBsZVJhdGUsCiAKKyAgICAgICAgICAgIG1DYmxrLT5tU2VydmVyLAorICAgICAgICAgICAgbUZyYW1lQ291bnQKKyAgICAgICAgICAgICk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpoYW5kbGVTeW5jU3RhcnRFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCkKQEAgLTE3NjcsOSArMTgwMCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQogICAgIDogICBSZWNvcmRUcmFjayhyZWNvcmRUaHJlYWQsIE5VTEwsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgYnVmZmVyLCBBVURJT19TRVNTSU9OX05PTkUsIGdldHVpZCgpLCBmbGFncywgVFlQRV9QQVRDSCksCisgICAgICAgICAgICAgICAgYnVmZmVyLCBidWZmZXJTaXplLCBBVURJT19TRVNTSU9OX05PTkUsIGdldHVpZCgpLCBmbGFncywgVFlQRV9QQVRDSCksCiAgICAgICAgICAgICAgICAgbVByb3h5KG5ldyBDbGllbnRQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwgbUZyYW1lU2l6ZSwgZmFsc2UsIHRydWUpKQogewogICAgIHVpbnQ2NF90IG1peEJ1ZmZlck5zID0gKCh1aW50NjRfdCkyICogcmVjb3JkVGhyZWFkLT5mcmFtZUNvdW50KCkgKiAxMDAwMDAwMDAwKSAvCkBAIC0xODM0LDExICsxODY4LDE1IEBACiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiAgICAgOiAgIFRyYWNrQmFzZSh0aHJlYWQsIE5VTEwsIHNhbXBsZVJhdGUsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCAwLCBOVUxMLCBzZXNzaW9uSWQsIHVpZCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgKHNpemVfdCkwIC8qIGZyYW1lQ291bnQgKi8sCisgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIGJ1ZmZlciAqLywgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sCisgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHVpZCwgZmFsc2UgLyogaXNPdXQgKi8sCiAgICAgICAgICAgICAgICAgICBBTExPQ19OT05FLAotICAgICAgICAgICAgICAgICAgVFlQRV9ERUZBVUxULCBwb3J0SWQpCisgICAgICAgICAgICAgICAgICBUWVBFX0RFRkFVTFQsIHBvcnRJZCksCisgICAgICAgIG1QaWQocGlkKQogewogfQogCkBAIC0xODg1LDE3ICsxOTIzLDE3IEBACiAKIC8qc3RhdGljKi8gdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6Ok1tYXBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICAgIENsaWVudCBGbXQgQ2huIG1hc2sgIFNSYXRlXG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKCJDbGllbnQgU2Vzc2lvbiAgIEZvcm1hdCBDaG4gbWFzayAgU1JhdGVcbiIpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6TW1hcFRyYWNrOjpkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCit2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6TW1hcFRyYWNrOjphcHBlbmREdW1wKFN0cmluZzgmIHJlc3VsdCwgYm9vbCBhY3RpdmUgX191bnVzZWQpCiB7Ci0gICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiICAgICAgICAgICAgJTZ1ICUzdSAgICAlMDhYICU1dVxuIiwKLSAgICAgICAgICAgIG1VaWQsCisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTZ1ICU3dSAlMDhYICUwOFggJTZ1XG4iLAorICAgICAgICAgICAgbVBpZCwKKyAgICAgICAgICAgIG1TZXNzaW9uSWQsCiAgICAgICAgICAgICBtRm9ybWF0LAogICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAogICAgICAgICAgICAgbVNhbXBsZVJhdGUpOwotCiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmgKaW5kZXggMmQ4NDAyOC4uOTA5YWYwOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmgKQEAgLTg4LDExICs4OCwxMSBAQAogCiAvLyBXcml0ZSBoaXN0b2dyYW0gdGltZXN0YW1wIGVudHJ5CiAjZGVmaW5lIExPR19ISVNUX1RTKCkgZG8geyBOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgaWYgKHggIT0gbnVsbHB0cikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LT5sb2dIaXN0VFMoaGFzaChfX0ZJTEVfXywgX19MSU5FX18pKTsgfSB3aGlsZSgwKQorICAgICAgICB4LT5sb2dFdmVudEhpc3RUcyhOQkxvZzo6RVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLCBoYXNoKF9fRklMRV9fLCBfX0xJTkVfXykpOyB9IHdoaWxlKDApCiAKLS8vIGZsdXNoIGFsbCBoaXN0b2dyYW0KLSNkZWZpbmUgTE9HX0hJU1RfRkxVU0goKSBkbyB7IE5CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBpZiAoeCAhPSBudWxscHRyKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgtPmxvZ0hpc3RGbHVzaChoYXNoKF9fRklMRV9fLCBfX0xJTkVfXykpOyB9IHdoaWxlKDApCisvLyBSZWNvcmQgdGhhdCBhdWRpbyB3YXMgdHVybmVkIG9uL29mZgorI2RlZmluZSBMT0dfQVVESU9fU1RBVEUoKSBkbyB7IE5CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBpZiAoeCAhPSBudWxscHRyKSBcCisgICAgICAgIHgtPmxvZ0V2ZW50SGlzdFRzKE5CTG9nOjpFVkVOVF9BVURJT19TVEFURSwgaGFzaChfX0ZJTEVfXywgX19MSU5FX18pKTsgfSB3aGlsZSgwKQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBleHRlcm4gIkMiIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rCmluZGV4IGFkMzQwZTUuLjY1NTcxZjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5tawpAQCAtMjQsNyArMjQsOCBAQAogICAgIGxpYmhhcmR3YXJlX2xlZ2FjeSBcCiAgICAgbGlic2VydmljZXV0aWxpdHkgXAogICAgIGxpYmF1ZGlvcG9saWN5bWFuYWdlciBcCi0gICAgbGlibWVkaWFfaGVscGVyCisgICAgbGlibWVkaWFfaGVscGVyIFwKKyAgICBsaWJlZmZlY3RzY29uZmlnCiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKaW5kZXggYzg2ODIwNi4uN2IxOWY1OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCkBAIC0zNDksOCArMzQ5LDggQEAKIAogICAgIHZpcnR1YWwgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShTdHJpbmc4IHJlZ0lkLCBpbnQzMl90IHN0YXRlKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSAqY2xpZW50Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UgKmRldmljZUNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpID0gMDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L09XTkVSUyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODQ4M2ZhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvT1dORVJTCkBAIC0wLDAgKzEsMyBAQAoram10cml2aUBnb29nbGUuY29tCitrcm9jYXJkQGdvb2dsZS5jb20KK21uYWdhbm92QGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Nlc3Npb24uaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Nlc3Npb24uaAppbmRleCBjYTA3MGNmLi5jZWRmMjJkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbi5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgorI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaD4KICNpbmNsdWRlICJBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNDQsMTQgKzQ1LDE0IEBACiAKICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKIAotICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbVNlc3Npb247IH0KLSAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSgpY29uc3QgeyByZXR1cm4gbUlucHV0U291cmNlOyB9CisgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24oKSBjb25zdCB7IHJldHVybiBtUmVjb3JkQ2xpZW50SW5mby5zZXNzaW9uOyB9CisgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UoKWNvbnN0IHsgcmV0dXJuIG1SZWNvcmRDbGllbnRJbmZvLnNvdXJjZTsgfQogICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1Db25maWcuZm9ybWF0OyB9CiAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1Db25maWcuc2FtcGxlX3JhdGU7IH0KICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaygpIGNvbnN0IHsgcmV0dXJuIG1Db25maWcuY2hhbm5lbF9tYXNrOyB9CiAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncygpIGNvbnN0IHsgcmV0dXJuIG1GbGFnczsgfQotICAgIHVpZF90IHVpZCgpIGNvbnN0IHsgcmV0dXJuIG1VaWQ7IH0KLSAgICB2b2lkIHNldFVpZCh1aWRfdCB1aWQpIHsgbVVpZCA9IHVpZDsgfQorICAgIHVpZF90IHVpZCgpIGNvbnN0IHsgcmV0dXJuIG1SZWNvcmRDbGllbnRJbmZvLnVpZDsgfQorICAgIHZvaWQgc2V0VWlkKHVpZF90IHVpZCkgeyBtUmVjb3JkQ2xpZW50SW5mby51aWQgPSB1aWQ7IH0KICAgICBib29sIG1hdGNoZXMoY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiAmb3RoZXIpIGNvbnN0OwogICAgIGJvb2wgaXNTb3VuZFRyaWdnZXIoKSBjb25zdCB7IHJldHVybiBtSXNTb3VuZFRyaWdnZXI7IH0KICAgICB1aW50MzJfdCBvcGVuQ291bnQoKSBjb25zdCB7IHJldHVybiBtT3BlbkNvdW50OyB9IDsKQEAgLTY1LDExICs2Niw5IEBACiAgICAgdmlydHVhbCB2b2lkIG9uU2Vzc2lvbkluZm9VcGRhdGUoKSBjb25zdDsKIAogcHJpdmF0ZToKLSAgICBjb25zdCBhdWRpb19zZXNzaW9uX3QgbVNlc3Npb247Ci0gICAgY29uc3QgYXVkaW9fc291cmNlX3QgbUlucHV0U291cmNlOworICAgIHJlY29yZF9jbGllbnRfaW5mb190IG1SZWNvcmRDbGllbnRJbmZvOwogICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSBtQ29uZmlnOwogICAgIGNvbnN0IGF1ZGlvX2lucHV0X2ZsYWdzX3QgbUZsYWdzOwotICAgIHVpZF90IG1VaWQ7CiAgICAgYm9vbCAgbUlzU291bmRUcmlnZ2VyOwogICAgIHVpbnQzMl90ICBtT3BlbkNvdW50OwogICAgIHVpbnQzMl90ICBtQWN0aXZlQ291bnQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Nlc3Npb24uY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9TZXNzaW9uLmNwcAppbmRleCBiZWE5ZjRmLi41YjU3ZDNkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Nlc3Npb24uY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU2Vzc2lvbi5jcHAKQEAgLTM4LDkgKzM4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTb3VuZFRyaWdnZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peCogcG9saWN5TWl4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSkgOgotICAgIG1TZXNzaW9uKHNlc3Npb24pLCBtSW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UpLAorICAgIG1SZWNvcmRDbGllbnRJbmZvKHsgLnVpZCA9IHVpZCwgLnNlc3Npb24gPSBzZXNzaW9uLCAuc291cmNlID0gaW5wdXRTb3VyY2V9KSwKICAgICBtQ29uZmlnKHsgLmZvcm1hdCA9IGZvcm1hdCwgLnNhbXBsZV9yYXRlID0gc2FtcGxlUmF0ZSwgLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrfSksCi0gICAgbUZsYWdzKGZsYWdzKSwgbVVpZCh1aWQpLCBtSXNTb3VuZFRyaWdnZXIoaXNTb3VuZFRyaWdnZXIpLAorICAgIG1GbGFncyhmbGFncyksIG1Jc1NvdW5kVHJpZ2dlcihpc1NvdW5kVHJpZ2dlciksCiAgICAgbU9wZW5Db3VudCgxKSwgbUFjdGl2ZUNvdW50KDApLCBtUG9saWN5TWl4KHBvbGljeU1peCksIG1DbGllbnRJbnRlcmZhY2UoY2xpZW50SW50ZXJmYWNlKSwKICAgICBtSW5mb1Byb3ZpZGVyKE5VTEwpCiB7CkBAIC05Miw3ICs5Miw3IEBACiAgICAgICAgIGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlID0gKHByb3ZpZGVyICE9IE5VTEwpID8gcHJvdmlkZXItPmdldFBhdGNoSGFuZGxlKCkgOgogICAgICAgICAgICAgICAgIEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgICAgICBpZiAocGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgbVNlc3Npb24sIG1JbnB1dFNvdXJjZSwKKyAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgJm1SZWNvcmRDbGllbnRJbmZvLAogICAgICAgICAgICAgICAgICAgICAmbUNvbmZpZywgJmRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTAyLDEzICsxMDIsMTMgQEAKIAogYm9vbCBBdWRpb1Nlc3Npb246Om1hdGNoZXMoY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiAmb3RoZXIpIGNvbnN0CiB7Ci0gICAgaWYgKG90aGVyLT5zZXNzaW9uKCkgPT0gbVNlc3Npb24gJiYKLSAgICAgICAgb3RoZXItPmlucHV0U291cmNlKCkgPT0gbUlucHV0U291cmNlICYmCisgICAgaWYgKG90aGVyLT5zZXNzaW9uKCkgPT0gbVJlY29yZENsaWVudEluZm8uc2Vzc2lvbiAmJgorICAgICAgICBvdGhlci0+aW5wdXRTb3VyY2UoKSA9PSBtUmVjb3JkQ2xpZW50SW5mby5zb3VyY2UgJiYKICAgICAgICAgb3RoZXItPmZvcm1hdCgpID09IG1Db25maWcuZm9ybWF0ICYmCiAgICAgICAgIG90aGVyLT5zYW1wbGVSYXRlKCkgPT0gbUNvbmZpZy5zYW1wbGVfcmF0ZSAmJgogICAgICAgICBvdGhlci0+Y2hhbm5lbE1hc2soKSA9PSBtQ29uZmlnLmNoYW5uZWxfbWFzayAmJgogICAgICAgICBvdGhlci0+ZmxhZ3MoKSA9PSBtRmxhZ3MgJiYKLSAgICAgICAgb3RoZXItPnVpZCgpID09IG1VaWQpIHsKKyAgICAgICAgb3RoZXItPnVpZCgpID09IG1SZWNvcmRDbGllbnRJbmZvLnVpZCkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTMwLDggKzEzMCw3IEBACiAgICAgICAgICAgICAgICAgQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAgICAgICAgIGlmIChwYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewogICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQsCi0gICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uLCBtSW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICZtQ29uZmlnLCAmZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICZtUmVjb3JkQ2xpZW50SW5mbywgJm1Db25maWcsICZkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTE0NCwxMSArMTQzLDExIEBACiAKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNBdWRpbyBzZXNzaW9uICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gc2Vzc2lvbjogJTJkXG4iLCBzcGFjZXMsICIiLCBtU2Vzc2lvbik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBzZXNzaW9uOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1SZWNvcmRDbGllbnRJbmZvLnNlc3Npb24pOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG93bmVyIHVpZDogJTJkXG4iLCBzcGFjZXMsICIiLCBtVWlkKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG93bmVyIHVpZDogJTJkXG4iLCBzcGFjZXMsICIiLCBtUmVjb3JkQ2xpZW50SW5mby51aWQpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGlucHV0IHNvdXJjZTogJWRcbiIsIHNwYWNlcywgIiIsIG1JbnB1dFNvdXJjZSk7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBpbnB1dCBzb3VyY2U6ICVkXG4iLCBzcGFjZXMsICIiLCBtUmVjb3JkQ2xpZW50SW5mby5zb3VyY2UpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGZvcm1hdDogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbUNvbmZpZy5mb3JtYXQpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1NvdW5kVHJpZ2dlclNlc3Npb24uY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU291bmRUcmlnZ2VyU2Vzc2lvbi5jcHAKaW5kZXggOGNhM2FlMC4uMDM4M2IwZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU291bmRUcmlnZ2VyU2Vzc2lvbi5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU291bmRUcmlnZ2VyU2Vzc2lvbi5jcHAKQEAgLTM0LDcgKzM0LDcgQEAKIHsKICAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShzZXNzaW9uKTsKICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbigpIHNlc3Npb24gJWQgbm90IHJlZ2lzdGVyZWQiLCBzZXNzaW9uKTsKKyAgICAgICAgQUxPR1coInJlbGVhc2VTZXNzaW9uKCkgc2Vzc2lvbiAlZCBub3QgcmVnaXN0ZXJlZCIsIHNlc3Npb24pOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3ByaW1hcnlfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3ByaW1hcnlfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCmluZGV4IGJmNTA4YWMuLjViN2FlN2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9wcmltYXJ5X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvcHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKQEAgLTEzLDcgKzEzLDcgQEAKICAgICAgICAgPC9taXhQb3J0PgogICAgICAgICA8bWl4UG9ydCBuYW1lPSJwcmltYXJ5IGlucHV0IiByb2xlPSJzaW5rIj4KICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKLSAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAsIDE2MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fTU9OTyIvPgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCwxNjAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX01PTk8iLz4KICAgICAgICAgPC9taXhQb3J0PgogICAgPC9taXhQb3J0cz4KICAgIDxkZXZpY2VQb3J0cz4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCmluZGV4IDc4ZjE5NWQuLmJkZmFmMmYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcApAQCAtMTMyMCw5ICsxMzIwLDkgQEAKIAogICAgICAgICAvLyBhcHBseSB2b2x1bWUgcnVsZXMgZm9yIGN1cnJlbnQgc3RyZWFtIGFuZCBkZXZpY2UgaWYgbmVjZXNzYXJ5CiAgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXgoc3RyZWFtLCBkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleChzdHJlYW0sIG91dHB1dERlc2MtPmRldmljZSgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZGV2aWNlKCkpOwogCiAgICAgICAgIC8vIHVwZGF0ZSB0aGUgb3V0cHV0cyBpZiBzdGFydGluZyBhbiBvdXRwdXQgd2l0aCBhIHN0cmVhbSB0aGF0IGNhbiBhZmZlY3Qgbm90aWZpY2F0aW9uCiAgICAgICAgIC8vIHJvdXRpbmcKQEAgLTE0OTksNjIgKzE0OTksMTMgQEAKICAgICAgICAgICAgICJzZXNzaW9uICVkLCBmbGFncyAlI3giLAogICAgICAgICAgIGF0dHItPnNvdXJjZSwgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCBzZXNzaW9uLCBmbGFncyk7CiAKLSAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIG1tYXAgY2FwdHVyZTogaWYgYW4gaW5wdXQgSU8gaGFuZGxlIGlzIHNwZWNpZmllZCwgd2UgcmV1c2UgdGhpcyBpbnB1dCBpZgotICAgIC8vIHBvc3NpYmxlCi0gICAgaWYgKChmbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfTU1BUF9OT0lSUSkgPT0gQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJRICYmCi0gICAgICAgICAgICAqaW5wdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dHMuaW5kZXhPZktleSgqaW5wdXQpOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgdW5rbm93biBNTUFQIGlucHV0ICVkIiwgKmlucHV0KTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgIHNwPEF1ZGlvU2Vzc2lvbj4gYXVkaW9TZXNzaW9uID0gaW5wdXREZXNjLT5nZXRBdWRpb1Nlc3Npb24oc2Vzc2lvbik7Ci0gICAgICAgIGlmIChhdWRpb1Nlc3Npb24gPT0gMCkgewotICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIHVua25vd24gc2Vzc2lvbiAlZCBvbiBpbnB1dCAlZCIsIHNlc3Npb24sICppbnB1dCk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIC8vIEZvciBNTUFQIG1vZGUsIHRoZSBmaXJzdCBjYWxsIHRvIGdldElucHV0Rm9yQXR0cigpIGlzIG1hZGUgb24gYmVoYWxmIG9mIGF1ZGlvZmxpbmdlci4KLSAgICAgICAgLy8gVGhlIHNlY29uZCBjYWxsIGlzIGZvciB0aGUgZmlyc3QgYWN0aXZlIGNsaWVudCBhbmQgc2V0cyB0aGUgVUlELiBBbnkgZnVydGhlciBjYWxsCi0gICAgICAgIC8vIGNvcnJlc3BvbmRzIHRvIGEgbmV3IGNsaWVudCBhbmQgaXMgb25seSBwZXJtaXR0ZWQgZnJvbSB0aGUgc2FtZSBVSWQuCi0gICAgICAgIGlmIChhdWRpb1Nlc3Npb24tPm9wZW5Db3VudCgpID09IDEpIHsKLSAgICAgICAgICAgIGF1ZGlvU2Vzc2lvbi0+c2V0VWlkKHVpZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYXVkaW9TZXNzaW9uLT51aWQoKSAhPSB1aWQpIHsKLSAgICAgICAgICAgIEFMT0dXKCJnZXRJbnB1dEZvckF0dHIoKSBiYWQgdWlkICVkIGZvciBzZXNzaW9uICVkIHVpZCAlZCIsCi0gICAgICAgICAgICAgICAgICB1aWQsIHNlc3Npb24sIGF1ZGlvU2Vzc2lvbi0+dWlkKCkpOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgICAgIGF1ZGlvU2Vzc2lvbi0+Y2hhbmdlT3BlbkNvdW50KDEpOwotICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX0xFR0FDWTsKLSAgICAgICAgaWYgKCpwb3J0SWQgPT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgKnBvcnRJZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgRGV2aWNlVmVjdG9yIGlucHV0RGV2aWNlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGlucHV0RGVzYy0+bURldmljZSk7Ci0gICAgICAgICpzZWxlY3RlZERldmljZUlkID0gaW5wdXREZXZpY2VzLnNpemUoKSA+IDAgPyBpbnB1dERldmljZXMuaXRlbUF0KDApLT5nZXRJZCgpCi0gICAgICAgICAgICAgICAgOiBBVURJT19QT1JUX0hBTkRMRV9OT05FOwotICAgICAgICBBTE9HSSgiJXMgcmV1c2luZyBNTUFQIGlucHV0ICVkIGZvciBzZXNzaW9uICVkIiwgX19GVU5DVElPTl9fLCAqaW5wdXQsIHNlc3Npb24pOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgKmlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9JTlZBTElEOwotCi0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKICAgICAvLyBoYW5kbGUgbGVnYWN5IHJlbW90ZSBzdWJtaXggY2FzZSB3aGVyZSB0aGUgYWRkcmVzcyB3YXMgbm90IGFsd2F5cyBzcGVjaWZpZWQKICAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KCIiKTsKLSAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSA9IGF0dHItPnNvdXJjZTsKICAgICBhdWRpb19zb3VyY2VfdCBoYWxJbnB1dFNvdXJjZTsKKyAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSA9IGF0dHItPnNvdXJjZTsKICAgICBBdWRpb01peCAqcG9saWN5TWl4ID0gTlVMTDsKLQotICAgIGlmIChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfREVGQVVMVCkgewotICAgICAgICBpbnB1dFNvdXJjZSA9IEFVRElPX1NPVVJDRV9NSUM7Ci0gICAgfQotICAgIGhhbElucHV0U291cmNlID0gaW5wdXRTb3VyY2U7Ci0KLSAgICAvLyBUT0RPOiBjaGVjayBmb3IgZXhpc3RpbmcgY2xpZW50IGZvciB0aGlzIHBvcnQgSUQKLSAgICBpZiAoKnBvcnRJZCA9PSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICpwb3J0SWQgPSBBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpOwotICAgIH0KKyAgICBEZXZpY2VWZWN0b3IgaW5wdXREZXZpY2VzOwogCiAgICAgLy8gRXhwbGljaXQgcm91dGluZz8KICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjOwpAQCAtMTU2OCwxMSArMTUxOSw2NyBAQAogICAgIH0KICAgICBtSW5wdXRSb3V0ZXMuYWRkUm91dGUoc2Vzc2lvbiwgU2Vzc2lvblJvdXRlOjpTVFJFQU1fVFlQRV9OQSwgaW5wdXRTb3VyY2UsIGRldmljZURlc2MsIHVpZCk7CiAKKyAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIG1tYXAgY2FwdHVyZTogaWYgYW4gaW5wdXQgSU8gaGFuZGxlIGlzIHNwZWNpZmllZCwgd2UgcmV1c2UgdGhpcyBpbnB1dCBpZgorICAgIC8vIHBvc3NpYmxlCisgICAgaWYgKChmbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfTU1BUF9OT0lSUSkgPT0gQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJRICYmCisgICAgICAgICAgICAqaW5wdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dHMuaW5kZXhPZktleSgqaW5wdXQpOworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgdW5rbm93biBNTUFQIGlucHV0ICVkIiwgKmlucHV0KTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbmRleCk7CisgICAgICAgIHNwPEF1ZGlvU2Vzc2lvbj4gYXVkaW9TZXNzaW9uID0gaW5wdXREZXNjLT5nZXRBdWRpb1Nlc3Npb24oc2Vzc2lvbik7CisgICAgICAgIGlmIChhdWRpb1Nlc3Npb24gPT0gMCkgeworICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIHVua25vd24gc2Vzc2lvbiAlZCBvbiBpbnB1dCAlZCIsIHNlc3Npb24sICppbnB1dCk7CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIC8vIEZvciBNTUFQIG1vZGUsIHRoZSBmaXJzdCBjYWxsIHRvIGdldElucHV0Rm9yQXR0cigpIGlzIG1hZGUgb24gYmVoYWxmIG9mIGF1ZGlvZmxpbmdlci4KKyAgICAgICAgLy8gVGhlIHNlY29uZCBjYWxsIGlzIGZvciB0aGUgZmlyc3QgYWN0aXZlIGNsaWVudCBhbmQgc2V0cyB0aGUgVUlELiBBbnkgZnVydGhlciBjYWxsCisgICAgICAgIC8vIGNvcnJlc3BvbmRzIHRvIGEgbmV3IGNsaWVudCBhbmQgaXMgb25seSBwZXJtaXR0ZWQgZnJvbSB0aGUgc2FtZSBVSWQuCisgICAgICAgIGlmIChhdWRpb1Nlc3Npb24tPm9wZW5Db3VudCgpID09IDEpIHsKKyAgICAgICAgICAgIGF1ZGlvU2Vzc2lvbi0+c2V0VWlkKHVpZCk7CisgICAgICAgIH0gZWxzZSBpZiAoYXVkaW9TZXNzaW9uLT51aWQoKSAhPSB1aWQpIHsKKyAgICAgICAgICAgIEFMT0dXKCJnZXRJbnB1dEZvckF0dHIoKSBiYWQgdWlkICVkIGZvciBzZXNzaW9uICVkIHVpZCAlZCIsCisgICAgICAgICAgICAgICAgICB1aWQsIHNlc3Npb24sIGF1ZGlvU2Vzc2lvbi0+dWlkKCkpOworICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGF1ZGlvU2Vzc2lvbi0+Y2hhbmdlT3BlbkNvdW50KDEpOworICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX0xFR0FDWTsKKyAgICAgICAgaWYgKCpwb3J0SWQgPT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgKnBvcnRJZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7CisgICAgICAgIH0KKyAgICAgICAgaW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoaW5wdXREZXNjLT5tRGV2aWNlKTsKKyAgICAgICAgKnNlbGVjdGVkRGV2aWNlSWQgPSBpbnB1dERldmljZXMuc2l6ZSgpID4gMCA/IGlucHV0RGV2aWNlcy5pdGVtQXQoMCktPmdldElkKCkKKyAgICAgICAgICAgICAgICA6IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgIEFMT0dJKCIlcyByZXVzaW5nIE1NQVAgaW5wdXQgJWQgZm9yIHNlc3Npb24gJWQiLCBfX0ZVTkNUSU9OX18sICppbnB1dCwgc2Vzc2lvbik7CisKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgICppbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfSU5WQUxJRDsKKworICAgIGlmIChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfREVGQVVMVCkgeworICAgICAgICBpbnB1dFNvdXJjZSA9IEFVRElPX1NPVVJDRV9NSUM7CisgICAgfQorICAgIGhhbElucHV0U291cmNlID0gaW5wdXRTb3VyY2U7CisKKyAgICAvLyBUT0RPOiBjaGVjayBmb3IgZXhpc3RpbmcgY2xpZW50IGZvciB0aGlzIHBvcnQgSUQKKyAgICBpZiAoKnBvcnRJZCA9PSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7CisgICAgICAgICpwb3J0SWQgPSBBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpOworICAgIH0KKworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2U7CisKICAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVggJiYKICAgICAgICAgICAgIHN0cm5jbXAoYXR0ci0+dGFncywgImFkZHI9Iiwgc3RybGVuKCJhZGRyPSIpKSA9PSAwKSB7Ci0gICAgICAgIHN0YXR1c190IHJldCA9IG1Qb2xpY3lNaXhlcy5nZXRJbnB1dE1peEZvckF0dHIoKmF0dHIsICZwb2xpY3lNaXgpOwotICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBzdGF0dXMgPSBtUG9saWN5TWl4ZXMuZ2V0SW5wdXRNaXhGb3JBdHRyKCphdHRyLCAmcG9saWN5TWl4KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQogICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX01JWF9FWFRfUE9MSUNZX1JFUk9VVEU7CiAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYOwpAQCAtMTU4MSw3ICsxNTg4LDggQEAKICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UsICZwb2xpY3lNaXgpOwogICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CiAgICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgY291bGQgbm90IGZpbmQgZGV2aWNlIGZvciBzb3VyY2UgJWQiLCBpbnB1dFNvdXJjZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQogICAgICAgICBpZiAocG9saWN5TWl4ICE9IE5VTEwpIHsKICAgICAgICAgICAgIGFkZHJlc3MgPSBwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzOwpAQCAtMTYxMCwxMSArMTYxOCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5TWl4KTsKICAgICBpZiAoKmlucHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIG1JbnB1dFJvdXRlcy5yZW1vdmVSb3V0ZShzZXNzaW9uKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKLSAgICBEZXZpY2VWZWN0b3IgaW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKKyAgICBpbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOwogICAgICpzZWxlY3RlZERldmljZUlkID0gaW5wdXREZXZpY2VzLnNpemUoKSA+IDAgPyBpbnB1dERldmljZXMuaXRlbUF0KDApLT5nZXRJZCgpCiAgICAgICAgICAgICA6IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAKQEAgLTE2MjIsNiArMTYzMCwxMCBAQAogICAgICAgICAgICAgKmlucHV0LCAqaW5wdXRUeXBlLCAqc2VsZWN0ZWREZXZpY2VJZCk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CisKK2Vycm9yOgorICAgIG1JbnB1dFJvdXRlcy5yZW1vdmVSb3V0ZShzZXNzaW9uKTsKKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiAKQEAgLTQ3MjEsMTAgKzQ3MzMsMTAgQEAKICAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IGVuZm9yY2VkIGF1ZGlibGUKICAgICAvLyAyOiB3ZSBhcmUgaW4gY2FsbCBvciB0aGUgc3RyYXRlZ3kgcGhvbmUgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6CiAgICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBwaG9uZQotICAgIC8vIDM6IHRoZSBzdHJhdGVneSBmb3IgZW5mb3JjZWQgYXVkaWJsZSBpcyBhY3RpdmUgYnV0IG5vdCBlbmZvcmNlZCBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIHRoZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IGVuZm9yY2VkIGF1ZGlibGUKLSAgICAvLyA0OiB0aGUgc3RyYXRlZ3kgc29uaWZpY2F0aW9uIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgorICAgIC8vIDM6IHRoZSBzdHJhdGVneSBzb25pZmljYXRpb24gaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6CiAgICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBzb25pZmljYXRpb24KKyAgICAvLyA0OiB0aGUgc3RyYXRlZ3kgZm9yIGVuZm9yY2VkIGF1ZGlibGUgaXMgYWN0aXZlIGJ1dCBub3QgZW5mb3JjZWQgb24gdGhlIG91dHB1dDoKKyAgICAvLyAgICAgIHVzZSB0aGUgZGV2aWNlIGZvciBzdHJhdGVneSBlbmZvcmNlZCBhdWRpYmxlCiAgICAgLy8gNTogdGhlIHN0cmF0ZWd5IGFjY2Vzc2liaWxpdHkgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6CiAgICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBhY2Nlc3NpYmlsaXR5CiAgICAgLy8gNjogdGhlIHN0cmF0ZWd5ICJyZXNwZWN0ZnVsIiBzb25pZmljYXRpb24gaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6CkBAIC00NzQxLDEwICs0NzUzLDEwIEBACiAgICAgfSBlbHNlIGlmIChpc0luQ2FsbCgpIHx8CiAgICAgICAgICAgICAgICAgICAgIGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfUEhPTkUpKSB7CiAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FLCBmcm9tQ2FjaGUpOwotICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKSkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFLCBmcm9tQ2FjaGUpOwogICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9TT05JRklDQVRJT04pKSB7CiAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTiwgZnJvbUNhY2hlKTsKKyAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSkpIHsKKyAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwgZnJvbUNhY2hlKTsKICAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfQUNDRVNTSUJJTElUWSkpIHsKICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfQUNDRVNTSUJJTElUWSwgZnJvbUNhY2hlKTsKICAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpKSB7CkBAIC00OTI2LDEyICs0OTM4LDEzIEBACiAgICAgLy8gc2NhbiB0aGUgd2hvbGUgUm91dGVNYXAsIGZvciBlYWNoIGVudHJ5LCBjb252ZXJ0IHRoZSBzdHJlYW0gdHlwZSB0byBhIHN0cmF0ZWd5CiAgICAgLy8gKGdldFN0cmF0ZWd5KHN0cmVhbSkpLgogICAgIC8vIGlmIHRoZSBzdHJhdGVneSBmcm9tIHRoZSBzdHJlYW0gdHlwZSBpbiB0aGUgUm91dGVNYXAgaXMgdGhlIHNhbWUgYXMgdGhlIGFyZ3VtZW50IGFib3ZlLAotICAgIC8vIGFuZCBhY3Rpdml0eSBjb3VudCBpcyBub24temVybwotICAgIC8vIHRoZSBkZXZpY2UgPSB0aGUgZGV2aWNlIGZyb20gdGhlIGRlc2NyaXB0b3IgaW4gdGhlIFJvdXRlTWFwLCBhbmQgZXhpdC4KKyAgICAvLyBhbmQgYWN0aXZpdHkgY291bnQgaXMgbm9uLXplcm8gYW5kIHRoZSBkZXZpY2UgaW4gdGhlIHJvdXRlIGRlc2NyaXB0b3IgaXMgYXZhaWxhYmxlCisgICAgLy8gdGhlbiBzZWxlY3QgdGhpcyBkZXZpY2UuCiAgICAgZm9yIChzaXplX3Qgcm91dGVJbmRleCA9IDA7IHJvdXRlSW5kZXggPCBtT3V0cHV0Um91dGVzLnNpemUoKTsgcm91dGVJbmRleCsrKSB7CiAgICAgICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBtT3V0cHV0Um91dGVzLnZhbHVlQXQocm91dGVJbmRleCk7CiAgICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgcm91dGVTdHJhdGVneSA9IGdldFN0cmF0ZWd5KHJvdXRlLT5tU3RyZWFtVHlwZSk7Ci0gICAgICAgIGlmICgocm91dGVTdHJhdGVneSA9PSBzdHJhdGVneSkgJiYgcm91dGUtPmlzQWN0aXZlKCkpIHsKKyAgICAgICAgaWYgKChyb3V0ZVN0cmF0ZWd5ID09IHN0cmF0ZWd5KSAmJiByb3V0ZS0+aXNBY3RpdmUoKSAmJgorICAgICAgICAgICAgICAgIChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5pbmRleE9mKHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvcikgPj0gMCkpIHsKICAgICAgICAgICAgIHJldHVybiByb3V0ZS0+bURldmljZURlc2NyaXB0b3ItPnR5cGUoKTsKICAgICAgICAgfQogICAgIH0KQEAgLTUzMjYsOSArNTMzOSwxNSBAQAogCiBhdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSkKIHsKKyAgICAvLyBSb3V0aW5nCisgICAgLy8gU2NhbiB0aGUgd2hvbGUgUm91dGVNYXAgdG8gc2VlIGlmIHdlIGhhdmUgYW4gZXhwbGljaXQgcm91dGU6CisgICAgLy8gaWYgdGhlIGlucHV0IHNvdXJjZSBpbiB0aGUgUm91dGVNYXAgaXMgdGhlIHNhbWUgYXMgdGhlIGFyZ3VtZW50IGFib3ZlLAorICAgIC8vIGFuZCBhY3Rpdml0eSBjb3VudCBpcyBub24temVybyBhbmQgdGhlIGRldmljZSBpbiB0aGUgcm91dGUgZGVzY3JpcHRvciBpcyBhdmFpbGFibGUKKyAgICAvLyB0aGVuIHNlbGVjdCB0aGlzIGRldmljZS4KICAgICBmb3IgKHNpemVfdCByb3V0ZUluZGV4ID0gMDsgcm91dGVJbmRleCA8IG1JbnB1dFJvdXRlcy5zaXplKCk7IHJvdXRlSW5kZXgrKykgewogICAgICAgICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IG1JbnB1dFJvdXRlcy52YWx1ZUF0KHJvdXRlSW5kZXgpOwotICAgICAgICAgaWYgKGlucHV0U291cmNlID09IHJvdXRlLT5tU291cmNlICYmIHJvdXRlLT5pc0FjdGl2ZSgpKSB7CisgICAgICAgICBpZiAoKGlucHV0U291cmNlID09IHJvdXRlLT5tU291cmNlKSAmJiByb3V0ZS0+aXNBY3RpdmUoKSAmJgorICAgICAgICAgICAgICAgICAobUF2YWlsYWJsZUlucHV0RGV2aWNlcy5pbmRleE9mKHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvcikgPj0gMCkpIHsKICAgICAgICAgICAgICByZXR1cm4gcm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yLT50eXBlKCk7CiAgICAgICAgICB9CiAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcAppbmRleCBkYmNjMDcwLi4zMWM5NTc1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCkBAIC0yMjAsMTEgKzIyMCwxMSBAQAogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKLSAgICAgICAgaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpCiB7Ci0gICAgbUF1ZGlvUG9saWN5U2VydmljZS0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBzZXNzaW9uLCBzb3VyY2UsCisgICAgbUF1ZGlvUG9saWN5U2VydmljZS0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBjbGllbnRJbmZvLAogICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCmluZGV4IDY1NDQ2NWQuLjg0YjEwNzMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKQEAgLTIwLDggKzIwLDEwIEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgorI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNDb25maWcuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9hdWRpb19lZmZlY3RzX2NvbmYuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KQEAgLTM5LDExICs0MSwxNyBAQAogCiBBdWRpb1BvbGljeUVmZmVjdHM6OkF1ZGlvUG9saWN5RWZmZWN0cygpCiB7Ci0gICAgLy8gbG9hZCBhdXRvbWF0aWMgYXVkaW8gZWZmZWN0IG1vZHVsZXMKLSAgICBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKLSAgICAgICAgbG9hZEF1ZGlvRWZmZWN0Q29uZmlnKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUpOwotICAgIH0gZWxzZSBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFLCBSX09LKSA9PSAwKSB7Ci0gICAgICAgIGxvYWRBdWRpb0VmZmVjdENvbmZpZyhBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSk7CisgICAgc3RhdHVzX3QgbG9hZFJlc3VsdCA9IGxvYWRBdWRpb0VmZmVjdFhtbENvbmZpZygpOworICAgIGlmIChsb2FkUmVzdWx0IDwgMCkgeworICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGxvYWQgWE1MIGVmZmVjdCBjb25maWd1cmF0aW9uLCBmYWxsYmFjayB0byAuY29uZiIpOworICAgICAgICAvLyBsb2FkIGF1dG9tYXRpYyBhdWRpbyBlZmZlY3QgbW9kdWxlcworICAgICAgICBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKKyAgICAgICAgICAgIGxvYWRBdWRpb0VmZmVjdENvbmZpZyhBVURJT19FRkZFQ1RfVkVORE9SX0NPTkZJR19GSUxFKTsKKyAgICAgICAgfSBlbHNlIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX0RFRkFVTFRfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKKyAgICAgICAgICAgIGxvYWRBdWRpb0VmZmVjdENvbmZpZyhBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGxvYWRSZXN1bHQgPiAwKSB7CisgICAgICAgIEFMT0dFKCJFZmZlY3QgY29uZmlnIGlzIHBhcnRpYWxseSBpbnZhbGlkLCBza2lwcGVkICVkIGVsZW1lbnRzIiwgbG9hZFJlc3VsdCk7CiAgICAgfQogfQogCkBAIC02ODUsNiArNjkzLDI4IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeUVmZmVjdHM6OmxvYWRBdWRpb0VmZmVjdFhtbENvbmZpZygpIHsKKyAgICBhdXRvIHJlc3VsdCA9IGVmZmVjdHNDb25maWc6OnBhcnNlKCk7CisgICAgaWYgKHJlc3VsdC5wYXJzZWRDb25maWcgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gLUVOT0VOVDsKKyAgICB9CisKKyAgICBhdXRvIGxvYWRQcm9jZXNzaW5nQ2hhaW4gPSBbXShhdXRvJiBwcm9jZXNzaW5nQ2hhaW4sIGF1dG8mIHN0cmVhbXMpIHsKKyAgICAgICAgZm9yIChhdXRvJiBzdHJlYW0gOiBwcm9jZXNzaW5nQ2hhaW4pIHsKKyAgICAgICAgICAgIGF1dG8gZWZmZWN0RGVzY3MgPSBzdGQ6Om1ha2VfdW5pcXVlPEVmZmVjdERlc2NWZWN0b3I+KCk7CisgICAgICAgICAgICBmb3IgKGF1dG8mIGVmZmVjdCA6IHN0cmVhbS5lZmZlY3RzKSB7CisgICAgICAgICAgICAgICAgZWZmZWN0RGVzY3MtPm1FZmZlY3RzLmFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFZmZlY3REZXNje2VmZmVjdC5nZXQoKS5uYW1lLmNfc3RyKCksIGVmZmVjdC5nZXQoKS51dWlkfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJlYW1zLmFkZChzdHJlYW0udHlwZSwgZWZmZWN0RGVzY3MucmVsZWFzZSgpKTsKKyAgICAgICAgfQorICAgIH07CisgICAgbG9hZFByb2Nlc3NpbmdDaGFpbihyZXN1bHQucGFyc2VkQ29uZmlnLT5wcmVwcm9jZXNzLCBtSW5wdXRTb3VyY2VzKTsKKyAgICBsb2FkUHJvY2Vzc2luZ0NoYWluKHJlc3VsdC5wYXJzZWRDb25maWctPnBvc3Rwcm9jZXNzLCBtT3V0cHV0U3RyZWFtcyk7CisgICAgLy8gQ2FzdGluZyBmcm9tIHNzaXplX3QgdG8gc3RhdHVzX3QgaXMgcHJvYmFibHkgc2FmZSwgdGhlcmUgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYW4gMl4zMSBlcnJvcnMKKyAgICByZXR1cm4gcmVzdWx0Lm5iU2tpcHBlZEVsZW1lbnQ7Cit9CisKIHN0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6bG9hZEF1ZGlvRWZmZWN0Q29uZmlnKGNvbnN0IGNoYXIgKnBhdGgpCiB7CiAgICAgY25vZGUgKnJvb3Q7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaAppbmRleCAwYzc0ZDg3Li41OWQ1ZDE0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmgKQEAgLTE1NSw3ICsxNTUsOCBAQAogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtTmFtZVRvRW51bShjb25zdCBjaGFyICpuYW1lKTsKIAogICAgIC8vIFBhcnNlIGF1ZGlvX2VmZmVjdHMuY29uZgotICAgIHN0YXR1c190IGxvYWRBdWRpb0VmZmVjdENvbmZpZyhjb25zdCBjaGFyICpwYXRoKTsKKyAgICBzdGF0dXNfdCBsb2FkQXVkaW9FZmZlY3RDb25maWcoY29uc3QgY2hhciAqcGF0aCk7IC8vIFRPRE86IGFkZCBsZWdhY3kgaW4gdGhlIG5hbWUKKyAgICBzdGF0dXNfdCBsb2FkQXVkaW9FZmZlY3RYbWxDb25maWcoKTsgLy8gVE9ETzogcmVtb3ZlICJYbWwiIGluIHRoZSBuYW1lCiAKICAgICAvLyBMb2FkIGFsbCBlZmZlY3RzIGRlc2NyaXB0b3JzIGluIGNvbmZpZ3VyYXRpb24gZmlsZQogICAgIHN0YXR1c190IGxvYWRFZmZlY3RzKGNub2RlICpyb290LCBWZWN0b3IgPEVmZmVjdERlc2MgKj4mIGVmZmVjdHMpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwCmluZGV4IDdkN2NkOTMuLmI3YmNlNTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKQEAgLTI4OSwxMyArMjg5LDYgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBpZiAoKGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgJiYgIWNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjppbnB1dF90eXBlX3QgaW5wdXRUeXBlOwotCiAgICAgYm9vbCB1cGRhdGVQaWQgPSAocGlkID09IC0xKTsKICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwogICAgIGlmICghaXNUcnVzdGVkQ2FsbGluZ1VpZChjYWxsaW5nVWlkKSkgewpAQCAtMzEzLDcgKzMwNiwxNSBAQAogICAgICAgICBwaWQgPSBjYWxsaW5nUGlkOwogICAgIH0KIAorICAgIGlmICgoYXR0ci0+c291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSAmJiAhY2FwdHVyZUhvdHdvcmRBbGxvd2VkKHBpZCwgdWlkKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CiAgICAgeworICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjppbnB1dF90eXBlX3QgaW5wdXRUeXBlOworCiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIC8vIHRoZSBhdWRpb19pbl9hY291c3RpY3NfdCBwYXJhbWV0ZXIgaXMgaWdub3JlZCBieSBnZXRfaW5wdXQoKQogICAgICAgICBzdGF0dXMgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRJbnB1dEZvckF0dHIoYXR0ciwgaW5wdXQsIHNlc3Npb24sIHVpZCwKQEAgLTY5Myw2ICs2OTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpCiB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KQEAgLTcwMiw2ICs3MDQsNyBAQAogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQogeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKaW5kZXggYzRmNjM2Ny4uYjQxNzYzMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApAQCAtMTg1LDIxICsxODUsMjEgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKKyAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKIHsKLSAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+cmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZUNvbW1hbmQoZXZlbnQsIHNlc3Npb24sIHNvdXJjZSwKKyAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+cmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZUNvbW1hbmQoZXZlbnQsIGNsaWVudEluZm8sCiAgICAgICAgICAgICBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAorICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAogICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTm90aWZpY2F0aW9uQ2xpZW50c0xvY2spOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU5vdGlmaWNhdGlvbkNsaWVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVBdChpKS0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBzZXNzaW9uLCBzb3VyY2UsCisgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlQXQoaSktPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgY2xpZW50SW5mbywKICAgICAgICAgICAgICAgICBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwogICAgIH0KIH0KQEAgLTI2NywxMiArMjY3LDEyIEBACiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKLSAgICAgICAgaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCkgewotICAgICAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsIHNlc3Npb24sIHNvdXJjZSwKKyAgICAgICAgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCBjbGllbnRJbmZvLAogICAgICAgICAgICAgICAgIGNsaWVudENvbmZpZywgZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CiAgICAgfQogfQpAQCAtNTQ0LDggKzU0NCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb09uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShkYXRhLT5tRXZlbnQsIGRhdGEtPm1TZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1Tb3VyY2UsICZkYXRhLT5tQ2xpZW50Q29uZmlnLCAmZGF0YS0+bURldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb09uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShkYXRhLT5tRXZlbnQsICZkYXRhLT5tQ2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YS0+bUNsaWVudENvbmZpZywgJmRhdGEtPm1EZXZpY2VDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVBhdGNoSGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOwpAQCAtODEwLDcgKzgxMCw3IEBACiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGVDb21tYW5kKAotICAgICAgICBpbnQgZXZlbnQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgIGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCiAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAogICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKIHsKQEAgLTgxOCwxNCArODE4LDEzIEBACiAgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBSRUNPUkRJTkdfQ09ORklHVVJBVElPTl9VUERBVEU7CiAgICAgUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZURhdGEgKmRhdGEgPSBuZXcgUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZURhdGEoKTsKICAgICBkYXRhLT5tRXZlbnQgPSBldmVudDsKLSAgICBkYXRhLT5tU2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgZGF0YS0+bVNvdXJjZSA9IHNvdXJjZTsKKyAgICBkYXRhLT5tQ2xpZW50SW5mbyA9ICpjbGllbnRJbmZvOwogICAgIGRhdGEtPm1DbGllbnRDb25maWcgPSAqY2xpZW50Q29uZmlnOwogICAgIGRhdGEtPm1EZXZpY2VDb25maWcgPSAqZGV2aWNlQ29uZmlnOwogICAgIGRhdGEtPm1QYXRjaEhhbmRsZSA9IHBhdGNoSGFuZGxlOwogICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyByZWNvcmRpbmcgY29uZmlndXJhdGlvbiB1cGRhdGUgZXZlbnQgJWQsIHNvdXJjZSAlZCIsCi0gICAgICAgICAgICBldmVudCwgc291cmNlKTsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHJlY29yZGluZyBjb25maWd1cmF0aW9uIHVwZGF0ZSBldmVudCAlZCwgc291cmNlICVkIHVpZCAldSIsCisgICAgICAgICAgICBldmVudCwgY2xpZW50SW5mby0+c291cmNlLCBjbGllbnRJbmZvLT51aWQpOwogICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaAppbmRleCAzNTU0MmYxLi4zOGQ0YjE3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKQEAgLTIyOCwxMSArMjI4LDExIEBACiAKICAgICAgICAgICAgIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpOwogICAgICAgICAgICAgdm9pZCBkb09uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKLSAgICAgICAgICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKLSAgICAgICAgICAgIHZvaWQgZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICB2b2lkIGRvT25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CiAKIHByaXZhdGU6CkBAIC0zMDYsOCArMzA2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZUNvbW1hbmQoY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpOwogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlQ29tbWFuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOwpAQCAtNDA0LDggKzQwNCw3IEBACiAgICAgICAgIGNsYXNzIFJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGVEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgewogICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICBpbnQgbUV2ZW50OwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IG1TZXNzaW9uOwotICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgbVNvdXJjZTsKKyAgICAgICAgICAgIHJlY29yZF9jbGllbnRfaW5mb190IG1DbGllbnRJbmZvOwogICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlIG1DbGllbnRDb25maWc7CiAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UgbURldmljZUNvbmZpZzsKICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1QYXRjaEhhbmRsZTsKQEAgLTUxOCw3ICs1MTcsNyBAQAogICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CiAKQEAgLTU0MCw4ICs1MzksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tawppbmRleCAwMWYwMzNhLi4xZmJiYTU4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTc3LDcgKzc3LDggQEAKICAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5jb21tb25AMS4wIFwKICAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjQgXAogICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAxLjAgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIKKyAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4yIFwKKyAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4zCiAKIExPQ0FMX0VYUE9SVF9TSEFSRURfTElCUkFSWV9IRUFERVJTIDo9IGxpYmJpbmRlciBsaWJjYW1lcmFfY2xpZW50IGxpYmZtcQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcAppbmRleCBhMjg1MThlLi4yY2Y2NDhmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKQEAgLTcyLDYgKzcyLDIwIEBACiAgICAgcmV0dXJuIGluaXRpYWxpemVJbXBsKG1hbmFnZXIpOwogfQogCitib29sIENhbWVyYTJDbGllbnQ6OmlzWnNsRW5hYmxlZEluU3RpbGxUZW1wbGF0ZSgpIHsKKyAgICBib29sIHpzbEVuYWJsZWQgPSBmYWxzZTsKKyAgICBDYW1lcmFNZXRhZGF0YSBzdGlsbFRlbXBsYXRlOworICAgIHN0YXR1c190IHJlcyA9IG1EZXZpY2UtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KENBTUVSQTJfVEVNUExBVEVfU1RJTExfQ0FQVFVSRSwgJnN0aWxsVGVtcGxhdGUpOworICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW5hYmxlWnNsID0gc3RpbGxUZW1wbGF0ZS5maW5kKEFORFJPSURfQ09OVFJPTF9FTkFCTEVfWlNMKTsKKyAgICAgICAgaWYgKGVuYWJsZVpzbC5jb3VudCA9PSAxKSB7CisgICAgICAgICAgICB6c2xFbmFibGVkID0gKGVuYWJsZVpzbC5kYXRhLnU4WzBdID09IEFORFJPSURfQ09OVFJPTF9FTkFCTEVfWlNMX1RSVUUpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHpzbEVuYWJsZWQ7Cit9CisKIHRlbXBsYXRlPHR5cGVuYW1lIFRQcm92aWRlclB0cj4KIHN0YXR1c190IENhbWVyYTJDbGllbnQ6OmluaXRpYWxpemVJbXBsKFRQcm92aWRlclB0ciBwcm92aWRlclB0cikKIHsKQEAgLTkzLDYgKzEwNyw4IEBACiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgICAgICB9CisKKyAgICAgICAgbC5tUGFyYW1ldGVycy5pc0RldmljZVpzbFN1cHBvcnRlZCA9IGlzWnNsRW5hYmxlZEluU3RpbGxUZW1wbGF0ZSgpOwogICAgIH0KIAogICAgIFN0cmluZzggdGhyZWFkTmFtZTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmgKaW5kZXggNzIzMTVkNC4uNWFmNzRlYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmgKQEAgLTIyNCw2ICsyMjQsOCBAQAogCiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVFByb3ZpZGVyUHRyPgogICAgIHN0YXR1c190IGluaXRpYWxpemVJbXBsKFRQcm92aWRlclB0ciBwcm92aWRlclB0cik7CisKKyAgICBib29sIGlzWnNsRW5hYmxlZEluU3RpbGxUZW1wbGF0ZSgpOwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuY3BwCmluZGV4IDNmNDAxN2YuLjBkMmRiYTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmNwcApAQCAtMTIxLDE4ICsxMjEsMTcgQEAKIAogICAgIGlmIChtQ2FsbGJhY2tTdHJlYW1JZCAhPSBOT19TVFJFQU0pIHsKICAgICAgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIHBhcmFtZXRlcnMgaGF2ZSB0byBjaGFuZ2UKLSAgICAgICAgdWludDMyX3QgY3VycmVudFdpZHRoLCBjdXJyZW50SGVpZ2h0LCBjdXJyZW50Rm9ybWF0OwotICAgICAgICByZXMgPSBkZXZpY2UtPmdldFN0cmVhbUluZm8obUNhbGxiYWNrU3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgJmN1cnJlbnRXaWR0aCwgJmN1cnJlbnRIZWlnaHQsICZjdXJyZW50Rm9ybWF0LCAwKTsKKyAgICAgICAgQ2FtZXJhRGV2aWNlQmFzZTo6U3RyZWFtSW5mbyBzdHJlYW1JbmZvOworICAgICAgICByZXMgPSBkZXZpY2UtPmdldFN0cmVhbUluZm8obUNhbGxiYWNrU3RyZWFtSWQsICZzdHJlYW1JbmZvKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEVycm9yIHF1ZXJ5aW5nIGNhbGxiYWNrIG91dHB1dCBzdHJlYW0gaW5mbzogIgogICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLAogICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGN1cnJlbnRXaWR0aCAhPSAodWludDMyX3QpcGFyYW1zLnByZXZpZXdXaWR0aCB8fAotICAgICAgICAgICAgICAgIGN1cnJlbnRIZWlnaHQgIT0gKHVpbnQzMl90KXBhcmFtcy5wcmV2aWV3SGVpZ2h0IHx8Ci0gICAgICAgICAgICAgICAgY3VycmVudEZvcm1hdCAhPSAodWludDMyX3QpY2FsbGJhY2tGb3JtYXQpIHsKKyAgICAgICAgaWYgKHN0cmVhbUluZm8ud2lkdGggIT0gKHVpbnQzMl90KXBhcmFtcy5wcmV2aWV3V2lkdGggfHwKKyAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLmhlaWdodCAhPSAodWludDMyX3QpcGFyYW1zLnByZXZpZXdIZWlnaHQgfHwKKyAgICAgICAgICAgICAgICAhc3RyZWFtSW5mby5tYXRjaEZvcm1hdCgodWludDMyX3QpY2FsbGJhY2tGb3JtYXQpKSB7CiAgICAgICAgICAgICAvLyBTaW5jZSBzaXplIHNob3VsZCBvbmx5IGNoYW5nZSB3aGlsZSBwcmV2aWV3IGlzIG5vdCBydW5uaW5nLAogICAgICAgICAgICAgLy8gYXNzdW1pbmcgdGhhdCBhbGwgZXhpc3RpbmcgdXNlIG9mIG9sZCBjYWxsYmFjayBzdHJlYW0gaXMKICAgICAgICAgICAgIC8vIGNvbXBsZXRlZC4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcAppbmRleCBkNmQ4ZGRlLi5kOGI3YWYyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwCkBAIC0xMzYsMTcgKzEzNiwxNiBAQAogCiAgICAgaWYgKG1DYXB0dXJlU3RyZWFtSWQgIT0gTk9fU1RSRUFNKSB7CiAgICAgICAgIC8vIENoZWNrIGlmIHN0cmVhbSBwYXJhbWV0ZXJzIGhhdmUgdG8gY2hhbmdlCi0gICAgICAgIHVpbnQzMl90IGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodDsKLSAgICAgICAgcmVzID0gZGV2aWNlLT5nZXRTdHJlYW1JbmZvKG1DYXB0dXJlU3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgJmN1cnJlbnRXaWR0aCwgJmN1cnJlbnRIZWlnaHQsIDAsIDApOworICAgICAgICBDYW1lcmFEZXZpY2VCYXNlOjpTdHJlYW1JbmZvIHN0cmVhbUluZm87CisgICAgICAgIHJlcyA9IGRldmljZS0+Z2V0U3RyZWFtSW5mbyhtQ2FwdHVyZVN0cmVhbUlkLCAmc3RyZWFtSW5mbyk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBFcnJvciBxdWVyeWluZyBjYXB0dXJlIG91dHB1dCBzdHJlYW0gaW5mbzogIgogICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICAgICAgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGN1cnJlbnRXaWR0aCAhPSAodWludDMyX3QpcGFyYW1zLnBpY3R1cmVXaWR0aCB8fAotICAgICAgICAgICAgICAgIGN1cnJlbnRIZWlnaHQgIT0gKHVpbnQzMl90KXBhcmFtcy5waWN0dXJlSGVpZ2h0KSB7CisgICAgICAgIGlmIChzdHJlYW1JbmZvLndpZHRoICE9ICh1aW50MzJfdClwYXJhbXMucGljdHVyZVdpZHRoIHx8CisgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5oZWlnaHQgIT0gKHVpbnQzMl90KXBhcmFtcy5waWN0dXJlSGVpZ2h0KSB7CiAgICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogRGVsZXRpbmcgc3RyZWFtICVkIHNpbmNlIHRoZSBidWZmZXIgZGltZW5zaW9ucyBjaGFuZ2VkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgbUNhcHR1cmVTdHJlYW1JZCk7CiAgICAgICAgICAgICByZXMgPSBkZXZpY2UtPmRlbGV0ZVN0cmVhbShtQ2FwdHVyZVN0cmVhbUlkKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcAppbmRleCAxYWRkY2RkLi4wMmE3NjE2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwCkBAIC05NTQsNyArOTU0LDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChzbG93SnBlZ01vZGUgfHwgcHJvcGVydHlfZ2V0X2Jvb2woImNhbWVyYS5kaXNhYmxlX3pzbF9tb2RlIiwgZmFsc2UpKSB7CisgICAgaWYgKGlzRGV2aWNlWnNsU3VwcG9ydGVkIHx8IHNsb3dKcGVnTW9kZSB8fAorICAgICAgICAgICAgcHJvcGVydHlfZ2V0X2Jvb2woImNhbWVyYS5kaXNhYmxlX3pzbF9tb2RlIiwgZmFsc2UpKSB7CiAgICAgICAgIEFMT0dJKCJDYW1lcmEgJWQ6IERpc2FibGluZyBaU0wgbW9kZSIsIGNhbWVyYUlkKTsKICAgICAgICAgYWxsb3dac2xNb2RlID0gZmFsc2U7CiAgICAgfSBlbHNlIHsKQEAgLTE5OTcsNyArMTk5OCw4IEBACiAgICAgaWYgKHByZXZpZXdGcHNSYW5nZVsxXSA+IDFlOS9taW5GcmFtZUR1cmF0aW9uTnMgKyBGUFNfTUFSR0lOKSB7CiAgICAgICAgIHNsb3dKcGVnTW9kZSA9IHRydWU7CiAgICAgfQotICAgIGlmIChzbG93SnBlZ01vZGUgfHwgcHJvcGVydHlfZ2V0X2Jvb2woImNhbWVyYS5kaXNhYmxlX3pzbF9tb2RlIiwgZmFsc2UpKSB7CisgICAgaWYgKGlzRGV2aWNlWnNsU3VwcG9ydGVkIHx8IHNsb3dKcGVnTW9kZSB8fAorICAgICAgICAgICAgcHJvcGVydHlfZ2V0X2Jvb2woImNhbWVyYS5kaXNhYmxlX3pzbF9tb2RlIiwgZmFsc2UpKSB7CiAgICAgICAgIGFsbG93WnNsTW9kZSA9IGZhbHNlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGFsbG93WnNsTW9kZSA9IGlzWnNsUmVwcm9jZXNzUHJlc2VudDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oCmluZGV4IGJlYTg2N2EuLjE3ZTNkNzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaApAQCAtMTc1LDYgKzE3NSw4IEBACiAgICAgYm9vbCBzbG93SnBlZ01vZGU7CiAgICAgLy8gV2hldGhlciBaU0wgcmVwcm9jZXNzIGlzIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlLgogICAgIGJvb2wgaXNac2xSZXByb2Nlc3NQcmVzZW50OworICAgIC8vIFdoZXRoZXIgdGhlIGRldmljZSBzdXBwb3J0cyBlbmFibGVac2wuCisgICAgYm9vbCBpc0RldmljZVpzbFN1cHBvcnRlZDsKIAogICAgIC8vIE92ZXJhbGwgY2FtZXJhIHN0YXRlCiAgICAgZW51bSBTdGF0ZSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuY3BwCmluZGV4IGQ3OWU0MzAuLjczZGNhNzMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuY3BwCkBAIC0xNjEsMTggKzE2MSwxNyBAQAogCiAgICAgaWYgKG1QcmV2aWV3U3RyZWFtSWQgIT0gTk9fU1RSRUFNKSB7CiAgICAgICAgIC8vIENoZWNrIGlmIHN0cmVhbSBwYXJhbWV0ZXJzIGhhdmUgdG8gY2hhbmdlCi0gICAgICAgIHVpbnQzMl90IGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodDsKLSAgICAgICAgcmVzID0gZGV2aWNlLT5nZXRTdHJlYW1JbmZvKG1QcmV2aWV3U3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgJmN1cnJlbnRXaWR0aCwgJmN1cnJlbnRIZWlnaHQsIDAsIDApOworICAgICAgICBDYW1lcmFEZXZpY2VCYXNlOjpTdHJlYW1JbmZvIHN0cmVhbUluZm87CisgICAgICAgIHJlcyA9IGRldmljZS0+Z2V0U3RyZWFtSW5mbyhtUHJldmlld1N0cmVhbUlkLCAmc3RyZWFtSW5mbyk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBFcnJvciBxdWVyeWluZyBwcmV2aWV3IHN0cmVhbSBpbmZvOiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQotICAgICAgICBpZiAoY3VycmVudFdpZHRoICE9ICh1aW50MzJfdClwYXJhbXMucHJldmlld1dpZHRoIHx8Ci0gICAgICAgICAgICAgICAgY3VycmVudEhlaWdodCAhPSAodWludDMyX3QpcGFyYW1zLnByZXZpZXdIZWlnaHQpIHsKKyAgICAgICAgaWYgKHN0cmVhbUluZm8ud2lkdGggIT0gKHVpbnQzMl90KXBhcmFtcy5wcmV2aWV3V2lkdGggfHwKKyAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLmhlaWdodCAhPSAodWludDMyX3QpcGFyYW1zLnByZXZpZXdIZWlnaHQpIHsKICAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBQcmV2aWV3IHNpemUgc3dpdGNoOiAlZCB4ICVkIC0+ICVkIHggJWQiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgY3VycmVudFdpZHRoLCBjdXJyZW50SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZWFtSW5mby53aWR0aCwgc3RyZWFtSW5mby5oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5wcmV2aWV3V2lkdGgsIHBhcmFtcy5wcmV2aWV3SGVpZ2h0KTsKICAgICAgICAgICAgIHJlcyA9IGRldmljZS0+d2FpdFVudGlsRHJhaW5lZCgpOwogICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewpAQCAtMzEyLDEwICszMTEsOCBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgdWludDMyX3QgY3VycmVudFdpZHRoLCBjdXJyZW50SGVpZ2h0LCBjdXJyZW50Rm9ybWF0OwotICAgIGFuZHJvaWRfZGF0YXNwYWNlIGN1cnJlbnREYXRhU3BhY2U7Ci0gICAgcmVzID0gZGV2aWNlLT5nZXRTdHJlYW1JbmZvKG1SZWNvcmRpbmdTdHJlYW1JZCwKLSAgICAgICAgICAgICZjdXJyZW50V2lkdGgsICZjdXJyZW50SGVpZ2h0LCAmY3VycmVudEZvcm1hdCwgJmN1cnJlbnREYXRhU3BhY2UpOworICAgIENhbWVyYURldmljZUJhc2U6OlN0cmVhbUluZm8gc3RyZWFtSW5mbzsKKyAgICByZXMgPSBkZXZpY2UtPmdldFN0cmVhbUluZm8obVJlY29yZGluZ1N0cmVhbUlkLCAmc3RyZWFtSW5mbyk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogRXJyb3IgcXVlcnlpbmcgcmVjb3JkaW5nIG91dHB1dCBzdHJlYW0gaW5mbzogIgogICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsCkBAIC0zMjQsMTAgKzMyMSwxMCBAQAogICAgIH0KIAogICAgIGlmIChtUmVjb3JkaW5nV2luZG93ID09IG51bGxwdHIgfHwKLSAgICAgICAgICAgIGN1cnJlbnRXaWR0aCAhPSAodWludDMyX3QpcGFyYW1zLnZpZGVvV2lkdGggfHwKLSAgICAgICAgICAgIGN1cnJlbnRIZWlnaHQgIT0gKHVpbnQzMl90KXBhcmFtcy52aWRlb0hlaWdodCB8fAotICAgICAgICAgICAgY3VycmVudEZvcm1hdCAhPSAodWludDMyX3QpcGFyYW1zLnZpZGVvRm9ybWF0IHx8Ci0gICAgICAgICAgICBjdXJyZW50RGF0YVNwYWNlICE9IHBhcmFtcy52aWRlb0RhdGFTcGFjZSkgeworICAgICAgICAgICAgc3RyZWFtSW5mby53aWR0aCAhPSAodWludDMyX3QpcGFyYW1zLnZpZGVvV2lkdGggfHwKKyAgICAgICAgICAgIHN0cmVhbUluZm8uaGVpZ2h0ICE9ICh1aW50MzJfdClwYXJhbXMudmlkZW9IZWlnaHQgfHwKKyAgICAgICAgICAgICFzdHJlYW1JbmZvLm1hdGNoRm9ybWF0KCh1aW50MzJfdClwYXJhbXMudmlkZW9Gb3JtYXQpIHx8CisgICAgICAgICAgICAhc3RyZWFtSW5mby5tYXRjaERhdGFTcGFjZShwYXJhbXMudmlkZW9EYXRhU3BhY2UpKSB7CiAgICAgICAgICpuZWVkc1VwZGF0ZSA9IHRydWU7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQpAQCAtMzQ4LDIyICszNDUsMTggQEAKIAogICAgIGlmIChtUmVjb3JkaW5nU3RyZWFtSWQgIT0gTk9fU1RSRUFNKSB7CiAgICAgICAgIC8vIENoZWNrIGlmIHN0cmVhbSBwYXJhbWV0ZXJzIGhhdmUgdG8gY2hhbmdlCi0gICAgICAgIHVpbnQzMl90IGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodDsKLSAgICAgICAgdWludDMyX3QgY3VycmVudEZvcm1hdDsKLSAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgY3VycmVudERhdGFTcGFjZTsKLSAgICAgICAgcmVzID0gZGV2aWNlLT5nZXRTdHJlYW1JbmZvKG1SZWNvcmRpbmdTdHJlYW1JZCwKLSAgICAgICAgICAgICAgICAmY3VycmVudFdpZHRoLCAmY3VycmVudEhlaWdodCwKLSAgICAgICAgICAgICAgICAmY3VycmVudEZvcm1hdCwgJmN1cnJlbnREYXRhU3BhY2UpOworICAgICAgICBDYW1lcmFEZXZpY2VCYXNlOjpTdHJlYW1JbmZvIHN0cmVhbUluZm87CisgICAgICAgIHJlcyA9IGRldmljZS0+Z2V0U3RyZWFtSW5mbyhtUmVjb3JkaW5nU3RyZWFtSWQsICZzdHJlYW1JbmZvKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEVycm9yIHF1ZXJ5aW5nIHJlY29yZGluZyBvdXRwdXQgc3RyZWFtIGluZm86ICIKICAgICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwKICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9Ci0gICAgICAgIGlmIChjdXJyZW50V2lkdGggIT0gKHVpbnQzMl90KXBhcmFtcy52aWRlb1dpZHRoIHx8Ci0gICAgICAgICAgICAgICAgY3VycmVudEhlaWdodCAhPSAodWludDMyX3QpcGFyYW1zLnZpZGVvSGVpZ2h0IHx8Ci0gICAgICAgICAgICAgICAgY3VycmVudEZvcm1hdCAhPSAodWludDMyX3QpcGFyYW1zLnZpZGVvRm9ybWF0IHx8Ci0gICAgICAgICAgICAgICAgY3VycmVudERhdGFTcGFjZSAhPSBwYXJhbXMudmlkZW9EYXRhU3BhY2UpIHsKKyAgICAgICAgaWYgKHN0cmVhbUluZm8ud2lkdGggIT0gKHVpbnQzMl90KXBhcmFtcy52aWRlb1dpZHRoIHx8CisgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5oZWlnaHQgIT0gKHVpbnQzMl90KXBhcmFtcy52aWRlb0hlaWdodCB8fAorICAgICAgICAgICAgICAgICFzdHJlYW1JbmZvLm1hdGNoRm9ybWF0KCh1aW50MzJfdClwYXJhbXMudmlkZW9Gb3JtYXQpIHx8CisgICAgICAgICAgICAgICAgIXN0cmVhbUluZm8ubWF0Y2hEYXRhU3BhY2UocGFyYW1zLnZpZGVvRGF0YVNwYWNlKSkgewogICAgICAgICAgICAgLy8gVE9ETzogU2hvdWxkIHdhaXQgdG8gYmUgc3VyZSBwcmV2aW91cyByZWNvcmRpbmcgaGFzIGZpbmlzaGVkCiAgICAgICAgICAgICByZXMgPSBkZXZpY2UtPmRlbGV0ZVN0cmVhbShtUmVjb3JkaW5nU3RyZWFtSWQpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwCmluZGV4IDliYzMxYjkuLmIwNjA3ZmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwCkBAIC0yMzMsMTcgKzIzMywxNiBAQAogCiAgICAgaWYgKChtWnNsU3RyZWFtSWQgIT0gTk9fU1RSRUFNKSB8fCAobUlucHV0U3RyZWFtSWQgIT0gTk9fU1RSRUFNKSkgewogICAgICAgICAvLyBDaGVjayBpZiBzdHJlYW0gcGFyYW1ldGVycyBoYXZlIHRvIGNoYW5nZQotICAgICAgICB1aW50MzJfdCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQ7Ci0gICAgICAgIHJlcyA9IGRldmljZS0+Z2V0U3RyZWFtSW5mbyhtWnNsU3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgJmN1cnJlbnRXaWR0aCwgJmN1cnJlbnRIZWlnaHQsIDAsIDApOworICAgICAgICBDYW1lcmFEZXZpY2VCYXNlOjpTdHJlYW1JbmZvIHN0cmVhbUluZm87CisgICAgICAgIHJlcyA9IGRldmljZS0+Z2V0U3RyZWFtSW5mbyhtWnNsU3RyZWFtSWQsICZzdHJlYW1JbmZvKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEVycm9yIHF1ZXJ5aW5nIGNhcHR1cmUgb3V0cHV0IHN0cmVhbSBpbmZvOiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmdldENhbWVyYUlkKCksIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQotICAgICAgICBpZiAoY3VycmVudFdpZHRoICE9ICh1aW50MzJfdClwYXJhbXMuZmFzdEluZm8uYXJyYXlXaWR0aCB8fAotICAgICAgICAgICAgICAgIGN1cnJlbnRIZWlnaHQgIT0gKHVpbnQzMl90KXBhcmFtcy5mYXN0SW5mby5hcnJheUhlaWdodCkgeworICAgICAgICBpZiAoc3RyZWFtSW5mby53aWR0aCAhPSAodWludDMyX3QpcGFyYW1zLmZhc3RJbmZvLmFycmF5V2lkdGggfHwKKyAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLmhlaWdodCAhPSAodWludDMyX3QpcGFyYW1zLmZhc3RJbmZvLmFycmF5SGVpZ2h0KSB7CiAgICAgICAgICAgICBpZiAobVpzbFN0cmVhbUlkICE9IE5PX1NUUkVBTSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBEZWxldGluZyBzdHJlYW0gJWQgc2luY2UgdGhlIGJ1ZmZlciAiCiAgICAgICAgICAgICAgICAgICAgICAgImRpbWVuc2lvbnMgY2hhbmdlZCIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKaW5kZXggMDQyOWU3Zi4uYzAzZThhMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcApAQCAtMzEzLDExICszMTMsMTMgQEAKIAogYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50OjpiZWdpbkNvbmZpZ3VyZSgpIHsKICAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcy4KKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogTm90IGltcGxlbWVudGVkIHlldC4iLCBfX0ZVTkNUSU9OX18pOwogICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKIH0KIAogYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50OjplbmRDb25maWd1cmUoaW50IG9wZXJhdGluZ01vZGUpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogZW5kaW5nIGNvbmZpZ3VyZSAoJWQgaW5wdXQgc3RyZWFtLCAlenUgb3V0cHV0IHN1cmZhY2VzKSIsCiAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JbnB1dFN0cmVhbS5jb25maWd1cmVkID8gMSA6IDAsCiAgICAgICAgICAgICBtU3RyZWFtTWFwLnNpemUoKSk7CkBAIC01NjgsNyArNTcwLDcgQEAKICAgICAgICAgLypvdXQqLwogICAgICAgICBpbnQqIG5ld1N0cmVhbUlkKSB7CiAgICAgaW50IHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgc3VyZmFjZVR5cGU7Ci0gICAgaW50MzJfdCBjb25zdW1lclVzYWdlOworICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2U7CiAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlOwogICAgIHN0YXR1c190IGVycjsKICAgICBiaW5kZXI6OlN0YXR1cyByZXM7CkBAIC03NjQsMjQgKzc2NiwyMyBAQAogICAgIC8vIFF1ZXJ5IGNvbnN1bWVyIHVzYWdlIGJpdHMgdG8gc2V0IGFzeW5jIG9wZXJhdGlvbiBtb2RlIGZvcgogICAgIC8vIEdMQ29uc3VtZXIgdXNpbmcgY29udHJvbGxlZEJ5QXBwIHBhcmFtZXRlci4KICAgICBib29sIHVzZUFzeW5jID0gZmFsc2U7Ci0gICAgaW50MzJfdCBjb25zdW1lclVzYWdlOworICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UgPSAwOwogICAgIHN0YXR1c190IGVycjsKLSAgICBpZiAoKGVyciA9IGdicC0+cXVlcnkoTkFUSVZFX1dJTkRPV19DT05TVU1FUl9VU0FHRV9CSVRTLAotICAgICAgICAgICAgJmNvbnN1bWVyVXNhZ2UpKSAhPSBPSykgeworICAgIGlmICgoZXJyID0gZ2JwLT5nZXRDb25zdW1lclVzYWdlKCZjb25zdW1lclVzYWdlKSkgIT0gT0spIHsKICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogRmFpbGVkIHRvIHF1ZXJ5IFN1cmZhY2UgY29uc3VtZXIgdXNhZ2U6ICVzICglZCkiLAogICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgc3RyZXJyb3IoLWVyciksIGVycik7CiAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CiAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04sIG1zZy5zdHJpbmcoKSk7CiAgICAgfQogICAgIGlmIChjb25zdW1lclVzYWdlICYgR3JhcGhpY0J1ZmZlcjo6VVNBR0VfSFdfVEVYVFVSRSkgewotICAgICAgICBBTE9HVygiJXM6IENhbWVyYSAlcyB3aXRoIGNvbnN1bWVyIHVzYWdlIGZsYWc6IDB4JXg6IEZvcmNpbmcgYXN5bmNocm9ub3VzIG1vZGUgZm9yIHN0cmVhbSIsCisgICAgICAgIEFMT0dXKCIlczogQ2FtZXJhICVzIHdpdGggY29uc3VtZXIgdXNhZ2UgZmxhZzogJSIgUFJJdTY0ICI6IEZvcmNpbmcgYXN5bmNocm9ub3VzIG1vZGUgZm9yIHN0cmVhbSIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIGNvbnN1bWVyVXNhZ2UpOwogICAgICAgICB1c2VBc3luYyA9IHRydWU7CiAgICAgfQogCi0gICAgaW50MzJfdCBkaXNhbGxvd2VkRmxhZ3MgPSBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19WSURFT19FTkNPREVSIHwKKyAgICB1aW50NjRfdCBkaXNhbGxvd2VkRmxhZ3MgPSBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19WSURFT19FTkNPREVSIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfUkVOREVSU0NSSVBUOwotICAgIGludDMyX3QgYWxsb3dlZEZsYWdzID0gR3JhcGhpY0J1ZmZlcjo6VVNBR0VfU1dfUkVBRF9NQVNLIHwKKyAgICB1aW50NjRfdCBhbGxvd2VkRmxhZ3MgPSBHcmFwaGljQnVmZmVyOjpVU0FHRV9TV19SRUFEX01BU0sgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY0J1ZmZlcjo6VVNBR0VfSFdfVEVYVFVSRSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19DT01QT1NFUjsKICAgICBib29sIGZsZXhpYmxlQ29uc3VtZXIgPSAoY29uc3VtZXJVc2FnZSAmIGRpc2FsbG93ZWRGbGFncykgPT0gMCAmJgpAQCAtODc0LDcgKzg3NSw3IEBACiAgICAgICAgIC8vc3VyZmFjZSBjbGFzcyB0eXBlLiBVc2UgdXNhZ2UgZmxhZyB0byBhcHByb3hpbWF0ZSB0aGUgY29tcGFyaXNvbi4KICAgICAgICAgaWYgKGNvbnN1bWVyVXNhZ2UgIT0gc3RyZWFtSW5mby5jb25zdW1lclVzYWdlKSB7CiAgICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIkNhbWVyYSAlczpTdXJmYWNlIHVzYWdlIGZsYWcgZG9lc24ndCBtYXRjaCAweCV4IHZzIDB4JXgiLAorICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhICVzOlN1cmZhY2UgdXNhZ2UgZmxhZyBkb2Vzbid0IG1hdGNoICUiIFBSSXU2NCAiIHZzICUiIFBSSXU2NCAiIiwKICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBjb25zdW1lclVzYWdlLCBzdHJlYW1JbmZvLmNvbnN1bWVyVXNhZ2UpOwogICAgICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKQEAgLTEzNTMsNyArMTM1NCw3IEBACiAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IHJlbW90ZUNiID0gZ2V0UmVtb3RlQ2FsbGJhY2soKTsKIAogICAgIGlmIChyZW1vdGVDYiAhPSAwKSB7Ci0gICAgICAgIHJlbW90ZUNiLT5vblJlcGVhdGluZ1JlcXVlc3RFcnJvcihsYXN0RnJhbWVOdW1iZXIpOworICAgICAgICByZW1vdGVDYi0+b25SZXBlYXRpbmdSZXF1ZXN0RXJyb3IobGFzdEZyYW1lTnVtYmVyLCBtU3RyZWFtaW5nUmVxdWVzdElkKTsKICAgICB9CiAKICAgICBNdXRleDo6QXV0b2xvY2sgaWRMb2NrKG1TdHJlYW1pbmdSZXF1ZXN0SWRMb2NrKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCmluZGV4IGU4ZmMwODAuLjUwNjYxY2IgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaApAQCAtMjEzLDEzICsyMTMsMTMgQEAKICAgICAgICAgaW50IGhlaWdodDsKICAgICAgICAgaW50IGZvcm1hdDsKICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlOwotICAgICAgICBpbnQzMl90IGNvbnN1bWVyVXNhZ2U7CisgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2U7CiAgICAgICAgIGJvb2wgZmluYWxpemVkID0gZmFsc2U7CiAgICAgICAgIE91dHB1dFN0cmVhbUluZm8oKSA6CiAgICAgICAgICAgICAgICAgd2lkdGgoLTEpLCBoZWlnaHQoLTEpLCBmb3JtYXQoLTEpLCBkYXRhU3BhY2UoSEFMX0RBVEFTUEFDRV9VTktOT1dOKSwKICAgICAgICAgICAgICAgICBjb25zdW1lclVzYWdlKDApIHt9CiAgICAgICAgIE91dHB1dFN0cmVhbUluZm8oaW50IF93aWR0aCwgaW50IF9oZWlnaHQsIGludCBfZm9ybWF0LCBhbmRyb2lkX2RhdGFzcGFjZSBfZGF0YVNwYWNlLAotICAgICAgICAgICAgICAgIGludDMyX3QgX2NvbnN1bWVyVXNhZ2UpIDoKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBfY29uc3VtZXJVc2FnZSkgOgogICAgICAgICAgICAgICAgICAgICB3aWR0aChfd2lkdGgpLCBoZWlnaHQoX2hlaWdodCksIGZvcm1hdChfZm9ybWF0KSwKICAgICAgICAgICAgICAgICAgICAgZGF0YVNwYWNlKF9kYXRhU3BhY2UpLCBjb25zdW1lclVzYWdlKF9jb25zdW1lclVzYWdlKSB7fQogICAgIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYURldmljZUJhc2UuaAppbmRleCBkOTA1OWYzLi4zOTE5YmZhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgKQEAgLTExOSw3ICsxMTksNyBAQAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKICAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwKICAgICAgICAgICAgIGludCBzdHJlYW1TZXRJZCA9IGNhbWVyYTM6OkNBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElELAotICAgICAgICAgICAgYm9vbCBpc1NoYXJlZCA9IGZhbHNlLCB1aW50MzJfdCBjb25zdW1lclVzYWdlID0gMCkgPSAwOworICAgICAgICAgICAgYm9vbCBpc1NoYXJlZCA9IGZhbHNlLCB1aW50NjRfdCBjb25zdW1lclVzYWdlID0gMCkgPSAwOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGFuIG91dHB1dCBzdHJlYW0gb2YgdGhlIHJlcXVlc3RlZCBzaXplLCBmb3JtYXQsIHJvdGF0aW9uIGFuZApAQCAtMTMyLDcgKzEzMiw3IEBACiAgICAgICAgICAgICBib29sIGhhc0RlZmVycmVkQ29uc3VtZXIsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCiAgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsCiAgICAgICAgICAgICBpbnQgc3RyZWFtU2V0SWQgPSBjYW1lcmEzOjpDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwKLSAgICAgICAgICAgIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSwgdWludDMyX3QgY29uc3VtZXJVc2FnZSA9IDApID0gMDsKKyAgICAgICAgICAgIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSwgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDApID0gMDsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhbiBpbnB1dCBzdHJlYW0gb2Ygd2lkdGgsIGhlaWdodCwgYW5kIGZvcm1hdC4KQEAgLTE0MiwxMiArMTQyLDUxIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVJbnB1dFN0cmVhbSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAogICAgICAgICAgICAgaW50MzJfdCBmb3JtYXQsIC8qb3V0Ki8gaW50MzJfdCAqaWQpID0gMDsKIAorICAgIHN0cnVjdCBTdHJlYW1JbmZvIHsKKyAgICAgICAgdWludDMyX3Qgd2lkdGg7CisgICAgICAgIHVpbnQzMl90IGhlaWdodDsKKworICAgICAgICB1aW50MzJfdCBmb3JtYXQ7CisgICAgICAgIGJvb2wgZm9ybWF0T3ZlcnJpZGRlbjsKKyAgICAgICAgdWludDMyX3Qgb3JpZ2luYWxGb3JtYXQ7CisKKyAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlOworICAgICAgICBib29sIGRhdGFTcGFjZU92ZXJyaWRkZW47CisgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIG9yaWdpbmFsRGF0YVNwYWNlOworCisgICAgICAgIFN0cmVhbUluZm8oKSA6IHdpZHRoKDApLCBoZWlnaHQoMCksIGZvcm1hdCgwKSwgZm9ybWF0T3ZlcnJpZGRlbihmYWxzZSksIG9yaWdpbmFsRm9ybWF0KDApLAorICAgICAgICAgICAgICAgIGRhdGFTcGFjZShIQUxfREFUQVNQQUNFX1VOS05PV04pLCBkYXRhU3BhY2VPdmVycmlkZGVuKGZhbHNlKSwKKyAgICAgICAgICAgICAgICBvcmlnaW5hbERhdGFTcGFjZShIQUxfREFUQVNQQUNFX1VOS05PV04pIHt9CisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSBmb3JtYXQgbWF0Y2hlcyB0aGUgY3VycmVudCBvciB0aGUgb3JpZ2luYWwgb25lIGluIGNhc2UKKyAgICAgICAgICogaXQgZ290IG92ZXJyaWRkZW4uCisgICAgICAgICAqLworICAgICAgICBib29sIG1hdGNoRm9ybWF0KHVpbnQzMl90IGNsaWVudEZvcm1hdCkgY29uc3QgeworICAgICAgICAgICAgaWYgKChmb3JtYXRPdmVycmlkZGVuICYmIChvcmlnaW5hbEZvcm1hdCA9PSBjbGllbnRGb3JtYXQpKSB8fAorICAgICAgICAgICAgICAgICAgICAoZm9ybWF0ID09IGNsaWVudEZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSBkYXRhc3BhY2UgbWF0Y2hlcyB0aGUgY3VycmVudCBvciB0aGUgb3JpZ2luYWwgb25lIGluIGNhc2UKKyAgICAgICAgICogaXQgZ290IG92ZXJyaWRkZW4uCisgICAgICAgICAqLworICAgICAgICBib29sIG1hdGNoRGF0YVNwYWNlKGFuZHJvaWRfZGF0YXNwYWNlIGNsaWVudERhdGFTcGFjZSkgY29uc3QgeworICAgICAgICAgICAgaWYgKChkYXRhU3BhY2VPdmVycmlkZGVuICYmIChvcmlnaW5hbERhdGFTcGFjZSA9PSBjbGllbnREYXRhU3BhY2UpKSB8fAorICAgICAgICAgICAgICAgICAgICAoZGF0YVNwYWNlID09IGNsaWVudERhdGFTcGFjZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgfTsKKwogICAgIC8qKgogICAgICAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIGdpdmVuIHN0cmVhbS4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN0cmVhbUluZm8oaW50IGlkLAotICAgICAgICAgICAgdWludDMyX3QgKndpZHRoLCB1aW50MzJfdCAqaGVpZ2h0LAotICAgICAgICAgICAgdWludDMyX3QgKmZvcm1hdCwgYW5kcm9pZF9kYXRhc3BhY2UgKmRhdGFTcGFjZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3RyZWFtSW5mbyhpbnQgaWQsIFN0cmVhbUluZm8gKnN0cmVhbUluZm8pID0gMDsKIAogICAgIC8qKgogICAgICAqIFNldCBzdHJlYW0gZ3JhbGxvYyBidWZmZXIgdHJhbnNmb3JtCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwCmluZGV4IGEwMjA5MGIuLmFlM2JiYzEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwCkBAIC0yMDIsMTIgKzIwMiwxNyBAQAogICAgIGZvciAoYXV0byYgcHJvdmlkZXIgOiBtUHJvdmlkZXJzKSB7CiAgICAgICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkKTsKICAgICAgICAgaWYgKGRldmljZUluZm8gIT0gbnVsbHB0cikgewotICAgICAgICAgICAgcHJvdmlkZXItPm1JbnRlcmZhY2UtPmlzU2V0VG9yY2hNb2RlU3VwcG9ydGVkKAorICAgICAgICAgICAgYXV0byByZXQgPSBwcm92aWRlci0+bUludGVyZmFjZS0+aXNTZXRUb3JjaE1vZGVTdXBwb3J0ZWQoCiAgICAgICAgICAgICAgICAgWyZzdXBwb3J0XShhdXRvIHN0YXR1cywgYm9vbCBzdXBwb3J0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ID0gc3VwcG9ydGVkOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGNoZWNraW5nIHRvcmNoIG1vZGUgc3VwcG9ydCAnJXMnOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHByb3ZpZGVyLT5tUHJvdmlkZXJOYW1lLmNfc3RyKCksIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHN1cHBvcnQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuY3BwCmluZGV4IDBmYWU1OTguLjUyMmQ1MjEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuY3BwCkBAIC0yOSwxMSArMjksNiBAQAogQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6On5DYW1lcmFIYXJkd2FyZUludGVyZmFjZSgpCiB7CiAgICAgQUxPR0koIkRlc3Ryb3lpbmcgY2FtZXJhICVzIiwgbU5hbWUuc3RyaW5nKCkpOwotICAgIGlmIChtRGV2aWNlKSB7Ci0gICAgICAgIGludCByYyA9IG1EZXZpY2UtPmNvbW1vbi5jbG9zZSgmbURldmljZS0+Y29tbW9uKTsKLSAgICAgICAgaWYgKHJjICE9IE9LKQotICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBjbG9zZSBjYW1lcmEgJXM6ICVkIiwgbU5hbWUuc3RyaW5nKCksIHJjKTsKLSAgICB9CiAgICAgaWYgKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpIHsKICAgICAgICAgbUhpZGxEZXZpY2UtPmNsb3NlKCk7CiAgICAgICAgIG1IaWRsRGV2aWNlLmNsZWFyKCk7CkBAIC00MiwxMiArMzcsNiBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6aW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIpIHsKLSAgICBpZiAobURldmljZSkgewotICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSBoYXJkd2FyZSBpbnRlcmZhY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgdG8gbGliaGFyZHdhcmUgcGF0aCEiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KICAgICBBTE9HSSgiT3BlbmluZyBjYW1lcmEgJXMiLCBtTmFtZS5zdHJpbmcoKSk7CiAKICAgICBzdGF0dXNfdCByZXQgPSBtYW5hZ2VyLT5vcGVuU2Vzc2lvbihtTmFtZS5zdHJpbmcoKSwgdGhpcywgJm1IaWRsRGV2aWNlKTsKQEAgLTM5Myw3ICszODIsNyBAQAogICAgICAgICBBTE9HRSgiJXM6IHByZXZpZXcgd2luZG93IGlzIG51bGwiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gczsKICAgICB9Ci0gICAgbVByZXZpZXdVc2FnZSA9IChpbnQpIHVzYWdlOworICAgIG1QcmV2aWV3VXNhZ2UgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4gKHVzYWdlKTsKICAgICBpbnQgcmMgPSBuYXRpdmVfd2luZG93X3NldF91c2FnZShhLCBtUHJldmlld1VzYWdlKTsKICAgICBpZiAocmMgPT0gT0spIHsKICAgICAgICAgY2xlYW51cENpcmN1bGF0aW5nQnVmZmVycygpOwpAQCAtNDY1LDIzICs0NTQsNiBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVCgKICAgICAgICAgICAgICAgICBtSGlkbERldmljZS0+c2V0UHJldmlld1dpbmRvdyhidWYuZ2V0KCkgPyB0aGlzIDogbnVsbHB0cikpOwotICAgIH0gZWxzZSBpZiAobURldmljZSkgewotICAgICAgICBpZiAobURldmljZS0+b3BzLT5zZXRfcHJldmlld193aW5kb3cpIHsKLSAgICAgICAgICAgIG1QcmV2aWV3V2luZG93ID0gYnVmOwotICAgICAgICAgICAgaWYgKGJ1ZiAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1QcmV2aWV3U2NhbGluZ01vZGUgIT0gTk9UX1NFVCkgewotICAgICAgICAgICAgICAgICAgICBzZXRQcmV2aWV3U2NhbGluZ01vZGUobVByZXZpZXdTY2FsaW5nTW9kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtUHJldmlld1RyYW5zZm9ybSAhPSBOT1RfU0VUKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFByZXZpZXdUcmFuc2Zvcm0obVByZXZpZXdUcmFuc2Zvcm0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1IYWxQcmV2aWV3V2luZG93LnVzZXIgPSB0aGlzOwotICAgICAgICAgICAgQUxPR1YoIiVzICZtSGFsUHJldmlld1dpbmRvdyAlcCBtSGFsUHJldmlld1dpbmRvdy51c2VyICVwIixfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgICZtSGFsUHJldmlld1dpbmRvdywgbUhhbFByZXZpZXdXaW5kb3cudXNlcik7Ci0gICAgICAgICAgICByZXR1cm4gbURldmljZS0+b3BzLT5zZXRfcHJldmlld193aW5kb3cobURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgYnVmLmdldCgpID8gJm1IYWxQcmV2aWV3V2luZG93Lm53IDogMCk7Ci0gICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQpAQCAtNDk5LDE1ICs0NzEsNiBAQAogICAgIG1DYlVzZXIgPSB1c2VyOwogCiAgICAgQUxPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOwotCi0gICAgaWYgKG1EZXZpY2UgJiYgbURldmljZS0+b3BzLT5zZXRfY2FsbGJhY2tzKSB7Ci0gICAgICAgIG1EZXZpY2UtPm9wcy0+c2V0X2NhbGxiYWNrcyhtRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNOb3RpZnlDYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzRGF0YUNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNEYXRhQ2JUaW1lc3RhbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0dldE1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKTsKLSAgICB9CiB9CiAKIHZvaWQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OmVuYWJsZU1zZ1R5cGUoaW50MzJfdCBtc2dUeXBlKQpAQCAtNTE1LDggKzQ3OCw2IEBACiAgICAgQUxPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOwogICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKICAgICAgICAgbUhpZGxEZXZpY2UtPmVuYWJsZU1zZ1R5cGUobXNnVHlwZSk7Ci0gICAgfSBlbHNlIGlmIChtRGV2aWNlICYmIG1EZXZpY2UtPm9wcy0+ZW5hYmxlX21zZ190eXBlKSB7Ci0gICAgICAgIG1EZXZpY2UtPm9wcy0+ZW5hYmxlX21zZ190eXBlKG1EZXZpY2UsIG1zZ1R5cGUpOwogICAgIH0KIH0KIApAQCAtNTI1LDggKzQ4Niw2IEBACiAgICAgQUxPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOwogICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKICAgICAgICAgbUhpZGxEZXZpY2UtPmRpc2FibGVNc2dUeXBlKG1zZ1R5cGUpOwotICAgIH0gZWxzZSBpZiAobURldmljZSAmJiBtRGV2aWNlLT5vcHMtPmRpc2FibGVfbXNnX3R5cGUpIHsKLSAgICAgICAgbURldmljZS0+b3BzLT5kaXNhYmxlX21zZ190eXBlKG1EZXZpY2UsIG1zZ1R5cGUpOwogICAgIH0KIH0KIApAQCAtNTM1LDggKzQ5NCw2IEBACiAgICAgQUxPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOwogICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKICAgICAgICAgcmV0dXJuIG1IaWRsRGV2aWNlLT5tc2dUeXBlRW5hYmxlZChtc2dUeXBlKTsKLSAgICB9IGVsc2UgaWYgKG1EZXZpY2UgJiYgbURldmljZS0+b3BzLT5tc2dfdHlwZV9lbmFibGVkKSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlLT5vcHMtPm1zZ190eXBlX2VuYWJsZWQobURldmljZSwgbXNnVHlwZSk7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKIH0KQEAgLTU0Nyw4ICs1MDQsNiBAQAogICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKICAgICAgICAgcmV0dXJuIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bWFwVG9TdGF0dXNUKAogICAgICAgICAgICAgICAgIG1IaWRsRGV2aWNlLT5zdGFydFByZXZpZXcoKSk7Ci0gICAgfSBlbHNlIGlmIChtRGV2aWNlICYmIG1EZXZpY2UtPm9wcy0+c3RhcnRfcHJldmlldykgewotICAgICAgICByZXR1cm4gbURldmljZS0+b3BzLT5zdGFydF9wcmV2aWV3KG1EZXZpY2UpOwogICAgIH0KICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CkBAIC01NTgsOCArNTEzLDYgQEAKICAgICBBTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7CiAgICAgaWYgKENDX0xJS0VMWShtSGlkbERldmljZSAhPSBudWxscHRyKSkgewogICAgICAgICBtSGlkbERldmljZS0+c3RvcFByZXZpZXcoKTsKLSAgICB9IGVsc2UgaWYgKG1EZXZpY2UgJiYgbURldmljZS0+b3BzLT5zdG9wX3ByZXZpZXcpIHsKLSAgICAgICAgbURldmljZS0+b3BzLT5zdG9wX3ByZXZpZXcobURldmljZSk7CiAgICAgfQogfQogCkBAIC01NjgsOCArNTIxLDYgQEAKICAgICBBTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7CiAgICAgaWYgKENDX0xJS0VMWShtSGlkbERldmljZSAhPSBudWxscHRyKSkgewogICAgICAgICByZXR1cm4gbUhpZGxEZXZpY2UtPnByZXZpZXdFbmFibGVkKCk7Ci0gICAgfSBlbHNlIGlmIChtRGV2aWNlICYmIG1EZXZpY2UtPm9wcy0+cHJldmlld19lbmFibGVkKSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlLT5vcHMtPnByZXZpZXdfZW5hYmxlZChtRGV2aWNlKTsKICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogfQpAQCAtNTgwLDggKzUzMSw2IEBACiAgICAgaWYgKENDX0xJS0VMWShtSGlkbERldmljZSAhPSBudWxscHRyKSkgewogICAgICAgICByZXR1cm4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptYXBUb1N0YXR1c1QoCiAgICAgICAgICAgICAgICAgbUhpZGxEZXZpY2UtPnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMoZW5hYmxlKSk7Ci0gICAgfSBlbHNlIGlmIChtRGV2aWNlICYmIG1EZXZpY2UtPm9wcy0+c3RvcmVfbWV0YV9kYXRhX2luX2J1ZmZlcnMpIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2UtPm9wcy0+c3RvcmVfbWV0YV9kYXRhX2luX2J1ZmZlcnMobURldmljZSwgZW5hYmxlKTsKICAgICB9CiAgICAgcmV0dXJuIGVuYWJsZSA/IElOVkFMSURfT1BFUkFUSU9OOiBPSzsKIH0KQEAgLTU5Miw4ICs1NDEsNiBAQAogICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKICAgICAgICAgcmV0dXJuIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bWFwVG9TdGF0dXNUKAogICAgICAgICAgICAgICAgIG1IaWRsRGV2aWNlLT5zdGFydFJlY29yZGluZygpKTsKLSAgICB9IGVsc2UgaWYgKG1EZXZpY2UgJiYgbURldmljZS0+b3BzLT5zdGFydF9yZWNvcmRpbmcpIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2UtPm9wcy0+c3RhcnRfcmVjb3JkaW5nKG1EZXZpY2UpOwogICAgIH0KICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CkBAIC02MDYsOCArNTUzLDYgQEAKICAgICBBTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7CiAgICAgaWYgKENDX0xJS0VMWShtSGlkbERldmljZSAhPSBudWxscHRyKSkgewogICAgICAgICBtSGlkbERldmljZS0+c3RvcFJlY29yZGluZygpOwotICAgIH0gZWxzZSBpZiAobURldmljZSAmJiBtRGV2aWNlLT5vcHMtPnN0b3BfcmVjb3JkaW5nKSB7Ci0gICAgICAgIG1EZXZpY2UtPm9wcy0+c3RvcF9yZWNvcmRpbmcobURldmljZSk7CiAgICAgfQogfQogCkBAIC02MTksOCArNTY0LDYgQEAKICAgICBBTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7CiAgICAgaWYgKENDX0xJS0VMWShtSGlkbERldmljZSAhPSBudWxscHRyKSkgewogICAgICAgICByZXR1cm4gbUhpZGxEZXZpY2UtPnJlY29yZGluZ0VuYWJsZWQoKTsKLSAgICB9IGVsc2UgaWYgKG1EZXZpY2UgJiYgbURldmljZS0+b3BzLT5yZWNvcmRpbmdfZW5hYmxlZCkgewotICAgICAgICByZXR1cm4gbURldmljZS0+b3BzLT5yZWNvcmRpbmdfZW5hYmxlZChtRGV2aWNlKTsKICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogfQpAQCAtNjQ1LDkgKzU4OCw2IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtSGlkbERldmljZS0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGhlYXBJZCwgYnVmZmVySW5kZXgpOwogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtRGV2aWNlICYmIG1EZXZpY2UtPm9wcy0+cmVsZWFzZV9yZWNvcmRpbmdfZnJhbWUpIHsKLSAgICAgICAgdm9pZCAqZGF0YSA9ICgodWludDhfdCAqKWhlYXAtPmJhc2UoKSkgKyBvZmZzZXQ7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlLT5vcHMtPnJlbGVhc2VfcmVjb3JkaW5nX2ZyYW1lKG1EZXZpY2UsIGRhdGEpOwogICAgIH0KIH0KIApAQCAtNjc0LDkgKzYxNCw2IEBACiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzIG9ubHkgc3VwcG9ydHMgVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSBtb2RlIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiTm9uIEhJREwgbW9kZSBkbyBub3Qgc3VwcG9ydCAlcyIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTY5NSw4ICs2MzIsNiBAQAogICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKICAgICAgICAgcmV0dXJuIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bWFwVG9TdGF0dXNUKAogICAgICAgICAgICAgICAgIG1IaWRsRGV2aWNlLT5hdXRvRm9jdXMoKSk7Ci0gICAgfSBlbHNlIGlmIChtRGV2aWNlICYmIG1EZXZpY2UtPm9wcy0+YXV0b19mb2N1cykgewotICAgICAgICByZXR1cm4gbURldmljZS0+b3BzLT5hdXRvX2ZvY3VzKG1EZXZpY2UpOwogICAgIH0KICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CkBAIC03MDcsOCArNjQyLDYgQEAKICAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7CiAgICAgICAgIHJldHVybiBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVCgKICAgICAgICAgICAgICAgICBtSGlkbERldmljZS0+Y2FuY2VsQXV0b0ZvY3VzKCkpOwotICAgIH0gZWxzZSBpZiAobURldmljZSAmJiBtRGV2aWNlLT5vcHMtPmNhbmNlbF9hdXRvX2ZvY3VzKSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlLT5vcHMtPmNhbmNlbF9hdXRvX2ZvY3VzKG1EZXZpY2UpOwogICAgIH0KICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CkBAIC03MTksOCArNjUyLDYgQEAKICAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7CiAgICAgICAgIHJldHVybiBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVCgKICAgICAgICAgICAgICAgICBtSGlkbERldmljZS0+dGFrZVBpY3R1cmUoKSk7Ci0gICAgfSBlbHNlIGlmIChtRGV2aWNlICYmIG1EZXZpY2UtPm9wcy0+dGFrZV9waWN0dXJlKSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlLT5vcHMtPnRha2VfcGljdHVyZShtRGV2aWNlKTsKICAgICB9CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQpAQCAtNzMxLDggKzY2Miw2IEBACiAgICAgaWYgKENDX0xJS0VMWShtSGlkbERldmljZSAhPSBudWxscHRyKSkgewogICAgICAgICByZXR1cm4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptYXBUb1N0YXR1c1QoCiAgICAgICAgICAgICAgICAgbUhpZGxEZXZpY2UtPmNhbmNlbFBpY3R1cmUoKSk7Ci0gICAgfSBlbHNlIGlmIChtRGV2aWNlICYmIG1EZXZpY2UtPm9wcy0+Y2FuY2VsX3BpY3R1cmUpIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2UtPm9wcy0+Y2FuY2VsX3BpY3R1cmUobURldmljZSk7CiAgICAgfQogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KQEAgLTc0Myw4ICs2NzIsNiBAQAogICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKICAgICAgICAgcmV0dXJuIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bWFwVG9TdGF0dXNUKAogICAgICAgICAgICAgICAgIG1IaWRsRGV2aWNlLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcy5mbGF0dGVuKCkuc3RyaW5nKCkpKTsKLSAgICB9IGVsc2UgaWYgKG1EZXZpY2UgJiYgbURldmljZS0+b3BzLT5zZXRfcGFyYW1ldGVycykgewotICAgICAgICByZXR1cm4gbURldmljZS0+b3BzLT5zZXRfcGFyYW1ldGVycyhtRGV2aWNlLCBwYXJhbXMuZmxhdHRlbigpLnN0cmluZygpKTsKICAgICB9CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQpAQCAtNzYxLDE0ICs2ODgsNiBAQAogICAgICAgICAgICAgICAgIH0pOwogICAgICAgICBTdHJpbmc4IHRtcChvdXRQYXJhbS5jX3N0cigpKTsKICAgICAgICAgcGFybXMudW5mbGF0dGVuKHRtcCk7Ci0gICAgfSBlbHNlIGlmIChtRGV2aWNlICYmIG1EZXZpY2UtPm9wcy0+Z2V0X3BhcmFtZXRlcnMpIHsKLSAgICAgICAgY2hhciAqdGVtcCA9IG1EZXZpY2UtPm9wcy0+Z2V0X3BhcmFtZXRlcnMobURldmljZSk7Ci0gICAgICAgIFN0cmluZzggc3RyX3Bhcm1zKHRlbXApOwotICAgICAgICBpZiAobURldmljZS0+b3BzLT5wdXRfcGFyYW1ldGVycykKLSAgICAgICAgICAgIG1EZXZpY2UtPm9wcy0+cHV0X3BhcmFtZXRlcnMobURldmljZSwgdGVtcCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZyZWUodGVtcCk7Ci0gICAgICAgIHBhcm1zLnVuZmxhdHRlbihzdHJfcGFybXMpOwogICAgIH0KICAgICByZXR1cm4gcGFybXM7CiB9CkBAIC03NzksOCArNjk4LDYgQEAKICAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7CiAgICAgICAgIHJldHVybiBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVCgKICAgICAgICAgICAgICAgICBtSGlkbERldmljZS0+c2VuZENvbW1hbmQoKENvbW1hbmRUeXBlKSBjbWQsIGFyZzEsIGFyZzIpKTsKLSAgICB9IGVsc2UgaWYgKG1EZXZpY2UgJiYgbURldmljZS0+b3BzLT5zZW5kX2NvbW1hbmQpIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2UtPm9wcy0+c2VuZF9jb21tYW5kKG1EZXZpY2UsIGNtZCwgYXJnMSwgYXJnMik7CiAgICAgfQogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KQEAgLTc5NCw4ICs3MTEsNiBAQAogICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKICAgICAgICAgbUhpZGxEZXZpY2UtPmNsb3NlKCk7CiAgICAgICAgIG1IaWRsRGV2aWNlLmNsZWFyKCk7Ci0gICAgfSBlbHNlIGlmIChtRGV2aWNlICYmIG1EZXZpY2UtPm9wcy0+cmVsZWFzZSkgewotICAgICAgICBtRGV2aWNlLT5vcHMtPnJlbGVhc2UobURldmljZSk7CiAgICAgfQogfQogCkBAIC04MTEsMTUgKzcyNiwxMCBAQAogICAgICAgICBTdGF0dXMgcyA9IG1IaWRsRGV2aWNlLT5kdW1wU3RhdGUoaGFuZGxlKTsKICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGFuZGxlKTsKICAgICAgICAgcmV0dXJuIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bWFwVG9TdGF0dXNUKHMpOwotICAgIH0gZWxzZSBpZiAobURldmljZSAmJiBtRGV2aWNlLT5vcHMtPmR1bXApIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2UtPm9wcy0+ZHVtcChtRGV2aWNlLCBmZCk7CiAgICAgfQogICAgIHJldHVybiBPSzsgLy8gSXQncyBmaW5lIGlmIHRoZSBIQUwgZG9lc24ndCBpbXBsZW1lbnQgZHVtcCgpCiB9CiAKLS8qKgotICogTWV0aG9kcyBmb3IgbGVnYWN5IChub24tSElETCkgcGF0aCBmb2xsb3dzCi0gKi8KIHZvaWQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnNOb3RpZnlDYihpbnQzMl90IG1zZ190eXBlLCBpbnQzMl90IGV4dDEsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGV4dDIsIHZvaWQgKnVzZXIpCiB7CkBAIC04ODksMTc3ICs3OTksNCBAQAogICAgIG1lbS0+ZGVjU3Ryb25nKG1lbSk7CiB9CiAKLUFOYXRpdmVXaW5kb3cqIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpzVG9Bbncodm9pZCAqdXNlcikKLXsKLSAgICBDYW1lcmFIYXJkd2FyZUludGVyZmFjZSAqb2JqZWN0ID0KLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgKj4odXNlcik7Ci0gICAgcmV0dXJuIG9iamVjdC0+bVByZXZpZXdXaW5kb3cuZ2V0KCk7Ci19Ci0jZGVmaW5lIGFudyhuKSBzVG9BbncoKChzdHJ1Y3QgY2FtZXJhX3ByZXZpZXdfd2luZG93ICopKG4pKS0+dXNlcikKLSNkZWZpbmUgaHdpKG4pIHJlaW50ZXJwcmV0X2Nhc3Q8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgKj4oXAotICAgICgoc3RydWN0IGNhbWVyYV9wcmV2aWV3X3dpbmRvdyAqKShuKSktPnVzZXIpCi0KLWludCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c0RlcXVldWVCdWZmZXIoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyogdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QqKiBidWZmZXIsIGludCAqc3RyaWRlKQotewotICAgIGludCByYzsKLSAgICBBTmF0aXZlV2luZG93ICphID0gYW53KHcpOwotICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYjsKLSAgICByYyA9IG5hdGl2ZV93aW5kb3dfZGVxdWV1ZV9idWZmZXJfYW5kX3dhaXQoYSwgJmFuYik7Ci0gICAgaWYgKHJjID09IE9LKSB7Ci0gICAgICAgICpidWZmZXIgPSAmYW5iLT5oYW5kbGU7Ci0gICAgICAgICpzdHJpZGUgPSBhbmItPnN0cmlkZTsKLSAgICB9Ci0gICAgcmV0dXJuIHJjOwotfQotCi0jaWZuZGVmIGNvbnRhaW5lcl9vZgotI2RlZmluZSBjb250YWluZXJfb2YocHRyLCB0eXBlLCBtZW1iZXIpICh7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb25zdCBfX3R5cGVvZl9fKCgodHlwZSAqKSAwKS0+bWVtYmVyKSAqX19tcHRyID0gKHB0cik7ICAgICBcCi0gICAgKHR5cGUgKikgKChjaGFyICopIF9fbXB0ciAtIChjaGFyICopKCYoKHR5cGUgKikwKS0+bWVtYmVyKSk7IH0pCi0jZW5kaWYKLQotaW50IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpzTG9ja0J1ZmZlcihzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzKiB3LAotICAgICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90KiAvKmJ1ZmZlciovKQotewotICAgIEFOYXRpdmVXaW5kb3cgKmEgPSBhbncodyk7Ci0gICAgKHZvaWQpYTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpzRW5xdWV1ZUJ1ZmZlcihzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzKiB3LAotICAgICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90KiBidWZmZXIpCi17Ci0gICAgQU5hdGl2ZVdpbmRvdyAqYSA9IGFudyh3KTsKLSAgICByZXR1cm4gYS0+cXVldWVCdWZmZXIoYSwKLSAgICAgICAgICAgICAgY29udGFpbmVyX29mKGJ1ZmZlciwgQU5hdGl2ZVdpbmRvd0J1ZmZlciwgaGFuZGxlKSwgLTEpOwotfQotCi1pbnQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnNDYW5jZWxCdWZmZXIoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyogdywKLSAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCogYnVmZmVyKQotewotICAgIEFOYXRpdmVXaW5kb3cgKmEgPSBhbncodyk7Ci0gICAgcmV0dXJuIGEtPmNhbmNlbEJ1ZmZlcihhLAotICAgICAgICAgICAgICBjb250YWluZXJfb2YoYnVmZmVyLCBBTmF0aXZlV2luZG93QnVmZmVyLCBoYW5kbGUpLCAtMSk7Ci19Ci0KLWludCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c1NldEJ1ZmZlckNvdW50KHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMqIHcsIGludCBjb3VudCkKLXsKLSAgICBBTmF0aXZlV2luZG93ICphID0gYW53KHcpOwotCi0gICAgaWYgKGEgIT0gbnVsbHB0cikgewotICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBiLzI3MDM5Nzc1Ci0gICAgICAgIC8vIFByZXZpb3VzbHksIHNldHRpbmcgdGhlIGJ1ZmZlciBjb3VudCB3b3VsZCByZXNldCB0aGUgYnVmZmVyCi0gICAgICAgIC8vIHF1ZXVlJ3MgZmxhZyB0aGF0IGFsbG93cyBmb3IgYWxsIGJ1ZmZlcnMgdG8gYmUgZGVxdWV1ZWQgb24gdGhlCi0gICAgICAgIC8vIHByb2R1Y2VyIHNpZGUsIGluc3RlYWQgb2YganVzdCB0aGUgcHJvZHVjZXIncyBkZWNsYXJlZCBtYXggY291bnQsCi0gICAgICAgIC8vIGlmIG5vIGZpbGxlZCBidWZmZXJzIGhhdmUgeWV0IGJlZW4gcXVldWVkIGJ5IHRoZSBwcm9kdWNlci4gIFRoaXMKLSAgICAgICAgLy8gcmVzZXQgbm8gbG9uZ2VyIGhhcHBlbnMsIGJ1dCBzb21lIEhBTHMgZGVwZW5kIG9uIHRoaXMgYmVoYXZpb3IsCi0gICAgICAgIC8vIHNvIGl0IG5lZWRzIHRvIGJlIG1haW50YWluZWQgZm9yIEhBTCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KLSAgICAgICAgLy8gU2ltdWxhdGUgdGhlIHByaW9yIGJlaGF2aW9yIGJ5IGRpc2Nvbm5lY3RpbmcvcmVjb25uZWN0aW5nIHRvIHRoZQotICAgICAgICAvLyB3aW5kb3cgYW5kIHNldHRpbmcgdGhlIHZhbHVlcyBhZ2Fpbi4gIFRoaXMgaGFzIHRoZSBkcmF3YmFjayBvZgotICAgICAgICAvLyBhY3R1YWxseSBjYXVzaW5nIG1lbW9yeSByZWFsbG9jYXRpb24sIHdoaWNoIG1heSBub3QgaGF2ZSBoYXBwZW5lZAotICAgICAgICAvLyBpbiB0aGUgcGFzdC4KLSAgICAgICAgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgKmh3ID0gaHdpKHcpOwotICAgICAgICBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KGEsIE5BVElWRV9XSU5ET1dfQVBJX0NBTUVSQSk7Ci0gICAgICAgIG5hdGl2ZV93aW5kb3dfYXBpX2Nvbm5lY3QoYSwgTkFUSVZFX1dJTkRPV19BUElfQ0FNRVJBKTsKLSAgICAgICAgaWYgKGh3LT5tUHJldmlld1NjYWxpbmdNb2RlICE9IE5PVF9TRVQpIHsKLSAgICAgICAgICAgIG5hdGl2ZV93aW5kb3dfc2V0X3NjYWxpbmdfbW9kZShhLCBody0+bVByZXZpZXdTY2FsaW5nTW9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGh3LT5tUHJldmlld1RyYW5zZm9ybSAhPSBOT1RfU0VUKSB7Ci0gICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RyYW5zZm9ybShhLCBody0+bVByZXZpZXdUcmFuc2Zvcm0pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChody0+bVByZXZpZXdXaWR0aCAhPSBOT1RfU0VUKSB7Ci0gICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RpbWVuc2lvbnMoYSwKLSAgICAgICAgICAgICAgICAgICAgaHctPm1QcmV2aWV3V2lkdGgsIGh3LT5tUHJldmlld0hlaWdodCk7Ci0gICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2Zvcm1hdChhLCBody0+bVByZXZpZXdGb3JtYXQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChody0+bVByZXZpZXdVc2FnZSAhPSAwKSB7Ci0gICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF91c2FnZShhLCBody0+bVByZXZpZXdVc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGh3LT5tUHJldmlld1N3YXBJbnRlcnZhbCAhPSBOT1RfU0VUKSB7Ci0gICAgICAgICAgICBhLT5zZXRTd2FwSW50ZXJ2YWwoYSwgaHctPm1QcmV2aWV3U3dhcEludGVydmFsKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaHctPm1QcmV2aWV3Q3JvcC5sZWZ0ICE9IE5PVF9TRVQpIHsKLSAgICAgICAgICAgIG5hdGl2ZV93aW5kb3dfc2V0X2Nyb3AoYSwgJihody0+bVByZXZpZXdDcm9wKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KGEsIGNvdW50KTsKLX0KLQotaW50IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpzU2V0QnVmZmVyc0dlb21ldHJ5KHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMqIHcsCi0gICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQpCi17Ci0gICAgaW50IHJjOwotICAgIEFOYXRpdmVXaW5kb3cgKmEgPSBhbncodyk7Ci0gICAgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgKmh3ID0gaHdpKHcpOwotICAgIGh3LT5tUHJldmlld1dpZHRoID0gd2lkdGg7Ci0gICAgaHctPm1QcmV2aWV3SGVpZ2h0ID0gaGVpZ2h0OwotICAgIGh3LT5tUHJldmlld0Zvcm1hdCA9IGZvcm1hdDsKLSAgICByYyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGltZW5zaW9ucyhhLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBpZiAocmMgPT0gT0spIHsKLSAgICAgICAgcmMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2Zvcm1hdChhLCBmb3JtYXQpOwotICAgIH0KLSAgICByZXR1cm4gcmM7Ci19Ci0KLWludCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c1NldENyb3Aoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyAqdywKLSAgICAgICAgICAgICAgICAgIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pCi17Ci0gICAgQU5hdGl2ZVdpbmRvdyAqYSA9IGFudyh3KTsKLSAgICBDYW1lcmFIYXJkd2FyZUludGVyZmFjZSAqaHcgPSBod2kodyk7Ci0gICAgaHctPm1QcmV2aWV3Q3JvcC5sZWZ0ID0gbGVmdDsKLSAgICBody0+bVByZXZpZXdDcm9wLnRvcCA9IHRvcDsKLSAgICBody0+bVByZXZpZXdDcm9wLnJpZ2h0ID0gcmlnaHQ7Ci0gICAgaHctPm1QcmV2aWV3Q3JvcC5ib3R0b20gPSBib3R0b207Ci0gICAgcmV0dXJuIG5hdGl2ZV93aW5kb3dfc2V0X2Nyb3AoYSwgJihody0+bVByZXZpZXdDcm9wKSk7Ci19Ci0KLWludCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c1NldFRpbWVzdGFtcChzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzICp3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXApIHsKLSAgICBBTmF0aXZlV2luZG93ICphID0gYW53KHcpOwotICAgIHJldHVybiBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RpbWVzdGFtcChhLCB0aW1lc3RhbXApOwotfQotCi1pbnQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnNTZXRVc2FnZShzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzKiB3LCBpbnQgdXNhZ2UpCi17Ci0gICAgQU5hdGl2ZVdpbmRvdyAqYSA9IGFudyh3KTsKLSAgICBDYW1lcmFIYXJkd2FyZUludGVyZmFjZSAqaHcgPSBod2kodyk7Ci0gICAgaHctPm1QcmV2aWV3VXNhZ2UgPSB1c2FnZTsKLSAgICByZXR1cm4gbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UoYSwgdXNhZ2UpOwotfQotCi1pbnQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnNTZXRTd2FwSW50ZXJ2YWwoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyAqdywgaW50IGludGVydmFsKQotewotICAgIEFOYXRpdmVXaW5kb3cgKmEgPSBhbncodyk7Ci0gICAgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgKmh3ID0gaHdpKHcpOwotICAgIGh3LT5tUHJldmlld1N3YXBJbnRlcnZhbCA9IGludGVydmFsOwotICAgIHJldHVybiBhLT5zZXRTd2FwSW50ZXJ2YWwoYSwgaW50ZXJ2YWwpOwotfQotCi1pbnQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnNHZXRNaW5VbmRlcXVldWVkQnVmZmVyQ291bnQoCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzICp3LAotICAgICAgICAgICAgICAgICAgaW50ICpjb3VudCkKLXsKLSAgICBBTmF0aXZlV2luZG93ICphID0gYW53KHcpOwotICAgIHJldHVybiBhLT5xdWVyeShhLCBOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMsIGNvdW50KTsKLX0KLQotdm9pZCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6aW5pdEhhbFByZXZpZXdXaW5kb3coKQotewotICAgIG1IYWxQcmV2aWV3V2luZG93Lm53LmNhbmNlbF9idWZmZXIgPSBzQ2FuY2VsQnVmZmVyOwotICAgIG1IYWxQcmV2aWV3V2luZG93Lm53LmxvY2tfYnVmZmVyID0gc0xvY2tCdWZmZXI7Ci0gICAgbUhhbFByZXZpZXdXaW5kb3cubncuZGVxdWV1ZV9idWZmZXIgPSBzRGVxdWV1ZUJ1ZmZlcjsKLSAgICBtSGFsUHJldmlld1dpbmRvdy5udy5lbnF1ZXVlX2J1ZmZlciA9IHNFbnF1ZXVlQnVmZmVyOwotICAgIG1IYWxQcmV2aWV3V2luZG93Lm53LnNldF9idWZmZXJfY291bnQgPSBzU2V0QnVmZmVyQ291bnQ7Ci0gICAgbUhhbFByZXZpZXdXaW5kb3cubncuc2V0X2J1ZmZlcnNfZ2VvbWV0cnkgPSBzU2V0QnVmZmVyc0dlb21ldHJ5OwotICAgIG1IYWxQcmV2aWV3V2luZG93Lm53LnNldF9jcm9wID0gc1NldENyb3A7Ci0gICAgbUhhbFByZXZpZXdXaW5kb3cubncuc2V0X3RpbWVzdGFtcCA9IHNTZXRUaW1lc3RhbXA7Ci0gICAgbUhhbFByZXZpZXdXaW5kb3cubncuc2V0X3VzYWdlID0gc1NldFVzYWdlOwotICAgIG1IYWxQcmV2aWV3V2luZG93Lm53LnNldF9zd2FwX2ludGVydmFsID0gc1NldFN3YXBJbnRlcnZhbDsKLQotICAgIG1IYWxQcmV2aWV3V2luZG93Lm53LmdldF9taW5fdW5kZXF1ZXVlZF9idWZmZXJfY291bnQgPQotICAgICAgICAgICAgc0dldE1pblVuZGVxdWV1ZWRCdWZmZXJDb3VudDsKLX0KLQogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaAppbmRleCAyZjFlMmU5Li5lNTE5YjA0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oCkBAIC05MCw3ICs5MCw2IEBACiAKIHB1YmxpYzoKICAgICBleHBsaWNpdCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZShjb25zdCBjaGFyICpuYW1lKToKLSAgICAgICAgICAgIG1EZXZpY2UobnVsbHB0ciksCiAgICAgICAgICAgICBtSGlkbERldmljZShudWxscHRyKSwKICAgICAgICAgICAgIG1OYW1lKG5hbWUpLAogICAgICAgICAgICAgbVByZXZpZXdTY2FsaW5nTW9kZShOT1RfU0VUKSwKQEAgLTI5OSw3ICsyOTgsNiBAQAogICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiAvKmFyZ3MqLykgY29uc3Q7CiAKIHByaXZhdGU6Ci0gICAgY2FtZXJhX2RldmljZV90ICptRGV2aWNlOwogICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZT4gbUhpZGxEZXZpY2U7CiAgICAgU3RyaW5nOCBtTmFtZTsKIApAQCAtMzY5LDQxICszNjcsNiBAQAogCiAgICAgc3RhdGljIHZvaWQgc1B1dE1lbW9yeShjYW1lcmFfbWVtb3J5X3QgKmRhdGEpOwogCi0gICAgc3RhdGljIEFOYXRpdmVXaW5kb3cgKnNUb0Fudyh2b2lkICp1c2VyKTsKLQotICAgIHN0YXRpYyBpbnQgc0RlcXVldWVCdWZmZXIoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyogdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90KiogYnVmZmVyLCBpbnQgKnN0cmlkZSk7Ci0KLSAgICBzdGF0aWMgaW50IHNMb2NrQnVmZmVyKHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMqIHcsCi0gICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90KiAvKmJ1ZmZlciovKTsKLQotICAgIHN0YXRpYyBpbnQgc0VucXVldWVCdWZmZXIoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyogdywKLSAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QqIGJ1ZmZlcik7Ci0KLSAgICBzdGF0aWMgaW50IHNDYW5jZWxCdWZmZXIoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyogdywKLSAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QqIGJ1ZmZlcik7Ci0KLSAgICBzdGF0aWMgaW50IHNTZXRCdWZmZXJDb3VudChzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzKiB3LCBpbnQgY291bnQpOwotCi0gICAgc3RhdGljIGludCBzU2V0QnVmZmVyc0dlb21ldHJ5KHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMqIHcsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0KTsKLQotICAgIHN0YXRpYyBpbnQgc1NldENyb3Aoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyAqdywKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKTsKLQotICAgIHN0YXRpYyBpbnQgc1NldFRpbWVzdGFtcChzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzICp3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wKTsKLQotICAgIHN0YXRpYyBpbnQgc1NldFVzYWdlKHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMqIHcsIGludCB1c2FnZSk7Ci0KLSAgICBzdGF0aWMgaW50IHNTZXRTd2FwSW50ZXJ2YWwoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyAqdywgaW50IGludGVydmFsKTsKLQotICAgIHN0YXRpYyBpbnQgc0dldE1pblVuZGVxdWV1ZWRCdWZmZXJDb3VudCgKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzICp3LAotICAgICAgICAgICAgICAgICAgICAgIGludCAqY291bnQpOwotCi0gICAgdm9pZCBpbml0SGFsUHJldmlld1dpbmRvdygpOwotCiAgICAgc3RkOjpwYWlyPGJvb2wsIHVpbnQ2NF90PiBnZXRCdWZmZXJJZChBTmF0aXZlV2luZG93QnVmZmVyKiBhbmIpOwogICAgIHZvaWQgY2xlYW51cENpcmN1bGF0aW5nQnVmZmVycygpOwogCkBAIC00NTksMTMgKzQyMiw2IEBACiAKICAgICBzcDxBTmF0aXZlV2luZG93PiAgICAgICAgbVByZXZpZXdXaW5kb3c7CiAKLSAgICBzdHJ1Y3QgY2FtZXJhX3ByZXZpZXdfd2luZG93IHsKLSAgICAgICAgc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyBudzsKLSAgICAgICAgdm9pZCAqdXNlcjsKLSAgICB9OwotCi0gICAgc3RydWN0IGNhbWVyYV9wcmV2aWV3X3dpbmRvdyBtSGFsUHJldmlld1dpbmRvdzsKLQogICAgIG5vdGlmeV9jYWxsYmFjayAgICAgICAgICAgICAgIG1Ob3RpZnlDYjsKICAgICBkYXRhX2NhbGxiYWNrICAgICAgICAgICAgICAgICBtRGF0YUNiOwogICAgIGRhdGFfY2FsbGJhY2tfdGltZXN0YW1wICAgICAgIG1EYXRhQ2JUaW1lc3RhbXA7CkBAIC00NzksNyArNDM1LDcgQEAKICAgICBpbnQgbVByZXZpZXdXaWR0aDsKICAgICBpbnQgbVByZXZpZXdIZWlnaHQ7CiAgICAgaW50IG1QcmV2aWV3Rm9ybWF0OwotICAgIGludCBtUHJldmlld1VzYWdlOworICAgIHVpbnQ2NF90IG1QcmV2aWV3VXNhZ2U7CiAgICAgaW50IG1QcmV2aWV3U3dhcEludGVydmFsOwogICAgIGFuZHJvaWRfbmF0aXZlX3JlY3RfdCBtUHJldmlld0Nyb3A7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCmluZGV4IDY5YjFkN2QuLmNlZDFkM2EgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcApAQCAtMTU0LDYgKzE1NCwxNSBAQAogICAgICAgICAgICAgICAgIHJlc3VsdFF1ZXVlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CiAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKICAgICB9CisgICAgSUZfQUxPR1YoKSB7CisgICAgICAgIHNlc3Npb24tPmludGVyZmFjZUNoYWluKFtdKAorICAgICAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8OjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc+IGludGVyZmFjZUNoYWluKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlNlc3Npb24gaW50ZXJmYWNlIGNoYWluOiIpOworICAgICAgICAgICAgICAgIGZvciAoYXV0byBpZmFjZSA6IGludGVyZmFjZUNoYWluKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIgICVzIiwgaWZhY2UuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgfQogCiAgICAgbUludGVyZmFjZSA9IG5ldyBIYWxJbnRlcmZhY2Uoc2Vzc2lvbiwgcXVldWUpOwogICAgIHN0ZDo6c3RyaW5nIHByb3ZpZGVyVHlwZTsKQEAgLTQwNyw3ICs0MTYsNyBAQAogfQogCiBCdWZmZXJVc2FnZUZsYWdzIENhbWVyYTNEZXZpY2U6Om1hcFRvQ29uc3VtZXJVc2FnZSgKLSAgICAgICAgdWludDMyX3QgdXNhZ2UpIHsKKyAgICAgICAgdWludDY0X3QgdXNhZ2UpIHsKICAgICByZXR1cm4gdXNhZ2U7CiB9CiAKQEAgLTQ2MCwxMiArNDY5LDE3IEBACiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihwaXhlbEZvcm1hdCk7CiB9CiAKLXVpbnQzMl90IENhbWVyYTNEZXZpY2U6Om1hcENvbnN1bWVyVG9GcmFtZXdvcmtVc2FnZSgKK2FuZHJvaWRfZGF0YXNwYWNlIENhbWVyYTNEZXZpY2U6Om1hcFRvRnJhbWV3b3JrRGF0YXNwYWNlKAorICAgICAgICBEYXRhc3BhY2VGbGFncyBkYXRhU3BhY2UpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YW5kcm9pZF9kYXRhc3BhY2U+KGRhdGFTcGFjZSk7Cit9CisKK3VpbnQ2NF90IENhbWVyYTNEZXZpY2U6Om1hcENvbnN1bWVyVG9GcmFtZXdvcmtVc2FnZSgKICAgICAgICAgQnVmZmVyVXNhZ2VGbGFncyB1c2FnZSkgewogICAgIHJldHVybiB1c2FnZTsKIH0KIAotdWludDMyX3QgQ2FtZXJhM0RldmljZTo6bWFwUHJvZHVjZXJUb0ZyYW1ld29ya1VzYWdlKAordWludDY0X3QgQ2FtZXJhM0RldmljZTo6bWFwUHJvZHVjZXJUb0ZyYW1ld29ya1VzYWdlKAogICAgICAgICBCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKSB7CiAgICAgcmV0dXJuIHVzYWdlOwogfQpAQCAtMTIwOCw3ICsxMjIyLDcgQEAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OmNyZWF0ZVN0cmVhbShzcDxTdXJmYWNlPiBjb25zdW1lciwKICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCiAgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsCi0gICAgICAgICAgICBpbnQgc3RyZWFtU2V0SWQsIGJvb2wgaXNTaGFyZWQsIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2UpIHsKKyAgICAgICAgICAgIGludCBzdHJlYW1TZXRJZCwgYm9vbCBpc1NoYXJlZCwgdWludDY0X3QgY29uc3VtZXJVc2FnZSkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKICAgICBpZiAoY29uc3VtZXIgPT0gbnVsbHB0cikgewpAQCAtMTIyNiwxMyArMTI0MCwxMyBAQAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y3JlYXRlU3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzLAogICAgICAgICBib29sIGhhc0RlZmVycmVkQ29uc3VtZXIsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCiAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwKLSAgICAgICAgaW50IHN0cmVhbVNldElkLCBib29sIGlzU2hhcmVkLCB1aW50MzJfdCBjb25zdW1lclVzYWdlKSB7CisgICAgICAgIGludCBzdHJlYW1TZXRJZCwgYm9vbCBpc1NoYXJlZCwgdWludDY0X3QgY29uc3VtZXJVc2FnZSkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBuc2Vjc190IG1heEV4cGVjdGVkRHVyYXRpb24gPSBnZXRFeHBlY3RlZEluRmxpZ2h0RHVyYXRpb24oKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgQUxPR1YoIkNhbWVyYSAlczogQ3JlYXRpbmcgbmV3IHN0cmVhbSAlZDogJWQgeCAlZCwgZm9ybWF0ICVkLCBkYXRhc3BhY2UgJWQgcm90YXRpb24gJWQiCi0gICAgICAgICAgICAiIGNvbnN1bWVyIHVzYWdlIDB4JXgsIGlzU2hhcmVkICVkIiwgbUlkLnN0cmluZygpLCBtTmV4dFN0cmVhbUlkLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsCisgICAgICAgICAgICAiIGNvbnN1bWVyIHVzYWdlICUiIFBSSXU2NCAiLCBpc1NoYXJlZCAlZCIsIG1JZC5zdHJpbmcoKSwgbU5leHRTdHJlYW1JZCwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LAogICAgICAgICAgICAgZGF0YVNwYWNlLCByb3RhdGlvbiwgY29uc3VtZXJVc2FnZSwgaXNTaGFyZWQpOwogCiAgICAgc3RhdHVzX3QgcmVzOwpAQCAtMTM0NSwxMCArMTM1OSwxMSBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Z2V0U3RyZWFtSW5mbyhpbnQgaWQsCi0gICAgICAgIHVpbnQzMl90ICp3aWR0aCwgdWludDMyX3QgKmhlaWdodCwKLSAgICAgICAgdWludDMyX3QgKmZvcm1hdCwgYW5kcm9pZF9kYXRhc3BhY2UgKmRhdGFTcGFjZSkgeworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Z2V0U3RyZWFtSW5mbyhpbnQgaWQsIFN0cmVhbUluZm8gKnN0cmVhbUluZm8pIHsKICAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChudWxscHRyID09IHN0cmVhbUluZm8pIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKQEAgLTEzNzUsMTAgKzEzOTAsMTQgQEAKICAgICAgICAgcmV0dXJuIGlkeDsKICAgICB9CiAKLSAgICBpZiAod2lkdGgpICp3aWR0aCAgPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5nZXRXaWR0aCgpOwotICAgIGlmIChoZWlnaHQpICpoZWlnaHQgPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5nZXRIZWlnaHQoKTsKLSAgICBpZiAoZm9ybWF0KSAqZm9ybWF0ID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0Rm9ybWF0KCk7Ci0gICAgaWYgKGRhdGFTcGFjZSkgKmRhdGFTcGFjZSA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmdldERhdGFTcGFjZSgpOworICAgIHN0cmVhbUluZm8tPndpZHRoICA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmdldFdpZHRoKCk7CisgICAgc3RyZWFtSW5mby0+aGVpZ2h0ID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0SGVpZ2h0KCk7CisgICAgc3RyZWFtSW5mby0+Zm9ybWF0ID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0Rm9ybWF0KCk7CisgICAgc3RyZWFtSW5mby0+ZGF0YVNwYWNlID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0RGF0YVNwYWNlKCk7CisgICAgc3RyZWFtSW5mby0+Zm9ybWF0T3ZlcnJpZGRlbiA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmlzRm9ybWF0T3ZlcnJpZGRlbigpOworICAgIHN0cmVhbUluZm8tPm9yaWdpbmFsRm9ybWF0ID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0T3JpZ2luYWxGb3JtYXQoKTsKKyAgICBzdHJlYW1JbmZvLT5kYXRhU3BhY2VPdmVycmlkZGVuID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+aXNEYXRhU3BhY2VPdmVycmlkZGVuKCk7CisgICAgc3RyZWFtSW5mby0+b3JpZ2luYWxEYXRhU3BhY2UgPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5nZXRPcmlnaW5hbERhdGFTcGFjZSgpOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMTQ3OCw2ICsxNDk3LDcgQEAKIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Z2V0SW5wdXRCdWZmZXJQcm9kdWNlcigKICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKnByb2R1Y2VyKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIApAQCAtMTY5MSw2ICsxNzExLDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6d2FpdEZvck5leHRGcmFtZShuc2Vjc190IHRpbWVvdXQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN0YXR1c190IHJlczsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtT3V0cHV0TG9jayk7CiAKQEAgLTE4ODQsNiArMTkwNSw3IEBACiAgKi8KIAogdm9pZCBDYW1lcmEzRGV2aWNlOjpub3RpZnlTdGF0dXMoYm9vbCBpZGxlKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICB7CiAgICAgICAgIC8vIE5lZWQgbUxvY2sgdG8gc2FmZWx5IHVwZGF0ZSBzdGF0ZSBhbmQgc3luY2hyb25pemUgdG8gY3VycmVudAogICAgICAgICAvLyBzdGF0ZSBvZiBtZXRob2RzIGluIGZsaWdodC4KQEAgLTIzMTcsNiArMjMzOSw3IEBACiB9CiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6c2V0RXJyb3JTdGF0ZShjb25zdCBjaGFyICpmbXQsIC4uLikgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogICAgIHZhX2xpc3QgYXJnczsKICAgICB2YV9zdGFydChhcmdzLCBmbXQpOwpAQCAtMjMyNyw2ICsyMzUwLDcgQEAKIH0KIAogdm9pZCBDYW1lcmEzRGV2aWNlOjpzZXRFcnJvclN0YXRlVihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogICAgIHNldEVycm9yU3RhdGVMb2NrZWRWKGZtdCwgYXJncyk7CiB9CkBAIC0yNDExLDYgKzI0MzUsNyBAQAogfQogCiB2b2lkIENhbWVyYTNEZXZpY2U6OnJlbW92ZUluRmxpZ2h0TWFwRW50cnlMb2NrZWQoaW50IGlkeCkgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgbnNlY3NfdCBkdXJhdGlvbiA9IG1JbkZsaWdodE1hcC52YWx1ZUF0KGlkeCkubWF4RXhwZWN0ZWREdXJhdGlvbjsKICAgICBtSW5GbGlnaHRNYXAucmVtb3ZlSXRlbXNBdChpZHgsIDEpOwogCkBAIC0yNDMzLDI1ICsyNDU4LDYgQEAKICAgICBuc2Vjc190IHNlbnNvclRpbWVzdGFtcCA9IHJlcXVlc3Quc2Vuc29yVGltZXN0YW1wOwogICAgIG5zZWNzX3Qgc2h1dHRlclRpbWVzdGFtcCA9IHJlcXVlc3Quc2h1dHRlclRpbWVzdGFtcDsKIAotICAgIGJvb2wgc2tpcFJlc3VsdE1ldGFkYXRhID0gZmFsc2U7Ci0gICAgaWYgKHJlcXVlc3QucmVxdWVzdFN0YXR1cyAhPSBPSykgewotICAgICAgICBzd2l0Y2ggKHJlcXVlc3QucmVxdWVzdFN0YXR1cykgewotICAgICAgICAgICAgY2FzZSBDQU1FUkEzX01TR19FUlJPUl9ERVZJQ0U6Ci0gICAgICAgICAgICBjYXNlIENBTUVSQTNfTVNHX0VSUk9SX1JFUVVFU1Q6Ci0gICAgICAgICAgICBjYXNlIENBTUVSQTNfTVNHX0VSUk9SX1JFU1VMVDoKLSAgICAgICAgICAgICAgICBza2lwUmVzdWx0TWV0YWRhdGEgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDQU1FUkEzX01TR19FUlJPUl9CVUZGRVI6Ci0gICAgICAgICAgICAgICAgLy9SZXN1bHQgbWV0YWRhdGEgc2hvdWxkIHJldHVybiBpbiB0aGlzIGNhc2UuCi0gICAgICAgICAgICAgICAgc2tpcFJlc3VsdE1ldGFkYXRhID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIFNFVF9FUlIoIlVua25vd24gZXJyb3IgbWVzc2FnZTogJWQiLCByZXF1ZXN0LnJlcXVlc3RTdGF0dXMpOwotICAgICAgICAgICAgICAgIHNraXBSZXN1bHRNZXRhZGF0YSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLy8gQ2hlY2sgaWYgaXQncyBva2F5IHRvIHJlbW92ZSB0aGUgcmVxdWVzdCBmcm9tIEluRmxpZ2h0TWFwOgogICAgIC8vIEluIHRoZSBjYXNlIG9mIGEgc3VjY2Vzc2Z1bCByZXF1ZXN0OgogICAgIC8vICAgICAgYWxsIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycywgYWxsIHJlc3VsdCBtZXRhZGF0YSwgc2h1dHRlciBjYWxsYmFjawpAQCAtMjQ1OSw3ICsyNDY1LDcgQEAKICAgICAvLyBJbiB0aGUgY2FzZSBvZiBhIHVuc3VjY2Vzc2Z1bCByZXF1ZXN0OgogICAgIC8vICAgICAgYWxsIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBhcnJpdmVkLgogICAgIGlmIChyZXF1ZXN0Lm51bUJ1ZmZlcnNMZWZ0ID09IDAgJiYKLSAgICAgICAgICAgIChza2lwUmVzdWx0TWV0YWRhdGEgfHwKKyAgICAgICAgICAgIChyZXF1ZXN0LnNraXBSZXN1bHRNZXRhZGF0YSB8fAogICAgICAgICAgICAgKHJlcXVlc3QuaGF2ZVJlc3VsdE1ldGFkYXRhICYmIHNodXR0ZXJUaW1lc3RhbXAgIT0gMCkpKSB7CiAgICAgICAgIEFUUkFDRV9BU1lOQ19FTkQoImZyYW1lIGNhcHR1cmUiLCBmcmFtZU51bWJlcik7CiAKQEAgLTI0OTUsNiArMjUwMSw3IEBACiB9CiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6Zmx1c2hJbmZsaWdodFJlcXVlc3RzKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgeyAvLyBGaXJzdCByZXR1cm4gYnVmZmVycyBjYWNoZWQgaW4gbUluRmxpZ2h0TWFwCiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbkZsaWdodExvY2spOwogICAgICAgICBmb3IgKHNpemVfdCBpZHggPSAwOyBpZHggPCBtSW5GbGlnaHRNYXAuc2l6ZSgpOyBpZHgrKykgewpAQCAtMjYyMSw2ICsyNjI4LDcgQEAKIAogdm9pZCBDYW1lcmEzRGV2aWNlOjpzZW5kUGFydGlhbENhcHR1cmVSZXN1bHQoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKiBwYXJ0aWFsUmVzdWx0LAogICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzICZyZXN1bHRFeHRyYXMsIHVpbnQzMl90IGZyYW1lTnVtYmVyKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtT3V0cHV0TG9jayk7CiAKICAgICBDYXB0dXJlUmVzdWx0IGNhcHR1cmVSZXN1bHQ7CkBAIC0yNjM2LDYgKzI2NDQsNyBAQAogICAgICAgICBDYW1lcmFNZXRhZGF0YSAmY29sbGVjdGVkUGFydGlhbFJlc3VsdCwKICAgICAgICAgdWludDMyX3QgZnJhbWVOdW1iZXIsCiAgICAgICAgIGJvb2wgcmVwcm9jZXNzKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAocGVuZGluZ01ldGFkYXRhLmlzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuOwogCkBAIC0yODg0LDcgKzI4OTMsNyBAQAogCiB2b2lkIENhbWVyYTNEZXZpY2U6Om5vdGlmeUVycm9yKGNvbnN0IGNhbWVyYTNfZXJyb3JfbXNnX3QgJm1zZywKICAgICAgICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyKSB7Ci0KKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIC8vIE1hcCBjYW1lcmEgSEFMIGVycm9yIGNvZGVzIHRvIElDYW1lcmFEZXZpY2VDYWxsYmFjayBlcnJvciBjb2RlcwogICAgIC8vIEluZGV4IGludG8gdGhpcyB3aXRoIHRoZSBIQUwgZXJyb3IgY29kZQogICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGhhbEVycm9yTWFwW0NBTUVSQTNfTVNHX05VTV9FUlJPUlNdID0gewpAQCAtMjkzMiw2ICsyOTQxLDExIEBACiAgICAgICAgICAgICAgICAgICAgIEluRmxpZ2h0UmVxdWVzdCAmciA9IG1JbkZsaWdodE1hcC5lZGl0VmFsdWVBdChpZHgpOwogICAgICAgICAgICAgICAgICAgICByLnJlcXVlc3RTdGF0dXMgPSBtc2cuZXJyb3JfY29kZTsKICAgICAgICAgICAgICAgICAgICAgcmVzdWx0RXh0cmFzID0gci5yZXN1bHRFeHRyYXM7CisgICAgICAgICAgICAgICAgICAgIGlmIChoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFU1VMVCA9PSBlcnJvckNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVFVRVNUID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByLnNraXBSZXN1bHRNZXRhZGF0YSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVTVUxUID09CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIG9mIG1pc3NpbmcgcmVzdWx0IGNoZWNrIHdoZXRoZXIgdGhlIGJ1ZmZlcnMKQEAgLTI5NjIsNiArMjk3Niw3IEBACiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6bm90aWZ5U2h1dHRlcihjb25zdCBjYW1lcmEzX3NodXR0ZXJfbXNnX3QgJm1zZywKICAgICAgICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzc2l6ZV90IGlkeDsKIAogICAgIC8vIFNldCB0aW1lc3RhbXAgZm9yIHRoZSByZXF1ZXN0IGluIHRoZSBpbi1mbGlnaHQgdHJhY2tpbmcKQEAgLTMwNDgsMjQgKzMwNjMsMjAgQEAKIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6SGFsSW50ZXJmYWNlKAogICAgICAgICAgICAgc3A8SUNhbWVyYURldmljZVNlc3Npb24+ICZzZXNzaW9uLAogICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZSkgOgotICAgICAgICBtSGFsM0RldmljZShudWxscHRyKSwKICAgICAgICAgbUhpZGxTZXNzaW9uKHNlc3Npb24pLAogICAgICAgICBtUmVxdWVzdE1ldGFkYXRhUXVldWUocXVldWUpIHt9CiAKLUNhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6SGFsSW50ZXJmYWNlKCkgOgotICAgICAgICBtSGFsM0RldmljZShudWxscHRyKSB7fQorQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpIYWxJbnRlcmZhY2UoKSB7fQogCiBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OkhhbEludGVyZmFjZShjb25zdCBIYWxJbnRlcmZhY2UmIG90aGVyKSA6Ci0gICAgICAgIG1IYWwzRGV2aWNlKG90aGVyLm1IYWwzRGV2aWNlKSwKICAgICAgICAgbUhpZGxTZXNzaW9uKG90aGVyLm1IaWRsU2Vzc2lvbiksCiAgICAgICAgIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZShvdGhlci5tUmVxdWVzdE1ldGFkYXRhUXVldWUpIHt9CiAKIGJvb2wgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjp2YWxpZCgpIHsKLSAgICByZXR1cm4gKG1IYWwzRGV2aWNlICE9IG51bGxwdHIpIHx8IChtSGlkbFNlc3Npb24gIT0gbnVsbHB0cik7CisgICAgcmV0dXJuIChtSGlkbFNlc3Npb24gIT0gbnVsbHB0cik7CiB9CiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpjbGVhcigpIHsKLSAgICBtSGFsM0RldmljZSA9IG51bGxwdHI7CiAgICAgbUhpZGxTZXNzaW9uLmNsZWFyKCk7CiB9CiAKQEAgLTMwODAsNzIgKzMwOTEsNjAgQEAKICAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICBzdGF0dXNfdCByZXMgPSBPSzsKIAotICAgIGlmIChtSGFsM0RldmljZSAhPSBudWxscHRyKSB7Ci0gICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YSAqcjsKLSAgICAgICAgciA9IG1IYWwzRGV2aWNlLT5vcHMtPmNvbnN0cnVjdF9kZWZhdWx0X3JlcXVlc3Rfc2V0dGluZ3MoCi0gICAgICAgICAgICAgICAgbUhhbDNEZXZpY2UsIHRlbXBsYXRlSWQpOwotICAgICAgICBpZiAociA9PSBudWxscHRyKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAqcmVxdWVzdFRlbXBsYXRlID0gY2xvbmVfY2FtZXJhX21ldGFkYXRhKHIpOwotICAgICAgICBpZiAocmVxdWVzdFRlbXBsYXRlID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNsb25lIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIEhBTCIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBjb21tb246OlYxXzA6OlN0YXR1cyBzdGF0dXM7Ci0gICAgICAgIFJlcXVlc3RUZW1wbGF0ZSBpZDsKLSAgICAgICAgc3dpdGNoICh0ZW1wbGF0ZUlkKSB7Ci0gICAgICAgICAgICBjYXNlIENBTUVSQTNfVEVNUExBVEVfUFJFVklFVzoKLSAgICAgICAgICAgICAgICBpZCA9IFJlcXVlc3RUZW1wbGF0ZTo6UFJFVklFVzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ0FNRVJBM19URU1QTEFURV9TVElMTF9DQVBUVVJFOgotICAgICAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpTVElMTF9DQVBUVVJFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDQU1FUkEzX1RFTVBMQVRFX1ZJREVPX1JFQ09SRDoKLSAgICAgICAgICAgICAgICBpZCA9IFJlcXVlc3RUZW1wbGF0ZTo6VklERU9fUkVDT1JEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDQU1FUkEzX1RFTVBMQVRFX1ZJREVPX1NOQVBTSE9UOgotICAgICAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpWSURFT19TTkFQU0hPVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ0FNRVJBM19URU1QTEFURV9aRVJPX1NIVVRURVJfTEFHOgotICAgICAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpaRVJPX1NIVVRURVJfTEFHOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDQU1FUkEzX1RFTVBMQVRFX01BTlVBTDoKLSAgICAgICAgICAgICAgICBpZCA9IFJlcXVlc3RUZW1wbGF0ZTo6TUFOVUFMOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvLyBVbmtub3duIHRlbXBsYXRlIElECi0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbi0+Y29uc3RydWN0RGVmYXVsdFJlcXVlc3RTZXR0aW5ncyhpZCwKLSAgICAgICAgICAgICAgICBbJnN0YXR1cywgJnJlcXVlc3RUZW1wbGF0ZV0KLSAgICAgICAgICAgICAgICAoY29tbW9uOjpWMV8wOjpTdGF0dXMgcywgY29uc3QgZGV2aWNlOjpWM18yOjpDYW1lcmFNZXRhZGF0YSYgcmVxdWVzdCkgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IGNvbW1vbjo6VjFfMDo6U3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhICpyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KHJlcXVlc3QuZGF0YSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBleHBlY3RlZFNpemUgPSByZXF1ZXN0LnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB2YWxpZGF0ZV9jYW1lcmFfbWV0YWRhdGFfc3RydWN0dXJlKHIsICZleHBlY3RlZFNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBPSyB8fCByZXQgPT0gQ0FNRVJBX01FVEFEQVRBX1ZBTElEQVRJT05fU0hJRlRFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZXF1ZXN0VGVtcGxhdGUgPSBjbG9uZV9jYW1lcmFfbWV0YWRhdGEocik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpyZXF1ZXN0VGVtcGxhdGUgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjbG9uZSBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBIQUwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNvbW1vbjo6VjFfMDo6U3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogTWFsZm9ybWVkIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIEhBTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgY29tbW9uOjpWMV8wOjpTdGF0dXMgc3RhdHVzOworICAgIFJlcXVlc3RUZW1wbGF0ZSBpZDsKKyAgICBzd2l0Y2ggKHRlbXBsYXRlSWQpIHsKKyAgICAgICAgY2FzZSBDQU1FUkEzX1RFTVBMQVRFX1BSRVZJRVc6CisgICAgICAgICAgICBpZCA9IFJlcXVlc3RUZW1wbGF0ZTo6UFJFVklFVzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQTNfVEVNUExBVEVfU1RJTExfQ0FQVFVSRToKKyAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpTVElMTF9DQVBUVVJFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNRVJBM19URU1QTEFURV9WSURFT19SRUNPUkQ6CisgICAgICAgICAgICBpZCA9IFJlcXVlc3RUZW1wbGF0ZTo6VklERU9fUkVDT1JEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNRVJBM19URU1QTEFURV9WSURFT19TTkFQU0hPVDoKKyAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpWSURFT19TTkFQU0hPVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQTNfVEVNUExBVEVfWkVST19TSFVUVEVSX0xBRzoKKyAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpaRVJPX1NIVVRURVJfTEFHOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNRVJBM19URU1QTEFURV9NQU5VQUw6CisgICAgICAgICAgICBpZCA9IFJlcXVlc3RUZW1wbGF0ZTo6TUFOVUFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBVbmtub3duIHRlbXBsYXRlIElECisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbi0+Y29uc3RydWN0RGVmYXVsdFJlcXVlc3RTZXR0aW5ncyhpZCwKKyAgICAgICAgICAgIFsmc3RhdHVzLCAmcmVxdWVzdFRlbXBsYXRlXQorICAgICAgICAgICAgKGNvbW1vbjo6VjFfMDo6U3RhdHVzIHMsIGNvbnN0IGRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGEmIHJlcXVlc3QpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gY29tbW9uOjpWMV8wOjpTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YSAqciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KHJlcXVlc3QuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGV4cGVjdGVkU2l6ZSA9IHJlcXVlc3Quc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdmFsaWRhdGVfY2FtZXJhX21ldGFkYXRhX3N0cnVjdHVyZShyLCAmZXhwZWN0ZWRTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBPSyB8fCByZXQgPT0gQ0FNRVJBX01FVEFEQVRBX1ZBTElEQVRJT05fU0hJRlRFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgKnJlcXVlc3RUZW1wbGF0ZSA9IGNsb25lX2NhbWVyYV9tZXRhZGF0YShyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqcmVxdWVzdFRlbXBsYXRlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjbG9uZSBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBIQUwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBjb21tb246OlYxXzA6OlN0YXR1czo6SU5URVJOQUxfRVJST1I7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IE1hbGZvcm1lZCBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBIQUwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY29tbW9uOjpWMV8wOjpTdGF0dXM6OklOVEVSTkFMX0VSUk9SOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIGlmICghZXJyLmlzT2soKSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICAgICAgcmVzID0gREVBRF9PQkpFQ1Q7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXMgPSBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmVzID0gREVBRF9PQkpFQ1Q7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzID0gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptYXBUb1N0YXR1c1Qoc3RhdHVzKTsKICAgICB9CisKICAgICByZXR1cm4gcmVzOwogfQogCkBAIC0zMTU0LDE0NSArMzE1MywxOTEgQEAKICAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICBzdGF0dXNfdCByZXMgPSBPSzsKIAotICAgIGlmIChtSGFsM0RldmljZSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHJlcyA9IG1IYWwzRGV2aWNlLT5vcHMtPmNvbmZpZ3VyZV9zdHJlYW1zKG1IYWwzRGV2aWNlLCBjb25maWcpOworICAgIC8vIENvbnZlcnQgc3RyZWFtIGNvbmZpZyB0byBISURMCisgICAgc3RkOjpzZXQ8aW50PiBhY3RpdmVTdHJlYW1zOworICAgIFN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjsKKyAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uLnN0cmVhbXMucmVzaXplKGNvbmZpZy0+bnVtX3N0cmVhbXMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29uZmlnLT5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgICAgIFN0cmVhbSAmZHN0ID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5zdHJlYW1zW2ldOworICAgICAgICBjYW1lcmEzX3N0cmVhbV90ICpzcmMgPSBjb25maWctPnN0cmVhbXNbaV07CisKKyAgICAgICAgQ2FtZXJhM1N0cmVhbSogY2FtM3N0cmVhbSA9IENhbWVyYTNTdHJlYW06OmNhc3Qoc3JjKTsKKyAgICAgICAgY2FtM3N0cmVhbS0+c2V0QnVmZmVyRnJlZWRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgaW50IHN0cmVhbUlkID0gY2FtM3N0cmVhbS0+Z2V0SWQoKTsKKyAgICAgICAgU3RyZWFtVHlwZSBzdHJlYW1UeXBlOworICAgICAgICBzd2l0Y2ggKHNyYy0+c3RyZWFtX3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBM19TVFJFQU1fT1VUUFVUOgorICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBTdHJlYW1UeXBlOjpPVVRQVVQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENBTUVSQTNfU1RSRUFNX0lOUFVUOgorICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBTdHJlYW1UeXBlOjpJTlBVVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IFVuc3VwcG9ydGVkIHN0cmVhbSB0eXBlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIGNvbmZpZy0+c3RyZWFtc1tpXS0+c3RyZWFtX3R5cGUpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgZHN0LmlkID0gc3RyZWFtSWQ7CisgICAgICAgIGRzdC5zdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKKyAgICAgICAgZHN0LndpZHRoID0gc3JjLT53aWR0aDsKKyAgICAgICAgZHN0LmhlaWdodCA9IHNyYy0+aGVpZ2h0OworICAgICAgICBkc3QuZm9ybWF0ID0gbWFwVG9QaXhlbEZvcm1hdChzcmMtPmZvcm1hdCk7CisgICAgICAgIGRzdC51c2FnZSA9IG1hcFRvQ29uc3VtZXJVc2FnZShjYW0zc3RyZWFtLT5nZXRVc2FnZSgpKTsKKyAgICAgICAgZHN0LmRhdGFTcGFjZSA9IG1hcFRvSGlkbERhdGFzcGFjZShzcmMtPmRhdGFfc3BhY2UpOworICAgICAgICBkc3Qucm90YXRpb24gPSBtYXBUb1N0cmVhbVJvdGF0aW9uKChjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90KSBzcmMtPnJvdGF0aW9uKTsKKworICAgICAgICBhY3RpdmVTdHJlYW1zLmluc2VydChzdHJlYW1JZCk7CisgICAgICAgIC8vIENyZWF0ZSBCdWZmZXIgSUQgbWFwIGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAobUJ1ZmZlcklkTWFwcy5jb3VudChzdHJlYW1JZCkgPT0gMCkgeworICAgICAgICAgICAgbUJ1ZmZlcklkTWFwcy5lbXBsYWNlKHN0cmVhbUlkLCBCdWZmZXJJZE1hcHt9KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyByZW1vdmUgQnVmZmVySWRNYXAgZm9yIGRlbGV0ZWQgc3RyZWFtcworICAgIGZvcihhdXRvIGl0ID0gbUJ1ZmZlcklkTWFwcy5iZWdpbigpOyBpdCAhPSBtQnVmZmVySWRNYXBzLmVuZCgpOykgeworICAgICAgICBpbnQgc3RyZWFtSWQgPSBpdC0+Zmlyc3Q7CisgICAgICAgIGJvb2wgYWN0aXZlID0gYWN0aXZlU3RyZWFtcy5jb3VudChzdHJlYW1JZCkgPiAwOworICAgICAgICBpZiAoIWFjdGl2ZSkgeworICAgICAgICAgICAgaXQgPSBtQnVmZmVySWRNYXBzLmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICsraXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXMgPSBtYXBUb1N0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKAorICAgICAgICAgICAgKGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90KSBjb25maWctPm9wZXJhdGlvbl9tb2RlLAorICAgICAgICAgICAgLypvdXQqLyAmcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5vcGVyYXRpb25Nb2RlKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLy8gSW52b2tlIGNvbmZpZ3VyZVN0cmVhbXMKKworICAgIGRldmljZTo6VjNfMzo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiBmaW5hbENvbmZpZ3VyYXRpb247CisgICAgY29tbW9uOjpWMV8wOjpTdGF0dXMgc3RhdHVzOworCisgICAgLy8gU2VlIGlmIHdlIGhhdmUgdjMuMyBIQUwKKyAgICBzcDxkZXZpY2U6OlYzXzM6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBoaWRsU2Vzc2lvbl8zXzM7CisgICAgYXV0byBjYXN0UmVzdWx0ID0gZGV2aWNlOjpWM18zOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbjo6Y2FzdEZyb20obUhpZGxTZXNzaW9uKTsKKyAgICBpZiAoY2FzdFJlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgaGlkbFNlc3Npb25fM18zID0gY2FzdFJlc3VsdDsKICAgICB9IGVsc2UgewotICAgICAgICAvLyBDb252ZXJ0IHN0cmVhbSBjb25maWcgdG8gSElETAotICAgICAgICBzdGQ6OnNldDxpbnQ+IGFjdGl2ZVN0cmVhbXM7Ci0gICAgICAgIFN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjsKLSAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShjb25maWctPm51bV9zdHJlYW1zKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb25maWctPm51bV9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmVhbSAmZHN0ID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5zdHJlYW1zW2ldOwotICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fdCAqc3JjID0gY29uZmlnLT5zdHJlYW1zW2ldOwotCi0gICAgICAgICAgICBDYW1lcmEzU3RyZWFtKiBjYW0zc3RyZWFtID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChzcmMpOwotICAgICAgICAgICAgY2FtM3N0cmVhbS0+c2V0QnVmZmVyRnJlZWRMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgIGludCBzdHJlYW1JZCA9IGNhbTNzdHJlYW0tPmdldElkKCk7Ci0gICAgICAgICAgICBTdHJlYW1UeXBlIHN0cmVhbVR5cGU7Ci0gICAgICAgICAgICBzd2l0Y2ggKHNyYy0+c3RyZWFtX3R5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIENBTUVSQTNfU1RSRUFNX09VVFBVVDoKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IFN0cmVhbVR5cGU6Ok9VVFBVVDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBDQU1FUkEzX1NUUkVBTV9JTlBVVDoKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IFN0cmVhbVR5cGU6OklOUFVUOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogVW5zdXBwb3J0ZWQgc3RyZWFtIHR5cGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIGNvbmZpZy0+c3RyZWFtc1tpXS0+c3RyZWFtX3R5cGUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZHN0LmlkID0gc3RyZWFtSWQ7Ci0gICAgICAgICAgICBkc3Quc3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7Ci0gICAgICAgICAgICBkc3Qud2lkdGggPSBzcmMtPndpZHRoOwotICAgICAgICAgICAgZHN0LmhlaWdodCA9IHNyYy0+aGVpZ2h0OwotICAgICAgICAgICAgZHN0LmZvcm1hdCA9IG1hcFRvUGl4ZWxGb3JtYXQoc3JjLT5mb3JtYXQpOwotICAgICAgICAgICAgZHN0LnVzYWdlID0gbWFwVG9Db25zdW1lclVzYWdlKHNyYy0+dXNhZ2UpOwotICAgICAgICAgICAgZHN0LmRhdGFTcGFjZSA9IG1hcFRvSGlkbERhdGFzcGFjZShzcmMtPmRhdGFfc3BhY2UpOwotICAgICAgICAgICAgZHN0LnJvdGF0aW9uID0gbWFwVG9TdHJlYW1Sb3RhdGlvbigoY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCkgc3JjLT5yb3RhdGlvbik7Ci0KLSAgICAgICAgICAgIGFjdGl2ZVN0cmVhbXMuaW5zZXJ0KHN0cmVhbUlkKTsKLSAgICAgICAgICAgIC8vIENyZWF0ZSBCdWZmZXIgSUQgbWFwIGlmIG5lY2Vzc2FyeQotICAgICAgICAgICAgaWYgKG1CdWZmZXJJZE1hcHMuY291bnQoc3RyZWFtSWQpID09IDApIHsKLSAgICAgICAgICAgICAgICBtQnVmZmVySWRNYXBzLmVtcGxhY2Uoc3RyZWFtSWQsIEJ1ZmZlcklkTWFwe30pOwotICAgICAgICAgICAgfQorICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIHdoZW4gY2FzdGluZyBJQ2FtZXJhRGV2aWNlU2Vzc2lvbjogJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgY2FzdFJlc3VsdC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgIH0KKyAgICBpZiAoaGlkbFNlc3Npb25fM18zICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gV2UgZG87IHVzZSB2My4zIGZvciB0aGUgY2FsbAorICAgICAgICBBTE9HVigiJXM6IHYzLjMgZGV2aWNlIGZvdW5kIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgYXV0byBlcnIgPSBoaWRsU2Vzc2lvbl8zXzMtPmNvbmZpZ3VyZVN0cmVhbXNfM18zKHJlcXVlc3RlZENvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICBbJnN0YXR1cywgJmZpbmFsQ29uZmlndXJhdGlvbl0KKyAgICAgICAgICAgIChjb21tb246OlYxXzA6OlN0YXR1cyBzLCBjb25zdCBkZXZpY2U6OlYzXzM6OkhhbFN0cmVhbUNvbmZpZ3VyYXRpb24mIGhhbENvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24gPSBoYWxDb25maWd1cmF0aW9uOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiAgICAgICAgIH0KLSAgICAgICAgLy8gcmVtb3ZlIEJ1ZmZlcklkTWFwIGZvciBkZWxldGVkIHN0cmVhbXMKLSAgICAgICAgZm9yKGF1dG8gaXQgPSBtQnVmZmVySWRNYXBzLmJlZ2luKCk7IGl0ICE9IG1CdWZmZXJJZE1hcHMuZW5kKCk7KSB7Ci0gICAgICAgICAgICBpbnQgc3RyZWFtSWQgPSBpdC0+Zmlyc3Q7Ci0gICAgICAgICAgICBib29sIGFjdGl2ZSA9IGFjdGl2ZVN0cmVhbXMuY291bnQoc3RyZWFtSWQpID4gMDsKLSAgICAgICAgICAgIGlmICghYWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgaXQgPSBtQnVmZmVySWRNYXBzLmVyYXNlKGl0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKytpdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJlcyA9IG1hcFRvU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUoCi0gICAgICAgICAgICAgICAgKGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90KSBjb25maWctPm9wZXJhdGlvbl9tb2RlLAotICAgICAgICAgICAgICAgIC8qb3V0Ki8gJnJlcXVlc3RlZENvbmZpZ3VyYXRpb24ub3BlcmF0aW9uTW9kZSk7Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJbnZva2UgY29uZmlndXJlU3RyZWFtcwotCi0gICAgICAgIEhhbFN0cmVhbUNvbmZpZ3VyYXRpb24gZmluYWxDb25maWd1cmF0aW9uOwotICAgICAgICBjb21tb246OlYxXzA6OlN0YXR1cyBzdGF0dXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gV2UgZG9uJ3Q7IHVzZSB2My4yIGNhbGwgYW5kIGNvbnN0cnVjdCBhIHYzLjMgSGFsU3RyZWFtQ29uZmlndXJhdGlvbgorICAgICAgICBBTE9HVigiJXM6IHYzLjIgZGV2aWNlIGZvdW5kIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgSGFsU3RyZWFtQ29uZmlndXJhdGlvbiBmaW5hbENvbmZpZ3VyYXRpb25fM18yOwogICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbi0+Y29uZmlndXJlU3RyZWFtcyhyZXF1ZXN0ZWRDb25maWd1cmF0aW9uLAotICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmZmluYWxDb25maWd1cmF0aW9uXQorICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmZmluYWxDb25maWd1cmF0aW9uXzNfMl0KICAgICAgICAgICAgICAgICAoY29tbW9uOjpWMV8wOjpTdGF0dXMgcywgY29uc3QgSGFsU3RyZWFtQ29uZmlndXJhdGlvbiYgaGFsQ29uZmlndXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24gPSBoYWxDb25maWd1cmF0aW9uOworICAgICAgICAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb25fM18yID0gaGFsQ29uZmlndXJhdGlvbjsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgaWYgKCFlcnIuaXNPaygpKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CiAgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiAgICAgICAgIH0KKyAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXMucmVzaXplKGZpbmFsQ29uZmlndXJhdGlvbl8zXzIuc3RyZWFtcy5zaXplKCkpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpbmFsQ29uZmlndXJhdGlvbl8zXzIuc3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXNbaV0udjNfMiA9IGZpbmFsQ29uZmlndXJhdGlvbl8zXzIuc3RyZWFtc1tpXTsKKyAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zW2ldLm92ZXJyaWRlRGF0YVNwYWNlID0KKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5zdHJlYW1zW2ldLmRhdGFTcGFjZTsKKyAgICAgICAgfQorICAgIH0KIAotICAgICAgICBpZiAoc3RhdHVzICE9IGNvbW1vbjo6VjFfMDo6U3RhdHVzOjpPSyApIHsKLSAgICAgICAgICAgIHJldHVybiBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVChzdGF0dXMpOworICAgIGlmIChzdGF0dXMgIT0gY29tbW9uOjpWMV8wOjpTdGF0dXM6Ok9LICkgeworICAgICAgICByZXR1cm4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptYXBUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CisKKyAgICAvLyBBbmQgY29udmVydCBvdXRwdXQgc3RyZWFtIGNvbmZpZ3VyYXRpb24gZnJvbSBISURMCisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbmZpZy0+bnVtX3N0cmVhbXM7IGkrKykgeworICAgICAgICBjYW1lcmEzX3N0cmVhbV90ICpkc3QgPSBjb25maWctPnN0cmVhbXNbaV07CisgICAgICAgIGludCBzdHJlYW1JZCA9IENhbWVyYTNTdHJlYW06OmNhc3QoZHN0KS0+Z2V0SWQoKTsKKworICAgICAgICAvLyBTdGFydCBzY2FuIGF0IGksIHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgc3RyZWFtIG9yZGVyIG1hdGNoZXMKKyAgICAgICAgc2l6ZV90IHJlYWxJZHggPSBpOworICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGlkeCA9IDA7IGlkeCA8IGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zLnNpemUoKTsgaWR4KyspIHsKKyAgICAgICAgICAgIGlmIChmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tyZWFsSWR4XS52M18yLmlkID09IHN0cmVhbUlkKSB7CisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVhbElkeCA9IChyZWFsSWR4ID49IGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zLnNpemUoKSkgPyAwIDogcmVhbElkeCArIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQgbm90IGZvdW5kIGluIHN0cmVhbSBjb25maWd1cmF0aW9uIHJlc3BvbnNlIGZyb20gSEFMIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgZGV2aWNlOjpWM18zOjpIYWxTdHJlYW0gJnNyYyA9IGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zW3JlYWxJZHhdOworCisgICAgICAgIENhbWVyYTNTdHJlYW0qIGRzdFN0cmVhbSA9IENhbWVyYTNTdHJlYW06OmNhc3QoZHN0KTsKKyAgICAgICAgZHN0U3RyZWFtLT5zZXRGb3JtYXRPdmVycmlkZShmYWxzZSk7CisgICAgICAgIGRzdFN0cmVhbS0+c2V0RGF0YVNwYWNlT3ZlcnJpZGUoZmFsc2UpOworICAgICAgICBpbnQgb3ZlcnJpZGVGb3JtYXQgPSBtYXBUb0ZyYW1ld29ya0Zvcm1hdChzcmMudjNfMi5vdmVycmlkZUZvcm1hdCk7CisgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIG92ZXJyaWRlRGF0YVNwYWNlID0gbWFwVG9GcmFtZXdvcmtEYXRhc3BhY2Uoc3JjLm92ZXJyaWRlRGF0YVNwYWNlKTsKKworICAgICAgICBpZiAoZHN0LT5mb3JtYXQgIT0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEKSB7CisgICAgICAgICAgICBpZiAoZHN0LT5mb3JtYXQgIT0gb3ZlcnJpZGVGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRm9ybWF0IG92ZXJyaWRlIG5vdCBhbGxvd2VkIGZvciBmb3JtYXQgMHgleCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlkLCBkc3QtPmZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZHN0LT5kYXRhX3NwYWNlICE9IG92ZXJyaWRlRGF0YVNwYWNlKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IERhdGFTcGFjZSBvdmVycmlkZSBub3QgYWxsb3dlZCBmb3IgZm9ybWF0IDB4JXgiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JZCwgZHN0LT5mb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHN0U3RyZWFtLT5zZXRGb3JtYXRPdmVycmlkZSgoZHN0LT5mb3JtYXQgIT0gb3ZlcnJpZGVGb3JtYXQpID8gdHJ1ZSA6IGZhbHNlKTsKKyAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0RGF0YVNwYWNlT3ZlcnJpZGUoKGRzdC0+ZGF0YV9zcGFjZSAhPSBvdmVycmlkZURhdGFTcGFjZSkgPyB0cnVlIDogZmFsc2UpOworCisgICAgICAgICAgICAvLyBPdmVycmlkZSBhbGxvd2VkIHdpdGggSU1QTEVNRU5UQVRJT05fREVGSU5FRAorICAgICAgICAgICAgZHN0LT5mb3JtYXQgPSBvdmVycmlkZUZvcm1hdDsKKyAgICAgICAgICAgIGRzdC0+ZGF0YV9zcGFjZSA9IG92ZXJyaWRlRGF0YVNwYWNlOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gQW5kIGNvbnZlcnQgb3V0cHV0IHN0cmVhbSBjb25maWd1cmF0aW9uIGZyb20gSElETAotCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29uZmlnLT5udW1fc3RyZWFtczsgaSsrKSB7Ci0gICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV90ICpkc3QgPSBjb25maWctPnN0cmVhbXNbaV07Ci0gICAgICAgICAgICBpbnQgc3RyZWFtSWQgPSBDYW1lcmEzU3RyZWFtOjpjYXN0KGRzdCktPmdldElkKCk7Ci0KLSAgICAgICAgICAgIC8vIFN0YXJ0IHNjYW4gYXQgaSwgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBzdHJlYW0gb3JkZXIgbWF0Y2hlcwotICAgICAgICAgICAgc2l6ZV90IHJlYWxJZHggPSBpOwotICAgICAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaWR4ID0gMDsgaWR4IDwgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXMuc2l6ZSgpOyBpZHgrKykgewotICAgICAgICAgICAgICAgIGlmIChmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tyZWFsSWR4XS5pZCA9PSBzdHJlYW1JZCkgewotICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZWFsSWR4ID0gKHJlYWxJZHggPj0gZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXMuc2l6ZSgpKSA/IDAgOiByZWFsSWR4ICsgMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZm91bmQpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZCBub3QgZm91bmQgaW4gc3RyZWFtIGNvbmZpZ3VyYXRpb24gcmVzcG9uc2UgZnJvbSBIQUwiLAorICAgICAgICBpZiAoZHN0LT5zdHJlYW1fdHlwZSA9PSBDQU1FUkEzX1NUUkVBTV9JTlBVVCkgeworICAgICAgICAgICAgaWYgKHNyYy52M18yLnByb2R1Y2VyVXNhZ2UgIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBJTlBVVCBzdHJlYW1zIG11c3QgaGF2ZSAwIGZvciBwcm9kdWNlciB1c2FnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBIYWxTdHJlYW0gJnNyYyA9IGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zW3JlYWxJZHhdOwotCi0gICAgICAgICAgICBpbnQgb3ZlcnJpZGVGb3JtYXQgPSBtYXBUb0ZyYW1ld29ya0Zvcm1hdChzcmMub3ZlcnJpZGVGb3JtYXQpOwotICAgICAgICAgICAgaWYgKGRzdC0+Zm9ybWF0ICE9IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCkgewotICAgICAgICAgICAgICAgIGlmIChkc3QtPmZvcm1hdCAhPSBvdmVycmlkZUZvcm1hdCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRm9ybWF0IG92ZXJyaWRlIG5vdCBhbGxvd2VkIGZvciBmb3JtYXQgMHgleCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JZCwgZHN0LT5mb3JtYXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gT3ZlcnJpZGUgYWxsb3dlZCB3aXRoIElNUExFTUVOVEFUSU9OX0RFRklORUQKLSAgICAgICAgICAgICAgICBkc3QtPmZvcm1hdCA9IG92ZXJyaWRlRm9ybWF0OworICAgICAgICAgICAgZHN0U3RyZWFtLT5zZXRVc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgbWFwQ29uc3VtZXJUb0ZyYW1ld29ya1VzYWdlKHNyYy52M18yLmNvbnN1bWVyVXNhZ2UpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE9VVFBVVAorICAgICAgICAgICAgaWYgKHNyYy52M18yLmNvbnN1bWVyVXNhZ2UgIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBPVVRQVVQgc3RyZWFtcyBtdXN0IGhhdmUgMCBmb3IgY29uc3VtZXIgdXNhZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZHN0LT5zdHJlYW1fdHlwZSA9PSBDQU1FUkEzX1NUUkVBTV9JTlBVVCkgewotICAgICAgICAgICAgICAgIGlmIChzcmMucHJvZHVjZXJVc2FnZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBJTlBVVCBzdHJlYW1zIG11c3QgaGF2ZSAwIGZvciBwcm9kdWNlciB1c2FnZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZHN0LT51c2FnZSA9IG1hcENvbnN1bWVyVG9GcmFtZXdvcmtVc2FnZShzcmMuY29uc3VtZXJVc2FnZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIE9VVFBVVAotICAgICAgICAgICAgICAgIGlmIChzcmMuY29uc3VtZXJVc2FnZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBPVVRQVVQgc3RyZWFtcyBtdXN0IGhhdmUgMCBmb3IgY29uc3VtZXIgdXNhZ2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRzdC0+dXNhZ2UgPSBtYXBQcm9kdWNlclRvRnJhbWV3b3JrVXNhZ2Uoc3JjLnByb2R1Y2VyVXNhZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZHN0LT5tYXhfYnVmZmVycyA9IHNyYy5tYXhCdWZmZXJzOworICAgICAgICAgICAgZHN0U3RyZWFtLT5zZXRVc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgbWFwUHJvZHVjZXJUb0ZyYW1ld29ya1VzYWdlKHNyYy52M18yLnByb2R1Y2VyVXNhZ2UpKTsKICAgICAgICAgfQorICAgICAgICBkc3QtPm1heF9idWZmZXJzID0gc3JjLnYzXzIubWF4QnVmZmVyczsKICAgICB9CisKICAgICByZXR1cm4gcmVzOwogfQogCiB2b2lkIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6d3JhcEFzSGlkbFJlcXVlc3QoY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCogcmVxdWVzdCwKICAgICAgICAgLypvdXQqL2RldmljZTo6VjNfMjo6Q2FwdHVyZVJlcXVlc3QqIGNhcHR1cmVSZXF1ZXN0LAogICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4qIGhhbmRsZXNDcmVhdGVkKSB7Ci0KKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGlmIChjYXB0dXJlUmVxdWVzdCA9PSBudWxscHRyIHx8IGhhbmRsZXNDcmVhdGVkID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIiVzOiBjYXB0dXJlUmVxdWVzdCAoJXApIGFuZCBoYW5kbGVzQ3JlYXRlZCAoJXApIG11c3Qgbm90IGJlIG51bGwiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FwdHVyZVJlcXVlc3QsIGhhbmRsZXNDcmVhdGVkKTsKQEAgLTM0NDEsMTQgKzM0ODYsMTEgQEAKICAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICBzdGF0dXNfdCByZXMgPSBPSzsKIAotICAgIGlmIChtSGFsM0RldmljZSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHJlcyA9IG1IYWwzRGV2aWNlLT5vcHMtPnByb2Nlc3NfY2FwdHVyZV9yZXF1ZXN0KG1IYWwzRGV2aWNlLCByZXF1ZXN0KTsKLSAgICB9IGVsc2UgewotICAgICAgICB1aW50MzJfdCBudW1SZXF1ZXN0UHJvY2Vzc2VkID0gMDsKLSAgICAgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCo+IHJlcXVlc3RzKDEpOwotICAgICAgICByZXF1ZXN0c1swXSA9IHJlcXVlc3Q7Ci0gICAgICAgIHJlcyA9IHByb2Nlc3NCYXRjaENhcHR1cmVSZXF1ZXN0cyhyZXF1ZXN0cywgJm51bVJlcXVlc3RQcm9jZXNzZWQpOwotICAgIH0KKyAgICB1aW50MzJfdCBudW1SZXF1ZXN0UHJvY2Vzc2VkID0gMDsKKyAgICBzdGQ6OnZlY3RvcjxjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90Kj4gcmVxdWVzdHMoMSk7CisgICAgcmVxdWVzdHNbMF0gPSByZXF1ZXN0OworICAgIHJlcyA9IHByb2Nlc3NCYXRjaENhcHR1cmVSZXF1ZXN0cyhyZXF1ZXN0cywgJm51bVJlcXVlc3RQcm9jZXNzZWQpOworCiAgICAgcmV0dXJuIHJlczsKIH0KIApAQCAtMzQ1NywzMSArMzQ5OSwyNCBAQAogICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIHN0YXR1c190IHJlcyA9IE9LOwogCi0gICAgaWYgKG1IYWwzRGV2aWNlICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmVzID0gbUhhbDNEZXZpY2UtPm9wcy0+Zmx1c2gobUhhbDNEZXZpY2UpOworICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uLT5mbHVzaCgpOworICAgIGlmICghZXJyLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJlcyA9IERFQURfT0JKRUNUOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uLT5mbHVzaCgpOwotICAgICAgICBpZiAoIWVyci5pc09rKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgICAgIHJlcyA9IERFQURfT0JKRUNUOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzID0gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptYXBUb1N0YXR1c1QoZXJyKTsKLSAgICAgICAgfQorICAgICAgICByZXMgPSBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVChlcnIpOwogICAgIH0KKwogICAgIHJldHVybiByZXM7CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6ZHVtcChpbnQgZmQpIHsKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6ZHVtcChpbnQgLypmZCovKSB7CiAgICAgQVRSQUNFX05BTUUoIkNhbWVyYUhhbDo6ZHVtcCIpOwogICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHN0YXR1c190IHJlcyA9IE9LOwogCi0gICAgaWYgKG1IYWwzRGV2aWNlICE9IG51bGxwdHIpIHsKLSAgICAgICAgbUhhbDNEZXZpY2UtPm9wcy0+ZHVtcChtSGFsM0RldmljZSwgZmQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEhhbmRsZWQgYnkgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpkdW1wCi0gICAgfQotICAgIHJldHVybiByZXM7CisgICAgLy8gSGFuZGxlZCBieSBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmR1bXAKKworICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpjbG9zZSgpIHsKQEAgLTM0ODksMTUgKzM1MjQsMTIgQEAKICAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICBzdGF0dXNfdCByZXMgPSBPSzsKIAotICAgIGlmIChtSGFsM0RldmljZSAhPSBudWxscHRyKSB7Ci0gICAgICAgIG1IYWwzRGV2aWNlLT5jb21tb24uY2xvc2UoJm1IYWwzRGV2aWNlLT5jb21tb24pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uLT5jbG9zZSgpOwotICAgICAgICAvLyBJbnRlcmZhY2Ugd2lsbCBiZSBkZWFkIHNob3J0bHkgYW55d2F5LCBzbyBkb24ndCBsb2cgZXJyb3JzCi0gICAgICAgIGlmICghZXJyLmlzT2soKSkgewotICAgICAgICAgICAgcmVzID0gREVBRF9PQkpFQ1Q7Ci0gICAgICAgIH0KKyAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbi0+Y2xvc2UoKTsKKyAgICAvLyBJbnRlcmZhY2Ugd2lsbCBiZSBkZWFkIHNob3J0bHkgYW55d2F5LCBzbyBkb24ndCBsb2cgZXJyb3JzCisgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgIHJlcyA9IERFQURfT0JKRUNUOwogICAgIH0KKwogICAgIHJldHVybiByZXM7CiB9CiAKQEAgLTM2MTQsMTEgKzM2NDYsMTMgQEAKIAogdm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpzZXROb3RpZmljYXRpb25MaXN0ZW5lcigKICAgICAgICAgd3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOwogICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwogfQogCiB2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmNvbmZpZ3VyYXRpb25Db21wbGV0ZShib29sIGlzQ29uc3RyYWluZWRIaWdoU3BlZWQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CiAgICAgbVJlY29uZmlndXJlZCA9IHRydWU7CiAgICAgLy8gUHJlcGFyZSB2aWRlbyBzdHJlYW0gZm9yIGhpZ2ggc3BlZWQgcmVjb3JkaW5nLgpAQCAtMzYyOSw2ICszNjYzLDcgQEAKICAgICAgICAgTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPiAmcmVxdWVzdHMsCiAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOwogICAgIGZvciAoTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPjo6aXRlcmF0b3IgaXQgPSByZXF1ZXN0cy5iZWdpbigpOyBpdCAhPSByZXF1ZXN0cy5lbmQoKTsKICAgICAgICAgICAgICsraXQpIHsKQEAgLTM2NTEsNyArMzY4Niw3IEBACiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpxdWV1ZVRyaWdnZXIoCiAgICAgICAgIFJlcXVlc3RUcmlnZ2VyIHRyaWdnZXJbXSwKICAgICAgICAgc2l6ZV90IGNvdW50KSB7Ci0KKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1UcmlnZ2VyTXV0ZXgpOwogICAgIHN0YXR1c190IHJldDsKIApAQCAtMzcwOCw2ICszNzQzLDcgQEAKICAgICAgICAgY29uc3QgUmVxdWVzdExpc3QgJnJlcXVlc3RzLAogICAgICAgICAvKm91dCovCiAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKICAgICBpZiAobGFzdEZyYW1lTnVtYmVyICE9IE5VTEwpIHsKICAgICAgICAgKmxhc3RGcmFtZU51bWJlciA9IG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXI7CkBAIC0zNzM0LDYgKzM3NzAsNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpjbGVhclJlcGVhdGluZ1JlcXVlc3RzKC8qb3V0Ki9pbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CiAgICAgcmV0dXJuIGNsZWFyUmVwZWF0aW5nUmVxdWVzdHNMb2NrZWQobGFzdEZyYW1lTnVtYmVyKTsKIApAQCAtMzc1MCw2ICszNzg3LDcgQEAKIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6Y2xlYXIoCiAgICAgICAgIC8qb3V0Ki9pbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CiAgICAgQUxPR1YoIlJlcXVlc3RUaHJlYWQ6OiVzOiIsIF9fRlVOQ1RJT05fXyk7CiAKQEAgLTM4MDUsNiArMzg0Myw3IEBACiB9CiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6c2V0UGF1c2VkKGJvb2wgcGF1c2VkKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtUGF1c2VMb2NrKTsKICAgICBtRG9QYXVzZSA9IHBhdXNlZDsKICAgICBtRG9QYXVzZVNpZ25hbC5zaWduYWwoKTsKQEAgLTM4MTIsNiArMzg1MSw3IEBACiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OndhaXRVbnRpbFJlcXVlc3RQcm9jZXNzZWQoCiAgICAgICAgIGludDMyX3QgcmVxdWVzdElkLCBuc2Vjc190IHRpbWVvdXQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1MYXRlc3RSZXF1ZXN0TXV0ZXgpOwogICAgIHN0YXR1c190IHJlczsKICAgICB3aGlsZSAobUxhdGVzdFJlcXVlc3RJZCAhPSByZXF1ZXN0SWQpIHsKQEAgLTM4MzgsNiArMzg3OCw3IEBACiB9CiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6Y2hlY2tBbmRTdG9wUmVwZWF0aW5nUmVxdWVzdCgpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGJvb2wgc3VyZmFjZUFiYW5kb25lZCA9IGZhbHNlOwogICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gMDsKICAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXI7CkBAIC0zODY2LDYgKzM5MDcsNyBAQAogfQogCiBib29sIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnNlbmRSZXF1ZXN0c0JhdGNoKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgc3RhdHVzX3QgcmVzOwogICAgIHNpemVfdCBiYXRjaFNpemUgPSBtTmV4dFJlcXVlc3RzLnNpemUoKTsKICAgICBzdGQ6OnZlY3RvcjxjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90Kj4gcmVxdWVzdHMoYmF0Y2hTaXplKTsKQEAgLTQyNjEsNiArNDMwMyw3IEBACiB9CiAKIENhbWVyYU1ldGFkYXRhIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmdldExhdGVzdFJlcXVlc3QoKSBjb25zdCB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYWwobUxhdGVzdFJlcXVlc3RNdXRleCk7CiAKICAgICBBTE9HVigiUmVxdWVzdFRocmVhZDo6JXMiLCBfX0ZVTkNUSU9OX18pOwpAQCAtNDI3MCw2ICs0MzEzLDcgQEAKIAogYm9vbCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjppc1N0cmVhbVBlbmRpbmcoCiAgICAgICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+JiBzdHJlYW0pIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CiAKICAgICBmb3IgKGNvbnN0IGF1dG8mIG5leHRSZXF1ZXN0IDogbU5leHRSZXF1ZXN0cykgewpAQCAtNDI5OSw2ICs0MzQzLDcgQEAKIH0KIAogbnNlY3NfdCBDYW1lcmEzRGV2aWNlOjpnZXRFeHBlY3RlZEluRmxpZ2h0RHVyYXRpb24oKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYWwobUluRmxpZ2h0TG9jayk7CiAgICAgcmV0dXJuIG1FeHBlY3RlZEluZmxpZ2h0RHVyYXRpb24gPiBrTWluSW5mbGlnaHREdXJhdGlvbiA/CiAgICAgICAgICAgICBtRXhwZWN0ZWRJbmZsaWdodER1cmF0aW9uIDoga01pbkluZmxpZ2h0RHVyYXRpb247CkBAIC00MzcwLDYgKzQ0MTUsNyBAQAogfQogCiB2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OndhaXRGb3JOZXh0UmVxdWVzdEJhdGNoKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgLy8gT3B0aW1pemVkIGEgYml0IGZvciB0aGUgc2ltcGxlIHN0ZWFkeS1zdGF0ZSBjYXNlIChzaW5nbGUgcmVwZWF0aW5nCiAgICAgLy8gcmVxdWVzdCksIHRvIGF2b2lkIHB1dHRpbmcgdGhhdCByZXF1ZXN0IGluIHRoZSBxdWV1ZSB0ZW1wb3JhcmlseS4KICAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOwpAQCAtNDUxOSw2ICs0NTY1LDcgQEAKIH0KIAogYm9vbCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjp3YWl0SWZQYXVzZWQoKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCByZXM7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVBhdXNlTG9jayk7CiAgICAgd2hpbGUgKG1Eb1BhdXNlKSB7CkBAIC00NTQzLDYgKzQ1OTAsNyBAQAogfQogCiB2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnVucGF1c2VGb3JOZXdSZXF1ZXN0cygpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIC8vIFdpdGggd29yayB0byBkbywgbWFyayB0aHJlYWQgYXMgdW5wYXVzZWQuCiAgICAgLy8gSWYgcGF1c2VkIGJ5IHJlcXVlc3QgKHNldFBhdXNlZCksIGRvbid0IHJlc3VtZSwgdG8gYXZvaWQKICAgICAvLyBleHRyYSBzaWduYWxpbmcvd2FpdGluZyBvdmVyaGVhZCB0byB3YWl0VW50aWxQYXVzZWQKQEAgLTQ1NzQsNyArNDYyMiw3IEBACiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6Omluc2VydFRyaWdnZXJzKAogICAgICAgICBjb25zdCBzcDxDYXB0dXJlUmVxdWVzdD4gJnJlcXVlc3QpIHsKLQorICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1UcmlnZ2VyTXV0ZXgpOwogCiAgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CkBAIC00NjYzLDYgKzQ3MTEsNyBAQAogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpyZW1vdmVUcmlnZ2VycygKICAgICAgICAgY29uc3Qgc3A8Q2FwdHVyZVJlcXVlc3Q+ICZyZXF1ZXN0KSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYWwobVRyaWdnZXJNdXRleCk7CiAKICAgICBDYW1lcmFNZXRhZGF0YSAmbWV0YWRhdGEgPSByZXF1ZXN0LT5tU2V0dGluZ3M7CkBAIC00Nzc5LDYgKzQ4MjgsNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpQcmVwYXJlclRocmVhZDo6cHJlcGFyZShpbnQgbWF4Q291bnQsIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+JiBzdHJlYW0pIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN0YXR1c190IHJlczsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKQEAgLTQ4MjIsNiArNDg3Miw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OlByZXBhcmVyVGhyZWFkOjpjbGVhcigpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIAogICAgIGZvciAoY29uc3QgYXV0byYgc3RyZWFtIDogbVBlbmRpbmdTdHJlYW1zKSB7CkBAIC00ODM0LDYgKzQ4ODUsNyBAQAogfQogCiB2b2lkIENhbWVyYTNEZXZpY2U6OlByZXBhcmVyVGhyZWFkOjpzZXROb3RpZmljYXRpb25MaXN0ZW5lcih3cDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXIpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgKaW5kZXggZDcwMGUwMy4uZmJiYmQwOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgKQEAgLTMwLDYgKzMwLDcgQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjIvSUNhbWVyYURldmljZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjIvSUNhbWVyYURldmljZVNlc3Npb24uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy4zL0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KICNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhMy5oPgpAQCAtMTE3LDIwICsxMTgsMTggQEAKICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCiAgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsCiAgICAgICAgICAgICBpbnQgc3RyZWFtU2V0SWQgPSBjYW1lcmEzOjpDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwKLSAgICAgICAgICAgIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSwgdWludDMyX3QgY29uc3VtZXJVc2FnZSA9IDApIG92ZXJyaWRlOworICAgICAgICAgICAgYm9vbCBpc1NoYXJlZCA9IGZhbHNlLCB1aW50NjRfdCBjb25zdW1lclVzYWdlID0gMCkgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3QgY3JlYXRlU3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzLAogICAgICAgICAgICAgYm9vbCBoYXNEZWZlcnJlZENvbnN1bWVyLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAogICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLAogICAgICAgICAgICAgaW50IHN0cmVhbVNldElkID0gY2FtZXJhMzo6Q0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQsCi0gICAgICAgICAgICBib29sIGlzU2hhcmVkID0gZmFsc2UsIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2UgPSAwKSBvdmVycmlkZTsKKyAgICAgICAgICAgIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSwgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDApIG92ZXJyaWRlOwogCiAgICAgc3RhdHVzX3QgY3JlYXRlSW5wdXRTdHJlYW0oCiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAogICAgICAgICAgICAgaW50ICppZCkgb3ZlcnJpZGU7CiAKLSAgICBzdGF0dXNfdCBnZXRTdHJlYW1JbmZvKGludCBpZCwKLSAgICAgICAgICAgIHVpbnQzMl90ICp3aWR0aCwgdWludDMyX3QgKmhlaWdodCwKLSAgICAgICAgICAgIHVpbnQzMl90ICpmb3JtYXQsIGFuZHJvaWRfZGF0YXNwYWNlICpkYXRhU3BhY2UpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldFN0cmVhbUluZm8oaW50IGlkLCBTdHJlYW1JbmZvICpzdHJlYW1JbmZvKSBvdmVycmlkZTsKICAgICBzdGF0dXNfdCBzZXRTdHJlYW1UcmFuc2Zvcm0oaW50IGlkLCBpbnQgdHJhbnNmb3JtKSBvdmVycmlkZTsKIAogICAgIHN0YXR1c190IGRlbGV0ZVN0cmVhbShpbnQgaWQpIG92ZXJyaWRlOwpAQCAtMjcxLDcgKzI3MCw2IEBACiAgICAgICAgIHZvaWQgZ2V0SW5mbGlnaHRCdWZmZXJLZXlzKHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4qIG91dCk7CiAKICAgICAgIHByaXZhdGU6Ci0gICAgICAgIGNhbWVyYTNfZGV2aWNlX3QgKm1IYWwzRGV2aWNlOwogICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBtSGlkbFNlc3Npb247CiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4gbVJlcXVlc3RNZXRhZGF0YVF1ZXVlOwogCkBAIC01OTAsNyArNTg4LDcgQEAKICAgICBzdGF0aWMgaGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IG1hcFRvUGl4ZWxGb3JtYXQoaW50IGZyYW1ld29ya0Zvcm1hdCk7CiAgICAgc3RhdGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6RGF0YXNwYWNlRmxhZ3MgbWFwVG9IaWRsRGF0YXNwYWNlKAogICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlKTsKLSAgICBzdGF0aWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIG1hcFRvQ29uc3VtZXJVc2FnZSh1aW50MzJfdCB1c2FnZSk7CisgICAgc3RhdGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyVXNhZ2VGbGFncyBtYXBUb0NvbnN1bWVyVXNhZ2UodWludDY0X3QgdXNhZ2UpOwogICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbVJvdGF0aW9uIG1hcFRvU3RyZWFtUm90YXRpb24oCiAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uKTsKICAgICAvLyBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpZiB0aGUgcGFzc2VkLWluIG9wZXJhdGlvbiBtb2RlIGlzIG5vdCB2YWxpZC4KQEAgLTU5OCw5ICs1OTYsMTEgQEAKICAgICAgICAgICAgIC8qb3V0Ki8gaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZSAqbW9kZSk7CiAgICAgc3RhdGljIGNhbWVyYTNfYnVmZmVyX3N0YXR1c190IG1hcEhpZGxCdWZmZXJTdGF0dXMoaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJTdGF0dXMgc3RhdHVzKTsKICAgICBzdGF0aWMgaW50IG1hcFRvRnJhbWV3b3JrRm9ybWF0KGhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdCBwaXhlbEZvcm1hdCk7Ci0gICAgc3RhdGljIHVpbnQzMl90IG1hcENvbnN1bWVyVG9GcmFtZXdvcmtVc2FnZSgKKyAgICBzdGF0aWMgYW5kcm9pZF9kYXRhc3BhY2UgbWFwVG9GcmFtZXdvcmtEYXRhc3BhY2UoCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkRhdGFzcGFjZUZsYWdzKTsKKyAgICBzdGF0aWMgdWludDY0X3QgbWFwQ29uc3VtZXJUb0ZyYW1ld29ya1VzYWdlKAogICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKTsKLSAgICBzdGF0aWMgdWludDMyX3QgbWFwUHJvZHVjZXJUb0ZyYW1ld29ya1VzYWdlKAorICAgIHN0YXRpYyB1aW50NjRfdCBtYXBQcm9kdWNlclRvRnJhbWV3b3JrVXNhZ2UoCiAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclVzYWdlRmxhZ3MgdXNhZ2UpOwogCiAgICAgc3RydWN0IFJlcXVlc3RUcmlnZ2VyIHsKQEAgLTg4Niw2ICs4ODYsMTEgQEAKICAgICAgICAgLy8gRm9yIGF1dG8tZXhwb3N1cmUgbW9kZXMsIGVxdWFsIHRvIDEvKGxvd2VyIGVuZCBvZiB0YXJnZXQgRlBTIHJhbmdlKQogICAgICAgICBuc2Vjc190IG1heEV4cGVjdGVkRHVyYXRpb247CiAKKyAgICAgICAgLy8gV2hldGhlciB0aGUgcmVzdWx0IG1ldGFkYXRhIGZvciB0aGlzIHJlcXVlc3QgaXMgdG8gYmUgc2tpcHBlZC4gVGhlCisgICAgICAgIC8vIHJlc3VsdCBtZXRhZGF0YSBzaG91bGQgYmUgc2tpcHBlZCBpbiB0aGUgY2FzZSBvZgorICAgICAgICAvLyBSRVFVRVNUL1JFU1VMVCBlcnJvci4KKyAgICAgICAgYm9vbCBza2lwUmVzdWx0TWV0YWRhdGE7CisKICAgICAgICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciBuZWVkZWQgYnkgS2V5ZWRWZWN0b3IKICAgICAgICAgSW5GbGlnaHRSZXF1ZXN0KCkgOgogICAgICAgICAgICAgICAgIHNodXR0ZXJUaW1lc3RhbXAoMCksCkBAIC04OTUsNyArOTAwLDggQEAKICAgICAgICAgICAgICAgICBudW1CdWZmZXJzTGVmdCgwKSwKICAgICAgICAgICAgICAgICBoYXNJbnB1dEJ1ZmZlcihmYWxzZSksCiAgICAgICAgICAgICAgICAgaGFzQ2FsbGJhY2sodHJ1ZSksCi0gICAgICAgICAgICAgICAgbWF4RXhwZWN0ZWREdXJhdGlvbihrRGVmYXVsdEV4cGVjdGVkRHVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBtYXhFeHBlY3RlZER1cmF0aW9uKGtEZWZhdWx0RXhwZWN0ZWREdXJhdGlvbiksCisgICAgICAgICAgICAgICAgc2tpcFJlc3VsdE1ldGFkYXRhKGZhbHNlKSB7CiAgICAgICAgIH0KIAogICAgICAgICBJbkZsaWdodFJlcXVlc3QoaW50IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgZXh0cmFzLCBib29sIGhhc0lucHV0LApAQCAtOTA4LDcgKzkxNCw4IEBACiAgICAgICAgICAgICAgICAgcmVzdWx0RXh0cmFzKGV4dHJhcyksCiAgICAgICAgICAgICAgICAgaGFzSW5wdXRCdWZmZXIoaGFzSW5wdXQpLAogICAgICAgICAgICAgICAgIGhhc0NhbGxiYWNrKGhhc0FwcENhbGxiYWNrKSwKLSAgICAgICAgICAgICAgICBtYXhFeHBlY3RlZER1cmF0aW9uKG1heER1cmF0aW9uKSB7CisgICAgICAgICAgICAgICAgbWF4RXhwZWN0ZWREdXJhdGlvbihtYXhEdXJhdGlvbiksCisgICAgICAgICAgICAgICAgc2tpcFJlc3VsdE1ldGFkYXRhKGZhbHNlKSB7CiAgICAgICAgIH0KICAgICB9OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAKaW5kZXggOWM5NTFiNy4uNmUyOTc4ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcApAQCAtOTUsNyArOTUsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0R1bW15U3RyZWFtOjpnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSkgY29uc3Qgeworc3RhdHVzX3QgQ2FtZXJhM0R1bW15U3RyZWFtOjpnZXRFbmRwb2ludFVzYWdlKHVpbnQ2NF90ICp1c2FnZSkgY29uc3QgewogICAgICp1c2FnZSA9IERVTU1ZX1VTQUdFOwogICAgIHJldHVybiBPSzsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oCmluZGV4IDM1YTZhMTguLjQ5MmZiNDkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaApAQCAtOTQsNyArOTQsNyBAQAogICAgIHN0YXRpYyBjb25zdCBpbnQgRFVNTVlfRk9STUFUID0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOwogICAgIHN0YXRpYyBjb25zdCBhbmRyb2lkX2RhdGFzcGFjZSBEVU1NWV9EQVRBU1BBQ0UgPSBIQUxfREFUQVNQQUNFX1VOS05PV047CiAgICAgc3RhdGljIGNvbnN0IGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3QgRFVNTVlfUk9UQVRJT04gPSBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wOwotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBEVU1NWV9VU0FHRSA9IEdSQUxMT0NfVVNBR0VfSFdfQ09NUE9TRVI7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IERVTU1ZX1VTQUdFID0gR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUjsKIAogICAgIC8qKgogICAgICAqIEludGVybmFsIENhbWVyYTNTdHJlYW0gaW50ZXJmYWNlCkBAIC0xMDcsNyArMTA3LDcgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlUXVldWVMb2NrZWQoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50NjRfdCAqdXNhZ2UpIGNvbnN0OwogCiB9OyAvLyBjbGFzcyBDYW1lcmEzRHVtbXlTdHJlYW0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAKaW5kZXggN2FkMjMwMC4uYTUyNDIyZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwCkBAIC02OSw3ICs2OSw3IEBACiAgICAgKHZvaWQpIGFyZ3M7CiAgICAgU3RyaW5nOCBsaW5lczsKIAotICAgIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2UgPSAwOworICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UgPSAwOwogICAgIHN0YXR1c190IHJlcyA9IGdldEVuZHBvaW50VXNhZ2UoJmNvbnN1bWVyVXNhZ2UpOwogICAgIGlmIChyZXMgIT0gT0spIGNvbnN1bWVyVXNhZ2UgPSAwOwogCkBAIC03OCw4ICs3OCw4IEBACiAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbTo6d2lkdGgsIGNhbWVyYTNfc3RyZWFtOjpoZWlnaHQsCiAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbTo6Zm9ybWF0LCBjYW1lcmEzX3N0cmVhbTo6ZGF0YV9zcGFjZSk7CiAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBNYXggc2l6ZTogJXp1XG4iLCBtTWF4U2l6ZSk7Ci0gICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBDb21iaW5lZCB1c2FnZTogJWQsIG1heCBIQUwgYnVmZmVyczogJWRcbiIsCi0gICAgICAgICAgICBjYW1lcmEzX3N0cmVhbTo6dXNhZ2UgfCBjb25zdW1lclVzYWdlLCBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMpOworICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgQ29tYmluZWQgdXNhZ2U6ICUiIFBSSXU2NCAiLCBtYXggSEFMIGJ1ZmZlcnM6ICVkXG4iLAorICAgICAgICAgICAgbVVzYWdlIHwgY29uc3VtZXJVc2FnZSwgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKTsKICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIEZyYW1lcyBwcm9kdWNlZDogJWQsIGxhc3QgdGltZXN0YW1wOiAlIiBQUklkNjQgIiBuc1xuIiwKICAgICAgICAgICAgIG1GcmFtZUNvdW50LCBtTGFzdFRpbWVzdGFtcCk7CiAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBUb3RhbCBidWZmZXJzOiAlenUsIGN1cnJlbnRseSBkZXF1ZXVlZDogJXp1XG4iLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaAppbmRleCAzNWRkYTM5Li4yMzc2MDU4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaApAQCAtODUsNyArODUsNyBAQAogCiAgICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0SW5wdXRCdWZmZXJDb3VudExvY2tlZCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50NjRfdCAqdXNhZ2UpIGNvbnN0ID0gMDsKIAogICAgIHN0YXR1c190IGdldEJ1ZmZlclByZWNvbmRpdGlvbkNoZWNrTG9ja2VkKCkgY29uc3Q7CiAgICAgc3RhdHVzX3QgcmV0dXJuQnVmZmVyUHJlY29uZGl0aW9uQ2hlY2tMb2NrZWQoKSBjb25zdDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcAppbmRleCBmZjJkY2VmLi4yY2IxZWE3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCkBAIC0yNTgsNyArMjU4LDcgQEAKICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycyA6IG1pbkJ1ZnM7CiAgICAgICAgIC8vIFRPRE86IHNvbWVob3cgc2V0IHRoZSB0b3RhbCBidWZmZXIgY291bnQgd2hlbiBwcm9kdWNlciBjb25uZWN0cz8KIAotICAgICAgICBtQ29uc3VtZXIgPSBuZXcgQnVmZmVySXRlbUNvbnN1bWVyKGNvbnN1bWVyLCBjYW1lcmEzX3N0cmVhbTo6dXNhZ2UsCisgICAgICAgIG1Db25zdW1lciA9IG5ldyBCdWZmZXJJdGVtQ29uc3VtZXIoY29uc3VtZXIsIG1Vc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG90YWxCdWZmZXJDb3VudCk7CiAgICAgICAgIG1Db25zdW1lci0+c2V0TmFtZShTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYTMtSW5wdXRTdHJlYW0tJWQiLCBtSWQpKTsKIApAQCAtMjg0LDcgKzI4NCw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzSW5wdXRTdHJlYW06OmdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSBjb25zdCB7CitzdGF0dXNfdCBDYW1lcmEzSW5wdXRTdHJlYW06OmdldEVuZHBvaW50VXNhZ2UodWludDY0X3QgKnVzYWdlKSBjb25zdCB7CiAgICAgLy8gUGVyIEhBTDMgc3BlYywgaW5wdXQgc3RyZWFtcyBoYXZlIDAgZm9yIHRoZWlyIGluaXRpYWwgdXNhZ2UgZmllbGQuCiAgICAgKnVzYWdlID0gMDsKICAgICByZXR1cm4gT0s7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaAppbmRleCA4ZjViNDMxLi44MTIyNmY4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKQEAgLTc2LDcgKzc2LDcgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlUXVldWVMb2NrZWQoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50NjRfdCAqdXNhZ2UpIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogQnVmZmVySXRlbUNvbnN1bWVyOjpCdWZmZXJGcmVlZExpc3RlbmVyIGludGVyZmFjZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAKaW5kZXggYjAyY2Q2YS4uZGNhZWZlMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwCkBAIC05MCw3ICs5MCw3IEBACiAKIENhbWVyYTNPdXRwdXRTdHJlYW06OkNhbWVyYTNPdXRwdXRTdHJlYW0oaW50IGlkLAogICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAotICAgICAgICB1aW50MzJfdCBjb25zdW1lclVzYWdlLCBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsCisgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwKICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsIGludCBzZXRJZCkgOgogICAgICAgICBDYW1lcmEzSU9TdHJlYW1CYXNlKGlkLCBDQU1FUkEzX1NUUkVBTV9PVVRQVVQsIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXhTaXplKi8wLCBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sIHNldElkKSwKQEAgLTExMSw3ICsxMTEsOCBAQAogICAgIC8vIFNhbml0eSBjaGVjayBmb3IgdGhlIGNvbnN1bWVyIHVzYWdlIGZsYWcuCiAgICAgaWYgKChjb25zdW1lclVzYWdlICYgR3JhcGhpY0J1ZmZlcjo6VVNBR0VfSFdfVEVYVFVSRSkgPT0gMCAmJgogICAgICAgICAgICAgKGNvbnN1bWVyVXNhZ2UgJiBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19DT01QT1NFUikgPT0gMCkgewotICAgICAgICBBTE9HRSgiJXM6IERlZmVycmVkIGNvbnN1bWVyIHVzYWdlIGZsYWcgaXMgaWxsZWdhbCAoMHgleCkhIiwgX19GVU5DVElPTl9fLCBjb25zdW1lclVzYWdlKTsKKyAgICAgICAgQUxPR0UoIiVzOiBEZWZlcnJlZCBjb25zdW1lciB1c2FnZSBmbGFnIGlzIGlsbGVnYWwgJSIgUFJJdTY0ICIhIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjb25zdW1lclVzYWdlKTsKICAgICAgICAgbVN0YXRlID0gU1RBVEVfRVJST1I7CiAgICAgfQogCkBAIC0xMjcsNyArMTI4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb25zdW1lclVzYWdlLCBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXRJZCkgOgogICAgICAgICBDYW1lcmEzSU9TdHJlYW1CYXNlKGlkLCB0eXBlLCB3aWR0aCwgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWF4U2l6ZSovMCwKQEAgLTM2NSwxMCArMzY2LDEwIEBACiAKICAgICBtQ29uc3VtZXJOYW1lID0gbUNvbnN1bWVyLT5nZXRDb25zdW1lck5hbWUoKTsKIAotICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X3VzYWdlKG1Db25zdW1lci5nZXQoKSwgY2FtZXJhM19zdHJlYW06OnVzYWdlKTsKKyAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF91c2FnZShtQ29uc3VtZXIuZ2V0KCksIG1Vc2FnZSk7CiAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgdXNhZ2UgJTA4eCBmb3Igc3RyZWFtICVkIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYTNfc3RyZWFtOjp1c2FnZSwgbUlkKTsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29uZmlndXJlIHVzYWdlICUiIFBSSXU2NCAiIGZvciBzdHJlYW0gJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVVzYWdlLCBtSWQpOwogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIApAQCAtNDYxLDExICs0NjIsMTEgQEAKICAgICAgKiBIQUwzLjIgZGV2aWNlcyBtYXkgbm90IHN1cHBvcnQgdGhlIGR5bmFtaWMgYnVmZmVyIHJlZ2lzdGVyYXRpb24uCiAgICAgICovCiAgICAgaWYgKG1CdWZmZXJNYW5hZ2VyICE9IDAgJiYgbVNldElkID4gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQpIHsKLSAgICAgICAgdWludDMyX3QgY29uc3VtZXJVc2FnZSA9IDA7CisgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UgPSAwOwogICAgICAgICBnZXRFbmRwb2ludFVzYWdlKCZjb25zdW1lclVzYWdlKTsKICAgICAgICAgU3RyZWFtSW5mbyBzdHJlYW1JbmZvKAogICAgICAgICAgICAgICAgIGdldElkKCksIGdldFN0cmVhbVNldElkKCksIGdldFdpZHRoKCksIGdldEhlaWdodCgpLCBnZXRGb3JtYXQoKSwgZ2V0RGF0YVNwYWNlKCksCi0gICAgICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06OnVzYWdlIHwgY29uc3VtZXJVc2FnZSwgbVRvdGFsQnVmZmVyQ291bnQsCisgICAgICAgICAgICAgICAgbVVzYWdlIHwgY29uc3VtZXJVc2FnZSwgbVRvdGFsQnVmZmVyQ291bnQsCiAgICAgICAgICAgICAgICAgLyppc0NvbmZpZ3VyZWQqL3RydWUpOwogICAgICAgICB3cDxDYW1lcmEzT3V0cHV0U3RyZWFtPiB3ZWFrVGhpcyh0aGlzKTsKICAgICAgICAgcmVzID0gbUJ1ZmZlck1hbmFnZXItPnJlZ2lzdGVyU3RyZWFtKHdlYWtUaGlzLApAQCAtNjI4LDcgKzYyOSw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSkgY29uc3Qgeworc3RhdHVzX3QgQ2FtZXJhM091dHB1dFN0cmVhbTo6Z2V0RW5kcG9pbnRVc2FnZSh1aW50NjRfdCAqdXNhZ2UpIGNvbnN0IHsKIAogICAgIHN0YXR1c190IHJlczsKIApAQCAtNjQzLDE0ICs2NDQsMTIgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpnZXRFbmRwb2ludFVzYWdlRm9yU3VyZmFjZSh1aW50MzJfdCAqdXNhZ2UsCitzdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpnZXRFbmRwb2ludFVzYWdlRm9yU3VyZmFjZSh1aW50NjRfdCAqdXNhZ2UsCiAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKSBjb25zdCB7CiAgICAgc3RhdHVzX3QgcmVzOwotICAgIGludDMyX3QgdSA9IDA7CisgICAgdWludDY0X3QgdSA9IDA7CiAKLSAgICByZXMgPSBzdGF0aWNfY2FzdDxBTmF0aXZlV2luZG93Kj4oc3VyZmFjZS5nZXQoKSktPnF1ZXJ5KHN1cmZhY2UuZ2V0KCksCi0gICAgICAgICAgICBOQVRJVkVfV0lORE9XX0NPTlNVTUVSX1VTQUdFX0JJVFMsICZ1KTsKLQorICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfZ2V0X2NvbnN1bWVyX3VzYWdlKHN0YXRpY19jYXN0PEFOYXRpdmVXaW5kb3cqPihzdXJmYWNlLmdldCgpKSwgJnUpOwogICAgIC8vIElmIGFuIG9wYXF1ZSBvdXRwdXQgc3RyZWFtJ3MgZW5kcG9pbnQgaXMgSW1hZ2VSZWFkZXIsIGFkZAogICAgIC8vIEdSQUxMT0NfVVNBR0VfSFdfQ0FNRVJBX1pTTCB0byB0aGUgdXNhZ2Ugc28gSEFMIGtub3dzIGl0IHdpbGwgYmUgdXNlZAogICAgIC8vIGZvciB0aGUgWlNMIHVzZSBjYXNlLgpAQCAtNjcwLDcgKzY2OSw3IEBACiB9CiAKIGJvb2wgQ2FtZXJhM091dHB1dFN0cmVhbTo6aXNWaWRlb1N0cmVhbSgpIGNvbnN0IHsKLSAgICB1aW50MzJfdCB1c2FnZSA9IDA7CisgICAgdWludDY0X3QgdXNhZ2UgPSAwOwogICAgIHN0YXR1c190IHJlcyA9IGdldEVuZHBvaW50VXNhZ2UoJnVzYWdlKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogZ2V0dGluZyBlbmQgcG9pbnQgdXNhZ2UgZmFpbGVkOiAlcyAoJWQpLiIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC04MTMsNyArODEyLDcgQEAKIH0KIAogYm9vbCBDYW1lcmEzT3V0cHV0U3RyZWFtOjppc0NvbnN1bWVkQnlIV0NvbXBvc2VyKCkgY29uc3QgewotICAgIHVpbnQzMl90IHVzYWdlID0gMDsKKyAgICB1aW50NjRfdCB1c2FnZSA9IDA7CiAgICAgc3RhdHVzX3QgcmVzID0gZ2V0RW5kcG9pbnRVc2FnZSgmdXNhZ2UpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBnZXR0aW5nIGVuZCBwb2ludCB1c2FnZSBmYWlsZWQ6ICVzICglZCkuIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTgyNCw3ICs4MjMsNyBAQAogfQogCiBib29sIENhbWVyYTNPdXRwdXRTdHJlYW06OmlzQ29uc3VtZWRCeUhXVGV4dHVyZSgpIGNvbnN0IHsKLSAgICB1aW50MzJfdCB1c2FnZSA9IDA7CisgICAgdWludDY0X3QgdXNhZ2UgPSAwOwogICAgIHN0YXR1c190IHJlcyA9IGdldEVuZHBvaW50VXNhZ2UoJnVzYWdlKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogZ2V0dGluZyBlbmQgcG9pbnQgdXNhZ2UgZmFpbGVkOiAlcyAoJWQpLiIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oCmluZGV4IDk3YWE3ZDQuLjcwMjNkNWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oCkBAIC00NCw3ICs0NCw3IEBACiAgICAgdWludDMyX3QgaGVpZ2h0OwogICAgIHVpbnQzMl90IGZvcm1hdDsKICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2U7Ci0gICAgdWludDMyX3QgY29tYmluZWRVc2FnZTsKKyAgICB1aW50NjRfdCBjb21iaW5lZFVzYWdlOwogICAgIHNpemVfdCB0b3RhbEJ1ZmZlckNvdW50OwogICAgIGJvb2wgaXNDb25maWd1cmVkOwogICAgIGV4cGxpY2l0IFN0cmVhbUluZm8oaW50IGlkID0gQ0FNRVJBM19TVFJFQU1fSURfSU5WQUxJRCwKQEAgLTUzLDcgKzUzLDcgQEAKICAgICAgICAgICAgIHVpbnQzMl90IGggPSAwLAogICAgICAgICAgICAgdWludDMyX3QgZm10ID0gMCwKICAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRzID0gSEFMX0RBVEFTUEFDRV9VTktOT1dOLAotICAgICAgICAgICAgdWludDMyX3QgdXNhZ2UgPSAwLAorICAgICAgICAgICAgdWludDY0X3QgdXNhZ2UgPSAwLAogICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlckNvdW50ID0gMCwKICAgICAgICAgICAgIGJvb2wgY29uZmlndXJlZCA9IGZhbHNlKSA6CiAgICAgICAgICAgICAgICAgc3RyZWFtSWQoaWQpLApAQCAtMTAxLDcgKzEwMSw3IEBACiAgICAgICogc3RyZWFtIHNldCBpZCBuZWVkcyB0byBiZSBzZXQgdG8gc3VwcG9ydCBidWZmZXIgc2hhcmluZyBiZXR3ZWVuIG11bHRpcGxlIHN0cmVhbXMuCiAgICAgICovCiAgICAgQ2FtZXJhM091dHB1dFN0cmVhbShpbnQgaWQsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCi0gICAgICAgICAgICB1aW50MzJfdCBjb25zdW1lclVzYWdlLCBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsCisgICAgICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsCiAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwKICAgICAgICAgICAgIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElEKTsKIApAQCAtMTc2LDcgKzE3Niw3IEBACiAgICAgQ2FtZXJhM091dHB1dFN0cmVhbShpbnQgaWQsIGNhbWVyYTNfc3RyZWFtX3R5cGVfdCB0eXBlLAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKICAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwKLSAgICAgICAgICAgIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2UgPSAwLCBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCA9IDAsCisgICAgICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlID0gMCwgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQgPSAwLAogICAgICAgICAgICAgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQpOwogCiAgICAgLyoqCkBAIC0xOTEsMTQgKzE5MSwxNCBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjb25uZWN0TG9ja2VkKCk7CiAKLSAgICBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlRm9yU3VyZmFjZSh1aW50MzJfdCAqdXNhZ2UsCisgICAgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZUZvclN1cmZhY2UodWludDY0X3QgKnVzYWdlLAogICAgICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpIGNvbnN0OwogICAgIHN0YXR1c190IGNvbmZpZ3VyZUNvbnN1bWVyUXVldWVMb2NrZWQoKTsKIAogICAgIC8vIENvbnN1bWVyIGFzIHRoZSBvdXRwdXQgb2YgY2FtZXJhIEhBTAogICAgIHNwPFN1cmZhY2U+IG1Db25zdW1lcjsKIAotICAgIHVpbnQzMl90IGdldFByZXNldENvbnN1bWVyVXNhZ2UoKSBjb25zdCB7IHJldHVybiBtQ29uc3VtZXJVc2FnZTsgfQorICAgIHVpbnQ2NF90IGdldFByZXNldENvbnN1bWVyVXNhZ2UoKSBjb25zdCB7IHJldHVybiBtQ29uc3VtZXJVc2FnZTsgfQogCiAgICAgc3RhdGljIGNvbnN0IG5zZWNzX3QgICAgICAga0RlcXVldWVCdWZmZXJUaW1lb3V0ICAgPSAxMDAwMDAwMDAwOyAvLyAxIHNlYwogCkBAIC0yNDUsNyArMjQ1LDcgQEAKICAgICAgKiBDb25zdW1lciBlbmQgcG9pbnQgdXNhZ2UgZmxhZyBzZXQgYnkgdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgZGVmZXJyZWQKICAgICAgKiBjb25zdW1lciBjYXNlLgogICAgICAqLwotICAgIHVpbnQzMl90ICAgIG1Db25zdW1lclVzYWdlOworICAgIHVpbnQ2NF90ICAgIG1Db25zdW1lclVzYWdlOwogCiAgICAgLyoqCiAgICAgICogSW50ZXJuYWwgQ2FtZXJhM1N0cmVhbSBpbnRlcmZhY2UKQEAgLTI2Miw3ICsyNjIsNyBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVRdWV1ZUxvY2tlZCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQ2NF90ICp1c2FnZSkgY29uc3Q7CiAKICAgICAvKioKICAgICAgKiBQcml2YXRlIG1ldGhvZHMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwCmluZGV4IDJhZTU2NjAuLjUwNTE3MTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcApAQCAtMjMsNyArMjMsNyBAQAogQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6Q2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbShpbnQgaWQsCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgc3VyZmFjZXMsCiAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCi0gICAgICAgIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2UsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwKKyAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLAogICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAogICAgICAgICBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwgaW50IHNldElkKSA6CiAgICAgICAgIENhbWVyYTNPdXRwdXRTdHJlYW0oaWQsIENBTUVSQTNfU1RSRUFNX09VVFBVVCwgd2lkdGgsIGhlaWdodCwKQEAgLTQxLDcgKzQxLDcgQEAKIAogICAgIG1TdHJlYW1TcGxpdHRlciA9IG5ldyBDYW1lcmEzU3RyZWFtU3BsaXR0ZXIoKTsKIAotICAgIHVpbnQzMl90IHVzYWdlOworICAgIHVpbnQ2NF90IHVzYWdlOwogICAgIGdldEVuZHBvaW50VXNhZ2UoJnVzYWdlKTsKIAogICAgIHJlcyA9IG1TdHJlYW1TcGxpdHRlci0+Y29ubmVjdChtU3VyZmFjZXMsIHVzYWdlLCBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMsICZtQ29uc3VtZXIpOwpAQCAtMTkxLDEwICsxOTEsMTAgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSkgY29uc3Qgeworc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6Z2V0RW5kcG9pbnRVc2FnZSh1aW50NjRfdCAqdXNhZ2UpIGNvbnN0IHsKIAogICAgIHN0YXR1c190IHJlcyA9IE9LOwotICAgIHVpbnQzMl90IHUgPSAwOworICAgIHVpbnQ2NF90IHUgPSAwOwogCiAgICAgaWYgKG1Db25zdW1lciA9PSBudWxscHRyKSB7CiAgICAgICAgIC8vIENhbGxlZCBiZWZvcmUgc2hhcmVkIGJ1ZmZlciBxdWV1ZSBpcyBjb25zdHJ1Y3RlZC4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmgKaW5kZXggN2JlMDk0MC4uMjJiYjJmYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmgKQEAgLTM0LDcgKzM0LDcgQEAKICAgICAgKi8KICAgICBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtKGludCBpZCwgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBzdXJmYWNlcywKICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCi0gICAgICAgICAgICB1aW50MzJfdCBjb25zdW1lclVzYWdlLCBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsCisgICAgICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsCiAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwKICAgICAgICAgICAgIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElEKTsKIApAQCAtNzQsNyArNzQsNyBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjb25uZWN0TG9ja2VkKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVuZHBvaW50VXNhZ2UodWludDY0X3QgKnVzYWdlKSBjb25zdDsKIAogfTsgLy8gY2xhc3MgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcAppbmRleCA5ZTZhYzc5Li5mYmU4ZjRmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAKQEAgLTU2LDEyICs1NiwxNSBAQAogICAgIG1TdGF0ZShTVEFURV9DT05TVFJVQ1RFRCksCiAgICAgbVN0YXR1c0lkKFN0YXR1c1RyYWNrZXI6Ok5PX1NUQVRVU19JRCksCiAgICAgbVN0cmVhbVVucHJlcGFyYWJsZSh0cnVlKSwKKyAgICBtVXNhZ2UoMCksCiAgICAgbU9sZFVzYWdlKDApLAogICAgIG1PbGRNYXhCdWZmZXJzKDApLAogICAgIG1QcmVwYXJlZChmYWxzZSksCiAgICAgbVByZXBhcmVkQnVmZmVySWR4KDApLAogICAgIG1MYXN0TWF4Q291bnQoQ2FtZXJhM1N0cmVhbUludGVyZmFjZTo6QUxMT0NBVEVfUElQRUxJTkVfTUFYKSwKLSAgICBtQnVmZmVyTGltaXRMYXRlbmN5KGtCdWZmZXJMaW1pdExhdGVuY3lCaW5TaXplKSB7CisgICAgbUJ1ZmZlckxpbWl0TGF0ZW5jeShrQnVmZmVyTGltaXRMYXRlbmN5QmluU2l6ZSksCisgICAgbUZvcm1hdE92ZXJyaWRkZW4oZmFsc2UpLAorICAgIG1PcmlnaW5hbEZvcm1hdCgtMSkgewogCiAgICAgY2FtZXJhM19zdHJlYW06OnN0cmVhbV90eXBlID0gdHlwZTsKICAgICBjYW1lcmEzX3N0cmVhbTo6d2lkdGggPSB3aWR0aDsKQEAgLTY5LDcgKzcyLDYgQEAKICAgICBjYW1lcmEzX3N0cmVhbTo6Zm9ybWF0ID0gZm9ybWF0OwogICAgIGNhbWVyYTNfc3RyZWFtOjpkYXRhX3NwYWNlID0gZGF0YVNwYWNlOwogICAgIGNhbWVyYTNfc3RyZWFtOjpyb3RhdGlvbiA9IHJvdGF0aW9uOwotICAgIGNhbWVyYTNfc3RyZWFtOjp1c2FnZSA9IDA7CiAgICAgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzID0gMDsKICAgICBjYW1lcmEzX3N0cmVhbTo6cHJpdiA9IE5VTEw7CiAKQEAgLTEwNCw2ICsxMDYsNDAgQEAKICAgICByZXR1cm4gY2FtZXJhM19zdHJlYW06OmRhdGFfc3BhY2U7CiB9CiAKK3VpbnQ2NF90IENhbWVyYTNTdHJlYW06OmdldFVzYWdlKCkgY29uc3QgeworICAgIHJldHVybiBtVXNhZ2U7Cit9CisKK3ZvaWQgQ2FtZXJhM1N0cmVhbTo6c2V0VXNhZ2UodWludDY0X3QgdXNhZ2UpIHsKKyAgICBtVXNhZ2UgPSB1c2FnZTsKK30KKwordm9pZCBDYW1lcmEzU3RyZWFtOjpzZXRGb3JtYXRPdmVycmlkZShib29sIGZvcm1hdE92ZXJyaWRkZW4pIHsKKyAgICBtRm9ybWF0T3ZlcnJpZGRlbiA9IGZvcm1hdE92ZXJyaWRkZW47CisgICAgaWYgKGZvcm1hdE92ZXJyaWRkZW4pIG1PcmlnaW5hbEZvcm1hdCA9IGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQ7Cit9CisKK2Jvb2wgQ2FtZXJhM1N0cmVhbTo6aXNGb3JtYXRPdmVycmlkZGVuKCkgY29uc3QgeworICAgIHJldHVybiBtRm9ybWF0T3ZlcnJpZGRlbjsKK30KKworaW50IENhbWVyYTNTdHJlYW06OmdldE9yaWdpbmFsRm9ybWF0KCkgY29uc3QgeworICAgIHJldHVybiBtT3JpZ2luYWxGb3JtYXQ7Cit9CisKK3ZvaWQgQ2FtZXJhM1N0cmVhbTo6c2V0RGF0YVNwYWNlT3ZlcnJpZGUoYm9vbCBkYXRhU3BhY2VPdmVycmlkZGVuKSB7CisgICAgbURhdGFTcGFjZU92ZXJyaWRkZW4gPSBkYXRhU3BhY2VPdmVycmlkZGVuOworICAgIGlmIChkYXRhU3BhY2VPdmVycmlkZGVuKSBtT3JpZ2luYWxEYXRhU3BhY2UgPSBjYW1lcmEzX3N0cmVhbTo6ZGF0YV9zcGFjZTsKK30KKworYm9vbCBDYW1lcmEzU3RyZWFtOjppc0RhdGFTcGFjZU92ZXJyaWRkZW4oKSBjb25zdCB7CisgICAgcmV0dXJuIG1EYXRhU3BhY2VPdmVycmlkZGVuOworfQorCithbmRyb2lkX2RhdGFzcGFjZSBDYW1lcmEzU3RyZWFtOjpnZXRPcmlnaW5hbERhdGFTcGFjZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU9yaWdpbmFsRGF0YVNwYWNlOworfQorCiBjYW1lcmEzX3N0cmVhbSogQ2FtZXJhM1N0cmVhbTo6c3RhcnRDb25maWd1cmF0aW9uKCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwpAQCAtMTMzLDEwICsxNjksMTAgQEAKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIG1PbGRVc2FnZSA9IGNhbWVyYTNfc3RyZWFtOjp1c2FnZTsKKyAgICBtT2xkVXNhZ2UgPSBtVXNhZ2U7CiAgICAgbU9sZE1heEJ1ZmZlcnMgPSBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnM7CiAKLSAgICByZXMgPSBnZXRFbmRwb2ludFVzYWdlKCYoY2FtZXJhM19zdHJlYW06OnVzYWdlKSk7CisgICAgcmVzID0gZ2V0RW5kcG9pbnRVc2FnZSgmbVVzYWdlKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IHF1ZXJ5IGNvbnN1bWVyIGVuZHBvaW50IHVzYWdlISIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKQEAgLTE5Nyw3ICsyMzMsNyBAQAogICAgIC8vIENoZWNrIGlmIHRoZSBzdHJlYW0gY29uZmlndXJhdGlvbiBpcyB1bmNoYW5nZWQsIGFuZCBza2lwIHJlYWxsb2NhdGlvbiBpZgogICAgIC8vIHNvLiBBcyBkb2N1bWVudGVkIGluIGhhcmR3YXJlL2NhbWVyYTMuaDpjb25maWd1cmVfc3RyZWFtcygpLgogICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfSU5fUkVDT05GSUcgJiYKLSAgICAgICAgICAgIG1PbGRVc2FnZSA9PSBjYW1lcmEzX3N0cmVhbTo6dXNhZ2UgJiYKKyAgICAgICAgICAgIG1PbGRVc2FnZSA9PSBtVXNhZ2UgJiYKICAgICAgICAgICAgIG1PbGRNYXhCdWZmZXJzID09IGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycykgewogICAgICAgICBtU3RhdGUgPSBTVEFURV9DT05GSUdVUkVEOwogICAgICAgICByZXR1cm4gT0s7CkBAIC0yNDMsNyArMjc5LDcgQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBjYW1lcmEzX3N0cmVhbTo6dXNhZ2UgPSBtT2xkVXNhZ2U7CisgICAgbVVzYWdlID0gbU9sZFVzYWdlOwogICAgIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycyA9IG1PbGRNYXhCdWZmZXJzOwogCiAgICAgbVN0YXRlID0gKG1TdGF0ZSA9PSBTVEFURV9JTl9SRUNPTkZJRykgPyBTVEFURV9DT05GSUdVUkVEIDogU1RBVEVfQ09OU1RSVUNURUQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oCmluZGV4IDQ0ZmU2YjYuLjZlNzkxMmUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oCkBAIC0xNDQsNiArMTQ0LDE0IEBACiAgICAgdWludDMyX3QgICAgICAgICAgZ2V0SGVpZ2h0KCkgY29uc3Q7CiAgICAgaW50ICAgICAgICAgICAgICAgZ2V0Rm9ybWF0KCkgY29uc3Q7CiAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZ2V0RGF0YVNwYWNlKCkgY29uc3Q7CisgICAgdWludDY0X3QgICAgICAgICAgZ2V0VXNhZ2UoKSBjb25zdDsKKyAgICB2b2lkICAgICAgICAgICAgICBzZXRVc2FnZSh1aW50NjRfdCB1c2FnZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgc2V0Rm9ybWF0T3ZlcnJpZGUoYm9vbCBmb3JtYXRPdmVycmlkZW4pOworICAgIGJvb2wgICAgICAgICAgICAgIGlzRm9ybWF0T3ZlcnJpZGRlbigpIGNvbnN0OworICAgIGludCAgICAgICAgICAgICAgIGdldE9yaWdpbmFsRm9ybWF0KCkgY29uc3Q7CisgICAgdm9pZCAgICAgICAgICAgICAgc2V0RGF0YVNwYWNlT3ZlcnJpZGUoYm9vbCBkYXRhU3BhY2VPdmVycmlkZW4pOworICAgIGJvb2wgICAgICAgICAgICAgIGlzRGF0YVNwYWNlT3ZlcnJpZGRlbigpIGNvbnN0OworICAgIGFuZHJvaWRfZGF0YXNwYWNlIGdldE9yaWdpbmFsRGF0YVNwYWNlKCkgY29uc3Q7CiAKICAgICBjYW1lcmEzX3N0cmVhbSogICBhc0hhbFN0cmVhbSgpIG92ZXJyaWRlIHsKICAgICAgICAgcmV0dXJuIHRoaXM7CkBAIC00NTksNyArNDY3LDcgQEAKIAogICAgIC8vIEdldCB0aGUgdXNhZ2UgZmxhZ3MgZm9yIHRoZSBvdGhlciBlbmRwb2ludCwgb3IgcmV0dXJuCiAgICAgLy8gSU5WQUxJRF9PUEVSQVRJT04gaWYgdGhleSBjYW5ub3QgYmUgb2J0YWluZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50NjRfdCAqdXNhZ2UpIGNvbnN0ID0gMDsKIAogICAgIC8vIFJldHVybiB3aGV0aGVyIHRoZSBidWZmZXIgaXMgaW4gdGhlIGxpc3Qgb2Ygb3V0c3RhbmRpbmcgYnVmZmVycy4KICAgICBib29sIGlzT3V0c3RhbmRpbmdCdWZmZXIoY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyJiBidWZmZXIpIGNvbnN0OwpAQCAtNDczLDggKzQ4MSwxMCBAQAogICAgIC8vIHByZXBhcmVOZXh0QnVmZmVyIGNhbGxlZCBvbiBpdC4KICAgICBib29sIG1TdHJlYW1VbnByZXBhcmFibGU7CiAKKyAgICB1aW50NjRfdCBtVXNhZ2U7CisKICAgcHJpdmF0ZToKLSAgICB1aW50MzJfdCBtT2xkVXNhZ2U7CisgICAgdWludDY0X3QgbU9sZFVzYWdlOwogICAgIHVpbnQzMl90IG1PbGRNYXhCdWZmZXJzOwogICAgIENvbmRpdGlvbiBtT3V0cHV0QnVmZmVyUmV0dXJuZWRTaWduYWw7CiAgICAgQ29uZGl0aW9uIG1JbnB1dEJ1ZmZlclJldHVybmVkU2lnbmFsOwpAQCAtNTEwLDYgKzUyMCwxNSBAQAogICAgIC8vIG1heF9idWZmZXJzLgogICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtCdWZmZXJMaW1pdExhdGVuY3lCaW5TaXplID0gMzM7IC8vaW4gbXMKICAgICBDYW1lcmFMYXRlbmN5SGlzdG9ncmFtIG1CdWZmZXJMaW1pdExhdGVuY3k7CisKKyAgICAvL0tlZXAgdHJhY2sgb2Ygb3JpZ2luYWwgZm9ybWF0IGluIGNhc2UgaXQgZ2V0cyBvdmVycmlkZGVuCisgICAgYm9vbCBtRm9ybWF0T3ZlcnJpZGRlbjsKKyAgICBpbnQgbU9yaWdpbmFsRm9ybWF0OworCisgICAgLy9LZWVwIHRyYWNrIG9mIG9yaWdpbmFsIGRhdGFTcGFjZSBpbiBjYXNlIGl0IGdldHMgb3ZlcnJpZGRlbgorICAgIGJvb2wgbURhdGFTcGFjZU92ZXJyaWRkZW47CisgICAgYW5kcm9pZF9kYXRhc3BhY2UgbU9yaWdpbmFsRGF0YVNwYWNlOworCiB9OyAvLyBjbGFzcyBDYW1lcmEzU3RyZWFtCiAKIH07IC8vIG5hbWVzcGFjZSBjYW1lcmEzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCmluZGV4IDA1NDRhMWIuLmNjOWJmOGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCkBAIC03MSw2ICs3MSwxMiBAQAogICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0SGVpZ2h0KCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgaW50ICAgICAgZ2V0Rm9ybWF0KCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgYW5kcm9pZF9kYXRhc3BhY2UgZ2V0RGF0YVNwYWNlKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgdm9pZCBzZXRGb3JtYXRPdmVycmlkZShib29sIGZvcm1hdE92ZXJyaWRlbikgPSAwOworICAgIHZpcnR1YWwgYm9vbCBpc0Zvcm1hdE92ZXJyaWRkZW4oKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBpbnQgZ2V0T3JpZ2luYWxGb3JtYXQoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCB2b2lkIHNldERhdGFTcGFjZU92ZXJyaWRlKGJvb2wgZGF0YVNwYWNlT3ZlcnJpZGVuKSA9IDA7CisgICAgdmlydHVhbCBib29sIGlzRGF0YVNwYWNlT3ZlcnJpZGRlbigpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGFuZHJvaWRfZGF0YXNwYWNlIGdldE9yaWdpbmFsRGF0YVNwYWNlKCkgY29uc3QgPSAwOwogCiAgICAgLyoqCiAgICAgICogR2V0IGEgSEFMMyBoYW5kbGUgZm9yIHRoZSBzdHJlYW0sIHdpdGhvdXQgc3RhcnRpbmcgc3RyZWFtIGNvbmZpZ3VyYXRpb24uCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5jcHAKaW5kZXggODY5ZTkzYS4uYTBhNTBjMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcApAQCAtMzksNyArMzksNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdGF0dXNfdCBDYW1lcmEzU3RyZWFtU3BsaXR0ZXI6OmNvbm5lY3QoY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4gPiYgc3VyZmFjZXMsCi0gICAgICAgIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2UsIHNpemVfdCBoYWxNYXhCdWZmZXJzLCBzcDxTdXJmYWNlPiogY29uc3VtZXIpIHsKKyAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgc2l6ZV90IGhhbE1heEJ1ZmZlcnMsIHNwPFN1cmZhY2U+KiBjb25zdW1lcikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKGNvbnN1bWVyID09IG51bGxwdHIpIHsKICAgICAgICAgU1BfTE9HRSgiJXM6IGNvbnN1bWVyIHBvaW50ZXIgaXMgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CkBAIC0xOTUsMTAgKzE5NSw4IEBACiAKICAgICAvLyBTZXQgZGVxdWV1ZUJ1ZmZlci9hdHRhY2hCdWZmZXIgdGltZW91dCBpZiB0aGUgY29uc3VtZXIgaXMgbm90IGh3IGNvbXBvc2VyIG9yIGh3IHRleHR1cmUuCiAgICAgLy8gV2UgbmVlZCBza2lwIHRoZXNlIGNhc2VzIGFzIHRpbWVvdXQgd2lsbCBkaXNhYmxlIHRoZSBub24tYmxvY2tpbmcgKGFzeW5jKSBtb2RlLgotICAgIGludDMyX3QgdXNhZ2UgPSAwOwotICAgIHN0YXRpY19jYXN0PEFOYXRpdmVXaW5kb3cqPihvdXRwdXRRdWV1ZS5nZXQoKSktPnF1ZXJ5KAotICAgICAgICAgICAgb3V0cHV0UXVldWUuZ2V0KCksCi0gICAgICAgICAgICBOQVRJVkVfV0lORE9XX0NPTlNVTUVSX1VTQUdFX0JJVFMsICZ1c2FnZSk7CisgICAgdWludDY0X3QgdXNhZ2UgPSAwOworICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfZ2V0X2NvbnN1bWVyX3VzYWdlKHN0YXRpY19jYXN0PEFOYXRpdmVXaW5kb3cqPihvdXRwdXRRdWV1ZS5nZXQoKSksICZ1c2FnZSk7CiAgICAgaWYgKCEodXNhZ2UgJiAoR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUiB8IEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSkpKSB7CiAgICAgICAgIG91dHB1dFF1ZXVlLT5zZXREZXF1ZXVlVGltZW91dChrRGVxdWV1ZUJ1ZmZlclRpbWVvdXQpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5oCmluZGV4IGNjNjIzZTAuLjNiODgzOWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuaApAQCAtNTIsNyArNTIsNyBAQAogICAgIC8vIENvbm5lY3QgdG8gdGhlIHN0cmVhbSBzcGxpdHRlciBieSBjcmVhdGluZyBidWZmZXIgcXVldWUgYW5kIGNvbm5lY3RpbmcgaXQKICAgICAvLyB3aXRoIG91dHB1dCBzdXJmYWNlcy4KICAgICBzdGF0dXNfdCBjb25uZWN0KGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+ID4mIHN1cmZhY2VzLAotICAgICAgICAgICAgdWludDMyX3QgY29uc3VtZXJVc2FnZSwgc2l6ZV90IGhhbE1heEJ1ZmZlcnMsCisgICAgICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCBzaXplX3QgaGFsTWF4QnVmZmVycywKICAgICAgICAgICAgIHNwPFN1cmZhY2U+KiBjb25zdW1lcik7CiAKICAgICAvLyBhZGRPdXRwdXQgYWRkcyBhbiBvdXRwdXQgQnVmZmVyUXVldWUgdG8gdGhlIHNwbGl0dGVyLiBUaGUgc3BsaXR0ZXIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2d1aS9SaW5nQnVmZmVyQ29uc3VtZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5jcHAKaW5kZXggM2Q1NDQ2MC4uZWUwMThjMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5jcHAKQEAgLTM4LDcgKzM4LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogUmluZ0J1ZmZlckNvbnN1bWVyOjpSaW5nQnVmZmVyQ29uc3VtZXIoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4mIGNvbnN1bWVyLAotICAgICAgICB1aW50MzJfdCBjb25zdW1lclVzYWdlLAorICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLAogICAgICAgICBpbnQgYnVmZmVyQ291bnQpIDoKICAgICBDb25zdW1lckJhc2UoY29uc3VtZXIpLAogICAgIG1CdWZmZXJDb3VudChidWZmZXJDb3VudCksCkBAIC0zNjgsNyArMzY4LDcgQEAKICAgICByZXR1cm4gbUNvbnN1bWVyLT5zZXREZWZhdWx0QnVmZmVyRm9ybWF0KGRlZmF1bHRGb3JtYXQpOwogfQogCi1zdGF0dXNfdCBSaW5nQnVmZmVyQ29uc3VtZXI6OnNldENvbnN1bWVyVXNhZ2UodWludDMyX3QgdXNhZ2UpIHsKK3N0YXR1c190IFJpbmdCdWZmZXJDb25zdW1lcjo6c2V0Q29uc3VtZXJVc2FnZSh1aW50NjRfdCB1c2FnZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTXV0ZXgpOwogICAgIHJldHVybiBtQ29uc3VtZXItPnNldENvbnN1bWVyVXNhZ2VCaXRzKHVzYWdlKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2d1aS9SaW5nQnVmZmVyQ29uc3VtZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2d1aS9SaW5nQnVmZmVyQ29uc3VtZXIuaAppbmRleCAyYmFmZTRhLi5iNzM3NDY5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5oCkBAIC02MCw3ICs2MCw3IEBACiAgICAgLy8gdGhlIGNvbnN1bWVyIHVzYWdlIGZsYWdzIHBhc3NlZCB0byB0aGUgZ3JhcGhpY3MgYWxsb2NhdG9yLiBUaGUKICAgICAvLyBidWZmZXJDb3VudCBwYXJhbWV0ZXIgc3BlY2lmaWVzIGhvdyBtYW55IGJ1ZmZlcnMgY2FuIGJlIHBpbm5lZCBmb3IgdXNlcgogICAgIC8vIGFjY2VzcyBhdCB0aGUgc2FtZSB0aW1lLgotICAgIFJpbmdCdWZmZXJDb25zdW1lcihjb25zdCBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiYgY29uc3VtZXIsIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2UsCisgICAgUmluZ0J1ZmZlckNvbnN1bWVyKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+JiBjb25zdW1lciwgdWludDY0X3QgY29uc3VtZXJVc2FnZSwKICAgICAgICAgICAgIGludCBidWZmZXJDb3VudCk7CiAKICAgICB2aXJ0dWFsIH5SaW5nQnVmZmVyQ29uc3VtZXIoKTsKQEAgLTgwLDcgKzgwLDcgQEAKIAogICAgIC8vIHNldENvbnN1bWVyVXNhZ2UgYWxsb3dzIHRoZSBCdWZmZXJRdWV1ZSBjb25zdW1lciB1c2FnZSB0byBiZQogICAgIC8vIHNldCBhdCBhIGxhdGVyIHRpbWUgYWZ0ZXIgY29uc3RydWN0aW9uLgotICAgIHN0YXR1c190IHNldENvbnN1bWVyVXNhZ2UodWludDMyX3QgdXNhZ2UpOworICAgIHN0YXR1c190IHNldENvbnN1bWVyVXNhZ2UodWludDY0X3QgdXNhZ2UpOwogCiAgICAgLy8gQnVmZmVyIGluZm8sIG1pbnVzIHRoZSBncmFwaGljcyBidWZmZXIvc2xvdCBpdHNlbGYuCiAgICAgc3RydWN0IEJ1ZmZlckluZm8gewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAKaW5kZXggODc2YzY4NS4uYzdmOTI3MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCkBAIC0yOSwxMiArMjksMTUgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHB3ZC5oPgogCiAjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+IC8vIGZvciBwcm9wZXJ0eV9nZXQKIAogI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQvY29udGVudC9wbS9JUGFja2FnZU1hbmFnZXJOYXRpdmUuaD4KKwogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KQEAgLTgwLDI3ICs4MywyNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKKyAgICB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YmFzZTsKKyAgICB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y29udGVudDo6cG07CisKIAogCiAvLyBzdW1tYXJpemVkIHJlY29yZHMKLS8vIHVwIHRvIDQ4IHNldHMsIGVhY2ggY292ZXJpbmcgYW4gaG91ciAtLSBhdCBsZWFzdCAyIGRheXMgb2YgY292ZXJhZ2UKKy8vIHVwIHRvIDM2IHNldHMsIGVhY2ggY292ZXJpbmcgYW4gaG91ciAtLSBzbyBhdCBsZWFzdCAxLjUgZGF5cwogLy8gKHdpbGwgYmUgbG9uZ2VyIGlmIHRoZXJlIGFyZSBob3VycyB3aXRob3V0IGFueSBtZWRpYSBhY3Rpb24pCiBzdGF0aWMgY29uc3QgbnNlY3NfdCBrTmV3U2V0SW50ZXJ2YWxOcyA9IDM2MDAqKDEwMDAqMTAwMCoxMDAwbGwpOwotc3RhdGljIGNvbnN0IGludCBrTWF4UmVjb3JkU2V0cyA9IDQ4OwotLy8gaW5kaXZpZHVhbCByZWNvcmRzIGtlcHQgaW4gbWVtb3J5Ci1zdGF0aWMgY29uc3QgaW50IGtNYXhSZWNvcmRzICAgID0gMTAwOworc3RhdGljIGNvbnN0IGludCBrTWF4UmVjb3JkU2V0cyA9IDM2OwogCisvLyBpbmRpdmlkdWFsIHJlY29yZHMga2VwdCBpbiBtZW1vcnk6IGFnZSBvciBjb3VudAorLy8gYWdlOiA8PSAzNiBob3VycyAoMS41IGRheXMpCisvLyBjb3VudDogaGFyZCBsaW1pdCBvZiAjIHJlY29yZHMKKy8vICgwIGZvciBlaXRoZXIgb2YgdGhlc2UgZGlzYWJsZXMgdGhhdCB0aHJlc2hvbGQpCitzdGF0aWMgY29uc3QgbnNlY3NfdCBrTWF4UmVjb3JkQWdlTnMgPSAgMzYgKiAzNjAwICogKDEwMDAqMTAwMCoxMDAwbGwpOworc3RhdGljIGNvbnN0IGludCBrTWF4UmVjb3JkcyAgICA9IDA7CiAKIHN0YXRpYyBjb25zdCBjaGFyICprU2VydmljZU5hbWUgPSAibWVkaWEubWV0cmljcyI7CiAKLQotLy91c2luZyBhbmRyb2lkOjpzdGF0dXNfdDsKLS8vdXNpbmcgYW5kcm9pZDo6T0s7Ci0vL3VzaW5nIGFuZHJvaWQ6OkJBRF9WQUxVRTsKLS8vdXNpbmcgYW5kcm9pZDo6Tk9UX0VOT1VHSF9EQVRBOwotLy91c2luZyBhbmRyb2lkOjpQYXJjZWw7Ci0KLQogdm9pZCBNZWRpYUFuYWx5dGljc1NlcnZpY2U6Omluc3RhbnRpYXRlKCkgewogICAgIGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5hZGRTZXJ2aWNlKAogICAgICAgICAgICAgU3RyaW5nMTYoa1NlcnZpY2VOYW1lKSwgbmV3IE1lZGlhQW5hbHl0aWNzU2VydmljZSgpKTsKQEAgLTExMCw2ICsxMTIsNyBAQAogTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpTdW1tYXJpemVyU2V0OjpTdW1tYXJpemVyU2V0KCkgewogICAgIG1TdW1tYXJpemVycyA9IG5ldyBMaXN0PE1ldHJpY3NTdW1tYXJpemVyICo+KCk7CiB9CisKIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6U3VtbWFyaXplclNldDo6flN1bW1hcml6ZXJTZXQoKSB7CiAgICAgLy8gZW1wdHkgdGhlIGxpc3QKICAgICBMaXN0PE1ldHJpY3NTdW1tYXJpemVyICo+ICpsID0gbVN1bW1hcml6ZXJzOwpAQCAtMTUzLDggKzE1NiwxMCBAQAogCiBNZWRpYUFuYWx5dGljc1NlcnZpY2U6Ok1lZGlhQW5hbHl0aWNzU2VydmljZSgpCiAgICAgICAgIDogbU1heFJlY29yZHMoa01heFJlY29yZHMpLAorICAgICAgICAgIG1NYXhSZWNvcmRBZ2VOcyhrTWF4UmVjb3JkQWdlTnMpLAogICAgICAgICAgIG1NYXhSZWNvcmRTZXRzKGtNYXhSZWNvcmRTZXRzKSwKLSAgICAgICAgICBtTmV3U2V0SW50ZXJ2YWwoa05ld1NldEludGVydmFsTnMpIHsKKyAgICAgICAgICBtTmV3U2V0SW50ZXJ2YWwoa05ld1NldEludGVydmFsTnMpLAorICAgICAgICAgIG1EdW1wUHJvdG8oTWVkaWFBbmFseXRpY3NJdGVtOjpQUk9UT19WMCkgewogCiAgICAgQUxPR0QoIk1lZGlhQW5hbHl0aWNzU2VydmljZSBjcmVhdGVkIik7CiAgICAgLy8gY2xlYXIgb3VyIHF1ZXVlcwpAQCAtMTY3LDYgKzE3Miw4IEBACiAgICAgbUl0ZW1zU3VibWl0dGVkID0gMDsKICAgICBtSXRlbXNGaW5hbGl6ZWQgPSAwOwogICAgIG1JdGVtc0Rpc2NhcmRlZCA9IDA7CisgICAgbUl0ZW1zRGlzY2FyZGVkRXhwaXJlID0gMDsKKyAgICBtSXRlbXNEaXNjYXJkZWRDb3VudCA9IDA7CiAKICAgICBtTGFzdFNlc3Npb25JRCA9IDA7CiAgICAgLy8gcmVjb3ZlciBhbnkgcGVyc2lzdGVuY3kgd2Ugc2V0IHVwCkBAIC0xNzcsOCArMTg0LDIzIEBACiAgICAgICAgIEFMT0dEKCJNZWRpYUFuYWx5dGljc1NlcnZpY2UgZGVzdHJveWVkIik7CiAKICAgICAvLyBjbGVhbiBvdXQgbU9wZW4gYW5kIG1GaW5hbGl6ZWQKKyAgICB3aGlsZSAobU9wZW4tPnNpemUoKSA+IDApIHsKKyAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICogb2l0ZW0gPSAqKG1PcGVuLT5iZWdpbigpKTsKKyAgICAgICAgbU9wZW4tPmVyYXNlKG1PcGVuLT5iZWdpbigpKTsKKyAgICAgICAgZGVsZXRlIG9pdGVtOworICAgICAgICBtSXRlbXNEaXNjYXJkZWQrKzsKKyAgICAgICAgbUl0ZW1zRGlzY2FyZGVkQ291bnQrKzsKKyAgICB9CiAgICAgZGVsZXRlIG1PcGVuOwogICAgIG1PcGVuID0gTlVMTDsKKworICAgIHdoaWxlIChtRmluYWxpemVkLT5zaXplKCkgPiAwKSB7CisgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqIG9pdGVtID0gKihtRmluYWxpemVkLT5iZWdpbigpKTsKKyAgICAgICAgbUZpbmFsaXplZC0+ZXJhc2UobUZpbmFsaXplZC0+YmVnaW4oKSk7CisgICAgICAgIGRlbGV0ZSBvaXRlbTsKKyAgICAgICAgbUl0ZW1zRGlzY2FyZGVkKys7CisgICAgICAgIG1JdGVtc0Rpc2NhcmRlZENvdW50Kys7CisgICAgfQogICAgIGRlbGV0ZSBtRmluYWxpemVkOwogICAgIG1GaW5hbGl6ZWQgPSBOVUxMOwogCkBAIC0yMDAsNiArMjIyLDggQEAKIAogICAgIC8vIHdlIGNvbnRyb2wgdGhlc2UsIGdlbmVyYWxseSBub3QgdHJ1c3RpbmcgdXNlciBpbnB1dAogICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9SRUFMVElNRSk7CisgICAgLy8gcm91bmQgbnNlY3MgdG8gc2Vjb25kcworICAgIG5vdyA9ICgobm93ICsgNTAwMDAwMDAwKSAvIDEwMDAwMDAwMDApICogMTAwMDAwMDAwMDsKICAgICBpdGVtLT5zZXRUaW1lc3RhbXAobm93KTsKICAgICBpbnQgcGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGludCB1aWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CkBAIC0yMTIsMTMgKzIzNiwxNSBAQAogICAgIC8vCiAgICAgYm9vbCBpc1RydXN0ZWQgPSBmYWxzZTsKIAorICAgIEFMT0dWKCJjYWxsZXIgaGFzIHVpZD0lZCwgZW1iZWRkZWQgdWlkPSVkIiwgdWlkLCB1aWRfZ2l2ZW4pOworCiAgICAgc3dpdGNoICh1aWQpICB7CiAgICAgICAgIGNhc2UgQUlEX01FRElBOgogICAgICAgICBjYXNlIEFJRF9NRURJQV9DT0RFQzoKICAgICAgICAgY2FzZSBBSURfTUVESUFfRVg6CiAgICAgICAgIGNhc2UgQUlEX01FRElBX0RSTToKICAgICAgICAgICAgIC8vIHRydXN0ZWQgc291cmNlLCBvbmx5IG92ZXJyaWRlIGRlZmF1bHQgdmFsdWVzCi0gICAgICAgICAgICAgICAgaXNUcnVzdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGlzVHJ1c3RlZCA9IHRydWU7CiAgICAgICAgICAgICBpZiAodWlkX2dpdmVuID09ICgtMSkpIHsKICAgICAgICAgICAgICAgICBpdGVtLT5zZXRVaWQodWlkKTsKICAgICAgICAgICAgIH0KQEAgLTIzNCw2ICsyNjAsMjIgQEAKICAgICB9CiAKIAorICAgIC8vIE92ZXJ3cml0ZSBwYWNrYWdlIG5hbWUgYW5kIHZlcnNpb24gaWYgdGhlIGNhbGxlciB3YXMgdW50cnVzdGVkLgorICAgIGlmICghaXNUcnVzdGVkKSB7CisgICAgICBzZXRQa2dJbmZvKGl0ZW0sIGl0ZW0tPmdldFVpZCgpLCB0cnVlLCB0cnVlKTsKKyAgICB9IGVsc2UgaWYgKGl0ZW0tPmdldFBrZ05hbWUoKS5lbXB0eSgpKSB7CisgICAgICAvLyBlbXB0eSwgc28gZmlsbCBvdXQgYm90aCBwYXJ0cworICAgICAgc2V0UGtnSW5mbyhpdGVtLCBpdGVtLT5nZXRVaWQoKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIHRydXN0ZWQsIHByb3ZpZGVkIGEgcGFja2FnZSwgZG8gbm90aGluZworICAgIH0KKworICAgIEFMT0dWKCJnaXZlbiB1aWQgJWQ7IHNhbml0aXplZCB1aWQ6ICVkIHNhbml0aXplZCBwa2c6ICVzICIKKyAgICAgICAgICAic2FuaXRpemVkIHBrZyB2ZXJzaW9uOiAlZCIsCisgICAgICAgICAgdWlkX2dpdmVuLCBpdGVtLT5nZXRVaWQoKSwKKyAgICAgICAgICBpdGVtLT5nZXRQa2dOYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICBpdGVtLT5nZXRQa2dWZXJzaW9uQ29kZSgpKTsKKwogICAgIG1JdGVtc1N1Ym1pdHRlZCsrOwogCiAgICAgLy8gdmFsaWRhdGUgdGhlIHJlY29yZDsgd2UgZGlzY2FyZCBpZiB3ZSBkb24ndCBsaWtlIGl0CkBAIC0zMTYsNiArMzU4LDcgQEAKICAgICByZXR1cm4gaWQ7CiB9CiAKKwogc3RhdHVzX3QgTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKIHsKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDUxMjsKQEAgLTMzMywyMiArMzc2LDQxIEBACiAgICAgfQogCiAgICAgLy8gY3JhY2sgYW55IHBhcmFtZXRlcnMKLSAgICBib29sIGNsZWFyID0gZmFsc2U7Ci0gICAgYm9vbCBzdW1tYXJ5ID0gZmFsc2U7Ci0gICAgbnNlY3NfdCB0c19zaW5jZSA9IDA7CiAgICAgU3RyaW5nMTYgc3VtbWFyeU9wdGlvbigiLXN1bW1hcnkiKTsKKyAgICBib29sIHN1bW1hcnkgPSBmYWxzZTsKKyAgICBTdHJpbmcxNiBwcm90b09wdGlvbigiLXByb3RvIik7CiAgICAgU3RyaW5nMTYgY2xlYXJPcHRpb24oIi1jbGVhciIpOworICAgIGJvb2wgY2xlYXIgPSBmYWxzZTsKICAgICBTdHJpbmcxNiBzaW5jZU9wdGlvbigiLXNpbmNlIik7CisgICAgbnNlY3NfdCB0c19zaW5jZSA9IDA7CiAgICAgU3RyaW5nMTYgaGVscE9wdGlvbigiLWhlbHAiKTsKICAgICBTdHJpbmcxNiBvbmx5T3B0aW9uKCItb25seSIpOwotICAgIGNvbnN0IGNoYXIgKm9ubHkgPSBOVUxMOworICAgIEFTdHJpbmcgb25seTsKICAgICBpbnQgbiA9IGFyZ3Muc2l6ZSgpOworCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgU3RyaW5nOCBteWFyZyhhcmdzW2ldKTsKICAgICAgICAgaWYgKGFyZ3NbaV0gPT0gY2xlYXJPcHRpb24pIHsKICAgICAgICAgICAgIGNsZWFyID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldID09IHN1bW1hcnlPcHRpb24pIHsKICAgICAgICAgICAgIHN1bW1hcnkgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0gPT0gcHJvdG9PcHRpb24pIHsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIGlmIChpIDwgbikgeworICAgICAgICAgICAgICAgIFN0cmluZzggdmFsdWUoYXJnc1tpXSk7CisgICAgICAgICAgICAgICAgaW50IHByb3RvID0gTWVkaWFBbmFseXRpY3NJdGVtOjpQUk9UT19WMDsgICAgICAgLy8gZGVmYXVsdCB0byBvcmlnaW5hbAorICAgICAgICAgICAgICAgIGNoYXIgKmVuZHA7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcCA9IHZhbHVlLnN0cmluZygpOworICAgICAgICAgICAgICAgIHByb3RvID0gc3RydG9sKHAsICZlbmRwLCAxMCk7CisgICAgICAgICAgICAgICAgaWYgKGVuZHAgIT0gcCB8fCAqZW5kcCA9PSAnXDAnKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm90byA8IE1lZGlhQW5hbHl0aWNzSXRlbTo6UFJPVE9fRklSU1QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvID0gTWVkaWFBbmFseXRpY3NJdGVtOjpQUk9UT19GSVJTVDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm90byA+IE1lZGlhQW5hbHl0aWNzSXRlbTo6UFJPVE9fTEFTVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG8gPSBNZWRpYUFuYWx5dGljc0l0ZW06OlBST1RPX0xBU1Q7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUR1bXBQcm90byA9IHByb3RvOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldID09IHNpbmNlT3B0aW9uKSB7CiAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICBpZiAoaSA8IG4pIHsKQEAgLTM2OCwxOCArNDMwLDEyIEBACiAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICBpZiAoaSA8IG4pIHsKICAgICAgICAgICAgICAgICBTdHJpbmc4IHZhbHVlKGFyZ3NbaV0pOwotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnAgPSB2YWx1ZS5zdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBjaGFyICpxID0gc3RyZHVwKHApOwotICAgICAgICAgICAgICAgIGlmIChxICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9ubHkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSgodm9pZCopb25seSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvbmx5ID0gcTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb25seSA9IHZhbHVlLnN0cmluZygpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0gPT0gaGVscE9wdGlvbikgewogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiUmVjb2duaXplZCBwYXJhbWV0ZXJzOlxuIik7CiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCItaGVscCAgICAgICAgdGhpcyBoZWxwIG1lc3NhZ2VcbiIpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLXByb3RvIFggICAgIGR1bXAgdXNpbmcgcHJvdG9jb2wgWCAoZGVmYXVsdHMgdG8gMSkiKTsKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIi1zdW1tYXJ5ICAgICBzaG93IHN1bW1hcnkgaW5mb1xuIik7CiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCItY2xlYXIgICAgICAgY2xlYXJzIG91dCBzYXZlZCByZWNvcmRzXG4iKTsKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIi1vbmx5IFggICAgICBwcm9jZXNzIHJlY29yZHMgZm9yIGNvbXBvbmVudCBYXG4iKTsKQEAgLTM5OCwxMSArNDU0LDExIEBACiAKICAgICBkdW1wSGVhZGVycyhyZXN1bHQsIHRzX3NpbmNlKTsKIAotICAgIC8vIG9ubHkgd2FudCAxLCB0byBhdm9pZCBjb25mdXNpbmcgZm9sa3MgdGhhdCBwYXJzZSB0aGUgb3V0cHV0CisgICAgLy8gd2FudCBleGFjdGx5IDEsIHRvIGF2b2lkIGNvbmZ1c2luZyBmb2xrcyB0aGF0IHBhcnNlIHRoZSBvdXRwdXQKICAgICBpZiAoc3VtbWFyeSkgewotICAgICAgICBkdW1wU3VtbWFyaWVzKHJlc3VsdCwgdHNfc2luY2UsIG9ubHkpOworICAgICAgICBkdW1wU3VtbWFyaWVzKHJlc3VsdCwgdHNfc2luY2UsIG9ubHkuY19zdHIoKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZHVtcFJlY2VudChyZXN1bHQsIHRzX3NpbmNlLCBvbmx5KTsKKyAgICAgICAgZHVtcFJlY2VudChyZXN1bHQsIHRzX3NpbmNlLCBvbmx5LmNfc3RyKCkpOwogICAgIH0KIAogCkBAIC00MjgsNiArNDg0LDkgQEAKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDUxMjsKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKIAorICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlByb3RvY29sIFZlcnNpb246ICVkXG4iLCBtRHVtcFByb3RvKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKICAgICBpbnQgZW5hYmxlZCA9IE1lZGlhQW5hbHl0aWNzSXRlbTo6aXNFbmFibGVkKCk7CiAgICAgaWYgKGVuYWJsZWQpIHsKICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiTWV0cmljcyBnYXRoZXJpbmc6IGVuYWJsZWRcbiIpOwpAQCAtNDM3LDEwICs0OTYsMTQgQEAKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCi0gICAgICAgICJTaW5jZSBCb290OiBTdWJtaXNzaW9uczogJSIgUFJJZDY0Ci0gICAgICAgICAgICAiIEZpbmFsaXphdGlvbnM6ICUiIFBSSWQ2NAotICAgICAgICAiIERpc2NhcmRlZDogJSIgUFJJZDY0ICJcbiIsCi0gICAgICAgIG1JdGVtc1N1Ym1pdHRlZCwgbUl0ZW1zRmluYWxpemVkLCBtSXRlbXNEaXNjYXJkZWQpOworICAgICAgICAiU2luY2UgQm9vdDogU3VibWlzc2lvbnM6ICU4IiBQUklkNjQKKyAgICAgICAgICAgICIgRmluYWxpemF0aW9uczogJTgiIFBSSWQ2NCAiXG4iLAorICAgICAgICBtSXRlbXNTdWJtaXR0ZWQsIG1JdGVtc0ZpbmFsaXplZCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKKyAgICAgICAgIlJlY29yZHMgRGlzY2FyZGVkOiAlOCIgUFJJZDY0CisgICAgICAgICAgICAiIChieSBDb3VudDogJSIgUFJJZDY0ICIgYnkgRXhwaXJhdGlvbjogJSIgUFJJZDY0ICIpXG4iLAorICAgICAgICAgbUl0ZW1zRGlzY2FyZGVkLCBtSXRlbXNEaXNjYXJkZWRDb3VudCwgbUl0ZW1zRGlzY2FyZGVkRXhwaXJlKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLAogICAgICAgICAiU3VtbWFyeSBTZXRzIERpc2NhcmRlZDogJSIgUFJJZDY0ICJcbiIsIG1TZXRzRGlzY2FyZGVkKTsKQEAgLTQ2Miw2ICs1MjUsMTAgQEAKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcblN1bW1hcml6ZWQgTWV0cmljczpcbiIpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKIAorICAgIGlmIChvbmx5ICE9IE5VTEwgJiYgKm9ubHkgPT0gJ1wwJykgeworICAgICAgICBvbmx5ID0gTlVMTDsKKyAgICB9CisKICAgICAvLyBoYXZlIGVhY2ggb2YgdGhlIGRpc3RpbGxlcnMgZHVtcCByZWNvcmRzCiAgICAgaWYgKG1TdW1tYXJpemVyU2V0cyAhPSBOVUxMKSB7CiAgICAgICAgIExpc3Q8U3VtbWFyaXplclNldCAqPjo6aXRlcmF0b3IgaXRTZXQgPSBtU3VtbWFyaXplclNldHMtPmJlZ2luKCk7CkBAIC00ODgsNiArNTU1LDEwIEBACiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSA1MTI7CiAgICAgY2hhciBidWZmZXJbU0laRV07CiAKKyAgICBpZiAob25seSAhPSBOVUxMICYmICpvbmx5ID09ICdcMCcpIHsKKyAgICAgICAgb25seSA9IE5VTEw7CisgICAgfQorCiAgICAgLy8gc2hvdyB0aGUgcmVjZW50bHkgcmVjb3JkZWQgcmVjb3JkcwogICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICJcbkZpbmFsaXplZCBNZXRyaWNzIChvbGRlc3QgZmlyc3QpOlxuIik7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwpAQCAtNTI0LDcgKzU5NSw3IEBACiAgICAgICAgICAgICAgICAgQUxPR1YoIk9taXQgJyVzJywgaXQncyBub3QgJyVzJyIsICgqaXQpLT5nZXRLZXkoKS5jX3N0cigpLCBvbmx5KTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFTdHJpbmcgZW50cnkgPSAoKml0KS0+dG9TdHJpbmcoKTsKKyAgICAgICAgICAgIEFTdHJpbmcgZW50cnkgPSAoKml0KS0+dG9TdHJpbmcobUR1bXBQcm90byk7CiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlNWQ6ICVzXG4iLCBzbG90LCBlbnRyeS5jX3N0cigpKTsKICAgICAgICAgICAgIHNsb3QrKzsKICAgICAgICAgfQpAQCAtNTQ5LDEzICs2MjAsMzIgQEAKICAgICAgICAgbC0+cHVzaF9iYWNrKGl0ZW0pOwogICAgIH0KIAotICAgIC8vIGtlZXAgcmVtb3Zpbmcgb2xkIHJlY29yZHMgdGhlIGZyb250IHVudGlsIHdlJ3JlIGluLWJvdW5kcworICAgIC8vIGtlZXAgcmVtb3Zpbmcgb2xkIHJlY29yZHMgdGhlIGZyb250IHVudGlsIHdlJ3JlIGluLWJvdW5kcyAoY291bnQpCiAgICAgaWYgKG1NYXhSZWNvcmRzID4gMCkgewogICAgICAgICB3aGlsZSAobC0+c2l6ZSgpID4gKHNpemVfdCkgbU1heFJlY29yZHMpIHsKICAgICAgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqIG9pdGVtID0gKihsLT5iZWdpbigpKTsKICAgICAgICAgICAgIGwtPmVyYXNlKGwtPmJlZ2luKCkpOwogICAgICAgICAgICAgZGVsZXRlIG9pdGVtOwogICAgICAgICAgICAgbUl0ZW1zRGlzY2FyZGVkKys7CisgICAgICAgICAgICBtSXRlbXNEaXNjYXJkZWRDb3VudCsrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8ga2VlcCByZW1vdmluZyBvbGQgcmVjb3JkcyB0aGUgZnJvbnQgdW50aWwgd2UncmUgaW4tYm91bmRzIChjb3VudCkKKyAgICBpZiAobU1heFJlY29yZEFnZU5zID4gMCkgeworICAgICAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfUkVBTFRJTUUpOworICAgICAgICB3aGlsZSAobC0+c2l6ZSgpID4gMCkgeworICAgICAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICogb2l0ZW0gPSAqKGwtPmJlZ2luKCkpOworICAgICAgICAgICAgbnNlY3NfdCB3aGVuID0gb2l0ZW0tPmdldFRpbWVzdGFtcCgpOworICAgICAgICAgICAgLy8gY2FyZWZ1bCBhYm91dCB0aW1lanVtcHMgdG9vCisgICAgICAgICAgICBpZiAoKG5vdyA+IHdoZW4pICYmIChub3ctd2hlbikgPD0gbU1heFJlY29yZEFnZU5zKSB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyAoYW5kIHRoZSByZXN0KSBhcmUgcmVjZW50IGVub3VnaCB0byBrZWVwCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsLT5lcmFzZShsLT5iZWdpbigpKTsKKyAgICAgICAgICAgIGRlbGV0ZSBvaXRlbTsKKyAgICAgICAgICAgIG1JdGVtc0Rpc2NhcmRlZCsrOworICAgICAgICAgICAgbUl0ZW1zRGlzY2FyZGVkRXhwaXJlKys7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC01NjMsMTEgKzY1Myw2IEBACiAvLyBhcmUgdGhleSBhbGlrZSBlbm91Z2ggdGhhdCBuaXRlbSBjYW4gYmUgZm9sZGVkIGludG8gb2l0ZW0/CiBzdGF0aWMgYm9vbCBjb21wYXRpYmxlSXRlbXMoTWVkaWFBbmFseXRpY3NJdGVtICogb2l0ZW0sIE1lZGlhQW5hbHl0aWNzSXRlbSAqIG5pdGVtKSB7CiAKLSAgICBpZiAoMCkgewotICAgICAgICBBTE9HRCgiQ29tcGFyZTogbyAlcyBuICVzIiwKLSAgICAgICAgICAgICAgb2l0ZW0tPnRvU3RyaW5nKCkuY19zdHIoKSwgbml0ZW0tPnRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgfQotCiAgICAgLy8gZ2VuZXJhbCBzYWZldHkKICAgICBpZiAobml0ZW0tPmdldFVpZCgpICE9IG9pdGVtLT5nZXRVaWQoKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC03MTgsNCArODAzLDE1NSBAQAogCiB9CiAKKy8vIGhvdyBsb25nIHdlIGhvbGQgcGFja2FnZSBpbmZvIGJlZm9yZSB3ZSByZS1mZXRjaCBpdAorI2RlZmluZSBQS0dfRVhQSVJBVElPTl9OUyAoMzAqNjAqMTAwMDAwMDAwMGxsKSAgIC8vIDMwIG1pbnV0ZXMsIGluIG5zZWNzCisKKy8vIGdpdmUgbWUgdGhlIHBhY2thZ2UgbmFtZSwgcGVyaGFwcyBnb2luZyB0byBmaW5kIGl0Cit2b2lkIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6c2V0UGtnSW5mbyhNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0sIHVpZF90IHVpZCwgYm9vbCBzZXROYW1lLCBib29sIHNldFZlcnNpb24pIHsKKyAgICBBTE9HVigiYXNraW5nIGZvciBwYWNrYWdlbmFtZSB0byBnbyB3aXRoIHVpZD0lZCIsIHVpZCk7CisKKyAgICBpZiAoIXNldE5hbWUgJiYgIXNldFZlcnNpb24pIHsKKyAgICAgICAgLy8gc2V0dGluZyBub3RoaW5nPyBzdHJhbmdlCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfUkVBTFRJTUUpOworICAgIHN0cnVjdCBVaWRUb1BrZ01hcCBtYXBwaW5nOworICAgIG1hcHBpbmcudWlkID0gKC0xKTsKKworICAgIHNzaXplX3QgaSA9IG1Qa2dNYXBwaW5ncy5pbmRleE9mS2V5KHVpZCk7CisgICAgaWYgKGkgPj0gMCkgeworICAgICAgICBtYXBwaW5nID0gbVBrZ01hcHBpbmdzLnZhbHVlQXQoaSk7CisgICAgICAgIEFMT0dWKCJFeHBpcmF0aW9uPyB1aWQgJWQgZXhwaXJhdGlvbiAlIiBQUklkNjQgIiBub3cgJSIgUFJJZDY0LAorICAgICAgICAgICAgICB1aWQsIG1hcHBpbmcuZXhwaXJhdGlvbiwgbm93KTsKKyAgICAgICAgaWYgKG1hcHBpbmcuZXhwaXJhdGlvbiA8IG5vdykgeworICAgICAgICAgICAgLy8gcHVyZ2Ugb3VyIGN1cnJlbnQgZW50cnkgYW5kIHJlLXF1ZXJ5CisgICAgICAgICAgICBBTE9HVigiZW50cnkgZm9yIHVpZCAlZCBleHBpcmVkLCBub3c9ICUiIFBSSWQ2NCAiIiwgdWlkLCBub3cpOworICAgICAgICAgICAgbVBrZ01hcHBpbmdzLnJlbW92ZUl0ZW1zQXQoaSwgMSk7CisgICAgICAgICAgICAvLyBjb3VsZCBjaGVhdCBhbmQgdXNlIGEgZ290byBiYWNrIHRvIHRoZSB0b3Agb2YgdGhlIHJvdXRpbmUuCisgICAgICAgICAgICAvLyBhIGdvb2QgY29tcGlsZXIgc2hvdWxkIHJlY29nbml6ZSB0aGUgbG9jYWwgdGFpbCByZWN1cnNpb24uLi4KKyAgICAgICAgICAgIHJldHVybiBzZXRQa2dJbmZvKGl0ZW0sIHVpZCwgc2V0TmFtZSwgc2V0VmVyc2lvbik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBU3RyaW5nIHBrZzsKKyAgICAgICAgc3RkOjpzdHJpbmcgaW5zdGFsbGVyID0gIiI7CisgICAgICAgIGludDMyX3QgdmVyc2lvbkNvZGUgPSAwOworCisgICAgICAgIHN0cnVjdCBwYXNzd2QgKnB3ID0gZ2V0cHd1aWQodWlkKTsKKyAgICAgICAgaWYgKHB3KSB7CisgICAgICAgICAgICBwa2cgPSBwdy0+cHdfbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZpbmQgdGhlIHByb3BlciB2YWx1ZSAtLSBzaG91bGQgd2UgY2FjaGUgdGhpcyBiaW5kZXI/PworCisgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IE5VTEw7CisgICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICAgICAgaWYgKHNtID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJkZWZhdWx0U2VydmljZU1hbmFnZXIgZmFpbGVkIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiaW5kZXIgPSBzbS0+Z2V0U2VydmljZShTdHJpbmcxNigicGFja2FnZV9uYXRpdmUiKSk7CisgICAgICAgICAgICBpZiAoYmluZGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0U2VydmljZSBwYWNrYWdlX25hdGl2ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChiaW5kZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgc3A8SVBhY2thZ2VNYW5hZ2VyTmF0aXZlPiBwYWNrYWdlX21nciA9IGludGVyZmFjZV9jYXN0PElQYWNrYWdlTWFuYWdlck5hdGl2ZT4oYmluZGVyKTsKKyAgICAgICAgICAgIGJpbmRlcjo6U3RhdHVzIHN0YXR1czsKKworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiB1aWRzOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG5hbWVzOworCisgICAgICAgICAgICB1aWRzLnB1c2hfYmFjayh1aWQpOworCisgICAgICAgICAgICBzdGF0dXMgPSBwYWNrYWdlX21nci0+Z2V0TmFtZXNGb3JVaWRzKHVpZHMsICZuYW1lcyk7CisgICAgICAgICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgicGFja2FnZV9uYXRpdmU6OmdldE5hbWVzRm9yVWlkcyBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZXhjZXB0aW9uTWVzc2FnZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIW5hbWVzWzBdLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcGtnID0gbmFtZXNbMF0uY19zdHIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHN0cmlwIGFueSBsZWFkaW5nICJzaGFyZWQ6IiBzdHJpbmdzIHRoYXQgY2FtZSBiYWNrCisgICAgICAgICAgICBpZiAocGtnLnN0YXJ0c1dpdGgoInNoYXJlZDoiKSkgeworICAgICAgICAgICAgICAgIHBrZy5lcmFzZSgwLCA3KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIGhvdyBwa2cgd2FzIGluc3RhbGxlZCBhbmQgdGhlIHZlcnNpb25Db2RlCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKHBrZy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgLy8gbm8gbmFtZSBmb3IgdXMgdG8gbWFuYWdlCisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNocihwa2cuY19zdHIoKSwgJy4nKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLy8gbm90IG9mIGZvcm0gJ2NvbS53aGF0ZXZlci4uLic7IGFzc3VtZSBpbnRlcm5hbCBhbmQgb2sKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcChwa2cuY19zdHIoKSwgImFuZHJvaWQuIiwgOCkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIGFuZHJvaWQuKiBwYWNrYWdlcyBhcmUgYXNzdW1lZCBmaW5lCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN0cmluZzE2IHBrZ05hbWUxNihwa2cuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gcGFja2FnZV9tZ3ItPmdldEluc3RhbGxlckZvclBhY2thZ2UocGtnTmFtZTE2LCAmaW5zdGFsbGVyKTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoInBhY2thZ2VfbmF0aXZlOjpnZXRJbnN0YWxsZXJGb3JQYWNrYWdlIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZXhjZXB0aW9uTWVzc2FnZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHNraXAgaWYgd2UgZGlkbid0IGdldCBhbiBpbnN0YWxsZXIKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBwYWNrYWdlX21nci0+Z2V0VmVyc2lvbkNvZGVGb3JQYWNrYWdlKHBrZ05hbWUxNiwgJnZlcnNpb25Db2RlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgicGFja2FnZV9uYXRpdmU6OmdldFZlcnNpb25Db2RlRm9yUGFja2FnZSBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmV4Y2VwdGlvbk1lc3NhZ2UoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgQUxPR1YoInBhY2thZ2UgJyVzJyBpbnN0YWxsZWQgYnkgJyVzJyB2ZXJzaW9uY29kZSAlZCAvICUwOHgiLAorICAgICAgICAgICAgICAgICAgICAgIHBrZy5jX3N0cigpLCBpbnN0YWxsZXIuY19zdHIoKSwgdmVyc2lvbkNvZGUsIHZlcnNpb25Db2RlKTsKKworICAgICAgICAgICAgICAgIGlmIChzdHJuY21wKGluc3RhbGxlci5jX3N0cigpLCAiY29tLmFuZHJvaWQuIiwgMTIpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gcGxheSBzdG9yZSwgd2Uga2VlcCBpbmZvCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKGluc3RhbGxlci5jX3N0cigpLCAiY29tLmdvb2dsZS4iLCAxMSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29tZSBnb29nbGUgc291cmNlLCB3ZSBrZWVwIGluZm8KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChpbnN0YWxsZXIuY19zdHIoKSwgInByZWxvYWQiKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmVsb2Fkcywgd2Uga2VlcCB0aGUgaW5mbworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5zdGFsbGVyLmNfc3RyKClbMF0gPT0gJ1wwJykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2lkZWxvYWQgKG5vIGluc3RhbGxlcik7IGRvIG5vdCByZXBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgIHBrZyA9ICIiOworICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbkNvZGUgPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmtub3duIGluc3RhbGxlcjsgZG8gbm90IHJlcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgcGtnID0gIiI7CisgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uQ29kZSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gYWRkIGl0IHRvIHRoZSBtYXAsIHRvIHNhdmUgYSBzdWJzZXF1ZW50IGxvb2t1cAorICAgICAgICBpZiAoIXBrZy5lbXB0eSgpKSB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2tfbWFwcGluZ3MpOworICAgICAgICAgICAgQUxPR1YoIkFkZGluZyB1aWQgJWQgcGtnICclcyciLCB1aWQsIHBrZy5jX3N0cigpKTsKKyAgICAgICAgICAgIHNzaXplX3QgaSA9IG1Qa2dNYXBwaW5ncy5pbmRleE9mS2V5KHVpZCk7CisgICAgICAgICAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgICAgICAgICBtYXBwaW5nLnVpZCA9IHVpZDsKKyAgICAgICAgICAgICAgICBtYXBwaW5nLnBrZyA9IHBrZzsKKyAgICAgICAgICAgICAgICBtYXBwaW5nLmluc3RhbGxlciA9IGluc3RhbGxlci5jX3N0cigpOworICAgICAgICAgICAgICAgIG1hcHBpbmcudmVyc2lvbkNvZGUgPSB2ZXJzaW9uQ29kZTsKKyAgICAgICAgICAgICAgICBtYXBwaW5nLmV4cGlyYXRpb24gPSBub3cgKyBQS0dfRVhQSVJBVElPTl9OUzsKKyAgICAgICAgICAgICAgICBBTE9HVigiZXhwaXJhdGlvbiBmb3IgdWlkICVkIHNldCB0byAlIiBQUklkNjQgIiIsIHVpZCwgbWFwcGluZy5leHBpcmF0aW9uKTsKKworICAgICAgICAgICAgICAgIG1Qa2dNYXBwaW5ncy5hZGQodWlkLCBtYXBwaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtYXBwaW5nLnVpZCAhPSAodWlkX3QpKC0xKSkgeworICAgICAgICBpZiAoc2V0TmFtZSkgeworICAgICAgICAgICAgaXRlbS0+c2V0UGtnTmFtZShtYXBwaW5nLnBrZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNldFZlcnNpb24pIHsKKyAgICAgICAgICAgIGl0ZW0tPnNldFBrZ1ZlcnNpb25Db2RlKG1hcHBpbmcudmVyc2lvbkNvZGUpOworICAgICAgICB9CisgICAgfQorfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5oCmluZGV4IDY2ODU5NjcuLjUyZTQ2MzEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5oCkBAIC01NCwxNiArNTQsMjIgQEAKICAgICBpbnQ2NF90IG1JdGVtc1N1Ym1pdHRlZDsKICAgICBpbnQ2NF90IG1JdGVtc0ZpbmFsaXplZDsKICAgICBpbnQ2NF90IG1JdGVtc0Rpc2NhcmRlZDsKKyAgICBpbnQ2NF90IG1JdGVtc0Rpc2NhcmRlZEV4cGlyZTsKKyAgICBpbnQ2NF90IG1JdGVtc0Rpc2NhcmRlZENvdW50OwogICAgIGludDY0X3QgbVNldHNEaXNjYXJkZWQ7CiAgICAgTWVkaWFBbmFseXRpY3NJdGVtOjpTZXNzaW9uSURfdCBtTGFzdFNlc3Npb25JRDsKIAogICAgIC8vIHBhcnRpdGlvbmVkIGEgYml0IHNvIHdlIGRvbid0IG92ZXIgc2VyaWFsaXplCiAgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgbUxvY2s7CiAgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgbUxvY2tfaWRzOworICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgIG1Mb2NrX21hcHBpbmdzOwogCi0gICAgLy8gdGhlIG1vc3Qgd2UgaG9sZCBpbiBtZW1vcnkKLSAgICAvLyB1cCB0byB0aGlzIG1hbnkgaW4gZWFjaCBxdWV1ZSAob3BlbiwgZmluYWxpemVkKQorICAgIC8vIGxpbWl0IGhvdyBtYW55IHJlY29yZHMgd2UnbGwgcmV0YWluCisgICAgLy8gYnkgY291bnQgKGluIGVhY2ggcXVldWUgKG9wZW4sIGZpbmFsaXplZCkpCiAgICAgaW50MzJfdCBtTWF4UmVjb3JkczsKKyAgICAvLyBieSB0aW1lIChub25lIG9sZGVyIHRoYW4gdGhpcyBsb25nIGFnYW4KKyAgICBuc2Vjc190IG1NYXhSZWNvcmRBZ2VOczsKKyAgICAvLwogICAgIC8vICMgb2Ygc2V0cyBvZiBzdW1tYXJpZXMKICAgICBpbnQzMl90IG1NYXhSZWNvcmRTZXRzOwogICAgIC8vIG5zZWNzIHVudGlsIHdlIHN0YXJ0IGEgbmV3IHJlY29yZCBzZXQKQEAgLTExOCw2ICsxMjQsNyBAQAogICAgIHZvaWQgZGVsZXRlSXRlbShMaXN0PE1lZGlhQW5hbHl0aWNzSXRlbSAqPiAqLCBNZWRpYUFuYWx5dGljc0l0ZW0gKik7CiAKICAgICAvLyBzdXBwb3J0IGZvciBnZW5lcmF0aW5nIG91dHB1dAorICAgIGludCBtRHVtcFByb3RvOwogICAgIFN0cmluZzggZHVtcFF1ZXVlKExpc3Q8TWVkaWFBbmFseXRpY3NJdGVtKj4gKik7CiAgICAgU3RyaW5nOCBkdW1wUXVldWUoTGlzdDxNZWRpYUFuYWx5dGljc0l0ZW0qPiAqLCBuc2Vjc190LCBjb25zdCBjaGFyICpvbmx5KTsKIApAQCAtMTI1LDYgKzEzMiwxOCBAQAogICAgIHZvaWQgZHVtcFN1bW1hcmllcyhTdHJpbmc4ICZyZXN1bHQsIG5zZWNzX3QgdHNfc2luY2UsIGNvbnN0IGNoYXIgKiBvbmx5KTsKICAgICB2b2lkIGR1bXBSZWNlbnQoU3RyaW5nOCAmcmVzdWx0LCBuc2Vjc190IHRzX3NpbmNlLCBjb25zdCBjaGFyICogb25seSk7CiAKKyAgICAvLyBtYXBwaW5nIHVpZHMgdG8gcGFja2FnZSBuYW1lcworICAgIHN0cnVjdCBVaWRUb1BrZ01hcCB7CisgICAgICAgIHVpZF90IHVpZDsKKyAgICAgICAgQVN0cmluZyBwa2c7CisgICAgICAgIEFTdHJpbmcgaW5zdGFsbGVyOworICAgICAgICBpbnQzMl90IHZlcnNpb25Db2RlOworICAgICAgICBuc2Vjc190IGV4cGlyYXRpb247CisgICAgfTsKKworICAgIEtleWVkVmVjdG9yPHVpZF90LHN0cnVjdCBVaWRUb1BrZ01hcD4gIG1Qa2dNYXBwaW5nczsKKyAgICB2b2lkIHNldFBrZ0luZm8oTWVkaWFBbmFseXRpY3NJdGVtICppdGVtLCB1aWRfdCB1aWQsIGJvb2wgc2V0TmFtZSwgYm9vbCBzZXRWZXJzaW9uKTsKKwogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXIuY3BwIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXIuY3BwCmluZGV4IDM0NzdmMWYuLjkzZmUwZWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplci5jcHAKQEAgLTE0MSwyMyArMTQxLDIzIEBACiAgICAgTGlzdDxNZWRpYUFuYWx5dGljc0l0ZW0gKj46Oml0ZXJhdG9yIGl0ID0gbVN1bW1hcmllcy0+YmVnaW4oKTsKICAgICBmb3IgKDsgaXQgIT0gbVN1bW1hcmllcy0+ZW5kKCk7IGl0KyspIHsKICAgICAgICAgYm9vbCBnb29kID0gc2FtZUF0dHJpYnV0ZXMoKCppdCksIGl0ZW0sIGdldElnbm9yYWJsZXMoKSk7Ci0gICAgICAgIEFMT0dWKCJNYXRjaCBhZ2FpbnN0ICVzIHNheXMgJWQiLAotICAgICAgICAgICAgICAoKml0KS0+dG9TdHJpbmcoKS5jX3N0cigpLCBnb29kKTsKKyAgICAgICAgQUxPR1YoIk1hdGNoIGFnYWluc3QgJXMgc2F5cyAlZCIsICgqaXQpLT50b1N0cmluZygpLmNfc3RyKCksIGdvb2QpOwogICAgICAgICBpZiAoZ29vZCkKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICBpZiAoaXQgPT0gbVN1bW1hcmllcy0+ZW5kKCkpIHsKICAgICAgICAgICAgIEFMT0dWKCJzYXZlIG5ldyByZWNvcmQiKTsKLSAgICAgICAgICAgIGl0ZW0gPSBpdGVtLT5kdXAoKTsKLSAgICAgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqbml0ZW0gPSBpdGVtLT5kdXAoKTsKKyAgICAgICAgICAgIGlmIChuaXRlbSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoInVuYWJsZSB0byBzYXZlIE1lZGlhTWV0cmljcyByZWNvcmQiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNvcnRQcm9wcyhpdGVtKTsKLSAgICAgICAgICAgIGl0ZW0tPnNldEludDMyKCJjb3VudCIsMSk7Ci0gICAgICAgICAgICBtU3VtbWFyaWVzLT5wdXNoX2JhY2soaXRlbSk7CisgICAgICAgICAgICBzb3J0UHJvcHMobml0ZW0pOworICAgICAgICAgICAgbml0ZW0tPnNldEludDMyKCJhZ2dyZWdhdGVkIiwxKTsKKyAgICAgICAgICAgIG1lcmdlUmVjb3JkKCpuaXRlbSwgKml0ZW0pOworICAgICAgICAgICAgbVN1bW1hcmllcy0+cHVzaF9iYWNrKG5pdGVtKTsKICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR1YoImluY3JlbWVudCBleGlzdGluZyByZWNvcmQiKTsKLSAgICAgICAgICAgICgqaXQpLT5hZGRJbnQzMigiY291bnQiLDEpOworICAgICAgICAgICAgKCppdCktPmFkZEludDMyKCJhZ2dyZWdhdGVkIiwxKTsKICAgICAgICAgICAgIG1lcmdlUmVjb3JkKCooKml0KSwgKml0ZW0pOwogICAgIH0KIH0KQEAgLTE2OCw2ICsxNjgsNzEgQEAKICAgICByZXR1cm47CiB9CiAKKy8vIGtlZXAgc29tZSBzdGF0cyBmb3IgdGhpbmdzOiBzdW1zLCBjb3VudHMsIHN0YW5kYXJkIGRldmlhdGlvbgorLy8gdGhlIGludGVnZXIgdmVyc2lvbiAtLSBhbGwgb2YgdGhlc2UgcGllY2VzIGFyZSBpbiA2NCBiaXRzCit2b2lkIE1ldHJpY3NTdW1tYXJpemVyOjptaW5NYXhWYXI2NChNZWRpYUFuYWx5dGljc0l0ZW0gJnN1bW1hdGlvbiwgY29uc3QgY2hhciAqa2V5LCBpbnQ2NF90IHZhbHVlKSB7CisgICAgaWYgKGtleSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgaW50IGxlbiA9IHN0cmxlbihrZXkpICsgMzI7CisgICAgY2hhciAqdG1wS2V5ID0gKGNoYXIgKiltYWxsb2MobGVuKTsKKworICAgIGlmICh0bXBLZXkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gTiAtIGNvdW50IG9mIHNhbXBsZXMKKyAgICBzbnByaW50Zih0bXBLZXksIGxlbiwgIiVzLm4iLCBrZXkpOworICAgIHN1bW1hdGlvbi5hZGRJbnQ2NCh0bXBLZXksIDEpOworCisgICAgLy8gemVybyAtIGNvdW50IG9mIHNhbXBsZXMgdGhhdCBhcmUgemVybworICAgIGlmICh2YWx1ZSA9PSAwKSB7CisgICAgICAgIHNucHJpbnRmKHRtcEtleSwgbGVuLCAiJXMuemVybyIsIGtleSk7CisgICAgICAgIGludDY0X3QgemVybyA9IDA7CisgICAgICAgICh2b2lkKSBzdW1tYXRpb24uZ2V0SW50NjQodG1wS2V5LCZ6ZXJvKTsKKyAgICAgICAgemVybysrOworICAgICAgICBzdW1tYXRpb24uc2V0SW50NjQodG1wS2V5LCB6ZXJvKTsKKyAgICB9CisKKyAgICAvLyBtaW4KKyAgICBzbnByaW50Zih0bXBLZXksIGxlbiwgIiVzLm1pbiIsIGtleSk7CisgICAgaW50NjRfdCBtaW4gPSB2YWx1ZTsKKyAgICBpZiAoc3VtbWF0aW9uLmdldEludDY0KHRtcEtleSwmbWluKSkgeworICAgICAgICBpZiAobWluID4gdmFsdWUpIHsKKyAgICAgICAgICAgIHN1bW1hdGlvbi5zZXRJbnQ2NCh0bXBLZXksIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN1bW1hdGlvbi5zZXRJbnQ2NCh0bXBLZXksIHZhbHVlKTsKKyAgICB9CisKKyAgICAvLyBtYXgKKyAgICBzbnByaW50Zih0bXBLZXksIGxlbiwgIiVzLm1heCIsIGtleSk7CisgICAgaW50NjRfdCBtYXggPSB2YWx1ZTsKKyAgICBpZiAoc3VtbWF0aW9uLmdldEludDY0KHRtcEtleSwmbWF4KSkgeworICAgICAgICBpZiAobWF4IDwgdmFsdWUpIHsKKyAgICAgICAgICAgIHN1bW1hdGlvbi5zZXRJbnQ2NCh0bXBLZXksIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN1bW1hdGlvbi5zZXRJbnQ2NCh0bXBLZXksIHZhbHVlKTsKKyAgICB9CisKKyAgICAvLyBjb21wb25lbnRzIGZvciBtZWFuLCBzdGRkZXY7CisgICAgLy8gc3RkZGV2ID0gc3FydCgxLzQqKHN1bXgyIC0gKDIqc3VteCpzdW14L24pICsgKChzdW14L24pXjIpKSkKKyAgICAvLyBzdW0geAorICAgIHNucHJpbnRmKHRtcEtleSwgbGVuLCAiJXMuc3VtWCIsIGtleSk7CisgICAgc3VtbWF0aW9uLmFkZEludDY0KHRtcEtleSwgdmFsdWUpOworICAgIC8vIHN1bSB4XjIKKyAgICBzbnByaW50Zih0bXBLZXksIGxlbiwgIiVzLnN1bVgyIiwga2V5KTsKKyAgICBzdW1tYXRpb24uYWRkSW50NjQodG1wS2V5LCB2YWx1ZSp2YWx1ZSk7CisKKworICAgIC8vIGxhc3QgdGhpbmcgd2UgZG8gLS0gcmVtb3ZlIHRoZSBiYXNlIGtleSBmcm9tIHRoZSBzdW1tYXRpb24KKyAgICAvLyByZWNvcmQgc28gd2Ugd29uJ3QgZ2V0IGNvbmZ1c2VkIGFib3V0IGl0IGhhdmluZyBib3RoIGluZGl2aWR1YWwKKyAgICAvLyBhbmQgc3VtbWFyeSBpbmZvcm1hdGlvbiBpbiB0aGVyZS4KKyAgICBzdW1tYXRpb24ucmVtb3ZlUHJvcChrZXkpOworCisgICAgZnJlZSh0bXBLZXkpOworfQorCiAKIC8vCiAvLyBDb21wYXJhdG9ycwpAQCAtMTg2LDIwICsyNTEsMjMgQEAKICAgICBBTE9HVigiTWV0cmljc1N1bW1hcml6ZXI6OnNhbWVBdHRyaWJ1dGVzKCk6IHN1bW0gJXMiLCBzdW1tLT50b1N0cmluZygpLmNfc3RyKCkpOwogICAgIEFMT0dWKCJNZXRyaWNzU3VtbWFyaXplcjo6c2FtZUF0dHJpYnV0ZXMoKTogc2luZ2xlICVzIiwgc2luZ2xlLT50b1N0cmluZygpLmNfc3RyKCkpOwogCisgICAgLy8ga2VlcCBkaWZmZXJlbnQgc291cmNlcy91c2VycyBzZXBhcmF0ZQorICAgIGlmIChzaW5nbGUtPm1VaWQgIT0gc3VtbS0+bVVpZCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCiAgICAgLy8gdGhpcyBjYW4gYmUgbWFkZSBiZXR0ZXIuCiAgICAgZm9yKHNpemVfdCBpPTA7aTxzaW5nbGUtPm1Qcm9wQ291bnQ7aSsrKSB7CiAgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbTo6UHJvcCAqcHJvcDEgPSAmKHNpbmdsZS0+bVByb3BzW2ldKTsKICAgICAgICAgY29uc3QgY2hhciAqYXR0ck5hbWUgPSBwcm9wMS0+bU5hbWU7Ci0gICAgICAgIEFMT0dWKCJjb21wYXJlIG9uIGF0dHIgJyVzJyIsIGF0dHJOYW1lKTsKIAogICAgICAgICAvLyBpcyBpdCBzb21ldGhpbmcgd2Ugc2hvdWxkIGlnbm9yZQogICAgICAgICBpZiAoaWdub3JhYmxlICE9IE5VTEwpIHsKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKippZyA9IGlnbm9yYWJsZTsKLSAgICAgICAgICAgIHdoaWxlICgqaWcpIHsKKyAgICAgICAgICAgIGZvciAoOyppZzsgaWcrKykgewogICAgICAgICAgICAgICAgIGlmIChzdHJjbXAoKmlnLCBhdHRyTmFtZSkgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWcrKzsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICgqaWcpIHsKICAgICAgICAgICAgICAgICBBTE9HVigid2UgZG9uJ3QgbWluZCB0aGF0IGl0IGhhcyBhdHRyICclcyciLCBhdHRyTmFtZSk7CkBAIC0yMTgsMjkgKzI4Niw0MiBAQAogICAgICAgICB9CiAgICAgICAgIHN3aXRjaCAocHJvcDEtPm1UeXBlKSB7CiAgICAgICAgICAgICBjYXNlIE1lZGlhQW5hbHl0aWNzSXRlbTo6a1R5cGVJbnQzMjoKLSAgICAgICAgICAgICAgICBpZiAocHJvcDEtPnUuaW50MzJWYWx1ZSAhPSBwcm9wMi0+dS5pbnQzMlZhbHVlKQorICAgICAgICAgICAgICAgIGlmIChwcm9wMS0+dS5pbnQzMlZhbHVlICE9IHByb3AyLT51LmludDMyVmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm1pc21hdGNoIHZhbHVlcyIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlSW50NjQ6Ci0gICAgICAgICAgICAgICAgaWYgKHByb3AxLT51LmludDY0VmFsdWUgIT0gcHJvcDItPnUuaW50NjRWYWx1ZSkKKyAgICAgICAgICAgICAgICBpZiAocHJvcDEtPnUuaW50NjRWYWx1ZSAhPSBwcm9wMi0+dS5pbnQ2NFZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJtaXNtYXRjaCB2YWx1ZXMiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZURvdWJsZToKICAgICAgICAgICAgICAgICAvLyBYWFg6IHdhdGNoIG91dCBmb3IgZmxvYXRpbmcgcG9pbnQgY29tcGFyaXNvbnMhCi0gICAgICAgICAgICAgICAgaWYgKHByb3AxLT51LmRvdWJsZVZhbHVlICE9IHByb3AyLT51LmRvdWJsZVZhbHVlKQorICAgICAgICAgICAgICAgIGlmIChwcm9wMS0+dS5kb3VibGVWYWx1ZSAhPSBwcm9wMi0+dS5kb3VibGVWYWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigibWlzbWF0Y2ggdmFsdWVzIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIE1lZGlhQW5hbHl0aWNzSXRlbTo6a1R5cGVDU3RyaW5nOgotICAgICAgICAgICAgICAgIGlmIChzdHJjbXAocHJvcDEtPnUuQ1N0cmluZ1ZhbHVlLCBwcm9wMi0+dS5DU3RyaW5nVmFsdWUpICE9IDApCisgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChwcm9wMS0+dS5DU3RyaW5nVmFsdWUsIHByb3AyLT51LkNTdHJpbmdWYWx1ZSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigibWlzbWF0Y2ggdmFsdWVzIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIE1lZGlhQW5hbHl0aWNzSXRlbTo6a1R5cGVSYXRlOgotICAgICAgICAgICAgICAgIGlmIChwcm9wMS0+dS5yYXRlLmNvdW50ICE9IHByb3AyLT51LnJhdGUuY291bnQpCisgICAgICAgICAgICAgICAgaWYgKHByb3AxLT51LnJhdGUuY291bnQgIT0gcHJvcDItPnUucmF0ZS5jb3VudCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigibWlzbWF0Y2ggdmFsdWVzIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAocHJvcDEtPnUucmF0ZS5kdXJhdGlvbiAhPSBwcm9wMi0+dS5yYXRlLmR1cmF0aW9uKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocHJvcDEtPnUucmF0ZS5kdXJhdGlvbiAhPSBwcm9wMi0+dS5yYXRlLmR1cmF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJtaXNtYXRjaCB2YWx1ZXMiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR1YoIm1pc21hdGNoIHZhbHVlcyBpbiBkZWZhdWx0IHR5cGUiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CkBAIC0yNDgsMTUgKzMyOSw2IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgTWV0cmljc1N1bW1hcml6ZXI6OnNhbWVBdHRyaWJ1dGVzSWQoTWVkaWFBbmFseXRpY3NJdGVtICpzdW1tLCBNZWRpYUFuYWx5dGljc0l0ZW0gKnNpbmdsZSwgY29uc3QgY2hhciAqKmlnbm9yYWJsZSkgewotCi0gICAgLy8gdmVyaWZ5IHNhbWUgdXNlcgotICAgIGlmIChzdW1tLT5tUGlkICE9IHNpbmdsZS0+bVBpZCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gYW5kIGZpbmFsbHkgZG8gdGhlIG1vcmUgZXhwZW5zaXZlIHZhbGlkYXRpb24gb2YgdGhlIGF0dHJpYnV0ZXMKLSAgICByZXR1cm4gc2FtZUF0dHJpYnV0ZXMoc3VtbSwgc2luZ2xlLCBpZ25vcmFibGUpOwotfQogCiBpbnQgTWV0cmljc1N1bW1hcml6ZXI6OlByb3BTb3J0ZXIoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikgewogICAgIE1lZGlhQW5hbHl0aWNzSXRlbTo6UHJvcCAqYWkgPSAoTWVkaWFBbmFseXRpY3NJdGVtOjpQcm9wICopYTsKQEAgLTI2NywxNCArMzM5LDggQEAKIC8vIHdlIHNvcnQgaW4gdGhlIHN1bW1hcmllcyBzbyB0aGF0IGl0IGxvb2tzIHByZXR0eSBpbiB0aGUgZHVtcHN5cwogdm9pZCBNZXRyaWNzU3VtbWFyaXplcjo6c29ydFByb3BzKE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSkgewogICAgIGlmIChpdGVtLT5tUHJvcENvdW50ICE9IDApIHsKLSAgICAgICAgaWYgKERFQlVHX1NPUlQpIHsKLSAgICAgICAgICAgIEFMT0dEKCJzb3J0UHJvcHMocHJlKTogJXMiLCBpdGVtLT50b1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICB9CiAgICAgICAgIHFzb3J0KGl0ZW0tPm1Qcm9wcywgaXRlbS0+bVByb3BDb3VudCwKICAgICAgICAgICAgICAgc2l6ZW9mKE1lZGlhQW5hbHl0aWNzSXRlbTo6UHJvcCksIE1ldHJpY3NTdW1tYXJpemVyOjpQcm9wU29ydGVyKTsKLSAgICAgICAgaWYgKERFQlVHX1NPUlQpIHsKLSAgICAgICAgICAgIEFMT0dEKCJzb3J0UHJvcHMocHN0KTogJXMiLCBpdGVtLT50b1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICB9CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplci5oIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXIuaAppbmRleCAwYjY0ZWFjLi5hOWYwNzg2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplci5oCisrKyBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyLmgKQEAgLTU5LDEwICs1OSw5IEBACiAKICAgICAvLyB2YXJpb3VzIGNvbXBhcmF0b3JzCiAgICAgLy8gImRvIHRoZXNlIHJlY29yZHMgaGF2ZSBzYW1lIGF0dHJpYnV0ZXMgYW5kIHZhbHVlcyBpbiB0aG9zZSBhdHRycyIKLSAgICAvLyBkaXR0bywgYnV0IHdhdGNoIGZvciAiZXJyb3IiIGZpZWxkcwogICAgIGJvb2wgc2FtZUF0dHJpYnV0ZXMoTWVkaWFBbmFseXRpY3NJdGVtICpzdW1tLCBNZWRpYUFuYWx5dGljc0l0ZW0gKnNpbmdsZSwgY29uc3QgY2hhciAqKmlnbm9yZWFibGVzKTsKLSAgICAvLyBhdHRyaWJ1dGVzICsgZnJvbSB0aGUgc2FtZSBhcHAvdXNlcmlkCi0gICAgYm9vbCBzYW1lQXR0cmlidXRlc0lkKE1lZGlhQW5hbHl0aWNzSXRlbSAqc3VtbSwgTWVkaWFBbmFseXRpY3NJdGVtICpzaW5nbGUsIGNvbnN0IGNoYXIgKippZ25vcmVhYmxlcyk7CisKKyAgICB2b2lkIG1pbk1heFZhcjY0KE1lZGlhQW5hbHl0aWNzSXRlbSAmc3VtbSwgY29uc3QgY2hhciAqa2V5LCBpbnQ2NF90IHZhbHVlKTsKIAogICAgIHN0YXRpYyBpbnQgUHJvcFNvcnRlcihjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKTsKICAgICB2b2lkIHNvcnRQcm9wcyhNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0pOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXJDb2RlYy5jcHAgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplckNvZGVjLmNwcAppbmRleCA4Yzc0NzgyLi42YWYzYzlhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplckNvZGVjLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplckNvZGVjLmNwcApAQCAtMTcsNiArMTcsOCBAQAogI2RlZmluZSBMT0dfVEFHICJNZXRyaWNzU3VtbWFyaXplckNvZGVjIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KQEAgLTQwLDUgKzQyLDQgQEAKICAgICBBTE9HVigiTWV0cmljc1N1bW1hcml6ZXJDb2RlYzo6TWV0cmljc1N1bW1hcml6ZXJDb2RlYyIpOwogfQogCi0KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyUGxheWVyLmNwcCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyUGxheWVyLmNwcAppbmRleCA1MTYyMDU5Li5mODgyY2I5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplclBsYXllci5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXJQbGF5ZXIuY3BwCkBAIC01MSwzNyArNTEsNDMgQEAKICAgICBzZXRJZ25vcmFibGVzKHBsYXllcl9pZ25vcmFibGUpOwogfQogCisvLyBOQjogdGhpcyBpcyBhbHNvIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUgLS0gc28gc3VtbWF0aW9uID09IGl0ZW0KKy8vIE5vdCBzdXJlIGlmIHdlIG5lZWQgYSBmbGFnIGZvciB0aGF0IG9yIG5vdC4KKy8vIEluIHRoaXMgcGFydGljdWxhciBtZXJnZVJlY29yZCgpIGNvZGUgLS0gd2UncmUnIG9rIGZvciB0aGlzLgogdm9pZCBNZXRyaWNzU3VtbWFyaXplclBsYXllcjo6bWVyZ2VSZWNvcmQoTWVkaWFBbmFseXRpY3NJdGVtICZzdW1tYXRpb24sIE1lZGlhQW5hbHl0aWNzSXRlbSAmaXRlbSkgewogCiAgICAgQUxPR1YoIk1ldHJpY3NTdW1tYXJpemVyUGxheWVyOjptZXJnZVJlY29yZCgpIik7CiAKLSAgICAvLwotICAgIC8vIHdlIHN1bSB0aW1lICYgZnJhbWVzLgotICAgIC8vIGJlIGNhcmVmdWwgYWJvdXQgb3VyIHNwZWNpYWwgIi0xIiB2YWx1ZXMgdGhhdCBpbmRpY2F0ZSAndW5rbm93bicKLSAgICAvLyB0cmVhdCB0aG9zZSBhcyAwIFtiYXNpY2FsbHksIG5vdCBzdW1taW5nIHRoZW0gaW50byB0aGUgdG90YWxzXS4KKwogICAgIGludDY0X3QgZHVyYXRpb24gPSAwOwogICAgIGlmIChpdGVtLmdldEludDY0KCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmR1cmF0aW9uTXMiLCAmZHVyYXRpb24pKSB7CiAgICAgICAgIEFMT0dWKCJmb3VuZCBkdXJhdGlvbk1zIG9mICUiIFBSSWQ2NCwgZHVyYXRpb24pOwotICAgICAgICBzdW1tYXRpb24uYWRkSW50NjQoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHVyYXRpb25NcyIsZHVyYXRpb24pOworICAgICAgICBtaW5NYXhWYXI2NChzdW1tYXRpb24sICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmR1cmF0aW9uTXMiLCBkdXJhdGlvbik7CiAgICAgfQorCiAgICAgaW50NjRfdCBwbGF5aW5nID0gMDsKLSAgICBpZiAoaXRlbS5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5wbGF5aW5nTXMiLCAmcGxheWluZykpCisgICAgaWYgKGl0ZW0uZ2V0SW50NjQoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIucGxheWluZ01zIiwgJnBsYXlpbmcpKSB7CiAgICAgICAgIEFMT0dWKCJmb3VuZCBwbGF5aW5nTXMgb2YgJSIgUFJJZDY0LCBwbGF5aW5nKTsKLSAgICAgICAgaWYgKHBsYXlpbmcgPj0gMCkgewotICAgICAgICAgICAgc3VtbWF0aW9uLmFkZEludDY0KCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnBsYXlpbmdNcyIscGxheWluZyk7Ci0gICAgICAgIH0KKyAgICB9CisgICAgaWYgKHBsYXlpbmcgPj0gMCkgeworICAgICAgICBtaW5NYXhWYXI2NChzdW1tYXRpb24sImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIucGxheWluZ01zIixwbGF5aW5nKTsKKyAgICB9CisKICAgICBpbnQ2NF90IGZyYW1lcyA9IDA7Ci0gICAgaWYgKGl0ZW0uZ2V0SW50NjQoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZnJhbWVzIiwgJmZyYW1lcykpCisgICAgaWYgKGl0ZW0uZ2V0SW50NjQoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZnJhbWVzIiwgJmZyYW1lcykpIHsKICAgICAgICAgQUxPR1YoImZvdW5kIGZyYW1lc3Mgb2YgJSIgUFJJZDY0LCBmcmFtZXMpOwotICAgICAgICBpZiAoZnJhbWVzID49IDApIHsKLSAgICAgICAgICAgIHN1bW1hdGlvbi5hZGRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5mcmFtZXMiLGZyYW1lcyk7Ci0gICAgICAgIH0KKyAgICB9CisgICAgaWYgKGZyYW1lcyA+PSAwKSB7CisgICAgICAgIG1pbk1heFZhcjY0KHN1bW1hdGlvbiwiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5mcmFtZXMiLGZyYW1lcyk7CisgICAgfQorCiAgICAgaW50NjRfdCBkcm9wcGVkID0gMDsKLSAgICBpZiAoaXRlbS5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5kcm9wcGVkIiwgJmRyb3BwZWQpKQorICAgIGlmIChpdGVtLmdldEludDY0KCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmRyb3BwZWQiLCAmZHJvcHBlZCkpIHsKICAgICAgICAgQUxPR1YoImZvdW5kIGRyb3BwZWQgb2YgJSIgUFJJZDY0LCBkcm9wcGVkKTsKLSAgICAgICAgaWYgKGRyb3BwZWQgPj0gMCkgewotICAgICAgICAgICAgc3VtbWF0aW9uLmFkZEludDY0KCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmRyb3BwZWQiLGRyb3BwZWQpOwotICAgICAgICB9CisgICAgfQorICAgIGlmIChkcm9wcGVkID49IDApIHsKKyAgICAgICAgbWluTWF4VmFyNjQoc3VtbWF0aW9uLCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmRyb3BwZWQiLGRyb3BwZWQpOworICAgIH0KIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvbWVkaWFtZXRyaWNzLnJjIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvbWVkaWFtZXRyaWNzLnJjCmluZGV4IDM4MjlmOGMuLjFlZmRlNWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL21lZGlhbWV0cmljcy5yYworKysgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9tZWRpYW1ldHJpY3MucmMKQEAgLTEsNSArMSw2IEBACiBzZXJ2aWNlIG1lZGlhbWV0cmljcyAvc3lzdGVtL2Jpbi9tZWRpYW1ldHJpY3MKICAgICBjbGFzcyBtYWluCiAgICAgdXNlciBtZWRpYQorICAgIGdyb3VwIG1lZGlhCiAgICAgaW9wcmlvIHJ0IDQKICAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzIC9kZXYvc3R1bmUvZm9yZWdyb3VuZC90YXNrcwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLm1rCmluZGV4IDY5OTdiNWEuLmZhZWIwYTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQubWsKQEAgLTksMTMgKzksOCBAQAogICAgIGxpYmd1aSBcCiAgICAgbGlidXRpbHMgXAogICAgIGxpYmxvZyBcCi0gICAgbGlic3RhZ2VmcmlnaHRfb214Ci1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICBmcmFtZXdvcmtzL2F2L2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CisgICAgbGlic3RhZ2VmcmlnaHRfb214IFwKKyAgICBsaWJzdGFnZWZyaWdodF94bWxwYXJzZXIKIExPQ0FMX01PRFVMRTo9IGxpYm1lZGlhY29kZWNzZXJ2aWNlCiBMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKIExPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKQEAgLTM4LDE1ICszMywxMCBAQAogICAgIGxpYmh3YmluZGVyIFwKICAgICBsaWJoaWRsdHJhbnNwb3J0IFwKICAgICBsaWJzdGFnZWZyaWdodF9vbXggXAorICAgIGxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlciBcCiAgICAgYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIFwKICAgICBhbmRyb2lkLmhpZGwubWVtb3J5QDEuMAogCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICBmcmFtZXdvcmtzL2F2L2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiBMT0NBTF9NT0RVTEUgOj0gYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wLXNlcnZpY2UKIExPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IGh3CiBMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvTWVkaWFDb2RlY1NlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFjb2RlYy9NZWRpYUNvZGVjU2VydmljZS5jcHAKaW5kZXggZmMxZTVkOS4uNmI1MTBjNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9NZWRpYUNvZGVjU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9NZWRpYUNvZGVjU2VydmljZS5jcHAKQEAgLTI0LDE1ICsyNCwyNSBAQAogCiBzcDxJT01YPiBNZWRpYUNvZGVjU2VydmljZTo6Z2V0T01YKCkgewogCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU9NWExvY2spOwogCiAgICAgaWYgKG1PTVguZ2V0KCkgPT0gTlVMTCkgewotICAgICAgICBtT01YID0gbmV3IE9NWDsKKyAgICAgICAgbU9NWCA9IG5ldyBPTVgoKTsKICAgICB9CiAKICAgICByZXR1cm4gbU9NWDsKIH0KIAorc3A8SU9NWFN0b3JlPiBNZWRpYUNvZGVjU2VydmljZTo6Z2V0T01YU3RvcmUoKSB7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU9NWFN0b3JlTG9jayk7CisKKyAgICBpZiAobU9NWFN0b3JlLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgbU9NWFN0b3JlID0gbmV3IE9NWFN0b3JlKCk7CisgICAgfQorCisgICAgcmV0dXJuIG1PTVhTdG9yZTsKK30KIAogc3RhdHVzX3QgTWVkaWFDb2RlY1NlcnZpY2U6Om9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LAogICAgICAgICB1aW50MzJfdCBmbGFncykKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvTWVkaWFDb2RlY1NlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhY29kZWMvTWVkaWFDb2RlY1NlcnZpY2UuaAppbmRleCBkNjRkZWJiLi45MzAxMTM1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL01lZGlhQ29kZWNTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9NZWRpYUNvZGVjU2VydmljZS5oCkBAIC0xOSwxMSArMTksMTMgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQ29kZWNTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8aW5jbHVkZS9PTVguaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgTWVkaWFDb2RlY1NlcnZpY2UgOiBwdWJsaWMgQmluZGVyU2VydmljZTxNZWRpYUNvZGVjU2VydmljZT4sIHB1YmxpYyBCbk1lZGlhQ29kZWNTZXJ2aWNlCitjbGFzcyBNZWRpYUNvZGVjU2VydmljZSA6IHB1YmxpYyBCaW5kZXJTZXJ2aWNlPE1lZGlhQ29kZWNTZXJ2aWNlPiwKKyAgICAgICAgcHVibGljIEJuTWVkaWFDb2RlY1NlcnZpY2UKIHsKICAgICBmcmllbmQgY2xhc3MgQmluZGVyU2VydmljZTxNZWRpYUNvZGVjU2VydmljZT47ICAgIC8vIGZvciBNZWRpYUNvZGVjU2VydmljZSgpCiBwdWJsaWM6CkBAIC0zMSwxNiArMzMsMjAgQEAKICAgICB2aXJ0dWFsIH5NZWRpYUNvZGVjU2VydmljZSgpIHsgfQogICAgIHZpcnR1YWwgdm9pZCBvbkZpcnN0UmVmKCkgeyB9CiAKLSAgICBzdGF0aWMgY29uc3QgY2hhciogIGdldFNlcnZpY2VOYW1lKCkgeyByZXR1cm4gIm1lZGlhLmNvZGVjIjsgfQorICAgIHN0YXRpYyBjb25zdCBjaGFyKiAgICBnZXRTZXJ2aWNlTmFtZSgpIHsgcmV0dXJuICJtZWRpYS5jb2RlYyI7IH0KIAotICAgIHZpcnR1YWwgc3A8SU9NWD4gICAgZ2V0T01YKCk7CisgICAgdmlydHVhbCBzcDxJT01YPiAgICAgIGdldE9NWCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgc3A8SU9NWFN0b3JlPiBnZXRPTVhTdG9yZSgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIG9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKTsKIAogcHJpdmF0ZToKLSAgICBNdXRleCAgICAgICAgICAgICAgIG1Mb2NrOwotICAgIHNwPElPTVg+ICAgICAgICAgICAgbU9NWDsKKyAgICBNdXRleCAgICAgICAgICAgICAgICAgbU9NWExvY2s7CisgICAgc3A8SU9NWD4gICAgICAgICAgICAgIG1PTVg7CisgICAgTXV0ZXggICAgICAgICAgICAgICAgIG1PTVhTdG9yZUxvY2s7CisgICAgc3A8SU9NWFN0b3JlPiAgICAgICAgIG1PTVhTdG9yZTsKIH07CiAKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX2NvZGVjc2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fY29kZWNzZXJ2aWNlLmNwcAppbmRleCBjNTk5NDRhLi43OWQ2ZGE1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fY29kZWNzZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fY29kZWNzZXJ2aWNlLmNwcApAQCAtMzIsOCArMzIsOCBAQAogI2luY2x1ZGUgIm1pbmlqYWlsLmgiCiAKICNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+Ci0jaW5jbHVkZSA8b214LzEuMC9PbXguaD4KLSNpbmNsdWRlIDxvbXgvMS4wL09teFN0b3JlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXguaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWRybS9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFkcm0vQW5kcm9pZC5tawppbmRleCA2YjMwZGI2Li4yZGFhODI5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWRybS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL21lZGlhZHJtL0FuZHJvaWQubWsKQEAgLTE3LDcgKzE3LDYgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TUkNfRklMRVM6PSBcCi0gICAgTWVkaWFDYXNTZXJ2aWNlLmNwcCBcCiAgICAgTWVkaWFEcm1TZXJ2aWNlLmNwcCBcCiAgICAgbWFpbl9tZWRpYWRybXNlcnZlci5jcHAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFkcm0vRmFjdG9yeUxvYWRlci5oIGIvc2VydmljZXMvbWVkaWFkcm0vRmFjdG9yeUxvYWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2YxMTE4Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhZHJtL0ZhY3RvcnlMb2FkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9DQVNfTE9BREVSX0hfCi0jZGVmaW5lIE1FRElBX0NBU19MT0FERVJfSF8KLQotI2luY2x1ZGUgPGRpcmVudC5oPgotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jaW5jbHVkZSA8bWVkaWEvU2hhcmVkTGlicmFyeS5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBtZWRpYTsKLXVzaW5nIG5hbWVzcGFjZSBNZWRpYUNhczsKLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1jbGFzcyBGYWN0b3J5TG9hZGVyIHsKLXB1YmxpYzoKLSAgICBGYWN0b3J5TG9hZGVyKGNvbnN0IGNoYXIgKm5hbWUpIDoKLSAgICAgICAgbUZhY3RvcnkoTlVMTCksIG1DcmVhdGVGYWN0b3J5RnVuY05hbWUobmFtZSkge30KLQotICAgIHZpcnR1YWwgfkZhY3RvcnlMb2FkZXIoKSB7IGNsb3NlRmFjdG9yeSgpOyB9Ci0KLSAgICBib29sIGZpbmRGYWN0b3J5Rm9yU2NoZW1lKAotICAgICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsCi0gICAgICAgICAgICBzcDxTaGFyZWRMaWJyYXJ5PiAqbGlicmFyeSA9IE5VTEwsCi0gICAgICAgICAgICBUKiogZmFjdG9yeSA9IE5VTEwpOwotCi0gICAgYm9vbCBlbnVtZXJhdGVQbHVnaW5zKHZlY3RvcjxQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcj4qIHJlc3VsdHMpOwotCi1wcml2YXRlOgotICAgIHR5cGVkZWYgVCooKkNyZWF0ZUZhY3RvcnlGdW5jKSgpOwotCi0gICAgTXV0ZXggbU1hcExvY2s7Ci0gICAgVCogbUZhY3Rvcnk7Ci0gICAgY29uc3QgY2hhciAqbUNyZWF0ZUZhY3RvcnlGdW5jTmFtZTsKLSAgICBzcDxTaGFyZWRMaWJyYXJ5PiBtTGlicmFyeTsKLSAgICBLZXllZFZlY3RvcjxpbnQzMl90LCBTdHJpbmc4PiBtQ0FTeXN0ZW1JZFRvTGlicmFyeVBhdGhNYXA7Ci0gICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgd3A8U2hhcmVkTGlicmFyeT4gPiBtTGlicmFyeVBhdGhUb09wZW5MaWJyYXJ5TWFwOwotCi0gICAgYm9vbCBsb2FkRmFjdG9yeUZvclNjaGVtZUZyb21QYXRoKAotICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmcGF0aCwKLSAgICAgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLAotICAgICAgICAgICAgc3A8U2hhcmVkTGlicmFyeT4gKmxpYnJhcnksCi0gICAgICAgICAgICBUKiogZmFjdG9yeSk7Ci0KLSAgICBib29sIHF1ZXJ5UGx1Z2luc0Zyb21QYXRoKAotICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmcGF0aCwKLSAgICAgICAgICAgIHZlY3RvcjxQYXJjZWxhYmxlQ2FzUGx1Z2luRGVzY3JpcHRvcj4qIHJlc3VsdHMpOwotCi0gICAgYm9vbCBvcGVuRmFjdG9yeShjb25zdCBTdHJpbmc4ICZwYXRoKTsKLSAgICB2b2lkIGNsb3NlRmFjdG9yeSgpOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1ib29sIEZhY3RvcnlMb2FkZXI8VD46OmZpbmRGYWN0b3J5Rm9yU2NoZW1lKAotICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwgc3A8U2hhcmVkTGlicmFyeT4gKmxpYnJhcnksIFQqKiBmYWN0b3J5KSB7Ci0gICAgaWYgKGxpYnJhcnkgIT0gTlVMTCkgewotICAgICAgICBsaWJyYXJ5LT5jbGVhcigpOwotICAgIH0KLSAgICBpZiAoZmFjdG9yeSAhPSBOVUxMKSB7Ci0gICAgICAgICpmYWN0b3J5ID0gTlVMTDsKLSAgICB9Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU1hcExvY2spOwotCi0gICAgLy8gZmlyc3QgY2hlY2sgY2FjaGUKLSAgICBzc2l6ZV90IGluZGV4ID0gbUNBU3lzdGVtSWRUb0xpYnJhcnlQYXRoTWFwLmluZGV4T2ZLZXkoQ0Ffc3lzdGVtX2lkKTsKLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICByZXR1cm4gbG9hZEZhY3RvcnlGb3JTY2hlbWVGcm9tUGF0aCgKLSAgICAgICAgICAgICAgICBtQ0FTeXN0ZW1JZFRvTGlicmFyeVBhdGhNYXBbaW5kZXhdLAotICAgICAgICAgICAgICAgIENBX3N5c3RlbV9pZCwgbGlicmFyeSwgZmFjdG9yeSk7Ci0gICAgfQotCi0gICAgLy8gbm8gbHVjaywgaGF2ZSB0byBzZWFyY2gKLSAgICBTdHJpbmc4IGRpclBhdGgoIi9zeXN0ZW0vbGliL21lZGlhY2FzIik7Ci0gICAgRElSKiBwRGlyID0gb3BlbmRpcihkaXJQYXRoLnN0cmluZygpKTsKLQotICAgIGlmIChwRGlyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvcGVuIHBsdWdpbiBkaXJlY3RvcnkgJXMiLCBkaXJQYXRoLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHN0cnVjdCBkaXJlbnQqIHBFbnRyeTsKLSAgICB3aGlsZSAoKHBFbnRyeSA9IHJlYWRkaXIocERpcikpKSB7Ci0gICAgICAgIFN0cmluZzggcGx1Z2luUGF0aCA9IGRpclBhdGggKyAiLyIgKyBwRW50cnktPmRfbmFtZTsKLSAgICAgICAgaWYgKHBsdWdpblBhdGguZ2V0UGF0aEV4dGVuc2lvbigpID09ICIuc28iKSB7Ci0gICAgICAgICAgICBpZiAobG9hZEZhY3RvcnlGb3JTY2hlbWVGcm9tUGF0aCgKLSAgICAgICAgICAgICAgICAgICAgcGx1Z2luUGF0aCwgQ0Ffc3lzdGVtX2lkLCBsaWJyYXJ5LCBmYWN0b3J5KSkgewotICAgICAgICAgICAgICAgIG1DQVN5c3RlbUlkVG9MaWJyYXJ5UGF0aE1hcC5hZGQoQ0Ffc3lzdGVtX2lkLCBwbHVnaW5QYXRoKTsKLSAgICAgICAgICAgICAgICBjbG9zZWRpcihwRGlyKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgY2xvc2VkaXIocERpcik7Ci0KLSAgICBBTE9HRSgiRmFpbGVkIHRvIGZpbmQgcGx1Z2luIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLWJvb2wgRmFjdG9yeUxvYWRlcjxUPjo6ZW51bWVyYXRlUGx1Z2lucygKLSAgICAgICAgdmVjdG9yPFBhcmNlbGFibGVDYXNQbHVnaW5EZXNjcmlwdG9yPiogcmVzdWx0cykgewotICAgIEFMT0dJKCJlbnVtZXJhdGVQbHVnaW5zIik7Ci0KLSAgICByZXN1bHRzLT5jbGVhcigpOwotCi0gICAgU3RyaW5nOCBkaXJQYXRoKCIvc3lzdGVtL2xpYi9tZWRpYWNhcyIpOwotICAgIERJUiogcERpciA9IG9wZW5kaXIoZGlyUGF0aC5zdHJpbmcoKSk7Ci0KLSAgICBpZiAocERpciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb3BlbiBwbHVnaW4gZGlyZWN0b3J5ICVzIiwgZGlyUGF0aC5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU1hcExvY2spOwotCi0gICAgc3RydWN0IGRpcmVudCogcEVudHJ5OwotICAgIHdoaWxlICgocEVudHJ5ID0gcmVhZGRpcihwRGlyKSkpIHsKLSAgICAgICAgU3RyaW5nOCBwbHVnaW5QYXRoID0gZGlyUGF0aCArICIvIiArIHBFbnRyeS0+ZF9uYW1lOwotICAgICAgICBpZiAocGx1Z2luUGF0aC5nZXRQYXRoRXh0ZW5zaW9uKCkgPT0gIi5zbyIpIHsKLSAgICAgICAgICAgIHF1ZXJ5UGx1Z2luc0Zyb21QYXRoKHBsdWdpblBhdGgsIHJlc3VsdHMpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLWJvb2wgRmFjdG9yeUxvYWRlcjxUPjo6bG9hZEZhY3RvcnlGb3JTY2hlbWVGcm9tUGF0aCgKLSAgICAgICAgY29uc3QgU3RyaW5nOCAmcGF0aCwgaW50MzJfdCBDQV9zeXN0ZW1faWQsCi0gICAgICAgIHNwPFNoYXJlZExpYnJhcnk+ICpsaWJyYXJ5LCBUKiogZmFjdG9yeSkgewotICAgIGNsb3NlRmFjdG9yeSgpOwotCi0gICAgaWYgKCFvcGVuRmFjdG9yeShwYXRoKSB8fCAhbUZhY3RvcnktPmlzU3lzdGVtSWRTdXBwb3J0ZWQoQ0Ffc3lzdGVtX2lkKSkgewotICAgICAgICBjbG9zZUZhY3RvcnkoKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChsaWJyYXJ5ICE9IE5VTEwpIHsKLSAgICAgICAgKmxpYnJhcnkgPSBtTGlicmFyeTsKLSAgICB9Ci0gICAgaWYgKGZhY3RvcnkgIT0gTlVMTCkgewotICAgICAgICAqZmFjdG9yeSA9IG1GYWN0b3J5OwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1ib29sIEZhY3RvcnlMb2FkZXI8VD46OnF1ZXJ5UGx1Z2luc0Zyb21QYXRoKAotICAgICAgICBjb25zdCBTdHJpbmc4ICZwYXRoLCB2ZWN0b3I8UGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3I+KiByZXN1bHRzKSB7Ci0gICAgY2xvc2VGYWN0b3J5KCk7Ci0KLSAgICB2ZWN0b3I8Q2FzUGx1Z2luRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnM7Ci0gICAgaWYgKCFvcGVuRmFjdG9yeShwYXRoKSB8fCBtRmFjdG9yeS0+cXVlcnlQbHVnaW5zKCZkZXNjcmlwdG9ycykgIT0gT0spIHsKLSAgICAgICAgY2xvc2VGYWN0b3J5KCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBmb3IgKGF1dG8gaXQgPSBkZXNjcmlwdG9ycy5iZWdpbigpOyBpdCAhPSBkZXNjcmlwdG9ycy5lbmQoKTsgaXQrKykgewotICAgICAgICByZXN1bHRzLT5wdXNoX2JhY2soUGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgaXQtPkNBX3N5c3RlbV9pZCwgaXQtPm5hbWUpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPgotYm9vbCBGYWN0b3J5TG9hZGVyPFQ+OjpvcGVuRmFjdG9yeShjb25zdCBTdHJpbmc4ICZwYXRoKSB7Ci0gICAgLy8gZ2V0IHN0cm9uZyBwb2ludGVyIHRvIG9wZW4gc2hhcmVkIGxpYnJhcnkKLSAgICBzc2l6ZV90IGluZGV4ID0gbUxpYnJhcnlQYXRoVG9PcGVuTGlicmFyeU1hcC5pbmRleE9mS2V5KHBhdGgpOwotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIG1MaWJyYXJ5ID0gbUxpYnJhcnlQYXRoVG9PcGVuTGlicmFyeU1hcFtpbmRleF0ucHJvbW90ZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGV4ID0gbUxpYnJhcnlQYXRoVG9PcGVuTGlicmFyeU1hcC5hZGQocGF0aCwgTlVMTCk7Ci0gICAgfQotCi0gICAgaWYgKCFtTGlicmFyeS5nZXQoKSkgewotICAgICAgICBtTGlicmFyeSA9IG5ldyBTaGFyZWRMaWJyYXJ5KHBhdGgpOwotICAgICAgICBpZiAoISptTGlicmFyeSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgbUxpYnJhcnlQYXRoVG9PcGVuTGlicmFyeU1hcC5yZXBsYWNlVmFsdWVBdChpbmRleCwgbUxpYnJhcnkpOwotICAgIH0KLQotICAgIENyZWF0ZUZhY3RvcnlGdW5jIGNyZWF0ZUZhY3RvcnkgPQotICAgICAgICAoQ3JlYXRlRmFjdG9yeUZ1bmMpbUxpYnJhcnktPmxvb2t1cChtQ3JlYXRlRmFjdG9yeUZ1bmNOYW1lKTsKLSAgICBpZiAoY3JlYXRlRmFjdG9yeSA9PSBOVUxMIHx8IChtRmFjdG9yeSA9IGNyZWF0ZUZhY3RvcnkoKSkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLXZvaWQgRmFjdG9yeUxvYWRlcjxUPjo6Y2xvc2VGYWN0b3J5KCkgewotICAgIGRlbGV0ZSBtRmFjdG9yeTsKLSAgICBtRmFjdG9yeSA9IE5VTEw7Ci0gICAgbUxpYnJhcnkuY2xlYXIoKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gTUVESUFfQ0FTX0xPQURFUl9IXwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFkcm0vTWVkaWFDYXNTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhZHJtL01lZGlhQ2FzU2VydmljZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMTEyODMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvbWVkaWFkcm0vTWVkaWFDYXNTZXJ2aWNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJNZWRpYUNhc1NlcnZpY2UiCi0KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvY2FzL0Nhc0FQSS5oPgotI2luY2x1ZGUgPG1lZGlhL2Nhcy9EZXNjcmFtYmxlckFQSS5oPgotI2luY2x1ZGUgPG1lZGlhL0Nhc0ltcGwuaD4KLSNpbmNsdWRlIDxtZWRpYS9EZXNjcmFtYmxlckltcGwuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+Ci0jaW5jbHVkZSAiTWVkaWFDYXNTZXJ2aWNlLmgiCi0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JQ2FzTGlzdGVuZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vL3N0YXRpYwotdm9pZCBNZWRpYUNhc1NlcnZpY2U6Omluc3RhbnRpYXRlKCkgewotICAgIGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5hZGRTZXJ2aWNlKAotICAgICAgICAgICAgU3RyaW5nMTYoIm1lZGlhLmNhcyIpLCBuZXcgTWVkaWFDYXNTZXJ2aWNlKCkpOwotfQotCi1NZWRpYUNhc1NlcnZpY2U6Ok1lZGlhQ2FzU2VydmljZSgpIDoKLSAgICBtQ2FzTG9hZGVyKG5ldyBGYWN0b3J5TG9hZGVyPENhc0ZhY3Rvcnk+KCJjcmVhdGVDYXNGYWN0b3J5IikpLAotICAgIG1EZXNjcmFtYmxlckxvYWRlcihuZXcgRmFjdG9yeUxvYWRlcjxEZXNjcmFtYmxlckZhY3Rvcnk+KAotICAgICAgICAgICAgImNyZWF0ZURlc2NyYW1ibGVyRmFjdG9yeSIpKSB7Ci19Ci0KLU1lZGlhQ2FzU2VydmljZTo6fk1lZGlhQ2FzU2VydmljZSgpIHsKLSAgICBkZWxldGUgbUNhc0xvYWRlcjsKLSAgICBkZWxldGUgbURlc2NyYW1ibGVyTG9hZGVyOwotfQotCi1TdGF0dXMgTWVkaWFDYXNTZXJ2aWNlOjplbnVtZXJhdGVQbHVnaW5zKAotICAgICAgICB2ZWN0b3I8UGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3I+KiByZXN1bHRzKSB7Ci0gICAgQUxPR1YoImVudW1lcmF0ZVBsdWdpbnMiKTsKLQotICAgIG1DYXNMb2FkZXItPmVudW1lcmF0ZVBsdWdpbnMocmVzdWx0cyk7Ci0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgTWVkaWFDYXNTZXJ2aWNlOjppc1N5c3RlbUlkU3VwcG9ydGVkKAotICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwgYm9vbCogcmVzdWx0KSB7Ci0gICAgQUxPR1YoImlzU3lzdGVtSWRTdXBwb3J0ZWQ6IENBX3N5c3RlbV9pZD0lZCIsIENBX3N5c3RlbV9pZCk7Ci0KLSAgICAqcmVzdWx0ID0gbUNhc0xvYWRlci0+ZmluZEZhY3RvcnlGb3JTY2hlbWUoQ0Ffc3lzdGVtX2lkKTsKLQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBNZWRpYUNhc1NlcnZpY2U6OmNyZWF0ZVBsdWdpbigKLSAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsCi0gICAgICAgIGNvbnN0IHNwPElDYXNMaXN0ZW5lcj4gJmxpc3RlbmVyLAotICAgICAgICBzcDxJQ2FzPiogcmVzdWx0KSB7Ci0gICAgQUxPR1YoImNyZWF0ZVBsdWdpbjogQ0Ffc3lzdGVtX2lkPSVkIiwgQ0Ffc3lzdGVtX2lkKTsKLQotICAgIHJlc3VsdC0+Y2xlYXIoKTsKLQotICAgIENhc0ZhY3RvcnkgKmZhY3Rvcnk7Ci0gICAgc3A8U2hhcmVkTGlicmFyeT4gbGlicmFyeTsKLSAgICBpZiAobUNhc0xvYWRlci0+ZmluZEZhY3RvcnlGb3JTY2hlbWUoQ0Ffc3lzdGVtX2lkLCAmbGlicmFyeSwgJmZhY3RvcnkpKSB7Ci0gICAgICAgIENhc1BsdWdpbiAqcGx1Z2luID0gTlVMTDsKLSAgICAgICAgc3A8Q2FzSW1wbD4gY2FzSW1wbCA9IG5ldyBDYXNJbXBsKGxpc3RlbmVyKTsKLSAgICAgICAgaWYgKGZhY3RvcnktPmNyZWF0ZVBsdWdpbihDQV9zeXN0ZW1faWQsICh1aW50NjRfdCljYXNJbXBsLmdldCgpLAotICAgICAgICAgICAgICAgICZDYXNJbXBsOjpPbkV2ZW50LCAmcGx1Z2luKSA9PSBPSyAmJiBwbHVnaW4gIT0gTlVMTCkgewotICAgICAgICAgICAgY2FzSW1wbC0+aW5pdChsaWJyYXJ5LCBwbHVnaW4pOwotICAgICAgICAgICAgKnJlc3VsdCA9IGNhc0ltcGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgTWVkaWFDYXNTZXJ2aWNlOjppc0Rlc2NyYW1ibGVyU3VwcG9ydGVkKAotICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwgYm9vbCogcmVzdWx0KSB7Ci0gICAgQUxPR1YoImlzRGVzY3JhbWJsZXJTdXBwb3J0ZWQ6IENBX3N5c3RlbV9pZD0lZCIsIENBX3N5c3RlbV9pZCk7Ci0KLSAgICAqcmVzdWx0ID0gbURlc2NyYW1ibGVyTG9hZGVyLT5maW5kRmFjdG9yeUZvclNjaGVtZShDQV9zeXN0ZW1faWQpOwotCi0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIE1lZGlhQ2FzU2VydmljZTo6Y3JlYXRlRGVzY3JhbWJsZXIoCi0gICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLCBzcDxJRGVzY3JhbWJsZXI+KiByZXN1bHQpIHsKLSAgICBBTE9HVigiY3JlYXRlRGVzY3JhbWJsZXI6IENBX3N5c3RlbV9pZD0lZCIsIENBX3N5c3RlbV9pZCk7Ci0KLSAgICByZXN1bHQtPmNsZWFyKCk7Ci0KLSAgICBEZXNjcmFtYmxlckZhY3RvcnkgKmZhY3Rvcnk7Ci0gICAgc3A8U2hhcmVkTGlicmFyeT4gbGlicmFyeTsKLSAgICBpZiAobURlc2NyYW1ibGVyTG9hZGVyLT5maW5kRmFjdG9yeUZvclNjaGVtZSgKLSAgICAgICAgICAgIENBX3N5c3RlbV9pZCwgJmxpYnJhcnksICZmYWN0b3J5KSkgewotICAgICAgICBEZXNjcmFtYmxlclBsdWdpbiAqcGx1Z2luID0gTlVMTDsKLSAgICAgICAgaWYgKGZhY3RvcnktPmNyZWF0ZVBsdWdpbihDQV9zeXN0ZW1faWQsICZwbHVnaW4pID09IE9LCi0gICAgICAgICAgICAgICAgJiYgcGx1Z2luICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpyZXN1bHQgPSBuZXcgRGVzY3JhbWJsZXJJbXBsKGxpYnJhcnksIHBsdWdpbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWRybS9NZWRpYUNhc1NlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhZHJtL01lZGlhQ2FzU2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjgyOGYyLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhZHJtL01lZGlhQ2FzU2VydmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfQ0FTX1NFUlZJQ0VfSF8KLSNkZWZpbmUgTUVESUFfQ0FTX1NFUlZJQ0VfSF8KLQotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQm5NZWRpYUNhc1NlcnZpY2UuaD4KLQotI2luY2x1ZGUgIkZhY3RvcnlMb2FkZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotdXNpbmcgYmluZGVyOjpTdGF0dXM7Ci1zdHJ1Y3QgQ2FzRmFjdG9yeTsKLXN0cnVjdCBEZXNjcmFtYmxlckZhY3Rvcnk7Ci0KLWNsYXNzIE1lZGlhQ2FzU2VydmljZSA6IHB1YmxpYyBCbk1lZGlhQ2FzU2VydmljZSB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIHZvaWQgaW5zdGFudGlhdGUoKTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIGVudW1lcmF0ZVBsdWdpbnMoCi0gICAgICAgICAgICB2ZWN0b3I8UGFyY2VsYWJsZUNhc1BsdWdpbkRlc2NyaXB0b3I+KiByZXN1bHRzKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIGlzU3lzdGVtSWRTdXBwb3J0ZWQoCi0gICAgICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwgYm9vbCogcmVzdWx0KSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIGNyZWF0ZVBsdWdpbigKLSAgICAgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLAotICAgICAgICAgICAgY29uc3Qgc3A8SUNhc0xpc3RlbmVyPiAmbGlzdGVuZXIsCi0gICAgICAgICAgICBzcDxJQ2FzPiogcmVzdWx0KSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIGlzRGVzY3JhbWJsZXJTdXBwb3J0ZWQoCi0gICAgICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwgYm9vbCogcmVzdWx0KSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgU3RhdHVzIGNyZWF0ZURlc2NyYW1ibGVyKAotICAgICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsIHNwPElEZXNjcmFtYmxlcj4qIHJlc3VsdCkgb3ZlcnJpZGU7Ci0KLXByaXZhdGU6Ci0gICAgRmFjdG9yeUxvYWRlcjxDYXNGYWN0b3J5PiAqbUNhc0xvYWRlcjsKLSAgICBGYWN0b3J5TG9hZGVyPERlc2NyYW1ibGVyRmFjdG9yeT4gKm1EZXNjcmFtYmxlckxvYWRlcjsKLQotICAgIE1lZGlhQ2FzU2VydmljZSgpOwotICAgIHZpcnR1YWwgfk1lZGlhQ2FzU2VydmljZSgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gTUVESUFfQ0FTX1NFUlZJQ0VfSF8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZHJtL21haW5fbWVkaWFkcm1zZXJ2ZXIuY3BwIGIvc2VydmljZXMvbWVkaWFkcm0vbWFpbl9tZWRpYWRybXNlcnZlci5jcHAKaW5kZXggYjY4NWFlMC4uYjc2N2I4YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFkcm0vbWFpbl9tZWRpYWRybXNlcnZlci5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFkcm0vbWFpbl9tZWRpYWRybXNlcnZlci5jcHAKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgIk1lZGlhRHJtU2VydmljZS5oIgotI2luY2x1ZGUgIk1lZGlhQ2FzU2VydmljZS5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIApAQCAtMzksNyArMzgsNiBAQAogICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKICAgICBBTE9HSSgiU2VydmljZU1hbmFnZXI6ICVwIiwgc20uZ2V0KCkpOwogICAgIE1lZGlhRHJtU2VydmljZTo6aW5zdGFudGlhdGUoKTsKLSAgICBNZWRpYUNhc1NlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwogICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmpvaW5UaHJlYWRQb29sKCk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmNwcAppbmRleCBlYzJmNWI5Li5mOTk2Zjc0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5jcHAKQEAgLTI2LDYgKzI2LDEwIEBACiAjaW5jbHVkZSA8dXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaD4KIAogI2luY2x1ZGUgIkFBdWRpb0VuZHBvaW50TWFuYWdlci5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuaCIKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmgiCisjaW5jbHVkZSAiQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87CkBAIC0zNCwxNTkgKzM4LDIzNyBAQAogCiBBQXVkaW9FbmRwb2ludE1hbmFnZXI6OkFBdWRpb0VuZHBvaW50TWFuYWdlcigpCiAgICAgICAgIDogU2luZ2xldG9uPEFBdWRpb0VuZHBvaW50TWFuYWdlcj4oKQotICAgICAgICAsIG1JbnB1dHMoKQotICAgICAgICAsIG1PdXRwdXRzKCkgeworICAgICAgICAsIG1TaGFyZWRTdHJlYW1zKCkKKyAgICAgICAgLCBtRXhjbHVzaXZlU3RyZWFtcygpIHsKIH0KIAogc3RkOjpzdHJpbmcgQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpkdW1wKCkgY29uc3QgewogICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHJlc3VsdDsKLSAgICBjb25zdCBib29sIGlzTG9ja2VkID0gQUF1ZGlvX3RyeVVudGlsVHJ1ZSgKLSAgICAgICAgICAgIFt0aGlzXSgpLT5ib29sIHsgcmV0dXJuIG1Mb2NrLnRyeV9sb2NrKCk7IH0gLyogZiAqLywKLSAgICAgICAgICAgIDUwIC8qIHRpbWVzICovLAotICAgICAgICAgICAgMjAgLyogc2xlZXBNcyAqLyk7Ci0gICAgaWYgKCFpc0xvY2tlZCkgewotICAgICAgICByZXN1bHQgPDwgIkVuZHBvaW50TWFuYWdlciBtYXkgYmUgZGVhZGxvY2tlZFxuIjsKLSAgICB9CisgICAgaW50IGluZGV4ID0gMDsKIAogICAgIHJlc3VsdCA8PCAiQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOiIgPDwgIlxuIjsKLSAgICBzaXplX3QgaW5wdXRzID0gbUlucHV0cy5zaXplKCk7Ci0gICAgcmVzdWx0IDw8ICJJbnB1dCBFbmRwb2ludHM6ICIgPDwgaW5wdXRzIDw8ICJcbiI7Ci0gICAgZm9yIChjb25zdCBhdXRvICZpbnB1dCA6IG1JbnB1dHMpIHsKLSAgICAgICAgcmVzdWx0IDw8ICIgIElucHV0OiAiIDw8IGlucHV0LT5kdW1wKCkgPDwgIlxuIjsKKworICAgIGNvbnN0IGJvb2wgaXNTaGFyZWRMb2NrZWQgPSBBQXVkaW9fdHJ5VW50aWxUcnVlKAorICAgICAgICAgICAgW3RoaXNdKCktPmJvb2wgeyByZXR1cm4gbVNoYXJlZExvY2sudHJ5X2xvY2soKTsgfSAvKiBmICovLAorICAgICAgICAgICAgNTAgLyogdGltZXMgKi8sCisgICAgICAgICAgICAyMCAvKiBzbGVlcE1zICovKTsKKyAgICBpZiAoIWlzU2hhcmVkTG9ja2VkKSB7CisgICAgICAgIHJlc3VsdCA8PCAiQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyIFNoYXJlZCBtYXkgYmUgZGVhZGxvY2tlZFxuIjsKICAgICB9CiAKLSAgICBzaXplX3Qgb3V0cHV0cyA9IG1PdXRwdXRzLnNpemUoKTsKLSAgICByZXN1bHQgPDwgIk91dHB1dCBFbmRwb2ludHM6ICIgPDwgb3V0cHV0cyA8PCAiXG4iOwotICAgIGZvciAoY29uc3QgYXV0byAmb3V0cHV0IDogbU91dHB1dHMpIHsKLSAgICAgICAgcmVzdWx0IDw8ICIgIE91dHB1dDogIiA8PCBvdXRwdXQtPmR1bXAoKSA8PCAiXG4iOworICAgIHsKKyAgICAgICAgY29uc3QgYm9vbCBpc0V4Y2x1c2l2ZUxvY2tlZCA9IEFBdWRpb190cnlVbnRpbFRydWUoCisgICAgICAgICAgICAgICAgW3RoaXNdKCkgLT4gYm9vbCB7IHJldHVybiBtRXhjbHVzaXZlTG9jay50cnlfbG9jaygpOyB9IC8qIGYgKi8sCisgICAgICAgICAgICAgICAgNTAgLyogdGltZXMgKi8sCisgICAgICAgICAgICAgICAgMjAgLyogc2xlZXBNcyAqLyk7CisgICAgICAgIGlmICghaXNFeGNsdXNpdmVMb2NrZWQpIHsKKyAgICAgICAgICAgIHJlc3VsdCA8PCAiQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyIEV4Y2x1c2l2ZSBtYXkgYmUgZGVhZGxvY2tlZFxuIjsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA8PCAiRXhjbHVzaXZlIE1NQVAgRW5kcG9pbnRzOiAiIDw8IG1FeGNsdXNpdmVTdHJlYW1zLnNpemUoKSA8PCAiXG4iOworICAgICAgICBpbmRleCA9IDA7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmb3V0cHV0IDogbUV4Y2x1c2l2ZVN0cmVhbXMpIHsKKyAgICAgICAgICAgIHJlc3VsdCA8PCAiICAjIiA8PCBpbmRleCsrIDw8ICI6IjsKKyAgICAgICAgICAgIHJlc3VsdCA8PCBvdXRwdXQtPmR1bXAoKSA8PCAiXG4iOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzRXhjbHVzaXZlTG9ja2VkKSB7CisgICAgICAgICAgICBtRXhjbHVzaXZlTG9jay51bmxvY2soKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChpc0xvY2tlZCkgewotICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICByZXN1bHQgPDwgIlNoYXJlZCBFbmRwb2ludHM6ICIgPDwgbVNoYXJlZFN0cmVhbXMuc2l6ZSgpIDw8ICJcbiI7CisgICAgaW5kZXggPSAwOworICAgIGZvciAoY29uc3QgYXV0byAmaW5wdXQgOiBtU2hhcmVkU3RyZWFtcykgeworICAgICAgICByZXN1bHQgPDwgIiAgIyIgPDwgaW5kZXgrKyA8PCAiOiI7CisgICAgICAgIHJlc3VsdCA8PCBpbnB1dC0+ZHVtcCgpIDw8ICJcbiI7CisgICAgfQorCisgICAgaWYgKGlzU2hhcmVkTG9ja2VkKSB7CisgICAgICAgIG1TaGFyZWRMb2NrLnVubG9jaygpOwogICAgIH0KICAgICByZXR1cm4gcmVzdWx0LnN0cigpOwogfQogCi1BQXVkaW9TZXJ2aWNlRW5kcG9pbnQgKkFBdWRpb0VuZHBvaW50TWFuYWdlcjo6b3BlbkVuZHBvaW50KEFBdWRpb1NlcnZpY2UgJmF1ZGlvU2VydmljZSwKLSAgICAgICAgY29uc3QgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbiwgYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgewotICAgIEFBdWRpb1NlcnZpY2VFbmRwb2ludCAqZW5kcG9pbnQgPSBudWxscHRyOwotICAgIEFBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUgKmNhcHR1cmUgPSBudWxscHRyOwotICAgIEFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkgKnBsYXllciA9IG51bGxwdHI7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworCisvLyBUcnkgdG8gZmluZCBhbiBleGlzdGluZyBlbmRwb2ludC4KK3NwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpmaW5kRXhjbHVzaXZlRW5kcG9pbnRfbCgKKyAgICAgICAgY29uc3QgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbikgeworICAgIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gZW5kcG9pbnQ7CisgICAgZm9yIChjb25zdCBhdXRvIGVwIDogbUV4Y2x1c2l2ZVN0cmVhbXMpIHsKKyAgICAgICAgaWYgKGVwLT5tYXRjaGVzKGNvbmZpZ3VyYXRpb24pKSB7CisgICAgICAgICAgICBlbmRwb2ludCA9IGVwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigiQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmZpbmRFeGNsdXNpdmVFbmRwb2ludF9sKCksIGZvdW5kICVwIGZvciBkZXZpY2UgPSAlZCIsCisgICAgICAgICAgZW5kcG9pbnQuZ2V0KCksIGNvbmZpZ3VyYXRpb24uZ2V0RGV2aWNlSWQoKSk7CisgICAgcmV0dXJuIGVuZHBvaW50OworfQorCisvLyBUcnkgdG8gZmluZCBhbiBleGlzdGluZyBlbmRwb2ludC4KK3NwPEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZD4gQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpmaW5kU2hhcmVkRW5kcG9pbnRfbCgKKyAgICAgICAgY29uc3QgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbikgeworICAgIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZD4gZW5kcG9pbnQ7CisgICAgZm9yIChjb25zdCBhdXRvIGVwICA6IG1TaGFyZWRTdHJlYW1zKSB7CisgICAgICAgIGlmIChlcC0+bWF0Y2hlcyhjb25maWd1cmF0aW9uKSkgeworICAgICAgICAgICAgZW5kcG9pbnQgPSBlcDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoIkFBdWRpb0VuZHBvaW50TWFuYWdlci5maW5kU2hhcmVkRW5kcG9pbnRfbCgpLCBmb3VuZCAlcCBmb3IgZGV2aWNlID0gJWQiLAorICAgICAgICAgIGVuZHBvaW50LmdldCgpLCBjb25maWd1cmF0aW9uLmdldERldmljZUlkKCkpOworICAgIHJldHVybiBlbmRwb2ludDsKK30KKworc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBBQXVkaW9FbmRwb2ludE1hbmFnZXI6Om9wZW5FbmRwb2ludChBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSkgeworICAgIGlmIChzaGFyaW5nTW9kZSA9PSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSkgeworICAgICAgICByZXR1cm4gb3BlbkV4Y2x1c2l2ZUVuZHBvaW50KGF1ZGlvU2VydmljZSwgcmVxdWVzdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG9wZW5TaGFyZWRFbmRwb2ludChhdWRpb1NlcnZpY2UsIHJlcXVlc3QpOworICAgIH0KK30KKworc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBBQXVkaW9FbmRwb2ludE1hbmFnZXI6Om9wZW5FeGNsdXNpdmVFbmRwb2ludCgKKyAgICAgICAgQUF1ZGlvU2VydmljZSAmYWF1ZGlvU2VydmljZSBfX3VudXNlZCwKKyAgICAgICAgY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSB7CisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtRXhjbHVzaXZlTG9jayk7CisKKyAgICBjb25zdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uID0gcmVxdWVzdC5nZXRDb25zdGFudENvbmZpZ3VyYXRpb24oKTsKIAogICAgIC8vIFRyeSB0byBmaW5kIGFuIGV4aXN0aW5nIGVuZHBvaW50LgorICAgIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gZW5kcG9pbnQgPSBmaW5kRXhjbHVzaXZlRW5kcG9pbnRfbChjb25maWd1cmF0aW9uKTsKIAorICAgIC8vIElmIHdlIGZpbmQgYW4gZXhpc3Rpbmcgb25lIHRoZW4gdGhpcyBvbmUgY2Fubm90IGJlIGV4Y2x1c2l2ZS4KKyAgICBpZiAoZW5kcG9pbnQuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLm9wZW5FeGNsdXNpdmVFbmRwb2ludCgpIGFscmVhZHkgaW4gdXNlIik7CisgICAgICAgIC8vIEFscmVhZHkgb3BlbiBzbyBkbyBub3QgYWxsb3cgYSBzZWNvbmQgc3RyZWFtLgorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9IGVsc2UgeworICAgICAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQPiBlbmRwb2ludE1NYXAgPSBuZXcgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUCgpOworICAgICAgICBBTE9HRSgiQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLm9wZW5FbmRwb2ludCgpLGNyZWF0ZWQgTU1BUCAlcCIsIGVuZHBvaW50TU1hcC5nZXQoKSk7CisgICAgICAgIGVuZHBvaW50ID0gZW5kcG9pbnRNTWFwOwogCi0KLSAgICBzd2l0Y2ggKGRpcmVjdGlvbikgewotICAgICAgICBjYXNlIEFBVURJT19ESVJFQ1RJT05fSU5QVVQ6Ci0gICAgICAgICAgICBmb3IgKEFBdWRpb1NlcnZpY2VFbmRwb2ludCAqZXAgOiBtSW5wdXRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVwLT5tYXRjaGVzKGNvbmZpZ3VyYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuZHBvaW50ID0gZXA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFBVURJT19ESVJFQ1RJT05fT1VUUFVUOgotICAgICAgICAgICAgZm9yIChBQXVkaW9TZXJ2aWNlRW5kcG9pbnQgKmVwIDogbU91dHB1dHMpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXAtPm1hdGNoZXMoY29uZmlndXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnQgPSBlcDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBhc3NlcnQoZmFsc2UpOyAvLyBUaGVyZSBhcmUgb25seSB0d28gcG9zc2libGUgZGlyZWN0aW9ucy4KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBBTE9HRCgiQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpvcGVuRW5kcG9pbnQoKSwgZm91bmQgJXAgZm9yIGRldmljZSA9ICVkLCBkaXIgPSAlZCIsCi0gICAgICAgICAgZW5kcG9pbnQsIGNvbmZpZ3VyYXRpb24uZ2V0RGV2aWNlSWQoKSwgKGludClkaXJlY3Rpb24pOwotCi0gICAgLy8gSWYgd2UgY2FuJ3QgZmluZCBhbiBleGlzdGluZyBvbmUgdGhlbiBvcGVuIGEgbmV3IG9uZS4KLSAgICBpZiAoZW5kcG9pbnQgPT0gbnVsbHB0cikgewotICAgICAgICAvLyB3ZSBtdXN0IGNhbGwgb3BlblN0cmVhbSB3aXRoIGF1ZGlvc2VydmVyIGlkZW50aXR5Ci0gICAgICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgICAgICBzd2l0Y2goZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICBjYXNlIEFBVURJT19ESVJFQ1RJT05fSU5QVVQ6Ci0gICAgICAgICAgICAgICAgY2FwdHVyZSA9IG5ldyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlKGF1ZGlvU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgZW5kcG9pbnQgPSBjYXB0dXJlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBQVVESU9fRElSRUNUSU9OX09VVFBVVDoKLSAgICAgICAgICAgICAgICBwbGF5ZXIgPSBuZXcgQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheShhdWRpb1NlcnZpY2UpOwotICAgICAgICAgICAgICAgIGVuZHBvaW50ID0gcGxheWVyOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGVuZHBvaW50LT5vcGVuKHJlcXVlc3QpOworICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgQUxPR0UoIkFBdWRpb0VuZHBvaW50TWFuYWdlci5vcGVuRW5kcG9pbnQoKSwgb3BlbiBmYWlsZWQiKTsKKyAgICAgICAgICAgIGVuZHBvaW50LmNsZWFyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtRXhjbHVzaXZlU3RyZWFtcy5wdXNoX2JhY2soZW5kcG9pbnRNTWFwKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChlbmRwb2ludCAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gZW5kcG9pbnQtPm9wZW4oY29uZmlndXJhdGlvbik7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJBQXVkaW9FbmRwb2ludE1hbmFnZXI6OmZpbmRFbmRwb2ludCgpLCBvcGVuIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBlbmRwb2ludDsKLSAgICAgICAgICAgICAgICBlbmRwb2ludCA9IG51bGxwdHI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN3aXRjaChkaXJlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBQVVESU9fRElSRUNUSU9OX0lOUFVUOgotICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0cy5wdXNoX2JhY2soY2FwdHVyZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBQVVESU9fRElSRUNUSU9OX09VVFBVVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLnB1c2hfYmFjayhwbGF5ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR0QoIkFBdWRpb0VuZHBvaW50TWFuYWdlcjo6b3BlbkVuZHBvaW50KCksIGNyZWF0ZWQgJXAgZm9yIGRldmljZSA9ICVkLCBkaXIgPSAlZCIsCi0gICAgICAgICAgICAgIGVuZHBvaW50LCBjb25maWd1cmF0aW9uLmdldERldmljZUlkKCksIChpbnQpZGlyZWN0aW9uKTsKLSAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisgICAgICAgIEFMT0dEKCJBQXVkaW9FbmRwb2ludE1hbmFnZXIub3BlbkVuZHBvaW50KCksIGNyZWF0ZWQgJXAgZm9yIGRldmljZSA9ICVkIiwKKyAgICAgICAgICAgICAgZW5kcG9pbnQuZ2V0KCksIGNvbmZpZ3VyYXRpb24uZ2V0RGV2aWNlSWQoKSk7CiAgICAgfQogCi0gICAgaWYgKGVuZHBvaW50ICE9IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0QoIkFBdWRpb0VuZHBvaW50TWFuYWdlcjo6b3BlbkVuZHBvaW50KCksIHNhbXBsZVJhdGUgPSAlZCwgZnJhbWVzUGVyQnVyc3QgPSAlZCIsCi0gICAgICAgICAgICAgIGVuZHBvaW50LT5nZXRTYW1wbGVSYXRlKCksIGVuZHBvaW50LT5nZXRGcmFtZXNQZXJCdXJzdCgpKTsKKyAgICBpZiAoZW5kcG9pbnQuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICAvLyBJbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCB1bmRlciB0aGlzIGxvY2suCi0gICAgICAgIGVuZHBvaW50LT5zZXRSZWZlcmVuY2VDb3VudChlbmRwb2ludC0+Z2V0UmVmZXJlbmNlQ291bnQoKSArIDEpOworICAgICAgICBlbmRwb2ludC0+c2V0T3BlbkNvdW50KGVuZHBvaW50LT5nZXRPcGVuQ291bnQoKSArIDEpOwogICAgIH0KICAgICByZXR1cm4gZW5kcG9pbnQ7CiB9CiAKLXZvaWQgQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpjbG9zZUVuZHBvaW50KEFBdWRpb1NlcnZpY2VFbmRwb2ludCAqc2VydmljZUVuZHBvaW50KSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwotICAgIGlmIChzZXJ2aWNlRW5kcG9pbnQgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm47Ci0gICAgfQorc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBBQXVkaW9FbmRwb2ludE1hbmFnZXI6Om9wZW5TaGFyZWRFbmRwb2ludCgKKyAgICAgICAgQUF1ZGlvU2VydmljZSAmYWF1ZGlvU2VydmljZSwKKyAgICAgICAgY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSB7CiAKLSAgICAvLyBEZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCB1bmRlciB0aGlzIGxvY2suCi0gICAgaW50MzJfdCBuZXdSZWZDb3VudCA9IHNlcnZpY2VFbmRwb2ludC0+Z2V0UmVmZXJlbmNlQ291bnQoKSAtIDE7Ci0gICAgc2VydmljZUVuZHBvaW50LT5zZXRSZWZlcmVuY2VDb3VudChuZXdSZWZDb3VudCk7Ci0gICAgQUxPR0QoIkFBdWRpb0VuZHBvaW50TWFuYWdlcjo6Y2xvc2VFbmRwb2ludCglcCkgbmV3UmVmQ291bnQgPSAlZCIsCi0gICAgICAgICAgc2VydmljZUVuZHBvaW50LCBuZXdSZWZDb3VudCk7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVNoYXJlZExvY2spOwogCi0gICAgLy8gSWYgbm8gbG9uZ2VyIGluIHVzZSB0aGVuIGNsb3NlIGFuZCBkZWxldGUgaXQuCi0gICAgaWYgKG5ld1JlZkNvdW50IDw9IDApIHsKLSAgICAgICAgYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiA9IHNlcnZpY2VFbmRwb2ludC0+Z2V0RGlyZWN0aW9uKCk7Ci0gICAgICAgIC8vIFRyYWNrIGVuZHBvaW50cyBiYXNlZCBvbiByZXF1ZXN0ZWQgZGV2aWNlSWQgYmVjYXVzZSBVTlNQRUNJRklFRAotICAgICAgICAvLyBjYW4gY2hhbmdlIHRvIGEgc3BlY2lmaWMgZGV2aWNlIGFmdGVyIG9wZW5pbmcuCi0gICAgICAgIGludDMyX3QgZGV2aWNlSWQgPSBzZXJ2aWNlRW5kcG9pbnQtPmdldFJlcXVlc3RlZERldmljZUlkKCk7CisgICAgY29uc3QgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbiA9IHJlcXVlc3QuZ2V0Q29uc3RhbnRDb25maWd1cmF0aW9uKCk7CisgICAgYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiA9IGNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0aW9uKCk7CiAKKyAgICAvLyBUcnkgdG8gZmluZCBhbiBleGlzdGluZyBlbmRwb2ludC4KKyAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ+IGVuZHBvaW50ID0gZmluZFNoYXJlZEVuZHBvaW50X2woY29uZmlndXJhdGlvbik7CisKKyAgICAvLyBJZiB3ZSBjYW4ndCBmaW5kIGFuIGV4aXN0aW5nIG9uZSB0aGVuIG9wZW4gYSBuZXcgb25lLgorICAgIGlmIChlbmRwb2ludC5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIHdlIG11c3QgY2FsbCBvcGVuU3RyZWFtIHdpdGggYXVkaW9zZXJ2ZXIgaWRlbnRpdHkKKyAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7CiAgICAgICAgICAgICBjYXNlIEFBVURJT19ESVJFQ1RJT05fSU5QVVQ6Ci0gICAgICAgICAgICAgICAgbUlucHV0cy5lcmFzZSgKLSAgICAgICAgICAgICAgICAgIHN0ZDo6cmVtb3ZlKG1JbnB1dHMuYmVnaW4oKSwgbUlucHV0cy5lbmQoKSwgc2VydmljZUVuZHBvaW50KSwgbUlucHV0cy5lbmQoKSk7CisgICAgICAgICAgICAgICAgZW5kcG9pbnQgPSBuZXcgQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZShhYXVkaW9TZXJ2aWNlKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQ6Ci0gICAgICAgICAgICAgICAgbU91dHB1dHMuZXJhc2UoCi0gICAgICAgICAgICAgICAgICBzdGQ6OnJlbW92ZShtT3V0cHV0cy5iZWdpbigpLCBtT3V0cHV0cy5lbmQoKSwgc2VydmljZUVuZHBvaW50KSwgbU91dHB1dHMuZW5kKCkpOworICAgICAgICAgICAgICAgIGVuZHBvaW50ID0gbmV3IEFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkoYWF1ZGlvU2VydmljZSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKGVuZHBvaW50LmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBlbmRwb2ludC0+b3BlbihyZXF1ZXN0KTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkFBdWRpb0VuZHBvaW50TWFuYWdlci5vcGVuRW5kcG9pbnQoKSwgb3BlbiBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBlbmRwb2ludC5jbGVhcigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtU2hhcmVkU3RyZWFtcy5wdXNoX2JhY2soZW5kcG9pbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dEKCJBQXVkaW9FbmRwb2ludE1hbmFnZXIub3BlblNoYXJlZEVuZHBvaW50KCksIGNyZWF0ZWQgJXAgZm9yIGRldmljZSA9ICVkLCBkaXIgPSAlZCIsCisgICAgICAgICAgICAgIGVuZHBvaW50LmdldCgpLCBjb25maWd1cmF0aW9uLmdldERldmljZUlkKCksIChpbnQpZGlyZWN0aW9uKTsKKyAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisgICAgfQorCisgICAgaWYgKGVuZHBvaW50LmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gSW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgdW5kZXIgdGhpcyBsb2NrLgorICAgICAgICBlbmRwb2ludC0+c2V0T3BlbkNvdW50KGVuZHBvaW50LT5nZXRPcGVuQ291bnQoKSArIDEpOworICAgIH0KKyAgICByZXR1cm4gZW5kcG9pbnQ7Cit9CisKK3ZvaWQgQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpjbG9zZUVuZHBvaW50KHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD5zZXJ2aWNlRW5kcG9pbnQpIHsKKyAgICBpZiAoc2VydmljZUVuZHBvaW50LT5nZXRTaGFyaW5nTW9kZSgpID09IEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFKSB7CisgICAgICAgIHJldHVybiBjbG9zZUV4Y2x1c2l2ZUVuZHBvaW50KHNlcnZpY2VFbmRwb2ludCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGNsb3NlU2hhcmVkRW5kcG9pbnQoc2VydmljZUVuZHBvaW50KTsKKyAgICB9Cit9CisKK3ZvaWQgQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpjbG9zZUV4Y2x1c2l2ZUVuZHBvaW50KHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gc2VydmljZUVuZHBvaW50KSB7CisgICAgaWYgKHNlcnZpY2VFbmRwb2ludC5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBEZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCB1bmRlciB0aGlzIGxvY2suCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUV4Y2x1c2l2ZUxvY2spOworICAgIGludDMyX3QgbmV3UmVmQ291bnQgPSBzZXJ2aWNlRW5kcG9pbnQtPmdldE9wZW5Db3VudCgpIC0gMTsKKyAgICBzZXJ2aWNlRW5kcG9pbnQtPnNldE9wZW5Db3VudChuZXdSZWZDb3VudCk7CisKKyAgICAvLyBJZiBubyBsb25nZXIgaW4gdXNlIHRoZW4gY2xvc2UgYW5kIGRlbGV0ZSBpdC4KKyAgICBpZiAobmV3UmVmQ291bnQgPD0gMCkgeworICAgICAgICBtRXhjbHVzaXZlU3RyZWFtcy5lcmFzZSgKKyAgICAgICAgICAgICAgICBzdGQ6OnJlbW92ZShtRXhjbHVzaXZlU3RyZWFtcy5iZWdpbigpLCBtRXhjbHVzaXZlU3RyZWFtcy5lbmQoKSwgc2VydmljZUVuZHBvaW50KSwKKyAgICAgICAgICAgICAgICBtRXhjbHVzaXZlU3RyZWFtcy5lbmQoKSk7CisKICAgICAgICAgc2VydmljZUVuZHBvaW50LT5jbG9zZSgpOwotICAgICAgICBBTE9HRCgiQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpjbG9zZUVuZHBvaW50KCkgZGVsZXRlICVwIGZvciBkZXZpY2UgJWQsIGRpciA9ICVkIiwKLSAgICAgICAgICAgICAgc2VydmljZUVuZHBvaW50LCBkZXZpY2VJZCwgKGludClkaXJlY3Rpb24pOwotICAgICAgICBkZWxldGUgc2VydmljZUVuZHBvaW50OworICAgICAgICBBTE9HRCgiQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpjbG9zZUV4Y2x1c2l2ZUVuZHBvaW50KCkgJXAgZm9yIGRldmljZSAlZCIsCisgICAgICAgICAgICAgIHNlcnZpY2VFbmRwb2ludC5nZXQoKSwgc2VydmljZUVuZHBvaW50LT5nZXREZXZpY2VJZCgpKTsKKyAgICB9Cit9CisKK3ZvaWQgQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpjbG9zZVNoYXJlZEVuZHBvaW50KHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gc2VydmljZUVuZHBvaW50KSB7CisgICAgaWYgKHNlcnZpY2VFbmRwb2ludC5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBEZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCB1bmRlciB0aGlzIGxvY2suCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVNoYXJlZExvY2spOworICAgIGludDMyX3QgbmV3UmVmQ291bnQgPSBzZXJ2aWNlRW5kcG9pbnQtPmdldE9wZW5Db3VudCgpIC0gMTsKKyAgICBzZXJ2aWNlRW5kcG9pbnQtPnNldE9wZW5Db3VudChuZXdSZWZDb3VudCk7CisKKyAgICAvLyBJZiBubyBsb25nZXIgaW4gdXNlIHRoZW4gY2xvc2UgYW5kIGRlbGV0ZSBpdC4KKyAgICBpZiAobmV3UmVmQ291bnQgPD0gMCkgeworICAgICAgICBtU2hhcmVkU3RyZWFtcy5lcmFzZSgKKyAgICAgICAgICAgICAgICBzdGQ6OnJlbW92ZShtU2hhcmVkU3RyZWFtcy5iZWdpbigpLCBtU2hhcmVkU3RyZWFtcy5lbmQoKSwgc2VydmljZUVuZHBvaW50KSwKKyAgICAgICAgICAgICAgICBtU2hhcmVkU3RyZWFtcy5lbmQoKSk7CisKKyAgICAgICAgc2VydmljZUVuZHBvaW50LT5jbG9zZSgpOworICAgICAgICBBTE9HRCgiQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpjbG9zZVNoYXJlZEVuZHBvaW50KCkgJXAgZm9yIGRldmljZSAlZCIsCisgICAgICAgICAgICAgIHNlcnZpY2VFbmRwb2ludC5nZXQoKSwgc2VydmljZUVuZHBvaW50LT5nZXREZXZpY2VJZCgpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5oCmluZGV4IDI1MTFiMmYuLjMyYzg0NTQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5oCkBAIC0yNCwxMSArMjQsMTIgQEAKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VNZXNzYWdlLmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZUVuZHBvaW50LmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuaCIKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmgiCiAKIG5hbWVzcGFjZSBhYXVkaW8gewogCi1jbGFzcyBBQXVkaW9FbmRwb2ludE1hbmFnZXIgOiBwdWJsaWMgYW5kcm9pZDo6U2luZ2xldG9uPEFBdWRpb0VuZHBvaW50TWFuYWdlcj57CitjbGFzcyBBQXVkaW9FbmRwb2ludE1hbmFnZXIgOiBwdWJsaWMgYW5kcm9pZDo6U2luZ2xldG9uPEFBdWRpb0VuZHBvaW50TWFuYWdlcj4gewogcHVibGljOgogICAgIEFBdWRpb0VuZHBvaW50TWFuYWdlcigpOwogICAgIH5BQXVkaW9FbmRwb2ludE1hbmFnZXIoKSA9IGRlZmF1bHQ7CkBAIC00OSwyMiArNTAsNDIgQEAKICAgICAgKiBGaW5kIGEgc2VydmljZSBlbmRwb2ludCBmb3IgdGhlIGdpdmVuIGRldmljZUlkIGFuZCBkaXJlY3Rpb24uCiAgICAgICogSWYgYW4gZW5kcG9pbnQgZG9lcyBub3QgYWxyZWFkeSBleGlzdCB0aGVuIHRyeSB0byBjcmVhdGUgb25lLgogICAgICAqCi0gICAgICogQHBhcmFtIGRldmljZUlkCi0gICAgICogQHBhcmFtIGRpcmVjdGlvbgotICAgICAqIEByZXR1cm4gZW5kcG9pbnQgb3IgbnVsbHB0cgorICAgICAqIEBwYXJhbSBhdWRpb1NlcnZpY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdAorICAgICAqIEBwYXJhbSBzaGFyaW5nTW9kZQorICAgICAqIEByZXR1cm4gZW5kcG9pbnQgb3IgbnVsbAogICAgICAqLwotICAgIEFBdWRpb1NlcnZpY2VFbmRwb2ludCAqb3BlbkVuZHBvaW50KGFuZHJvaWQ6OkFBdWRpb1NlcnZpY2UgJmF1ZGlvU2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24pOworICAgIGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gb3BlbkVuZHBvaW50KGFuZHJvaWQ6OkFBdWRpb1NlcnZpY2UgJmF1ZGlvU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlKTsKIAotICAgIHZvaWQgY2xvc2VFbmRwb2ludChBQXVkaW9TZXJ2aWNlRW5kcG9pbnQgKnNlcnZpY2VFbmRwb2ludCk7CisgICAgdm9pZCBjbG9zZUVuZHBvaW50KGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gc2VydmljZUVuZHBvaW50KTsKIAogcHJpdmF0ZToKKyAgICBhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IG9wZW5FeGNsdXNpdmVFbmRwb2ludChhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlICZhYXVkaW9TZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCk7CiAKLSAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBvcGVuU2hhcmVkRW5kcG9pbnQoYW5kcm9pZDo6QUF1ZGlvU2VydmljZSAmYWF1ZGlvU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpOwogCi0gICAgc3RkOjp2ZWN0b3I8QUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZSAqPiBtSW5wdXRzOwotICAgIHN0ZDo6dmVjdG9yPEFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkgKj4gbU91dHB1dHM7CisgICAgYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBmaW5kRXhjbHVzaXZlRW5kcG9pbnRfbCgKKyAgICAgICAgICAgIGNvbnN0IEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24pOworCisgICAgYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkPiBmaW5kU2hhcmVkRW5kcG9pbnRfbCgKKyAgICAgICAgICAgIGNvbnN0IEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24pOworCisgICAgdm9pZCBjbG9zZUV4Y2x1c2l2ZUVuZHBvaW50KGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gc2VydmljZUVuZHBvaW50KTsKKyAgICB2b2lkIGNsb3NlU2hhcmVkRW5kcG9pbnQoYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBzZXJ2aWNlRW5kcG9pbnQpOworCisgICAgLy8gVXNlIHNlcGFyYXRlIGxvY2tzIGJlY2F1c2Ugb3BlbmluZyBhIFNoYXJlZCBlbmRwb2ludCByZXF1aXJlcyBvcGVuaW5nIGFuIEV4Y2x1c2l2ZSBvbmUuCisgICAgLy8gVGhhdCBjb3VsZCBjYXVzZSBhIHJlY3Vyc2l2ZSBsb2NrLgorICAgIC8vIExvY2sgbVNoYXJlZExvY2sgYmVmb3JlIG1FeGNsdXNpdmVMb2NrLgorICAgIC8vIGl0IGlzIE9LIHRvIG9ubHkgbG9jayBtRXhjbHVzaXZlTG9jay4KKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNoYXJlZExvY2s7CisgICAgc3RkOjp2ZWN0b3I8YW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkPj4gIG1TaGFyZWRTdHJlYW1zOworCisgICAgbXV0YWJsZSBzdGQ6Om11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FeGNsdXNpdmVMb2NrOworICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA+PiAgICBtRXhjbHVzaXZlU3RyZWFtczsKIAogfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmNwcAppbmRleCAzOTkyNzE5Li41YTM0ODhkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmNwcApAQCAtMTgsOSArMTgsOSBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxzc3RyZWFtPgotLy8jaW5jbHVkZSA8dGltZS5oPgotLy8jaW5jbHVkZSA8cHRocmVhZC5oPgogCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaD4KQEAgLTM1LDE4ICszNSwxMyBAQAogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmgiCiAjaW5jbHVkZSAiYmluZGluZy9JQUF1ZGlvU2VydmljZS5oIgogI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKLSNpbmNsdWRlICJ1dGlsaXR5L0hhbmRsZVRyYWNrZXIuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwogCiAjZGVmaW5lIE1BWF9TVFJFQU1TX1BFUl9QUk9DRVNTICAgOAogCi10eXBlZGVmIGVudW0KLXsKLSAgICBBQVVESU9fSEFORExFX1RZUEVfU1RSRUFNCi19IGFhdWRpb19zZXJ2aWNlX2hhbmRsZV90eXBlX3Q7Ci1zdGF0aWNfYXNzZXJ0KEFBVURJT19IQU5ETEVfVFlQRV9TVFJFQU0gPCBIQU5ETEVfVFJBQ0tFUl9NQVhfVFlQRVMsICJUb28gbWFueSBoYW5kbGUgdHlwZXMuIik7Cit1c2luZyBhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlOwogCiBhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlOjpBQXVkaW9TZXJ2aWNlKCkKICAgICA6IEJuQUF1ZGlvU2VydmljZSgpIHsKQEAgLTcwLDcgKzY1LDggQEAKICAgICAgICAgcmVzdWx0ID0gc3Muc3RyKCk7CiAgICAgICAgIEFMT0dXKCIlcyIsIHJlc3VsdC5jX3N0cigpKTsKICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQgPSBtSGFuZGxlVHJhY2tlci5kdW1wKCkKKyAgICAgICAgcmVzdWx0ID0gIi0tLS0tLS0tLS0tLSBBQXVkaW8gU2VydmljZSAtLS0tLS0tLS0tLS1cbiIKKyAgICAgICAgICAgICAgICAgKyBtU3RyZWFtVHJhY2tlci5kdW1wKCkKICAgICAgICAgICAgICAgICAgKyBBQXVkaW9DbGllbnRUcmFja2VyOjpnZXRJbnN0YW5jZSgpLmR1bXAoKQogICAgICAgICAgICAgICAgICArIEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKS5kdW1wKCk7CiAgICAgfQpAQCAtMTE0LDIzICsxMTAsMjAgQEAKICAgICAgICAgICAgICAgICBtQXVkaW9DbGllbnQuY2xpZW50VWlkID09IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkgewogICAgICAgICAgICAgaW5TZXJ2aWNlID0gcmVxdWVzdC5pc0luU2VydmljZSgpOwogICAgICAgICB9Ci0gICAgICAgIHNlcnZpY2VTdHJlYW0gPSBuZXcgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAobUF1ZGlvQ2xpZW50LCBpblNlcnZpY2UpOwotICAgICAgICByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5vcGVuKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb25PdXRwdXQpOworICAgICAgICBzZXJ2aWNlU3RyZWFtID0gbmV3IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQKCp0aGlzLCBpblNlcnZpY2UpOworICAgICAgICByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5vcGVuKHJlcXVlc3QpOwogICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgLy8gZmFsbCBiYWNrIHRvIHVzaW5nIGEgc2hhcmVkIHN0cmVhbQorICAgICAgICAgICAgLy8gQ2xlYXIgaXQgc28gd2UgY2FuIHBvc3NpYmx5IGZhbGwgYmFjayB0byB1c2luZyBhIHNoYXJlZCBzdHJlYW0uCiAgICAgICAgICAgICBBTE9HVygiQUF1ZGlvU2VydmljZTo6b3BlblN0cmVhbSgpLCBjb3VsZCBub3Qgb3BlbiBpbiBFWENMVVNJVkUgbW9kZSIpOwogICAgICAgICAgICAgc2VydmljZVN0cmVhbS5jbGVhcigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29uZmlndXJhdGlvbk91dHB1dC5zZXRTaGFyaW5nTW9kZShBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBpZiBTSEFSRUQgcmVxdWVzdGVkIG9yIGlmIEVYQ0xVU0lWRSBmYWlsZWQKICAgICBpZiAoc2hhcmluZ01vZGUgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQKLSAgICAgICAgIHx8IChzZXJ2aWNlU3RyZWFtID09IG51bGxwdHIgJiYgIXNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCkpIHsKKyAgICAgICAgIHx8IChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIgJiYgIXNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCkpIHsKICAgICAgICAgc2VydmljZVN0cmVhbSA9ICBuZXcgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZCgqdGhpcyk7Ci0gICAgICAgIHJlc3VsdCA9IHNlcnZpY2VTdHJlYW0tPm9wZW4ocmVxdWVzdCwgY29uZmlndXJhdGlvbk91dHB1dCk7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb25PdXRwdXQuc2V0U2hhcmluZ01vZGUoQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQpOworICAgICAgICByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5vcGVuKHJlcXVlc3QpOwogICAgIH0KIAogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CkBAIC0xMzksMTcgKzEzMiwxMiBAQAogICAgICAgICAgICAgICByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGFhdWRpb19oYW5kbGVfdCBoYW5kbGUgPSBtSGFuZGxlVHJhY2tlci5wdXQoQUFVRElPX0hBTkRMRV9UWVBFX1NUUkVBTSwgc2VydmljZVN0cmVhbS5nZXQoKSk7Ci0gICAgICAgIGlmIChoYW5kbGUgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6b3BlblN0cmVhbSgpOiBoYW5kbGUgdGFibGUgZnVsbCIpOwotICAgICAgICAgICAgc2VydmljZVN0cmVhbS0+Y2xvc2UoKTsKLSAgICAgICAgICAgIHNlcnZpY2VTdHJlYW0uY2xlYXIoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlOjpvcGVuU3RyZWFtKCk6IGhhbmRsZSA9IDB4JTA4WCIsIGhhbmRsZSk7Ci0gICAgICAgICAgICBzZXJ2aWNlU3RyZWFtLT5zZXRIYW5kbGUoaGFuZGxlKTsKLSAgICAgICAgICAgIHBpZF90IHBpZCA9IHJlcXVlc3QuZ2V0UHJvY2Vzc0lkKCk7Ci0gICAgICAgICAgICBBQXVkaW9DbGllbnRUcmFja2VyOjpnZXRJbnN0YW5jZSgpLnJlZ2lzdGVyQ2xpZW50U3RyZWFtKHBpZCwgc2VydmljZVN0cmVhbSk7Ci0gICAgICAgIH0KKyAgICAgICAgYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSA9IG1TdHJlYW1UcmFja2VyLmFkZFN0cmVhbUZvckhhbmRsZShzZXJ2aWNlU3RyZWFtLmdldCgpKTsKKyAgICAgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2U6Om9wZW5TdHJlYW0oKTogaGFuZGxlID0gMHglMDhYIiwgaGFuZGxlKTsKKyAgICAgICAgc2VydmljZVN0cmVhbS0+c2V0SGFuZGxlKGhhbmRsZSk7CisgICAgICAgIHBpZF90IHBpZCA9IHJlcXVlc3QuZ2V0UHJvY2Vzc0lkKCk7CisgICAgICAgIEFBdWRpb0NsaWVudFRyYWNrZXI6OmdldEluc3RhbmNlKCkucmVnaXN0ZXJDbGllbnRTdHJlYW0ocGlkLCBzZXJ2aWNlU3RyZWFtKTsKKyAgICAgICAgY29uZmlndXJhdGlvbk91dHB1dC5jb3B5RnJvbSgqc2VydmljZVN0cmVhbSk7CiAgICAgICAgIHJldHVybiBoYW5kbGU7CiAgICAgfQogfQpAQCAtMTU3LDMwICsxNDUsMzIgQEAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlOjpjbG9zZVN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSB7CiAgICAgLy8gQ2hlY2sgcGVybWlzc2lvbiBhbmQgb3duZXJzaGlwIGZpcnN0LgogICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOwotICAgIGlmIChzZXJ2aWNlU3RyZWFtID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2U6OnN0YXJ0U3RyZWFtKCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSA9IDB4JTB4Iiwgc3RyZWFtSGFuZGxlKTsKKyAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlOjpjbG9zZVN0cmVhbSgweCUweCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSIsIHN0cmVhbUhhbmRsZSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEU7CiAgICAgfQogCiAgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2UuY2xvc2VTdHJlYW0oMHglMDhYKSIsIHN0cmVhbUhhbmRsZSk7CiAgICAgLy8gUmVtb3ZlIGhhbmRsZSBmcm9tIHRyYWNrZXIgc28gdGhhdCB3ZSBjYW5ub3QgbG9vayB1cCB0aGUgcmF3IGFkZHJlc3MgYW55IG1vcmUuCi0gICAgc2VydmljZVN0cmVhbSA9IChBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSAqKQotICAgICAgICAgICAgbUhhbmRsZVRyYWNrZXIucmVtb3ZlKEFBVURJT19IQU5ETEVfVFlQRV9TVFJFQU0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSGFuZGxlKTsKLSAgICBpZiAoc2VydmljZVN0cmVhbSAhPSBudWxscHRyKSB7CisgICAgLy8gcmVtb3ZlU3RyZWFtQnlIYW5kbGUoKSB1c2VzIGEgbG9jayBzbyB0aGF0IGlmIHRoZXJlIGFyZSB0d28gc2ltdWx0YW5lb3VzIGNsb3NlcworICAgIC8vIHRoZW4gb25seSBvbmUgd2lsbCBnZXQgdGhlIHBvaW50ZXIgYW5kIGRvIHRoZSBjbG9zZS4KKyAgICBzZXJ2aWNlU3RyZWFtID0gbVN0cmVhbVRyYWNrZXIucmVtb3ZlU3RyZWFtQnlIYW5kbGUoc3RyZWFtSGFuZGxlKTsKKyAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgIHNlcnZpY2VTdHJlYW0tPmNsb3NlKCk7CiAgICAgICAgIHBpZF90IHBpZCA9IHNlcnZpY2VTdHJlYW0tPmdldE93bmVyUHJvY2Vzc0lkKCk7CiAgICAgICAgIEFBdWRpb0NsaWVudFRyYWNrZXI6OmdldEluc3RhbmNlKCkudW5yZWdpc3RlckNsaWVudFN0cmVhbShwaWQsIHNlcnZpY2VTdHJlYW0pOwogICAgICAgICByZXR1cm4gQUFVRElPX09LOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCJBQXVkaW9TZXJ2aWNlOjpjbG9zZVN0cmVhbSgweCUweCkgYmVpbmcgaGFuZGxlZCBieSBhbm90aGVyIHRocmVhZCIsIHN0cmVhbUhhbmRsZSk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEU7CiAgICAgfQotICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEU7CiB9CiAKLUFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlICpBQXVkaW9TZXJ2aWNlOjpjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKAotICAgICAgICBhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSBjb25zdCB7Ci0gICAgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UgKnNlcnZpY2VTdHJlYW0gPSAoQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UgKikKLSAgICAgICAgICAgIG1IYW5kbGVUcmFja2VyLmdldChBQVVESU9fSEFORExFX1RZUEVfU1RSRUFNLCAoYWF1ZGlvX2hhbmRsZV90KXN0cmVhbUhhbmRsZSk7Ci0gICAgaWYgKHNlcnZpY2VTdHJlYW0gIT0gbnVsbHB0cikgeworCitzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gQUF1ZGlvU2VydmljZTo6Y29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbSgKKyAgICAgICAgYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgeworICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gbVN0cmVhbVRyYWNrZXIuZ2V0U3RyZWFtQnlIYW5kbGUoc3RyZWFtSGFuZGxlKTsKKyAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgIC8vIE9ubHkgYWxsb3cgb3duZXIgb3IgdGhlIGFhdWRpbyBzZXJ2aWNlIHRvIGFjY2VzcyB0aGUgc3RyZWFtLgogICAgICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVXNlcklkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwogICAgICAgICBjb25zdCB1aWRfdCBvd25lclVzZXJJZCA9IHNlcnZpY2VTdHJlYW0tPmdldE93bmVyVXNlcklkKCk7CkBAIC0yMDAsMzAgKzE5MCwzMCBAQAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2U6OmdldFN0cmVhbURlc2NyaXB0aW9uKAogICAgICAgICAgICAgICAgIGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCiAgICAgICAgICAgICAgICAgYWF1ZGlvOjpBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkgewotICAgIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlICpzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOwotICAgIGlmIChzZXJ2aWNlU3RyZWFtID09IG51bGxwdHIpIHsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKKyAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlOjpnZXRTdHJlYW1EZXNjcmlwdGlvbigpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUgPSAweCUweCIsIHN0cmVhbUhhbmRsZSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEU7CiAgICAgfQorCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHNlcnZpY2VTdHJlYW0tPmdldERlc2NyaXB0aW9uKHBhcmNlbGFibGUpOwogICAgIC8vIHBhcmNlbGFibGUuZHVtcCgpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlOjpzdGFydFN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSB7Ci0gICAgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UgKnNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7Ci0gICAgaWYgKHNlcnZpY2VTdHJlYW0gPT0gbnVsbHB0cikgeworICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOworICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2U6OnN0YXJ0U3RyZWFtKCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSA9IDB4JTB4Iiwgc3RyZWFtSGFuZGxlKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRTsKICAgICB9CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gc2VydmljZVN0cmVhbS0+c3RhcnQoKTsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBzZXJ2aWNlU3RyZWFtLT5zdGFydCgpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZTo6cGF1c2VTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgewotICAgIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlICpzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOwotICAgIGlmIChzZXJ2aWNlU3RyZWFtID09IG51bGxwdHIpIHsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKKyAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlOjpwYXVzZVN0cmVhbSgpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUgPSAweCUweCIsIHN0cmVhbUhhbmRsZSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEU7CiAgICAgfQpAQCAtMjMyLDkgKzIyMiw5IEBACiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlOjpzdG9wU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKLSAgICBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSAqc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKLSAgICBpZiAoc2VydmljZVN0cmVhbSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlOjpwYXVzZVN0cmVhbSgpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUgPSAweCUweCIsIHN0cmVhbUhhbmRsZSk7CisgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7CisgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6c3RvcFN0cmVhbSgpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUgPSAweCUweCIsIHN0cmVhbUhhbmRsZSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEU7CiAgICAgfQogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5zdG9wKCk7CkBAIC0yNDIsOCArMjMyLDggQEAKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2U6OmZsdXNoU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKLSAgICBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSAqc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKLSAgICBpZiAoc2VydmljZVN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7CisgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6Zmx1c2hTdHJlYW0oKSwgaWxsZWdhbCBzdHJlYW0gaGFuZGxlID0gMHglMHgiLCBzdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwogICAgIH0KQEAgLTI1Myw4ICsyNDMsOCBAQAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2U6OnJlZ2lzdGVyQXVkaW9UaHJlYWQoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IGNsaWVudFRocmVhZElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwZXJpb2ROYW5vc2Vjb25kcykgewotICAgIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlICpzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOwotICAgIGlmIChzZXJ2aWNlU3RyZWFtID09IG51bGxwdHIpIHsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKKyAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlOjpyZWdpc3RlckF1ZGlvVGhyZWFkKCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSA9IDB4JTB4Iiwgc3RyZWFtSGFuZGxlKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRTsKICAgICB9CkBAIC0yNzgsOCArMjY4LDggQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2U6OnVucmVnaXN0ZXJBdWRpb1RocmVhZChhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBjbGllbnRUaHJlYWRJZCkgewotICAgIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlICpzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOwotICAgIGlmIChzZXJ2aWNlU3RyZWFtID09IG51bGxwdHIpIHsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKKyAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlOjp1bnJlZ2lzdGVyQXVkaW9UaHJlYWQoKSwgaWxsZWdhbCBzdHJlYW0gaGFuZGxlID0gMHglMHgiLAogICAgICAgICAgICAgICBzdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwpAQCAtMjk1LDggKzI4NSw4IEBACiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZTo6c3RhcnRDbGllbnQoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpBdWRpb0NsaWVudCYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSkgewotICAgIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlICpzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOwotICAgIGlmIChzZXJ2aWNlU3RyZWFtID09IG51bGxwdHIpIHsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKKyAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlOjpzdGFydENsaWVudCgpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUgPSAweCUweCIsCiAgICAgICAgICAgICAgIHN0cmVhbUhhbmRsZSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEU7CkBAIC0zMDYsOCArMjk2LDggQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2U6OnN0b3BDbGllbnQoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgY2xpZW50SGFuZGxlKSB7Ci0gICAgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UgKnNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7Ci0gICAgaWYgKHNlcnZpY2VTdHJlYW0gPT0gbnVsbHB0cikgeworICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOworICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2U6OnN0b3BDbGllbnQoKSwgaWxsZWdhbCBzdHJlYW0gaGFuZGxlID0gMHglMHgiLAogICAgICAgICAgICAgICBzdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5oCmluZGV4IDg0MjFlZmMuLmVlZjA4MjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmgKQEAgLTI0LDExICsyNCwxMyBAQAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ2xpZW50Lmg+CiAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+Ci0jaW5jbHVkZSAidXRpbGl0eS9IYW5kbGVUcmFja2VyLmgiCi0jaW5jbHVkZSAiYmluZGluZy9JQUF1ZGlvU2VydmljZS5oIgorCisjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9Db21tb24uaCIKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VJbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJiaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmgiCiAKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oIgorI2luY2x1ZGUgIkFBdWRpb1N0cmVhbVRyYWNrZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00OSw0NSArNTEsNTMgQEAKIAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHJlZ2lzdGVyQ2xpZW50KGNvbnN0IHNwPElBQXVkaW9DbGllbnQ+JiBjbGllbnQpOwogCi0gICAgdmlydHVhbCBhYXVkaW9faGFuZGxlX3Qgb3BlblN0cmVhbShjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvOjpBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uT3V0cHV0KTsKKyAgICBhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBvcGVuU3RyZWFtKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpbzo6QUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbk91dHB1dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgY2xvc2VTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlU3RyZWFtKGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBnZXRTdHJlYW1EZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICBhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAotICAgICAgICAgICAgICAgIGFhdWRpbzo6QXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpOworICAgIGFhdWRpb19yZXN1bHRfdCBnZXRTdHJlYW1EZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICBhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCisgICAgICAgICAgICAgICAgYWF1ZGlvOjpBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBzdGFydFN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKTsKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RhcnRTdHJlYW0oYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHBhdXNlU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpOworICAgIGFhdWRpb19yZXN1bHRfdCBwYXVzZVN0cmVhbShhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgc3RvcFN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKTsKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcFN0cmVhbShhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZmx1c2hTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IGZsdXNoU3RyZWFtKGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCByZWdpc3RlckF1ZGlvVGhyZWFkKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlZ2lzdGVyQXVkaW9UaHJlYWQoYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwZXJpb2ROYW5vc2Vjb25kcykgOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwZXJpb2ROYW5vc2Vjb25kcykgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCB1bnJlZ2lzdGVyQXVkaW9UaHJlYWQoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgdW5yZWdpc3RlckF1ZGlvVGhyZWFkKGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0Q2xpZW50KGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCisgICAgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0Q2xpZW50KGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6QXVkaW9DbGllbnQmIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqY2xpZW50SGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqY2xpZW50SGFuZGxlKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHN0b3BDbGllbnQoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgY2xpZW50SGFuZGxlKTsKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcENsaWVudChhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSkgb3ZlcnJpZGU7CiAKIHByaXZhdGU6CiAKLSAgICBhYXVkaW86OkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlICpjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIGNvbnN0OworICAgIC8qKgorICAgICAqIExvb2t1cCBzdHJlYW0gYW5kIHRoZW4gdmFsaWRhdGUgYWNjZXNzIHRvIHRoZSBzdHJlYW0uCisgICAgICogQHBhcmFtIHN0cmVhbUhhbmRsZQorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBzcDxhYXVkaW86OkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKAorICAgICAgICAgICAgYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKTsKIAotICAgIEhhbmRsZVRyYWNrZXIgbUhhbmRsZVRyYWNrZXI7CiAKICAgICBhbmRyb2lkOjpBdWRpb0NsaWVudCBtQXVkaW9DbGllbnQ7CiAKKyAgICBhYXVkaW86OkFBdWRpb1N0cmVhbVRyYWNrZXIgICAgICAgICAgICAgICAgIG1TdHJlYW1UcmFja2VyOworCiAgICAgZW51bSBjb25zdGFudHMgewogICAgICAgICBERUZBVUxUX0FVRElPX1BSSU9SSVRZID0gMgogICAgIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmNwcAppbmRleCAwZjg2M2ZlLi4zMDk1YmM5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5jcHAKQEAgLTMzLDE3ICszMywxNCBAQAogI2luY2x1ZGUgImNvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZUVuZHBvaW50LmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsgIC8vIFRPRE8ganVzdCBpbXBvcnQgbmFtZXMgbmVlZGVkCiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOyAgIC8vIFRPRE8ganVzdCBpbXBvcnQgbmFtZXMgbmVlZGVkCiAKLSNkZWZpbmUgTUlOX1RJTUVPVVRfTkFOT1MgICAgICAgICgxMDAwICogQUFVRElPX05BTk9TX1BFUl9NSUxMSVNFQ09ORCkKLQotLy8gV2FpdCBhdCBsZWFzdCB0aGlzIG1hbnkgdGltZXMgbG9uZ2VyIHRoYW4gdGhlIG9wZXJhdGlvbiBzaG91bGQgdGFrZS4KLSNkZWZpbmUgTUlOX1RJTUVPVVRfT1BFUkFUSU9OUyAgICA0Ci0KLS8vIFRoaXMgaXMgdGhlIG1heGltdW0gc2l6ZSBpbiBmcmFtZXMuIFRoZSBlZmZlY3RpdmUgc2l6ZSBjYW4gYmUgdHVuZWQgc21hbGxlciBhdCBydW50aW1lLgotI2RlZmluZSBERUZBVUxUX0JVRkZFUl9DQVBBQ0lUWSAgICg0OCAqIDgpCitBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6On5BQXVkaW9TZXJ2aWNlRW5kcG9pbnQoKSB7CisgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludDo6fkFBdWRpb1NlcnZpY2VFbmRwb2ludCgpIGRlc3Ryb3lpbmcgZW5kcG9pbnQgJXAiLCB0aGlzKTsKK30KIAogc3RkOjpzdHJpbmcgQUF1ZGlvU2VydmljZUVuZHBvaW50OjpkdW1wKCkgY29uc3QgewogICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHJlc3VsdDsKQEAgLTUzLDE5ICs1MCwyMCBAQAogICAgICAgICAgICAgNTAgLyogdGltZXMgKi8sCiAgICAgICAgICAgICAyMCAvKiBzbGVlcE1zICovKTsKICAgICBpZiAoIWlzTG9ja2VkKSB7Ci0gICAgICAgIHJlc3VsdCA8PCAiRW5kcG9pbnRNYW5hZ2VyIG1heSBiZSBkZWFkbG9ja2VkXG4iOworICAgICAgICByZXN1bHQgPDwgIkFBdWRpb1NlcnZpY2VFbmRwb2ludCBtYXkgYmUgZGVhZGxvY2tlZFxuIjsKICAgICB9CiAKLSAgICBBdWRpb1N0cmVhbUludGVybmFsICAgICAqc3RyZWFtID0gbVN0cmVhbUludGVybmFsOwotICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewotICAgICAgICByZXN1bHQgPDwgIm51bGwgc3RyZWFtISIgPDwgIlxuIjsKLSAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQgPDwgIm1tYXAgc3RyZWFtOiByYXRlID0gIiA8PCBzdHJlYW0tPmdldFNhbXBsZVJhdGUoKSA8PCAiXG4iOwotICAgIH0KLQorICAgIHJlc3VsdCA8PCAiICAgIERpcmVjdGlvbjogICAgICAgICAgICAiIDw8ICgoZ2V0RGlyZWN0aW9uKCkgPT0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIk9VVFBVVCIgOiAiSU5QVVQiKSA8PCAiXG4iOworICAgIHJlc3VsdCA8PCAiICAgIFNhbXBsZSBSYXRlOiAgICAgICAgICAiIDw8IGdldFNhbXBsZVJhdGUoKSA8PCAiXG4iOworICAgIHJlc3VsdCA8PCAiICAgIEZyYW1lcyBQZXIgQnVyc3Q6ICAgICAiIDw8IG1GcmFtZXNQZXJCdXJzdCA8PCAiXG4iOworICAgIHJlc3VsdCA8PCAiICAgIFJlZmVyZW5jZSBDb3VudDogICAgICAiIDw8IG1PcGVuQ291bnQgPDwgIlxuIjsKKyAgICByZXN1bHQgPDwgIiAgICBSZXF1ZXN0ZWQgRGV2aWNlIElkOiAgIiA8PCBtUmVxdWVzdGVkRGV2aWNlSWQgPDwgIlxuIjsKKyAgICByZXN1bHQgPDwgIiAgICBEZXZpY2UgSWQ6ICAgICAgICAgICAgIiA8PCBnZXREZXZpY2VJZCgpIDw8ICJcbiI7CiAgICAgcmVzdWx0IDw8ICIgICAgUmVnaXN0ZXJlZCBTdHJlYW1zOiIgPDwgIlxuIjsKLSAgICBmb3IgKHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ+IHNoYXJlZFN0cmVhbSA6IG1SZWdpc3RlcmVkU3RyZWFtcykgewotICAgICAgICByZXN1bHQgPDwgc2hhcmVkU3RyZWFtLT5kdW1wKCk7CisgICAgcmVzdWx0IDw8IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OmR1bXBIZWFkZXIoKSA8PCAiXG4iOworICAgIGZvciAoY29uc3QgYXV0byBzdHJlYW0gOiBtUmVnaXN0ZXJlZFN0cmVhbXMpIHsKKyAgICAgICAgcmVzdWx0IDw8IHN0cmVhbS0+ZHVtcCgpIDw8ICJcbiI7CiAgICAgfQogCiAgICAgaWYgKGlzTG9ja2VkKSB7CkBAIC03NCwxMTAgKzcyLDQ0IEBACiAgICAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKIH0KIAotLy8gU2V0IHVwIGFuIEVYQ0xVU0lWRSBNTUFQIHN0cmVhbSB0aGF0IHdpbGwgYmUgc2hhcmVkLgotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6b3Blbihjb25zdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uKSB7Ci0gICAgbVJlcXVlc3RlZERldmljZUlkID0gY29uZmlndXJhdGlvbi5nZXREZXZpY2VJZCgpOwotICAgIG1TdHJlYW1JbnRlcm5hbCA9IGdldFN0cmVhbUludGVybmFsKCk7Ci0KLSAgICBBdWRpb1N0cmVhbUJ1aWxkZXIgYnVpbGRlcjsKLSAgICBidWlsZGVyLnNldFNoYXJpbmdNb2RlKEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFKTsKLSAgICAvLyBEb24ndCBmYWxsIGJhY2sgdG8gU0hBUkVEIGJlY2F1c2UgdGhhdCB3b3VsZCBjYXVzZSByZWN1cnNpb24uCi0gICAgYnVpbGRlci5zZXRTaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQodHJ1ZSk7Ci0gICAgYnVpbGRlci5zZXREZXZpY2VJZChtUmVxdWVzdGVkRGV2aWNlSWQpOwotICAgIGJ1aWxkZXIuc2V0Rm9ybWF0KGNvbmZpZ3VyYXRpb24uZ2V0Rm9ybWF0KCkpOwotICAgIGJ1aWxkZXIuc2V0U2FtcGxlUmF0ZShjb25maWd1cmF0aW9uLmdldFNhbXBsZVJhdGUoKSk7Ci0gICAgYnVpbGRlci5zZXRTYW1wbGVzUGVyRnJhbWUoY29uZmlndXJhdGlvbi5nZXRTYW1wbGVzUGVyRnJhbWUoKSk7Ci0gICAgYnVpbGRlci5zZXREaXJlY3Rpb24oZ2V0RGlyZWN0aW9uKCkpOwotICAgIGJ1aWxkZXIuc2V0QnVmZmVyQ2FwYWNpdHkoREVGQVVMVF9CVUZGRVJfQ0FQQUNJVFkpOwotCi0gICAgcmV0dXJuIGdldFN0cmVhbUludGVybmFsKCktPm9wZW4oYnVpbGRlcik7Ci19Ci0KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6OmNsb3NlKCkgewotICAgICByZXR1cm4gZ2V0U3RyZWFtSW50ZXJuYWwoKS0+Y2xvc2UoKTsKLX0KLQotLy8gVE9ETywgbWF5YmUgdXNlIGFuIGludGVyZmFjZSB0byByZWR1Y2UgZXhwb3N1cmUKLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6OnJlZ2lzdGVyU3RyZWFtKHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ+c2hhcmVkU3RyZWFtKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2tTdHJlYW1zKTsKLSAgICBtUmVnaXN0ZXJlZFN0cmVhbXMucHVzaF9iYWNrKHNoYXJlZFN0cmVhbSk7Ci0gICAgcmV0dXJuIEFBVURJT19PSzsKLX0KLQotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6dW5yZWdpc3RlclN0cmVhbShzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkPnNoYXJlZFN0cmVhbSkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrU3RyZWFtcyk7Ci0gICAgbVJlZ2lzdGVyZWRTdHJlYW1zLmVyYXNlKHN0ZDo6cmVtb3ZlKG1SZWdpc3RlcmVkU3RyZWFtcy5iZWdpbigpLCBtUmVnaXN0ZXJlZFN0cmVhbXMuZW5kKCksIHNoYXJlZFN0cmVhbSksCi0gICAgICAgICAgICAgIG1SZWdpc3RlcmVkU3RyZWFtcy5lbmQoKSk7Ci0gICAgcmV0dXJuIEFBVURJT19PSzsKLX0KLQotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6c3RhcnRTdHJlYW0oc3A8QUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZD4gc2hhcmVkU3RyZWFtKSB7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKLSAgICBpZiAoKyttUnVubmluZ1N0cmVhbXMgPT0gMSkgewotICAgICAgICAvLyBUT0RPIHVzZSByZWFsLXRpbWUgdGVjaG5pcXVlIHRvIGF2b2lkIG11dGV4LCBlZy4gYXRvbWljIGNvbW1hbmQgRklGTwotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9ja1N0cmVhbXMpOwotICAgICAgICByZXN1bHQgPSBnZXRTdHJlYW1JbnRlcm5hbCgpLT5yZXF1ZXN0U3RhcnQoKTsKLSAgICAgICAgc3RhcnRTaGFyaW5nVGhyZWFkX2woKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6c3RvcFN0cmVhbShzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkPiBzaGFyZWRTdHJlYW0pIHsKLSAgICAvLyBEb24ndCBsb2NrIGhlcmUgYmVjYXVzZSB0aGUgZGlzY29ubmVjdFJlZ2lzdGVyZWRTdHJlYW1zIGFsc28gdXNlcyB0aGUgbG9jay4KLSAgICBpZiAoLS1tUnVubmluZ1N0cmVhbXMgPT0gMCkgeyAvLyBhdG9taWMKLSAgICAgICAgc3RvcFNoYXJpbmdUaHJlYWQoKTsKLSAgICAgICAgZ2V0U3RyZWFtSW50ZXJuYWwoKS0+cmVxdWVzdFN0b3AoKTsKLSAgICB9Ci0gICAgcmV0dXJuIEFBVURJT19PSzsKLX0KLQotc3RhdGljIHZvaWQgKmFhdWRpb19lbmRwb2ludF90aHJlYWRfcHJvYyh2b2lkICpjb250ZXh0KSB7Ci0gICAgQUF1ZGlvU2VydmljZUVuZHBvaW50ICplbmRwb2ludCA9IChBQXVkaW9TZXJ2aWNlRW5kcG9pbnQgKikgY29udGV4dDsKLSAgICBpZiAoZW5kcG9pbnQgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZW5kcG9pbnQtPmNhbGxiYWNrTG9vcCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6c3RhcnRTaGFyaW5nVGhyZWFkX2woKSB7Ci0gICAgLy8gTGF1bmNoIHRoZSBjYWxsYmFjayBsb29wIHRocmVhZC4KLSAgICBpbnQ2NF90IHBlcmlvZE5hbm9zID0gZ2V0U3RyZWFtSW50ZXJuYWwoKS0+Z2V0RnJhbWVzUGVyQnVyc3QoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAqIEFBVURJT19OQU5PU19QRVJfU0VDT05ECi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8gZ2V0U2FtcGxlUmF0ZSgpOwotICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUodHJ1ZSk7Ci0gICAgcmV0dXJuIGdldFN0cmVhbUludGVybmFsKCktPmNyZWF0ZVRocmVhZChwZXJpb2ROYW5vcywgYWF1ZGlvX2VuZHBvaW50X3RocmVhZF9wcm9jLCB0aGlzKTsKLX0KLQotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6c3RvcFNoYXJpbmdUaHJlYWQoKSB7Ci0gICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGdldFN0cmVhbUludGVybmFsKCktPmpvaW5UaHJlYWQoTlVMTCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQogdm9pZCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6OmRpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtcygpIHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9ja1N0cmVhbXMpOwotICAgIGZvcihhdXRvIHNoYXJlZFN0cmVhbSA6IG1SZWdpc3RlcmVkU3RyZWFtcykgewotICAgICAgICBzaGFyZWRTdHJlYW0tPnN0b3AoKTsKLSAgICAgICAgc2hhcmVkU3RyZWFtLT5kaXNjb25uZWN0KCk7CisgICAgZm9yIChjb25zdCBhdXRvIHN0cmVhbSA6IG1SZWdpc3RlcmVkU3RyZWFtcykgeworICAgICAgICBzdHJlYW0tPnN0b3AoKTsKKyAgICAgICAgc3RyZWFtLT5kaXNjb25uZWN0KCk7CiAgICAgfQogICAgIG1SZWdpc3RlcmVkU3RyZWFtcy5jbGVhcigpOwogfQogCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50OjpyZWdpc3RlclN0cmVhbShzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT5zdHJlYW0pIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9ja1N0cmVhbXMpOworICAgIG1SZWdpc3RlcmVkU3RyZWFtcy5wdXNoX2JhY2soc3RyZWFtKTsKKyAgICByZXR1cm4gQUFVRElPX09LOworfQorCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50Ojp1bnJlZ2lzdGVyU3RyZWFtKHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPnN0cmVhbSkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrU3RyZWFtcyk7CisgICAgbVJlZ2lzdGVyZWRTdHJlYW1zLmVyYXNlKHN0ZDo6cmVtb3ZlKAorICAgICAgICAgICAgbVJlZ2lzdGVyZWRTdHJlYW1zLmJlZ2luKCksIG1SZWdpc3RlcmVkU3RyZWFtcy5lbmQoKSwgc3RyZWFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlZ2lzdGVyZWRTdHJlYW1zLmVuZCgpKTsKKyAgICByZXR1cm4gQUFVRElPX09LOworfQorCiBib29sIEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6bWF0Y2hlcyhjb25zdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uKSB7CisgICAgaWYgKGNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0aW9uKCkgIT0gZ2V0RGlyZWN0aW9uKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICBpZiAoY29uZmlndXJhdGlvbi5nZXREZXZpY2VJZCgpICE9IEFBVURJT19VTlNQRUNJRklFRCAmJgotICAgICAgICAgICAgY29uZmlndXJhdGlvbi5nZXREZXZpY2VJZCgpICE9IG1TdHJlYW1JbnRlcm5hbC0+Z2V0RGV2aWNlSWQoKSkgeworICAgICAgICBjb25maWd1cmF0aW9uLmdldERldmljZUlkKCkgIT0gZ2V0RGV2aWNlSWQoKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChjb25maWd1cmF0aW9uLmdldFNhbXBsZVJhdGUoKSAhPSBBQVVESU9fVU5TUEVDSUZJRUQgJiYKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0U2FtcGxlUmF0ZSgpICE9IG1TdHJlYW1JbnRlcm5hbC0+Z2V0U2FtcGxlUmF0ZSgpKSB7CisgICAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0U2FtcGxlUmF0ZSgpICE9IGdldFNhbXBsZVJhdGUoKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChjb25maWd1cmF0aW9uLmdldFNhbXBsZXNQZXJGcmFtZSgpICE9IEFBVURJT19VTlNQRUNJRklFRCAmJgotICAgICAgICAgICAgY29uZmlndXJhdGlvbi5nZXRTYW1wbGVzUGVyRnJhbWUoKSAhPSBtU3RyZWFtSW50ZXJuYWwtPmdldFNhbXBsZXNQZXJGcmFtZSgpKSB7CisgICAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0U2FtcGxlc1BlckZyYW1lKCkgIT0gZ2V0U2FtcGxlc1BlckZyYW1lKCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLQogICAgIHJldHVybiB0cnVlOwogfQotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5oCmluZGV4IGU0MGE2NzAuLjJlZjYyMzQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5oCkBAIC0yNCw3MCArMjQsOTMgQEAKIAogI2luY2x1ZGUgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgiCiAjaW5jbHVkZSAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmgiCisjaW5jbHVkZSAiY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmgiCiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TZXJ2aWNlTWVzc2FnZS5oIgotI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuaCIKLSNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5oIgotI2luY2x1ZGUgIkFBdWRpb01peGVyLmgiCi0jaW5jbHVkZSAiQUF1ZGlvU2VydmljZS5oIgorI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5oIgorCisjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaCIKIAogbmFtZXNwYWNlIGFhdWRpbyB7CiAKLWNsYXNzIEFBdWRpb1NlcnZpY2VFbmRwb2ludCB7CisvKioKKyAqIEFBdWRpb1NlcnZpY2VFbmRwb2ludCBpcyB1c2VkIGJ5IGEgc3ViY2xhc3Mgb2YgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UKKyAqIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHVuZGVybHlpbmcgYXVkaW8gZGV2aWNlIG9yIHBvcnQuCisgKi8KK2NsYXNzIEFBdWRpb1NlcnZpY2VFbmRwb2ludAorICAgICAgICA6IHB1YmxpYyB2aXJ0dWFsIGFuZHJvaWQ6OlJlZkJhc2UKKyAgICAgICAgLCBwdWJsaWMgQUF1ZGlvU3RyZWFtUGFyYW1ldGVycyB7CiBwdWJsaWM6Ci0gICAgdmlydHVhbCB+QUF1ZGlvU2VydmljZUVuZHBvaW50KCkgPSBkZWZhdWx0OwogCi0gICAgc3RkOjpzdHJpbmcgZHVtcCgpIGNvbnN0OworICAgIHZpcnR1YWwgfkFBdWRpb1NlcnZpY2VFbmRwb2ludCgpOwogCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgb3Blbihjb25zdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uKTsKKyAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGR1bXAoKSBjb25zdDsKIAotICAgIGludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1TdHJlYW1JbnRlcm5hbC0+Z2V0U2FtcGxlUmF0ZSgpOyB9Ci0gICAgaW50MzJfdCBnZXRTYW1wbGVzUGVyRnJhbWUoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtSW50ZXJuYWwtPmdldFNhbXBsZXNQZXJGcmFtZSgpOyAgfQotICAgIGludDMyX3QgZ2V0RnJhbWVzUGVyQnVyc3QoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtSW50ZXJuYWwtPmdldEZyYW1lc1BlckJ1cnN0KCk7ICB9CisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgb3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpID0gMDsKIAotICAgIGFhdWRpb19yZXN1bHRfdCByZWdpc3RlclN0cmVhbShhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkPiBzaGFyZWRTdHJlYW0pOwotICAgIGFhdWRpb19yZXN1bHRfdCB1bnJlZ2lzdGVyU3RyZWFtKGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ+IHNoYXJlZFN0cmVhbSk7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0U3RyZWFtKGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ+IHNoYXJlZFN0cmVhbSk7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHN0b3BTdHJlYW0oYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZD4gc2hhcmVkU3RyZWFtKTsKLSAgICBhYXVkaW9fcmVzdWx0X3QgY2xvc2UoKTsKKyAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBjbG9zZSgpID0gMDsKKworICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHJlZ2lzdGVyU3RyZWFtKGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzdHJlYW0pOworCisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgdW5yZWdpc3RlclN0cmVhbShhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc3RyZWFtKTsKKworICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0U3RyZWFtKGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqY2xpZW50SGFuZGxlKSA9IDA7CisKKyAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBzdG9wU3RyZWFtKGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSkgPSAwOworCisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgc3RhcnRDbGllbnQoY29uc3QgYW5kcm9pZDo6QXVkaW9DbGllbnQmIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpjbGllbnRIYW5kbGUpIHsKKyAgICAgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludDo6c3RhcnRDbGllbnQoJXAsIC4uLikgQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFIiwgJmNsaWVudCk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CisgICAgfQorCisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgc3RvcENsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSkgeworICAgICAgICBBTE9HRCgiQUF1ZGlvU2VydmljZUVuZHBvaW50OjpzdG9wQ2xpZW50KC4uLikgQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFIik7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHBvc2l0aW9uRnJhbWVzCisgICAgICogQHBhcmFtIHRpbWVOYW5vcworICAgICAqIEByZXR1cm4gQUFVRElPX09LIG9yIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSBvciBvdGhlciBuZWdhdGl2ZSBlcnJvcgorICAgICAqLworICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGdldEZyZWVSdW5uaW5nUG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgPSAwOworCisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZ2V0VGltZXN0YW1wKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpID0gMDsKKworICAgIGludDMyX3QgZ2V0RnJhbWVzUGVyQnVyc3QoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRnJhbWVzUGVyQnVyc3Q7CisgICAgfQogCiAgICAgaW50MzJfdCBnZXRSZXF1ZXN0ZWREZXZpY2VJZCgpIGNvbnN0IHsgcmV0dXJuIG1SZXF1ZXN0ZWREZXZpY2VJZDsgfQotICAgIGludDMyX3QgZ2V0RGV2aWNlSWQoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtSW50ZXJuYWwtPmdldERldmljZUlkKCk7IH0KLQotICAgIGFhdWRpb19kaXJlY3Rpb25fdCBnZXREaXJlY3Rpb24oKSBjb25zdCB7IHJldHVybiBtU3RyZWFtSW50ZXJuYWwtPmdldERpcmVjdGlvbigpOyB9Ci0KLSAgICB2b2lkIGRpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtcygpOwotCi0gICAgdmlydHVhbCB2b2lkICpjYWxsYmFja0xvb3AoKSA9IDA7Ci0KLSAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSBBQXVkaW9FbmRwb2ludE1hbmFnZXIgdW5kZXIgYSBtdXRleC4KLSAgICBpbnQzMl90IGdldFJlZmVyZW5jZUNvdW50KCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVJlZmVyZW5jZUNvdW50OwotICAgIH0KLQotICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIEFBdWRpb0VuZHBvaW50TWFuYWdlciB1bmRlciBhIG11dGV4LgotICAgIHZvaWQgc2V0UmVmZXJlbmNlQ291bnQoaW50MzJfdCBjb3VudCkgewotICAgICAgICBtUmVmZXJlbmNlQ291bnQgPSBjb3VudDsKLSAgICB9CiAKICAgICBib29sIG1hdGNoZXMoY29uc3QgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbik7CiAKLSAgICB2aXJ0dWFsIEF1ZGlvU3RyZWFtSW50ZXJuYWwgKmdldFN0cmVhbUludGVybmFsKCkgPSAwOworICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIEFBdWRpb0VuZHBvaW50TWFuYWdlciB1bmRlciBhIG11dGV4LgorICAgIGludDMyX3QgZ2V0T3BlbkNvdW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU9wZW5Db3VudDsKKyAgICB9CiAKLSAgICBzdGQ6OmF0b21pYzxib29sPiAgICAgICAgbUNhbGxiYWNrRW5hYmxlZHtmYWxzZX07CisgICAgLy8gVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSB0aGUgQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyIHVuZGVyIGEgbXV0ZXguCisgICAgdm9pZCBzZXRPcGVuQ291bnQoaW50MzJfdCBjb3VudCkgeworICAgICAgICBtT3BlbkNvdW50ID0gY291bnQ7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtcygpOwogCiAgICAgbXV0YWJsZSBzdGQ6Om11dGV4ICAgICAgIG1Mb2NrU3RyZWFtczsKKyAgICBzdGQ6OnZlY3RvcjxhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4+IG1SZWdpc3RlcmVkU3RyZWFtczsKIAotICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ+PiBtUmVnaXN0ZXJlZFN0cmVhbXM7CisgICAgU2ltcGxlRG91YmxlQnVmZmVyPFRpbWVzdGFtcD4gIG1BdG9taWNUaW1lc3RhbXA7CiAKLSAgICBzdGQ6OmF0b21pYzxpbnQ+ICAgICAgICAgbVJ1bm5pbmdTdHJlYW1zezB9OworICAgIGFuZHJvaWQ6OkF1ZGlvQ2xpZW50ICAgICBtTW1hcENsaWVudDsgICAvLyBzZXQgaW4gb3BlbiwgdXNlZCBpbiBvcGVuIGFuZCBzdGFydFN0cmVhbQogCi1wcml2YXRlOgotICAgIGFhdWRpb19yZXN1bHRfdCBzdGFydFNoYXJpbmdUaHJlYWRfbCgpOwotICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wU2hhcmluZ1RocmVhZCgpOwotCi0gICAgQXVkaW9TdHJlYW1JbnRlcm5hbCAgICAgKm1TdHJlYW1JbnRlcm5hbCA9IG51bGxwdHI7Ci0gICAgaW50MzJfdCAgICAgICAgICAgICAgICAgIG1SZWZlcmVuY2VDb3VudCA9IDA7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgIG1GcmFtZXNQZXJCdXJzdCA9IDA7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgIG1PcGVuQ291bnQgPSAwOwogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICBtUmVxdWVzdGVkRGV2aWNlSWQgPSAwOworCiB9OwogCiB9IC8qIG5hbWVzcGFjZSBhYXVkaW8gKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAKaW5kZXggNmEzNzMzMC4uYzdkOWI4ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAKQEAgLTMwLDIwICszMCwyMiBAQAogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VFbmRwb2ludC5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuaCIKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmgiCisjaW5jbHVkZSAiQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOyAgLy8gVE9ETyBqdXN0IGltcG9ydCBuYW1lcyBuZWVkZWQKIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87ICAgLy8gVE9ETyBqdXN0IGltcG9ydCBuYW1lcyBuZWVkZWQKIAogQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZTo6QUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZShBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UpCiAgICAgICAgIDogbVN0cmVhbUludGVybmFsQ2FwdHVyZShhdWRpb1NlcnZpY2UsIHRydWUpIHsKKyAgICBtU3RyZWFtSW50ZXJuYWwgPSAmbVN0cmVhbUludGVybmFsQ2FwdHVyZTsKIH0KIAogQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZTo6fkFBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUoKSB7CiAgICAgZGVsZXRlIG1EaXN0cmlidXRpb25CdWZmZXI7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlOjpvcGVuKGNvbnN0IEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24pIHsKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU2VydmljZUVuZHBvaW50OjpvcGVuKGNvbmZpZ3VyYXRpb24pOworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmU6Om9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSB7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6b3BlbihyZXF1ZXN0KTsKICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgewogICAgICAgICBkZWxldGUgbURpc3RyaWJ1dGlvbkJ1ZmZlcjsKICAgICAgICAgaW50IGRpc3RyaWJ1dGlvbkJ1ZmZlclNpemVCeXRlcyA9IGdldFN0cmVhbUludGVybmFsKCktPmdldEZyYW1lc1BlckJ1cnN0KCkKQEAgLTYyLDYgKzY0LDkgQEAKIAogICAgIC8vIHJlc3VsdCBtaWdodCBiZSBhIGZyYW1lIGNvdW50CiAgICAgd2hpbGUgKG1DYWxsYmFja0VuYWJsZWQubG9hZCgpICYmIGdldFN0cmVhbUludGVybmFsKCktPmlzQWN0aXZlKCkgJiYgKHJlc3VsdCA+PSAwKSkgeworCisgICAgICAgIGludDY0X3QgbW1hcEZyYW1lc1JlYWQgPSBnZXRTdHJlYW1JbnRlcm5hbCgpLT5nZXRGcmFtZXNSZWFkKCk7CisKICAgICAgICAgLy8gUmVhZCBhdWRpbyBkYXRhIGZyb20gc3RyZWFtIHVzaW5nIGEgYmxvY2tpbmcgcmVhZC4KICAgICAgICAgcmVzdWx0ID0gZ2V0U3RyZWFtSW50ZXJuYWwoKS0+cmVhZChtRGlzdHJpYnV0aW9uQnVmZmVyLCBnZXRGcmFtZXNQZXJCdXJzdCgpLCB0aW1lb3V0TmFub3MpOwogICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQpIHsKQEAgLTc0LDE4ICs3OSw0NyBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gRGlzdHJpYnV0ZSBkYXRhIHRvIGVhY2ggYWN0aXZlIHN0cmVhbS4KLSAgICAgICAgeyAvLyB1c2UgbG9jayBndWFyZAorICAgICAgICB7IC8vIGJyYWNrZXRzIGFyZSBmb3IgbG9ja19ndWFyZAorCiAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2tTdHJlYW1zKTsKLSAgICAgICAgICAgIGZvciAoc3A8QUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZD4gc2hhcmVkU3RyZWFtIDogbVJlZ2lzdGVyZWRTdHJlYW1zKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNoYXJlZFN0cmVhbS0+aXNSdW5uaW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgRmlmb0J1ZmZlciAqZmlmbyA9IHNoYXJlZFN0cmVhbS0+Z2V0RGF0YUZpZm9CdWZmZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpZm8tPmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpIDwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEZyYW1lc1BlckJ1cnN0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVyZmxvd0NvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWZvLT53cml0ZShtRGlzdHJpYnV0aW9uQnVmZmVyLCBnZXRGcmFtZXNQZXJCdXJzdCgpKTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byBjbGllbnRTdHJlYW0gOiBtUmVnaXN0ZXJlZFN0cmVhbXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50U3RyZWFtLT5pc1J1bm5pbmcoKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGNsaWVudEZyYW1lc1dyaXR0ZW4gPSAwOworICAgICAgICAgICAgICAgICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkPiBzdHJlYW1TaGFyZWQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQgKj4oY2xpZW50U3RyZWFtLmdldCgpKTsKKworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2NrIHRoZSBBdWRpb0ZpZm8gdG8gcHJvdGVjdCBhZ2FpbnN0IGNsb3NlLgorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkIDxzdGQ6Om11dGV4PiBsb2NrKHN0cmVhbVNoYXJlZC0+Z2V0QXVkaW9EYXRhUXVldWVMb2NrKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBGaWZvQnVmZmVyICpmaWZvID0gc3RyZWFtU2hhcmVkLT5nZXRBdWRpb0RhdGFGaWZvQnVmZmVyX2woKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWZvICE9IG51bGxwdHIpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERldGVybWluZSBvZmZzZXQgYmV0d2VlbiBmcmFtZVBvc2l0aW9uIGluIGNsaWVudCdzIHN0cmVhbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZzIHRoZSB1bmRlcmx5aW5nIE1NQVAgc3RyZWFtLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEZyYW1lc1dyaXR0ZW4gPSBmaWZvLT5nZXRXcml0ZUNvdW50ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgdHdvIGluZGljZXMgdGhhdCByZWZlciB0byB0aGUgc2FtZSBmcmFtZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uT2Zmc2V0ID0gbW1hcEZyYW1lc1JlYWQgLSBjbGllbnRGcmFtZXNXcml0dGVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNoYXJlZC0+c2V0VGltZXN0YW1wUG9zaXRpb25PZmZzZXQocG9zaXRpb25PZmZzZXQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZm8tPmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpIDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RnJhbWVzUGVyQnVyc3QoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcmZsb3dDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZm8tPndyaXRlKG1EaXN0cmlidXRpb25CdWZmZXIsIGdldEZyYW1lc1BlckJ1cnN0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRGcmFtZXNXcml0dGVuID0gZmlmby0+Z2V0V3JpdGVDb3VudGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2hhcmVkU3RyZWFtLT5tYXJrVHJhbnNmZXJUaW1lKEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnRGcmFtZXNXcml0dGVuID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyB0aW1lc3RhbXAgcmVwcmVzZW50cyB0aGUgY29tcGxldGlvbiBvZiBkYXRhIGJlaW5nIHdyaXR0ZW4gaW50byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBidWZmZXIuIEl0IGlzIHNlbnQgdG8gdGhlIGNsaWVudCBhbmQgdXNlZCBpbiB0aGUgdGltaW5nIG1vZGVsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBkZWNpZGUgd2hlbiBkYXRhIHdpbGwgYmUgYXZhaWxhYmxlIHRvIHJlYWQuCisgICAgICAgICAgICAgICAgICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wKGNsaWVudEZyYW1lc1dyaXR0ZW4sIEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtU2hhcmVkLT5tYXJrVHJhbnNmZXJUaW1lKHRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5oCmluZGV4IDhhM2Q3MmYuLjk3MWRhOWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmgKQEAgLTIwLDE4ICsyMCwxOCBAQAogI2luY2x1ZGUgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgiCiAjaW5jbHVkZSAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmgiCiAKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuaCIKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmgiCisKIG5hbWVzcGFjZSBhYXVkaW8gewogCi1jbGFzcyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlIDogcHVibGljIEFBdWRpb1NlcnZpY2VFbmRwb2ludCB7CitjbGFzcyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlIDogcHVibGljIEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZCB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZShhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UpOwogICAgIHZpcnR1YWwgfkFBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUoKTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCBvcGVuKGNvbnN0IEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24pIG92ZXJyaWRlOworICAgIGFhdWRpb19yZXN1bHRfdCBvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgb3ZlcnJpZGU7CiAKLSAgICBBdWRpb1N0cmVhbUludGVybmFsICpnZXRTdHJlYW1JbnRlcm5hbCgpIG92ZXJyaWRlIHsKLSAgICAgICAgcmV0dXJuICZtU3RyZWFtSW50ZXJuYWxDYXB0dXJlOwotICAgIH0KIAogICAgIHZvaWQgKmNhbGxiYWNrTG9vcCgpIG92ZXJyaWRlOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZTI1YzgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcApAQCAtMCwwICsxLDM1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDx1dGlscy9TaW5nbGV0b24uaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKworI2luY2x1ZGUgIkFBdWRpb0VuZHBvaW50TWFuYWdlci5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VFbmRwb2ludC5oIgorCisjaW5jbHVkZSAiY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuaCIKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaCIKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmgiCisjaW5jbHVkZSAiQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuaCIKKworCisjZGVmaW5lIEFBVURJT19CVUZGRVJfQ0FQQUNJVFlfTUlOICAgIDQgKiA1MTIKKyNkZWZpbmUgQUFVRElPX1NBTVBMRV9SQVRFX0RFRkFVTFQgICAgNDgwMDAKKworLy8gVGhpcyBpcyBhbiBlc3RpbWF0ZSBvZiB0aGUgdGltZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIEhXIGFuZCB0aGUgTU1BUCB0aW1lLgorLy8gVE9ETyBHZXQgcHJlc2VudGF0aW9uIHRpbWVzdGFtcHMgZnJvbSB0aGUgSEFMIGluc3RlYWQgb2YgdXNpbmcgdGhlc2UgZXN0aW1hdGVzLgorI2RlZmluZSBPVVRQVVRfRVNUSU1BVEVEX0hBUkRXQVJFX09GRlNFVF9OQU5PUyAgKDMgKiBBQVVESU9fTkFOT1NfUEVSX01JTExJU0VDT05EKQorI2RlZmluZSBJTlBVVF9FU1RJTUFURURfSEFSRFdBUkVfT0ZGU0VUX05BTk9TICAgKC0xICogQUFVRElPX05BTk9TX1BFUl9NSUxMSVNFQ09ORCkKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7ICAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZAordXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsgICAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZAorCitBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQKCkKKyAgICAgICAgOiAgbU1tYXBTdHJlYW0obnVsbHB0cikge30KKworQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6fkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAoKSB7fQorCitzdGQ6OnN0cmluZyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpkdW1wKCkgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHJlc3VsdDsKKworICAgIHJlc3VsdCA8PCAiICBNTUFQOiBmcmFtZXNUcmFuc2ZlcnJlZCA9ICIgPDwgbUZyYW1lc1RyYW5zZmVycmVkLmdldCgpOworICAgIHJlc3VsdCA8PCAiLCBIVyBuYW5vcyA9ICIgPDwgbUhhcmR3YXJlVGltZU9mZnNldE5hbm9zOworICAgIHJlc3VsdCA8PCAiLCBwb3J0IGhhbmRsZSA9ICIgPDwgbVBvcnRIYW5kbGU7CisgICAgcmVzdWx0IDw8ICIsIGF1ZGlvIGRhdGEgRkQgPSAiIDw8IG1BdWRpb0RhdGFGaWxlRGVzY3JpcHRvcjsKKyAgICByZXN1bHQgPDwgIlxuIjsKKworICAgIHJlc3VsdCA8PCAiICAgIEhXIE9mZnNldCBNaWNyb3M6ICAgICAiIDw8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXRIYXJkd2FyZVRpbWVPZmZzZXROYW5vcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIEFBVURJT19OQU5PU19QRVJfTUlDUk9TRUNPTkQpIDw8ICJcbiI7CisKKyAgICByZXN1bHQgPDwgQUF1ZGlvU2VydmljZUVuZHBvaW50OjpkdW1wKCk7CisgICAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSB7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKKyAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHsKKyAgICAgICAgICAgIC5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfTVVTSUMsCisgICAgICAgICAgICAudXNhZ2UgPSBBVURJT19VU0FHRV9NRURJQSwKKyAgICAgICAgICAgIC5zb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04sCisgICAgICAgICAgICAuZmxhZ3MgPSBBVURJT19GTEFHX0xPV19MQVRFTkNZLAorICAgICAgICAgICAgLnRhZ3MgPSAiIgorICAgIH07CisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWc7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZDsKKworICAgIGludDMyX3QgYnVyc3RNaW5NaWNyb3MgPSBBQXVkaW9Qcm9wZXJ0eV9nZXRIYXJkd2FyZUJ1cnN0TWluTWljcm9zKCk7CisgICAgaW50MzJfdCBidXJzdE1pY3JvcyA9IDA7CisKKyAgICBjb3B5RnJvbShyZXF1ZXN0LmdldENvbnN0YW50Q29uZmlndXJhdGlvbigpKTsKKworICAgIG1NbWFwQ2xpZW50LmNsaWVudFVpZCA9IHJlcXVlc3QuZ2V0VXNlcklkKCk7CisgICAgbU1tYXBDbGllbnQuY2xpZW50UGlkID0gcmVxdWVzdC5nZXRQcm9jZXNzSWQoKTsKKyAgICBtTW1hcENsaWVudC5wYWNrYWdlTmFtZS5zZXRUbyhTdHJpbmcxNigiIikpOworCisgICAgbVJlcXVlc3RlZERldmljZUlkID0gZGV2aWNlSWQgPSBnZXREZXZpY2VJZCgpOworCisgICAgLy8gRmlsbCBpbiBjb25maWcKKyAgICBhYXVkaW9fZm9ybWF0X3QgYWF1ZGlvRm9ybWF0ID0gZ2V0Rm9ybWF0KCk7CisgICAgaWYgKGFhdWRpb0Zvcm1hdCA9PSBBQVVESU9fVU5TUEVDSUZJRUQgfHwgYWF1ZGlvRm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CisgICAgICAgIGFhdWRpb0Zvcm1hdCA9IEFBVURJT19GT1JNQVRfUENNX0kxNjsKKyAgICB9CisgICAgY29uZmlnLmZvcm1hdCA9IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkRGF0YUZvcm1hdChhYXVkaW9Gb3JtYXQpOworCisgICAgaW50MzJfdCBhYXVkaW9TYW1wbGVSYXRlID0gZ2V0U2FtcGxlUmF0ZSgpOworICAgIGlmIChhYXVkaW9TYW1wbGVSYXRlID09IEFBVURJT19VTlNQRUNJRklFRCkgeworICAgICAgICBhYXVkaW9TYW1wbGVSYXRlID0gQUFVRElPX1NBTVBMRV9SQVRFX0RFRkFVTFQ7CisgICAgfQorICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IGFhdWRpb1NhbXBsZVJhdGU7CisKKyAgICBpbnQzMl90IGFhdWRpb1NhbXBsZXNQZXJGcmFtZSA9IGdldFNhbXBsZXNQZXJGcmFtZSgpOworCisgICAgYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiA9IGdldERpcmVjdGlvbigpOworICAgIGlmIChkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpIHsKKyAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IChhYXVkaW9TYW1wbGVzUGVyRnJhbWUgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KGFhdWRpb1NhbXBsZXNQZXJGcmFtZSk7CisgICAgICAgIG1IYXJkd2FyZVRpbWVPZmZzZXROYW5vcyA9IE9VVFBVVF9FU1RJTUFURURfSEFSRFdBUkVfT0ZGU0VUX05BTk9TOyAvLyBmcmFtZXMgYXQgREFDIGxhdGVyCisKKyAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBBQVVESU9fRElSRUNUSU9OX0lOUFVUKSB7CisgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSAgKGFhdWRpb1NhbXBsZXNQZXJGcmFtZSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBVURJT19DSEFOTkVMX0lOX1NURVJFTworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYXVkaW9fY2hhbm5lbF9pbl9tYXNrX2Zyb21fY291bnQoYWF1ZGlvU2FtcGxlc1BlckZyYW1lKTsKKyAgICAgICAgbUhhcmR3YXJlVGltZU9mZnNldE5hbm9zID0gSU5QVVRfRVNUSU1BVEVEX0hBUkRXQVJFX09GRlNFVF9OQU5PUzsgLy8gZnJhbWVzIGF0IEFEQyBlYXJsaWVyCisKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgib3Blbk1tYXBTdHJlYW0gLSBpbnZhbGlkIGRpcmVjdGlvbiA9ICVkIiwgZGlyZWN0aW9uKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UOworICAgIH0KKworICAgIE1tYXBTdHJlYW1JbnRlcmZhY2U6OnN0cmVhbV9kaXJlY3Rpb25fdCBzdHJlYW1EaXJlY3Rpb24gPQorICAgICAgICAgICAgKGRpcmVjdGlvbiA9PSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCkKKyAgICAgICAgICAgID8gTW1hcFN0cmVhbUludGVyZmFjZTo6RElSRUNUSU9OX09VVFBVVAorICAgICAgICAgICAgOiBNbWFwU3RyZWFtSW50ZXJmYWNlOjpESVJFQ1RJT05fSU5QVVQ7CisKKyAgICAvLyBPcGVuIEhBTCBzdHJlYW0uIFNldCBtTW1hcFN0cmVhbQorICAgIHN0YXR1c190IHN0YXR1cyA9IE1tYXBTdHJlYW1JbnRlcmZhY2U6Om9wZW5NbWFwU3RyZWFtKHN0cmVhbURpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NbWFwQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCAvLyBjYWxsYmFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NbWFwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtUG9ydEhhbmRsZSk7CisgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9wZW4oKSBtTWFwQ2xpZW50LnVpZCA9ICVkLCBwaWQgPSAlZCA9PiBwb3J0SGFuZGxlID0gJWRcbiIsCisgICAgICAgICAgbU1tYXBDbGllbnQuY2xpZW50VWlkLCAgbU1tYXBDbGllbnQuY2xpZW50UGlkLCBtUG9ydEhhbmRsZSk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICBBTE9HRSgib3Blbk1tYXBTdHJlYW0gcmV0dXJuZWQgc3RhdHVzICVkIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKKyAgICB9CisKKyAgICBpZiAoZGV2aWNlSWQgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgIEFMT0dXKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpvcGVuKCkgLSBvcGVuTW1hcFN0cmVhbSgpIGZhaWxlZCB0byBzZXQgZGV2aWNlSWQiKTsKKyAgICB9CisgICAgc2V0RGV2aWNlSWQoZGV2aWNlSWQpOworCisgICAgLy8gQ3JlYXRlIE1NQVAvTk9JUlEgYnVmZmVyLgorICAgIGludDMyX3QgbWluU2l6ZUZyYW1lcyA9IGdldEJ1ZmZlckNhcGFjaXR5KCk7CisgICAgaWYgKG1pblNpemVGcmFtZXMgPD0gMCkgeyAvLyB6ZXJvIHdpbGwgZ2V0IHJlamVjdGVkCisgICAgICAgIG1pblNpemVGcmFtZXMgPSBBQVVESU9fQlVGRkVSX0NBUEFDSVRZX01JTjsKKyAgICB9CisgICAgc3RhdHVzID0gbU1tYXBTdHJlYW0tPmNyZWF0ZU1tYXBCdWZmZXIobWluU2l6ZUZyYW1lcywgJm1NbWFwQnVmZmVyaW5mbyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6b3BlbigpIC0gY3JlYXRlTW1hcEJ1ZmZlcigpIGZhaWxlZCB3aXRoIHN0YXR1cyAlZCAlcyIsCisgICAgICAgICAgICAgIHN0YXR1cywgc3RyZXJyb3IoLXN0YXR1cykpOworICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0QoImNyZWF0ZU1tYXBCdWZmZXIgc3RhdHVzID0gJWQsIGJ1ZmZlcl9zaXplID0gJWQsIGJ1cnN0X3NpemUgJWQiCisgICAgICAgICAgICAgICAgICAgICAgIiwgU2hhcmFibGUgRkQ6ICVzIiwKKyAgICAgICAgICAgICAgc3RhdHVzLAorICAgICAgICAgICAgICBhYnMobU1tYXBCdWZmZXJpbmZvLmJ1ZmZlcl9zaXplX2ZyYW1lcyksCisgICAgICAgICAgICAgIG1NbWFwQnVmZmVyaW5mby5idXJzdF9zaXplX2ZyYW1lcywKKyAgICAgICAgICAgICAgbU1tYXBCdWZmZXJpbmZvLmJ1ZmZlcl9zaXplX2ZyYW1lcyA8IDAgPyAiWWVzIiA6ICJObyIpOworICAgIH0KKworICAgIHNldEJ1ZmZlckNhcGFjaXR5KG1NbWFwQnVmZmVyaW5mby5idWZmZXJfc2l6ZV9mcmFtZXMpOworICAgIC8vIFRoZSBhdWRpbyBIQUwgaW5kaWNhdGVzIGlmIHRoZSBzaGFyZWQgbWVtb3J5IGZkIGNhbiBiZSBzaGFyZWQgb3V0c2lkZSBvZiBhdWRpb3NlcnZlcgorICAgIC8vIGJ5IHJldHVybmluZyBhIG5lZ2F0aXZlIGJ1ZmZlciBzaXplCisgICAgaWYgKGdldEJ1ZmZlckNhcGFjaXR5KCkgPCAwKSB7CisgICAgICAgIC8vIEV4Y2x1c2l2ZSBtb2RlIGNhbiBiZSB1c2VkIGJ5IGNsaWVudCBvciBzZXJ2aWNlLgorICAgICAgICBzZXRCdWZmZXJDYXBhY2l0eSgtZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRXhjbHVzaXZlIG1vZGUgY2FuIG9ubHkgYmUgdXNlZCBieSB0aGUgc2VydmljZSBiZWNhdXNlIHRoZSBGRCBjYW5ub3QgYmUgc2hhcmVkLgorICAgICAgICB1aWRfdCBhdWRpb1NlcnZpY2VVaWQgPSBnZXR1aWQoKTsKKyAgICAgICAgaWYgKChtTW1hcENsaWVudC5jbGllbnRVaWQgIT0gYXVkaW9TZXJ2aWNlVWlkKSAmJgorICAgICAgICAgICAgZ2V0U2hhcmluZ01vZGUoKSA9PSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSkgeworICAgICAgICAgICAgLy8gRmFsbGJhY2sgaXMgaGFuZGxlZCBieSBjYWxsZXIgYnV0IGluZGljYXRlIHdoYXQgaXMgcG9zc2libGUgaW4gY2FzZQorICAgICAgICAgICAgLy8gdGhpcyBpcyB1c2VkIGluIHRoZSBmdXR1cmUKKyAgICAgICAgICAgIHNldFNoYXJpbmdNb2RlKEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKTsKKyAgICAgICAgICAgIEFMT0dXKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpvcGVuKCkgLSBleGNsdXNpdmUgRkQgY2Fubm90IGJlIHVzZWQgYnkgY2xpZW50Iik7CisgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdHJlYW0gYW5kIHBhc3MgaXQgYmFjayB0byB0aGUgY2FsbGVyLgorICAgIHNldFNhbXBsZXNQZXJGcmFtZSgoZGlyZWN0aW9uID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKQorICAgICAgICAgICAgICAgICAgICAgICA/IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjb25maWcuY2hhbm5lbF9tYXNrKQorICAgICAgICAgICAgICAgICAgICAgICA6IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNvbmZpZy5jaGFubmVsX21hc2spKTsKKworICAgIC8vIEFBdWRpbyBjcmVhdGVzIGEgY29weSBvZiB0aGlzIEZEIGFuZCByZXRhaW5zIG93bmVyc2hpcCBvZiB0aGUgY29weS4KKyAgICAvLyBBc3N1bWUgdGhhdCBBdWRpb0ZsaW5nZXIgd2lsbCBjbG9zZSB0aGUgb3JpZ2luYWwgc2hhcmVkX21lbW9yeV9mZC4KKyAgICBtQXVkaW9EYXRhRmlsZURlc2NyaXB0b3IucmVzZXQoZHVwKG1NbWFwQnVmZmVyaW5mby5zaGFyZWRfbWVtb3J5X2ZkKSk7CisgICAgaWYgKG1BdWRpb0RhdGFGaWxlRGVzY3JpcHRvci5nZXQoKSA9PSAtMSkgeworICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6b3BlbigpIC0gY291bGQgbm90IGR1cCBzaGFyZWRfbWVtb3J5X2ZkIik7CisgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlRFUk5BTDsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgbUZyYW1lc1BlckJ1cnN0ID0gbU1tYXBCdWZmZXJpbmZvLmJ1cnN0X3NpemVfZnJhbWVzOworICAgIHNldEZvcm1hdChBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb0RhdGFGb3JtYXQoY29uZmlnLmZvcm1hdCkpOworICAgIHNldFNhbXBsZVJhdGUoY29uZmlnLnNhbXBsZV9yYXRlKTsKKworICAgIC8vIFNjYWxlIHVwIHRoZSBidXJzdCBzaXplIHRvIG1lZXQgdGhlIG1pbmltdW0gZXF1aXZhbGVudCBpbiBtaWNyb3NlY29uZHMuCisgICAgLy8gVGhpcyBpcyB0byBhdm9pZCB3YWtpbmcgdGhlIENQVSB0b28gb2Z0ZW4gd2hlbiB0aGUgSFcgYnVyc3QgaXMgdmVyeSBzbWFsbAorICAgIC8vIG9yIGF0IGhpZ2ggc2FtcGxlIHJhdGVzLgorICAgIGRvIHsKKyAgICAgICAgaWYgKGJ1cnN0TWljcm9zID4gMCkgeyAgLy8gc2tpcCBmaXJzdCBsb29wCisgICAgICAgICAgICBtRnJhbWVzUGVyQnVyc3QgKj0gMjsKKyAgICAgICAgfQorICAgICAgICBidXJzdE1pY3JvcyA9IG1GcmFtZXNQZXJCdXJzdCAqIHN0YXRpY19jYXN0PGludDY0X3Q+KDEwMDAwMDApIC8gZ2V0U2FtcGxlUmF0ZSgpOworICAgIH0gd2hpbGUgKGJ1cnN0TWljcm9zIDwgYnVyc3RNaW5NaWNyb3MpOworCisgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9wZW4oKSBvcmlnaW5hbCBidXJzdCA9ICVkLCBtaW5NaWNyb3MgPSAlZCwgdG8gYnVyc3QgPSAlZFxuIiwKKyAgICAgICAgICBtTW1hcEJ1ZmZlcmluZm8uYnVyc3Rfc2l6ZV9mcmFtZXMsIGJ1cnN0TWluTWljcm9zLCBtRnJhbWVzUGVyQnVyc3QpOworCisgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9wZW4oKSBhY3R1YWwgcmF0ZSA9ICVkLCBjaGFubmVscyA9ICVkIgorICAgICAgICAgICIsIGRldmljZUlkID0gJWQsIGNhcGFjaXR5ID0gJWRcbiIsCisgICAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpLCBnZXRTYW1wbGVzUGVyRnJhbWUoKSwgZGV2aWNlSWQsIGdldEJ1ZmZlckNhcGFjaXR5KCkpOworCisgICAgcmV0dXJuIHJlc3VsdDsKKworZXJyb3I6CisgICAgY2xvc2UoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6Y2xvc2UoKSB7CisKKyAgICBpZiAobU1tYXBTdHJlYW0gIT0gMCkgeworICAgICAgICBBTE9HRCgiQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6Y2xvc2UoKSBjbGVhcigpIGVuZHBvaW50Iik7CisgICAgICAgIC8vIE5lZWRzIHRvIGJlIGV4cGxpY2l0bHkgY2xlYXJlZCBvciBDVFMgd2lsbCBmYWlsIGJ1dCBpdCBpcyBub3QgY2xlYXIgd2h5LgorICAgICAgICBtTW1hcFN0cmVhbS5jbGVhcigpOworICAgICAgICAvLyBBcHBhcmVudGx5IHRoZSBhYm92ZSBjbG9zZSBpcyBhc3luY2hyb25vdXMuIEFuIGF0dGVtcHQgdG8gb3BlbiBhIG5ldyBkZXZpY2UKKyAgICAgICAgLy8gcmlnaHQgYWZ0ZXIgYSBjbG9zZSBjYW4gZmFpbC4gQWxzbyBzb21lIGNhbGxiYWNrcyBtYXkgc3RpbGwgYmUgaW4gZmxpZ2h0IQorICAgICAgICAvLyBGSVhNRSBNYWtlIGNsb3Npbmcgc3luY2hyb25vdXMuCisgICAgICAgIEF1ZGlvQ2xvY2s6OnNsZWVwRm9yTmFub3MoMTAwICogQUFVRElPX05BTk9TX1BFUl9NSUxMSVNFQ09ORCk7CisgICAgfQorCisgICAgcmV0dXJuIEFBVURJT19PSzsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OnN0YXJ0U3RyZWFtKHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpjbGllbnRIYW5kbGUpIHsKKyAgICAvLyBTdGFydCB0aGUgY2xpZW50IG9uIGJlaGFsZiBvZiB0aGUgQUF1ZGlvIHNlcnZpY2UuCisgICAgLy8gVXNlIHRoZSBwb3J0IGhhbmRsZSB0aGF0IHdhcyBwcm92aWRlZCBieSBvcGVuTW1hcFN0cmVhbSgpLgorICAgIHJldHVybiBzdGFydENsaWVudChtTW1hcENsaWVudCwgJm1Qb3J0SGFuZGxlKTsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OnN0b3BTdHJlYW0oc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBjbGllbnRIYW5kbGUpIHsKKyAgICBtRnJhbWVzVHJhbnNmZXJyZWQucmVzZXQzMigpOworICAgIHJldHVybiBzdG9wQ2xpZW50KG1Qb3J0SGFuZGxlKTsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OnN0YXJ0Q2xpZW50KGNvbnN0IGFuZHJvaWQ6OkF1ZGlvQ2xpZW50JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqY2xpZW50SGFuZGxlKSB7CisgICAgaWYgKG1NbWFwU3RyZWFtID09IG51bGxwdHIpIHJldHVybiBBQVVESU9fRVJST1JfTlVMTDsKKyAgICBBTE9HRCgiQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6c3RhcnRDbGllbnQoJXAodWlkPSVkLCBwaWQ9JWQpKSIsCisgICAgICAgICAgJmNsaWVudCwgY2xpZW50LmNsaWVudFVpZCwgY2xpZW50LmNsaWVudFBpZCk7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBvcmlnaW5hbEhhbmRsZSA9ICAqY2xpZW50SGFuZGxlOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1NbWFwU3RyZWFtLT5zdGFydChjbGllbnQsIGNsaWVudEhhbmRsZSk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1cyk7CisgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OnN0YXJ0Q2xpZW50KCkgLCAlZCA9PiAlZCByZXR1cm5zICVkIiwKKyAgICAgICAgICBvcmlnaW5hbEhhbmRsZSwgKmNsaWVudEhhbmRsZSwgcmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6c3RvcENsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSkgeworICAgIGlmIChtTW1hcFN0cmVhbSA9PSBudWxscHRyKSByZXR1cm4gQUFVRElPX0VSUk9SX05VTEw7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KG1NbWFwU3RyZWFtLT5zdG9wKGNsaWVudEhhbmRsZSkpOworICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpzdG9wQ2xpZW50KCVkKSByZXR1cm5zICVkIiwgY2xpZW50SGFuZGxlLCByZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIEdldCBmcmVlLXJ1bm5pbmcgRFNQIG9yIERNQSBoYXJkd2FyZSBwb3NpdGlvbiBmcm9tIHRoZSBIQUwuCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6Z2V0RnJlZVJ1bm5pbmdQb3NpdGlvbihpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3MpIHsKKyAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiBwb3NpdGlvbjsKKyAgICBpZiAobU1tYXBTdHJlYW0gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX05VTEw7CisgICAgfQorICAgIHN0YXR1c190IHN0YXR1cyA9IG1NbWFwU3RyZWFtLT5nZXRNbWFwUG9zaXRpb24oJnBvc2l0aW9uKTsKKyAgICBBTE9HVigiQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6Z2V0RnJlZVJ1bm5pbmdQb3NpdGlvbigpIHN0YXR1cz0gJWQsIHBvcyA9ICVkLCBuYW5vcyA9ICVsbGRcbiIsCisgICAgICAgICAgc3RhdHVzLCBwb3NpdGlvbi5wb3NpdGlvbl9mcmFtZXMsIChsb25nIGxvbmcpIHBvc2l0aW9uLnRpbWVfbmFub3NlY29uZHMpOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChzdGF0dXMpOworICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFKSB7CisgICAgICAgIEFMT0dXKCJzZW5kQ3VycmVudFRpbWVzdGFtcCgpOiBnZXRNbWFwUG9zaXRpb24oKSBoYXMgbm8gcG9zaXRpb24gZGF0YSBhdmFpbGFibGUiKTsKKyAgICB9IGVsc2UgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgQUxPR0UoInNlbmRDdXJyZW50VGltZXN0YW1wKCk6IGdldE1tYXBQb3NpdGlvbigpIHJldHVybmVkIHN0YXR1cyAlZCIsIHN0YXR1cyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQ29udmVydCAzMi1iaXQgcG9zaXRpb24gdG8gNjQtYml0IHBvc2l0aW9uLgorICAgICAgICBtRnJhbWVzVHJhbnNmZXJyZWQudXBkYXRlMzIocG9zaXRpb24ucG9zaXRpb25fZnJhbWVzKTsKKyAgICAgICAgKnBvc2l0aW9uRnJhbWVzID0gbUZyYW1lc1RyYW5zZmVycmVkLmdldCgpOworICAgICAgICAqdGltZU5hbm9zID0gcG9zaXRpb24udGltZV9uYW5vc2Vjb25kczsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OmdldFRpbWVzdGFtcChpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3MpIHsKKyAgICByZXR1cm4gMDsgLy8gVE9ETworfQorCisKK3ZvaWQgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6b25UZWFyRG93bigpIHsKKyAgICBBTE9HRCgiQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6b25UZWFyRG93bigpIGNhbGxlZCIpOworICAgIGRpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtcygpOworfTsKKwordm9pZCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpvblZvbHVtZUNoYW5nZWQoYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6VmVjdG9yPGZsb2F0PiB2YWx1ZXMpIHsKKyAgICAvLyBUT0RPIGRvIHdlIHJlYWxseSBuZWVkIGEgZGlmZmVyZW50IHZvbHVtZSBmb3IgZWFjaCBjaGFubmVsPworICAgIGZsb2F0IHZvbHVtZSA9IHZhbHVlc1swXTsKKyAgICBBTE9HRCgiQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6b25Wb2x1bWVDaGFuZ2VkKCkgdm9sdW1lWzBdID0gJWYiLCB2b2x1bWUpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrU3RyZWFtcyk7CisgICAgZm9yKGNvbnN0IGF1dG8gc3RyZWFtIDogbVJlZ2lzdGVyZWRTdHJlYW1zKSB7CisgICAgICAgIHN0cmVhbS0+b25Wb2x1bWVDaGFuZ2VkKHZvbHVtZSk7CisgICAgfQorfTsKKwordm9pZCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpvblJvdXRpbmdDaGFuZ2VkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIHsKKyAgICBBTE9HRCgiQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6b25Sb3V0aW5nQ2hhbmdlZCgpIGNhbGxlZCB3aXRoICVkLCBvbGQgPSAlZCIsCisgICAgICAgICAgZGV2aWNlSWQsIGdldERldmljZUlkKCkpOworICAgIGlmIChnZXREZXZpY2VJZCgpICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUgICYmIGdldERldmljZUlkKCkgIT0gZGV2aWNlSWQpIHsKKyAgICAgICAgZGlzY29ubmVjdFJlZ2lzdGVyZWRTdHJlYW1zKCk7CisgICAgfQorICAgIHNldERldmljZUlkKGRldmljZUlkKTsKK307CisKKy8qKgorICogR2V0IGFuIGltbXV0YWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGF0YSBxdWV1ZSBmcm9tIHRoZSBIQUwuCisgKi8KK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpnZXREb3duRGF0YURlc2NyaXB0aW9uKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKQoreworICAgIC8vIEdhdGhlciBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBxdWV1ZSBiYXNlZCBvbiBIQUwgaW5mby4KKyAgICBpbnQzMl90IGJ5dGVzUGVyRnJhbWUgPSBjYWxjdWxhdGVCeXRlc1BlckZyYW1lKCk7CisgICAgaW50MzJfdCBjYXBhY2l0eUluQnl0ZXMgPSBnZXRCdWZmZXJDYXBhY2l0eSgpICogYnl0ZXNQZXJGcmFtZTsKKyAgICBpbnQgZmRJbmRleCA9IHBhcmNlbGFibGUuYWRkRmlsZURlc2NyaXB0b3IobUF1ZGlvRGF0YUZpbGVEZXNjcmlwdG9yLCBjYXBhY2l0eUluQnl0ZXMpOworICAgIHBhcmNlbGFibGUubURvd25EYXRhUXVldWVQYXJjZWxhYmxlLnNldHVwTWVtb3J5KGZkSW5kZXgsIDAsIGNhcGFjaXR5SW5CeXRlcyk7CisgICAgcGFyY2VsYWJsZS5tRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUuc2V0Qnl0ZXNQZXJGcmFtZShieXRlc1BlckZyYW1lKTsKKyAgICBwYXJjZWxhYmxlLm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5zZXRGcmFtZXNQZXJCdXJzdChtRnJhbWVzUGVyQnVyc3QpOworICAgIHBhcmNlbGFibGUubURvd25EYXRhUXVldWVQYXJjZWxhYmxlLnNldENhcGFjaXR5SW5GcmFtZXMoZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CisgICAgcmV0dXJuIEFBVURJT19PSzsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmI2MjY5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5oCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBQVVESU9fU0VSVklDRV9FTkRQT0lOVF9NTUFQX0gKKyNkZWZpbmUgQUFVRElPX1NFUlZJQ0VfRU5EUE9JTlRfTU1BUF9ICisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oIgorI2luY2x1ZGUgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oIgorI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU2VydmljZU1lc3NhZ2UuaCIKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuaCIKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmgiCisjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuaCIKKyNpbmNsdWRlICJBQXVkaW9NaXhlci5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2UuaCIKKworbmFtZXNwYWNlIGFhdWRpbyB7CisKKy8qKgorICogVGhpcyBpcyB1c2VkIGJ5IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQIHRvIGFjY2VzcyB0aGUgTU1BUCBkZXZpY2VzCisgKiB0aHJvdWdoIEF1ZGlvRmxpbmdlci4KKyAqLworY2xhc3MgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUAorICAgICAgICA6IHB1YmxpYyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQKKyAgICAgICAgLCBwdWJsaWMgYW5kcm9pZDo6TW1hcFN0cmVhbUNhbGxiYWNrIHsKKworcHVibGljOgorICAgIEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAoKTsKKworICAgIHZpcnR1YWwgfkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAoKTsKKworICAgIHN0ZDo6c3RyaW5nIGR1bXAoKSBjb25zdCBvdmVycmlkZTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgY2xvc2UoKSBvdmVycmlkZTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBzdGFydFN0cmVhbShhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpjbGllbnRIYW5kbGUpIG92ZXJyaWRlOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IHN0b3BTdHJlYW0oYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSkgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RhcnRDbGllbnQoY29uc3QgYW5kcm9pZDo6QXVkaW9DbGllbnQmIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpjbGllbnRIYW5kbGUpICBvdmVycmlkZTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgY2xpZW50SGFuZGxlKSAgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0RnJlZVJ1bm5pbmdQb3NpdGlvbihpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywgaW50NjRfdCAqdGltZU5hbm9zKSBvdmVycmlkZTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBnZXRUaW1lc3RhbXAoaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgb3ZlcnJpZGU7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLSBDYWxsYmFjayBmdW5jdGlvbnMgZm9yIE1tYXBTdHJlYW1DYWxsYmFjayAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB2b2lkIG9uVGVhckRvd24oKSBvdmVycmlkZTsKKworICAgIHZvaWQgb25Wb2x1bWVDaGFuZ2VkKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OlZlY3RvcjxmbG9hdD4gdmFsdWVzKSBvdmVycmlkZTsKKworICAgIHZvaWQgb25Sb3V0aW5nQ2hhbmdlZChhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSBvdmVycmlkZTsKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGFhdWRpb19yZXN1bHRfdCBnZXREb3duRGF0YURlc2NyaXB0aW9uKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKTsKKworICAgIGludDY0X3QgZ2V0SGFyZHdhcmVUaW1lT2Zmc2V0TmFub3MoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSGFyZHdhcmVUaW1lT2Zmc2V0TmFub3M7CisgICAgfQorCitwcml2YXRlOgorICAgIE1vbm90b25pY0NvdW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNUcmFuc2ZlcnJlZDsKKworICAgIC8vIEludGVyZmFjZSB0byB0aGUgQXVkaW9GbGluZ2VyIE1NQVAgc3VwcG9ydC4KKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpNbWFwU3RyZWFtSW50ZXJmYWNlPiBtTW1hcFN0cmVhbTsKKyAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAgICAgICAgICAgICBtTW1hcEJ1ZmZlcmluZm87CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgICAgICAgICAgICAgICAgICAgbVBvcnRIYW5kbGUgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworCisgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkICAgICAgICAgICAgICAgICAgbUF1ZGlvRGF0YUZpbGVEZXNjcmlwdG9yOworCisgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhhcmR3YXJlVGltZU9mZnNldE5hbm9zID0gMDsgLy8gVE9ETyBnZXQgZnJvbSBIQUwKKworfTsKKworfSAvKiBuYW1lc3BhY2UgYWF1ZGlvICovCisKKyNlbmRpZiAvL0FBVURJT19TRVJWSUNFX0VORFBPSU5UX01NQVBfSAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuY3BwCmluZGV4IGI4M2I5MTguLjliMTgzM2EgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuY3BwCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIExPR19UQUcgIkFBdWRpb1NlcnZpY2UiCisjZGVmaW5lIExPR19UQUcgIkFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaCIKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsgIC8vIFRPRE8ganVzdCBpbXBvcnQgbmFtZXMgbmVlZGVkCiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOyAgIC8vIFRPRE8ganVzdCBpbXBvcnQgbmFtZXMgbmVlZGVkCkBAIC00MSwxMyArNDIsMTQgQEAKIAogQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheTo6QUF1ZGlvU2VydmljZUVuZHBvaW50UGxheShBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UpCiAgICAgICAgIDogbVN0cmVhbUludGVybmFsUGxheShhdWRpb1NlcnZpY2UsIHRydWUpIHsKKyAgICBtU3RyZWFtSW50ZXJuYWwgPSAmbVN0cmVhbUludGVybmFsUGxheTsKIH0KIAogQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheTo6fkFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkoKSB7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5OjpvcGVuKGNvbnN0IEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24pIHsKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU2VydmljZUVuZHBvaW50OjpvcGVuKGNvbmZpZ3VyYXRpb24pOworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXk6Om9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSB7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6b3BlbihyZXF1ZXN0KTsKICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgewogICAgICAgICBtTWl4ZXIuYWxsb2NhdGUoZ2V0U3RyZWFtSW50ZXJuYWwoKS0+Z2V0U2FtcGxlc1BlckZyYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTdHJlYW1JbnRlcm5hbCgpLT5nZXRGcmFtZXNQZXJCdXJzdCgpKTsKQEAgLTY1LDcgKzY3LDYgQEAKIAogLy8gTWl4IGRhdGEgZnJvbSBlYWNoIGFwcGxpY2F0aW9uIHN0cmVhbSBhbmQgd3JpdGUgcmVzdWx0IHRvIHRoZSBzaGFyZWQgTU1BUCBzdHJlYW0uCiB2b2lkICpBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5OjpjYWxsYmFja0xvb3AoKSB7Ci0gICAgaW50MzJfdCB1bmRlcmZsb3dDb3VudCA9IDA7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKICAgICBpbnQ2NF90IHRpbWVvdXROYW5vcyA9IGdldFN0cmVhbUludGVybmFsKCktPmNhbGN1bGF0ZVJlYXNvbmFibGVUaW1lb3V0KCk7CiAKQEAgLTczLDE5ICs3NCw1NCBAQAogICAgIHdoaWxlIChtQ2FsbGJhY2tFbmFibGVkLmxvYWQoKSAmJiBnZXRTdHJlYW1JbnRlcm5hbCgpLT5pc0FjdGl2ZSgpICYmIChyZXN1bHQgPj0gMCkpIHsKICAgICAgICAgLy8gTWl4IGRhdGEgZnJvbSBlYWNoIGFjdGl2ZSBzdHJlYW0uCiAgICAgICAgIG1NaXhlci5jbGVhcigpOwotICAgICAgICB7IC8vIHVzZSBsb2NrIGd1YXJkCisKKyAgICAgICAgeyAvLyBicmFja2V0cyBhcmUgZm9yIGxvY2tfZ3VhcmQKICAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICBpbnQ2NF90IG1tYXBGcmFtZXNXcml0dGVuID0gZ2V0U3RyZWFtSW50ZXJuYWwoKS0+Z2V0RnJhbWVzV3JpdHRlbigpOworCiAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2tTdHJlYW1zKTsKLSAgICAgICAgICAgIGZvciAoc3A8QUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZD4gc2hhcmVkU3RyZWFtIDogbVJlZ2lzdGVyZWRTdHJlYW1zKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNoYXJlZFN0cmVhbS0+aXNSdW5uaW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgRmlmb0J1ZmZlciAqZmlmbyA9IHNoYXJlZFN0cmVhbS0+Z2V0RGF0YUZpZm9CdWZmZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lID0gMS4wOyAvLyB0byBtYXRjaCBsZWdhY3kgdm9sdW1lCi0gICAgICAgICAgICAgICAgICAgIGJvb2wgdW5kZXJmbG93ZWQgPSBtTWl4ZXIubWl4KGluZGV4LCBmaWZvLCB2b2x1bWUpOwotICAgICAgICAgICAgICAgICAgICB1bmRlcmZsb3dDb3VudCArPSB1bmRlcmZsb3dlZCA/IDEgOiAwOwotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIGxvZyB1bmRlcmZsb3dzIGluIGVhY2ggc3RyZWFtCi0gICAgICAgICAgICAgICAgICAgIHNoYXJlZFN0cmVhbS0+bWFya1RyYW5zZmVyVGltZShBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpKTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byBjbGllbnRTdHJlYW0gOiBtUmVnaXN0ZXJlZFN0cmVhbXMpIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGNsaWVudEZyYW1lc1JlYWQgPSAwOworCisgICAgICAgICAgICAgICAgaWYgKCFjbGllbnRTdHJlYW0tPmlzUnVubmluZygpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbmRleCsrOworCisgICAgICAgICAgICAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZD4gc3RyZWFtU2hhcmVkID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQgKj4oY2xpZW50U3RyZWFtLmdldCgpKTsKKworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTG9jayB0aGUgQXVkaW9GaWZvIHRvIHByb3RlY3QgYWdhaW5zdCBjbG9zZS4KKyAgICAgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkIDxzdGQ6Om11dGV4PiBsb2NrKHN0cmVhbVNoYXJlZC0+Z2V0QXVkaW9EYXRhUXVldWVMb2NrKCkpOworCisgICAgICAgICAgICAgICAgICAgIEZpZm9CdWZmZXIgKmZpZm8gPSBzdHJlYW1TaGFyZWQtPmdldEF1ZGlvRGF0YUZpZm9CdWZmZXJfbCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZmlmbyAhPSBudWxscHRyKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIERldGVybWluZSBvZmZzZXQgYmV0d2VlbiBmcmFtZVBvc2l0aW9uIGluIGNsaWVudCdzIHN0cmVhbQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdnMgdGhlIHVuZGVybHlpbmcgTU1BUCBzdHJlYW0uCisgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRGcmFtZXNSZWFkID0gZmlmby0+Z2V0UmVhZENvdW50ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIHR3byBpbmRpY2VzIHJlZmVyIHRvIHRoZSBzYW1lIGZyYW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwb3NpdGlvbk9mZnNldCA9IG1tYXBGcmFtZXNXcml0dGVuIC0gY2xpZW50RnJhbWVzUmVhZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNoYXJlZC0+c2V0VGltZXN0YW1wUG9zaXRpb25PZmZzZXQocG9zaXRpb25PZmZzZXQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUgPSAxLjA7IC8vIHRvIG1hdGNoIGxlZ2FjeSB2b2x1bWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdW5kZXJmbG93ZWQgPSBtTWl4ZXIubWl4KGluZGV4LCBmaWZvLCB2b2x1bWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuZGVyZmxvd2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtU2hhcmVkLT5pbmNyZW1lbnRYUnVuQ291bnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEZyYW1lc1JlYWQgPSBmaWZvLT5nZXRSZWFkQ291bnRlcigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGNsaWVudEZyYW1lc1JlYWQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgdGltZXN0YW1wIHJlcHJlc2VudHMgdGhlIGNvbXBsZXRpb24gb2YgZGF0YSBiZWluZyByZWFkIG91dCBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IGJ1ZmZlci4gSXQgaXMgc2VudCB0byB0aGUgY2xpZW50IGFuZCB1c2VkIGluIHRoZSB0aW1pbmcgbW9kZWwKKyAgICAgICAgICAgICAgICAgICAgLy8gdG8gZGVjaWRlIHdoZW4gdGhlIGNsaWVudCBoYXMgcm9vbSB0byB3cml0ZSBtb3JlIGRhdGEuCisgICAgICAgICAgICAgICAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAoY2xpZW50RnJhbWVzUmVhZCwgQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNoYXJlZC0+bWFya1RyYW5zZmVyVGltZSh0aW1lc3RhbXApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGluZGV4Kys7IC8vIGp1c3QgdXNlZCBmb3IgbGFiZWxsaW5nIHRyYWNrcyBpbiBzeXN0cmFjZQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTkzLDcgKzEyOSw3IEBACiAgICAgICAgIHJlc3VsdCA9IGdldFN0cmVhbUludGVybmFsKCktPndyaXRlKG1NaXhlci5nZXRPdXRwdXRCdWZmZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RnJhbWVzUGVyQnVyc3QoKSwgdGltZW91dE5hbm9zKTsKICAgICAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICBkaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXMoKTsKKyAgICAgICAgICAgIEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6ZGlzY29ubmVjdFJlZ2lzdGVyZWRTdHJlYW1zKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gZ2V0RnJhbWVzUGVyQnVyc3QoKSkgewogICAgICAgICAgICAgQUxPR1coIkFBdWRpb1NlcnZpY2VFbmRwb2ludCgpOiBjYWxsYmFja0xvb3AoKSB3cm90ZSAlZCAvICVkIiwKQEAgLTEwMiw4ICsxMzgsNSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQUxPR1dfSUYoKHVuZGVyZmxvd0NvdW50ID4gMCksCi0gICAgICAgICAgICAgIkFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkoKTogY2FsbGJhY2tMb29wKCkgaGFkICVkIHVuZGVyZmxvd3MiLCB1bmRlcmZsb3dDb3VudCk7Ci0KICAgICByZXR1cm4gTlVMTDsgLy8gVE9ETyByZXZpZXcKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuaAppbmRleCBjMjJmNTEwLi5hMGEzODNjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5oCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaCIKICNpbmNsdWRlICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaCIKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VNZXNzYWdlLmgiCisjaW5jbHVkZSAiQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmgiCiAjaW5jbHVkZSAiQUF1ZGlvTWl4ZXIuaCIKQEAgLTM1LDE2ICszNiwxMiBAQAogLyoqCiAgKiBDb250YWlucyBhIG1peGVyIGFuZCBhIHN0cmVhbSBmb3Igd3JpdGluZyB0aGUgcmVzdWx0IG9mIHRoZSBtaXguCiAgKi8KLWNsYXNzIEFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkgOiBwdWJsaWMgQUF1ZGlvU2VydmljZUVuZHBvaW50IHsKK2NsYXNzIEFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkgOiBwdWJsaWMgQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkIHsKIHB1YmxpYzoKICAgICBleHBsaWNpdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5KGFuZHJvaWQ6OkFBdWRpb1NlcnZpY2UgJmF1ZGlvU2VydmljZSk7CiAgICAgdmlydHVhbCB+QUF1ZGlvU2VydmljZUVuZHBvaW50UGxheSgpOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbikgb3ZlcnJpZGU7Ci0KLSAgICBBdWRpb1N0cmVhbUludGVybmFsICpnZXRTdHJlYW1JbnRlcm5hbCgpIG92ZXJyaWRlIHsKLSAgICAgICAgcmV0dXJuICZtU3RyZWFtSW50ZXJuYWxQbGF5OwotICAgIH0KKyAgICBhYXVkaW9fcmVzdWx0X3Qgb3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpIG92ZXJyaWRlOwogCiAgICAgdm9pZCAqY2FsbGJhY2tMb29wKCkgb3ZlcnJpZGU7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNDAwNjYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuY3BwCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjZGVmaW5lIExPR19UQUcgIkFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU2VydmljZU1lc3NhZ2UuaCIKKyNpbmNsdWRlICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oIgorI2luY2x1ZGUgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oIgorI2luY2x1ZGUgImNvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmgiCisKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuaCIKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmgiCisjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuaCIKKyNpbmNsdWRlICJBQXVkaW9NaXhlci5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2UuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOworCisvLyBUaGlzIGlzIHRoZSBtYXhpbXVtIHNpemUgaW4gZnJhbWVzLiBUaGUgZWZmZWN0aXZlIHNpemUgY2FuIGJlIHR1bmVkIHNtYWxsZXIgYXQgcnVudGltZS4KKyNkZWZpbmUgREVGQVVMVF9CVUZGRVJfQ0FQQUNJVFkgICAoNDggKiA4KQorCitzdGQ6OnN0cmluZyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6OmR1bXAoKSBjb25zdCB7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gcmVzdWx0OworCisgICAgcmVzdWx0IDw8ICIgIFNIQVJFRDogc2hhcmluZyBleGNsdXNpdmUgc3RyZWFtIHdpdGggaGFuZGxlID0gMHgiCisgICAgICAgICAgIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6c2V0dyg4KQorICAgICAgICAgICA8PCBzdGQ6OmhleCA8PCBtU3RyZWFtSW50ZXJuYWwtPmdldFNlcnZpY2VIYW5kbGUoKQorICAgICAgICAgICA8PCBzdGQ6OmRlYyA8PCBzdGQ6OnNldGZpbGwoJyAnKTsKKyAgICByZXN1bHQgPDwgIlxuIjsKKyAgICByZXN1bHQgPDwgIiAgICBSdW5uaW5nIFN0cmVhbSBDb3VudDogIiA8PCBtUnVubmluZ1N0cmVhbUNvdW50IDw8ICJcbiI7CisKKyAgICByZXN1bHQgPDwgQUF1ZGlvU2VydmljZUVuZHBvaW50OjpkdW1wKCk7CisgICAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKK30KKworLy8gU2hhcmUgYW4gQXVkaW9TdHJlYW1JbnRlcm5hbC4KK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6Om9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSB7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKKyAgICBjb25zdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uID0gcmVxdWVzdC5nZXRDb25zdGFudENvbmZpZ3VyYXRpb24oKTsKKworICAgIG1SZXF1ZXN0ZWREZXZpY2VJZCA9IGNvbmZpZ3VyYXRpb24uZ2V0RGV2aWNlSWQoKTsKKyAgICBzZXREaXJlY3Rpb24oY29uZmlndXJhdGlvbi5nZXREaXJlY3Rpb24oKSk7CisKKyAgICBBdWRpb1N0cmVhbUJ1aWxkZXIgYnVpbGRlcjsKKyAgICBidWlsZGVyLnNldFNoYXJpbmdNb2RlKEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFKTsKKyAgICAvLyBEb24ndCBmYWxsIGJhY2sgdG8gU0hBUkVEIGJlY2F1c2UgdGhhdCB3b3VsZCBjYXVzZSByZWN1cnNpb24uCisgICAgYnVpbGRlci5zZXRTaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQodHJ1ZSk7CisgICAgYnVpbGRlci5zZXREZXZpY2VJZChtUmVxdWVzdGVkRGV2aWNlSWQpOworICAgIGJ1aWxkZXIuc2V0Rm9ybWF0KGNvbmZpZ3VyYXRpb24uZ2V0Rm9ybWF0KCkpOworICAgIGJ1aWxkZXIuc2V0U2FtcGxlUmF0ZShjb25maWd1cmF0aW9uLmdldFNhbXBsZVJhdGUoKSk7CisgICAgYnVpbGRlci5zZXRTYW1wbGVzUGVyRnJhbWUoY29uZmlndXJhdGlvbi5nZXRTYW1wbGVzUGVyRnJhbWUoKSk7CisgICAgYnVpbGRlci5zZXREaXJlY3Rpb24oY29uZmlndXJhdGlvbi5nZXREaXJlY3Rpb24oKSk7CisgICAgYnVpbGRlci5zZXRCdWZmZXJDYXBhY2l0eShERUZBVUxUX0JVRkZFUl9DQVBBQ0lUWSk7CisKKyAgICByZXN1bHQgPSBtU3RyZWFtSW50ZXJuYWwtPm9wZW4oYnVpbGRlcik7CisKKyAgICBzZXRTYW1wbGVSYXRlKG1TdHJlYW1JbnRlcm5hbC0+Z2V0U2FtcGxlUmF0ZSgpKTsKKyAgICBzZXRTYW1wbGVzUGVyRnJhbWUobVN0cmVhbUludGVybmFsLT5nZXRTYW1wbGVzUGVyRnJhbWUoKSk7CisgICAgc2V0RGV2aWNlSWQobVN0cmVhbUludGVybmFsLT5nZXREZXZpY2VJZCgpKTsKKyAgICBtRnJhbWVzUGVyQnVyc3QgPSBtU3RyZWFtSW50ZXJuYWwtPmdldEZyYW1lc1BlckJ1cnN0KCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkOjpjbG9zZSgpIHsKKyAgICByZXR1cm4gZ2V0U3RyZWFtSW50ZXJuYWwoKS0+Y2xvc2UoKTsKK30KKworLy8gR2x1ZSBiZXR3ZWVuIEMgYW5kIEMrKyBjYWxsYmFja3MuCitzdGF0aWMgdm9pZCAqYWF1ZGlvX2VuZHBvaW50X3RocmVhZF9wcm9jKHZvaWQgKmNvbnRleHQpIHsKKyAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQgKmVuZHBvaW50ID0gKEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZCAqKSBjb250ZXh0OworICAgIGlmIChlbmRwb2ludCAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBlbmRwb2ludC0+Y2FsbGJhY2tMb29wKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorfQorCithYXVkaW9fcmVzdWx0X3QgYWF1ZGlvOjpBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6OnN0YXJ0U2hhcmluZ1RocmVhZF9sKCkgeworICAgIC8vIExhdW5jaCB0aGUgY2FsbGJhY2sgbG9vcCB0aHJlYWQuCisgICAgaW50NjRfdCBwZXJpb2ROYW5vcyA9IGdldFN0cmVhbUludGVybmFsKCktPmdldEZyYW1lc1BlckJ1cnN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBQVVESU9fTkFOT1NfUEVSX1NFQ09ORAorICAgICAgICAgICAgICAgICAgICAgICAgICAvIGdldFNhbXBsZVJhdGUoKTsKKyAgICBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKHRydWUpOworICAgIHJldHVybiBnZXRTdHJlYW1JbnRlcm5hbCgpLT5jcmVhdGVUaHJlYWQocGVyaW9kTmFub3MsIGFhdWRpb19lbmRwb2ludF90aHJlYWRfcHJvYywgdGhpcyk7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBhYXVkaW86OkFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6c3RvcFNoYXJpbmdUaHJlYWQoKSB7CisgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGdldFN0cmVhbUludGVybmFsKCktPmpvaW5UaHJlYWQoTlVMTCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6c3RhcnRTdHJlYW0oc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNoYXJlZFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSkgeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CisKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrU3RyZWFtcyk7CisgICAgICAgIGlmICgrK21SdW5uaW5nU3RyZWFtQ291bnQgPT0gMSkgeyAvLyBhdG9taWMKKyAgICAgICAgICAgIHJlc3VsdCA9IGdldFN0cmVhbUludGVybmFsKCktPnJlcXVlc3RTdGFydCgpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgICAgICAtLW1SdW5uaW5nU3RyZWFtQ291bnQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHN0YXJ0U2hhcmluZ1RocmVhZF9sKCk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0U3RyZWFtSW50ZXJuYWwoKS0+cmVxdWVzdFN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgLS1tUnVubmluZ1N0cmVhbUNvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgIHJlc3VsdCA9IGdldFN0cmVhbUludGVybmFsKCktPnN0YXJ0Q2xpZW50KHNoYXJlZFN0cmVhbS0+Z2V0QXVkaW9DbGllbnQoKSwgY2xpZW50SGFuZGxlKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIGlmICgtLW1SdW5uaW5nU3RyZWFtQ291bnQgPT0gMCkgeyAvLyBhdG9taWMKKyAgICAgICAgICAgICAgICBzdG9wU2hhcmluZ1RocmVhZCgpOworICAgICAgICAgICAgICAgIGdldFN0cmVhbUludGVybmFsKCktPnJlcXVlc3RTdG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkOjpzdG9wU3RyZWFtKHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzaGFyZWRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgY2xpZW50SGFuZGxlKSB7CisgICAgLy8gRG9uJ3QgbG9jayBoZXJlIGJlY2F1c2UgdGhlIGRpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtcyBhbHNvIHVzZXMgdGhlIGxvY2suCisKKyAgICAvLyBJZ25vcmUgcmVzdWx0LgorICAgICh2b2lkKSBnZXRTdHJlYW1JbnRlcm5hbCgpLT5zdG9wQ2xpZW50KGNsaWVudEhhbmRsZSk7CisKKyAgICBpZiAoLS1tUnVubmluZ1N0cmVhbUNvdW50ID09IDApIHsgLy8gYXRvbWljCisgICAgICAgIHN0b3BTaGFyaW5nVGhyZWFkKCk7CisgICAgICAgIGdldFN0cmVhbUludGVybmFsKCktPnJlcXVlc3RTdG9wKCk7CisgICAgfQorICAgIHJldHVybiBBQVVESU9fT0s7Cit9CisKKy8vIEdldCB0aW1lc3RhbXAgdGhhdCB3YXMgd3JpdHRlbiBieSB0aGUgcmVhbC10aW1lIHNlcnZpY2UgdGhyZWFkLCBlZy4gbWl4ZXIuCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkOjpnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKSB7CisgICAgaWYgKG1BdG9taWNUaW1lc3RhbXAuaXNWYWxpZCgpKSB7CisgICAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAgPSBtQXRvbWljVGltZXN0YW1wLnJlYWQoKTsKKyAgICAgICAgKnBvc2l0aW9uRnJhbWVzID0gdGltZXN0YW1wLmdldFBvc2l0aW9uKCk7CisgICAgICAgICp0aW1lTmFub3MgPSB0aW1lc3RhbXAuZ2V0TmFub3NlY29uZHMoKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOworICAgIH0KK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6Z2V0VGltZXN0YW1wKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vcykgeworICAgIHJldHVybiBtU3RyZWFtSW50ZXJuYWwtPmdldFRpbWVzdGFtcChDTE9DS19NT05PVE9OSUMsIHBvc2l0aW9uRnJhbWVzLCB0aW1lTmFub3MpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2JkMmMxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmgKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQUFVRElPX1NFUlZJQ0VfRU5EUE9JTlRfU0hBUkVEX0gKKyNkZWZpbmUgQUFVRElPX1NFUlZJQ0VfRU5EUE9JTlRfU0hBUkVEX0gKKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VFbmRwb2ludC5oIgorI2luY2x1ZGUgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgiCisjaW5jbHVkZSAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmgiCisjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmgiCisjaW5jbHVkZSAiQUF1ZGlvU2VydmljZS5oIgorCituYW1lc3BhY2UgYWF1ZGlvIHsKKworLyoqCisgKiBUaGlzIFNlcnZpY2UgY2xhc3MgY29ycmVzcG9uZHMgdG8gYSBDbGllbnQgc3RyZWFtIHRoYXQgc2hhcmVzIGFuIE1NQVAgZGV2aWNlIHRocm91Z2ggYSBtaXhlcgorICogb3IgYW4gaW5wdXQgZGlzdHJpYnV0b3IuCisgKi8KK2NsYXNzIEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZCA6IHB1YmxpYyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQgeworCitwdWJsaWM6CisKKyAgICBzdGQ6OnN0cmluZyBkdW1wKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgb3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpIG92ZXJyaWRlOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlKCkgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RhcnRTdHJlYW0oYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqY2xpZW50SGFuZGxlKSBvdmVycmlkZTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wU3RyZWFtKGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBjbGllbnRIYW5kbGUpIG92ZXJyaWRlOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IGdldEZyZWVSdW5uaW5nUG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0VGltZXN0YW1wKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgKmNhbGxiYWNrTG9vcCgpID0gMDsKKworICAgIEF1ZGlvU3RyZWFtSW50ZXJuYWwgKmdldFN0cmVhbUludGVybmFsKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVN0cmVhbUludGVybmFsOworICAgIH07CisKK3Byb3RlY3RlZDoKKworICAgIGFhdWRpb19yZXN1bHRfdCAgICAgICAgICBzdGFydFNoYXJpbmdUaHJlYWRfbCgpOworCisgICAgYWF1ZGlvX3Jlc3VsdF90ICAgICAgICAgIHN0b3BTaGFyaW5nVGhyZWFkKCk7CisKKyAgICAvLyBwb2ludGVyIHRvIG9iamVjdCBzdGF0aWNhbGx5IGFsbG9jYXRlZCBpbiBzdWJjbGFzc2VzCisgICAgQXVkaW9TdHJlYW1JbnRlcm5hbCAgICAgKm1TdHJlYW1JbnRlcm5hbCA9IG51bGxwdHI7CisKKyAgICBzdGQ6OmF0b21pYzxib29sPiAgICAgICAgbUNhbGxiYWNrRW5hYmxlZHtmYWxzZX07CisKKyAgICBzdGQ6OmF0b21pYzxpbnQ+ICAgICAgICAgbVJ1bm5pbmdTdHJlYW1Db3VudHswfTsKK307CisKK30KKworI2VuZGlmIC8vQUFVRElPX1NFUlZJQ0VfRU5EUE9JTlRfU0hBUkVEX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmNwcAppbmRleCA1ZjdkMTc5Li5lNjcwMTI5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwCkBAIC0xOCwxMiArMTgsMTcgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8bXV0ZXg+CiAKICNpbmNsdWRlICJiaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmgiCiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TZXJ2aWNlTWVzc2FnZS5oIgogI2luY2x1ZGUgInV0aWxpdHkvQXVkaW9DbG9jay5oIgogCisjaW5jbHVkZSAiQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmgiCisjaW5jbHVkZSAiQUF1ZGlvU2VydmljZS5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VFbmRwb2ludC5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgiCiAjaW5jbHVkZSAiVGltZXN0YW1wU2NoZWR1bGVyLmgiCiAKQEAgLTM1LDkgKzQwLDExIEBACiAgKiBAcmV0dXJuCiAgKi8KIAotQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlKCkKK0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZShBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UpCiAgICAgICAgIDogbVVwTWVzc2FnZVF1ZXVlKG51bGxwdHIpCi0gICAgICAgICwgbUFBdWRpb1RocmVhZCgpIHsKKyAgICAgICAgLCBtVGltZXN0YW1wVGhyZWFkKCkKKyAgICAgICAgLCBtQXRvbWljVGltZXN0YW1wKCkKKyAgICAgICAgLCBtQXVkaW9TZXJ2aWNlKGF1ZGlvU2VydmljZSkgewogICAgIG1NbWFwQ2xpZW50LmNsaWVudFVpZCA9IC0xOwogICAgIG1NbWFwQ2xpZW50LmNsaWVudFBpZCA9IC0xOwogICAgIG1NbWFwQ2xpZW50LnBhY2thZ2VOYW1lID0gU3RyaW5nMTYoIiIpOwpAQCAtNDcsNjEgKzU0LDE0MyBAQAogICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6fkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlKCkgZGVzdHJveWluZyAlcCIsIHRoaXMpOwogICAgIC8vIElmIHRoZSBzdHJlYW0gaXMgZGVsZXRlZCB3aGVuIE9QRU4gb3IgaW4gdXNlIHRoZW4gYXVkaW8gcmVzb3VyY2VzIHdpbGwgbGVhay4KICAgICAvLyBUaGlzIHdvdWxkIGluZGljYXRlIGFuIGludGVybmFsIGVycm9yLiBTbyB3ZSB3YW50IHRvIGZpbmQgdGhpcyBBU0FQLgotICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIShtU3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1TdGF0ZSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOSU5JVElBTElaRUQKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1TdGF0ZSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCksCi0gICAgICAgICAgICAgICAgICAgICAgICAic2VydmljZSBzdHJlYW0gc3RpbGwgb3Blbiwgc3RhdGUgPSAlZCIsIG1TdGF0ZSk7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRighKGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9VTklOSVRJQUxJWkVECisgICAgICAgICAgICAgICAgICAgICAgICB8fCBnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzZXJ2aWNlIHN0cmVhbSBzdGlsbCBvcGVuLCBzdGF0ZSA9ICVkIiwgZ2V0U3RhdGUoKSk7Cit9CisKK3N0ZDo6c3RyaW5nIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpkdW1wSGVhZGVyKCkgeworICAgIHJldHVybiBzdGQ6OnN0cmluZygiICAgIFQgICBIYW5kbGUgICBVSWQgUnVuIFN0YXRlIEZvcm1hdCBCdXJzdCBDaGFuIENhcGFjaXR5Iik7CiB9CiAKIHN0ZDo6c3RyaW5nIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpkdW1wKCkgY29uc3QgewogICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHJlc3VsdDsKIAotICAgIHJlc3VsdCA8PCAiICAgICAgLS0tLS0tLS0gaGFuZGxlID0gMHgiIDw8IHN0ZDo6aGV4IDw8IG1IYW5kbGUgPDwgc3RkOjpkZWMgPDwgIlxuIjsKLSAgICByZXN1bHQgPDwgIiAgICAgIHN0YXRlICAgICAgICAgID0gIiA8PCBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KG1TdGF0ZSkgPDwgIlxuIjsKLSAgICByZXN1bHQgPDwgIiAgICAgIGZvcm1hdCAgICAgICAgID0gIiA8PCBtQXVkaW9Gb3JtYXQgPDwgIlxuIjsKLSAgICByZXN1bHQgPDwgIiAgICAgIGZyYW1lc1BlckJ1cnN0ID0gIiA8PCBtRnJhbWVzUGVyQnVyc3QgPDwgIlxuIjsKLSAgICByZXN1bHQgPDwgIiAgICAgIGNoYW5uZWxDb3VudCAgID0gIiA8PCBtU2FtcGxlc1BlckZyYW1lIDw8ICJcbiI7Ci0gICAgcmVzdWx0IDw8ICIgICAgICBjYXBhY2l0eUZyYW1lcyA9ICIgPDwgbUNhcGFjaXR5SW5GcmFtZXMgPDwgIlxuIjsKLSAgICByZXN1bHQgPDwgIiAgICAgIG93bmVyIHVpZCAgICAgID0gIiA8PCBtTW1hcENsaWVudC5jbGllbnRVaWQgPDwgIlxuIjsKKyAgICByZXN1bHQgPDwgIiAgICAweCIgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KDgpIDw8IHN0ZDo6aGV4IDw8IG1IYW5kbGUKKyAgICAgICAgICAgPDwgc3RkOjpkZWMgPDwgc3RkOjpzZXRmaWxsKCcgJykgOworICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoNikgPDwgbU1tYXBDbGllbnQuY2xpZW50VWlkOworICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoNCkgPDwgKGlzUnVubmluZygpID8gInllcyIgOiAiIG5vIik7CisgICAgcmVzdWx0IDw8IHN0ZDo6c2V0dyg2KSA8PCBnZXRTdGF0ZSgpOworICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoNykgPDwgZ2V0Rm9ybWF0KCk7CisgICAgcmVzdWx0IDw8IHN0ZDo6c2V0dyg2KSA8PCBtRnJhbWVzUGVyQnVyc3Q7CisgICAgcmVzdWx0IDw8IHN0ZDo6c2V0dyg1KSA8PCBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICByZXN1bHQgPDwgc3RkOjpzZXR3KDkpIDw8IGdldEJ1ZmZlckNhcGFjaXR5KCk7CiAKICAgICByZXR1cm4gcmVzdWx0LnN0cigpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvOjpBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uT3V0cHV0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlKSB7CisgICAgQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyICZtRW5kcG9pbnRNYW5hZ2VyID0gQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAKICAgICBtTW1hcENsaWVudC5jbGllbnRVaWQgPSByZXF1ZXN0LmdldFVzZXJJZCgpOwogICAgIG1NbWFwQ2xpZW50LmNsaWVudFBpZCA9IHJlcXVlc3QuZ2V0UHJvY2Vzc0lkKCk7Ci0gICAgbU1tYXBDbGllbnQucGFja2FnZU5hbWUuc2V0VG8oU3RyaW5nMTYoIiIpKTsgLy8gRklYTUUgd2hhdCBzaG91bGQgd2UgZG8gaGVyZT8KKyAgICBtTW1hcENsaWVudC5wYWNrYWdlTmFtZS5zZXRUbyhTdHJpbmcxNigiIikpOyAvLyBUT0RPIFdoYXQgc2hvdWxkIHdlIGRvIGhlcmU/CiAKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9ja1VwTWVzc2FnZVF1ZXVlKTsKLSAgICBpZiAobVVwTWVzc2FnZVF1ZXVlICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwotICAgIH0gZWxzZSB7CisgICAgLy8gTGltaXQgc2NvcGUgb2YgbG9jayB0byBhdm9pZCByZWN1cnNpdmUgbG9jayBpbiBjbG9zZSgpLgorICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVwTWVzc2FnZVF1ZXVlTG9jayk7CisgICAgICAgIGlmIChtVXBNZXNzYWdlUXVldWUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKCkgY2FsbGVkIHR3aWNlIik7CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgICAgIH0KKwogICAgICAgICBtVXBNZXNzYWdlUXVldWUgPSBuZXcgU2hhcmVkUmluZ0J1ZmZlcigpOwotICAgICAgICByZXR1cm4gbVVwTWVzc2FnZVF1ZXVlLT5hbGxvY2F0ZShzaXplb2YoQUF1ZGlvU2VydmljZU1lc3NhZ2UpLCBRVUVVRV9VUF9DQVBBQ0lUWV9DT01NQU5EUyk7CisgICAgICAgIHJlc3VsdCA9IG1VcE1lc3NhZ2VRdWV1ZS0+YWxsb2NhdGUoc2l6ZW9mKEFBdWRpb1NlcnZpY2VNZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVVRV9VUF9DQVBBQ0lUWV9DT01NQU5EUyk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisKKyAgICAgICAgbVNlcnZpY2VFbmRwb2ludCA9IG1FbmRwb2ludE1hbmFnZXIub3BlbkVuZHBvaW50KG1BdWRpb1NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmluZ01vZGUpOworICAgICAgICBpZiAobVNlcnZpY2VFbmRwb2ludCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om9wZW4oKSBvcGVuRW5kcG9pbnQoKSBmYWlsZWQiKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgbUZyYW1lc1BlckJ1cnN0ID0gbVNlcnZpY2VFbmRwb2ludC0+Z2V0RnJhbWVzUGVyQnVyc3QoKTsKKyAgICAgICAgY29weUZyb20oKm1TZXJ2aWNlRW5kcG9pbnQpOwogICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworCitlcnJvcjoKKyAgICBjbG9zZSgpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6Y2xvc2UoKSB7Ci0gICAgaWYgKG1TdGF0ZSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRCkgeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CisgICAgaWYgKGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQpIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKKyAgICB9CisKKyAgICBzdG9wKCk7CisKKyAgICBpZiAobVNlcnZpY2VFbmRwb2ludCA9PSBudWxscHRyKSB7CisgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgIH0gZWxzZSB7CisgICAgICAgIG1TZXJ2aWNlRW5kcG9pbnQtPnVucmVnaXN0ZXJTdHJlYW0odGhpcyk7CisgICAgICAgIEFBdWRpb0VuZHBvaW50TWFuYWdlciAmbUVuZHBvaW50TWFuYWdlciA9IEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICAgICAgbUVuZHBvaW50TWFuYWdlci5jbG9zZUVuZHBvaW50KG1TZXJ2aWNlRW5kcG9pbnQpOworICAgICAgICBtU2VydmljZUVuZHBvaW50LmNsZWFyKCk7CisgICAgfQorCisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXBNZXNzYWdlUXVldWVMb2NrKTsKICAgICAgICAgc3RvcFRpbWVzdGFtcFRocmVhZCgpOwotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9ja1VwTWVzc2FnZVF1ZXVlKTsKICAgICAgICAgZGVsZXRlIG1VcE1lc3NhZ2VRdWV1ZTsKICAgICAgICAgbVVwTWVzc2FnZVF1ZXVlID0gbnVsbHB0cjsKLSAgICAgICAgbVN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQ7CiAgICAgfQotICAgIHJldHVybiBBQVVESU9fT0s7CisKKyAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpzdGFydERldmljZSgpIHsKKyAgICBtQ2xpZW50SGFuZGxlID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICByZXR1cm4gbVNlcnZpY2VFbmRwb2ludC0+c3RhcnRTdHJlYW0odGhpcywgJm1DbGllbnRIYW5kbGUpOworfQorCisvKioKKyAqIFN0YXJ0IHRoZSBmbG93IG9mIGF1ZGlvIGRhdGEuCisgKgorICogQW4gQUFVRElPX1NFUlZJQ0VfRVZFTlRfU1RBUlRFRCB3aWxsIGJlIHNlbnQgdG8gdGhlIGNsaWVudCB3aGVuIGNvbXBsZXRlLgorICovCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnN0YXJ0KCkgeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAgICAgaWYgKGlzUnVubmluZygpKSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CiAgICAgfQorCisgICAgaWYgKG1TZXJ2aWNlRW5kcG9pbnQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnN0YXJ0KCkgbWlzc2luZyBlbmRwb2ludCIpOworICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvLyBTdGFydCB3aXRoIGZyZXNoIHByZXNlbnRhdGlvbiB0aW1lc3RhbXBzLgorICAgIG1BdG9taWNUaW1lc3RhbXAuY2xlYXIoKTsKKworICAgIG1DbGllbnRIYW5kbGUgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIHJlc3VsdCA9IHN0YXJ0RGV2aWNlKCk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIGdvdG8gZXJyb3I7CisKKyAgICAvLyBUaGlzIHNob3VsZCBoYXBwZW4gYXQgdGhlIGVuZCBvZiB0aGUgc3RhcnQuCiAgICAgc2VuZFNlcnZpY2VFdmVudChBQVVESU9fU0VSVklDRV9FVkVOVF9TVEFSVEVEKTsKLSAgICBtU3RhdGUgPSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQ7CisgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEKTsKICAgICBtVGhyZWFkRW5hYmxlZC5zdG9yZSh0cnVlKTsKLSAgICByZXR1cm4gbUFBdWRpb1RocmVhZC5zdGFydCh0aGlzKTsKKyAgICByZXN1bHQgPSBtVGltZXN0YW1wVGhyZWFkLnN0YXJ0KHRoaXMpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSBnb3RvIGVycm9yOworCisgICAgcmV0dXJuIHJlc3VsdDsKKworZXJyb3I6CisgICAgZGlzY29ubmVjdCgpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6cGF1c2UoKSB7CkBAIC0xMDksMTUgKzE5OCwyNSBAQAogICAgIGlmICghaXNSdW5uaW5nKCkpIHsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CisgICAgaWYgKG1TZXJ2aWNlRW5kcG9pbnQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6cGF1c2UoKSBtaXNzaW5nIGVuZHBvaW50Iik7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKKyAgICB9CisgICAgcmVzdWx0ID0gbVNlcnZpY2VFbmRwb2ludC0+c3RvcFN0cmVhbSh0aGlzLCBtQ2xpZW50SGFuZGxlKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6cGF1c2UoKSBtU2VydmljZUVuZHBvaW50IHJldHVybmVkICVkIiwgcmVzdWx0KTsKKyAgICAgICAgZGlzY29ubmVjdCgpOyAvLyBUT0RPIHNob3VsZCB3ZSByZXR1cm4gb3IgcGF1c2UgQmFzZSBmaXJzdD8KKyAgICB9CisKICAgICBzZW5kQ3VycmVudFRpbWVzdGFtcCgpOwogICAgIG1UaHJlYWRFbmFibGVkLnN0b3JlKGZhbHNlKTsKLSAgICByZXN1bHQgPSBtQUF1ZGlvVGhyZWFkLnN0b3AoKTsKKyAgICByZXN1bHQgPSBtVGltZXN0YW1wVGhyZWFkLnN0b3AoKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICBkaXNjb25uZWN0KCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogICAgIHNlbmRTZXJ2aWNlRXZlbnQoQUFVRElPX1NFUlZJQ0VfRVZFTlRfUEFVU0VEKTsKLSAgICBtU3RhdGUgPSBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNFRDsKKyAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNFRCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMTI2LDE1ICsyMjUsMjkgQEAKICAgICBpZiAoIWlzUnVubmluZygpKSB7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQotICAgIC8vIFRPRE8gd2FpdCBmb3IgZGF0YSB0byBiZSBwbGF5ZWQgb3V0CisKKyAgICBpZiAobVNlcnZpY2VFbmRwb2ludCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpzdG9wKCkgbWlzc2luZyBlbmRwb2ludCIpOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgfQorCiAgICAgc2VuZEN1cnJlbnRUaW1lc3RhbXAoKTsgLy8gd2FybmluZyAtIHRoaXMgY2FsbHMgYSB2aXJ0dWFsIGZ1bmN0aW9uCiAgICAgcmVzdWx0ID0gc3RvcFRpbWVzdGFtcFRocmVhZCgpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgIGRpc2Nvbm5lY3QoKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CisKKyAgICAvLyBUT0RPIHdhaXQgZm9yIGRhdGEgdG8gYmUgcGxheWVkIG91dAorICAgIHJlc3VsdCA9IG1TZXJ2aWNlRW5kcG9pbnQtPnN0b3BTdHJlYW0odGhpcywgbUNsaWVudEhhbmRsZSk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OnN0b3AoKSBtU2VydmljZUVuZHBvaW50IHJldHVybmVkICVkIiwgcmVzdWx0KTsKKyAgICAgICAgZGlzY29ubmVjdCgpOworICAgICAgICAvLyBUT0RPIHdoYXQgdG8gZG8gd2l0aCByZXN1bHQgaGVyZT8KKyAgICB9CisKICAgICBzZW5kU2VydmljZUV2ZW50KEFBVURJT19TRVJWSUNFX0VWRU5UX1NUT1BQRUQpOwotICAgIG1TdGF0ZSA9IEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBFRDsKKyAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQRUQpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTE0MiwxNCArMjU1LDIwIEBACiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKICAgICAvLyBjbGVhciBmbGFnIHRoYXQgdGVsbHMgdGhyZWFkIHRvIGxvb3AKICAgICBpZiAobVRocmVhZEVuYWJsZWQuZXhjaGFuZ2UoZmFsc2UpKSB7Ci0gICAgICAgIHJlc3VsdCA9IG1BQXVkaW9UaHJlYWQuc3RvcCgpOworICAgICAgICByZXN1bHQgPSBtVGltZXN0YW1wVGhyZWFkLnN0b3AoKTsKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpmbHVzaCgpIHsKKyAgICBpZiAoZ2V0U3RhdGUoKSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNFRCkgeworICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmZsdXNoKCkgc3RyZWFtIG5vdCBwYXVzZWQsIHN0YXRlID0gJXMiLAorICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KG1TdGF0ZSkpOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgfQorICAgIC8vIERhdGEgd2lsbCBnZXQgZmx1c2hlZCB3aGVuIHRoZSBjbGllbnQgcmVjZWl2ZXMgdGhlIEZMVVNIRUQgZXZlbnQuCiAgICAgc2VuZFNlcnZpY2VFdmVudChBQVVESU9fU0VSVklDRV9FVkVOVF9GTFVTSEVEKTsKLSAgICBtU3RhdGUgPSBBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNIRUQ7CisgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9GTFVTSEVEKTsKICAgICByZXR1cm4gQUFVRElPX09LOwogfQogCkBAIC0xNTcsNyArMjc2LDcgQEAKIHZvaWQgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnJ1bigpIHsKICAgICBBTE9HRCgiQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnJ1bigpIGVudGVyaW5nIC0tLS0tLS0tLS0tLS0tLS0iKTsKICAgICBUaW1lc3RhbXBTY2hlZHVsZXIgdGltZXN0YW1wU2NoZWR1bGVyOwotICAgIHRpbWVzdGFtcFNjaGVkdWxlci5zZXRCdXJzdFBlcmlvZChtRnJhbWVzUGVyQnVyc3QsIG1TYW1wbGVSYXRlKTsKKyAgICB0aW1lc3RhbXBTY2hlZHVsZXIuc2V0QnVyc3RQZXJpb2QobUZyYW1lc1BlckJ1cnN0LCBnZXRTYW1wbGVSYXRlKCkpOwogICAgIHRpbWVzdGFtcFNjaGVkdWxlci5zdGFydChBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpKTsKICAgICBpbnQ2NF90IG5leHRUaW1lID0gdGltZXN0YW1wU2NoZWR1bGVyLm5leHRBYnNvbHV0ZVRpbWUoKTsKICAgICB3aGlsZShtVGhyZWFkRW5hYmxlZC5sb2FkKCkpIHsKQEAgLTE3Nyw5ICsyOTYsOSBAQAogfQogCiB2b2lkIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpkaXNjb25uZWN0KCkgewotICAgIGlmIChtU3RhdGUgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICBpZiAoZ2V0U3RhdGUoKSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCkgewogICAgICAgICBzZW5kU2VydmljZUV2ZW50KEFBVURJT19TRVJWSUNFX0VWRU5UX0RJU0NPTk5FQ1RFRCk7Ci0gICAgICAgIG1TdGF0ZSA9IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEOworICAgICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCk7CiAgICAgfQogfQogCkBAIC0xOTUsNyArMzE0LDcgQEAKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjp3cml0ZVVwTWVzc2FnZVF1ZXVlKEFBdWRpb1NlcnZpY2VNZXNzYWdlICpjb21tYW5kKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2tVcE1lc3NhZ2VRdWV1ZSk7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVwTWVzc2FnZVF1ZXVlTG9jayk7CiAgICAgaWYgKG1VcE1lc3NhZ2VRdWV1ZSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJ3cml0ZVVwTWVzc2FnZVF1ZXVlKCk6IG1VcE1lc3NhZ2VRdWV1ZSBudWxsISAtIHN0cmVhbSBub3Qgb3BlbiIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX05VTEw7CkBAIC0yMTEsMTUgKzMzMCwzMSBAQAogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnNlbmRDdXJyZW50VGltZXN0YW1wKCkgewogICAgIEFBdWRpb1NlcnZpY2VNZXNzYWdlIGNvbW1hbmQ7CisgICAgLy8gU2VuZCBhIHRpbWVzdGFtcCBmb3IgdGhlIGNsb2NrIG1vZGVsLgogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKCZjb21tYW5kLnRpbWVzdGFtcC5wb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tbWFuZC50aW1lc3RhbXAudGltZXN0YW1wKTsKICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgewotICAgIC8vICAgIEFMT0dEKCJzZW5kQ3VycmVudFRpbWVzdGFtcCgpOiBwb3NpdGlvbiA9ICVsbGQsIG5hbm9zID0gJWxsZCIsCi0gICAgLy8gICAgICAgICAgKGxvbmcgbG9uZykgY29tbWFuZC50aW1lc3RhbXAucG9zaXRpb24sCi0gICAgLy8gICAgICAgICAgKGxvbmcgbG9uZykgY29tbWFuZC50aW1lc3RhbXAudGltZXN0YW1wKTsKLSAgICAgICAgY29tbWFuZC53aGF0ID0gQUF1ZGlvU2VydmljZU1lc3NhZ2U6OmNvZGU6OlRJTUVTVEFNUDsKKyAgICAgICAgQUxPR1YoInNlbmRDdXJyZW50VGltZXN0YW1wKCkgU0VSVklDRSAgJThsbGQgYXQgJWxsZCIsCisgICAgICAgICAgICAgIChsb25nIGxvbmcpIGNvbW1hbmQudGltZXN0YW1wLnBvc2l0aW9uLAorICAgICAgICAgICAgICAobG9uZyBsb25nKSBjb21tYW5kLnRpbWVzdGFtcC50aW1lc3RhbXApOworICAgICAgICBjb21tYW5kLndoYXQgPSBBQXVkaW9TZXJ2aWNlTWVzc2FnZTo6Y29kZTo6VElNRVNUQU1QX1NFUlZJQ0U7CiAgICAgICAgIHJlc3VsdCA9IHdyaXRlVXBNZXNzYWdlUXVldWUoJmNvbW1hbmQpOwotICAgIH0gZWxzZSBpZiAocmVzdWx0ID09IEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSkgeworCisgICAgICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICAvLyBTZW5kIGEgaGFyZHdhcmUgdGltZXN0YW1wIGZvciBwcmVzZW50YXRpb24gdGltZS4KKyAgICAgICAgICAgIHJlc3VsdCA9IGdldEhhcmR3YXJlVGltZXN0YW1wKCZjb21tYW5kLnRpbWVzdGFtcC5wb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21tYW5kLnRpbWVzdGFtcC50aW1lc3RhbXApOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HVigic2VuZEN1cnJlbnRUaW1lc3RhbXAoKSBIQVJEV0FSRSAlOGxsZCBhdCAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBjb21tYW5kLnRpbWVzdGFtcC5wb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBjb21tYW5kLnRpbWVzdGFtcC50aW1lc3RhbXApOworICAgICAgICAgICAgICAgIGNvbW1hbmQud2hhdCA9IEFBdWRpb1NlcnZpY2VNZXNzYWdlOjpjb2RlOjpUSU1FU1RBTVBfSEFSRFdBUkU7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gd3JpdGVVcE1lc3NhZ2VRdWV1ZSgmY29tbWFuZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmVzdWx0ID09IEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSkgeyAvLyBUT0RPIHJldmlldyBiZXN0IGVycm9yIGNvZGUKICAgICAgICAgcmVzdWx0ID0gQUFVRElPX09LOyAvLyBqdXN0IG5vdCBhdmFpbGFibGUgeWV0LCB0cnkgYWdhaW4gbGF0ZXIKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTIzMCw4ICszNjUsMTkgQEAKICAqIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgdW5kZXJseWluZyBIQUwgb3IgU2VydmljZS4KICAqLwogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpnZXREZXNjcmlwdGlvbihBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkgewotICAgIC8vIEdhdGhlciBpbmZvcm1hdGlvbiBvbiB0aGUgbWVzc2FnZSBxdWV1ZS4KLSAgICBtVXBNZXNzYWdlUXVldWUtPmZpbGxQYXJjZWxhYmxlKHBhcmNlbGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJjZWxhYmxlLm1VcE1lc3NhZ2VRdWV1ZVBhcmNlbGFibGUpOwotICAgIHJldHVybiBnZXREb3duRGF0YURlc2NyaXB0aW9uKHBhcmNlbGFibGUpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVwTWVzc2FnZVF1ZXVlTG9jayk7CisgICAgICAgIGlmIChtVXBNZXNzYWdlUXVldWUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoImdldERlc2NyaXB0aW9uKCk6IG1VcE1lc3NhZ2VRdWV1ZSBudWxsISAtIHN0cmVhbSBub3Qgb3BlbiIpOworICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9OVUxMOworICAgICAgICB9CisgICAgICAgIC8vIEdhdGhlciBpbmZvcm1hdGlvbiBvbiB0aGUgbWVzc2FnZSBxdWV1ZS4KKyAgICAgICAgbVVwTWVzc2FnZVF1ZXVlLT5maWxsUGFyY2VsYWJsZShwYXJjZWxhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmNlbGFibGUubVVwTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZSk7CisgICAgfQorICAgIHJldHVybiBnZXRBdWRpb0RhdGFEZXNjcmlwdGlvbihwYXJjZWxhYmxlKTsKK30KKwordm9pZCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6b25Wb2x1bWVDaGFuZ2VkKGZsb2F0IHZvbHVtZSkgeworICAgIHNlbmRTZXJ2aWNlRXZlbnQoQUFVRElPX1NFUlZJQ0VfRVZFTlRfVk9MVU1FLCB2b2x1bWUpOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgKaW5kZXggY2ViZWZlYy4uYWY0MzViNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8bXV0ZXg+CiAKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0NsaWVudC5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIAogI2luY2x1ZGUgImZpZm8vRmlmb0J1ZmZlci5oIgpAQCAtMjcsNzEgKzI4LDk3IEBACiAjaW5jbHVkZSAiYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5oIgogI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU2VydmljZU1lc3NhZ2UuaCIKICNpbmNsdWRlICJ1dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oIgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ2xpZW50Lmg+CisjaW5jbHVkZSAidXRpbGl0eS9BdWRpb0Nsb2NrLmgiCiAKICNpbmNsdWRlICJTaGFyZWRSaW5nQnVmZmVyLmgiCiAjaW5jbHVkZSAiQUF1ZGlvVGhyZWFkLmgiCiAKK25hbWVzcGFjZSBhbmRyb2lkIHsKKyAgICBjbGFzcyBBQXVkaW9TZXJ2aWNlOworfQorCiBuYW1lc3BhY2UgYWF1ZGlvIHsKIAorY2xhc3MgQUF1ZGlvU2VydmljZUVuZHBvaW50OworCiAvLyBXZSBleHBlY3QgdGhlIHF1ZXVlIHRvIG9ubHkgaGF2ZSBhIGZldyBjb21tYW5kcy4KIC8vIFRoaXMgc2hvdWxkIGJlIHdheSBtb3JlIHRoYW4gd2UgbmVlZC4KICNkZWZpbmUgUVVFVUVfVVBfQ0FQQUNJVFlfQ09NTUFORFMgKDEyOCkKIAogLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBhIHN0cmVhbSBpbiB0aGUgQUF1ZGlvIHNlcnZpY2UuCisgKiBFYWNoIGluc3RhbmNlIG9mIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlIGNvcnJlc3BvbmRzIHRvIGEgY2xpZW50IHN0cmVhbS4KKyAqIEl0IHVzZXMgYSBzdWJjbGFzcyBvZiBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgdW5kZXJseWluZyBkZXZpY2Ugb3IgcG9ydC4KICAqLwogY2xhc3MgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UKICAgICA6IHB1YmxpYyB2aXJ0dWFsIGFuZHJvaWQ6OlJlZkJhc2UKKyAgICAsIHB1YmxpYyBBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzCiAgICAgLCBwdWJsaWMgUnVubmFibGUgIHsKIAogcHVibGljOgotICAgIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlKCk7CisgICAgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UoYW5kcm9pZDo6QUF1ZGlvU2VydmljZSAmYUF1ZGlvU2VydmljZSk7CisKICAgICB2aXJ0dWFsIH5BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSgpOwogCiAgICAgZW51bSB7CiAgICAgICAgIElMTEVHQUxfVEhSRUFEX0lEID0gMAogICAgIH07CiAKLSAgICBzdGQ6OnN0cmluZyBkdW1wKCkgY29uc3Q7CisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGR1bXBIZWFkZXIoKTsKKworICAgIC8vIGRvZXMgbm90IGluY2x1ZGUgRU9MCisgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkdW1wKCkgY29uc3Q7CiAKICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgLyoqCiAgICAgICogT3BlbiB0aGUgZGV2aWNlLgogICAgICAqLwotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvOjpBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uT3V0cHV0KSA9IDA7CisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgb3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpID0gMDsKIAogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlKCk7CiAKICAgICAvKioKLSAgICAgKiBTdGFydCB0aGUgZmxvdyBvZiBkYXRhLgorICAgICAqIFN0YXJ0IHRoZSBmbG93IG9mIGF1ZGlvIGRhdGEuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHN5bmNocm9ub3VzIGJ1dCBpdCBjdXJyZW50bHkgaXMuCisgICAgICogQW4gQUFVRElPX1NFUlZJQ0VfRVZFTlRfU1RBUlRFRCB3aWxsIGJlIHNlbnQgdG8gdGhlIGNsaWVudCB3aGVuIGNvbXBsZXRlLgogICAgICAqLwogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0KCk7CiAKICAgICAvKioKLSAgICAgKiBTdG9wIHRoZSBmbG93IG9mIGRhdGEgc3VjaCB0aGF0IHN0YXJ0KCkgY2FuIHJlc3VtZSB3aXRoIGxvc3Mgb2YgZGF0YS4KLSAgICAgKi8KKyAgICAgKiBTdG9wIHRoZSBmbG93IG9mIGRhdGEgc28gdGhhdCBzdGFydCgpIGNhbiByZXN1bWUgd2l0aG91dCBsb3NzIG9mIGRhdGEuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHN5bmNocm9ub3VzIGJ1dCBpdCBjdXJyZW50bHkgaXMuCisgICAgICogQW4gQUFVRElPX1NFUlZJQ0VfRVZFTlRfUEFVU0VEIHdpbGwgYmUgc2VudCB0byB0aGUgY2xpZW50IHdoZW4gY29tcGxldGUuCisgICAgKi8KICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBwYXVzZSgpOwogCiAgICAgLyoqCi0gICAgICogU3RvcCB0aGUgZmxvdyBvZiBkYXRhIGFmdGVyIGRhdGEgaW4gYnVmZmVyIGhhcyBwbGF5ZWQuCisgICAgICogU3RvcCB0aGUgZmxvdyBvZiBkYXRhIGFmdGVyIHRoZSBjdXJyZW50bHkgcXVldWVkIGRhdGEgaGFzIGZpbmlzaGVkIHBsYXlpbmcuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHN5bmNocm9ub3VzIGJ1dCBpdCBjdXJyZW50bHkgaXMuCisgICAgICogQW4gQUFVRElPX1NFUlZJQ0VfRVZFTlRfU1RPUFBFRCB3aWxsIGJlIHNlbnQgdG8gdGhlIGNsaWVudCB3aGVuIGNvbXBsZXRlLgorICAgICAqCiAgICAgICovCiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgc3RvcCgpOwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHN0b3BUaW1lc3RhbXBUaHJlYWQoKTsKIAogICAgIC8qKgotICAgICAqICBEaXNjYXJkIGFueSBkYXRhIGhlbGQgYnkgdGhlIHVuZGVybHlpbmcgSEFMIG9yIFNlcnZpY2UuCisgICAgICogRGlzY2FyZCBhbnkgZGF0YSBoZWxkIGJ5IHRoZSB1bmRlcmx5aW5nIEhBTCBvciBTZXJ2aWNlLgorICAgICAqCisgICAgICogQW4gQUFVRElPX1NFUlZJQ0VfRVZFTlRfRkxVU0hFRCB3aWxsIGJlIHNlbnQgdG8gdGhlIGNsaWVudCB3aGVuIGNvbXBsZXRlLgogICAgICAqLwogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGZsdXNoKCk7CiAKKwogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0Q2xpZW50KGNvbnN0IGFuZHJvaWQ6OkF1ZGlvQ2xpZW50JiBjbGllbnQgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqY2xpZW50SGFuZGxlIF9fdW51c2VkKSB7CisgICAgICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6c3RhcnRDbGllbnQoJXAsIC4uLikgQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFIiwgJmNsaWVudCk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CiAgICAgfQogCiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgc3RvcENsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSBfX3VudXNlZCkgeworICAgICAgICBBTE9HRCgiQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnN0b3BDbGllbnQoJWQpIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSIsIGNsaWVudEhhbmRsZSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CiAgICAgfQogCkBAIC0xMjYsMTQgKzE1MywxNCBAQAogICAgICAgICByZXR1cm4gbUZyYW1lc1BlckJ1cnN0OwogICAgIH0KIAotICAgIGludDMyX3QgY2FsY3VsYXRlQnl0ZXNQZXJGcmFtZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1TYW1wbGVzUGVyRnJhbWUgKiBBQXVkaW9Db252ZXJ0X2Zvcm1hdFRvU2l6ZUluQnl0ZXMobUF1ZGlvRm9ybWF0KTsKLSAgICB9Ci0KICAgICB2b2lkIHJ1bigpIG92ZXJyaWRlOyAvLyB0byBpbXBsZW1lbnQgUnVubmFibGUKIAogICAgIHZvaWQgZGlzY29ubmVjdCgpOwogCisgICAgY29uc3QgYW5kcm9pZDo6QXVkaW9DbGllbnQgJmdldEF1ZGlvQ2xpZW50KCkgeworICAgICAgICByZXR1cm4gbU1tYXBDbGllbnQ7CisgICAgfQorCiAgICAgdWlkX3QgZ2V0T3duZXJVc2VySWQoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtTW1hcENsaWVudC5jbGllbnRVaWQ7CiAgICAgfQpAQCAtMTUzLDEyICsxODAsMjYgQEAKICAgICAgICAgcmV0dXJuIG1TdGF0ZTsKICAgICB9CiAKKyAgICB2b2lkIG9uVm9sdW1lQ2hhbmdlZChmbG9hdCB2b2x1bWUpOworCiBwcm90ZWN0ZWQ6CiAKKyAgICAvKioKKyAgICAgKiBPcGVuIHRoZSBkZXZpY2UuCisgICAgICovCisgICAgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSk7CisKICAgICB2b2lkIHNldFN0YXRlKGFhdWRpb19zdHJlYW1fc3RhdGVfdCBzdGF0ZSkgewogICAgICAgICBtU3RhdGUgPSBzdGF0ZTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBEZXZpY2Ugc3BlY2lmaWMgc3RhcnR1cC4KKyAgICAgKiBAcmV0dXJuIEFBVURJT19PSyBvciBuZWdhdGl2ZSBlcnJvci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBzdGFydERldmljZSgpOworCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHdyaXRlVXBNZXNzYWdlUXVldWUoQUF1ZGlvU2VydmljZU1lc3NhZ2UgKmNvbW1hbmQpOwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHNlbmRDdXJyZW50VGltZXN0YW1wKCk7CkBAIC0xNzAsMjcgKzIxMSwzMCBAQAogICAgICAqLwogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGdldEZyZWVSdW5uaW5nUG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgPSAwOwogCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZ2V0RG93bkRhdGFEZXNjcmlwdGlvbihBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkgPSAwOworICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGdldEhhcmR3YXJlVGltZXN0YW1wKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpID0gMDsKKworICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGdldEF1ZGlvRGF0YURlc2NyaXB0aW9uKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKSA9IDA7CiAKICAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgICBtU3RhdGUgPSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOSU5JVElBTElaRUQ7CiAKICAgICBwaWRfdCAgICAgICAgICAgICAgICAgICBtUmVnaXN0ZXJlZENsaWVudFRocmVhZCA9IElMTEVHQUxfVEhSRUFEX0lEOwogCiAgICAgU2hhcmVkUmluZ0J1ZmZlciogICAgICAgbVVwTWVzc2FnZVF1ZXVlOwotICAgIHN0ZDo6bXV0ZXggICAgICAgICAgICAgIG1Mb2NrVXBNZXNzYWdlUXVldWU7CisgICAgc3RkOjptdXRleCAgICAgICAgICAgICAgbVVwTWVzc2FnZVF1ZXVlTG9jazsKIAotICAgIEFBdWRpb1RocmVhZCAgICAgICAgICAgIG1BQXVkaW9UaHJlYWQ7CisgICAgQUF1ZGlvVGhyZWFkICAgICAgICAgICAgbVRpbWVzdGFtcFRocmVhZDsKICAgICAvLyBUaGlzIGlzIHVzZWQgYnkgb25lIHRocmVhZCB0byB0ZWxsIGFub3RoZXIgdGhyZWFkIHRvIGV4aXQuIFNvIGl0IG11c3QgYmUgYXRvbWljLgotICAgIHN0ZDo6YXRvbWljPGJvb2w+ICAgICAgIG1UaHJlYWRFbmFibGVkOworICAgIHN0ZDo6YXRvbWljPGJvb2w+ICAgICAgIG1UaHJlYWRFbmFibGVke2ZhbHNlfTsKIAotICAgIGFhdWRpb19mb3JtYXRfdCAgICAgICAgIG1BdWRpb0Zvcm1hdCA9IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ7CiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbUZyYW1lc1BlckJ1cnN0ID0gMDsKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtU2FtcGxlc1BlckZyYW1lID0gQUFVRElPX1VOU1BFQ0lGSUVEOwotICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlID0gQUFVRElPX1VOU1BFQ0lGSUVEOwotICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1DYXBhY2l0eUluRnJhbWVzID0gQUFVRElPX1VOU1BFQ0lGSUVEOwotICAgIGFuZHJvaWQ6OkF1ZGlvQ2xpZW50ICAgIG1NbWFwQ2xpZW50OworICAgIGFuZHJvaWQ6OkF1ZGlvQ2xpZW50ICAgIG1NbWFwQ2xpZW50OyAvLyBzZXQgaW4gb3BlbiwgdXNlZCBpbiBNTUFQIHN0YXJ0KCkKICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtQ2xpZW50SGFuZGxlID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKIAorICAgIFNpbXBsZURvdWJsZUJ1ZmZlcjxUaW1lc3RhbXA+ICBtQXRvbWljVGltZXN0YW1wOworCisgICAgYW5kcm9pZDo6QUF1ZGlvU2VydmljZSAmbUF1ZGlvU2VydmljZTsKKyAgICBhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IG1TZXJ2aWNlRW5kcG9pbnQ7CisKIHByaXZhdGU6CiAgICAgYWF1ZGlvX2hhbmRsZV90ICAgICAgICAgbUhhbmRsZSA9IC0xOwogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmNwcAppbmRleCAwOGRkNjgwLi40NGJhMWNhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuY3BwCkBAIC0xOSwyMjUgKzE5LDc2IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxzdGRpbnQuaD4KIAogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmg+CiAjaW5jbHVkZSA8bWVkaWEvTW1hcFN0cmVhbUludGVyZmFjZS5oPgogCisjaW5jbHVkZSAiYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5oIgorI2luY2x1ZGUgInV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgiCisKKyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaCIKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5oIgotI2luY2x1ZGUgImJpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuaCIKICNpbmNsdWRlICJTaGFyZWRNZW1vcnlQcm94eS5oIgotI2luY2x1ZGUgInV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgiCiAKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKIAotI2RlZmluZSBBQVVESU9fQlVGRkVSX0NBUEFDSVRZX01JTiAgICA0ICogNTEyCi0jZGVmaW5lIEFBVURJT19TQU1QTEVfUkFURV9ERUZBVUxUICAgIDQ4MDAwCi0KIC8qKgogICogU2VydmljZSBTdHJlYW0gdGhhdCB1c2VzIGFuIE1NQVAgYnVmZmVyLgogICovCiAKLUFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUChjb25zdCBhbmRyb2lkOjpBdWRpb0NsaWVudCYgc2VydmljZUNsaWVudCwKK0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUChhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlICZhQXVkaW9TZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5TZXJ2aWNlKQotICAgICAgICA6IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlKCkKLSAgICAgICAgLCBtTW1hcFN0cmVhbUNhbGxiYWNrKG5ldyBNeU1tYXBTdHJlYW1DYWxsYmFjaygqdGhpcykpCi0gICAgICAgICwgbVByZXZpb3VzRnJhbWVDb3VudGVyKDApCi0gICAgICAgICwgbU1tYXBTdHJlYW0obnVsbHB0cikKLSAgICAgICAgLCBtU2VydmljZUNsaWVudChzZXJ2aWNlQ2xpZW50KQorICAgICAgICA6IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlKGFBdWRpb1NlcnZpY2UpCiAgICAgICAgICwgbUluU2VydmljZShpblNlcnZpY2UpIHsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpjbG9zZSgpIHsKLSAgICBpZiAobVN0YXRlID09IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VEKSB7CisgICAgaWYgKGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQpIHsKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKICAgICB9CisKICAgICBzdG9wKCk7Ci0gICAgaWYgKG1NbWFwU3RyZWFtICE9IDApIHsKLSAgICAgICAgbU1tYXBTdHJlYW0uY2xlYXIoKTsgLy8gVE9ETyByZXZpZXcuIElzIHRoYXQgYWxsIHdlIGhhdmUgdG8gZG8/Ci0gICAgICAgIC8vIEFwcGFyZW50bHkgdGhlIGFib3ZlIGNsb3NlIGlzIGFzeW5jaHJvbm91cy4gQW4gYXR0ZW1wdCB0byBvcGVuIGEgbmV3IGRldmljZQotICAgICAgICAvLyByaWdodCBhZnRlciBhIGNsb3NlIGNhbiBmYWlsLiBBbHNvIHNvbWUgY2FsbGJhY2tzIG1heSBzdGlsbCBiZSBpbiBmbGlnaHQhCi0gICAgICAgIC8vIEZJWE1FIE1ha2UgY2xvc2luZyBzeW5jaHJvbm91cy4KLSAgICAgICAgQXVkaW9DbG9jazo6c2xlZXBGb3JOYW5vcygxMDAgKiBBQVVESU9fTkFOT1NfUEVSX01JTExJU0VDT05EKTsKLSAgICB9CiAKICAgICByZXR1cm4gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmNsb3NlKCk7CiB9CiAKIC8vIE9wZW4gc3RyZWFtIG9uIEhBTCBhbmQgcGFzcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2hhcmVkIG1lbW9yeSBidWZmZXIgYmFjayB0byB0aGUgY2xpZW50LgotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpbzo6QUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbk91dHB1dCkgewotICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0gewotICAgICAgICAuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLAotICAgICAgICAudXNhZ2UgPSBBVURJT19VU0FHRV9NRURJQSwKLSAgICAgICAgLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiwKLSAgICAgICAgLmZsYWdzID0gQVVESU9fRkxBR19MT1dfTEFURU5DWSwKLSAgICAgICAgLnRhZ3MgPSAiIgotICAgIH07Ci0gICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWc7CithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6Om9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSB7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om9wZW4ocmVxdWVzdCwgY29uZmlndXJhdGlvbk91dHB1dCk7CisgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbU1NQVA+IGtlZXAodGhpcyk7CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om9wZW4ocmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSBvcGVuIHJldHVybmVkICVkIiwgcmVzdWx0KTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKLSAgICBjb25zdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uSW5wdXQgPSByZXF1ZXN0LmdldENvbnN0YW50Q29uZmlndXJhdGlvbigpOwotICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQgPSBjb25maWd1cmF0aW9uSW5wdXQuZ2V0RGV2aWNlSWQoKTsKLSAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uID0gcmVxdWVzdC5nZXREaXJlY3Rpb24oKTsKLQotICAgIC8vIEZpbGwgaW4gY29uZmlnCi0gICAgYWF1ZGlvX2Zvcm1hdF90IGFhdWRpb0Zvcm1hdCA9IGNvbmZpZ3VyYXRpb25JbnB1dC5nZXRGb3JtYXQoKTsKLSAgICBpZiAoYWF1ZGlvRm9ybWF0ID09IEFBVURJT19VTlNQRUNJRklFRCB8fCBhYXVkaW9Gb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgYWF1ZGlvRm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2OworICAgIHJlc3VsdCA9IG1TZXJ2aWNlRW5kcG9pbnQtPnJlZ2lzdGVyU3RyZWFtKGtlZXApOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQotICAgIGNvbmZpZy5mb3JtYXQgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZERhdGFGb3JtYXQoYWF1ZGlvRm9ybWF0KTsKLQotICAgIGludDMyX3QgYWF1ZGlvU2FtcGxlUmF0ZSA9IGNvbmZpZ3VyYXRpb25JbnB1dC5nZXRTYW1wbGVSYXRlKCk7Ci0gICAgaWYgKGFhdWRpb1NhbXBsZVJhdGUgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgIGFhdWRpb1NhbXBsZVJhdGUgPSBBQVVESU9fU0FNUExFX1JBVEVfREVGQVVMVDsKLSAgICB9Ci0gICAgY29uZmlnLnNhbXBsZV9yYXRlID0gYWF1ZGlvU2FtcGxlUmF0ZTsKLQotICAgIGludDMyX3QgYWF1ZGlvU2FtcGxlc1BlckZyYW1lID0gY29uZmlndXJhdGlvbklucHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOwotCi0gICAgaWYgKGRpcmVjdGlvbiA9PSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCkgewotICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gKGFhdWRpb1NhbXBsZXNQZXJGcmFtZSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChhYXVkaW9TYW1wbGVzUGVyRnJhbWUpOwotICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09IEFBVURJT19ESVJFQ1RJT05fSU5QVVQpIHsKLSAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9ICAoYWF1ZGlvU2FtcGxlc1BlckZyYW1lID09IEFBVURJT19VTlNQRUNJRklFRCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhdWRpb19jaGFubmVsX2luX21hc2tfZnJvbV9jb3VudChhYXVkaW9TYW1wbGVzUGVyRnJhbWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJvcGVuTW1hcFN0cmVhbSAtIGludmFsaWQgZGlyZWN0aW9uID0gJWQiLCBkaXJlY3Rpb24pOwotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQ7Ci0gICAgfQotCi0gICAgTW1hcFN0cmVhbUludGVyZmFjZTo6c3RyZWFtX2RpcmVjdGlvbl90IHN0cmVhbURpcmVjdGlvbiA9IChkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpCi0gICAgICAgID8gTW1hcFN0cmVhbUludGVyZmFjZTo6RElSRUNUSU9OX09VVFBVVCA6IE1tYXBTdHJlYW1JbnRlcmZhY2U6OkRJUkVDVElPTl9JTlBVVDsKLQotICAgIC8vIE9wZW4gSEFMIHN0cmVhbS4KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBNbWFwU3RyZWFtSW50ZXJmYWNlOjpvcGVuTW1hcFN0cmVhbShzdHJlYW1EaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTW1hcENsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1tYXBTdHJlYW1DYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTW1hcFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVBvcnRIYW5kbGUpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIm9wZW5NbWFwU3RyZWFtIHJldHVybmVkIHN0YXR1cyAlZCIsIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7Ci0gICAgfQotCi0gICAgaWYgKGRldmljZUlkID09IEFBVURJT19VTlNQRUNJRklFRCkgewotICAgICAgICBBTE9HVygiQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6Om9wZW4oKSAtIG9wZW5NbWFwU3RyZWFtKCkgZmFpbGVkIHRvIHNldCBkZXZpY2VJZCIpOwotICAgIH0KLQotICAgIC8vIENyZWF0ZSBNTUFQL05PSVJRIGJ1ZmZlci4KLSAgICBpbnQzMl90IG1pblNpemVGcmFtZXMgPSBjb25maWd1cmF0aW9uSW5wdXQuZ2V0QnVmZmVyQ2FwYWNpdHkoKTsKLSAgICBpZiAobWluU2l6ZUZyYW1lcyA8PSAwKSB7IC8vIHplcm8gd2lsbCBnZXQgcmVqZWN0ZWQKLSAgICAgICAgbWluU2l6ZUZyYW1lcyA9IEFBVURJT19CVUZGRVJfQ0FQQUNJVFlfTUlOOwotICAgIH0KLSAgICBzdGF0dXMgPSBtTW1hcFN0cmVhbS0+Y3JlYXRlTW1hcEJ1ZmZlcihtaW5TaXplRnJhbWVzLCAmbU1tYXBCdWZmZXJpbmZvKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6b3BlbigpIC0gY3JlYXRlTW1hcEJ1ZmZlcigpIHJldHVybmVkIHN0YXR1cyAlZCIsCi0gICAgICAgICAgICAgIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0QoImNyZWF0ZU1tYXBCdWZmZXIgc3RhdHVzID0gJWQsIGJ1ZmZlcl9zaXplID0gJWQsIGJ1cnN0X3NpemUgJWQiCi0gICAgICAgICAgICAgICAgIiwgU2hhcmFibGUgRkQ6ICVzIiwKLSAgICAgICAgICAgICAgc3RhdHVzLAotICAgICAgICAgICAgICBhYnMobU1tYXBCdWZmZXJpbmZvLmJ1ZmZlcl9zaXplX2ZyYW1lcyksCi0gICAgICAgICAgICAgIG1NbWFwQnVmZmVyaW5mby5idXJzdF9zaXplX2ZyYW1lcywKLSAgICAgICAgICAgICAgbU1tYXBCdWZmZXJpbmZvLmJ1ZmZlcl9zaXplX2ZyYW1lcyA8IDAgPyAiWWVzIiA6ICJObyIpOwotICAgIH0KLQotICAgIG1DYXBhY2l0eUluRnJhbWVzID0gbU1tYXBCdWZmZXJpbmZvLmJ1ZmZlcl9zaXplX2ZyYW1lczsKLSAgICAvLyBGSVhNRTogdGhlIGF1ZGlvIEhBTCBpbmRpY2F0ZXMgaWYgdGhlIHNoYXJlZCBtZW1vcnkgZmQgY2FuIGJlIHNoYXJlZCBvdXRzaWRlIG9mIGF1ZGlvc2VydmVyCi0gICAgLy8gYnkgcmV0dXJuaW5nIGEgbmVnYXRpdmUgYnVmZmVyIHNpemUKLSAgICBpZiAobUNhcGFjaXR5SW5GcmFtZXMgPCAwKSB7Ci0gICAgICAgIC8vIEV4Y2x1c2l2ZSBtb2RlIGlzIHBvc3NpYmxlIGZyb20gYW55IGNsaWVudAotICAgICAgICBtQ2FwYWNpdHlJbkZyYW1lcyA9IC1tQ2FwYWNpdHlJbkZyYW1lczsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBleGNsdXNpdmUgbW9kZSBpcyBvbmx5IHBvc3NpYmxlIGlmIHRoZSBmaW5hbCBmZCBkZXN0aW5hdGlvbiBpcyBpbnNpZGUgYXVkaW9zZXJ2ZXIKLSAgICAgICAgaWYgKChtTW1hcENsaWVudC5jbGllbnRVaWQgIT0gbVNlcnZpY2VDbGllbnQuY2xpZW50VWlkKSAmJgotICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25JbnB1dC5nZXRTaGFyaW5nTW9kZSgpID09IEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFKSB7Ci0gICAgICAgICAgICAvLyBGYWxsYmFjayBpcyBoYW5kbGVkIGJ5IGNhbGxlciBidXQgaW5kaWNhdGUgd2hhdCBpcyBwb3NzaWJsZSBpbiBjYXNlCi0gICAgICAgICAgICAvLyB0aGlzIGlzIHVzZWQgaW4gdGhlIGZ1dHVyZQotICAgICAgICAgICAgY29uZmlndXJhdGlvbk91dHB1dC5zZXRTaGFyaW5nTW9kZShBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCk7Ci0gICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdHJlYW0gYW5kIHBhc3MgaXQgYmFjayB0byB0aGUgY2FsbGVyLgotICAgIG1TYW1wbGVzUGVyRnJhbWUgPSAoZGlyZWN0aW9uID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY29uZmlnLmNoYW5uZWxfbWFzaykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY29uZmlnLmNoYW5uZWxfbWFzayk7Ci0KLSAgICAvLyBBQXVkaW8gY3JlYXRlcyBhIGNvcHkgb2YgdGhpcyBGRCBhbmQgcmV0YWlucyBvd25lcnNoaXAgb2YgdGhlIGNvcHkuCi0gICAgLy8gQXNzdW1lIHRoYXQgQXVkaW9GbGluZ2VyIHdpbGwgY2xvc2UgdGhlIG9yaWdpbmFsIHNoYXJlZF9tZW1vcnlfZmQuCi0gICAgbUF1ZGlvRGF0YUZpbGVEZXNjcmlwdG9yLnJlc2V0KGR1cChtTW1hcEJ1ZmZlcmluZm8uc2hhcmVkX21lbW9yeV9mZCkpOwotICAgIGlmIChtQXVkaW9EYXRhRmlsZURlc2NyaXB0b3IuZ2V0KCkgPT0gLTEpIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpvcGVuKCkgLSBjb3VsZCBub3QgZHVwIHNoYXJlZF9tZW1vcnlfZmQiKTsKLSAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsgLy8gVE9ETyByZXZpZXcKLSAgICB9Ci0gICAgbUZyYW1lc1BlckJ1cnN0ID0gbU1tYXBCdWZmZXJpbmZvLmJ1cnN0X3NpemVfZnJhbWVzOwotICAgIG1BdWRpb0Zvcm1hdCA9IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvRGF0YUZvcm1hdChjb25maWcuZm9ybWF0KTsKLSAgICBtU2FtcGxlUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKLQotICAgIC8vIFNjYWxlIHVwIHRoZSBidXJzdCBzaXplIHRvIG1lZXQgdGhlIG1pbmltdW0gZXF1aXZhbGVudCBpbiBtaWNyb3NlY29uZHMuCi0gICAgLy8gVGhpcyBpcyB0byBhdm9pZCB3YWtpbmcgdGhlIENQVSB0b28gb2Z0ZW4gd2hlbiB0aGUgSFcgYnVyc3QgaXMgdmVyeSBzbWFsbAotICAgIC8vIG9yIGF0IGhpZ2ggc2FtcGxlIHJhdGVzLgotICAgIGludDMyX3QgYnVyc3RNaW5NaWNyb3MgPSBBQXVkaW9Qcm9wZXJ0eV9nZXRIYXJkd2FyZUJ1cnN0TWluTWljcm9zKCk7Ci0gICAgaW50MzJfdCBidXJzdE1pY3JvcyA9IDA7Ci0gICAgZG8gewotICAgICAgICBpZiAoYnVyc3RNaWNyb3MgPiAwKSB7ICAvLyBza2lwIGZpcnN0IGxvb3AKLSAgICAgICAgICAgIG1GcmFtZXNQZXJCdXJzdCAqPSAyOwotICAgICAgICB9Ci0gICAgICAgIGJ1cnN0TWljcm9zID0gbUZyYW1lc1BlckJ1cnN0ICogc3RhdGljX2Nhc3Q8aW50NjRfdD4oMTAwMDAwMCkgLyBtU2FtcGxlUmF0ZTsKLSAgICB9IHdoaWxlIChidXJzdE1pY3JvcyA8IGJ1cnN0TWluTWljcm9zKTsKLQotICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6b3BlbigpIG9yaWdpbmFsIGJ1cnN0ID0gJWQsIG1pbk1pY3JvcyA9ICVkLCBmaW5hbCBidXJzdCA9ICVkXG4iLAotICAgICAgICAgIG1NbWFwQnVmZmVyaW5mby5idXJzdF9zaXplX2ZyYW1lcywgYnVyc3RNaW5NaWNyb3MsIG1GcmFtZXNQZXJCdXJzdCk7Ci0KLSAgICBBTE9HRCgiQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6Om9wZW4oKSBhY3R1YWwgcmF0ZSA9ICVkLCBjaGFubmVscyA9ICVkLCBkZXZpY2VJZCA9ICVkXG4iLAotICAgICAgICAgIG1TYW1wbGVSYXRlLCBtU2FtcGxlc1BlckZyYW1lLCBkZXZpY2VJZCk7Ci0KLSAgICAvLyBGaWxsIGluIEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24KLSAgICBjb25maWd1cmF0aW9uT3V0cHV0LnNldFNhbXBsZVJhdGUobVNhbXBsZVJhdGUpOwotICAgIGNvbmZpZ3VyYXRpb25PdXRwdXQuc2V0U2FtcGxlc1BlckZyYW1lKG1TYW1wbGVzUGVyRnJhbWUpOwotICAgIGNvbmZpZ3VyYXRpb25PdXRwdXQuc2V0Rm9ybWF0KG1BdWRpb0Zvcm1hdCk7Ci0gICAgY29uZmlndXJhdGlvbk91dHB1dC5zZXREZXZpY2VJZChkZXZpY2VJZCk7CiAKICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX09QRU4pOworCitlcnJvcjoKICAgICByZXR1cm4gQUFVRElPX09LOwogfQogCiAvKioKICAqIFN0YXJ0IHRoZSBmbG93IG9mIGRhdGEuCiAgKi8KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6c3RhcnQoKSB7Ci0gICAgaWYgKGlzUnVubmluZygpKSB7Ci0gICAgICAgIHJldHVybiBBQVVESU9fT0s7Ci0gICAgfQotICAgIGlmIChtTW1hcFN0cmVhbSA9PSBudWxscHRyKSByZXR1cm4gQUFVRElPX0VSUk9SX05VTEw7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtTW1hcFN0cmVhbS0+c3RhcnQobVNlcnZpY2VDbGllbnQsICZtUG9ydEhhbmRsZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OnN0YXJ0KCkgbU1tYXBTdHJlYW0tPnN0YXJ0KCkgcmV0dXJuZWQgJWQiLCBzdGF0dXMpOwotICAgICAgICBkaXNjb25uZWN0KCk7Ci0gICAgICAgIHJlc3VsdCA9IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1cyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnN0YXJ0KCk7Ci0gICAgICAgIGlmICghbUluU2VydmljZSAmJiByZXN1bHQgPT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICBzdGFydENsaWVudChtTW1hcENsaWVudCwgJm1DbGllbnRIYW5kbGUpOwotICAgICAgICB9CithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OnN0YXJ0RGV2aWNlKCkgeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6c3RhcnREZXZpY2UoKTsKKyAgICBpZiAoIW1JblNlcnZpY2UgJiYgcmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBjYW4gc29tZXRpbWVzIHRha2UgMjAwIHRvIDMwMCBtc2VjIGZvciBhIGNvbGQgc3RhcnQhCisgICAgICAgIHJlc3VsdCA9IHN0YXJ0Q2xpZW50KG1NbWFwQ2xpZW50LCAmbUNsaWVudEhhbmRsZSk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CkBAIC0yNDksMTA0ICsxMDAsNzggQEAKICAgICBpZiAoIWlzUnVubmluZygpKSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CiAgICAgfQotICAgIGlmIChtTW1hcFN0cmVhbSA9PSBudWxscHRyKSByZXR1cm4gQUFVRElPX0VSUk9SX05VTEw7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdDEgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6cGF1c2UoKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnBhdXNlKCk7CisgICAgLy8gVE9ETyBwdXQgYmVmb3JlIGJhc2U6OnBhdXNlKCk/CiAgICAgaWYgKCFtSW5TZXJ2aWNlKSB7Ci0gICAgICAgIHN0b3BDbGllbnQobUNsaWVudEhhbmRsZSk7CisgICAgICAgICh2b2lkKSBzdG9wQ2xpZW50KG1DbGllbnRIYW5kbGUpOwogICAgIH0KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtTW1hcFN0cmVhbS0+c3RvcChtUG9ydEhhbmRsZSk7Ci0gICAgbUZyYW1lc1JlYWQucmVzZXQzMigpOwotICAgIHJldHVybiAocmVzdWx0MSAhPSBBQVVESU9fT0spID8gcmVzdWx0MSA6IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1cyk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpzdG9wKCkgewogICAgIGlmICghaXNSdW5uaW5nKCkpIHsKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKICAgICB9Ci0gICAgaWYgKG1NbWFwU3RyZWFtID09IG51bGxwdHIpIHJldHVybiBBQVVESU9fRVJST1JfTlVMTDsKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0MSA9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpzdG9wKCk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpzdG9wKCk7CisgICAgLy8gVE9ETyBwdXQgYmVmb3JlIGJhc2U6OnN0b3AoKT8KICAgICBpZiAoIW1JblNlcnZpY2UpIHsKLSAgICAgICAgc3RvcENsaWVudChtQ2xpZW50SGFuZGxlKTsKLSAgICB9Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHN0YXR1cyA9IG1NbWFwU3RyZWFtLT5zdG9wKG1Qb3J0SGFuZGxlKTsKLSAgICBtRnJhbWVzUmVhZC5yZXNldDMyKCk7Ci0gICAgcmV0dXJuIChyZXN1bHQxICE9IEFBVURJT19PSykgPyByZXN1bHQxIDogIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1cyk7Ci19Ci0KLS8qKgotICogIERpc2NhcmQgYW55IGRhdGEgaGVsZCBieSB0aGUgdW5kZXJseWluZyBIQUwgb3IgU2VydmljZS4KLSAqLwotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpmbHVzaCgpIHsKLSAgICBpZiAobU1tYXBTdHJlYW0gPT0gbnVsbHB0cikgcmV0dXJuIEFBVURJT19FUlJPUl9OVUxMOwotICAgIC8vIFRPRE8gaG93IGRvIHdlIGZsdXNoIGFuIE1NQVAvTk9JUlEgYnVmZmVyPyBzeW5jIHBvaW50ZXJzPwotICAgIHJldHVybiBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6Zmx1c2goKTs7Ci19Ci0KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6c3RhcnRDbGllbnQoY29uc3QgYW5kcm9pZDo6QXVkaW9DbGllbnQmIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqY2xpZW50SGFuZGxlKSB7Ci0gICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KG1NbWFwU3RyZWFtLT5zdGFydChjbGllbnQsIGNsaWVudEhhbmRsZSkpOwotfQotCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OnN0b3BDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBjbGllbnRIYW5kbGUpIHsKLSAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQobU1tYXBTdHJlYW0tPnN0b3AoY2xpZW50SGFuZGxlKSk7Ci19Ci0KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6Z2V0RnJlZVJ1bm5pbmdQb3NpdGlvbihpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3MpIHsKLSAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiBwb3NpdGlvbjsKLSAgICBpZiAobU1tYXBTdHJlYW0gPT0gbnVsbHB0cikgewotICAgICAgICBkaXNjb25uZWN0KCk7Ci0gICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfTlVMTDsKLSAgICB9Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbU1tYXBTdHJlYW0tPmdldE1tYXBQb3NpdGlvbigmcG9zaXRpb24pOwotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChzdGF0dXMpOwotICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFKSB7Ci0gICAgICAgIEFMT0dXKCJzZW5kQ3VycmVudFRpbWVzdGFtcCgpOiBnZXRNbWFwUG9zaXRpb24oKSBoYXMgbm8gcG9zaXRpb24gZGF0YSB5ZXQiKTsKLSAgICB9IGVsc2UgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgQUxPR0UoInNlbmRDdXJyZW50VGltZXN0YW1wKCk6IGdldE1tYXBQb3NpdGlvbigpIHJldHVybmVkIHN0YXR1cyAlZCIsIHN0YXR1cyk7Ci0gICAgICAgIGRpc2Nvbm5lY3QoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtRnJhbWVzUmVhZC51cGRhdGUzMihwb3NpdGlvbi5wb3NpdGlvbl9mcmFtZXMpOwotICAgICAgICAqcG9zaXRpb25GcmFtZXMgPSBtRnJhbWVzUmVhZC5nZXQoKTsKLSAgICAgICAgKnRpbWVOYW5vcyA9IHBvc2l0aW9uLnRpbWVfbmFub3NlY29uZHM7CisgICAgICAgICh2b2lkKSBzdG9wQ2xpZW50KG1DbGllbnRIYW5kbGUpOwogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwogfQogCi12b2lkIEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpvblRlYXJEb3duKCkgewotICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6b25UZWFyRG93bigpIGNhbGxlZCIpOwotICAgIGRpc2Nvbm5lY3QoKTsKLX07CithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OnN0YXJ0Q2xpZW50KGNvbnN0IGFuZHJvaWQ6OkF1ZGlvQ2xpZW50JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqY2xpZW50SGFuZGxlKSB7CisgICAgLy8gU3RhcnQgdGhlIGNsaWVudCBvbiBiZWhhbGYgb2YgdGhlIGFwcGxpY2F0aW9uLiBHZW5lcmF0ZSBhIG5ldyBwb3J0aGFuZGxlLgorICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBtU2VydmljZUVuZHBvaW50LT5zdGFydENsaWVudChjbGllbnQsIGNsaWVudEhhbmRsZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KIAotdm9pZCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6b25Wb2x1bWVDaGFuZ2VkKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6VmVjdG9yPGZsb2F0PiB2YWx1ZXMpIHsKLSAgICAvLyBUT0RPIGRvIHdlIHJlYWxseSBuZWVkIGEgZGlmZmVyZW50IHZvbHVtZSBmb3IgZWFjaCBjaGFubmVsPwotICAgIGZsb2F0IHZvbHVtZSA9IHZhbHVlc1swXTsKLSAgICBBTE9HRCgiQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6Om9uVm9sdW1lQ2hhbmdlZCgpIHZvbHVtZVswXSA9ICVmIiwgdm9sdW1lKTsKLSAgICBzZW5kU2VydmljZUV2ZW50KEFBVURJT19TRVJWSUNFX0VWRU5UX1ZPTFVNRSwgdm9sdW1lKTsKLX07CithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OnN0b3BDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBjbGllbnRIYW5kbGUpIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gbVNlcnZpY2VFbmRwb2ludC0+c3RvcENsaWVudChjbGllbnRIYW5kbGUpOworICAgIHJldHVybiByZXN1bHQ7Cit9CiAKLXZvaWQgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6Om9uUm91dGluZ0NoYW5nZWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgewotICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6b25Sb3V0aW5nQ2hhbmdlZCgpIGNhbGxlZCB3aXRoICVkLCBvbGQgPSAlZCIsCi0gICAgICAgICAgZGV2aWNlSWQsIG1EZXZpY2VJZCk7Ci0gICAgaWYgKG1EZXZpY2VJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FICAmJiBtRGV2aWNlSWQgIT0gZGV2aWNlSWQpIHsKKy8vIEdldCBmcmVlLXJ1bm5pbmcgRFNQIG9yIERNQSBoYXJkd2FyZSBwb3NpdGlvbiBmcm9tIHRoZSBIQUwuCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OmdldEZyZWVSdW5uaW5nUG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3MpIHsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQPiBzZXJ2aWNlRW5kcG9pbnRNTUFQeworICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUCAqPihtU2VydmljZUVuZHBvaW50LmdldCgpKX07CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHNlcnZpY2VFbmRwb2ludE1NQVAtPmdldEZyZWVSdW5uaW5nUG9zaXRpb24ocG9zaXRpb25GcmFtZXMsIHRpbWVOYW5vcyk7CisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCgqcG9zaXRpb25GcmFtZXMsICp0aW1lTmFub3MpOworICAgICAgICBtQXRvbWljVGltZXN0YW1wLndyaXRlKHRpbWVzdGFtcCk7CisgICAgICAgICpwb3NpdGlvbkZyYW1lcyA9IHRpbWVzdGFtcC5nZXRQb3NpdGlvbigpOworICAgICAgICAqdGltZU5hbm9zID0gdGltZXN0YW1wLmdldE5hbm9zZWNvbmRzKCk7CisgICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFKSB7CiAgICAgICAgIGRpc2Nvbm5lY3QoKTsKICAgICB9Ci0gICAgbURldmljZUlkID0gZGV2aWNlSWQ7Ci19OworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIEdldCB0aW1lc3RhbXAgdGhhdCB3YXMgd3JpdHRlbiBieSBnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKCkKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6Z2V0SGFyZHdhcmVUaW1lc3RhbXAoaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKSB7CisgICAgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUD4gc2VydmljZUVuZHBvaW50TU1BUHsKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAgKj4obVNlcnZpY2VFbmRwb2ludC5nZXQoKSl9OworICAgIC8vIFRPRE8gR2V0IHByZXNlbnRhdGlvbiB0aW1lc3RhbXAgZnJvbSB0aGUgSEFMCisgICAgaWYgKG1BdG9taWNUaW1lc3RhbXAuaXNWYWxpZCgpKSB7CisgICAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAgPSBtQXRvbWljVGltZXN0YW1wLnJlYWQoKTsKKyAgICAgICAgKnBvc2l0aW9uRnJhbWVzID0gdGltZXN0YW1wLmdldFBvc2l0aW9uKCk7CisgICAgICAgICp0aW1lTmFub3MgPSB0aW1lc3RhbXAuZ2V0TmFub3NlY29uZHMoKSArIHNlcnZpY2VFbmRwb2ludE1NQVAtPmdldEhhcmR3YXJlVGltZU9mZnNldE5hbm9zKCk7CisgICAgICAgIHJldHVybiBBQVVESU9fT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKKyAgICB9Cit9CiAKIC8qKgogICogR2V0IGFuIGltbXV0YWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGF0YSBxdWV1ZSBmcm9tIHRoZSBIQUwuCiAgKi8KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6Z2V0RG93bkRhdGFEZXNjcmlwdGlvbihBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6Z2V0QXVkaW9EYXRhRGVzY3JpcHRpb24oCisgICAgICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKQogewotICAgIC8vIEdhdGhlciBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBxdWV1ZSBiYXNlZCBvbiBIQUwgaW5mby4KLSAgICBpbnQzMl90IGJ5dGVzUGVyRnJhbWUgPSBjYWxjdWxhdGVCeXRlc1BlckZyYW1lKCk7Ci0gICAgaW50MzJfdCBjYXBhY2l0eUluQnl0ZXMgPSBtQ2FwYWNpdHlJbkZyYW1lcyAqIGJ5dGVzUGVyRnJhbWU7Ci0gICAgaW50IGZkSW5kZXggPSBwYXJjZWxhYmxlLmFkZEZpbGVEZXNjcmlwdG9yKG1BdWRpb0RhdGFGaWxlRGVzY3JpcHRvciwgY2FwYWNpdHlJbkJ5dGVzKTsKLSAgICBwYXJjZWxhYmxlLm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5zZXR1cE1lbW9yeShmZEluZGV4LCAwLCBjYXBhY2l0eUluQnl0ZXMpOwotICAgIHBhcmNlbGFibGUubURvd25EYXRhUXVldWVQYXJjZWxhYmxlLnNldEJ5dGVzUGVyRnJhbWUoYnl0ZXNQZXJGcmFtZSk7Ci0gICAgcGFyY2VsYWJsZS5tRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUuc2V0RnJhbWVzUGVyQnVyc3QobUZyYW1lc1BlckJ1cnN0KTsKLSAgICBwYXJjZWxhYmxlLm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZS5zZXRDYXBhY2l0eUluRnJhbWVzKG1DYXBhY2l0eUluRnJhbWVzKTsKLSAgICByZXR1cm4gQUFVRElPX09LOworICAgIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA+IHNlcnZpY2VFbmRwb2ludE1NQVB7CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQICo+KG1TZXJ2aWNlRW5kcG9pbnQuZ2V0KCkpfTsKKyAgICByZXR1cm4gc2VydmljZUVuZHBvaW50TU1BUC0+Z2V0RG93bkRhdGFEZXNjcmlwdGlvbihwYXJjZWxhYmxlKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5oCmluZGV4IGI2OWRjNDYuLmUyNDE1ZDAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuaApAQCAtMzcsMjcgKzM3LDIwIEBACiAKIG5hbWVzcGFjZSBhYXVkaW8gewogCi0gICAgLyoqCi0gICAgICogTWFuYWdlIG9uZSBtZW1vcnkgbWFwcGVkIGJ1ZmZlciB0aGF0IG9yaWdpbmF0ZWQgZnJvbSBhIEhBTC4KLSAgICAgKi8KLWNsYXNzIEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQCi0gICAgOiBwdWJsaWMgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UKLSAgICAsIHB1YmxpYyBhbmRyb2lkOjpNbWFwU3RyZWFtQ2FsbGJhY2sgeworCisvKioKKyAqIFRoZXNlIGNvcnJlc3BvbmRzIHRvIGFuIEVYQ0xVU0lWRSBtb2RlIE1NQVAgY2xpZW50IHN0cmVhbS4KKyAqIEl0IGhhcyBleGNsdXNpdmUgdXNlIG9mIG9uZSBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHVuZGVybHlpbmcKKyAqIGRldmljZSBvciBwb3J0LgorICovCitjbGFzcyBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUCA6IHB1YmxpYyBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSB7CiAKIHB1YmxpYzoKLSAgICBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUChjb25zdCBhbmRyb2lkOjpBdWRpb0NsaWVudCYgc2VydmljZUNsaWVudCwgYm9vbCBpblNlcnZpY2UpOworICAgIEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQKGFuZHJvaWQ6OkFBdWRpb1NlcnZpY2UgJmFBdWRpb1NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpblNlcnZpY2UpOwogICAgIHZpcnR1YWwgfkFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQKCkgPSBkZWZhdWx0OwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvOjpBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uT3V0cHV0KSBvdmVycmlkZTsKLQotICAgIC8qKgotICAgICAqIFN0YXJ0IHRoZSBmbG93IG9mIGF1ZGlvIGRhdGEuCi0gICAgICoKLSAgICAgKiBUaGlzIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHN5bmNocm9ub3VzIGJ1dCBpdCBjdXJyZW50bHkgaXMuCi0gICAgICogQW4gQUFVRElPX1NFUlZJQ0VfRVZFTlRfU1RBUlRFRCB3aWxsIGJlIHNlbnQgdG8gdGhlIGNsaWVudCB3aGVuIGNvbXBsZXRlLgotICAgICAqLwotICAgIGFhdWRpb19yZXN1bHRfdCBzdGFydCgpIG92ZXJyaWRlOworICAgIGFhdWRpb19yZXN1bHRfdCBvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgb3ZlcnJpZGU7CiAKICAgICAvKioKICAgICAgKiBTdG9wIHRoZSBmbG93IG9mIGRhdGEgc28gdGhhdCBzdGFydCgpIGNhbiByZXN1bWUgd2l0aG91dCBsb3NzIG9mIGRhdGEuCkBAIC02OSw3OSArNjIsMzQgQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wKCkgb3ZlcnJpZGU7CiAKLSAgICAvKioKLSAgICAgKiAgRGlzY2FyZCBhbnkgZGF0YSBoZWxkIGJ5IHRoZSB1bmRlcmx5aW5nIEhBTCBvciBTZXJ2aWNlLgotICAgICAqCi0gICAgICogVGhpcyBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBzeW5jaHJvbm91cyBidXQgaXQgY3VycmVudGx5IGlzLgotICAgICAqIEFuIEFBVURJT19TRVJWSUNFX0VWRU5UX0ZMVVNIRUQgd2lsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQgd2hlbiBjb21wbGV0ZS4KLSAgICAgKi8KLSAgICBhYXVkaW9fcmVzdWx0X3QgZmx1c2goKSBvdmVycmlkZTsKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RhcnRDbGllbnQoY29uc3QgYW5kcm9pZDo6QXVkaW9DbGllbnQmIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqY2xpZW50SGFuZGxlKSBvdmVycmlkZTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgY2xpZW50SGFuZGxlKSBvdmVycmlkZTsKIAogICAgIGFhdWRpb19yZXN1bHRfdCBjbG9zZSgpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgc3RhcnRDbGllbnQoY29uc3QgYW5kcm9pZDo6QXVkaW9DbGllbnQmIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpjbGllbnRIYW5kbGUpOwotCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgc3RvcENsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSk7Ci0KICAgICAvKioKICAgICAgKiBTZW5kIGEgTU1BUC9OT0lSUSBidWZmZXIgdGltZXN0YW1wIHRvIHRoZSBjbGllbnQuCiAgICAgICovCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHNlbmRDdXJyZW50VGltZXN0YW1wKCk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLSBDYWxsYmFjayBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgdm9pZCBvblRlYXJEb3duKCkgb3ZlcnJpZGU7Ci0KLSAgICB2b2lkIG9uVm9sdW1lQ2hhbmdlZChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpWZWN0b3I8ZmxvYXQ+IHZhbHVlcykgb3ZlcnJpZGU7Ci0KLSAgICB2b2lkIG9uUm91dGluZ0NoYW5nZWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgb3ZlcnJpZGU7CiAKIHByb3RlY3RlZDoKIAotICAgIGFhdWRpb19yZXN1bHRfdCBnZXREb3duRGF0YURlc2NyaXB0aW9uKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKSBvdmVycmlkZTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0QXVkaW9EYXRhRGVzY3JpcHRpb24oQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpIG92ZXJyaWRlOwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IGdldEZyZWVSdW5uaW5nUG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgb3ZlcnJpZGU7CiAKKyAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0SGFyZHdhcmVUaW1lc3RhbXAoaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBEZXZpY2Ugc3BlY2lmaWMgc3RhcnR1cC4KKyAgICAgKiBAcmV0dXJuIEFBVURJT19PSyBvciBuZWdhdGl2ZSBlcnJvci4KKyAgICAgKi8KKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RhcnREZXZpY2UoKSBvdmVycmlkZTsKKwogcHJpdmF0ZToKLSAgICAvLyBUaGlzIHByb3h5IGNsYXNzIHdhcyBuZWVkZWQgdG8gcHJldmVudCBhIGNyYXNoIGluIEF1ZGlvRmxpbmdlcgotICAgIC8vIHdoZW4gdGhlIHN0cmVhbSB3YXMgY2xvc2VkLgotICAgIGNsYXNzIE15TW1hcFN0cmVhbUNhbGxiYWNrIDogcHVibGljIGFuZHJvaWQ6Ok1tYXBTdHJlYW1DYWxsYmFjayB7Ci0gICAgcHVibGljOgotICAgICAgICBleHBsaWNpdCBNeU1tYXBTdHJlYW1DYWxsYmFjayhhbmRyb2lkOjpNbWFwU3RyZWFtQ2FsbGJhY2sgJnNlcnZpY2VDYWxsYmFjaykKLSAgICAgICAgICAgIDogbVNlcnZpY2VDYWxsYmFjayhzZXJ2aWNlQ2FsbGJhY2spe30KLSAgICAgICAgdmlydHVhbCB+TXlNbWFwU3RyZWFtQ2FsbGJhY2soKSA9IGRlZmF1bHQ7CiAKLSAgICAgICAgdm9pZCBvblRlYXJEb3duKCkgb3ZlcnJpZGUgewotICAgICAgICAgICAgbVNlcnZpY2VDYWxsYmFjay5vblRlYXJEb3duKCk7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgdm9pZCBvblZvbHVtZUNoYW5nZWQoYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbHMsIGFuZHJvaWQ6OlZlY3RvcjxmbG9hdD4gdmFsdWVzKSBvdmVycmlkZQotICAgICAgICB7Ci0gICAgICAgICAgICBtU2VydmljZUNhbGxiYWNrLm9uVm9sdW1lQ2hhbmdlZChjaGFubmVscywgdmFsdWVzKTsKLSAgICAgICAgfTsKLQotICAgICAgICB2b2lkIG9uUm91dGluZ0NoYW5nZWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgb3ZlcnJpZGUgewotICAgICAgICAgICAgbVNlcnZpY2VDYWxsYmFjay5vblJvdXRpbmdDaGFuZ2VkKGRldmljZUlkKTsKLSAgICAgICAgfTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGFuZHJvaWQ6Ok1tYXBTdHJlYW1DYWxsYmFjayAmbVNlcnZpY2VDYWxsYmFjazsKLSAgICB9OwotCi0gICAgYW5kcm9pZDo6c3A8TXlNbWFwU3RyZWFtQ2FsbGJhY2s+ICAgbU1tYXBTdHJlYW1DYWxsYmFjazsKLSAgICBNb25vdG9uaWNDb3VudGVyICAgICAgICAgICAgICAgICAgICBtRnJhbWVzV3JpdHRlbjsKLSAgICBNb25vdG9uaWNDb3VudGVyICAgICAgICAgICAgICAgICAgICBtRnJhbWVzUmVhZDsKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNGcmFtZUNvdW50ZXIgPSAwOyAgIC8vIGZyb20gSEFMCi0KLSAgICAvLyBJbnRlcmZhY2UgdG8gdGhlIEF1ZGlvRmxpbmdlciBNTUFQIHN1cHBvcnQuCi0gICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6TW1hcFN0cmVhbUludGVyZmFjZT4gbU1tYXBTdHJlYW07Ci0gICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gICAgICAgICAgICAgbU1tYXBCdWZmZXJpbmZvOwotICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgICAgICAgICAgICAgICAgICAgIG1Qb3J0SGFuZGxlID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKLSAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICAgICAgICAgICAgICAgICAgICBtRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwotICAgIGFuZHJvaWQ6OkF1ZGlvQ2xpZW50ICAgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlQ2xpZW50OwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JblNlcnZpY2UgPSBmYWxzZTsKLSAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgICAgICAgICAgICAgICAgICBtQXVkaW9EYXRhRmlsZURlc2NyaXB0b3I7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgIG1JblNlcnZpY2UgPSBmYWxzZTsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFhdWRpbwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcAppbmRleCA1NjU0MTEzLi4wODRmOTk2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcApAQCAtMTgsNiArMTgsOCBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxtdXRleD4KIAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KQEAgLTQwLDggKzQyLDMyIEBACiAjZGVmaW5lIE1BWF9GUkFNRVNfUEVSX0JVRkZFUiAgICAgICAoMzIgKiAxMDI0KQogCiBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkKEFBdWRpb1NlcnZpY2UgJmF1ZGlvU2VydmljZSkKLSAgICA6IG1BdWRpb1NlcnZpY2UoYXVkaW9TZXJ2aWNlKQotICAgIHsKKyAgICA6IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlKGF1ZGlvU2VydmljZSkKKyAgICAsIG1UaW1lc3RhbXBQb3NpdGlvbk9mZnNldCgwKQorICAgICwgbVhSdW5Db3VudCgwKSB7Cit9CisKK3N0ZDo6c3RyaW5nIEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OmR1bXBIZWFkZXIoKSB7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gcmVzdWx0OworICAgIHJlc3VsdCA8PCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6ZHVtcEhlYWRlcigpOworICAgIHJlc3VsdCA8PCAiICAgIFdyaXRlIyAgICAgUmVhZCMgICBBdmFpbCAgIFhSdW5zIjsKKyAgICByZXR1cm4gcmVzdWx0LnN0cigpOworfQorCitzdGQ6OnN0cmluZyBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpkdW1wKCkgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHJlc3VsdDsKKworICAgIHJlc3VsdCA8PCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6ZHVtcCgpOworCisgICAgYXV0byBmaWZvID0gbUF1ZGlvRGF0YVF1ZXVlLT5nZXRGaWZvQnVmZmVyKCk7CisgICAgaW50MzJfdCByZWFkQ291bnRlciA9IGZpZm8tPmdldFJlYWRDb3VudGVyKCk7CisgICAgaW50MzJfdCB3cml0ZUNvdW50ZXIgPSBmaWZvLT5nZXRXcml0ZUNvdW50ZXIoKTsKKyAgICByZXN1bHQgPDwgc3RkOjpzZXR3KDEwKSA8PCB3cml0ZUNvdW50ZXI7CisgICAgcmVzdWx0IDw8IHN0ZDo6c2V0dygxMCkgPDwgcmVhZENvdW50ZXI7CisgICAgcmVzdWx0IDw8IHN0ZDo6c2V0dyg4KSA8PCAod3JpdGVDb3VudGVyIC0gcmVhZENvdW50ZXIpOworICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoOCkgPDwgZ2V0WFJ1bkNvdW50KCk7CisKKyAgICByZXR1cm4gcmVzdWx0LnN0cigpOwogfQogCiBpbnQzMl90IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OmNhbGN1bGF0ZUJ1ZmZlckNhcGFjaXR5KGludDMyX3QgcmVxdWVzdGVkQ2FwYWNpdHlGcmFtZXMsCkBAIC05MCw4NyArMTE2LDcyIEBACiAgICAgcmV0dXJuIGNhcGFjaXR5SW5GcmFtZXM7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgIGFhdWRpbzo6QUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbk91dHB1dCkgIHsKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgIHsKIAogICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ+IGtlZXAodGhpcyk7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om9wZW4ocmVxdWVzdCwgY29uZmlndXJhdGlvbk91dHB1dCk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKHJlcXVlc3QsIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbUJhc2Ugb3BlbigpIHJldHVybmVkICVkIiwgcmVzdWx0KTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKICAgICBjb25zdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uSW5wdXQgPSByZXF1ZXN0LmdldENvbnN0YW50Q29uZmlndXJhdGlvbigpOwotICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24gPSByZXF1ZXN0LmdldERpcmVjdGlvbigpOwogCi0gICAgQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyICZtRW5kcG9pbnRNYW5hZ2VyID0gQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOwotICAgIG1TZXJ2aWNlRW5kcG9pbnQgPSBtRW5kcG9pbnRNYW5hZ2VyLm9wZW5FbmRwb2ludChtQXVkaW9TZXJ2aWNlLCBjb25maWd1cmF0aW9uT3V0cHV0LCBkaXJlY3Rpb24pOwotICAgIGlmIChtU2VydmljZUVuZHBvaW50ID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6Om9wZW4oKSBtU2VydmljZUVuZFBvaW50ID0gJXAiLCBtU2VydmljZUVuZHBvaW50KTsKLSAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKLSAgICB9CiAKICAgICAvLyBJcyB0aGUgcmVxdWVzdCBjb21wYXRpYmxlIHdpdGggdGhlIHNoYXJlZCBlbmRwb2ludD8KLSAgICBtQXVkaW9Gb3JtYXQgPSBjb25maWd1cmF0aW9uSW5wdXQuZ2V0Rm9ybWF0KCk7Ci0gICAgaWYgKG1BdWRpb0Zvcm1hdCA9PSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgIG1BdWRpb0Zvcm1hdCA9IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUOwotICAgIH0gZWxzZSBpZiAobUF1ZGlvRm9ybWF0ICE9IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpvcGVuKCkgbUF1ZGlvRm9ybWF0ID0gJWQsIG5lZWQgRkxPQVQiLCBtQXVkaW9Gb3JtYXQpOworICAgIHNldEZvcm1hdChjb25maWd1cmF0aW9uSW5wdXQuZ2V0Rm9ybWF0KCkpOworICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgIHNldEZvcm1hdChBQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CisgICAgfSBlbHNlIGlmIChnZXRGb3JtYXQoKSAhPSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6b3BlbigpIG1BdWRpb0Zvcm1hdCA9ICVkLCBuZWVkIEZMT0FUIiwgZ2V0Rm9ybWF0KCkpOwogICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSU5WQUxJRF9GT1JNQVQ7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCi0gICAgbVNhbXBsZVJhdGUgPSBjb25maWd1cmF0aW9uSW5wdXQuZ2V0U2FtcGxlUmF0ZSgpOwotICAgIGlmIChtU2FtcGxlUmF0ZSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgbVNhbXBsZVJhdGUgPSBtU2VydmljZUVuZHBvaW50LT5nZXRTYW1wbGVSYXRlKCk7Ci0gICAgfSBlbHNlIGlmIChtU2FtcGxlUmF0ZSAhPSBtU2VydmljZUVuZHBvaW50LT5nZXRTYW1wbGVSYXRlKCkpIHsKKyAgICBzZXRTYW1wbGVSYXRlKGNvbmZpZ3VyYXRpb25JbnB1dC5nZXRTYW1wbGVSYXRlKCkpOworICAgIGlmIChnZXRTYW1wbGVSYXRlKCkgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgIHNldFNhbXBsZVJhdGUobVNlcnZpY2VFbmRwb2ludC0+Z2V0U2FtcGxlUmF0ZSgpKTsKKyAgICB9IGVsc2UgaWYgKGdldFNhbXBsZVJhdGUoKSAhPSBtU2VydmljZUVuZHBvaW50LT5nZXRTYW1wbGVSYXRlKCkpIHsKICAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6Om9wZW4oKSBtU2FtcGxlUmF0ZSA9ICVkLCBuZWVkICVkIiwKLSAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG1TZXJ2aWNlRW5kcG9pbnQtPmdldFNhbXBsZVJhdGUoKSk7CisgICAgICAgICAgICAgIGdldFNhbXBsZVJhdGUoKSwgbVNlcnZpY2VFbmRwb2ludC0+Z2V0U2FtcGxlUmF0ZSgpKTsKICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0lOVkFMSURfUkFURTsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKLSAgICBtU2FtcGxlc1BlckZyYW1lID0gY29uZmlndXJhdGlvbklucHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOwotICAgIGlmIChtU2FtcGxlc1BlckZyYW1lID09IEFBVURJT19VTlNQRUNJRklFRCkgewotICAgICAgICBtU2FtcGxlc1BlckZyYW1lID0gbVNlcnZpY2VFbmRwb2ludC0+Z2V0U2FtcGxlc1BlckZyYW1lKCk7Ci0gICAgfSBlbHNlIGlmIChtU2FtcGxlc1BlckZyYW1lICE9IG1TZXJ2aWNlRW5kcG9pbnQtPmdldFNhbXBsZXNQZXJGcmFtZSgpKSB7CisgICAgc2V0U2FtcGxlc1BlckZyYW1lKGNvbmZpZ3VyYXRpb25JbnB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKSk7CisgICAgaWYgKGdldFNhbXBsZXNQZXJGcmFtZSgpID09IEFBVURJT19VTlNQRUNJRklFRCkgeworICAgICAgICBzZXRTYW1wbGVzUGVyRnJhbWUobVNlcnZpY2VFbmRwb2ludC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpOworICAgIH0gZWxzZSBpZiAoZ2V0U2FtcGxlc1BlckZyYW1lKCkgIT0gbVNlcnZpY2VFbmRwb2ludC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpIHsKICAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6Om9wZW4oKSBtU2FtcGxlc1BlckZyYW1lID0gJWQsIG5lZWQgJWQiLAotICAgICAgICAgICAgICBtU2FtcGxlc1BlckZyYW1lLCBtU2VydmljZUVuZHBvaW50LT5nZXRTYW1wbGVzUGVyRnJhbWUoKSk7CisgICAgICAgICAgICAgIGdldFNhbXBsZXNQZXJGcmFtZSgpLCBtU2VydmljZUVuZHBvaW50LT5nZXRTYW1wbGVzUGVyRnJhbWUoKSk7CiAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCi0gICAgbUZyYW1lc1BlckJ1cnN0ID0gbVNlcnZpY2VFbmRwb2ludC0+Z2V0RnJhbWVzUGVyQnVyc3QoKTsKLSAgICBBTE9HRCgiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6b3BlbigpIG1TYW1wbGVSYXRlID0gJWQsIG1GcmFtZXNQZXJCdXJzdCA9ICVkIiwKLSAgICAgICAgICBtU2FtcGxlUmF0ZSwgbUZyYW1lc1BlckJ1cnN0KTsKLQotICAgIG1DYXBhY2l0eUluRnJhbWVzID0gY2FsY3VsYXRlQnVmZmVyQ2FwYWNpdHkoY29uZmlndXJhdGlvbklucHV0LmdldEJ1ZmZlckNhcGFjaXR5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1BlckJ1cnN0KTsKLSAgICBpZiAobUNhcGFjaXR5SW5GcmFtZXMgPCAwKSB7Ci0gICAgICAgIHJlc3VsdCA9IG1DYXBhY2l0eUluRnJhbWVzOyAvLyBuZWdhdGl2ZSBlcnJvciBjb2RlCi0gICAgICAgIG1DYXBhY2l0eUluRnJhbWVzID0gMDsKKyAgICBzZXRCdWZmZXJDYXBhY2l0eShjYWxjdWxhdGVCdWZmZXJDYXBhY2l0eShjb25maWd1cmF0aW9uSW5wdXQuZ2V0QnVmZmVyQ2FwYWNpdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzUGVyQnVyc3QpKTsKKyAgICBpZiAoZ2V0QnVmZmVyQ2FwYWNpdHkoKSA8IDApIHsKKyAgICAgICAgcmVzdWx0ID0gZ2V0QnVmZmVyQ2FwYWNpdHkoKTsgLy8gbmVnYXRpdmUgZXJyb3IgY29kZQorICAgICAgICBzZXRCdWZmZXJDYXBhY2l0eSgwKTsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKLSAgICAvLyBDcmVhdGUgYXVkaW8gZGF0YSBzaGFyZWQgbWVtb3J5IGJ1ZmZlciBmb3IgY2xpZW50LgotICAgIG1BdWRpb0RhdGFRdWV1ZSA9IG5ldyBTaGFyZWRSaW5nQnVmZmVyKCk7Ci0gICAgcmVzdWx0ID0gbUF1ZGlvRGF0YVF1ZXVlLT5hbGxvY2F0ZShjYWxjdWxhdGVCeXRlc1BlckZyYW1lKCksIG1DYXBhY2l0eUluRnJhbWVzKTsKLSAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6b3BlbigpIGNvdWxkIG5vdCBhbGxvY2F0ZSBGSUZPIHdpdGggJWQgZnJhbWVzIiwKLSAgICAgICAgICAgICAgbUNhcGFjaXR5SW5GcmFtZXMpOwotICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfTk9fTUVNT1JZOwotICAgICAgICBnb3RvIGVycm9yOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUF1ZGlvRGF0YVF1ZXVlTG9jayk7CisgICAgICAgIC8vIENyZWF0ZSBhdWRpbyBkYXRhIHNoYXJlZCBtZW1vcnkgYnVmZmVyIGZvciBjbGllbnQuCisgICAgICAgIG1BdWRpb0RhdGFRdWV1ZSA9IG5ldyBTaGFyZWRSaW5nQnVmZmVyKCk7CisgICAgICAgIHJlc3VsdCA9IG1BdWRpb0RhdGFRdWV1ZS0+YWxsb2NhdGUoY2FsY3VsYXRlQnl0ZXNQZXJGcmFtZSgpLCBnZXRCdWZmZXJDYXBhY2l0eSgpKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpvcGVuKCkgY291bGQgbm90IGFsbG9jYXRlIEZJRk8gd2l0aCAlZCBmcmFtZXMiLAorICAgICAgICAgICAgICAgICAgZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CisgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfTk9fTUVNT1JZOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpvcGVuKCkgYWN0dWFsIHJhdGUgPSAlZCwgY2hhbm5lbHMgPSAlZCwgZGV2aWNlSWQgPSAlZCIsCi0gICAgICAgICAgbVNhbXBsZVJhdGUsIG1TYW1wbGVzUGVyRnJhbWUsIG1TZXJ2aWNlRW5kcG9pbnQtPmdldERldmljZUlkKCkpOwotCi0gICAgLy8gRmlsbCBpbiBjb25maWd1cmF0aW9uIGZvciBjbGllbnQuCi0gICAgY29uZmlndXJhdGlvbk91dHB1dC5zZXRTYW1wbGVSYXRlKG1TYW1wbGVSYXRlKTsKLSAgICBjb25maWd1cmF0aW9uT3V0cHV0LnNldFNhbXBsZXNQZXJGcmFtZShtU2FtcGxlc1BlckZyYW1lKTsKLSAgICBjb25maWd1cmF0aW9uT3V0cHV0LnNldEZvcm1hdChtQXVkaW9Gb3JtYXQpOwotICAgIGNvbmZpZ3VyYXRpb25PdXRwdXQuc2V0RGV2aWNlSWQobVNlcnZpY2VFbmRwb2ludC0+Z2V0RGV2aWNlSWQoKSk7CisgICAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpLCBnZXRTYW1wbGVzUGVyRnJhbWUoKSwgbVNlcnZpY2VFbmRwb2ludC0+Z2V0RGV2aWNlSWQoKSk7CiAKICAgICByZXN1bHQgPSBtU2VydmljZUVuZHBvaW50LT5yZWdpc3RlclN0cmVhbShrZWVwKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewpAQCAtMTg1LDEyMSArMTk2LDMwIEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotLyoqCi0gKiBTdGFydCB0aGUgZmxvdyBvZiBhdWRpbyBkYXRhLgotICoKLSAqIEFuIEFBVURJT19TRVJWSUNFX0VWRU5UX1NUQVJURUQgd2lsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQgd2hlbiBjb21wbGV0ZS4KLSAqLwotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OnN0YXJ0KCkgIHsKLSAgICBpZiAoaXNSdW5uaW5nKCkpIHsKLSAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKLSAgICB9Ci0gICAgQUF1ZGlvU2VydmljZUVuZHBvaW50ICplbmRwb2ludCA9IG1TZXJ2aWNlRW5kcG9pbnQ7Ci0gICAgaWYgKGVuZHBvaW50ID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwotICAgIH0KLSAgICAvLyBGb3Igb3V0cHV0IHN0cmVhbXMsIHRoaXMgd2lsbCBhZGQgdGhlIHN0cmVhbSB0byB0aGUgbWl4ZXIuCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGVuZHBvaW50LT5zdGFydFN0cmVhbSh0aGlzKTsKLSAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6c3RhcnQoKSBtU2VydmljZUVuZHBvaW50IHJldHVybmVkICVkIiwgcmVzdWx0KTsKLSAgICAgICAgZGlzY29ubmVjdCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdCA9IGVuZHBvaW50LT5nZXRTdHJlYW1JbnRlcm5hbCgpLT5zdGFydENsaWVudChtTW1hcENsaWVudCwgJm1DbGllbnRIYW5kbGUpOwotICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgewotICAgICAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBTdG9wIHRoZSBmbG93IG9mIGRhdGEgc28gdGhhdCBzdGFydCgpIGNhbiByZXN1bWUgd2l0aG91dCBsb3NzIG9mIGRhdGEuCi0gKgotICogQW4gQUFVRElPX1NFUlZJQ0VfRVZFTlRfUEFVU0VEIHdpbGwgYmUgc2VudCB0byB0aGUgY2xpZW50IHdoZW4gY29tcGxldGUuCi0qLwotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OnBhdXNlKCkgIHsKLSAgICBpZiAoIWlzUnVubmluZygpKSB7Ci0gICAgICAgIHJldHVybiBBQVVESU9fT0s7Ci0gICAgfQotICAgIEFBdWRpb1NlcnZpY2VFbmRwb2ludCAqZW5kcG9pbnQgPSBtU2VydmljZUVuZHBvaW50OwotICAgIGlmIChlbmRwb2ludCA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKLSAgICB9Ci0gICAgZW5kcG9pbnQtPmdldFN0cmVhbUludGVybmFsKCktPnN0b3BDbGllbnQobUNsaWVudEhhbmRsZSk7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGVuZHBvaW50LT5zdG9wU3RyZWFtKHRoaXMpOwotICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpwYXVzZSgpIG1TZXJ2aWNlRW5kcG9pbnQgcmV0dXJuZWQgJWQiLCByZXN1bHQpOwotICAgICAgICBkaXNjb25uZWN0KCk7IC8vIFRPRE8gc2hvdWxkIHdlIHJldHVybiBvciBwYXVzZSBCYXNlIGZpcnN0PwotICAgIH0KLSAgICByZXR1cm4gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnBhdXNlKCk7Ci19Ci0KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpzdG9wKCkgIHsKLSAgICBpZiAoIWlzUnVubmluZygpKSB7Ci0gICAgICAgIHJldHVybiBBQVVESU9fT0s7Ci0gICAgfQotICAgIEFBdWRpb1NlcnZpY2VFbmRwb2ludCAqZW5kcG9pbnQgPSBtU2VydmljZUVuZHBvaW50OwotICAgIGlmIChlbmRwb2ludCA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKLSAgICB9Ci0gICAgZW5kcG9pbnQtPmdldFN0cmVhbUludGVybmFsKCktPnN0b3BDbGllbnQobUNsaWVudEhhbmRsZSk7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGVuZHBvaW50LT5zdG9wU3RyZWFtKHRoaXMpOwotICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpzdG9wKCkgbVNlcnZpY2VFbmRwb2ludCByZXR1cm5lZCAlZCIsIHJlc3VsdCk7Ci0gICAgICAgIGRpc2Nvbm5lY3QoKTsKLSAgICB9Ci0gICAgcmV0dXJuIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpzdG9wKCk7Ci19Ci0KLS8qKgotICogIERpc2NhcmQgYW55IGRhdGEgaGVsZCBieSB0aGUgdW5kZXJseWluZyBIQUwgb3IgU2VydmljZS4KLSAqCi0gKiBBbiBBQVVESU9fU0VSVklDRV9FVkVOVF9GTFVTSEVEIHdpbGwgYmUgc2VudCB0byB0aGUgY2xpZW50IHdoZW4gY29tcGxldGUuCi0gKi8KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpmbHVzaCgpICB7Ci0gICAgQUF1ZGlvU2VydmljZUVuZHBvaW50ICplbmRwb2ludCA9IG1TZXJ2aWNlRW5kcG9pbnQ7Ci0gICAgaWYgKGVuZHBvaW50ID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwotICAgIH0KLSAgICBpZiAobVN0YXRlICE9IEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VEKSB7Ci0gICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6Zmx1c2goKSBzdHJlYW0gbm90IHBhdXNlZCwgc3RhdGUgPSAlcyIsCi0gICAgICAgICAgICBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KG1TdGF0ZSkpOwotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7Ci0gICAgfQotICAgIC8vIERhdGEgd2lsbCBnZXQgZmx1c2hlZCB3aGVuIHRoZSBjbGllbnQgcmVjZWl2ZXMgdGhlIEZMVVNIRUQgZXZlbnQuCi0gICAgcmV0dXJuIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpmbHVzaCgpOwotfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6Y2xvc2UoKSAgewotICAgIGlmIChtU3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQpIHsKLSAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKLSAgICB9CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpjbG9zZSgpOwogCi0gICAgc3RvcCgpOwotCi0gICAgQUF1ZGlvU2VydmljZUVuZHBvaW50ICplbmRwb2ludCA9IG1TZXJ2aWNlRW5kcG9pbnQ7Ci0gICAgaWYgKGVuZHBvaW50ID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwotICAgIH0KLQotICAgIGVuZHBvaW50LT51bnJlZ2lzdGVyU3RyZWFtKHRoaXMpOwotCi0gICAgQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyICZtRW5kcG9pbnRNYW5hZ2VyID0gQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOwotICAgIG1FbmRwb2ludE1hbmFnZXIuY2xvc2VFbmRwb2ludChlbmRwb2ludCk7Ci0gICAgbVNlcnZpY2VFbmRwb2ludCA9IG51bGxwdHI7Ci0KLSAgICBpZiAobUF1ZGlvRGF0YVF1ZXVlICE9IG51bGxwdHIpIHsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BdWRpb0RhdGFRdWV1ZUxvY2spOwogICAgICAgICBkZWxldGUgbUF1ZGlvRGF0YVF1ZXVlOwogICAgICAgICBtQXVkaW9EYXRhUXVldWUgPSBudWxscHRyOwogICAgIH0KLSAgICByZXR1cm4gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmNsb3NlKCk7CisKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKioKICAqIEdldCBhbiBpbW11dGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGRhdGEgcXVldWUgY3JlYXRlZCBieSB0aGlzIHNlcnZpY2UuCiAgKi8KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpnZXREb3duRGF0YURlc2NyaXB0aW9uKEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKQorYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OmdldEF1ZGlvRGF0YURlc2NyaXB0aW9uKAorICAgICAgICBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkKIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQXVkaW9EYXRhUXVldWVMb2NrKTsKKyAgICBpZiAobUF1ZGlvRGF0YVF1ZXVlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoImdldEF1ZGlvRGF0YURlc2NyaXB0aW9uKCk6IG1VcE1lc3NhZ2VRdWV1ZSBudWxsISAtIHN0cmVhbSBub3Qgb3BlbiIpOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX05VTEw7CisgICAgfQogICAgIC8vIEdhdGhlciBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBxdWV1ZS4KICAgICBtQXVkaW9EYXRhUXVldWUtPmZpbGxQYXJjZWxhYmxlKHBhcmNlbGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJjZWxhYmxlLm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZSk7CkBAIC0zMDcsMTUgKzIyNywzNyBAQAogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKLXZvaWQgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6bWFya1RyYW5zZmVyVGltZShpbnQ2NF90IG5hbm9zZWNvbmRzKSB7Ci0gICAgbU1hcmtlZFBvc2l0aW9uID0gbUF1ZGlvRGF0YVF1ZXVlLT5nZXRGaWZvQnVmZmVyKCktPmdldFJlYWRDb3VudGVyKCk7Ci0gICAgbU1hcmtlZFRpbWUgPSBuYW5vc2Vjb25kczsKK3ZvaWQgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6bWFya1RyYW5zZmVyVGltZShUaW1lc3RhbXAgJnRpbWVzdGFtcCkgeworICAgIG1BdG9taWNUaW1lc3RhbXAud3JpdGUodGltZXN0YW1wKTsKIH0KIAorLy8gR2V0IHRpbWVzdGFtcCB0aGF0IHdhcyB3cml0dGVuIGJ5IG1peGVyIG9yIGRpc3RyaWJ1dG9yLgogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OmdldEZyZWVSdW5uaW5nUG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3MpIHsKKyAgICAvLyBUT0RPIEdldCBwcmVzZW50YXRpb24gdGltZXN0YW1wIGZyb20gdGhlIEhBTAorICAgIGlmIChtQXRvbWljVGltZXN0YW1wLmlzVmFsaWQoKSkgeworICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gbUF0b21pY1RpbWVzdGFtcC5yZWFkKCk7CisgICAgICAgICpwb3NpdGlvbkZyYW1lcyA9IHRpbWVzdGFtcC5nZXRQb3NpdGlvbigpOworICAgICAgICAqdGltZU5hbm9zID0gdGltZXN0YW1wLmdldE5hbm9zZWNvbmRzKCk7CisgICAgICAgIHJldHVybiBBQVVESU9fT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKKyAgICB9Cit9CisKKy8vIEdldCB0aW1lc3RhbXAgZnJvbSBsb3dlciBsZXZlbCBzZXJ2aWNlLgorYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OmdldEhhcmR3YXJlVGltZXN0YW1wKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vcykgewotICAgIC8vIFRPRE8gZ2V0IHRoZXNlIHR3byBudW1iZXJzIGFzIGFuIGF0b21pYyBwYWlyCi0gICAgKnBvc2l0aW9uRnJhbWVzID0gbU1hcmtlZFBvc2l0aW9uOwotICAgICp0aW1lTmFub3MgPSBtTWFya2VkVGltZTsKLSAgICByZXR1cm4gQUFVRElPX09LOworCisgICAgaW50NjRfdCBwb3NpdGlvbiA9IDA7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IG1TZXJ2aWNlRW5kcG9pbnQtPmdldFRpbWVzdGFtcCgmcG9zaXRpb24sIHRpbWVOYW5vcyk7CisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgaW50NjRfdCBvZmZzZXQgPSBtVGltZXN0YW1wUG9zaXRpb25PZmZzZXQubG9hZCgpOworICAgICAgICAvLyBUT0RPLCBkbyBub3QgZ28gYmVsb3cgc3RhcnRpbmcgdmFsdWUKKyAgICAgICAgcG9zaXRpb24gLT0gb2Zmc2V0OyAvLyBPZmZzZXQgZnJvbSBzaGFyZWQgTU1BUCBzdHJlYW0KKyAgICAgICAgQUxPR1YoImdldEhhcmR3YXJlVGltZXN0YW1wKCkgJThsbGQgPSAlOGxsZCAtICU4bGxkIiwKKyAgICAgICAgICAgICAgKGxvbmcgbG9uZykgcG9zaXRpb24sIChsb25nIGxvbmcpIChwb3NpdGlvbiArIG9mZnNldCksIChsb25nIGxvbmcpIG9mZnNldCk7CisgICAgfQorICAgICpwb3NpdGlvbkZyYW1lcyA9IHBvc2l0aW9uOworICAgIHJldHVybiByZXN1bHQ7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmgKaW5kZXggNmI2NzMzNy4uODQ5OWVhNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuaApAQCAtNDYsNTMgKzQ2LDU1IEBACiAgICAgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZChhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlICZhQXVkaW9TZXJ2aWNlKTsKICAgICB2aXJ0dWFsIH5BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkKCkgPSBkZWZhdWx0OwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpbzo6QUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbk91dHB1dCkgb3ZlcnJpZGU7CisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGR1bXBIZWFkZXIoKTsKIAotICAgIC8qKgotICAgICAqIFN0YXJ0IHRoZSBmbG93IG9mIGF1ZGlvIGRhdGEuCi0gICAgICoKLSAgICAgKiBUaGlzIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHN5bmNocm9ub3VzIGJ1dCBpdCBjdXJyZW50bHkgaXMuCi0gICAgICogQW4gQUFVRElPX1NFUlZJQ0VfRVZFTlRfU1RBUlRFRCB3aWxsIGJlIHNlbnQgdG8gdGhlIGNsaWVudCB3aGVuIGNvbXBsZXRlLgotICAgICAqLwotICAgIGFhdWRpb19yZXN1bHRfdCBzdGFydCgpIG92ZXJyaWRlOworICAgIHN0ZDo6c3RyaW5nIGR1bXAoKSBjb25zdCBvdmVycmlkZTsKIAotICAgIC8qKgotICAgICAqIFN0b3AgdGhlIGZsb3cgb2YgZGF0YSBzbyB0aGF0IHN0YXJ0KCkgY2FuIHJlc3VtZSB3aXRob3V0IGxvc3Mgb2YgZGF0YS4KLSAgICAgKgotICAgICAqIFRoaXMgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgc3luY2hyb25vdXMgYnV0IGl0IGN1cnJlbnRseSBpcy4KLSAgICAgKiBBbiBBQVVESU9fU0VSVklDRV9FVkVOVF9QQVVTRUQgd2lsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQgd2hlbiBjb21wbGV0ZS4KLSAgICAqLwotICAgIGFhdWRpb19yZXN1bHRfdCBwYXVzZSgpIG92ZXJyaWRlOwotCi0gICAgLyoqCi0gICAgICogU3RvcCB0aGUgZmxvdyBvZiBkYXRhIGFmdGVyIGRhdGEgaW4gYnVmZmVyIGhhcyBwbGF5ZWQuCi0gICAgICovCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHN0b3AoKSBvdmVycmlkZTsKLQotICAgIC8qKgotICAgICAqICBEaXNjYXJkIGFueSBkYXRhIGhlbGQgYnkgdGhlIHVuZGVybHlpbmcgSEFMIG9yIFNlcnZpY2UuCi0gICAgICoKLSAgICAgKiBUaGlzIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHN5bmNocm9ub3VzIGJ1dCBpdCBjdXJyZW50bHkgaXMuCi0gICAgICogQW4gQUFVRElPX1NFUlZJQ0VfRVZFTlRfRkxVU0hFRCB3aWxsIGJlIHNlbnQgdG8gdGhlIGNsaWVudCB3aGVuIGNvbXBsZXRlLgotICAgICAqLwotICAgIGFhdWRpb19yZXN1bHRfdCBmbHVzaCgpIG92ZXJyaWRlOworICAgIGFhdWRpb19yZXN1bHRfdCBvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgb3ZlcnJpZGU7CiAKICAgICBhYXVkaW9fcmVzdWx0X3QgY2xvc2UoKSBvdmVycmlkZTsKIAotICAgIGFuZHJvaWQ6OkZpZm9CdWZmZXIgKmdldERhdGFGaWZvQnVmZmVyKCkgeyByZXR1cm4gbUF1ZGlvRGF0YVF1ZXVlLT5nZXRGaWZvQnVmZmVyKCk7IH0KKyAgICAvKioKKyAgICAgKiBUaGlzIG11c3QgYmUgbG9ja2VkIHdoZW4gY2FsbGluZyBnZXRBdWRpb0RhdGFGaWZvQnVmZmVyX2woKSBhbmQgd2hpbGUKKyAgICAgKiB1c2luZyB0aGUgRmlmb0J1ZmZlciBpdCByZXR1cm5zLgorICAgICAqLworICAgIHN0ZDo6bXV0ZXggJmdldEF1ZGlvRGF0YVF1ZXVlTG9jaygpIHsKKyAgICAgICAgcmV0dXJuIG1BdWRpb0RhdGFRdWV1ZUxvY2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtdXN0IG9ubHkgYmUgY2FsbCB1bmRlciBnZXRBdWRpb0RhdGFRdWV1ZUxvY2soKS4KKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgYW5kcm9pZDo6Rmlmb0J1ZmZlciAqZ2V0QXVkaW9EYXRhRmlmb0J1ZmZlcl9sKCkgeyByZXR1cm4gKG1BdWRpb0RhdGFRdWV1ZSA9PSBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxscHRyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1BdWRpb0RhdGFRdWV1ZS0+Z2V0Rmlmb0J1ZmZlcigpOyB9CiAKICAgICAvKiBLZWVwIGEgcmVjb3JkIG9mIHdoZW4gYSBidWZmZXIgdHJhbnNmZXIgY29tcGxldGVkLgogICAgICAqIFRoaXMgYWxsb3dzIGZvciBhIG1vcmUgYWNjdXJhdGUgdGltaW5nIG1vZGVsLgogICAgICAqLwotICAgIHZvaWQgbWFya1RyYW5zZmVyVGltZShpbnQ2NF90IG5hbm9zZWNvbmRzKTsKKyAgICB2b2lkIG1hcmtUcmFuc2ZlclRpbWUoVGltZXN0YW1wICZ0aW1lc3RhbXApOworCisgICAgdm9pZCBzZXRUaW1lc3RhbXBQb3NpdGlvbk9mZnNldChpbnQ2NF90IGRlbHRhRnJhbWVzKSB7CisgICAgICAgIG1UaW1lc3RhbXBQb3NpdGlvbk9mZnNldC5zdG9yZShkZWx0YUZyYW1lcyk7CisgICAgfQorCisgICAgdm9pZCBpbmNyZW1lbnRYUnVuQ291bnQoKSB7CisgICAgICAgIG1YUnVuQ291bnQrKzsKKyAgICB9CisKKyAgICBpbnQzMl90IGdldFhSdW5Db3VudCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1YUnVuQ291bnQubG9hZCgpOworICAgIH0KIAogcHJvdGVjdGVkOgogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IGdldERvd25EYXRhRGVzY3JpcHRpb24oQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpIG92ZXJyaWRlOworICAgIGFhdWRpb19yZXN1bHRfdCBnZXRBdWRpb0RhdGFEZXNjcmlwdGlvbihBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkgb3ZlcnJpZGU7CiAKICAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0RnJlZVJ1bm5pbmdQb3NpdGlvbihpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywgaW50NjRfdCAqdGltZU5hbm9zKSBvdmVycmlkZTsKIAorICAgIGFhdWRpb19yZXN1bHRfdCBnZXRIYXJkd2FyZVRpbWVzdGFtcChpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywgaW50NjRfdCAqdGltZU5hbm9zKSBvdmVycmlkZTsKKwogICAgIC8qKgogICAgICAqIEBwYXJhbSByZXF1ZXN0ZWRDYXBhY2l0eUZyYW1lcwogICAgICAqIEBwYXJhbSBmcmFtZXNQZXJCdXJzdApAQCAtMTAyLDEyICsxMDQsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZXNQZXJCdXJzdCk7CiAKIHByaXZhdGU6Ci0gICAgYW5kcm9pZDo6QUF1ZGlvU2VydmljZSAgJm1BdWRpb1NlcnZpY2U7Ci0gICAgQUF1ZGlvU2VydmljZUVuZHBvaW50ICAgKm1TZXJ2aWNlRW5kcG9pbnQgPSBudWxscHRyOwotICAgIFNoYXJlZFJpbmdCdWZmZXIgICAgICAgICptQXVkaW9EYXRhUXVldWUgPSBudWxscHRyOworICAgIFNoYXJlZFJpbmdCdWZmZXIgICAgICAgICptQXVkaW9EYXRhUXVldWUgPSBudWxscHRyOyAvLyBwcm90ZWN0ZWQgYnkgbUF1ZGlvRGF0YVF1ZXVlTG9jaworICAgIHN0ZDo6bXV0ZXggICAgICAgICAgICAgICBtQXVkaW9EYXRhUXVldWVMb2NrOwogCi0gICAgaW50NjRfdCAgICAgICAgICAgICAgICAgIG1NYXJrZWRQb3NpdGlvbiA9IDA7Ci0gICAgaW50NjRfdCAgICAgICAgICAgICAgICAgIG1NYXJrZWRUaW1lID0gMDsKKyAgICBzdGQ6OmF0b21pYzxpbnQ2NF90PiAgICAgbVRpbWVzdGFtcFBvc2l0aW9uT2Zmc2V0OworICAgIHN0ZDo6YXRvbWljPGludDMyX3Q+ICAgICBtWFJ1bkNvdW50OworCiB9OwogCiB9IC8qIG5hbWVzcGFjZSBhYXVkaW8gKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1N0cmVhbVRyYWNrZXIuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU3RyZWFtVHJhY2tlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY4OGIzNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1N0cmVhbVRyYWNrZXIuY3BwCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBQXVkaW9TdHJlYW1UcmFja2VyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisKKyNpbmNsdWRlICJBQXVkaW9TdHJlYW1UcmFja2VyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKKworc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IEFBdWRpb1N0cmVhbVRyYWNrZXI6OnJlbW92ZVN0cmVhbUJ5SGFuZGxlKAorICAgICAgICBhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUhhbmRsZUxvY2spOworICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtOworICAgIGF1dG8gaXQgPSBtU3RyZWFtc0J5SGFuZGxlLmZpbmQoc3RyZWFtSGFuZGxlKTsKKyAgICBpZiAoaXQgIT0gbVN0cmVhbXNCeUhhbmRsZS5lbmQoKSkgeworICAgICAgICBzZXJ2aWNlU3RyZWFtID0gaXQtPnNlY29uZDsKKyAgICAgICAgbVN0cmVhbXNCeUhhbmRsZS5lcmFzZShpdCk7CisgICAgfQorICAgIHJldHVybiBzZXJ2aWNlU3RyZWFtOworfQorCitzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gQUF1ZGlvU3RyZWFtVHJhY2tlcjo6Z2V0U3RyZWFtQnlIYW5kbGUoCisgICAgICAgIGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSGFuZGxlTG9jayk7CisgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW07CisgICAgYXV0byBpdCA9IG1TdHJlYW1zQnlIYW5kbGUuZmluZChzdHJlYW1IYW5kbGUpOworICAgIGlmIChpdCAhPSBtU3RyZWFtc0J5SGFuZGxlLmVuZCgpKSB7CisgICAgICAgIHNlcnZpY2VTdHJlYW0gPSBpdC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gc2VydmljZVN0cmVhbTsKK30KKworLy8gYWR2YW5jZSB0byBuZXh0IGxlZ2FsIGhhbmRsZSB2YWx1ZQorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoImludGVnZXIiKSkpCithYXVkaW9faGFuZGxlX3QgQUF1ZGlvU3RyZWFtVHJhY2tlcjo6YnVtcEhhbmRsZShhYXVkaW9faGFuZGxlX3QgaGFuZGxlKSB7CisgICAgaGFuZGxlKys7CisgICAgLy8gT25seSB1c2UgcG9zaXRpdmUgaW50ZWdlcnMuCisgICAgaWYgKGhhbmRsZSA8PSAwKSB7CisgICAgICAgIGhhbmRsZSA9IDE7CisgICAgfQorICAgIHJldHVybiBoYW5kbGU7Cit9CisKK2FhdWRpb19oYW5kbGVfdCBBQXVkaW9TdHJlYW1UcmFja2VyOjphZGRTdHJlYW1Gb3JIYW5kbGUoc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0pIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSGFuZGxlTG9jayk7CisgICAgYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSA9IG1QcmV2aW91c0hhbmRsZS5sb2FkKCk7CisgICAgLy8gQXNzaWduIGEgdW5pcXVlIGhhbmRsZS4KKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBoYW5kbGUgPSBidW1wSGFuZGxlKGhhbmRsZSk7CisgICAgICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBvbGRTZXJ2aWNlU3RyZWFtID0gbVN0cmVhbXNCeUhhbmRsZVtoYW5kbGVdOworICAgICAgICAvLyBJcyB0aGlzIGFuIHVudXNlZCBoYW5kbGU/IEl0IHdvdWxkIGJlIGV4dHJlbWVseSB1bmxpa2VseSB0byB3cmFwCisgICAgICAgIC8vIGFyb3VuZCBhbmQgY29sbGlkZSB3aXRoIGEgdmVyeSBvbGQgaGFuZGxlLiBCdXQganVzdCBpbiBjYXNlLgorICAgICAgICBpZiAob2xkU2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtU3RyZWFtc0J5SGFuZGxlW2hhbmRsZV0gPSBzZXJ2aWNlU3RyZWFtOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgbVByZXZpb3VzSGFuZGxlLnN0b3JlKGhhbmRsZSk7CisgICAgcmV0dXJuIGhhbmRsZTsKK30KKworc3RkOjpzdHJpbmcgQUF1ZGlvU3RyZWFtVHJhY2tlcjo6ZHVtcCgpIGNvbnN0IHsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSByZXN1bHQ7CisgICAgY29uc3QgYm9vbCBpc0xvY2tlZCA9IEFBdWRpb190cnlVbnRpbFRydWUoCisgICAgICAgICAgICBbdGhpc10oKS0+Ym9vbCB7IHJldHVybiBtSGFuZGxlTG9jay50cnlfbG9jaygpOyB9IC8qIGYgKi8sCisgICAgICAgICAgICA1MCAvKiB0aW1lcyAqLywKKyAgICAgICAgICAgIDIwIC8qIHNsZWVwTXMgKi8pOworICAgIGlmICghaXNMb2NrZWQpIHsKKyAgICAgICAgcmVzdWx0IDw8ICJBQXVkaW9TdHJlYW1UcmFja2VyIG1heSBiZSBkZWFkbG9ja2VkXG4iOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA8PCAiU3RyZWFtIEhhbmRsZXM6XG4iOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mICBpdCA6IG1TdHJlYW1zQnlIYW5kbGUpIHsKKyAgICAgICAgICAgIGFhdWRpb19oYW5kbGVfdCBoYW5kbGUgPSBpdC5zZWNvbmQtPmdldEhhbmRsZSgpOworICAgICAgICAgICAgcmVzdWx0IDw8ICIgICAgMHgiIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6c2V0dyg4KSA8PCBzdGQ6OmhleCA8PCBoYW5kbGUKKyAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmRlYyA8PCBzdGQ6OnNldGZpbGwoJyAnKSA8PCAiXG4iOworICAgICAgICB9CisKKyAgICAgICAgbUhhbmRsZUxvY2sudW5sb2NrKCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQuc3RyKCk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TdHJlYW1UcmFja2VyLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TdHJlYW1UcmFja2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBkNDQwZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1N0cmVhbVRyYWNrZXIuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBQVVESU9fQUFVRElPX1NUUkVBTV9UUkFDS0VSX0gKKyNkZWZpbmUgQUFVRElPX0FBVURJT19TVFJFQU1fVFJBQ0tFUl9ICisKKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorCisjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9Db21tb24uaCIKKworI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgiCisKK25hbWVzcGFjZSBhYXVkaW8geworCitjbGFzcyBBQXVkaW9TdHJlYW1UcmFja2VyIHsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgc3RyZWFtIGFzc29jaWF0ZWQgd2l0aCB0aGUgaGFuZGxlLgorICAgICAqIEBwYXJhbSBzdHJlYW1IYW5kbGUKKyAgICAgKiBAcmV0dXJuIHN0cm9uZyBwb2ludGVyIHRvIHRoZSBzdHJlYW0gaWYgZm91bmQgb3IgdG8gbnVsbHB0cgorICAgICAqLworICAgIGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiByZW1vdmVTdHJlYW1CeUhhbmRsZShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIExvb2sgdXAgYSBzdHJlYW0gYmFzZWQgb24gdGhlIGhhbmRsZS4KKyAgICAgKiBAcGFyYW0gc3RyZWFtSGFuZGxlCisgICAgICogQHJldHVybiBzdHJvbmcgcG9pbnRlciB0byB0aGUgc3RyZWFtIGlmIGZvdW5kIG9yIHRvIG51bGxwdHIKKyAgICAgKi8KKyAgICBhbmRyb2lkOjpzcDxhYXVkaW86OkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBnZXRTdHJlYW1CeUhhbmRsZShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIFN0b3JlIGEgc3Ryb25nIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSBhbmQgcmV0dXJuIGEgdW5pcXVlIGhhbmRsZSBmb3IgZnV0dXJlIHJlZmVyZW5jZS4KKyAgICAgKiBUaGUgaGFuZGxlIGlzIGd1YXJhbnRlZWQgbm90IHRvIGNvbGxpZGUgd2l0aCBhbiBleGlzdGluZyBzdHJlYW0uCisgICAgICogQHBhcmFtIHNlcnZpY2VTdHJlYW0KKyAgICAgKiBAcmV0dXJuIGhhbmRsZSBmb3IgaWRlbnRpZnlpbmcgdGhlIHN0cmVhbQorICAgICAqLworICAgIGFhdWRpb19oYW5kbGVfdCBhZGRTdHJlYW1Gb3JIYW5kbGUoYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0pOworCisgICAgLyoqCisgICAgICogQHJldHVybiBzdHJpbmcgdGhhdCBjYW4gYmUgYWRkZWQgdG8gZHVtcHN5cworICAgICAqLworICAgIHN0ZDo6c3RyaW5nIGR1bXAoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgYWF1ZGlvX2hhbmRsZV90IGJ1bXBIYW5kbGUoYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSk7CisKKyAgICAvLyBUcmFjayBzdHJlYW0gdXNpbmcgYSB1bmlxdWUgaGFuZGxlIHRoYXQgd3JhcHMuIE9ubHkgdXNlIHBvc2l0aXZlIGhhbGYuCisgICAgbXV0YWJsZSBzdGQ6Om11dGV4ICAgICAgICAgICAgICAgIG1IYW5kbGVMb2NrOworICAgIHN0ZDo6YXRvbWljPGFhdWRpb19oYW5kbGVfdD4gICAgICBtUHJldmlvdXNIYW5kbGV7MH07CisgICAgc3RkOjptYXA8YWF1ZGlvX2hhbmRsZV90LCBhbmRyb2lkOjpzcDxhYXVkaW86OkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPj4gbVN0cmVhbXNCeUhhbmRsZTsKK307CisKKworfSAvKiBuYW1lc3BhY2UgYWF1ZGlvICovCisKKyNlbmRpZiAvKiBBQVVESU9fQUFVRElPX1NUUkVBTV9UUkFDS0VSX0ggKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1RocmVhZC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9UaHJlYWQuY3BwCmluZGV4IGViYjUwZjguLmM2ZmI1N2QgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1RocmVhZC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvVGhyZWFkLmNwcApAQCAtNTMsNyArNTMsNyBAQAogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvVGhyZWFkOjpzdGFydChSdW5uYWJsZSAqcnVubmFibGUpIHsKICAgICBpZiAobUhhc1RocmVhZCkgewotICAgICAgICBBTE9HRSgiQUF1ZGlvVGhyZWFkOjpzdGFydCgpIC0gbUhhc1RocmVhZC5sb2FkKCkgYWxyZWFkeSB0cnVlIik7CisgICAgICAgIEFMT0dFKCJBQXVkaW9UaHJlYWQ6OnN0YXJ0KCkgLSBtSGFzVGhyZWFkIGFscmVhZHkgdHJ1ZSIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogICAgIC8vIG1SdW5uYWJsZSB3aWxsIGJlIHJlYWQgYnkgdGhlIG5ldyB0aHJlYWQgd2hlbiBpdCBzdGFydHMuCkBAIC03MSw2ICs3MSw3IEBACiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9UaHJlYWQ6OnN0b3AoKSB7CiAgICAgaWYgKCFtSGFzVGhyZWFkKSB7CisgICAgICAgIEFMT0dFKCJBQXVkaW9UaHJlYWQ6OnN0b3AoKSBidXQgbm8gdGhyZWFkIHJ1bm5pbmciKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KICAgICBpbnQgZXJyID0gcHRocmVhZF9qb2luKG1UaHJlYWQsIG51bGxwdHIpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQW5kcm9pZC5tayBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FuZHJvaWQubWsKaW5kZXggYTg5NmE3YS4uNTg0YjJlZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BbmRyb2lkLm1rCkBAIC0yMiw3ICsyMiw2IEBACiAgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL3NyYwogCiBMT0NBTF9TUkNfRklMRVMgKz0gXAotICAgICQoTElCQUFVRElPX1NSQ19ESVIpL3V0aWxpdHkvSGFuZGxlVHJhY2tlci5jcHAgXAogICAgIFNoYXJlZE1lbW9yeVByb3h5LmNwcCBcCiAgICAgU2hhcmVkUmluZ0J1ZmZlci5jcHAgXAogICAgIEFBdWRpb0NsaWVudFRyYWNrZXIuY3BwIFwKQEAgLTMxLDEwICszMCwxMyBAQAogICAgIEFBdWRpb1NlcnZpY2UuY3BwIFwKICAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQuY3BwIFwKICAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmNwcCBcCisgICAgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5jcHAgXAogICAgIEFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuY3BwIFwKKyAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuY3BwIFwKICAgICBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5jcHAgXAogICAgIEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmNwcCBcCiAgICAgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5jcHAgXAorICAgIEFBdWRpb1N0cmVhbVRyYWNrZXIuY3BwIFwKICAgICBUaW1lc3RhbXBTY2hlZHVsZXIuY3BwIFwKICAgICBBQXVkaW9UaHJlYWQuY3BwCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL09XTkVSUyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGQ1MWY5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvT1dORVJTCkBAIC0wLDAgKzEgQEAKK3BoaWxidXJrQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9yYWRpby9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjUwZGMzLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0jIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0gICAgUmFkaW9TZXJ2aWNlLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTOj0gXAotICAgIGxpYmxvZyBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmJpbmRlciBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJhdWRpb2NsaWVudCBcCi0gICAgbGliaGFyZHdhcmUgXAotICAgIGxpYnJhZGlvIFwKLSAgICBsaWJyYWRpb19tZXRhZGF0YQotCi1pZmVxICgkKFVTRV9MRUdBQ1lfTE9DQUxfQVVESU9fSEFMKSx0cnVlKQotIyBsaWJoYXJkd2FyZSBjb25maWd1cmF0aW9uCi1MT0NBTF9TUkNfRklMRVMgKz0gICAgICAgICAgICAgICBcCi0gICAgUmFkaW9IYWxMZWdhY3kuY3BwCi1lbHNlCi0jIFRyZWJsZSBjb25maWd1cmF0aW9uCi0KLUxPQ0FMX1NSQ19GSUxFUyArPSBcCi0gICAgSGlkbFV0aWxzLmNwcCBcCi0gICAgUmFkaW9IYWxIaWRsLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IFwKLSAgICBsaWJod2JpbmRlciBcCi0gICAgbGliaGlkbGJhc2UgXAotICAgIGxpYmhpZGx0cmFuc3BvcnQgXAotICAgIGxpYmJhc2UgXAotICAgIGxpYmF1ZGlvaGFsIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmJyb2FkY2FzdHJhZGlvQDEuMAotZW5kaWYKLQotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEgLVdlcnJvcgotCi1MT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQotCi1MT0NBTF9NT0RVTEU6PSBsaWJyYWRpb3NlcnZpY2UKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvcmFkaW8vSGlkbFV0aWxzLmNwcCBiL3NlcnZpY2VzL3JhZGlvL0hpZGxVdGlscy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4OTUzNzcuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvcmFkaW8vSGlkbFV0aWxzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNkZWZpbmUgTE9HX1RBRyAiSGlkbFV0aWxzIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgotI2luY2x1ZGUgPHN5c3RlbS9yYWRpb19tZXRhZGF0YS5oPgotCi0jaW5jbHVkZSAiSGlkbFV0aWxzLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpNZXRhZGF0YVR5cGU7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OkJhbmQ7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OkRlZW1waGFzaXM7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OlJkczsKLQotLy9zdGF0aWMKLWludCBIaWRsVXRpbHM6OmNvbnZlcnRIYWxSZXN1bHQoUmVzdWx0IHJlc3VsdCkKLXsKLSAgICBzd2l0Y2ggKHJlc3VsdCkgewotICAgICAgICBjYXNlIFJlc3VsdDo6T0s6Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOgotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX1NUQVRFOgotICAgICAgICAgICAgcmV0dXJuIC1FTk9TWVM7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpUSU1FT1VUOgotICAgICAgICAgICAgcmV0dXJuIC1FVElNRURPVVQ7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci19Ci0KLQotLy9zdGF0aWMKLXZvaWQgSGlkbFV0aWxzOjpjb252ZXJ0QmFuZENvbmZpZ1RvSGFsKEJhbmRDb25maWcgKmhhbENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcpCi17Ci0gICAgaGFsQ29uZmlnLT50eXBlID0gc3RhdGljX2Nhc3Q8QmFuZD4oY29uZmlnLT50eXBlKTsKLSAgICBoYWxDb25maWctPmFudGVubmFDb25uZWN0ZWQgPSBjb25maWctPmFudGVubmFfY29ubmVjdGVkOwotICAgIGhhbENvbmZpZy0+bG93ZXJMaW1pdCA9IGNvbmZpZy0+bG93ZXJfbGltaXQ7Ci0gICAgaGFsQ29uZmlnLT51cHBlckxpbWl0ID0gY29uZmlnLT51cHBlcl9saW1pdDsKLSAgICBoYWxDb25maWctPnNwYWNpbmdzLnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1bnNpZ25lZCBpbnQgKj4oJmNvbmZpZy0+c3BhY2luZ3NbMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5udW1fc3BhY2luZ3MgKiBzaXplb2YodWludDMyX3QpKTsKLSAgICAvLyBGSVhNRTogdHJhbnNmZXIgYnVmZmVyIG93bmVyc2hpcC4gc2hvdWxkIGhhdmUgYSBtZXRob2QgZm9yIHRoYXQgaW4gaGlkbF92ZWMKLSAgICBoYWxDb25maWctPnNwYWNpbmdzLnJlc2l6ZShjb25maWctPm51bV9zcGFjaW5ncyk7Ci0KLSAgICBpZiAoaGFsQ29uZmlnLT50eXBlID09IEJhbmQ6OkZNKSB7Ci0gICAgICAgIGhhbENvbmZpZy0+ZXh0LmZtLmRlZW1waGFzaXMgPSBzdGF0aWNfY2FzdDxEZWVtcGhhc2lzPihjb25maWctPmZtLmRlZW1waGFzaXMpOwotICAgICAgICBoYWxDb25maWctPmV4dC5mbS5zdGVyZW8gPSBjb25maWctPmZtLnN0ZXJlbzsKLSAgICAgICAgaGFsQ29uZmlnLT5leHQuZm0ucmRzID0gc3RhdGljX2Nhc3Q8UmRzPihjb25maWctPmZtLnJkcyk7Ci0gICAgICAgIGhhbENvbmZpZy0+ZXh0LmZtLnRhID0gY29uZmlnLT5mbS50YTsKLSAgICAgICAgaGFsQ29uZmlnLT5leHQuZm0uYWYgPSBjb25maWctPmZtLmFmOwotICAgICAgICBoYWxDb25maWctPmV4dC5mbS5lYSA9IGNvbmZpZy0+Zm0uZWE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaGFsQ29uZmlnLT5leHQuYW0uc3RlcmVvID0gY29uZmlnLT5hbS5zdGVyZW87Ci0gICAgfQotfQotCi0vL3N0YXRpYwotdm9pZCBIaWRsVXRpbHM6OmNvbnZlcnRQcm9wZXJ0aWVzRnJvbUhhbChyYWRpb19oYWxfcHJvcGVydGllc190ICpwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm9wZXJ0aWVzICpoYWxQcm9wZXJ0aWVzKQotewotICAgIHByb3BlcnRpZXMtPmNsYXNzX2lkID0gc3RhdGljX2Nhc3Q8cmFkaW9fY2xhc3NfdD4oaGFsUHJvcGVydGllcy0+Y2xhc3NJZCk7Ci0gICAgc3RybGNweShwcm9wZXJ0aWVzLT5pbXBsZW1lbnRvciwgaGFsUHJvcGVydGllcy0+aW1wbGVtZW50b3IuY19zdHIoKSwgUkFESU9fU1RSSU5HX0xFTl9NQVgpOwotICAgIHN0cmxjcHkocHJvcGVydGllcy0+cHJvZHVjdCwgaGFsUHJvcGVydGllcy0+cHJvZHVjdC5jX3N0cigpLCBSQURJT19TVFJJTkdfTEVOX01BWCk7Ci0gICAgc3RybGNweShwcm9wZXJ0aWVzLT52ZXJzaW9uLCBoYWxQcm9wZXJ0aWVzLT52ZXJzaW9uLmNfc3RyKCksIFJBRElPX1NUUklOR19MRU5fTUFYKTsKLSAgICBzdHJsY3B5KHByb3BlcnRpZXMtPnNlcmlhbCwgaGFsUHJvcGVydGllcy0+c2VyaWFsLmNfc3RyKCksIFJBRElPX1NUUklOR19MRU5fTUFYKTsKLSAgICBwcm9wZXJ0aWVzLT5udW1fdHVuZXJzID0gaGFsUHJvcGVydGllcy0+bnVtVHVuZXJzOwotICAgIHByb3BlcnRpZXMtPm51bV9hdWRpb19zb3VyY2VzID0gaGFsUHJvcGVydGllcy0+bnVtQXVkaW9Tb3VyY2VzOwotICAgIHByb3BlcnRpZXMtPnN1cHBvcnRzX2NhcHR1cmUgPSBoYWxQcm9wZXJ0aWVzLT5zdXBwb3J0c0NhcHR1cmU7Ci0gICAgcHJvcGVydGllcy0+bnVtX2JhbmRzID0gaGFsUHJvcGVydGllcy0+YmFuZHMuc2l6ZSgpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoYWxQcm9wZXJ0aWVzLT5iYW5kcy5zaXplKCk7IGkrKykgewotICAgICAgICBjb252ZXJ0QmFuZENvbmZpZ0Zyb21IYWwoJnByb3BlcnRpZXMtPmJhbmRzW2ldLCAmaGFsUHJvcGVydGllcy0+YmFuZHNbaV0pOwotICAgIH0KLX0KLQotLy9zdGF0aWMKLXZvaWQgSGlkbFV0aWxzOjpjb252ZXJ0QmFuZENvbmZpZ0Zyb21IYWwocmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmFuZENvbmZpZyAqaGFsQ29uZmlnKQotewotICAgIGNvbmZpZy0+dHlwZSA9IHN0YXRpY19jYXN0PHJhZGlvX2JhbmRfdD4oaGFsQ29uZmlnLT50eXBlKTsKLSAgICBjb25maWctPmFudGVubmFfY29ubmVjdGVkID0gaGFsQ29uZmlnLT5hbnRlbm5hQ29ubmVjdGVkOwotICAgIGNvbmZpZy0+bG93ZXJfbGltaXQgPSBoYWxDb25maWctPmxvd2VyTGltaXQ7Ci0gICAgY29uZmlnLT51cHBlcl9saW1pdCA9IGhhbENvbmZpZy0+dXBwZXJMaW1pdDsKLSAgICBjb25maWctPm51bV9zcGFjaW5ncyA9IGhhbENvbmZpZy0+c3BhY2luZ3Muc2l6ZSgpOwotICAgIGlmIChjb25maWctPm51bV9zcGFjaW5ncyA+IFJBRElPX05VTV9TUEFDSU5HU19NQVgpIHsKLSAgICAgICAgY29uZmlnLT5udW1fc3BhY2luZ3MgPSBSQURJT19OVU1fU1BBQ0lOR1NfTUFYOwotICAgIH0KLSAgICBtZW1jcHkoY29uZmlnLT5zcGFjaW5ncywgaGFsQ29uZmlnLT5zcGFjaW5ncy5kYXRhKCksCi0gICAgICAgICAgIHNpemVvZih1aW50MzJfdCkgKiBjb25maWctPm51bV9zcGFjaW5ncyk7Ci0KLSAgICBpZiAoaGFsQ29uZmlnLT50eXBlID09IEJhbmQ6OkZNKSB7Ci0gICAgICAgIGNvbmZpZy0+Zm0uZGVlbXBoYXNpcyA9IHN0YXRpY19jYXN0PHJhZGlvX2RlZW1waGFzaXNfdD4oaGFsQ29uZmlnLT5leHQuZm0uZGVlbXBoYXNpcyk7Ci0gICAgICAgIGNvbmZpZy0+Zm0uc3RlcmVvID0gaGFsQ29uZmlnLT5leHQuZm0uc3RlcmVvOwotICAgICAgICBjb25maWctPmZtLnJkcyA9IHN0YXRpY19jYXN0PHJhZGlvX3Jkc190PihoYWxDb25maWctPmV4dC5mbS5yZHMpOwotICAgICAgICBjb25maWctPmZtLnRhID0gaGFsQ29uZmlnLT5leHQuZm0udGE7Ci0gICAgICAgIGNvbmZpZy0+Zm0uYWYgPSBoYWxDb25maWctPmV4dC5mbS5hZjsKLSAgICAgICAgY29uZmlnLT5mbS5lYSA9IGhhbENvbmZpZy0+ZXh0LmZtLmVhOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbmZpZy0+YW0uc3RlcmVvID0gaGFsQ29uZmlnLT5leHQuYW0uc3RlcmVvOwotICAgIH0KLX0KLQotCi0vL3N0YXRpYwotdm9pZCBIaWRsVXRpbHM6OmNvbnZlcnRQcm9ncmFtSW5mb0Zyb21IYWwocmFkaW9fcHJvZ3JhbV9pbmZvX3QgKmluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm9ncmFtSW5mbyAqaGFsSW5mbykKLXsKLSAgICBpbmZvLT5jaGFubmVsID0gaGFsSW5mby0+Y2hhbm5lbDsKLSAgICBpbmZvLT5zdWJfY2hhbm5lbCA9IGhhbEluZm8tPnN1YkNoYW5uZWw7Ci0gICAgaW5mby0+dHVuZWQgPSBoYWxJbmZvLT50dW5lZDsKLSAgICBpbmZvLT5zdGVyZW8gPSBoYWxJbmZvLT5zdGVyZW87Ci0gICAgaW5mby0+ZGlnaXRhbCA9IGhhbEluZm8tPmRpZ2l0YWw7Ci0gICAgaW5mby0+c2lnbmFsX3N0cmVuZ3RoID0gaGFsSW5mby0+c2lnbmFsU3RyZW5ndGg7Ci0gICAgY29udmVydE1ldGFEYXRhRnJvbUhhbCgmaW5mby0+bWV0YWRhdGEsIGhhbEluZm8tPm1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsSW5mby0+Y2hhbm5lbCwgaGFsSW5mby0+c3ViQ2hhbm5lbCk7Ci19Ci0KLS8vIFRPRE8odHdhc2lsY3p5ayk6IGRyb3AgdW5uZWNlc3NhcnkgY2hhbm5lbCBpbmZvCi0vL3N0YXRpYwotdm9pZCBIaWRsVXRpbHM6OmNvbnZlcnRNZXRhRGF0YUZyb21IYWwocmFkaW9fbWV0YWRhdGFfdCAqKm1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8TWV0YURhdGE+JiBoYWxNZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWwgX191bnVzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdWJDaGFubmVsIF9fdW51c2VkKQotewotCi0gICAgaWYgKG1ldGFkYXRhID09IG51bGxwdHIgfHwgKm1ldGFkYXRhID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoImRlc3RpbmF0aW9uIG1ldGFkYXRhIGJ1ZmZlciBpcyBhIG51bGxwdHIiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhhbE1ldGFkYXRhLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHJhZGlvX21ldGFkYXRhX2tleV90IGtleSA9IHN0YXRpY19jYXN0PHJhZGlvX21ldGFkYXRhX2tleV90PihoYWxNZXRhZGF0YVtpXS5rZXkpOwotICAgICAgICByYWRpb19tZXRhZGF0YV90eXBlX3QgdHlwZSA9IHN0YXRpY19jYXN0PHJhZGlvX21ldGFkYXRhX2tleV90PihoYWxNZXRhZGF0YVtpXS50eXBlKTsKLSAgICAgICAgcmFkaW9fbWV0YWRhdGFfY2xvY2tfdCBjbG9jazsKLQotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBSQURJT19NRVRBREFUQV9UWVBFX0lOVDoKLSAgICAgICAgICAgIHJhZGlvX21ldGFkYXRhX2FkZF9pbnQobWV0YWRhdGEsIGtleSwgaGFsTWV0YWRhdGFbaV0uaW50VmFsdWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUkFESU9fTUVUQURBVEFfVFlQRV9URVhUOgotICAgICAgICAgICAgcmFkaW9fbWV0YWRhdGFfYWRkX3RleHQobWV0YWRhdGEsIGtleSwgaGFsTWV0YWRhdGFbaV0uc3RyaW5nVmFsdWUuY19zdHIoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSQURJT19NRVRBREFUQV9UWVBFX1JBVzoKLSAgICAgICAgICAgIHJhZGlvX21ldGFkYXRhX2FkZF9yYXcobWV0YWRhdGEsIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsTWV0YWRhdGFbaV0ucmF3VmFsdWUuZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxNZXRhZGF0YVtpXS5yYXdWYWx1ZS5zaXplKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUkFESU9fTUVUQURBVEFfVFlQRV9DTE9DSzoKLSAgICAgICAgICAgIGNsb2NrLnV0Y19zZWNvbmRzX3NpbmNlX2Vwb2NoID0KLSAgICAgICAgICAgICAgICAgICAgaGFsTWV0YWRhdGFbaV0uY2xvY2tWYWx1ZS51dGNTZWNvbmRzU2luY2VFcG9jaDsKLSAgICAgICAgICAgIGNsb2NrLnRpbWV6b25lX29mZnNldF9pbl9taW51dGVzID0KLSAgICAgICAgICAgICAgICAgICAgaGFsTWV0YWRhdGFbaV0uY2xvY2tWYWx1ZS50aW1lem9uZU9mZnNldEluTWludXRlczsKLSAgICAgICAgICAgIHJhZGlvX21ldGFkYXRhX2FkZF9jbG9jayhtZXRhZGF0YSwga2V5LCAmY2xvY2spOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVygiJXMgaW52YWxpZCBtZXRhZGF0YSB0eXBlICV1IixfX0ZVTkNUSU9OX18sIGhhbE1ldGFkYXRhW2ldLnR5cGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9IaWRsVXRpbHMuaCBiL3NlcnZpY2VzL3JhZGlvL0hpZGxVdGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzcxMDYwLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL0hpZGxVdGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfUkFESU9fSEFMX0hJRExfVVRJTFNfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0hBTF9ISURMX1VUSUxTX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYnJvYWRjYXN0cmFkaW8vMS4wL3R5cGVzLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvcmFkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OlJlc3VsdDsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6UHJvcGVydGllczsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6QmFuZENvbmZpZzsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6UHJvZ3JhbUluZm87Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6Ok1ldGFEYXRhOwotCi1jbGFzcyBIaWRsVXRpbHMgewotcHVibGljOgotICAgIHN0YXRpYyBpbnQgY29udmVydEhhbFJlc3VsdChSZXN1bHQgcmVzdWx0KTsKLSAgICBzdGF0aWMgdm9pZCBjb252ZXJ0QmFuZENvbmZpZ0Zyb21IYWwocmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmFuZENvbmZpZyAqaGFsQ29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBjb252ZXJ0UHJvcGVydGllc0Zyb21IYWwocmFkaW9faGFsX3Byb3BlcnRpZXNfdCAqcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvcGVydGllcyAqaGFsUHJvcGVydGllcyk7Ci0gICAgc3RhdGljIHZvaWQgY29udmVydEJhbmRDb25maWdUb0hhbChCYW5kQ29uZmlnICpoYWxDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBjb252ZXJ0UHJvZ3JhbUluZm9Gcm9tSGFsKHJhZGlvX3Byb2dyYW1faW5mb190ICppbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvZ3JhbUluZm8gKmhhbEluZm8pOwotICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRNZXRhRGF0YUZyb21IYWwocmFkaW9fbWV0YWRhdGFfdCAqKm1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8TWV0YURhdGE+JiBoYWxNZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdWJDaGFubmVsKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9SQURJT19IQUxfSElETF9VVElMU19ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9PV05FUlMgYi9zZXJ2aWNlcy9yYWRpby9PV05FUlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViOTU0OWEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvcmFkaW8vT1dORVJTCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1lbGF1cmVudEBnb29nbGUuY29tCi1odW5nYUBnb29nbGUuY29tCi10d2FzaWxjenlrQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvSGFsSGlkbC5jcHAgYi9zZXJ2aWNlcy9yYWRpby9SYWRpb0hhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjM3Mjc1Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvSGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiUmFkaW9IYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvaGlkbC9IYWxEZWF0aEhhbmRsZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9taXNjLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL1JhZGlvTWV0YWRhdGFXcmFwcGVyLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9icm9hZGNhc3RyYWRpby8xLjAvSUJyb2FkY2FzdFJhZGlvRmFjdG9yeS5oPgotCi0jaW5jbHVkZSAiUmFkaW9IYWxIaWRsLmgiCi0jaW5jbHVkZSAiSGlkbFV0aWxzLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpJQnJvYWRjYXN0UmFkaW9GYWN0b3J5OwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpDbGFzczsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6RGlyZWN0aW9uOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpQcm9wZXJ0aWVzOwotCi0KLS8qIHN0YXRpYyAqLwotc3A8UmFkaW9JbnRlcmZhY2U+IFJhZGlvSW50ZXJmYWNlOjpjb25uZWN0TW9kdWxlKHJhZGlvX2NsYXNzX3QgY2xhc3NJZCkKLXsKLSAgICByZXR1cm4gbmV3IFJhZGlvSGFsSGlkbChjbGFzc0lkKTsKLX0KLQotaW50IFJhZGlvSGFsSGlkbDo6Z2V0UHJvcGVydGllcyhyYWRpb19oYWxfcHJvcGVydGllc190ICpwcm9wZXJ0aWVzKQotewotICAgIEFMT0dWKCIlcyBJTiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgc3A8SUJyb2FkY2FzdFJhZGlvPiBtb2R1bGUgPSBnZXRTZXJ2aWNlKCk7Ci0gICAgaWYgKG1vZHVsZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICBQcm9wZXJ0aWVzIGhhbFByb3BlcnRpZXM7Ci0gICAgUmVzdWx0IGhhbFJlc3VsdCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiBoaWRsUmV0dXJuID0KLSAgICAgICAgICAgIG1vZHVsZS0+Z2V0UHJvcGVydGllcyhbJl0oUmVzdWx0IHJlc3VsdCwgY29uc3QgUHJvcGVydGllcyYgcHJvcGVydGllcykgewotICAgICAgICAgICAgICAgICAgICBoYWxSZXN1bHQgPSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgaGFsUHJvcGVydGllcyA9IHByb3BlcnRpZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLQotICAgIGlmIChoYWxSZXN1bHQgPT0gUmVzdWx0OjpPSykgewotICAgICAgICBIaWRsVXRpbHM6OmNvbnZlcnRQcm9wZXJ0aWVzRnJvbUhhbChwcm9wZXJ0aWVzLCAmaGFsUHJvcGVydGllcyk7Ci0gICAgfQotICAgIHJldHVybiBIaWRsVXRpbHM6OmNvbnZlcnRIYWxSZXN1bHQoaGFsUmVzdWx0KTsKLX0KLQotaW50IFJhZGlvSGFsSGlkbDo6b3BlblR1bmVyKGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxUdW5lckNhbGxiYWNrSW50ZXJmYWNlPiBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxUdW5lckludGVyZmFjZT4mIHR1bmVyKQotewotICAgIHNwPElCcm9hZGNhc3RSYWRpbz4gbW9kdWxlID0gZ2V0U2VydmljZSgpOwotICAgIGlmIChtb2R1bGUgPT0gMCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgc3A8VHVuZXI+IHR1bmVySW1wbCA9IG5ldyBUdW5lcihjYWxsYmFjaywgdGhpcyk7Ci0KLSAgICBCYW5kQ29uZmlnIGhhbENvbmZpZzsKLSAgICBSZXN1bHQgaGFsUmVzdWx0ID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgc3A8SVR1bmVyPiBoYWxUdW5lcjsKLQotICAgIEhpZGxVdGlsczo6Y29udmVydEJhbmRDb25maWdUb0hhbCgmaGFsQ29uZmlnLCBjb25maWcpOwotICAgIFJldHVybjx2b2lkPiBoaWRsUmV0dXJuID0KLSAgICAgICAgICAgIG1vZHVsZS0+b3BlblR1bmVyKGhhbENvbmZpZywgYXVkaW8sIHR1bmVySW1wbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgcmVzdWx0LCBjb25zdCBzcDxJVHVuZXI+JiB0dW5lcikgewotICAgICAgICAgICAgICAgICAgICBoYWxSZXN1bHQgPSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgaGFsVHVuZXIgPSB0dW5lcjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotCi0gICAgaWYgKGhhbFJlc3VsdCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgIHR1bmVySW1wbC0+c2V0SGFsVHVuZXIoaGFsVHVuZXIpOwotICAgICAgICB0dW5lciA9IHR1bmVySW1wbDsKLSAgICB9Ci0KLSAgICByZXR1cm4gSGlkbFV0aWxzOjpjb252ZXJ0SGFsUmVzdWx0KGhhbFJlc3VsdCk7Ci19Ci0KLWludCBSYWRpb0hhbEhpZGw6OmNsb3NlVHVuZXIoc3A8VHVuZXJJbnRlcmZhY2U+JiB0dW5lcikKLXsKLSAgICBzcDxUdW5lcj4gdHVuZXJJbXBsID0gc3RhdGljX2Nhc3Q8VHVuZXIgKj4odHVuZXIuZ2V0KCkpOwotICAgIHNwPElUdW5lcj4gY2xlYXJUdW5lcjsKLSAgICB0dW5lckltcGwtPnNldEhhbFR1bmVyKGNsZWFyVHVuZXIpOwotICAgIHJldHVybiAwOwotfQotCi1SYWRpb0hhbEhpZGw6OlJhZGlvSGFsSGlkbChyYWRpb19jbGFzc190IGNsYXNzSWQpCi0gICAgOiBtQ2xhc3NJZChjbGFzc0lkKQotewotfQotCi1SYWRpb0hhbEhpZGw6On5SYWRpb0hhbEhpZGwoKQotewotfQotCi1zcDxJQnJvYWRjYXN0UmFkaW8+IFJhZGlvSGFsSGlkbDo6Z2V0U2VydmljZSgpCi17Ci0gICAgaWYgKG1IYWxNb2R1bGUgPT0gMCkgewotICAgICAgICBzcDxJQnJvYWRjYXN0UmFkaW9GYWN0b3J5PiBmYWN0b3J5ID0gSUJyb2FkY2FzdFJhZGlvRmFjdG9yeTo6Z2V0U2VydmljZSgpOwotICAgICAgICBpZiAoZmFjdG9yeSAhPSAwKSB7Ci0gICAgICAgICAgICBmYWN0b3J5LT5jb25uZWN0TW9kdWxlKHN0YXRpY19jYXN0PENsYXNzPihtQ2xhc3NJZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByZXR2YWwsIGNvbnN0IDo6YW5kcm9pZDo6c3A8SUJyb2FkY2FzdFJhZGlvPiYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1IYWxNb2R1bGUgPSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQUxPR1YoIiVzIE9VVCBtb2R1bGUgJXAiLCBfX0ZVTkNUSU9OX18sIG1IYWxNb2R1bGUuZ2V0KCkpOwotICAgIHJldHVybiBtSGFsTW9kdWxlOwotfQotCi12b2lkIFJhZGlvSGFsSGlkbDo6Y2xlYXJTZXJ2aWNlKCkKLXsKLSAgICBBTE9HVigiJXMgSU4gbW9kdWxlICVwIiwgX19GVU5DVElPTl9fLCBtSGFsTW9kdWxlLmdldCgpKTsKLSAgICBtSGFsTW9kdWxlLmNsZWFyKCk7Ci19Ci0KLQotaW50IFJhZGlvSGFsSGlkbDo6VHVuZXI6OnNldENvbmZpZ3VyYXRpb24oY29uc3QgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZykKLXsKLSAgICBBTE9HVigiJXMgSU4gbUhhbFR1bmVyICVwIiwgX19GVU5DVElPTl9fLCBtSGFsVHVuZXIuZ2V0KCkpOwotCi0gICAgaWYgKG1IYWxUdW5lciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICBCYW5kQ29uZmlnIGhhbENvbmZpZzsKLSAgICBIaWRsVXRpbHM6OmNvbnZlcnRCYW5kQ29uZmlnVG9IYWwoJmhhbENvbmZpZywgY29uZmlnKTsKLQotICAgIFJldHVybjxSZXN1bHQ+IGhpZGxSZXN1bHQgPSBtSGFsVHVuZXItPnNldENvbmZpZ3VyYXRpb24oaGFsQ29uZmlnKTsKLSAgICByZXR1cm4gSGlkbFV0aWxzOjpjb252ZXJ0SGFsUmVzdWx0KGhpZGxSZXN1bHQpOwotfQotCi1pbnQgUmFkaW9IYWxIaWRsOjpUdW5lcjo6Z2V0Q29uZmlndXJhdGlvbihyYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnKQotewotICAgIEFMT0dWKCIlcyBJTiBtSGFsVHVuZXIgJXAiLCBfX0ZVTkNUSU9OX18sIG1IYWxUdW5lci5nZXQoKSk7Ci0gICAgaWYgKG1IYWxUdW5lciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICBCYW5kQ29uZmlnIGhhbENvbmZpZzsKLSAgICBSZXN1bHQgaGFsUmVzdWx0OwotICAgIFJldHVybjx2b2lkPiBoaWRsUmV0dXJuID0KLSAgICAgICAgICAgIG1IYWxUdW5lci0+Z2V0Q29uZmlndXJhdGlvbihbJl0oUmVzdWx0IHJlc3VsdCwgY29uc3QgQmFuZENvbmZpZyYgY29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbFJlc3VsdCA9IHJlc3VsdDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYWxDb25maWcgPSBjb25maWc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICBpZiAoaGlkbFJldHVybi5pc09rKCkgJiYgaGFsUmVzdWx0ID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgSGlkbFV0aWxzOjpjb252ZXJ0QmFuZENvbmZpZ0Zyb21IYWwoY29uZmlnLCAmaGFsQ29uZmlnKTsKLSAgICB9Ci0gICAgcmV0dXJuIEhpZGxVdGlsczo6Y29udmVydEhhbFJlc3VsdChoYWxSZXN1bHQpOwotfQotCi1pbnQgUmFkaW9IYWxIaWRsOjpUdW5lcjo6c2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcF9zdWJfY2hhbm5lbCkKLXsKLSAgICBBTE9HVigiJXMgSU4gbUhhbFR1bmVyICVwIiwgX19GVU5DVElPTl9fLCBtSGFsVHVuZXIuZ2V0KCkpOwotICAgIGlmIChtSGFsVHVuZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgUmV0dXJuPFJlc3VsdD4gaGlkbFJlc3VsdCA9Ci0gICAgICAgICAgICBtSGFsVHVuZXItPnNjYW4oc3RhdGljX2Nhc3Q8RGlyZWN0aW9uPihkaXJlY3Rpb24pLCBza2lwX3N1Yl9jaGFubmVsKTsKLSAgICByZXR1cm4gSGlkbFV0aWxzOjpjb252ZXJ0SGFsUmVzdWx0KGhpZGxSZXN1bHQpOwotfQotCi1pbnQgUmFkaW9IYWxIaWRsOjpUdW5lcjo6c3RlcChyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcF9zdWJfY2hhbm5lbCkKLXsKLSAgICBBTE9HVigiJXMgSU4gbUhhbFR1bmVyICVwIiwgX19GVU5DVElPTl9fLCBtSGFsVHVuZXIuZ2V0KCkpOwotICAgIGlmIChtSGFsVHVuZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgUmV0dXJuPFJlc3VsdD4gaGlkbFJlc3VsdCA9Ci0gICAgICAgICAgICBtSGFsVHVuZXItPnN0ZXAoc3RhdGljX2Nhc3Q8RGlyZWN0aW9uPihkaXJlY3Rpb24pLCBza2lwX3N1Yl9jaGFubmVsKTsKLSAgICByZXR1cm4gSGlkbFV0aWxzOjpjb252ZXJ0SGFsUmVzdWx0KGhpZGxSZXN1bHQpOwotfQotCi1pbnQgUmFkaW9IYWxIaWRsOjpUdW5lcjo6dHVuZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IHN1Yl9jaGFubmVsKQotewotICAgIEFMT0dWKCIlcyBJTiBtSGFsVHVuZXIgJXAiLCBfX0ZVTkNUSU9OX18sIG1IYWxUdW5lci5nZXQoKSk7Ci0gICAgaWYgKG1IYWxUdW5lciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICBSZXR1cm48UmVzdWx0PiBoaWRsUmVzdWx0ID0KLSAgICAgICAgICAgIG1IYWxUdW5lci0+dHVuZShjaGFubmVsLCBzdWJfY2hhbm5lbCk7Ci0gICAgcmV0dXJuIEhpZGxVdGlsczo6Y29udmVydEhhbFJlc3VsdChoaWRsUmVzdWx0KTsKLX0KLQotaW50IFJhZGlvSGFsSGlkbDo6VHVuZXI6OmNhbmNlbCgpCi17Ci0gICAgQUxPR1YoIiVzIElOIG1IYWxUdW5lciAlcCIsIF9fRlVOQ1RJT05fXywgbUhhbFR1bmVyLmdldCgpKTsKLSAgICBpZiAobUhhbFR1bmVyID09IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIFJldHVybjxSZXN1bHQ+IGhpZGxSZXN1bHQgPSBtSGFsVHVuZXItPmNhbmNlbCgpOwotICAgIHJldHVybiBIaWRsVXRpbHM6OmNvbnZlcnRIYWxSZXN1bHQoaGlkbFJlc3VsdCk7Ci19Ci0KLWludCBSYWRpb0hhbEhpZGw6OlR1bmVyOjpnZXRQcm9ncmFtSW5mb3JtYXRpb24ocmFkaW9fcHJvZ3JhbV9pbmZvX3QgKmluZm8pCi17Ci0gICAgQUxPR1YoIiVzIElOIG1IYWxUdW5lciAlcCIsIF9fRlVOQ1RJT05fXywgbUhhbFR1bmVyLmdldCgpKTsKLSAgICBpZiAobUhhbFR1bmVyID09IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIGlmIChpbmZvID09IG51bGxwdHIgfHwgaW5mby0+bWV0YWRhdGEgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBQcm9ncmFtSW5mbyBoYWxJbmZvOwotICAgIFJlc3VsdCBoYWxSZXN1bHQ7Ci0gICAgUmV0dXJuPHZvaWQ+IGhpZGxSZXR1cm4gPSBtSGFsVHVuZXItPmdldFByb2dyYW1JbmZvcm1hdGlvbigKLSAgICAgICAgWyZdKFJlc3VsdCByZXN1bHQsIGNvbnN0IFByb2dyYW1JbmZvJiBpbmZvKSB7Ci0gICAgICAgICAgICBoYWxSZXN1bHQgPSByZXN1bHQ7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICBoYWxJbmZvID0gaW5mbzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgaWYgKGhpZGxSZXR1cm4uaXNPaygpICYmIGhhbFJlc3VsdCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgIEhpZGxVdGlsczo6Y29udmVydFByb2dyYW1JbmZvRnJvbUhhbChpbmZvLCAmaGFsSW5mbyk7Ci0gICAgfQotICAgIHJldHVybiBIaWRsVXRpbHM6OmNvbnZlcnRIYWxSZXN1bHQoaGFsUmVzdWx0KTsKLX0KLQotUmV0dXJuPHZvaWQ+IFJhZGlvSGFsSGlkbDo6VHVuZXI6OmhhcmR3YXJlRmFpbHVyZSgpCi17Ci0gICAgQUxPR1YoIiVzIElOIiwgX19GVU5DVElPTl9fKTsKLSAgICBoYW5kbGVId0ZhaWx1cmUoKTsKLSAgICByZXR1cm4gUmV0dXJuPHZvaWQ+KCk7Ci19Ci0KLVJldHVybjx2b2lkPiBSYWRpb0hhbEhpZGw6OlR1bmVyOjpjb25maWdDaGFuZ2UoUmVzdWx0IHJlc3VsdCwgY29uc3QgQmFuZENvbmZpZyYgY29uZmlnKQotewotICAgIEFMT0dWKCIlcyBJTiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgcmFkaW9faGFsX2V2ZW50X3QgZXZlbnQ7Ci0gICAgbWVtc2V0KCZldmVudCwgMCwgc2l6ZW9mKHJhZGlvX2hhbF9ldmVudF90KSk7Ci0gICAgZXZlbnQudHlwZSA9IFJBRElPX0VWRU5UX0NPTkZJRzsKLSAgICBldmVudC5zdGF0dXMgPSBIaWRsVXRpbHM6OmNvbnZlcnRIYWxSZXN1bHQocmVzdWx0KTsKLSAgICBIaWRsVXRpbHM6OmNvbnZlcnRCYW5kQ29uZmlnRnJvbUhhbCgmZXZlbnQuY29uZmlnLCAmY29uZmlnKTsKLSAgICBvbkNhbGxiYWNrKCZldmVudCk7Ci0gICAgcmV0dXJuIFJldHVybjx2b2lkPigpOwotfQotCi1SZXR1cm48dm9pZD4gUmFkaW9IYWxIaWRsOjpUdW5lcjo6dHVuZUNvbXBsZXRlKFJlc3VsdCByZXN1bHQsIGNvbnN0IFByb2dyYW1JbmZvJiBpbmZvKQotewotICAgIEFMT0dWKCIlcyBJTiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgcmFkaW9faGFsX2V2ZW50X3QgZXZlbnQgPSB7fTsKLSAgICBSYWRpb01ldGFkYXRhV3JhcHBlciBtZXRhZGF0YVdyYXBwZXIoJmV2ZW50LmluZm8ubWV0YWRhdGEpOwotCi0gICAgZXZlbnQudHlwZSA9IFJBRElPX0VWRU5UX1RVTkVEOwotICAgIGV2ZW50LnN0YXR1cyA9IEhpZGxVdGlsczo6Y29udmVydEhhbFJlc3VsdChyZXN1bHQpOwotICAgIEhpZGxVdGlsczo6Y29udmVydFByb2dyYW1JbmZvRnJvbUhhbCgmZXZlbnQuaW5mbywgJmluZm8pOwotICAgIG9uQ2FsbGJhY2soJmV2ZW50KTsKLSAgICByZXR1cm4gUmV0dXJuPHZvaWQ+KCk7Ci19Ci0KLVJldHVybjx2b2lkPiBSYWRpb0hhbEhpZGw6OlR1bmVyOjphZlN3aXRjaChjb25zdCBQcm9ncmFtSW5mbyYgaW5mbykKLXsKLSAgICBBTE9HVigiJXMgSU4iLCBfX0ZVTkNUSU9OX18pOwotICAgIHJhZGlvX2hhbF9ldmVudF90IGV2ZW50ID0ge307Ci0gICAgUmFkaW9NZXRhZGF0YVdyYXBwZXIgbWV0YWRhdGFXcmFwcGVyKCZldmVudC5pbmZvLm1ldGFkYXRhKTsKLQotICAgIGV2ZW50LnR5cGUgPSBSQURJT19FVkVOVF9BRl9TV0lUQ0g7Ci0gICAgSGlkbFV0aWxzOjpjb252ZXJ0UHJvZ3JhbUluZm9Gcm9tSGFsKCZldmVudC5pbmZvLCAmaW5mbyk7Ci0gICAgb25DYWxsYmFjaygmZXZlbnQpOwotICAgIHJldHVybiBSZXR1cm48dm9pZD4oKTsKLX0KLQotUmV0dXJuPHZvaWQ+IFJhZGlvSGFsSGlkbDo6VHVuZXI6OmFudGVubmFTdGF0ZUNoYW5nZShib29sIGNvbm5lY3RlZCkKLXsKLSAgICBBTE9HVigiJXMgSU4iLCBfX0ZVTkNUSU9OX18pOwotICAgIHJhZGlvX2hhbF9ldmVudF90IGV2ZW50OwotICAgIG1lbXNldCgmZXZlbnQsIDAsIHNpemVvZihyYWRpb19oYWxfZXZlbnRfdCkpOwotICAgIGV2ZW50LnR5cGUgPSBSQURJT19FVkVOVF9BTlRFTk5BOwotICAgIGV2ZW50Lm9uID0gY29ubmVjdGVkOwotICAgIG9uQ2FsbGJhY2soJmV2ZW50KTsKLSAgICByZXR1cm4gUmV0dXJuPHZvaWQ+KCk7Ci19Ci1SZXR1cm48dm9pZD4gUmFkaW9IYWxIaWRsOjpUdW5lcjo6dHJhZmZpY0Fubm91bmNlbWVudChib29sIGFjdGl2ZSkKLXsKLSAgICBBTE9HVigiJXMgSU4iLCBfX0ZVTkNUSU9OX18pOwotICAgIHJhZGlvX2hhbF9ldmVudF90IGV2ZW50OwotICAgIG1lbXNldCgmZXZlbnQsIDAsIHNpemVvZihyYWRpb19oYWxfZXZlbnRfdCkpOwotICAgIGV2ZW50LnR5cGUgPSBSQURJT19FVkVOVF9UQTsKLSAgICBldmVudC5vbiA9IGFjdGl2ZTsKLSAgICBvbkNhbGxiYWNrKCZldmVudCk7Ci0gICAgcmV0dXJuIFJldHVybjx2b2lkPigpOwotfQotUmV0dXJuPHZvaWQ+IFJhZGlvSGFsSGlkbDo6VHVuZXI6OmVtZXJnZW5jeUFubm91bmNlbWVudChib29sIGFjdGl2ZSkKLXsKLSAgICBBTE9HVigiJXMgSU4iLCBfX0ZVTkNUSU9OX18pOwotICAgIHJhZGlvX2hhbF9ldmVudF90IGV2ZW50OwotICAgIG1lbXNldCgmZXZlbnQsIDAsIHNpemVvZihyYWRpb19oYWxfZXZlbnRfdCkpOwotICAgIGV2ZW50LnR5cGUgPSBSQURJT19FVkVOVF9FQTsKLSAgICBldmVudC5vbiA9IGFjdGl2ZTsKLSAgICBvbkNhbGxiYWNrKCZldmVudCk7Ci0gICAgcmV0dXJuIFJldHVybjx2b2lkPigpOwotfQotUmV0dXJuPHZvaWQ+IFJhZGlvSGFsSGlkbDo6VHVuZXI6Om5ld01ldGFkYXRhKHVpbnQzMl90IGNoYW5uZWwsIHVpbnQzMl90IHN1YkNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzxNZXRhRGF0YT4mIG1ldGFkYXRhKQotewotICAgIEFMT0dWKCIlcyBJTiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgcmFkaW9faGFsX2V2ZW50X3QgZXZlbnQgPSB7fTsKLSAgICBSYWRpb01ldGFkYXRhV3JhcHBlciBtZXRhZGF0YVdyYXBwZXIoJmV2ZW50Lm1ldGFkYXRhKTsKLQotICAgIGV2ZW50LnR5cGUgPSBSQURJT19FVkVOVF9NRVRBREFUQTsKLSAgICBIaWRsVXRpbHM6OmNvbnZlcnRNZXRhRGF0YUZyb21IYWwoJmV2ZW50Lm1ldGFkYXRhLCBtZXRhZGF0YSwgY2hhbm5lbCwgc3ViQ2hhbm5lbCk7Ci0gICAgb25DYWxsYmFjaygmZXZlbnQpOwotICAgIHJldHVybiBSZXR1cm48dm9pZD4oKTsKLX0KLQotCi1SYWRpb0hhbEhpZGw6OlR1bmVyOjpUdW5lcihzcDxUdW5lckNhbGxiYWNrSW50ZXJmYWNlPiBjYWxsYmFjaywgc3A8UmFkaW9IYWxIaWRsPiBtb2R1bGUpCi0gICAgOiBUdW5lckludGVyZmFjZSgpLCBtSGFsVHVuZXIoTlVMTCksIG1DYWxsYmFjayhjYWxsYmFjayksIG1QYXJlbnRNb2R1bGUobW9kdWxlKQotewotICAgIC8vIE1ha2Ugc3VyZSB0aGUgaGFuZGxlciB3ZSBhcmUgcGFzc2luZyBpbiBvbmx5IGRlYWxzIHdpdGggY29uc3QgbWVtYmVycywKLSAgICAvLyBhcyBpdCBjYW4gYmUgY2FsbGVkIG9uIGFuIGFyYml0cmFyeSB0aHJlYWQuCi0gICAgY29uc3QgYXV0byYgc2VsZiA9IHRoaXM7Ci0gICAgSGFsRGVhdGhIYW5kbGVyOjpnZXRJbnN0YW5jZSgpLT5yZWdpc3RlckF0RXhpdEhhbmRsZXIoCi0gICAgICAgICAgICB0aGlzLCBbJnNlbGZdKCkgeyBzZWxmLT5zZW5kSHdGYWlsdXJlRXZlbnQoKTsgfSk7Ci19Ci0KLQotUmFkaW9IYWxIaWRsOjpUdW5lcjo6flR1bmVyKCkKLXsKLSAgICBIYWxEZWF0aEhhbmRsZXI6OmdldEluc3RhbmNlKCktPnVucmVnaXN0ZXJBdEV4aXRIYW5kbGVyKHRoaXMpOwotfQotCi12b2lkIFJhZGlvSGFsSGlkbDo6VHVuZXI6OnNldEhhbFR1bmVyKHNwPElUdW5lcj4mIGhhbFR1bmVyKSB7Ci0gICAgaWYgKG1IYWxUdW5lciAhPSAwKSB7Ci0gICAgICAgIG1IYWxUdW5lci0+dW5saW5rVG9EZWF0aChIYWxEZWF0aEhhbmRsZXI6OmdldEluc3RhbmNlKCkpOwotICAgIH0KLSAgICBtSGFsVHVuZXIgPSBoYWxUdW5lcjsKLSAgICBpZiAobUhhbFR1bmVyICE9IDApIHsKLSAgICAgICAgbUhhbFR1bmVyLT5saW5rVG9EZWF0aChIYWxEZWF0aEhhbmRsZXI6OmdldEluc3RhbmNlKCksIDAgLypjb29raWUqLyk7Ci0gICAgfQotfQotCi12b2lkIFJhZGlvSGFsSGlkbDo6VHVuZXI6OmhhbmRsZUh3RmFpbHVyZSgpCi17Ci0gICAgQUxPR1YoIiVzIElOIiwgX19GVU5DVElPTl9fKTsKLSAgICBzcDxSYWRpb0hhbEhpZGw+IHBhcmVudE1vZHVsZSA9IG1QYXJlbnRNb2R1bGUucHJvbW90ZSgpOwotICAgIGlmIChwYXJlbnRNb2R1bGUgIT0gMCkgewotICAgICAgICBwYXJlbnRNb2R1bGUtPmNsZWFyU2VydmljZSgpOwotICAgIH0KLSAgICBzZW5kSHdGYWlsdXJlRXZlbnQoKTsKLSAgICBtSGFsVHVuZXIuY2xlYXIoKTsKLX0KLQotdm9pZCBSYWRpb0hhbEhpZGw6OlR1bmVyOjpzZW5kSHdGYWlsdXJlRXZlbnQoKSBjb25zdAotewotICAgIHJhZGlvX2hhbF9ldmVudF90IGV2ZW50OwotICAgIG1lbXNldCgmZXZlbnQsIDAsIHNpemVvZihyYWRpb19oYWxfZXZlbnRfdCkpOwotICAgIGV2ZW50LnR5cGUgPSBSQURJT19FVkVOVF9IV19GQUlMVVJFOwotICAgIG9uQ2FsbGJhY2soJmV2ZW50KTsKLX0KLQotdm9pZCBSYWRpb0hhbEhpZGw6OlR1bmVyOjpvbkNhbGxiYWNrKHJhZGlvX2hhbF9ldmVudF90ICpoYWxFdmVudCkgY29uc3QKLXsKLSAgICBpZiAobUNhbGxiYWNrICE9IDApIHsKLSAgICAgICAgbUNhbGxiYWNrLT5vbkV2ZW50KGhhbEV2ZW50KTsKLSAgICB9Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvSGFsSGlkbC5oIGIvc2VydmljZXMvcmFkaW8vUmFkaW9IYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ODQyMGQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvcmFkaW8vUmFkaW9IYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19IQUxfSElETF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfUkFESU9fSEFMX0hJRExfSAotCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlICJSYWRpb0ludGVyZmFjZS5oIgotI2luY2x1ZGUgIlR1bmVySW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiVHVuZXJDYWxsYmFja0ludGVyZmFjZS5oIgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYnJvYWRjYXN0cmFkaW8vMS4wL3R5cGVzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9icm9hZGNhc3RyYWRpby8xLjAvSUJyb2FkY2FzdFJhZGlvLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9icm9hZGNhc3RyYWRpby8xLjAvSVR1bmVyLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9icm9hZGNhc3RyYWRpby8xLjAvSVR1bmVyQ2FsbGJhY2suaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpSZXN1bHQ7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YnJvYWRjYXN0cmFkaW86OlYxXzA6OklCcm9hZGNhc3RSYWRpbzsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6SVR1bmVyOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpJVHVuZXJDYWxsYmFjazsKLQotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpCYW5kQ29uZmlnOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJyb2FkY2FzdHJhZGlvOjpWMV8wOjpQcm9ncmFtSW5mbzsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpicm9hZGNhc3RyYWRpbzo6VjFfMDo6TWV0YURhdGE7Ci0KLWNsYXNzIFJhZGlvSGFsSGlkbCA6IHB1YmxpYyBSYWRpb0ludGVyZmFjZQotewotcHVibGljOgotICAgICAgICAgICAgICAgICAgICBSYWRpb0hhbEhpZGwocmFkaW9fY2xhc3NfdCBjbGFzc0lkKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBSYWRpb0ludGVyZmFjZQotICAgICAgICB2aXJ0dWFsIGludCBnZXRQcm9wZXJ0aWVzKHJhZGlvX2hhbF9wcm9wZXJ0aWVzX3QgKnByb3BlcnRpZXMpOwotICAgICAgICB2aXJ0dWFsIGludCBvcGVuVHVuZXIoY29uc3QgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxUdW5lckNhbGxiYWNrSW50ZXJmYWNlPiBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPFR1bmVySW50ZXJmYWNlPiYgdHVuZXIpOwotICAgICAgICB2aXJ0dWFsIGludCBjbG9zZVR1bmVyKHNwPFR1bmVySW50ZXJmYWNlPiYgdHVuZXIpOwotCi0gICAgICAgIGNsYXNzIFR1bmVyICA6IHB1YmxpYyBUdW5lckludGVyZmFjZSwgcHVibGljIHZpcnR1YWwgSVR1bmVyQ2FsbGJhY2sKLSAgICAgICAgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBUdW5lcihzcDxUdW5lckNhbGxiYWNrSW50ZXJmYWNlPiBjYWxsYmFjaywgc3A8UmFkaW9IYWxIaWRsPiBtb2R1bGUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUdW5lckludGVyZmFjZQotICAgICAgICAgICAgdmlydHVhbCBpbnQgc2V0Q29uZmlndXJhdGlvbihjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnKTsKLSAgICAgICAgICAgIHZpcnR1YWwgaW50IGdldENvbmZpZ3VyYXRpb24ocmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZyk7Ci0gICAgICAgICAgICB2aXJ0dWFsIGludCBzY2FuKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwX3N1Yl9jaGFubmVsKTsKLSAgICAgICAgICAgIHZpcnR1YWwgaW50IHN0ZXAocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBfc3ViX2NoYW5uZWwpOwotICAgICAgICAgICAgdmlydHVhbCBpbnQgdHVuZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IHN1Yl9jaGFubmVsKTsKLSAgICAgICAgICAgIHZpcnR1YWwgaW50IGNhbmNlbCgpOwotICAgICAgICAgICAgdmlydHVhbCBpbnQgZ2V0UHJvZ3JhbUluZm9ybWF0aW9uKHJhZGlvX3Byb2dyYW1faW5mb190ICppbmZvKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSVR1bmVyQ2FsbGJhY2sKLSAgICAgICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGhhcmR3YXJlRmFpbHVyZSgpOwotICAgICAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY29uZmlnQ2hhbmdlKFJlc3VsdCByZXN1bHQsIGNvbnN0IEJhbmRDb25maWcmIGNvbmZpZyk7Ci0gICAgICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiB0dW5lQ29tcGxldGUoUmVzdWx0IHJlc3VsdCwgY29uc3QgUHJvZ3JhbUluZm8mIGluZm8pOwotICAgICAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gYWZTd2l0Y2goY29uc3QgUHJvZ3JhbUluZm8mIGluZm8pOwotICAgICAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gYW50ZW5uYVN0YXRlQ2hhbmdlKGJvb2wgY29ubmVjdGVkKTsKLSAgICAgICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IHRyYWZmaWNBbm5vdW5jZW1lbnQoYm9vbCBhY3RpdmUpOwotICAgICAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gZW1lcmdlbmN5QW5ub3VuY2VtZW50KGJvb2wgYWN0aXZlKTsKLSAgICAgICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG5ld01ldGFkYXRhKHVpbnQzMl90IGNoYW5uZWwsIHVpbnQzMl90IHN1YkNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjPE1ldGFEYXRhPiYgbWV0YWRhdGEpOwotCi0gICAgICAgICAgICB2b2lkIHNldEhhbFR1bmVyKHNwPElUdW5lcj4mIGhhbFR1bmVyKTsKLSAgICAgICAgICAgIHNwPElUdW5lcj4gZ2V0SGFsVHVuZXIoKSB7IHJldHVybiBtSGFsVHVuZXI7IH0KLQotICAgICAgICBwcml2YXRlOgotICAgICAgICAgICAgdmlydHVhbCAgICAgICAgICB+VHVuZXIoKTsKLQotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICBvbkNhbGxiYWNrKHJhZGlvX2hhbF9ldmVudF90ICpoYWxFdmVudCkgY29uc3Q7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgIGhhbmRsZUh3RmFpbHVyZSgpOwotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICBzZW5kSHdGYWlsdXJlRXZlbnQoKSBjb25zdDsKLQotICAgICAgICAgICAgc3A8SVR1bmVyPiBtSGFsVHVuZXI7Ci0gICAgICAgICAgICBjb25zdCBzcDxUdW5lckNhbGxiYWNrSW50ZXJmYWNlPiBtQ2FsbGJhY2s7Ci0gICAgICAgICAgICB3cDxSYWRpb0hhbEhpZGw+IG1QYXJlbnRNb2R1bGU7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgc3A8SUJyb2FkY2FzdFJhZGlvPiBnZXRTZXJ2aWNlKCk7Ci0gICAgICAgIHZvaWQgY2xlYXJTZXJ2aWNlKCk7Ci0KLXByaXZhdGU6Ci0gICAgICAgIHZpcnR1YWwgICAgICAgICB+UmFkaW9IYWxIaWRsKCk7Ci0KLSAgICAgICAgICAgICAgICByYWRpb19jbGFzc190IG1DbGFzc0lkOwotICAgICAgICAgICAgICAgIHNwPElCcm9hZGNhc3RSYWRpbz4gbUhhbE1vZHVsZTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfUkFESU9fSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvcmFkaW8vUmFkaW9IYWxMZWdhY3kuY3BwIGIvc2VydmljZXMvcmFkaW8vUmFkaW9IYWxMZWdhY3kuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTBjY2Q0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvSGFsTGVnYWN5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJSYWRpb0hhbExlZ2FjeSIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KLSNpbmNsdWRlICJSYWRpb0hhbExlZ2FjeS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNvbnN0IGNoYXIgKlJhZGlvSGFsTGVnYWN5OjpzQ2xhc3NNb2R1bGVOYW1lc1tdID0gewotICAgIFJBRElPX0hBUkRXQVJFX01PRFVMRV9JRF9GTSwgLyogY29ycmVzcG9uZHMgdG8gUkFESU9fQ0xBU1NfQU1fRk0gKi8KLSAgICBSQURJT19IQVJEV0FSRV9NT0RVTEVfSURfU0FULCAgLyogY29ycmVzcG9uZHMgdG8gUkFESU9fQ0xBU1NfU0FUICovCi0gICAgUkFESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0RULCAgIC8qIGNvcnJlc3BvbmRzIHRvIFJBRElPX0NMQVNTX0RUICovCi19OwotCi0vKiBzdGF0aWMgKi8KLXNwPFJhZGlvSW50ZXJmYWNlPiBSYWRpb0ludGVyZmFjZTo6Y29ubmVjdE1vZHVsZShyYWRpb19jbGFzc190IGNsYXNzSWQpCi17Ci0gICAgcmV0dXJuIG5ldyBSYWRpb0hhbExlZ2FjeShjbGFzc0lkKTsKLX0KLQotUmFkaW9IYWxMZWdhY3k6OlJhZGlvSGFsTGVnYWN5KHJhZGlvX2NsYXNzX3QgY2xhc3NJZCkKLSAgICA6IFJhZGlvSW50ZXJmYWNlKCksIG1DbGFzc0lkKGNsYXNzSWQpLCBtSHdEZXZpY2UoTlVMTCkKLXsKLX0KLQotdm9pZCBSYWRpb0hhbExlZ2FjeTo6b25GaXJzdFJlZigpCi17Ci0gICAgY29uc3QgaHdfbW9kdWxlX3QgKm1vZDsKLSAgICBpbnQgcmM7Ci0gICAgQUxPR0koIiVzIG1DbGFzc0lkICVkIiwgX19GVU5DVElPTl9fLCBtQ2xhc3NJZCk7Ci0KLSAgICBtSHdEZXZpY2UgPSBOVUxMOwotCi0gICAgaWYgKChtQ2xhc3NJZCA8IDApIHx8Ci0gICAgICAgICAgICAobUNsYXNzSWQgPj0gTkVMRU0oc0NsYXNzTW9kdWxlTmFtZXMpKSkgewotICAgICAgICBBTE9HRSgiaW52YWxpZCBjbGFzcyBJRCAlZCIsIG1DbGFzc0lkKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEFMT0dJKCIlcyBSQURJT19IQVJEV0FSRV9NT0RVTEVfSUQgJXMgJXMiLAotICAgICAgICAgIF9fRlVOQ1RJT05fXywgUkFESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBzQ2xhc3NNb2R1bGVOYW1lc1ttQ2xhc3NJZF0pOwotCi0gICAgcmMgPSBod19nZXRfbW9kdWxlX2J5X2NsYXNzKFJBRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgc0NsYXNzTW9kdWxlTmFtZXNbbUNsYXNzSWRdLCAmbW9kKTsKLSAgICBpZiAocmMgIT0gMCkgewotICAgICAgICBBTE9HRSgiY291bGRuJ3QgbG9hZCByYWRpbyBtb2R1bGUgJXMuJXMgKCVzKSIsCi0gICAgICAgICAgICAgIFJBRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgc0NsYXNzTW9kdWxlTmFtZXNbbUNsYXNzSWRdLCBzdHJlcnJvcigtcmMpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByYyA9IHJhZGlvX2h3X2RldmljZV9vcGVuKG1vZCwgJm1Id0RldmljZSk7Ci0gICAgaWYgKHJjICE9IDApIHsKLSAgICAgICAgQUxPR0UoImNvdWxkbid0IG9wZW4gcmFkaW8gaHcgZGV2aWNlIGluICVzLiVzICglcykiLAotICAgICAgICAgICAgICBSQURJT19IQVJEV0FSRV9NT0RVTEVfSUQsICJwcmltYXJ5Iiwgc3RyZXJyb3IoLXJjKSk7Ci0gICAgICAgIG1Id0RldmljZSA9IE5VTEw7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG1Id0RldmljZS0+Y29tbW9uLnZlcnNpb24gIT0gUkFESU9fREVWSUNFX0FQSV9WRVJTSU9OX0NVUlJFTlQpIHsKLSAgICAgICAgQUxPR0UoIndyb25nIHJhZGlvIGh3IGRldmljZSB2ZXJzaW9uICUwNHgiLCBtSHdEZXZpY2UtPmNvbW1vbi52ZXJzaW9uKTsKLSAgICAgICAgcmFkaW9faHdfZGV2aWNlX2Nsb3NlKG1Id0RldmljZSk7Ci0gICAgICAgIG1Id0RldmljZSA9IE5VTEw7Ci0gICAgfQotfQotCi1SYWRpb0hhbExlZ2FjeTo6flJhZGlvSGFsTGVnYWN5KCkKLXsKLSAgICBpZiAobUh3RGV2aWNlICE9IE5VTEwpIHsKLSAgICAgICAgcmFkaW9faHdfZGV2aWNlX2Nsb3NlKG1Id0RldmljZSk7Ci0gICAgfQotfQotCi1pbnQgUmFkaW9IYWxMZWdhY3k6OmdldFByb3BlcnRpZXMocmFkaW9faGFsX3Byb3BlcnRpZXNfdCAqcHJvcGVydGllcykKLXsKLSAgICBpZiAobUh3RGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotCi0gICAgaW50IHJjID0gbUh3RGV2aWNlLT5nZXRfcHJvcGVydGllcyhtSHdEZXZpY2UsIHByb3BlcnRpZXMpOwotICAgIGlmIChyYyAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJjb3VsZCBub3QgcmVhZCBpbXBsZW1lbnRhdGlvbiBwcm9wZXJ0aWVzIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJjOwotfQotCi1pbnQgUmFkaW9IYWxMZWdhY3k6Om9wZW5UdW5lcihjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgIGJvb2wgYXVkaW8sCi0gICAgICAgICAgICAgICAgc3A8VHVuZXJDYWxsYmFja0ludGVyZmFjZT4gY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgc3A8VHVuZXJJbnRlcmZhY2U+JiB0dW5lcikKLXsKLSAgICBpZiAobUh3RGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHNwPFR1bmVyPiB0dW5lckltcGwgPSBuZXcgVHVuZXIoY2FsbGJhY2spOwotCi0gICAgY29uc3Qgc3RydWN0IHJhZGlvX3R1bmVyICpoYWxUdW5lcjsKLSAgICBpbnQgcmMgPSBtSHdEZXZpY2UtPm9wZW5fdHVuZXIobUh3RGV2aWNlLCBjb25maWcsIGF1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWRpb0hhbExlZ2FjeTo6VHVuZXI6OmNhbGxiYWNrLCB0dW5lckltcGwuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoYWxUdW5lcik7Ci0gICAgaWYgKHJjID09IDApIHsKLSAgICAgICAgdHVuZXJJbXBsLT5zZXRIYWxUdW5lcihoYWxUdW5lcik7Ci0gICAgICAgIHR1bmVyID0gdHVuZXJJbXBsOwotICAgIH0KLSAgICByZXR1cm4gcmM7Ci19Ci0KLWludCBSYWRpb0hhbExlZ2FjeTo6Y2xvc2VUdW5lcihzcDxUdW5lckludGVyZmFjZT4mIHR1bmVyKQotewotICAgIGlmIChtSHdEZXZpY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgaWYgKHR1bmVyID09IDApIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIHNwPFR1bmVyPiB0dW5lckltcGwgPSAoVHVuZXIgKil0dW5lci5nZXQoKTsKLSAgICByZXR1cm4gbUh3RGV2aWNlLT5jbG9zZV90dW5lcihtSHdEZXZpY2UsIHR1bmVySW1wbC0+Z2V0SGFsVHVuZXIoKSk7Ci19Ci0KLWludCBSYWRpb0hhbExlZ2FjeTo6VHVuZXI6OnNldENvbmZpZ3VyYXRpb24oY29uc3QgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZykKLXsKLSAgICBpZiAobUhhbFR1bmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiBtSGFsVHVuZXItPnNldF9jb25maWd1cmF0aW9uKG1IYWxUdW5lciwgY29uZmlnKTsKLX0KLQotaW50IFJhZGlvSGFsTGVnYWN5OjpUdW5lcjo6Z2V0Q29uZmlndXJhdGlvbihyYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnKQotewotICAgIGlmIChtSGFsVHVuZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIG1IYWxUdW5lci0+Z2V0X2NvbmZpZ3VyYXRpb24obUhhbFR1bmVyLCBjb25maWcpOwotfQotCi1pbnQgUmFkaW9IYWxMZWdhY3k6OlR1bmVyOjpzY2FuKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwX3N1Yl9jaGFubmVsKQotewotICAgIGlmIChtSGFsVHVuZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIG1IYWxUdW5lci0+c2NhbihtSGFsVHVuZXIsIGRpcmVjdGlvbiwgc2tpcF9zdWJfY2hhbm5lbCk7Ci19Ci0KLWludCBSYWRpb0hhbExlZ2FjeTo6VHVuZXI6OnN0ZXAocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBfc3ViX2NoYW5uZWwpCi17Ci0gICAgaWYgKG1IYWxUdW5lciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gbUhhbFR1bmVyLT5zdGVwKG1IYWxUdW5lciwgZGlyZWN0aW9uLCBza2lwX3N1Yl9jaGFubmVsKTsKLX0KLQotaW50IFJhZGlvSGFsTGVnYWN5OjpUdW5lcjo6dHVuZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IHN1Yl9jaGFubmVsKQotewotICAgIGlmIChtSGFsVHVuZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIG1IYWxUdW5lci0+dHVuZShtSGFsVHVuZXIsIGNoYW5uZWwsIHN1Yl9jaGFubmVsKTsKLX0KLQotaW50IFJhZGlvSGFsTGVnYWN5OjpUdW5lcjo6Y2FuY2VsKCkKLXsKLSAgICBpZiAobUhhbFR1bmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiBtSGFsVHVuZXItPmNhbmNlbChtSGFsVHVuZXIpOwotfQotCi1pbnQgUmFkaW9IYWxMZWdhY3k6OlR1bmVyOjpnZXRQcm9ncmFtSW5mb3JtYXRpb24ocmFkaW9fcHJvZ3JhbV9pbmZvX3QgKmluZm8pCi17Ci0gICAgaWYgKG1IYWxUdW5lciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gbUhhbFR1bmVyLT5nZXRfcHJvZ3JhbV9pbmZvcm1hdGlvbihtSGFsVHVuZXIsIGluZm8pOwotfQotCi12b2lkIFJhZGlvSGFsTGVnYWN5OjpUdW5lcjo6b25DYWxsYmFjayhyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQpCi17Ci0gICAgaWYgKG1DYWxsYmFjayAhPSAwKSB7Ci0gICAgICAgIG1DYWxsYmFjay0+b25FdmVudChoYWxFdmVudCk7Ci0gICAgfQotfQotCi0vL3N0YXRpYwotdm9pZCBSYWRpb0hhbExlZ2FjeTo6VHVuZXI6OmNhbGxiYWNrKHJhZGlvX2hhbF9ldmVudF90ICpoYWxFdmVudCwgdm9pZCAqY29va2llKQotewotICAgIHdwPFJhZGlvSGFsTGVnYWN5OjpUdW5lcj4gd2VhayA9IHdwPFJhZGlvSGFsTGVnYWN5OjpUdW5lcj4oKFJhZGlvSGFsTGVnYWN5OjpUdW5lciAqKWNvb2tpZSk7Ci0gICAgc3A8UmFkaW9IYWxMZWdhY3k6OlR1bmVyPiB0dW5lciA9IHdlYWsucHJvbW90ZSgpOwotICAgIGlmICh0dW5lciAhPSAwKSB7Ci0gICAgICAgIHR1bmVyLT5vbkNhbGxiYWNrKGhhbEV2ZW50KTsKLSAgICB9Ci19Ci0KLVJhZGlvSGFsTGVnYWN5OjpUdW5lcjo6VHVuZXIoc3A8VHVuZXJDYWxsYmFja0ludGVyZmFjZT4gY2FsbGJhY2spCi0gICAgOiBUdW5lckludGVyZmFjZSgpLCBtSGFsVHVuZXIoTlVMTCksIG1DYWxsYmFjayhjYWxsYmFjaykKLXsKLX0KLQotCi1SYWRpb0hhbExlZ2FjeTo6VHVuZXI6On5UdW5lcigpCi17Ci19Ci0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvcmFkaW8vUmFkaW9IYWxMZWdhY3kuaCBiL3NlcnZpY2VzL3JhZGlvL1JhZGlvSGFsTGVnYWN5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNDgzMWIuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvcmFkaW8vUmFkaW9IYWxMZWdhY3kuaAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfUkFESU9fSEFMX0xFR0FDWV9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfUkFESU9fSEFMX0xFR0FDWV9ICi0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvcmFkaW8uaD4KLSNpbmNsdWRlICJSYWRpb0ludGVyZmFjZS5oIgotI2luY2x1ZGUgIlR1bmVySW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiVHVuZXJDYWxsYmFja0ludGVyZmFjZS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFJhZGlvSGFsTGVnYWN5IDogcHVibGljIFJhZGlvSW50ZXJmYWNlCi17Ci1wdWJsaWM6Ci0gICAgICAgIFJhZGlvSGFsTGVnYWN5KHJhZGlvX2NsYXNzX3QgY2xhc3NJZCk7Ci0KLSAgICAgICAgLy8gUmFkaW9JbnRlcmZhY2UKLSAgICAgICAgdmlydHVhbCBpbnQgZ2V0UHJvcGVydGllcyhyYWRpb19oYWxfcHJvcGVydGllc190ICpwcm9wZXJ0aWVzKTsKLSAgICAgICAgdmlydHVhbCBpbnQgb3BlblR1bmVyKGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGF1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgc3A8VHVuZXJDYWxsYmFja0ludGVyZmFjZT4gY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICBzcDxUdW5lckludGVyZmFjZT4mIHR1bmVyKTsKLSAgICAgICAgdmlydHVhbCBpbnQgY2xvc2VUdW5lcihzcDxUdW5lckludGVyZmFjZT4mIHR1bmVyKTsKLQotICAgICAgICAvLyBSZWZCYXNlCi0gICAgICAgIHZpcnR1YWwgdm9pZCBvbkZpcnN0UmVmKCk7Ci0KLSAgICAgICAgY2xhc3MgVHVuZXIgIDogcHVibGljIFR1bmVySW50ZXJmYWNlCi0gICAgICAgIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgVHVuZXIoc3A8VHVuZXJDYWxsYmFja0ludGVyZmFjZT4gY2FsbGJhY2spOwotCi0gICAgICAgICAgICB2aXJ0dWFsIGludCBzZXRDb25maWd1cmF0aW9uKGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpjb25maWcpOwotICAgICAgICAgICAgdmlydHVhbCBpbnQgZ2V0Q29uZmlndXJhdGlvbihyYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnKTsKLSAgICAgICAgICAgIHZpcnR1YWwgaW50IHNjYW4ocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBfc3ViX2NoYW5uZWwpOwotICAgICAgICAgICAgdmlydHVhbCBpbnQgc3RlcChyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcF9zdWJfY2hhbm5lbCk7Ci0gICAgICAgICAgICB2aXJ0dWFsIGludCB0dW5lKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgc3ViX2NoYW5uZWwpOwotICAgICAgICAgICAgdmlydHVhbCBpbnQgY2FuY2VsKCk7Ci0gICAgICAgICAgICB2aXJ0dWFsIGludCBnZXRQcm9ncmFtSW5mb3JtYXRpb24ocmFkaW9fcHJvZ3JhbV9pbmZvX3QgKmluZm8pOwotCi0gICAgICAgICAgICBzdGF0aWMgdm9pZCBjYWxsYmFjayhyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQsIHZvaWQgKmNvb2tpZSk7Ci0gICAgICAgICAgICAgICAgICAgdm9pZCBvbkNhbGxiYWNrKHJhZGlvX2hhbF9ldmVudF90ICpoYWxFdmVudCk7Ci0KLSAgICAgICAgICAgIHZvaWQgc2V0SGFsVHVuZXIoY29uc3Qgc3RydWN0IHJhZGlvX3R1bmVyICpoYWxUdW5lcikgeyBtSGFsVHVuZXIgPSBoYWxUdW5lcjsgfQotICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX3R1bmVyICpnZXRIYWxUdW5lcigpIHsgcmV0dXJuIG1IYWxUdW5lcjsgfQotCi0gICAgICAgIHByaXZhdGU6Ci0gICAgICAgICAgICB2aXJ0dWFsICAgICAgflR1bmVyKCk7Ci0KLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb190dW5lciAgICAqbUhhbFR1bmVyOwotICAgICAgICAgICAgc3A8VHVuZXJDYWxsYmFja0ludGVyZmFjZT4gIG1DYWxsYmFjazsKLSAgICAgICAgfTsKLQotcHJvdGVjdGVkOgotICAgICAgICB2aXJ0dWFsICAgICB+UmFkaW9IYWxMZWdhY3koKTsKLQotcHJpdmF0ZToKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBzQ2xhc3NNb2R1bGVOYW1lc1tdOwotCi0gICAgICAgIHJhZGlvX2NsYXNzX3QgbUNsYXNzSWQ7Ci0gICAgICAgIHN0cnVjdCByYWRpb19od19kZXZpY2UgICptSHdEZXZpY2U7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0hBTF9MRUdBQ1lfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvcmFkaW8vUmFkaW9JbnRlcmZhY2UuaCBiL3NlcnZpY2VzL3JhZGlvL1JhZGlvSW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZmI0ZDUuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvcmFkaW8vUmFkaW9JbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfUkFESU9fSU5URVJGQUNFX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19JTlRFUkZBQ0VfSAotCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHN5c3RlbS9yYWRpby5oPgotI2luY2x1ZGUgIlR1bmVySW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiVHVuZXJDYWxsYmFja0ludGVyZmFjZS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFJhZGlvSW50ZXJmYWNlIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZQotewotcHVibGljOgotICAgICAgICAvKiBnZXQgYSBzb3VuZCB0cmlnZ2VyIEhBTCBpbnN0YW5jZSAqLwotICAgICAgICBzdGF0aWMgc3A8UmFkaW9JbnRlcmZhY2U+IGNvbm5lY3RNb2R1bGUocmFkaW9fY2xhc3NfdCBjbGFzc0lkKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBSZXRyaWV2ZSBpbXBsZW1lbnRhdGlvbiBwcm9wZXJ0aWVzLgotICAgICAgICAgKgotICAgICAgICAgKiBhcmd1bWVudHM6Ci0gICAgICAgICAqIC0gcHJvcGVydGllczogd2hlcmUgdG8gcmV0dXJuIHRoZSBtb2R1bGUgcHJvcGVydGllcwotICAgICAgICAgKgotICAgICAgICAgKiByZXR1cm5zOgotICAgICAgICAgKiAgMCBpZiBubyBlcnJvcgotICAgICAgICAgKiAgLUVJTlZBTCBpZiBpbnZhbGlkIGFyZ3VtZW50cyBhcmUgcGFzc2VkCi0gICAgICAgICAqLwotICAgICAgICB2aXJ0dWFsIGludCBnZXRQcm9wZXJ0aWVzKHJhZGlvX2hhbF9wcm9wZXJ0aWVzX3QgKnByb3BlcnRpZXMpID0gMDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBPcGVuIGEgdHVuZXIgaW50ZXJmYWNlIGZvciB0aGUgcmVxdWVzdGVkIGNvbmZpZ3VyYXRpb24uCi0gICAgICAgICAqIElmIG5vIG90aGVyIHR1bmVyIGlzIG9wZW5lZCwgdGhpcyB3aWxsIGFjdGl2YXRlIHRoZSByYWRpbyBtb2R1bGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIGFyZ3VtZW50czoKLSAgICAgICAgICogLSBjb25maWc6IHRoZSBiYW5kIGNvbmZpZ3VyYXRpb24gdG8gYXBwbHkKLSAgICAgICAgICogLSBhdWRpbzogdGhpcyB0dW5lciB3aWxsIGJlIHVzZWQgZm9yIGxpdmUgcmFkaW8gbGlzdGVuaW5nIGFuZCBzaG91bGQgYmUgY29ubmVjdGVkIHRvCi0gICAgICAgICAqIHRoZSByYWRpbyBhdWRpbyBzb3VyY2UuCi0gICAgICAgICAqIC0gY2FsbGJhY2s6IHRoZSBldmVudCBjYWxsYmFjawotICAgICAgICAgKiAtIGNvb2tpZTogdGhlIGNvb2tpZSB0byBwYXNzIHdoZW4gY2FsbGluZyB0aGUgY2FsbGJhY2sKLSAgICAgICAgICogLSB0dW5lcjogd2hlcmUgdG8gcmV0dXJuIHRoZSB0dW5lciBpbnRlcmZhY2UKLSAgICAgICAgICoKLSAgICAgICAgICogcmV0dXJuczoKLSAgICAgICAgICogIDAgaWYgSFcgd2FzIHBvd2VyZWQgdXAgYW5kIGNvbmZpZ3VyYXRpb24gY291bGQgYmUgYXBwbGllZAotICAgICAgICAgKiAgLUVJTlZBTCBpZiBjb25maWd1cmF0aW9uIHJlcXVlc3RlZCBpcyBpbnZhbGlkCi0gICAgICAgICAqICAtRU5PU1lTIGlmIGNhbGxlZCBvdXQgb2Ygc2VxdWVuY2UKLSAgICAgICAgICoKLSAgICAgICAgICogQ2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBldmVudCBSQURJT19FVkVOVF9DT05GSUcgTVVTVCBiZSBjYWxsZWQgb25jZSB0aGUKLSAgICAgICAgICogY29uZmlndXJhdGlvbiBpcyBhcHBsaWVkIG9yIGEgZmFpbHVyZSBvY2N1cnMgb3IgYWZ0ZXIgYSB0aW1lIG91dC4KLSAgICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgaW50IG9wZW5UdW5lcihjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2U+IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgc3A8VHVuZXJJbnRlcmZhY2U+JiB0dW5lcikgPSAwOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIENsb3NlIGEgdHVuZXIgaW50ZXJmYWNlLgotICAgICAgICAgKiBJZiB0aGUgbGFzdCB0dW5lciBpcyBjbG9zZWQsIHRoZSByYWRpbyBtb2R1bGUgaXMgZGVhY3RpdmF0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIGFyZ3VtZW50czoKLSAgICAgICAgICogLSB0dW5lcjogdGhlIHR1bmVyIGludGVyZmFjZSB0byBjbG9zZQotICAgICAgICAgKgotICAgICAgICAgKiByZXR1cm5zOgotICAgICAgICAgKiAgMCBpZiBwb3dlcmVkIGRvd24gc3VjY2Vzc2Z1bGx5LgotICAgICAgICAgKiAgLUVJTlZBTCBpZiBhbiBpbnZhbGlkIGFyZ3VtZW50IGlzIHBhc3NlZAotICAgICAgICAgKiAgLUVOT1NZUyBpZiBjYWxsZWQgb3V0IG9mIHNlcXVlbmNlCi0gICAgICAgICAqLwotICAgICAgICB2aXJ0dWFsIGludCBjbG9zZVR1bmVyKHNwPFR1bmVySW50ZXJmYWNlPiYgdHVuZXIpID0gMDsKLQotcHJvdGVjdGVkOgotICAgICAgICBSYWRpb0ludGVyZmFjZSgpIHt9Ci0gICAgICAgIHZpcnR1YWwgICAgIH5SYWRpb0ludGVyZmFjZSgpIHt9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0lOVEVSRkFDRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9SYWRpb1JlZ2lvbnMuaCBiL3NlcnZpY2VzL3JhZGlvL1JhZGlvUmVnaW9ucy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDBlZTgzLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvUmVnaW9ucy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfUkFESU9fUkVHSU9OU19ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfUkFESU9fUkVHSU9OU19ICi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotI2RlZmluZSBSQURJT19CQU5EX0xPV0VSX0ZNX0lUVTEgICAgODc1MDAKLSNkZWZpbmUgUkFESU9fQkFORF9VUFBFUl9GTV9JVFUxICAgIDEwODAwMAotI2RlZmluZSBSQURJT19CQU5EX1NQQUNJTkdfRk1fSVRVMSAgMTAwCi0KLSNkZWZpbmUgUkFESU9fQkFORF9MT1dFUl9GTV9JVFUyICAgIDg3OTAwCi0jZGVmaW5lIFJBRElPX0JBTkRfVVBQRVJfRk1fSVRVMiAgICAxMDc5MDAKLSNkZWZpbmUgUkFESU9fQkFORF9TUEFDSU5HX0ZNX0lUVTIgIDIwMAotCi0jZGVmaW5lIFJBRElPX0JBTkRfTE9XRVJfRk1fSkFQQU4gICAgNzYwMDAKLSNkZWZpbmUgUkFESU9fQkFORF9VUFBFUl9GTV9KQVBBTiAgICA5MDAwMAotI2RlZmluZSBSQURJT19CQU5EX1NQQUNJTkdfRk1fSkFQQU4gIDEwMAotCi0jZGVmaW5lIFJBRElPX0JBTkRfTE9XRVJfRk1fT0lSVCAgICA2NTgwMAotI2RlZmluZSBSQURJT19CQU5EX1VQUEVSX0ZNX09JUlQgICAgNzQwMDAKLSNkZWZpbmUgUkFESU9fQkFORF9TUEFDSU5HX0ZNX09JUlQgIDEwCi0KLSNkZWZpbmUgUkFESU9fQkFORF9MT1dFUl9MVyAgICAgICAgIDE1MwotI2RlZmluZSBSQURJT19CQU5EX1VQUEVSX0xXICAgICAgICAgMjc5Ci0jZGVmaW5lIFJBRElPX0JBTkRfU1BBQ0lOR19MVyAgICAgICA5Ci0KLSNkZWZpbmUgUkFESU9fQkFORF9MT1dFUl9NV19JVVQxICAgIDUzMQotI2RlZmluZSBSQURJT19CQU5EX1VQUEVSX01XX0lUVTEgICAgMTYxMQotI2RlZmluZSBSQURJT19CQU5EX1NQQUNJTkdfTVdfSVRVMSAgOQotCi0jZGVmaW5lIFJBRElPX0JBTkRfTE9XRVJfTVdfSVVUMiAgICA1NDAKLSNkZWZpbmUgUkFESU9fQkFORF9VUFBFUl9NV19JVFUyICAgIDE2MTAKLSNkZWZpbmUgUkFESU9fQkFORF9TUEFDSU5HX01XX0lUVTIgIDEwCi0KLSNkZWZpbmUgUkFESU9fQkFORF9MT1dFUl9TVyAgICAgICAgIDIzMDAKLSNkZWZpbmUgUkFESU9fQkFORF9VUFBFUl9TVyAgICAgICAgIDI2MTAwCi0jZGVmaW5lIFJBRElPX0JBTkRfU1BBQ0lOR19TVyAgICAgICA1Ci0KLQotI2lmbmRlZiBBUlJBWV9TSVpFCi0jZGVmaW5lIEFSUkFZX1NJWkUoYSkgKHNpemVvZihhKSAvIHNpemVvZigoYSlbMF0pKQotI2VuZGlmCi0KLWNvbnN0IHJhZGlvX2JhbmRfY29uZmlnX3Qgc0tub3duUmVnaW9uQ29uZmlnc1tdID0gewotICAgIHsgICAvLyBGTSBJVFUgMQotICAgICAgICBSQURJT19SRUdJT05fSVRVXzEsCi0gICAgICAgIHsKLSAgICAgICAgUkFESU9fQkFORF9GTSwKLSAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgUkFESU9fQkFORF9MT1dFUl9GTV9JVFUxLAotICAgICAgICAgICAgUkFESU9fQkFORF9VUFBFUl9GTV9JVFUxLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIHtSQURJT19CQU5EX1NQQUNJTkdfRk1fSVRVMX0sCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJBRElPX0RFRU1QSEFTSVNfNTAsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICBSQURJT19SRFNfV09STEQsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSwKLSAgICB7ICAgLy8gRk0gQW1lcmljYXMKLSAgICAgICAgUkFESU9fUkVHSU9OX0lUVV8yLAotICAgICAgICB7Ci0gICAgICAgIFJBRElPX0JBTkRfRk0sCi0gICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfTE9XRVJfRk1fSVRVMiwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfVVBQRVJfRk1fSVRVMiwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICB7UkFESU9fQkFORF9TUEFDSU5HX0ZNX0lUVTJ9LAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSQURJT19ERUVNUEhBU0lTXzc1LAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgUkFESU9fUkRTX1VTLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0sCi0gICAgeyAgIC8vIEZNIEphcGFuCi0gICAgICAgIFJBRElPX1JFR0lPTl9KQVBBTiwKLSAgICAgICAgewotICAgICAgICBSQURJT19CQU5EX0ZNLAotICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX0ZNX0pBUEFOLAotICAgICAgICAgICAgUkFESU9fQkFORF9VUFBFUl9GTV9KQVBBTiwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICB7UkFESU9fQkFORF9TUEFDSU5HX0ZNX0pBUEFOfSwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUkFESU9fREVFTVBIQVNJU181MCwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIFJBRElPX1JEU19XT1JMRCwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9LAotICAgIHsgICAvLyBGTSBLb3JlYQotICAgICAgICBSQURJT19SRUdJT05fS09SRUEsCi0gICAgICAgIHsKLSAgICAgICAgUkFESU9fQkFORF9GTSwKLSAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgUkFESU9fQkFORF9MT1dFUl9GTV9JVFUxLAotICAgICAgICAgICAgUkFESU9fQkFORF9VUFBFUl9GTV9JVFUxLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIHtSQURJT19CQU5EX1NQQUNJTkdfRk1fSVRVMX0sCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJBRElPX0RFRU1QSEFTSVNfNzUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICBSQURJT19SRFNfV09STEQsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSwKLSAgICB7ICAgLy8gRk0gT0lSVAotICAgICAgICBSQURJT19SRUdJT05fT0lSVCwKLSAgICAgICAgewotICAgICAgICBSQURJT19CQU5EX0ZNLAotICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX0ZNX09JUlQsCi0gICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX0ZNX09JUlQsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19GTV9PSVJUfSwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUkFESU9fREVFTVBIQVNJU181MCwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIFJBRElPX1JEU19XT1JMRCwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9LAotICAgIHsgICAvLyBGTSBVUyBIRCByYWRpbwotICAgICAgICBSQURJT19SRUdJT05fSVRVXzIsCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJBRElPX0JBTkRfRk1fSEQsCi0gICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfTE9XRVJfRk1fSVRVMiwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfVVBQRVJfRk1fSVRVMiwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICB7UkFESU9fQkFORF9TUEFDSU5HX0ZNX0lUVTJ9LAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSQURJT19ERUVNUEhBU0lTXzc1LAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgUkFESU9fUkRTX1VTLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0sCi0gICAgeyAgIC8vIEFNIExXCi0gICAgICAgIFJBRElPX1JFR0lPTl9JVFVfMSwKLSAgICAgICAgewotICAgICAgICAgICAgUkFESU9fQkFORF9BTSwKLSAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgUkFESU9fQkFORF9MT1dFUl9MVywKLSAgICAgICAgICAgIFJBRElPX0JBTkRfVVBQRVJfTFcsCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19MV30sCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9LAotICAgIHsgICAvLyBBTSBTVwotICAgICAgICBSQURJT19SRUdJT05fSVRVXzEsCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJBRElPX0JBTkRfQU0sCi0gICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfTE9XRVJfU1csCi0gICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX1NXLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIHtSQURJT19CQU5EX1NQQUNJTkdfU1d9LAotICAgICAgICAgICAgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSwKLSAgICB7ICAgLy8gQU0gTVcgSVRVMQotICAgICAgICBSQURJT19SRUdJT05fSVRVXzEsCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJBRElPX0JBTkRfQU0sCi0gICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfTE9XRVJfTVdfSVVUMSwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfVVBQRVJfTVdfSVRVMSwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICB7UkFESU9fQkFORF9TUEFDSU5HX01XX0lUVTF9LAotICAgICAgICAgICAgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSwKLSAgICB7ICAgLy8gQU0gTVcgSVRVMgotICAgICAgICBSQURJT19SRUdJT05fSVRVXzIsCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJBRElPX0JBTkRfQU0sCi0gICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfTE9XRVJfTVdfSVVUMiwKLSAgICAgICAgICAgIFJBRElPX0JBTkRfVVBQRVJfTVdfSVRVMiwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICB7UkFESU9fQkFORF9TUEFDSU5HX01XX0lUVTJ9LAotICAgICAgICAgICAgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfTsKLQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1JBRElPX1JFR0lPTlNfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvcmFkaW8vUmFkaW9TZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL3JhZGlvL1JhZGlvU2VydmljZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYjdjMDkuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvcmFkaW8vUmFkaW9TZXJ2aWNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDkzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJSYWRpb1NlcnZpY2UiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLQotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW9fbWV0YWRhdGEuaD4KLSNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5QmFzZS5oPgotI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgotI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ2FjaGUuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9yYWRpby5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+Ci0jaW5jbHVkZSAiUmFkaW9TZXJ2aWNlLmgiCi0jaW5jbHVkZSAiUmFkaW9SZWdpb25zLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIGNvbnN0IGNoYXIga1JhZGlvVHVuZXJBdWRpb0RldmljZU5hbWVbXSA9ICJSYWRpbyB0dW5lciBzb3VyY2UiOwotCi1zdGF0aWMgY29uc3QgU3RyaW5nMTYgUkFESU9fUEVSTUlTU0lPTigiYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19GTV9SQURJTyIpOwotCi1SYWRpb1NlcnZpY2U6OlJhZGlvU2VydmljZSgpCi0gICAgOiBCblJhZGlvU2VydmljZSgpLCBtTmV4dFVuaXF1ZUlkKDEpCi17Ci0gICAgQUxPR0koIiVzIiwgX19GVU5DVElPTl9fKTsKLX0KLQotdm9pZCBSYWRpb1NlcnZpY2U6Om9uRmlyc3RSZWYoKQotewotICAgIEFMT0dJKCIlcyIsIF9fRlVOQ1RJT05fXyk7Ci0KLSAgICBzcDxSYWRpb0ludGVyZmFjZT4gZGV2ID0gUmFkaW9JbnRlcmZhY2U6OmNvbm5lY3RNb2R1bGUoUkFESU9fQ0xBU1NfQU1fRk0pOwotCi0gICAgaWYgKGRldiA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3RydWN0IHJhZGlvX2hhbF9wcm9wZXJ0aWVzIGhhbFByb3BlcnRpZXM7Ci0gICAgaW50IHJjID0gZGV2LT5nZXRQcm9wZXJ0aWVzKCZoYWxQcm9wZXJ0aWVzKTsKLSAgICBpZiAocmMgIT0gMCkgewotICAgICAgICBBTE9HRSgiY291bGQgbm90IHJlYWQgaW1wbGVtZW50YXRpb24gcHJvcGVydGllcyIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcmFkaW9fcHJvcGVydGllc190IHByb3BlcnRpZXM7Ci0gICAgcHJvcGVydGllcy5oYW5kbGUgPQotICAgICAgICAgICAgKHJhZGlvX2hhbmRsZV90KWFuZHJvaWRfYXRvbWljX2luYygmbU5leHRVbmlxdWVJZCk7Ci0gICAgY29udmVydFByb3BlcnRpZXMoJnByb3BlcnRpZXMsICZoYWxQcm9wZXJ0aWVzKTsKLQotICAgIEFMT0dJKCJsb2FkZWQgZGVmYXVsdCBtb2R1bGUgJXMsIHZlciAlcywgaGFuZGxlICVkIiwgcHJvcGVydGllcy5wcm9kdWN0LAotICAgICAgICBwcm9wZXJ0aWVzLnZlcnNpb24sIHByb3BlcnRpZXMuaGFuZGxlKTsKLQotICAgIHNwPE1vZHVsZT4gbW9kdWxlID0gbmV3IE1vZHVsZShkZXYsIHByb3BlcnRpZXMpOwotICAgIG1Nb2R1bGVzLmFkZChwcm9wZXJ0aWVzLmhhbmRsZSwgbW9kdWxlKTsKLX0KLQotUmFkaW9TZXJ2aWNlOjp+UmFkaW9TZXJ2aWNlKCkKLXsKLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpsaXN0TW9kdWxlcyhzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyAqcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpCi17Ci0gICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oUkFESU9fUEVSTUlTU0lPTikpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBBTE9HVigibGlzdE1vZHVsZXMiKTsKLQotICAgIEF1dG9NdXRleCBsb2NrKG1TZXJ2aWNlTG9jayk7Ci0gICAgaWYgKG51bU1vZHVsZXMgPT0gTlVMTCB8fCAoKm51bU1vZHVsZXMgIT0gMCAmJiBwcm9wZXJ0aWVzID09IE5VTEwpKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHVpbnQzMl90IG1heE1vZHVsZXMgPSAqbnVtTW9kdWxlczsKLSAgICAqbnVtTW9kdWxlcyA9IG1Nb2R1bGVzLnNpemUoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Nb2R1bGVzLnNpemUoKSAmJiBpIDwgbWF4TW9kdWxlczsgaSsrKSB7Ci0gICAgICAgIHByb3BlcnRpZXNbaV0gPSBtTW9kdWxlcy52YWx1ZUF0KGkpLT5wcm9wZXJ0aWVzKCk7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjphdHRhY2gocmFkaW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVJhZGlvQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIHdpdGhBdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPElSYWRpbz4mIHJhZGlvKQotewotICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFJBRElPX1BFUk1JU1NJT04pKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgQUxPR1YoIiVzICVkIGNvbmZpZyAlcCB3aXRoQXVkaW8gJWQiLCBfX0ZVTkNUSU9OX18sIGhhbmRsZSwgY29uZmlnLCB3aXRoQXVkaW8pOwotCi0gICAgQXV0b011dGV4IGxvY2sobVNlcnZpY2VMb2NrKTsKLSAgICByYWRpby5jbGVhcigpOwotICAgIGlmIChjbGllbnQgPT0gMCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzc2l6ZV90IGluZGV4ID0gbU1vZHVsZXMuaW5kZXhPZktleShoYW5kbGUpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc3A8TW9kdWxlPiBtb2R1bGUgPSBtTW9kdWxlcy52YWx1ZUF0KGluZGV4KTsKLQotICAgIGlmIChjb25maWcgPT0gTlVMTCkgewotICAgICAgICBjb25maWcgPSBtb2R1bGUtPmdldERlZmF1bHRDb25maWcoKTsKLSAgICAgICAgaWYgKGNvbmZpZyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQUxPR1YoIiVzIHJlZ2lvbiAlZCB0eXBlICVkIiwgX19GVU5DVElPTl9fLCBjb25maWctPnJlZ2lvbiwgY29uZmlnLT5iYW5kLnR5cGUpOwotCi0gICAgcmFkaW8gPSBtb2R1bGUtPmFkZENsaWVudChjbGllbnQsIGNvbmZpZywgd2l0aEF1ZGlvKTsKLQotICAgIGlmIChyYWRpbyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLQotc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tSZXRyaWVzID0gNTA7Ci1zdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1NsZWVwID0gNjAwMDA7Ci0KLXN0YXRpYyBib29sIHRyeUxvY2soTXV0ZXgmIG11dGV4KQotewotICAgIGJvb2wgbG9ja2VkID0gZmFsc2U7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrRHVtcExvY2tSZXRyaWVzOyArK2kpIHsKLSAgICAgICAgaWYgKG11dGV4LnRyeUxvY2soKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgbG9ja2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHVzbGVlcChrRHVtcExvY2tTbGVlcCk7Ci0gICAgfQotICAgIHJldHVybiBsb2NrZWQ7Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpIHsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLSAgICBpZiAoY2hlY2tDYWxsaW5nUGVybWlzc2lvbihTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKSkgPT0gZmFsc2UpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiUGVybWlzc2lvbiBEZW5pYWw6IGNhbid0IGR1bXAgUmFkaW9TZXJ2aWNlIik7Ci0gICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJvb2wgbG9ja2VkID0gdHJ5TG9jayhtU2VydmljZUxvY2spOwotICAgICAgICAvLyBmYWlsZWQgdG8gbG9jayAtIFJhZGlvU2VydmljZSBpcyBwcm9iYWJseSBkZWFkbG9ja2VkCi0gICAgICAgIGlmICghbG9ja2VkKSB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJSYWRpb1NlcnZpY2UgbWF5IGJlIGRlYWRsb2NrZWRcbiIpOwotICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobG9ja2VkKSBtU2VydmljZUxvY2sudW5sb2NrKCk7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpIHsKLSAgICByZXR1cm4gQm5SYWRpb1NlcnZpY2U6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLX0KLQotCi0vKiBzdGF0aWMgKi8KLXZvaWQgUmFkaW9TZXJ2aWNlOjpjb252ZXJ0UHJvcGVydGllcyhyYWRpb19wcm9wZXJ0aWVzX3QgKnByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFkaW9faGFsX3Byb3BlcnRpZXNfdCAqaGFsUHJvcGVydGllcykKLXsKLSAgICBtZW1zZXQocHJvcGVydGllcywgMCwgc2l6ZW9mKHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzKSk7Ci0gICAgcHJvcGVydGllcy0+Y2xhc3NfaWQgPSBoYWxQcm9wZXJ0aWVzLT5jbGFzc19pZDsKLSAgICBzdHJsY3B5KHByb3BlcnRpZXMtPmltcGxlbWVudG9yLCBoYWxQcm9wZXJ0aWVzLT5pbXBsZW1lbnRvciwKLSAgICAgICAgICAgIFJBRElPX1NUUklOR19MRU5fTUFYKTsKLSAgICBzdHJsY3B5KHByb3BlcnRpZXMtPnByb2R1Y3QsIGhhbFByb3BlcnRpZXMtPnByb2R1Y3QsCi0gICAgICAgICAgICBSQURJT19TVFJJTkdfTEVOX01BWCk7Ci0gICAgc3RybGNweShwcm9wZXJ0aWVzLT52ZXJzaW9uLCBoYWxQcm9wZXJ0aWVzLT52ZXJzaW9uLAotICAgICAgICAgICAgUkFESU9fU1RSSU5HX0xFTl9NQVgpOwotICAgIHN0cmxjcHkocHJvcGVydGllcy0+c2VyaWFsLCBoYWxQcm9wZXJ0aWVzLT5zZXJpYWwsCi0gICAgICAgICAgICBSQURJT19TVFJJTkdfTEVOX01BWCk7Ci0gICAgcHJvcGVydGllcy0+bnVtX3R1bmVycyA9IGhhbFByb3BlcnRpZXMtPm51bV90dW5lcnM7Ci0gICAgcHJvcGVydGllcy0+bnVtX2F1ZGlvX3NvdXJjZXMgPSBoYWxQcm9wZXJ0aWVzLT5udW1fYXVkaW9fc291cmNlczsKLSAgICBwcm9wZXJ0aWVzLT5zdXBwb3J0c19jYXB0dXJlID0gaGFsUHJvcGVydGllcy0+c3VwcG9ydHNfY2FwdHVyZTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShzS25vd25SZWdpb25Db25maWdzKTsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZ190ICpiYW5kID0gJnNLbm93blJlZ2lvbkNvbmZpZ3NbaV0uYmFuZDsKLSAgICAgICAgc2l6ZV90IGo7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCBoYWxQcm9wZXJ0aWVzLT5udW1fYmFuZHM7IGorKykgewotICAgICAgICAgICAgY29uc3QgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmhhbEJhbmQgPSAmaGFsUHJvcGVydGllcy0+YmFuZHNbal07Ci0gICAgICAgICAgICBzaXplX3QgazsKLSAgICAgICAgICAgIGlmIChiYW5kLT50eXBlICE9IGhhbEJhbmQtPnR5cGUpIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKGJhbmQtPmxvd2VyX2xpbWl0IDwgaGFsQmFuZC0+bG93ZXJfbGltaXQpIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKGJhbmQtPnVwcGVyX2xpbWl0ID4gaGFsQmFuZC0+dXBwZXJfbGltaXQpIGNvbnRpbnVlOwotICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGhhbEJhbmQtPm51bV9zcGFjaW5nczsgaysrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJhbmQtPnNwYWNpbmdzWzBdID09IGhhbEJhbmQtPnNwYWNpbmdzW2tdKSBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChrID09IGhhbEJhbmQtPm51bV9zcGFjaW5ncykgY29udGludWU7Ci0gICAgICAgICAgICBpZiAoYmFuZC0+dHlwZSA9PSBSQURJT19CQU5EX0FNKSBicmVhazsKLSAgICAgICAgICAgIGlmICgoYmFuZC0+Zm0uZGVlbXBoYXNpcyAmIGhhbEJhbmQtPmZtLmRlZW1waGFzaXMpID09IDApIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKGhhbEJhbmQtPmZtLnJkcyA9PSAwKSBicmVhazsKLSAgICAgICAgICAgIGlmICgoYmFuZC0+Zm0ucmRzICYgaGFsQmFuZC0+Zm0ucmRzKSAhPSAwKSBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoaiA9PSBoYWxQcm9wZXJ0aWVzLT5udW1fYmFuZHMpIGNvbnRpbnVlOwotCi0gICAgICAgIEFMT0dJKCJjb252ZXJ0UHJvcGVydGllcygpIEFkZGluZyBiYW5kIHR5cGUgJWQgcmVnaW9uICVkIiwKLSAgICAgICAgICAgICAgc0tub3duUmVnaW9uQ29uZmlnc1tpXS5iYW5kLnR5cGUgLCBzS25vd25SZWdpb25Db25maWdzW2ldLnJlZ2lvbik7Ci0KLSAgICAgICAgbWVtY3B5KCZwcm9wZXJ0aWVzLT5iYW5kc1twcm9wZXJ0aWVzLT5udW1fYmFuZHMrK10sCi0gICAgICAgICAgICAgICAmc0tub3duUmVnaW9uQ29uZmlnc1tpXSwKLSAgICAgICAgICAgICAgIHNpemVvZihyYWRpb19iYW5kX2NvbmZpZ190KSk7Ci0gICAgfQotfQotCi0jdW5kZWYgTE9HX1RBRwotI2RlZmluZSBMT0dfVEFHICJSYWRpb1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkIgotCi1SYWRpb1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkOjpDYWxsYmFja1RocmVhZChjb25zdCB3cDxNb2R1bGVDbGllbnQ+JiBtb2R1bGVDbGllbnQpCi0gICAgOiBtTW9kdWxlQ2xpZW50KG1vZHVsZUNsaWVudCksIG1NZW1vcnlEZWFsZXIobmV3IE1lbW9yeURlYWxlcigxMDI0ICogMTAyNCwgIlJhZGlvU2VydmljZSIpKQotewotfQotCi1SYWRpb1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkOjp+Q2FsbGJhY2tUaHJlYWQoKQotewotICAgIG1FdmVudFF1ZXVlLmNsZWFyKCk7Ci19Ci0KLXZvaWQgUmFkaW9TZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6b25GaXJzdFJlZigpCi17Ci0gICAgcnVuKCJSYWRpb1NlcnZpY2UgY2JrIiwgQU5EUk9JRF9QUklPUklUWV9VUkdFTlRfQVVESU8pOwotfQotCi1ib29sIFJhZGlvU2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6OnRocmVhZExvb3AoKQotewotICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkgewotICAgICAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeTsKLSAgICAgICAgc3A8TW9kdWxlQ2xpZW50PiBtb2R1bGVDbGllbnQ7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2FsbGJhY2tMb2NrKTsKLSAgICAgICAgICAgIHdoaWxlIChtRXZlbnRRdWV1ZS5pc0VtcHR5KCkgJiYgIWV4aXRQZW5kaW5nKCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiQ2FsbGJhY2tUaHJlYWQ6OnRocmVhZExvb3AoKSBzbGVlcCIpOwotICAgICAgICAgICAgICAgIG1DYWxsYmFja0NvbmQud2FpdChtQ2FsbGJhY2tMb2NrKTsKLSAgICAgICAgICAgICAgICBBTE9HVigiQ2FsbGJhY2tUaHJlYWQ6OnRocmVhZExvb3AoKSB3YWtlIHVwIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZXhpdFBlbmRpbmcoKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXZlbnRNZW1vcnkgPSBtRXZlbnRRdWV1ZVswXTsKLSAgICAgICAgICAgIG1FdmVudFF1ZXVlLnJlbW92ZUF0KDApOwotICAgICAgICAgICAgbW9kdWxlQ2xpZW50ID0gbU1vZHVsZUNsaWVudC5wcm9tb3RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1vZHVsZUNsaWVudCAhPSAwKSB7Ci0gICAgICAgICAgICBtb2R1bGVDbGllbnQtPm9uQ2FsbGJhY2tFdmVudChldmVudE1lbW9yeSk7Ci0gICAgICAgICAgICBldmVudE1lbW9yeS5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBSYWRpb1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkOjpleGl0KCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNhbGxiYWNrTG9jayk7Ci0gICAgcmVxdWVzdEV4aXQoKTsKLSAgICBtQ2FsbGJhY2tDb25kLmJyb2FkY2FzdCgpOwotfQotCi1zcDxJTWVtb3J5PiBSYWRpb1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkOjpwcmVwYXJlRXZlbnQocmFkaW9faGFsX2V2ZW50X3QgKmhhbEV2ZW50KQotewotICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5OwotCi0gICAgLy8gVGhlIGV2ZW50IGxheW91dCBpbiBzaGFyZWQgbWVtb3J5IGlzOgotICAgIC8vIHNpemVvZihzdHJ1Y3QgcmFkaW9fZXZlbnQpIGJ5dGVzIDogdGhlIGV2ZW50IGl0c2VsZgotICAgIC8vIDQgYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgIDogbWV0YWRhdGEgc2l6ZSBvciAwCi0gICAgLy8gTiBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtZXRhZGF0YSBpZiBwcmVzZW50Ci0gICAgdWludDMyX3QgbWV0YWRhdGFPZmZzZXQgPSBzaXplb2Yoc3RydWN0IHJhZGlvX2V2ZW50KSArIHNpemVvZih1aW50MzJfdCk7Ci0gICAgdWludDMyX3QgbWV0YWRhdGFTaXplID0gMDsKLQotICAgIHN3aXRjaCAoaGFsRXZlbnQtPnR5cGUpIHsKLSAgICBjYXNlIFJBRElPX0VWRU5UX1RVTkVEOgotICAgIGNhc2UgUkFESU9fRVZFTlRfQUZfU1dJVENIOgotICAgICAgICBpZiAocmFkaW9fbWV0YWRhdGFfY2hlY2soaGFsRXZlbnQtPmluZm8ubWV0YWRhdGEpID09IDApIHsKLSAgICAgICAgICAgIG1ldGFkYXRhU2l6ZSA9ICh1aW50MzJfdClyYWRpb19tZXRhZGF0YV9nZXRfc2l6ZShoYWxFdmVudC0+aW5mby5tZXRhZGF0YSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSQURJT19FVkVOVF9NRVRBREFUQToKLSAgICAgICAgaWYgKHJhZGlvX21ldGFkYXRhX2NoZWNrKGhhbEV2ZW50LT5tZXRhZGF0YSkgIT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGV2ZW50TWVtb3J5OwotICAgICAgICB9Ci0gICAgICAgIG1ldGFkYXRhU2l6ZSA9ICh1aW50MzJfdClyYWRpb19tZXRhZGF0YV9nZXRfc2l6ZShoYWxFdmVudC0+bWV0YWRhdGEpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBldmVudE1lbW9yeSA9IG1NZW1vcnlEZWFsZXItPmFsbG9jYXRlKG1ldGFkYXRhT2Zmc2V0ICsgbWV0YWRhdGFTaXplKTsKLSAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCB8fCBldmVudE1lbW9yeS0+cG9pbnRlcigpID09IE5VTEwpIHsKLSAgICAgICAgZXZlbnRNZW1vcnkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIGV2ZW50TWVtb3J5OwotICAgIH0KLQotICAgIHN0cnVjdCByYWRpb19ldmVudCAqZXZlbnQgPSAoc3RydWN0IHJhZGlvX2V2ZW50ICopZXZlbnRNZW1vcnktPnBvaW50ZXIoKTsKLQotICAgICoodWludDMyX3QgKikoKHVpbnQ4X3QgKilldmVudCArIG1ldGFkYXRhT2Zmc2V0IC0gc2l6ZW9mKHVpbnQzMl90KSkgPSBtZXRhZGF0YVNpemU7Ci0KLSAgICBldmVudC0+dHlwZSA9IGhhbEV2ZW50LT50eXBlOwotICAgIGV2ZW50LT5zdGF0dXMgPSBoYWxFdmVudC0+c3RhdHVzOwotCi0gICAgc3dpdGNoIChldmVudC0+dHlwZSkgewotICAgIGNhc2UgUkFESU9fRVZFTlRfQ09ORklHOgotICAgICAgICBldmVudC0+Y29uZmlnLmJhbmQgPSBoYWxFdmVudC0+Y29uZmlnOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJBRElPX0VWRU5UX1RVTkVEOgotICAgIGNhc2UgUkFESU9fRVZFTlRfQUZfU1dJVENIOgotICAgICAgICBldmVudC0+aW5mbyA9IGhhbEV2ZW50LT5pbmZvOwotICAgICAgICBpZiAobWV0YWRhdGFTaXplICE9IDApIHsKLSAgICAgICAgICAgIG1lbWNweSgodWludDhfdCAqKWV2ZW50ICsgbWV0YWRhdGFPZmZzZXQsIGhhbEV2ZW50LT5pbmZvLm1ldGFkYXRhLCBtZXRhZGF0YVNpemUpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUkFESU9fRVZFTlRfVEE6Ci0gICAgY2FzZSBSQURJT19FVkVOVF9FQToKLSAgICBjYXNlIFJBRElPX0VWRU5UX0FOVEVOTkE6Ci0gICAgY2FzZSBSQURJT19FVkVOVF9DT05UUk9MOgotICAgICAgICBldmVudC0+b24gPSBoYWxFdmVudC0+b247Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUkFESU9fRVZFTlRfTUVUQURBVEE6Ci0gICAgICAgIGlmIChtZXRhZGF0YVNpemUgIT0gMCkgewotICAgICAgICAgICAgbWVtY3B5KCh1aW50OF90ICopZXZlbnQgKyBtZXRhZGF0YU9mZnNldCwgaGFsRXZlbnQtPm1ldGFkYXRhLCBtZXRhZGF0YVNpemUpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUkFESU9fRVZFTlRfSFdfRkFJTFVSRToKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXZlbnRNZW1vcnk7Ci19Ci0KLXZvaWQgUmFkaW9TZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6c2VuZEV2ZW50KHJhZGlvX2hhbF9ldmVudF90ICpldmVudCkKLSB7Ci0gICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gcHJlcGFyZUV2ZW50KGV2ZW50KTsKLSAgICAgaWYgKGV2ZW50TWVtb3J5ID09IDApIHsKLSAgICAgICAgIHJldHVybjsKLSAgICAgfQotCi0gICAgIEF1dG9NdXRleCBsb2NrKG1DYWxsYmFja0xvY2spOwotICAgICBtRXZlbnRRdWV1ZS5hZGQoZXZlbnRNZW1vcnkpOwotICAgICBtQ2FsbGJhY2tDb25kLnNpZ25hbCgpOwotICAgICBBTE9HVigiJXMgRE9ORSIsIF9fRlVOQ1RJT05fXyk7Ci19Ci0KLQotI3VuZGVmIExPR19UQUcKLSNkZWZpbmUgTE9HX1RBRyAiUmFkaW9TZXJ2aWNlOjpNb2R1bGUiCi0KLVJhZGlvU2VydmljZTo6TW9kdWxlOjpNb2R1bGUoc3A8UmFkaW9JbnRlcmZhY2U+IGh3RGV2aWNlLCByYWRpb19wcm9wZXJ0aWVzIHByb3BlcnRpZXMpCi0gOiBtSHdEZXZpY2UoaHdEZXZpY2UpLCBtUHJvcGVydGllcyhwcm9wZXJ0aWVzKSwgbU11dGUodHJ1ZSkKLXsKLX0KLQotUmFkaW9TZXJ2aWNlOjpNb2R1bGU6On5Nb2R1bGUoKSB7Ci0gICAgbUh3RGV2aWNlLmNsZWFyKCk7Ci0gICAgbU1vZHVsZUNsaWVudHMuY2xlYXIoKTsKLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGU6OmR1bXAoaW50IGZkIF9fdW51c2VkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKSB7Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zcDxSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudD4gUmFkaW9TZXJ2aWNlOjpNb2R1bGU6OmFkZENsaWVudChjb25zdCBzcDxJUmFkaW9DbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXVkaW8pCi17Ci0gICAgQUxPR1YoImFkZENsaWVudCgpICVwIGNvbmZpZyAlcCBwcm9kdWN0ICVzIiwgdGhpcywgY29uZmlnLCBtUHJvcGVydGllcy5wcm9kdWN0KTsKLQotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBzcDxNb2R1bGVDbGllbnQ+IG1vZHVsZUNsaWVudDsKLSAgICBpbnQgcmV0OwotCi0gICAgaWYgKG1Id0RldmljZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBtb2R1bGVDbGllbnQ7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kdWxlQ2xpZW50cy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAobU1vZHVsZUNsaWVudHNbaV0tPmNsaWVudCgpID09IGNsaWVudCkgewotICAgICAgICAgICAgLy8gY2xpZW50IGFscmVhZHkgY29ubmVjdGVkOiByZWplY3QKLSAgICAgICAgICAgIHJldHVybiBtb2R1bGVDbGllbnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbW9kdWxlQ2xpZW50ID0gbmV3IE1vZHVsZUNsaWVudCh0aGlzLCBjbGllbnQsIGNvbmZpZywgYXVkaW8pOwotCi0gICAgc3RydWN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZyBoYWxDb25maWc7Ci0gICAgaGFsQ29uZmlnID0gY29uZmlnLT5iYW5kOwotCi0gICAgLy8gVHVuZXIgcHJlZW1wdGlvbiBsb2dpYzoKLSAgICAvLyBUaGVyZSBpcyBhIGxpbWl0ZWQgYW1vdW50IG9mIHR1bmVycyBhbmQgYSBsaW1pdGVkIGFtb3VudCBvZiByYWRpbyBhdWRpbyBzb3VyY2VzIHBlciBtb2R1bGUuCi0gICAgLy8gVGhlIG1pbmltdW0gaXMgb25lIHR1bmVyIGFuZCBvbmUgYXVkaW8gc291cmNlLgotICAgIC8vIFRoZSBudW1iZXJzIG9mIHR1bmVycyBhbmQgc291cmNlcyBhcmUgaW5kaWNhdGVkIGluIHRoZSBtb2R1bGUgcHJvcGVydGllcy4KLSAgICAvLyBOT1RFOiBjdXJyZW50IGZyYW1ld29yayBpbXBsZW1lbnRhdGlvbiBvbmx5IHN1cHBvcnRzIG9uZSByYWRpbyBhdWRpbyBzb3VyY2UuCi0gICAgLy8gSXQgaXMgcG9zc2libGUgdG8gb3BlbiBtb3JlIHRoYW4gb25lIHR1bmVyIGF0IGEgdGltZSBidXQgb25seSBvbmUgdHVuZXIgY2FuIGJlIGNvbm5lY3RlZAotICAgIC8vIHRvIHRoZSByYWRpbyBhdWRpbyBzb3VyY2UgKEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUikuCi0gICAgLy8gVGhlIGJhc2UgcnVsZSBpcyB0aGF0IGEgbmV3bHkgY29ubmVjdGVkIHR1bmVyIGFsd2F5cyB3aW5zLCBpLmUuIGFsd2F5cyBnZXRzIGEgdHVuZXIKLSAgICAvLyBhbmQgY2FuIHVzZSB0aGUgYXVkaW8gc291cmNlIGlmIHJlcXVlc3RlZC4KLSAgICAvLyBJZiBhbm90aGVyIGNsaWVudCBpcyBwcmVlbXB0ZWQsIGl0IGlzIG5vdGlmaWVkIGJ5IGEgY2FsbGJhY2sgd2l0aCBSQURJT19FVkVOVF9DT05UUk9MCi0gICAgLy8gaW5kaWNhdGluZyBsb3NzIG9mIGNvbnRyb2wuCi0gICAgLy8gLSBJZiB0aGUgbmV3bHkgY29ubmVjdGVkIGNsaWVudCByZXF1ZXN0cyB0aGUgYXVkaW8gc291cmNlIChhdWRpbyA9PSB0cnVlKToKLSAgICAvLyAgICAtIGlmIGFuIGF1ZGlvIHNvdXJjZSBpcyBhdmFpbGFibGUKLSAgICAvLyAgICAgICAgICBubyBwcm9ibGVtCi0gICAgLy8gICAgLSBpZiBub3Q6Ci0gICAgLy8gICAgICAgICAgdGhlIG9sZGVzdCBjbGllbnQgaW4gdGhlIGxpc3QgdXNpbmcgYXVkaW8gaXMgcHJlZW1wdGVkLgotICAgIC8vIC0gSWYgdGhlIG5ld2x5IGNvbm5lY3RlZCBjbGllbnQgZG9lcyBub3QgcmVxdWVzdCB0aGUgYXVkaW8gc291cmNlIChhdWRpbyA9PSBmYWxzZSk6Ci0gICAgLy8gICAgLSBpZiBhIHR1bmVyIGlzIGF2YWlsYWJsZQotICAgIC8vICAgICAgICAgIG5vIHByb2JsZW0KLSAgICAvLyAgICAtIGlmIG5vdDoKLSAgICAvLyAgICAgICAgICBUaGUgb2xkZXN0IGNsaWVudCBub3QgdXNpbmcgYXVkaW8gaXMgcHJlZW1wdGVkIGZpcnN0IGFuZCBpZiBub25lIGlzIGZvdW5kIHRoZQotICAgIC8vICAgICAgICAgIHRoZSBvbGRlc3QgY2xpZW50IHVzaW5nIGF1ZGlvIGlzIHByZWVtcHRlZC4KLSAgICAvLyBFYWNoIHRpbWUgYSB0dW5lciB1c2luZyB0aGUgYXVkaW8gc291cmNlIGlzIG9wZW5lZCBvciBjbG9zZWQsIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBpcwotICAgIC8vIG5vdGlmaWVkIG9mIHRoZSBjb25uZWN0aW9uIG9yIGRpc2Nvbm5lY3Rpb24gb2YgQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSLgotCi0gICAgc3A8TW9kdWxlQ2xpZW50PiBvbGRlc3RUdW5lcjsKLSAgICBzcDxNb2R1bGVDbGllbnQ+IG9sZGVzdEF1ZGlvOwotICAgIHNpemVfdCBhbGxvY2F0ZWRUdW5lcnMgPSAwOwotICAgIHNpemVfdCBhbGxvY2F0ZWRBdWRpbyA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kdWxlQ2xpZW50cy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAobU1vZHVsZUNsaWVudHNbaV0tPmdldFR1bmVyKCkgIT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKG1Nb2R1bGVDbGllbnRzW2ldLT5hdWRpbygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9sZGVzdEF1ZGlvID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgb2xkZXN0QXVkaW8gPSBtTW9kdWxlQ2xpZW50c1tpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWxsb2NhdGVkQXVkaW8rKzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9sZGVzdFR1bmVyID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgb2xkZXN0VHVuZXIgPSBtTW9kdWxlQ2xpZW50c1tpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWxsb2NhdGVkVHVuZXJzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzcDxUdW5lckludGVyZmFjZT4gaGFsVHVuZXI7Ci0gICAgc3A8TW9kdWxlQ2xpZW50PiBwcmVlbXRlZENsaWVudDsKLSAgICBpZiAoYXVkaW8pIHsKLSAgICAgICAgaWYgKGFsbG9jYXRlZEF1ZGlvID49IG1Qcm9wZXJ0aWVzLm51bV9hdWRpb19zb3VyY2VzKSB7Ci0gICAgICAgICAgICBBTE9HX0FTU0VSVChvbGRlc3RBdWRpbyAhPSAwLCAiYWRkQ2xpZW50KCkgYWxsb2NhdGVkQXVkaW8vb2xkZXN0QXVkaW8gbWlzbWF0Y2giKTsKLSAgICAgICAgICAgIHByZWVtdGVkQ2xpZW50ID0gb2xkZXN0QXVkaW87Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoYWxsb2NhdGVkQXVkaW8gKyBhbGxvY2F0ZWRUdW5lcnMgPj0gbVByb3BlcnRpZXMubnVtX3R1bmVycykgewotICAgICAgICAgICAgaWYgKGFsbG9jYXRlZFR1bmVycyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQob2xkZXN0VHVuZXIgIT0gMCwgImFkZENsaWVudCgpIGFsbG9jYXRlZFR1bmVycy9vbGRlc3RUdW5lciBtaXNtYXRjaCIpOwotICAgICAgICAgICAgICAgIHByZWVtdGVkQ2xpZW50ID0gb2xkZXN0VHVuZXI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKG9sZGVzdEF1ZGlvICE9IDAsICJhZGRDbGllbnQoKSBhbGxvY2F0ZWRBdWRpby9vbGRlc3RBdWRpbyBtaXNtYXRjaCIpOwotICAgICAgICAgICAgICAgIHByZWVtdGVkQ2xpZW50ID0gb2xkZXN0QXVkaW87Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHByZWVtdGVkQ2xpZW50ICE9IDApIHsKLSAgICAgICAgaGFsVHVuZXIgPSBwcmVlbXRlZENsaWVudC0+Z2V0VHVuZXIoKTsKLSAgICAgICAgc3A8VHVuZXJJbnRlcmZhY2U+IGNsZWFyOwotICAgICAgICBwcmVlbXRlZENsaWVudC0+c2V0VHVuZXIoY2xlYXIpOwotICAgICAgICBtSHdEZXZpY2UtPmNsb3NlVHVuZXIoaGFsVHVuZXIpOwotICAgICAgICBpZiAocHJlZW10ZWRDbGllbnQtPmF1ZGlvKCkpIHsKLSAgICAgICAgICAgIG5vdGlmeURldmljZUNvbm5lY3Rpb24oZmFsc2UsICIiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldCA9IG1Id0RldmljZS0+b3BlblR1bmVyKCZoYWxDb25maWcsIGF1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZUNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxUdW5lcik7Ci0gICAgaWYgKHJldCA9PSAwKSB7Ci0gICAgICAgIEFMT0dWKCJhZGRDbGllbnQoKSBzZXRUdW5lciAlcCIsIGhhbFR1bmVyLmdldCgpKTsKLSAgICAgICAgbW9kdWxlQ2xpZW50LT5zZXRUdW5lcihoYWxUdW5lcik7Ci0gICAgICAgIG1Nb2R1bGVDbGllbnRzLmFkZChtb2R1bGVDbGllbnQpOwotICAgICAgICBpZiAoYXVkaW8pIHsKLSAgICAgICAgICAgIG5vdGlmeURldmljZUNvbm5lY3Rpb24odHJ1ZSwgIiIpOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJhZGRDbGllbnQoKSBET05FIG1vZHVsZUNsaWVudCAlcCIsIG1vZHVsZUNsaWVudC5nZXQoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1coIiVzIG9wZW5fdHVuZXIgZmFpbGVkIHdpdGggZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sIHJldCk7Ci0gICAgICAgIG1vZHVsZUNsaWVudC5jbGVhcigpOwotICAgIH0KLQotICAgIHJldHVybiBtb2R1bGVDbGllbnQ7Ci19Ci0KLXZvaWQgUmFkaW9TZXJ2aWNlOjpNb2R1bGU6OnJlbW92ZUNsaWVudChjb25zdCBzcDxNb2R1bGVDbGllbnQ+JiBtb2R1bGVDbGllbnQpIHsKLSAgICBBTE9HVigicmVtb3ZlQ2xpZW50KCkiKTsKLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgaW50IHJldDsKLSAgICBzc2l6ZV90IGluZGV4ID0gLTE7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Nb2R1bGVDbGllbnRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtTW9kdWxlQ2xpZW50c1tpXSA9PSBtb2R1bGVDbGllbnQpIHsKLSAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChpbmRleCA9PSAtMSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbU1vZHVsZUNsaWVudHMucmVtb3ZlQXQoaW5kZXgpOwotICAgIHNwPFR1bmVySW50ZXJmYWNlPiBoYWxUdW5lciA9IG1vZHVsZUNsaWVudC0+Z2V0VHVuZXIoKTsKLSAgICBpZiAoaGFsVHVuZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1Id0RldmljZSAhPSAwKSB7Ci0gICAgICAgIG1Id0RldmljZS0+Y2xvc2VUdW5lcihoYWxUdW5lcik7Ci0gICAgfQotCi0gICAgaWYgKG1vZHVsZUNsaWVudC0+YXVkaW8oKSkgewotICAgICAgICBub3RpZnlEZXZpY2VDb25uZWN0aW9uKGZhbHNlLCAiIik7Ci0gICAgfQotCi0gICAgbU11dGUgPSB0cnVlOwotCi0gICAgaWYgKG1Nb2R1bGVDbGllbnRzLmlzRW1wdHkoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1Id0RldmljZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBUdW5lciByZWFsbG9jYXRpb24gbG9naWM6Ci0gICAgLy8gV2hlbiBhIGNsaWVudCBpcyByZW1vdmVkIGFuZCB3YXMgY29udHJvbGxpbmcgYSB0dW5lciwgdGhpcyB0dW5lciB3aWxsIGJlIGFsbG9jYXRlZCB0byBhCi0gICAgLy8gcHJldmlvdXNseSBwcmVlbXB0ZWQgY2xpZW50LiBUaGlzIGNsaWVudCB3aWxsIGJlIG5vdGlmaWVkIGJ5IGEgY2FsbGJhY2sgd2l0aAotICAgIC8vIFJBRElPX0VWRU5UX0NPTlRST0wgaW5kaWNhdGluZyBnYWluIG9mIGNvbnRyb2wuCi0gICAgLy8gLSBJZiBhIHByZWVtcHRlZCBjbGllbnQgaXMgd2FpdGluZyBmb3IgYW4gYXVkaW8gc291cmNlIGFuZCBvbmUgYmVjb21lcyBhdmFpbGFibGU6Ci0gICAgLy8gICAgQWxsb2NhdGUgdGhlIHR1bmVyIHRvIHRoZSBtb3N0IHJlY2VudGx5IGFkZGVkIGNsaWVudCB3YWl0aW5nIGZvciBhbiBhdWRpbyBzb3VyY2UKLSAgICAvLyAtIElmIG5vdDoKLSAgICAvLyAgICBBbGxvY2F0ZSB0aGUgdHVuZXIgdG8gdGhlIG1vc3QgcmVjZW50bHkgYWRkZWQgY2xpZW50LgotICAgIC8vIEVhY2ggdGltZSBhIHR1bmVyIHVzaW5nIHRoZSBhdWRpbyBzb3VyY2UgaXMgb3BlbmVkIG9yIGNsb3NlZCwgdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGlzCi0gICAgLy8gbm90aWZpZWQgb2YgdGhlIGNvbm5lY3Rpb24gb3IgZGlzY29ubmVjdGlvbiBvZiBBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIuCi0KLSAgICBzcDxNb2R1bGVDbGllbnQ+IHlvdW5nZXN0Q2xpZW50OwotICAgIHNwPE1vZHVsZUNsaWVudD4geW91bmdlc3RDbGllbnRBdWRpbzsKLSAgICBzaXplX3QgYWxsb2NhdGVkVHVuZXJzID0gMDsKLSAgICBzaXplX3QgYWxsb2NhdGVkQXVkaW8gPSAwOwotICAgIGZvciAoc3NpemVfdCBpID0gbU1vZHVsZUNsaWVudHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgaWYgKG1Nb2R1bGVDbGllbnRzW2ldLT5nZXRUdW5lcigpID09IE5VTEwpIHsKLSAgICAgICAgICAgIGlmIChtTW9kdWxlQ2xpZW50c1tpXS0+YXVkaW8oKSkgewotICAgICAgICAgICAgICAgIGlmICh5b3VuZ2VzdENsaWVudEF1ZGlvID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgeW91bmdlc3RDbGllbnRBdWRpbyA9IG1Nb2R1bGVDbGllbnRzW2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHlvdW5nZXN0Q2xpZW50ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgeW91bmdlc3RDbGllbnQgPSBtTW9kdWxlQ2xpZW50c1tpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobU1vZHVsZUNsaWVudHNbaV0tPmF1ZGlvKCkpIHsKLSAgICAgICAgICAgICAgICBhbGxvY2F0ZWRBdWRpbysrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhbGxvY2F0ZWRUdW5lcnMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEFMT0dfQVNTRVJUKGFsbG9jYXRlZFR1bmVycyArIGFsbG9jYXRlZEF1ZGlvIDwgbVByb3BlcnRpZXMubnVtX3R1bmVycywKLSAgICAgICAgICAgICAgICAicmVtb3ZlQ2xpZW50KCkgcmVtb3ZlZCBjbGllbnQgYnV0IG5vIHR1bmVyIGF2YWlsYWJsZSIpOwotCi0gICAgQUxPR19BU1NFUlQoIW1vZHVsZUNsaWVudC0+YXVkaW8oKSB8fCBhbGxvY2F0ZWRBdWRpbyA8IG1Qcm9wZXJ0aWVzLm51bV9hdWRpb19zb3VyY2VzLAotICAgICAgICAgICAgICAgICJyZW1vdmVDbGllbnQoKSByZW1vdmVkIGF1ZGlvIGNsaWVudCBidXQgbm8gdHVuZXIgd2l0aCBhdWRpbyBhdmFpbGFibGUiKTsKLQotICAgIGlmIChhbGxvY2F0ZWRBdWRpbyA8IG1Qcm9wZXJ0aWVzLm51bV9hdWRpb19zb3VyY2VzICYmIHlvdW5nZXN0Q2xpZW50QXVkaW8gIT0gMCkgewotICAgICAgICB5b3VuZ2VzdENsaWVudCA9IHlvdW5nZXN0Q2xpZW50QXVkaW87Ci0gICAgfQotCi0gICAgQUxPR19BU1NFUlQoeW91bmdlc3RDbGllbnQgIT0gMCwgInJlbW92ZUNsaWVudCgpIHJlbW92ZWQgY2xpZW50IG5vIGNhbmRpZGF0ZSBmb3VuZCBmb3IgdHVuZXIiKTsKLQotICAgIHN0cnVjdCByYWRpb19oYWxfYmFuZF9jb25maWcgaGFsQ29uZmlnID0geW91bmdlc3RDbGllbnQtPmhhbENvbmZpZygpOwotICAgIHJldCA9IG1Id0RldmljZS0+b3BlblR1bmVyKCZoYWxDb25maWcsIHlvdW5nZXN0Q2xpZW50LT5hdWRpbygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVDbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbFR1bmVyKTsKLQotICAgIGlmIChyZXQgPT0gMCkgewotICAgICAgICB5b3VuZ2VzdENsaWVudC0+c2V0VHVuZXIoaGFsVHVuZXIpOwotICAgICAgICBpZiAoeW91bmdlc3RDbGllbnQtPmF1ZGlvKCkpIHsKLSAgICAgICAgICAgIG5vdGlmeURldmljZUNvbm5lY3Rpb24odHJ1ZSwgIiIpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZTo6c2V0TXV0ZShib29sIG11dGUpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobXV0ZSAhPSBtTXV0ZSkgewotICAgICAgICBtTXV0ZSA9IG11dGU7Ci0gICAgICAgIC8vVE9ETyBub3RpZmlmeSBhdWRpbyBwb2xpY3kgbWFuYWdlciBvZiBtZWRpYSBhY3Rpdml0eSBvbiByYWRpbyBhdWRpbyBkZXZpY2UKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZTo6Z2V0TXV0ZShib29sICptdXRlKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgKm11dGUgPSBtTXV0ZTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLQotY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpSYWRpb1NlcnZpY2U6Ok1vZHVsZTo6Z2V0RGVmYXVsdENvbmZpZygpIGNvbnN0Ci17Ci0gICAgaWYgKG1Qcm9wZXJ0aWVzLm51bV9iYW5kcyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gJm1Qcm9wZXJ0aWVzLmJhbmRzWzBdOwotfQotCi12b2lkIFJhZGlvU2VydmljZTo6TW9kdWxlOjpub3RpZnlEZXZpY2VDb25uZWN0aW9uKGJvb2wgY29ubmVjdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzKSB7Ci0gICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgQXVkaW9TeXN0ZW06OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQgPyBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCBrUmFkaW9UdW5lckF1ZGlvRGV2aWNlTmFtZSk7Ci0gICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7Ci19Ci0KLSN1bmRlZiBMT0dfVEFHCi0jZGVmaW5lIExPR19UQUcgIlJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50IgotCi1SYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6TW9kdWxlQ2xpZW50KGNvbnN0IHNwPE1vZHVsZT4mIG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVJhZGlvQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdWRpbykKLSA6IG1Nb2R1bGUobW9kdWxlKSwgbUNsaWVudChjbGllbnQpLCBtQ29uZmlnKCpjb25maWcpLCBtQXVkaW8oYXVkaW8pLCBtVHVuZXIoMCkKLXsKLX0KLQotdm9pZCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6b25GaXJzdFJlZigpCi17Ci0gICAgbUNhbGxiYWNrVGhyZWFkID0gbmV3IENhbGxiYWNrVGhyZWFkKHRoaXMpOwotICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1DbGllbnQpLT5saW5rVG9EZWF0aCh0aGlzKTsKLX0KLQotUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6On5Nb2R1bGVDbGllbnQoKSB7Ci0gICAgaWYgKG1DbGllbnQgIT0gMCkgewotICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQ2xpZW50KS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKLSAgICAgICAgbUNsaWVudC5jbGVhcigpOwotICAgIH0KLSAgICBpZiAobUNhbGxiYWNrVGhyZWFkICE9IDApIHsKLSAgICAgICAgbUNhbGxiYWNrVGhyZWFkLT5leGl0KCk7Ci0gICAgfQotfQotCi12b2lkIFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpvbkV2ZW50KHJhZGlvX2hhbF9ldmVudF90ICpoYWxFdmVudCkKLXsKLSAgICBtQ2FsbGJhY2tUaHJlYWQtPnNlbmRFdmVudChoYWxFdmVudCk7Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpkdW1wKGludCBmZCBfX3VudXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpIHsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXZvaWQgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmRldGFjaCgpIHsKLSAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwotICAgIHNwPE1vZHVsZUNsaWVudD4gc3Ryb25nTWUgPSB0aGlzOwotICAgIHsKLSAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgICAgICBpZiAobUNsaWVudCAhPSAwKSB7Ci0gICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQ2xpZW50KS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKLSAgICAgICAgICAgIG1DbGllbnQuY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBzcDxNb2R1bGU+IG1vZHVsZSA9IG1Nb2R1bGUucHJvbW90ZSgpOwotICAgIGlmIChtb2R1bGUgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1vZHVsZS0+cmVtb3ZlQ2xpZW50KHRoaXMpOwotfQotCi1yYWRpb19oYWxfYmFuZF9jb25maWdfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6aGFsQ29uZmlnKCkgY29uc3QKLXsKLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgcmV0dXJuIG1Db25maWcuYmFuZDsKLX0KLQotc3A8VHVuZXJJbnRlcmZhY2U+JiBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6Z2V0VHVuZXIoKQotewotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKLSAgICByZXR1cm4gbVR1bmVyOwotfQotCi12b2lkIFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpzZXRUdW5lcihzcDxUdW5lckludGVyZmFjZT4mIHR1bmVyKQotewotICAgIEFMT0dWKCIlcyAlcCIsIF9fRlVOQ1RJT05fXywgdGhpcyk7Ci0KLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgbVR1bmVyID0gdHVuZXI7Ci0gICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7Ci0KLSAgICByYWRpb19oYWxfZXZlbnRfdCBldmVudDsKLSAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfQ09OVFJPTDsKLSAgICBldmVudC5zdGF0dXMgPSAwOwotICAgIGV2ZW50Lm9uID0gbVR1bmVyICE9IDA7Ci0gICAgbUNhbGxiYWNrVGhyZWFkLT5zZW5kRXZlbnQoJmV2ZW50KTsKLSAgICBBTE9HVigiJXMgRE9ORSIsIF9fRlVOQ1RJT05fXyk7Ci0KLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OnNldENvbmZpZ3VyYXRpb24oY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpCi17Ci0gICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oUkFESU9fUEVSTUlTU0lPTikpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7Ci0KLSAgICBpZiAobVR1bmVyICE9IDApIHsKLSAgICAgICAgc3RydWN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZyBoYWxDb25maWc7Ci0gICAgICAgIGhhbENvbmZpZyA9IGNvbmZpZy0+YmFuZDsKLSAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KW1UdW5lci0+c2V0Q29uZmlndXJhdGlvbigmaGFsQ29uZmlnKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgbUNvbmZpZyA9ICpjb25maWc7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtQ29uZmlnID0gKmNvbmZpZzsKLSAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmdldENvbmZpZ3VyYXRpb24oc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpCi17Ci0gICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oUkFESU9fUEVSTUlTU0lPTikpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7Ci0KLSAgICBpZiAobVR1bmVyICE9IDApIHsKLSAgICAgICAgc3RydWN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZyBoYWxDb25maWc7Ci0gICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdCltVHVuZXItPmdldENvbmZpZ3VyYXRpb24oJmhhbENvbmZpZyk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIG1Db25maWcuYmFuZCA9IGhhbENvbmZpZzsKLSAgICAgICAgfQotICAgIH0KLSAgICAqY29uZmlnID0gbUNvbmZpZzsKLQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpzZXRNdXRlKGJvb2wgbXV0ZSkKLXsKLSAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihSQURJT19QRVJNSVNTSU9OKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotICAgIHNwPE1vZHVsZT4gbW9kdWxlOwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIGlmIChtVHVuZXIgPT0gMCB8fCAhbUF1ZGlvKSB7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICAgICAgbW9kdWxlID0gbU1vZHVsZS5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChtb2R1bGUgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbW9kdWxlLT5zZXRNdXRlKG11dGUpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmdldE11dGUoYm9vbCAqbXV0ZSkKLXsKLSAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihSQURJT19QRVJNSVNTSU9OKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotICAgIHNwPE1vZHVsZT4gbW9kdWxlOwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIG1vZHVsZSA9IG1Nb2R1bGUucHJvbW90ZSgpOwotICAgICAgICBpZiAobW9kdWxlID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtb2R1bGUtPmdldE11dGUobXV0ZSk7Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpzY2FuKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwU3ViQ2hhbm5lbCkKLXsKLSAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihSQURJT19QRVJNSVNTSU9OKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgaWYgKG1UdW5lciAhPSAwKSB7Ci0gICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdCltVHVuZXItPnNjYW4oZGlyZWN0aW9uLCBza2lwU3ViQ2hhbm5lbCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwU3ViQ2hhbm5lbCkKLXsKLSAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihSQURJT19QRVJNSVNTSU9OKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgaWYgKG1UdW5lciAhPSAwKSB7Ci0gICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdCltVHVuZXItPnN0ZXAoZGlyZWN0aW9uLCBza2lwU3ViQ2hhbm5lbCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50Ojp0dW5lKHVpbnQzMl90IGNoYW5uZWwsIHVpbnQzMl90IHN1YkNoYW5uZWwpCi17Ci0gICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oUkFESU9fUEVSTUlTU0lPTikpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmIChtVHVuZXIgIT0gMCkgewotICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpbVR1bmVyLT50dW5lKGNoYW5uZWwsIHN1YkNoYW5uZWwpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6Y2FuY2VsKCkKLXsKLSAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihSQURJT19QRVJNSVNTSU9OKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgaWYgKG1UdW5lciAhPSAwKSB7Ci0gICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdCltVHVuZXItPmNhbmNlbCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6Z2V0UHJvZ3JhbUluZm9ybWF0aW9uKHN0cnVjdCByYWRpb19wcm9ncmFtX2luZm8gKmluZm8pCi17Ci0gICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oUkFESU9fUEVSTUlTU0lPTikpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmIChtVHVuZXIgIT0gTlVMTCkgewotICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpbVR1bmVyLT5nZXRQcm9ncmFtSW5mb3JtYXRpb24oaW5mbyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6Omhhc0NvbnRyb2woYm9vbCAqaGFzQ29udHJvbCkKLXsKLSAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihSQURJT19QRVJNSVNTSU9OKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKLSAgICAqaGFzQ29udHJvbCA9IG1UdW5lciAhPSAwOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6b25DYWxsYmFja0V2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkKLXsKLSAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCB8fCBldmVudE1lbW9yeS0+cG9pbnRlcigpID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHNwPElSYWRpb0NsaWVudD4gY2xpZW50OwotICAgIHsKLSAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgICAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmFkaW9fZXZlbnRfdCAqZXZlbnQgPSAocmFkaW9fZXZlbnRfdCAqKWV2ZW50TWVtb3J5LT5wb2ludGVyKCk7Ci0gICAgICAgIHN3aXRjaCAoZXZlbnQtPnR5cGUpIHsKLSAgICAgICAgY2FzZSBSQURJT19FVkVOVF9DT05GSUc6Ci0gICAgICAgICAgICBtQ29uZmlnLmJhbmQgPSBldmVudC0+Y29uZmlnLmJhbmQ7Ci0gICAgICAgICAgICBldmVudC0+Y29uZmlnLnJlZ2lvbiA9IG1Db25maWcucmVnaW9uOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNsaWVudCA9IG1DbGllbnQ7Ci0gICAgfQotICAgIGlmIChjbGllbnQgIT0gMCkgewotICAgICAgICBjbGllbnQtPm9uRXZlbnQoZXZlbnRNZW1vcnkpOwotICAgIH0KLX0KLQotCi12b2lkIFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpiaW5kZXJEaWVkKAotICAgIGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8gX191bnVzZWQpIHsKLSAgICBBTE9HVygiY2xpZW50IGJpbmRlciBkaWVkIGZvciBjbGllbnQgJXAiLCB0aGlzKTsKLSAgICBkZXRhY2goKTsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvU2VydmljZS5oIGIvc2VydmljZXMvcmFkaW8vUmFkaW9TZXJ2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NGViN2EuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvcmFkaW8vUmFkaW9TZXJ2aWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19TRVJWSUNFX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19TRVJWSUNFX0gKLQotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotLy8jaW5jbHVkZSA8YmluZGVyL0FwcE9wc01hbmFnZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0JpbmRlclNlcnZpY2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSUFwcE9wc0NhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8cmFkaW8vSVJhZGlvU2VydmljZS5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpby5oPgotI2luY2x1ZGUgPHJhZGlvL0lSYWRpb0NsaWVudC5oPgotI2luY2x1ZGUgPHN5c3RlbS9yYWRpby5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL3JhZGlvLmg+Ci0jaW5jbHVkZSAiUmFkaW9JbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJUdW5lckludGVyZmFjZS5oIgotI2luY2x1ZGUgIlR1bmVyQ2FsbGJhY2tJbnRlcmZhY2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBNZW1vcnlIZWFwQmFzZTsKLQotY2xhc3MgUmFkaW9TZXJ2aWNlIDoKLSAgICBwdWJsaWMgQmluZGVyU2VydmljZTxSYWRpb1NlcnZpY2U+LAotICAgIHB1YmxpYyBCblJhZGlvU2VydmljZQotewotICAgIGZyaWVuZCBjbGFzcyBCaW5kZXJTZXJ2aWNlPFJhZGlvU2VydmljZT47Ci0KLXB1YmxpYzoKLSAgICBjbGFzcyBNb2R1bGVDbGllbnQ7Ci0gICAgY2xhc3MgTW9kdWxlOwotCi0gICAgc3RhdGljIGNoYXIgY29uc3QqIGdldFNlcnZpY2VOYW1lKCkgeyByZXR1cm4gIm1lZGlhLnJhZGlvIjsgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBSYWRpb1NlcnZpY2UoKTsKLSAgICB2aXJ0dWFsICAgICAgICAgICAgIH5SYWRpb1NlcnZpY2UoKTsKLQotICAgIC8vIElSYWRpb1NlcnZpY2UKLSAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RNb2R1bGVzKHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhdHRhY2gocmFkaW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElSYWRpb0NsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdpdGhBdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJUmFkaW8+JiByYWRpbyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLQotCi0gICAgY2xhc3MgTW9kdWxlIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSB7Ci0gICAgcHVibGljOgotCi0gICAgICAgTW9kdWxlKHNwPFJhZGlvSW50ZXJmYWNlPiBod0RldmljZSwKLSAgICAgICAgICAgICAgc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMgcHJvcGVydGllcyk7Ci0KLSAgICAgICB2aXJ0dWFsIH5Nb2R1bGUoKTsKLQotICAgICAgICAgICAgICAgc3A8TW9kdWxlQ2xpZW50PiBhZGRDbGllbnQoY29uc3Qgc3A8SVJhZGlvQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXVkaW8pOwotCi0gICAgICAgICAgICAgICB2b2lkIHJlbW92ZUNsaWVudChjb25zdCBzcDxNb2R1bGVDbGllbnQ+JiBtb2R1bGVDbGllbnQpOwotCi0gICAgICAgICAgICAgICBzdGF0dXNfdCBzZXRNdXRlKGJvb2wgbXV0ZSk7Ci0KLSAgICAgICAgICAgICAgIHN0YXR1c190IGdldE11dGUoYm9vbCAqbXV0ZSk7Ci0KLSAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLQotICAgICAgIHNwPFJhZGlvSW50ZXJmYWNlPiBod0RldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1Id0RldmljZTsgfQotICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzIHByb3BlcnRpZXMoKSBjb25zdCB7IHJldHVybiBtUHJvcGVydGllczsgfQotICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqZ2V0RGVmYXVsdENvbmZpZygpIGNvbnN0IDsKLQotICAgIHByaXZhdGU6Ci0KLSAgICAgICB2b2lkIG5vdGlmeURldmljZUNvbm5lY3Rpb24oYm9vbCBjb25uZWN0ZWQsIGNvbnN0IGNoYXIgKmFkZHJlc3MpOwotCi0gICAgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOyAgICAgICAgICAvLyBwcm90ZWN0cyAgbU1vZHVsZUNsaWVudHMKLSAgICAgICAgc3A8UmFkaW9JbnRlcmZhY2U+ICAgICAgICAgICAgbUh3RGV2aWNlOyAgICAgIC8vIEhBTCBoYXJkd2FyZSBkZXZpY2UKLSAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMgbVByb3BlcnRpZXM7ICAgIC8vIGNhY2hlZCBoYXJkd2FyZSBtb2R1bGUgcHJvcGVydGllcwotICAgICAgICBWZWN0b3I8IHNwPE1vZHVsZUNsaWVudD4gPiAgICBtTW9kdWxlQ2xpZW50czsgLy8gbGlzdCBvZiBhdHRhY2hlZCBjbGllbnRzCi0gICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgIG1NdXRlOyAgICAgICAgICAvLyByYWRpbyBhdWRpbyBzb3VyY2Ugc3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdW5tdXRlZCwgYXVkaW8gaXMgcm91dGVkIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0cHV0IGRldmljZSBzZWxlY3RlZCBmb3IgbWVkaWEgdXNlIGNhc2UuCi0gICAgfTsgLy8gY2xhc3MgTW9kdWxlCi0KLSAgICBjbGFzcyBDYWxsYmFja1RocmVhZCA6IHB1YmxpYyBUaHJlYWQgewotICAgIHB1YmxpYzoKLQotICAgICAgICBleHBsaWNpdCBDYWxsYmFja1RocmVhZChjb25zdCB3cDxNb2R1bGVDbGllbnQ+JiBtb2R1bGVDbGllbnQpOwotCi0gICAgICAgIHZpcnR1YWwgfkNhbGxiYWNrVGhyZWFkKCk7Ci0KLQotICAgICAgICAvLyBUaHJlYWQgdmlydHVhbHMKLSAgICAgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKTsKLQotICAgICAgICAvLyBSZWZCYXNlCi0gICAgICAgIHZpcnR1YWwgdm9pZCBvbkZpcnN0UmVmKCk7Ci0KLSAgICAgICAgICAgICAgICB2b2lkIGV4aXQoKTsKLQotICAgICAgICAgICAgICAgIHZvaWQgc2VuZEV2ZW50KHJhZGlvX2hhbF9ldmVudF90ICpoYWxFdmVudCk7Ci0gICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4gcHJlcGFyZUV2ZW50KHJhZGlvX2hhbF9ldmVudF90ICpoYWxFdmVudCk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICB3cDxNb2R1bGVDbGllbnQ+ICAgICAgbU1vZHVsZUNsaWVudDsgICAgLy8gY2xpZW50IG1vZHVsZSB0aGUgdGhyZWFkIGJlbG9uZ3MgdG8KLSAgICAgICAgQ29uZGl0aW9uICAgICAgICAgICAgIG1DYWxsYmFja0NvbmQ7ICAgIC8vIGNvbmRpdGlvbiBzaWduYWxlZCB3aGVuIGEgbmV3IGV2ZW50IGlzIHBvc3RlZAotICAgICAgICBNdXRleCAgICAgICAgICAgICAgICAgbUNhbGxiYWNrTG9jazsgICAgLy8gcHJvdGVjdHMgbUV2ZW50UXVldWUKLSAgICAgICAgVmVjdG9yPCBzcDxJTWVtb3J5PiA+IG1FdmVudFF1ZXVlOyAgICAgIC8vIHBlbmRpbmcgY2FsbGJhY2sgZXZlbnRzCi0gICAgICAgIHNwPE1lbW9yeURlYWxlcj4gICAgICBtTWVtb3J5RGVhbGVyOyAgICAvLyBzaGFyZWQgbWVtb3J5IGZvciBjYWxsYmFjayBldmVudAotICAgIH07IC8vIGNsYXNzIENhbGxiYWNrVGhyZWFkCi0KLSAgICBjbGFzcyBNb2R1bGVDbGllbnQgOiBwdWJsaWMgQm5SYWRpbywKLSAgICAgICAgICAgICAgICAgICBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQsCi0gICAgICAgICAgICAgICAgICAgcHVibGljIFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2UgewotICAgIHB1YmxpYzoKLQotICAgICAgIE1vZHVsZUNsaWVudChjb25zdCBzcDxNb2R1bGU+JiBtb2R1bGUsCi0gICAgICAgICAgICAgIGNvbnN0IHNwPElSYWRpb0NsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICAgIGJvb2wgYXVkaW8pOwotCi0gICAgICAgdmlydHVhbCB+TW9kdWxlQ2xpZW50KCk7Ci0KLSAgICAgICAvLyBJUmFkaW8KLSAgICAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoKCk7Ci0KLSAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldENvbmZpZ3VyYXRpb24oY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpOwotCi0gICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDb25maWd1cmF0aW9uKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKTsKLQotICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TXV0ZShib29sIG11dGUpOwotCi0gICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNdXRlKGJvb2wgKm11dGUpOwotCi0gICAgICAgdmlydHVhbCBzdGF0dXNfdCBzY2FuKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwU3ViQ2hhbm5lbCk7Ci0KLSAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0ZXAocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJDaGFubmVsKTsKLQotICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgdHVuZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IHN1YkNoYW5uZWwpOwotCi0gICAgICAgdmlydHVhbCBzdGF0dXNfdCBjYW5jZWwoKTsKLQotICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvZ3JhbUluZm9ybWF0aW9uKHN0cnVjdCByYWRpb19wcm9ncmFtX2luZm8gKmluZm8pOwotCi0gICAgICAgdmlydHVhbCBzdGF0dXNfdCBoYXNDb250cm9sKGJvb2wgKmhhc0NvbnRyb2wpOwotCi0gICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0KLSAgICAgICAgICAgICAgIHNwPElSYWRpb0NsaWVudD4gY2xpZW50KCkgY29uc3QgeyByZXR1cm4gbUNsaWVudDsgfQotICAgICAgICAgICAgICAgd3A8TW9kdWxlPiBtb2R1bGUoKSBjb25zdCB7IHJldHVybiBtTW9kdWxlOyB9Ci0gICAgICAgICAgICAgICByYWRpb19oYWxfYmFuZF9jb25maWdfdCBoYWxDb25maWcoKSBjb25zdDsKLSAgICAgICAgICAgICAgIHNwPENhbGxiYWNrVGhyZWFkPiBjYWxsYmFja1RocmVhZCgpIGNvbnN0IHsgcmV0dXJuIG1DYWxsYmFja1RocmVhZDsgfQotICAgICAgICAgICAgICAgdm9pZCBzZXRUdW5lcihzcDxUdW5lckludGVyZmFjZT4mIHR1bmVyKTsKLSAgICAgICAgICAgICAgIHNwPFR1bmVySW50ZXJmYWNlPiYgZ2V0VHVuZXIoKTsKLSAgICAgICAgICAgICAgIGJvb2wgYXVkaW8oKSBjb25zdCB7IHJldHVybiBtQXVkaW87IH0KLQotICAgICAgICAgICAgICAgdm9pZCBvbkNhbGxiYWNrRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50KTsKLQotICAgICAgIHZpcnR1YWwgdm9pZCBvbkZpcnN0UmVmKCk7Ci0KLQotICAgICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IGltcGxlbWVudGF0aW9uCi0gICAgICAgdmlydHVhbCB2b2lkICAgICAgICBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pOwotCi0gICAgICAgLy8gVHVuZXJDYWxsYmFja0ludGVyZmFjZQotICAgICAgIHZpcnR1YWwgdm9pZCBvbkV2ZW50KHJhZGlvX2hhbF9ldmVudF90ICpldmVudCk7Ci0KLSAgICBwcml2YXRlOgotCi0gICAgICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgICAgICBtTG9jazsgICAgICAgICAgIC8vIHByb3RlY3RzIG1DbGllbnQsIG1Db25maWcgYW5kIG1UdW5lcgotICAgICAgICB3cDxNb2R1bGU+ICAgICAgICAgICAgICAgICAgbU1vZHVsZTsgICAgICAgICAvLyBUaGUgbW9kdWxlIHRoaXMgY2xpZW50IGlzIGF0dGFjaGVkIHRvCi0gICAgICAgIHNwPElSYWRpb0NsaWVudD4gICAgICAgICAgICBtQ2xpZW50OyAgICAgICAgIC8vIGV2ZW50IGNhbGxiYWNrIGJpbmRlciBpbnRlcmZhY2UKLSAgICAgICAgcmFkaW9fYmFuZF9jb25maWdfdCAgICAgICAgIG1Db25maWc7ICAgICAgICAgLy8gY3VycmVudCBiYW5kIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgc3A8Q2FsbGJhY2tUaHJlYWQ+ICAgICAgICAgIG1DYWxsYmFja1RocmVhZDsgLy8gZXZlbnQgY2FsbGJhY2sgdGhyZWFkCi0gICAgICAgIGNvbnN0IGJvb2wgICAgICAgICAgICAgICAgICBtQXVkaW87Ci0gICAgICAgIHNwPFR1bmVySW50ZXJmYWNlPiAgICAgICAgICBtVHVuZXI7ICAgICAgICAvLyBIQUwgdHVuZXIgaW50ZXJmYWNlLiBOVUxMIGluZGljYXRlcyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBjbGllbnQgZG9lcyBub3QgaGF2ZSBjb250cm9sIG9uIGFueQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR1bmVyCi0gICAgfTsgLy8gY2xhc3MgTW9kdWxlQ2xpZW50Ci0KLQotICAgIHN0YXRpYyB2b2lkIGNhbGxiYWNrKHJhZGlvX2hhbF9ldmVudF90ICpoYWxFdmVudCwgdm9pZCAqY29va2llKTsKLQotcHJpdmF0ZToKLQotICAgIHZpcnR1YWwgdm9pZCBvbkZpcnN0UmVmKCk7Ci0KLSAgICBzdGF0aWMgdm9pZCBjb252ZXJ0UHJvcGVydGllcyhyYWRpb19wcm9wZXJ0aWVzX3QgKnByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFkaW9faGFsX3Byb3BlcnRpZXNfdCAqaGFsUHJvcGVydGllcyk7Ci0gICAgTXV0ZXggICAgICAgICAgICAgICBtU2VydmljZUxvY2s7ICAgLy8gcHJvdGVjdHMgbU1vZHVsZXMKLSAgICB2b2xhdGlsZSBpbnQzMl90ICAgIG1OZXh0VW5pcXVlSWQ7ICAvLyBmb3IgbW9kdWxlIElEIGFsbG9jYXRpb24KLSAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IHJhZGlvX2hhbmRsZV90LCBzcDxNb2R1bGU+ID4gbU1vZHVsZXM7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1JBRElPX1NFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvcmFkaW8vVHVuZXJDYWxsYmFja0ludGVyZmFjZS5oIGIvc2VydmljZXMvcmFkaW8vVHVuZXJDYWxsYmFja0ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTczY2NlLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3JhZGlvL1R1bmVyQ2FsbGJhY2tJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfVFVORVJfQ0FMTEJBQ0tfSU5URVJGQUNFX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9UVU5FUl9DQUxMQkFDS19JTlRFUkZBQ0VfSAotCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHN5c3RlbS9yYWRpby5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFR1bmVyQ2FsbGJhY2tJbnRlcmZhY2UgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB2b2lkIG9uRXZlbnQocmFkaW9faGFsX2V2ZW50X3QgKmV2ZW50KSA9IDA7Ci0KLXByb3RlY3RlZDoKLSAgICAgICAgICAgICAgICAgVHVuZXJDYWxsYmFja0ludGVyZmFjZSgpIHt9Ci0gICAgdmlydHVhbCAgICAgIH5UdW5lckNhbGxiYWNrSW50ZXJmYWNlKCkge30KLQotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9UVU5FUl9DQUxMQkFDS19JTlRFUkZBQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvcmFkaW8vVHVuZXJJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL3JhZGlvL1R1bmVySW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNjU3ZDMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvcmFkaW8vVHVuZXJJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1RVTkVSX0lOVEVSRkFDRV9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfVFVORVJfSU5URVJGQUNFX0gKLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBUdW5lckludGVyZmFjZSA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKLXsKLXB1YmxpYzoKLSAgICAgICAgLyoKLSAgICAgICAgICogQXBwbHkgY3VycmVudCByYWRpbyBiYW5kIGNvbmZpZ3VyYXRpb24gKGJhbmQsIHJhbmdlLCBjaGFubmVsIHNwYWNpbmcgLi4uKS4KLSAgICAgICAgICoKLSAgICAgICAgICogYXJndW1lbnRzOgotICAgICAgICAgKiAtIGNvbmZpZzogdGhlIGJhbmQgY29uZmlndXJhdGlvbiB0byBhcHBseQotICAgICAgICAgKgotICAgICAgICAgKiByZXR1cm5zOgotICAgICAgICAgKiAgMCBpZiBjb25maWd1cmF0aW9uIGNvdWxkIGJlIGFwcGxpZWQKLSAgICAgICAgICogIC1FSU5WQUwgaWYgY29uZmlndXJhdGlvbiByZXF1ZXN0ZWQgaXMgaW52YWxpZAotICAgICAgICAgKgotICAgICAgICAgKiBBdXRvbWF0aWNhbGx5IGNhbmNlbHMgcGVuZGluZyBzY2FuLCBzdGVwIG9yIHR1bmUuCi0gICAgICAgICAqCi0gICAgICAgICAqIENhbGxiYWNrIGZ1bmN0aW9uIHdpdGggZXZlbnQgUkFESU9fRVZFTlRfQ09ORklHIE1VU1QgYmUgY2FsbGVkIG9uY2UgdGhlCi0gICAgICAgICAqIGNvbmZpZ3VyYXRpb24gaXMgYXBwbGllZCBvciBhIGZhaWx1cmUgb2NjdXJzIG9yIGFmdGVyIGEgdGltZSBvdXQuCi0gICAgICAgICAqLwotICAgIHZpcnR1YWwgaW50IHNldENvbmZpZ3VyYXRpb24oY29uc3QgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmNvbmZpZykgPSAwOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFJldHJpZXZlIGN1cnJlbnQgcmFkaW8gYmFuZCBjb25maWd1cmF0aW9uLgotICAgICAgICAgKgotICAgICAgICAgKiBhcmd1bWVudHM6Ci0gICAgICAgICAqIC0gY29uZmlnOiB3aGVyZSB0byByZXR1cm4gdGhlIGJhbmQgY29uZmlndXJhdGlvbgotICAgICAgICAgKgotICAgICAgICAgKiByZXR1cm5zOgotICAgICAgICAgKiAgMCBpZiB2YWxpZCBjb25maWd1cmF0aW9uIGlzIHJldHVybmVkCi0gICAgICAgICAqICAtRUlOVkFMIGlmIGludmFsaWQgYXJndW1lbnRzIGFyZSBwYXNzZWQKLSAgICAgICAgICovCi0gICAgdmlydHVhbCBpbnQgZ2V0Q29uZmlndXJhdGlvbihyYWRpb19oYWxfYmFuZF9jb25maWdfdCAqY29uZmlnKSA9IDA7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU3RhcnQgc2Nhbm5pbmcgdXAgdG8gbmV4dCB2YWxpZCBzdGF0aW9uLgotICAgICAgICAgKiBNdXN0IGJlIGNhbGxlZCB3aGVuIGEgdmFsaWQgY29uZmlndXJhdGlvbiBoYXMgYmVlbiBhcHBsaWVkLgotICAgICAgICAgKgotICAgICAgICAgKiBhcmd1bWVudHM6Ci0gICAgICAgICAqIC0gZGlyZWN0aW9uOiBSQURJT19ESVJFQ1RJT05fVVAgb3IgUkFESU9fRElSRUNUSU9OX0RPV04KLSAgICAgICAgICogLSBza2lwX3N1Yl9jaGFubmVsOiB2YWxpZCBmb3IgSEQgcmFkaW8gb3IgZGlnaXRhbCByYWRpb3Mgb25seTogaWdub3JlIHN1YiBjaGFubmVscwotICAgICAgICAgKiAgKGUuZyBTUFMgZm9yIEhEIHJhZGlvKS4KLSAgICAgICAgICoKLSAgICAgICAgICogcmV0dXJuczoKLSAgICAgICAgICogIDAgaWYgc2NhbiBzdWNjZXNzZnVsbHkgc3RhcnRlZAotICAgICAgICAgKiAgLUVOT1NZUyBpZiBjYWxsZWQgb3V0IG9mIHNlcXVlbmNlCi0gICAgICAgICAqICAtRU5PREVWIGlmIGFub3RoZXIgZXJyb3Igb2NjdXJzCi0gICAgICAgICAqCi0gICAgICAgICAqIEF1dG9tYXRpY2FsbHkgY2FuY2VscyBwZW5kaW5nIHNjYW4sIHN0ZXAgb3IgdHVuZS4KLSAgICAgICAgICoKLSAgICAgICAgICogIENhbGxiYWNrIGZ1bmN0aW9uIHdpdGggZXZlbnQgUkFESU9fRVZFTlRfVFVORUQgTVVTVCBiZSBjYWxsZWQgb25jZQotICAgICAgICAgKiAgbG9ja2VkIG9uIGEgc3RhdGlvbiBvciBhZnRlciBhIHRpbWUgb3V0IG9yIGZ1bGwgZnJlcXVlbmN5IHNjYW4gaWYKLSAgICAgICAgICogIG5vIHN0YXRpb24gZm91bmQuIFRoZSBldmVudCBzdGF0dXMgc2hvdWxkIGluZGljYXRlIGlmIGEgdmFsaWQgc3RhdGlvbgotICAgICAgICAgKiAgaXMgdHVuZWQgb3Igbm90LgotICAgICAgICAgKi8KLSAgICB2aXJ0dWFsIGludCBzY2FuKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwX3N1Yl9jaGFubmVsKSA9IDA7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogTW92ZSBvbmUgY2hhbm5lbCBzcGFjaW5nIHVwIG9yIGRvd24uCi0gICAgICAgICAqIE11c3QgYmUgY2FsbGVkIHdoZW4gYSB2YWxpZCBjb25maWd1cmF0aW9uIGhhcyBiZWVuIGFwcGxpZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIGFyZ3VtZW50czoKLSAgICAgICAgICogLSBkaXJlY3Rpb246IFJBRElPX0RJUkVDVElPTl9VUCBvciBSQURJT19ESVJFQ1RJT05fRE9XTgotICAgICAgICAgKiAtIHNraXBfc3ViX2NoYW5uZWw6IHZhbGlkIGZvciBIRCByYWRpbyBvciBkaWdpdGFsIHJhZGlvcyBvbmx5OiBpZ25vcmUgc3ViIGNoYW5uZWxzCi0gICAgICAgICAqICAoZS5nIFNQUyBmb3IgSEQgcmFkaW8pLgotICAgICAgICAgKgotICAgICAgICAgKiByZXR1cm5zOgotICAgICAgICAgKiAgMCBpZiBzdGVwIHN1Y2Nlc3NmdWxseSBzdGFydGVkCi0gICAgICAgICAqICAtRU5PU1lTIGlmIGNhbGxlZCBvdXQgb2Ygc2VxdWVuY2UKLSAgICAgICAgICogIC1FTk9ERVYgaWYgYW5vdGhlciBlcnJvciBvY2N1cnMKLSAgICAgICAgICoKLSAgICAgICAgICogQXV0b21hdGljYWxseSBjYW5jZWxzIHBlbmRpbmcgc2Nhbiwgc3RlcCBvciB0dW5lLgotICAgICAgICAgKgotICAgICAgICAgKiBDYWxsYmFjayBmdW5jdGlvbiB3aXRoIGV2ZW50IFJBRElPX0VWRU5UX1RVTkVEIE1VU1QgYmUgY2FsbGVkIG9uY2UKLSAgICAgICAgICogc3RlcCBjb21wbGV0ZWQgb3IgYWZ0ZXIgYSB0aW1lIG91dC4gVGhlIGV2ZW50IHN0YXR1cyBzaG91bGQgaW5kaWNhdGUKLSAgICAgICAgICogaWYgYSB2YWxpZCBzdGF0aW9uIGlzIHR1bmVkIG9yIG5vdC4KLSAgICAgICAgICovCi0gICAgdmlydHVhbCBpbnQgc3RlcChyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcF9zdWJfY2hhbm5lbCkgPSAwOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFR1bmUgdG8gc3BlY2lmaWVkIGZyZXF1ZW5jeS4KLSAgICAgICAgICogTXVzdCBiZSBjYWxsZWQgd2hlbiBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gYXBwbGllZC4KLSAgICAgICAgICoKLSAgICAgICAgICogYXJndW1lbnRzOgotICAgICAgICAgKiAtIGNoYW5uZWw6IGNoYW5uZWwgdG8gdHVuZSB0by4gQSBmcmVxdWVuY3kgaW4ga0h6IGZvciBBTS9GTS9IRCBSYWRpbyBiYW5kcy4KLSAgICAgICAgICogLSBzdWJfY2hhbm5lbDogdmFsaWQgZm9yIEhEIHJhZGlvIG9yIGRpZ2l0YWwgcmFkaW9zIG9ubHk6IChlLmcgU1BTIG51bWJlciBmb3IgSEQgcmFkaW8pLgotICAgICAgICAgKgotICAgICAgICAgKiByZXR1cm5zOgotICAgICAgICAgKiAgMCBpZiB0dW5lIHN1Y2Nlc3NmdWxseSBzdGFydGVkCi0gICAgICAgICAqICAtRU5PU1lTIGlmIGNhbGxlZCBvdXQgb2Ygc2VxdWVuY2UKLSAgICAgICAgICogIC1FSU5WQUwgaWYgaW52YWxpZCBhcmd1bWVudHMgYXJlIHBhc3NlZAotICAgICAgICAgKiAgLUVOT0RFViBpZiBhbm90aGVyIGVycm9yIG9jY3VycwotICAgICAgICAgKgotICAgICAgICAgKiBBdXRvbWF0aWNhbGx5IGNhbmNlbHMgcGVuZGluZyBzY2FuLCBzdGVwIG9yIHR1bmUuCi0gICAgICAgICAqCi0gICAgICAgICAqIENhbGxiYWNrIGZ1bmN0aW9uIHdpdGggZXZlbnQgUkFESU9fRVZFTlRfVFVORUQgTVVTVCBiZSBjYWxsZWQgb25jZQotICAgICAgICAgKiB0dW5lZCBvciBhZnRlciBhIHRpbWUgb3V0LiBUaGUgZXZlbnQgc3RhdHVzIHNob3VsZCBpbmRpY2F0ZQotICAgICAgICAgKiBpZiBhIHZhbGlkIHN0YXRpb24gaXMgdHVuZWQgb3Igbm90LgotICAgICAgICAgKi8KLSAgICB2aXJ0dWFsIGludCB0dW5lKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgc3ViX2NoYW5uZWwpID0gMDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBDYW5jZWwgYSBzY2FuLCBzdGVwIG9yIHR1bmUgb3BlcmF0aW9uLgotICAgICAgICAgKiBNdXN0IGJlIGNhbGxlZCB3aGlsZSBhIHNjYW4sIHN0ZXAgb3IgdHVuZSBvcGVyYXRpb24gaXMgcGVuZGluZwotICAgICAgICAgKiAoY2FsbGJhY2sgbm90IHlldCBzZW50KS4KLSAgICAgICAgICoKLSAgICAgICAgICogcmV0dXJuczoKLSAgICAgICAgICogIDAgaWYgc3VjY2Vzc2Z1bAotICAgICAgICAgKiAgLUVOT1NZUyBpZiBjYWxsZWQgb3V0IG9mIHNlcXVlbmNlCi0gICAgICAgICAqICAtRU5PREVWIGlmIGFub3RoZXIgZXJyb3Igb2NjdXJzCi0gICAgICAgICAqCi0gICAgICAgICAqIFRoZSBjYWxsYmFjayBpcyBub3Qgc2VudC4KLSAgICAgICAgICovCi0gICAgdmlydHVhbCBpbnQgY2FuY2VsKCkgPSAwOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFJldHJpZXZlIGN1cnJlbnQgc3RhdGlvbiBpbmZvcm1hdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogYXJndW1lbnRzOgotICAgICAgICAgKiAtIGluZm86IHdoZXJlIHRvIHJldHVybiB0aGUgcHJvZ3JhbSBpbmZvLgotICAgICAgICAgKiBJZiBpbmZvLT5tZXRhZGF0YSBpcyBOVUxMLiBubyBtZXRhIGRhdGEgc2hvdWxkIGJlIHJldHVybmVkLgotICAgICAgICAgKiBJZiBtZXRhIGRhdGEgbXVzdCBiZSByZXR1cm5lZCwgdGhleSBzaG91bGQgYmUgYWRkZWQgdG8gb3IgY2xvbmVkIHRvCi0gICAgICAgICAqIGluZm8tPm1ldGFkYXRhLCBub3QgcGFzc2VkIGZyb20gYSBuZXdseSBjcmVhdGVkIG1ldGEgZGF0YSBidWZmZXIuCi0gICAgICAgICAqCi0gICAgICAgICAqIHJldHVybnM6Ci0gICAgICAgICAqICAwIGlmIHR1bmVkIGFuZCBpbmZvcm1hdGlvbiBhdmFpbGFibGUKLSAgICAgICAgICogIC1FSU5WQUwgaWYgaW52YWxpZCBhcmd1bWVudHMgYXJlIHBhc3NlZAotICAgICAgICAgKiAgLUVOT0RFViBpZiBhbm90aGVyIGVycm9yIG9jY3VycwotICAgICAgICAgKi8KLSAgICB2aXJ0dWFsIGludCBnZXRQcm9ncmFtSW5mb3JtYXRpb24ocmFkaW9fcHJvZ3JhbV9pbmZvX3QgKmluZm8pID0gMDsKLQotcHJvdGVjdGVkOgotICAgICAgICAgICAgICAgIFR1bmVySW50ZXJmYWNlKCkge30KLSAgICB2aXJ0dWFsICAgICB+VHVuZXJJbnRlcmZhY2UoKSB7fQotCi19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1RVTkVSX0lOVEVSRkFDRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCmluZGV4IDViOGQ5OTAuLjIyNTE5YTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCkBAIC04OSw3ICs4OSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKQogewogICAgIEFMT0dWKCJsaXN0TW9kdWxlcyIpOwotICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHsKKyAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCkBAIC0xMTAsNyArMTExLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElTb3VuZFRyaWdnZXI+JiBtb2R1bGVJbnRlcmZhY2UpCiB7CiAgICAgQUxPR1YoImF0dGFjaCBtb2R1bGUgJWQiLCBoYW5kbGUpOwotICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHsKKyAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCkBAIC01MjgsMzcgKzUzMCw0NSBAQAogdm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZTo6ZGV0YWNoKGNvbnN0IHNwPE1vZHVsZUNsaWVudD4mIG1vZHVsZUNsaWVudCkKIHsKICAgICBBTE9HVigiTW9kdWxlOjpkZXRhY2goKSIpOwotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBzc2l6ZV90IGluZGV4ID0gLTE7CisgICAgVmVjdG9yPGF1ZGlvX3Nlc3Npb25fdD4gcmVsZWFzZWRTZXNzaW9uczsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZHVsZUNsaWVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1Nb2R1bGVDbGllbnRzW2ldID09IG1vZHVsZUNsaWVudCkgewotICAgICAgICAgICAgaW5kZXggPSBpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGluZGV4ID09IC0xKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CisgICAgeworICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgICAgIHNzaXplX3QgaW5kZXggPSAtMTsKIAotICAgIEFMT0dWKCJyZW1vdmUgY2xpZW50ICVwIiwgbW9kdWxlQ2xpZW50LmdldCgpKTsKLSAgICBtTW9kdWxlQ2xpZW50cy5yZW1vdmVBdChpbmRleCk7Ci0KLSAgICAvLyBJdGVyYXRlIGluIHJldmVyc2Ugb3JkZXIgYXMgbW9kZWxzIGFyZSByZW1vdmVkIGZyb20gbGlzdCBpbnNpZGUgdGhlIGxvb3AuCi0gICAgZm9yIChzaXplX3QgaSA9IG1Nb2RlbHMuc2l6ZSgpOyBpID4gMDsgaS0tKSB7Ci0gICAgICAgIHNwPE1vZGVsPiBtb2RlbCA9IG1Nb2RlbHMudmFsdWVBdChpIC0gMSk7Ci0gICAgICAgIGlmIChtb2R1bGVDbGllbnQgPT0gbW9kZWwtPm1Nb2R1bGVDbGllbnQpIHsKLSAgICAgICAgICAgIG1Nb2RlbHMucmVtb3ZlSXRlbXNBdChpIC0gMSk7Ci0gICAgICAgICAgICBBTE9HVigiZGV0YWNoKCkgdW5sb2FkaW5nIG1vZGVsICVkIiwgbW9kZWwtPm1IYW5kbGUpOwotICAgICAgICAgICAgaWYgKG1IYWxJbnRlcmZhY2UgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChtb2RlbC0+bVN0YXRlID09IE1vZGVsOjpTVEFURV9BQ1RJVkUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUhhbEludGVyZmFjZS0+c3RvcFJlY29nbml0aW9uKG1vZGVsLT5tSGFuZGxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUhhbEludGVyZmFjZS0+dW5sb2FkU291bmRNb2RlbChtb2RlbC0+bUhhbmRsZSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZHVsZUNsaWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtTW9kdWxlQ2xpZW50c1tpXSA9PSBtb2R1bGVDbGllbnQpIHsKKyAgICAgICAgICAgICAgICBpbmRleCA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24obW9kZWwtPm1DYXB0dXJlU2Vzc2lvbik7Ci0gICAgICAgICAgICBtSGFsSW50ZXJmYWNlLT51bmxvYWRTb3VuZE1vZGVsKG1vZGVsLT5tSGFuZGxlKTsKICAgICAgICAgfQorICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJyZW1vdmUgY2xpZW50ICVwIiwgbW9kdWxlQ2xpZW50LmdldCgpKTsKKyAgICAgICAgbU1vZHVsZUNsaWVudHMucmVtb3ZlQXQoaW5kZXgpOworCisgICAgICAgIC8vIEl0ZXJhdGUgaW4gcmV2ZXJzZSBvcmRlciBhcyBtb2RlbHMgYXJlIHJlbW92ZWQgZnJvbSBsaXN0IGluc2lkZSB0aGUgbG9vcC4KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IG1Nb2RlbHMuc2l6ZSgpOyBpID4gMDsgaS0tKSB7CisgICAgICAgICAgICBzcDxNb2RlbD4gbW9kZWwgPSBtTW9kZWxzLnZhbHVlQXQoaSAtIDEpOworICAgICAgICAgICAgaWYgKG1vZHVsZUNsaWVudCA9PSBtb2RlbC0+bU1vZHVsZUNsaWVudCkgeworICAgICAgICAgICAgICAgIG1Nb2RlbHMucmVtb3ZlSXRlbXNBdChpIC0gMSk7CisgICAgICAgICAgICAgICAgQUxPR1YoImRldGFjaCgpIHVubG9hZGluZyBtb2RlbCAlZCIsIG1vZGVsLT5tSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAobUhhbEludGVyZmFjZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC0+bVN0YXRlID09IE1vZGVsOjpTVEFURV9BQ1RJVkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1IYWxJbnRlcmZhY2UtPnN0b3BSZWNvZ25pdGlvbihtb2RlbC0+bUhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUhhbEludGVyZmFjZS0+dW5sb2FkU291bmRNb2RlbChtb2RlbC0+bUhhbmRsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlbGVhc2VkU2Vzc2lvbnMuYWRkKG1vZGVsLT5tQ2FwdHVyZVNlc3Npb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZWxlYXNlZFNlc3Npb25zLnNpemUoKTsgaSsrKSB7CisgICAgICAgIC8vIGRvIG5vdCBjYWxsIEF1ZGlvU3lzdGVtIG1ldGhvZHMgd2l0aCBtTG9jayBoZWxkCisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihyZWxlYXNlZFNlc3Npb25zW2ldKTsKICAgICB9CiB9CiAKQEAgLTU5Myw2MSArNjAzLDcxIEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotCi0gICAgaWYgKG1Nb2RlbHMuc2l6ZSgpID49IG1EZXNjcmlwdG9yLnByb3BlcnRpZXMubWF4X3NvdW5kX21vZGVscykgewotICAgICAgICBBTE9HVygibG9hZFNvdW5kTW9kZWwoKTogTm90IGxvYWRpbmcsIG1heCBudW1iZXIgb2YgbW9kZWxzICglZCkgd291bGQgYmUgZXhjZWVkZWQiLAotICAgICAgICAgICAgICBtRGVzY3JpcHRvci5wcm9wZXJ0aWVzLm1heF9zb3VuZF9tb2RlbHMpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbUhhbEludGVyZmFjZS0+bG9hZFNvdW5kTW9kZWwoc291bmRfbW9kZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6c291bmRNb2RlbENhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBoYW5kbGUpOwotCi0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbjsKICAgICBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZTsKICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlOwotCi0gICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKCZzZXNzaW9uLCAmaW9IYW5kbGUsICZkZXZpY2UpOworICAgIC8vIGRvIG5vdCBjYWxsIEF1ZGlvU3lzdGVtIG1ldGhvZHMgd2l0aCBtTG9jayBoZWxkCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKCZzZXNzaW9uLCAmaW9IYW5kbGUsICZkZXZpY2UpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKLSAgICBzcDxNb2RlbD4gbW9kZWwgPSBuZXcgTW9kZWwoKmhhbmRsZSwgc2Vzc2lvbiwgaW9IYW5kbGUsIGRldmljZSwgc291bmRfbW9kZWwtPnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZUNsaWVudCk7Ci0gICAgbU1vZGVscy5yZXBsYWNlVmFsdWVGb3IoKmhhbmRsZSwgbW9kZWwpOworICAgIHsKKyAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogCisgICAgICAgIGlmIChtTW9kZWxzLnNpemUoKSA+PSBtRGVzY3JpcHRvci5wcm9wZXJ0aWVzLm1heF9zb3VuZF9tb2RlbHMpIHsKKyAgICAgICAgICAgIEFMT0dXKCJsb2FkU291bmRNb2RlbCgpOiBOb3QgbG9hZGluZywgbWF4IG51bWJlciBvZiBtb2RlbHMgKCVkKSB3b3VsZCBiZSBleGNlZWRlZCIsCisgICAgICAgICAgICAgICAgICBtRGVzY3JpcHRvci5wcm9wZXJ0aWVzLm1heF9zb3VuZF9tb2RlbHMpOworICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXMgPSBtSGFsSW50ZXJmYWNlLT5sb2FkU291bmRNb2RlbChzb3VuZF9tb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6c291bmRNb2RlbENhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgaGFuZGxlKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisKKyAgICAgICAgc3A8TW9kZWw+IG1vZGVsID0gbmV3IE1vZGVsKCpoYW5kbGUsIHNlc3Npb24sIGlvSGFuZGxlLCBkZXZpY2UsIHNvdW5kX21vZGVsLT50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlQ2xpZW50KTsKKyAgICAgICAgbU1vZGVscy5yZXBsYWNlVmFsdWVGb3IoKmhhbmRsZSwgbW9kZWwpOworICAgIH0KK2V4aXQ6CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAvLyBkbyBub3QgY2FsbCBBdWRpb1N5c3RlbSBtZXRob2RzIHdpdGggbUxvY2sgaGVsZAorICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oc2Vzc2lvbik7CisgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjp1bmxvYWRTb3VuZE1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKIHsKICAgICBBTE9HVigidW5sb2FkU291bmRNb2RlbCgpIG1vZGVsIGhhbmRsZSAlZCIsIGhhbmRsZSk7Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIHJldHVybiB1bmxvYWRTb3VuZE1vZGVsX2woaGFuZGxlKTsKLX0KKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb247CiAKLXN0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjp1bmxvYWRTb3VuZE1vZGVsX2woc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQotewotICAgIGlmIChtSGFsSW50ZXJmYWNlID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgICAgIGlmIChtSGFsSW50ZXJmYWNlID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtTW9kZWxzLmluZGV4T2ZLZXkoaGFuZGxlKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBzcDxNb2RlbD4gbW9kZWwgPSBtTW9kZWxzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBtTW9kZWxzLnJlbW92ZUl0ZW0oaGFuZGxlKTsKKyAgICAgICAgaWYgKG1vZGVsLT5tU3RhdGUgPT0gTW9kZWw6OlNUQVRFX0FDVElWRSkgeworICAgICAgICAgICAgbUhhbEludGVyZmFjZS0+c3RvcFJlY29nbml0aW9uKG1vZGVsLT5tSGFuZGxlKTsKKyAgICAgICAgICAgIG1vZGVsLT5tU3RhdGUgPSBNb2RlbDo6U1RBVEVfSURMRTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBtSGFsSW50ZXJmYWNlLT51bmxvYWRTb3VuZE1vZGVsKGhhbmRsZSk7CisgICAgICAgIHNlc3Npb24gPSBtb2RlbC0+bUNhcHR1cmVTZXNzaW9uOwogICAgIH0KLSAgICBzc2l6ZV90IGluZGV4ID0gbU1vZGVscy5pbmRleE9mS2V5KGhhbmRsZSk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzcDxNb2RlbD4gbW9kZWwgPSBtTW9kZWxzLnZhbHVlQXQoaW5kZXgpOwotICAgIG1Nb2RlbHMucmVtb3ZlSXRlbShoYW5kbGUpOwotICAgIGlmIChtb2RlbC0+bVN0YXRlID09IE1vZGVsOjpTVEFURV9BQ1RJVkUpIHsKLSAgICAgICAgbUhhbEludGVyZmFjZS0+c3RvcFJlY29nbml0aW9uKG1vZGVsLT5tSGFuZGxlKTsKLSAgICAgICAgbW9kZWwtPm1TdGF0ZSA9IE1vZGVsOjpTVEFURV9JRExFOwotICAgIH0KLSAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24obW9kZWwtPm1DYXB0dXJlU2Vzc2lvbik7Ci0gICAgcmV0dXJuIG1IYWxJbnRlcmZhY2UtPnVubG9hZFNvdW5kTW9kZWwoaGFuZGxlKTsKKyAgICAvLyBkbyBub3QgY2FsbCBBdWRpb1N5c3RlbSBtZXRob2RzIHdpdGggbUxvY2sgaGVsZAorICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihzZXNzaW9uKTsKKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0dXNfdCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZTo6c3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsCkBAIC04MzgsNyArODU4LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGNvbnN0IGJvb2wgc3VwcG9ydHNfc3RvcF9hbGwgPQotICAgICAgICAgICAgICAgIChtSGFsSW50ZXJmYWNlICE9IDApICYmIChtSGFsSW50ZXJmYWNlLT5zdG9wQWxsUmVjb2duaXRpb25zKCkgPT0gRU5PU1lTKTsKKyAgICAgICAgICAgICAgICAobUhhbEludGVyZmFjZSAhPSAwKSAmJiAobUhhbEludGVyZmFjZS0+c3RvcEFsbFJlY29nbml0aW9ucygpICE9IC1FTk9TWVMpOwogCiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZGVscy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgc3A8TW9kZWw+IG1vZGVsID0gbU1vZGVscy52YWx1ZUF0KGkpOwpAQCAtOTQyLDcgKzk2Miw4IEBACiAKIHZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmRldGFjaCgpIHsKICAgICBBTE9HVigiZGV0YWNoKCkiKTsKLSAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpKSB7CisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtOTY1LDcgKzk4Niw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90ICpoYW5kbGUpCiB7CiAgICAgQUxPR1YoImxvYWRTb3VuZE1vZGVsKCkgaGFuZGxlIik7Ci0gICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoKSkgeworICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKQEAgLTk3OSw3ICsxMDAxLDggQEAKIHN0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlQ2xpZW50Ojp1bmxvYWRTb3VuZE1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKIHsKICAgICBBTE9HVigidW5sb2FkU291bmRNb2RlbCgpIG1vZGVsIGhhbmRsZSAlZCIsIGhhbmRsZSk7Ci0gICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoKSkgeworICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKQEAgLTk5NCw3ICsxMDE3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhTWVtb3J5KQogewogICAgIEFMT0dWKCJzdGFydFJlY29nbml0aW9uKCkgbW9kZWwgaGFuZGxlICVkIiwgaGFuZGxlKTsKLSAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpKSB7CisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIApAQCAtMTAwOCw3ICsxMDMyLDggQEAKIHN0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlQ2xpZW50OjpzdG9wUmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQogewogICAgIEFMT0dWKCJzdG9wUmVjb2duaXRpb24oKSBtb2RlbCBoYW5kbGUgJWQiLCBoYW5kbGUpOwotICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHsKKyAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmggYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmgKaW5kZXggNjBlYmIzNS4uOTVlZmM0YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5oCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuaApAQCAtMTQwLDggKzE0MCw2IEBACiAKICAgICBwcml2YXRlOgogCi0gICAgICAgIHN0YXR1c190IHVubG9hZFNvdW5kTW9kZWxfbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOwotCiAgICAgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOwogICAgICAgICB3cDxTb3VuZFRyaWdnZXJId1NlcnZpY2U+ICAgICAgICAgICAgICBtU2VydmljZTsKICAgICAgICAgc3A8U291bmRUcmlnZ2VySGFsSW50ZXJmYWNlPiAgICAgICAgICAgbUhhbEludGVyZmFjZTsK