ZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvdGNmX2FnZW50L2ZyYW1ld29yay9lcnJvcnMuYyBiL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvdGNmX2FnZW50L2ZyYW1ld29yay9lcnJvcnMuYwppbmRleCA0ZDc0NzEyLi4xZWI2MDY2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3RjZl9hZ2VudC9mcmFtZXdvcmsvZXJyb3JzLmMKKysrIGIvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy90Y2ZfYWdlbnQvZnJhbWV3b3JrL2Vycm9ycy5jCkBAIC0zNTAsNiArMzUwLDEyIEBACiAgICAgY2FzZSBFUlJfSFdCUktfSU5WQUxJRF9TSVpFOiByZXR1cm4gIkludmFsaWQgc2l6ZSI7CiAgICAgY2FzZSBFUlJfSFdCUktfTk9fUkVTT1VSQ0VTOiByZXR1cm4gIk5vIHJlc291cmNlcyBhdmFpbGFibGUiOwogICAgIGNhc2UgRVJSX0hXQlJLX05PVF9BTElHTkVEOiAgcmV0dXJuICJJbnZhbGlkIGFkZHJlc3MgYWxpZ25tZW50IjsKKyAgICBjYXNlIEVSUl9IV0JSS19JTlZBTElEX01PREU6IHJldHVybiAiSW52YWxpZCBoYXJkd2FyZSBicmVha3BvaW50IG1vZGUiOworICAgIGNhc2UgRVJSX1BHUFJPX1VOU0VUOiAgICAgICAgcmV0dXJuICJDYW5ub3Qgc2V0IHBhZ2UgcHJvdGVjdGlvbiI7CisgICAgY2FzZSBFUlJfUEdQUk9fVU5SRVNFVDogICAgICByZXR1cm4gIkNhbm5vdCByZXNldCBwYWdlIHByb3RlY3Rpb24iOworICAgIGNhc2UgRVJSX1BHUFJPX1VOQ0hBTkdFRDogICAgcmV0dXJuICJDYW5ub3QgY2hhbmdlIHBhZ2UgcHJvdGVjdGlvbiI7CisgICAgY2FzZSBFUlJfUEdQUk9fSU5WQUxJRF9NT0RFOiByZXR1cm4gIkludmFsaWQgcGFnZSBwcm90ZWN0aW9uIG1vZGUiOworICAgIGNhc2UgRVJSX1BHUFJPX05PX0FERFI6ICAgICAgcmV0dXJuICJObyBwYWdlIGNvbnRhaW5pbmcgYWRkcmVzcyI7CiAgICAgZGVmYXVsdDoKICAgICAgICAgaWYgKGVyciA+PSBFUlJfTUVTU0FHRV9NSU4gJiYgZXJyIDw9IEVSUl9NRVNTQUdFX01BWCkgewogICAgICAgICAgICAgaWYgKGlzX2Rpc3BhdGNoX3RocmVhZCgpKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3RjZl9hZ2VudC9mcmFtZXdvcmsvZXJyb3JzLmggYi9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3RjZl9hZ2VudC9mcmFtZXdvcmsvZXJyb3JzLmgKaW5kZXggODBmOTBmNy4uYmJjYTZiYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy90Y2ZfYWdlbnQvZnJhbWV3b3JrL2Vycm9ycy5oCisrKyBiL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvdGNmX2FnZW50L2ZyYW1ld29yay9lcnJvcnMuaApAQCAtNTYsNiArNTYsMTIgQEAKICNkZWZpbmUgRVJSX0hXQlJLX0lOVkFMSURfU0laRSAgKFNURF9FUlJfQkFTRSArIDMwKQogI2RlZmluZSBFUlJfSFdCUktfTk9fUkVTT1VSQ0VTICAoU1REX0VSUl9CQVNFICsgMzEpCiAjZGVmaW5lIEVSUl9IV0JSS19OT1RfQUxJR05FRCAgIChTVERfRVJSX0JBU0UgKyAzMikKKyNkZWZpbmUgRVJSX0hXQlJLX0lOVkFMSURfTU9ERSAgKFNURF9FUlJfQkFTRSArIDMzKQorI2RlZmluZSBFUlJfUEdQUk9fVU5TRVQgICAgICAgICAoU1REX0VSUl9CQVNFICsgMzQpCisjZGVmaW5lIEVSUl9QR1BST19VTlJFU0VUICAgICAgIChTVERfRVJSX0JBU0UgKyAzNSkKKyNkZWZpbmUgRVJSX1BHUFJPX1VOQ0hBTkdFRCAgICAgKFNURF9FUlJfQkFTRSArIDM2KQorI2RlZmluZSBFUlJfUEdQUk9fSU5WQUxJRF9NT0RFICAoU1REX0VSUl9CQVNFICsgMzcpCisjZGVmaW5lIEVSUl9QR1BST19OT19BRERSICAgICAgIChTVERfRVJSX0JBU0UgKyAzOCkKIAogdHlwZWRlZiBzdHJ1Y3QgRXJyb3JSZXBvcnRJdGVtIHsKICAgICBjaGFyICogbmFtZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvdGNmX2FnZW50L3NlcnZpY2VzL2Rpc2NvdmVyeS5jIGIvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy90Y2ZfYWdlbnQvc2VydmljZXMvZGlzY292ZXJ5LmMKaW5kZXggZmE5MjExZi4uY2IzNDIzNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy90Y2ZfYWdlbnQvc2VydmljZXMvZGlzY292ZXJ5LmMKKysrIGIvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy90Y2ZfYWdlbnQvc2VydmljZXMvZGlzY292ZXJ5LmMKQEAgLTU5LDcgKzU5LDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgY29tbWFuZF9zeW5jKGNoYXIgKiB0b2tlbiwgQ2hhbm5lbCAqIGMpIHsKK3N0YXRpYyB2b2lkIGNvbW1hbmRfc3luYyhjb25zdCBjaGFyKiB0b2tlbiwgQ2hhbm5lbCAqIGMpIHsKICAgICBpZiAocmVhZF9zdHJlYW0oJmMtPmlucCkgIT0gTUFSS0VSX0VPTSkgZXhjZXB0aW9uKEVSUl9KU09OX1NZTlRBWCk7CiAgICAgd3JpdGVfc3RyaW5neigmYy0+b3V0LCAiUiIpOwogICAgIHdyaXRlX3N0cmluZ3ooJmMtPm91dCwgdG9rZW4pOwpAQCAtMTAwLDcgKzEwMCw3IEBACiAgICAgcGVlcl9zZXJ2ZXJfYWRkcHJvcCgoUGVlclNlcnZlciAqKXgsIGxvY19zdHJkdXAobmFtZSksIGpzb25fcmVhZF9hbGxvY19zdHJpbmcoaW5wKSk7CiB9CiAKLXN0YXRpYyB2b2lkIGNvbW1hbmRfcmVkaXJlY3QoY2hhciAqIHRva2VuLCBDaGFubmVsICogYykgeworc3RhdGljIHZvaWQgY29tbWFuZF9yZWRpcmVjdChjb25zdCBjaGFyICogdG9rZW4sIENoYW5uZWwgKiBjKSB7CiAgICAgUGVlclNlcnZlciAqIHBzID0gTlVMTDsKICAgICBpbnQgZnJlZV9wcyA9IDA7CiAKQEAgLTEzNSw3ICsxMzUsNyBAQAogICAgIGlmIChmcmVlX3BzKSBwZWVyX3NlcnZlcl9mcmVlKHBzKTsKIH0KIAotc3RhdGljIHZvaWQgY29tbWFuZF9nZXRfcGVlcnMoY2hhciAqIHRva2VuLCBDaGFubmVsICogYykgeworc3RhdGljIHZvaWQgY29tbWFuZF9nZXRfcGVlcnMoY29uc3QgY2hhciAqIHRva2VuLCBDaGFubmVsICogYykgewogICAgIGlmIChyZWFkX3N0cmVhbSgmYy0+aW5wKSAhPSBNQVJLRVJfRU9NKSBleGNlcHRpb24oRVJSX0pTT05fU1lOVEFYKTsKIAogICAgIHdyaXRlX3N0cmluZ3ooJmMtPm91dCwgIlIiKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvd2luX2FnZW50L0JyZWFrcG9pbnRzU2VydmljZS5jcHAgYi9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9CcmVha3BvaW50c1NlcnZpY2UuY3BwCmluZGV4IDlhMGMxODAuLjM0N2Q5MjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvd2luX2FnZW50L0JyZWFrcG9pbnRzU2VydmljZS5jcHAKKysrIGIvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvQnJlYWtwb2ludHNTZXJ2aWNlLmNwcApAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgIkV2ZW50Q2xpZW50Tm90aWZpZXIuaCINCiAjaW5jbHVkZSAiTG9nZ2VyLmgiDQogDQotI2luY2x1ZGUgIldpbkhXQmtwdE1nci5oIg0KICNpbmNsdWRlICJXaW5Qcm9jZXNzLmgiDQogI2luY2x1ZGUgIldpblRocmVhZC5oIg0KIA0KQEAgLTMyLDYgKzMxLDEwIEBACiANCiBib29sIEJyZWFrcG9pbnRzU2VydmljZTo6c1NlcnZpY2VJbnN0YWxsZWQgPSBmYWxzZTsNCiANCitpbmxpbmUgYm9vbCBUQnJlYWtwb2ludDo6U2FtZVByb2Nlc3MoY29uc3QgSEFORExFJiBwcm9jSCkgY29uc3QNCisJeyByZXR1cm4gcHJvY2VzcyAmJiBwcm9jZXNzLT5HZXRQcm9jZXNzSGFuZGxlKCkgPT0gcHJvY0g7IH0NCisNCisNCiAvLw0KIC8vIFRoZSBzdGF0aWMgZnVuY3Rpb24gcmVhZHMgdGhlIGNvbnRleHQgaWRzIGZvciBhIGJyZWFrcG9pbnQNCiAvLw0KQEAgLTU4LDExICs2MSwxMSBAQAogCWlmICg6OnN0cmNtcChubSwgIkJyZWFrcG9pbnRUeXBlIikgPT0gMCkgew0KIAkJc3RkOjpzdHJpbmcgdHlwZSA9IGlucFN0cmVhbS5yZWFkU3RyaW5nKCk7DQogCQlpZiAodHlwZS5jb21wYXJlKCJBdXRvIikgPT0gMCkgew0KLQkJCWF0dHJzLT5icFR5cGUgPSB0eXBlX0F1dG87DQorCQkJYXR0cnMtPnJlcXVlc3RlZFR5cGUgPSB0eXBlX0F1dG87DQogCQl9IGVsc2UgaWYgKHR5cGUuY29tcGFyZSgiU29mdHdhcmUiKSA9PSAwKSB7DQotCQkJYXR0cnMtPmJwVHlwZSA9IHR5cGVfU29mdHdhcmU7DQorCQkJYXR0cnMtPnJlcXVlc3RlZFR5cGUgPSB0eXBlX1NvZnR3YXJlOw0KIAkJfSBlbHNlIGlmICh0eXBlLmNvbXBhcmUoIkhhcmR3YXJlIikgPT0gMCkgew0KLQkJCWF0dHJzLT5icFR5cGUgPSB0eXBlX0hhcmR3YXJlOw0KKwkJCWF0dHJzLT5yZXF1ZXN0ZWRUeXBlID0gdHlwZV9IYXJkd2FyZTsNCiAJCX0NCiAJCXJldHVybjsNCiAJfQ0KQEAgLTE2Nyw3ICsxNzAsNyBAQAogCX0NCiANCiAJaW50IGVycjsNCi0JaWYgKEFDQ0VTU01PREVfRVhFQ1VURSA9PSBicmVha0luZm8tPmFjY2Vzc01vZGUpDQorCWlmIChicmVha0luZm8tPklzVHlwZUJyZWFrcG9pbnQoKSkNCiAJCWVyciA9IEluc2VydEJyZWFrKGJyZWFrSW5mbyk7DQogCWVsc2UNCiAJCWVyciA9IEluc2VydFdhdGNoKGJyZWFrSW5mbyk7DQpAQCAtMjA3LDcgKzIxMCw3IEBACiAJCVRCcmVha3BvaW50KiBicCA9IGl0LT5zZWNvbmQ7DQogCQlzQnJlYWtQb2ludE1hcC5lcmFzZShpdC0+Zmlyc3QpOw0KIA0KLQkJaWYgKEFDQ0VTU01PREVfRVhFQ1VURSA9PSBicC0+YWNjZXNzTW9kZSkNCisJCWlmIChicC0+SXNUeXBlQnJlYWtwb2ludCgpKQ0KIAkJCWVyciA9IENsZWFyQnJlYWsoYnApOw0KIAkJZWxzZQ0KIAkJCWVyciA9IENsZWFyV2F0Y2goYnApOw0KQEAgLTIzNywxNSArMjQwLDE3IEBACiAJY29uc3QgSEFORExFJiBwcm9jSGFuZGxlID0gYnBJbmZvLT5wcm9jZXNzLT5HZXRQcm9jZXNzSGFuZGxlKCk7DQogDQogCS8vIHNhdmUgYnl0ZSBhdCBicmVha3BvaW50IGFkZHJlc3MuDQotCWlmICghIDo6UmVhZFByb2Nlc3NNZW1vcnkocHJvY0hhbmRsZSwgKExQQ1ZPSUQpYnBJbmZvLT5hZGRyZXNzLCAoTFBWT0lEKSZicEluZm8tPm9yaWdpbmFsQnl0ZSwgMSwgTlVMTCkpDQorCWlmIChGQUlMRUQoOjpSZWFkUHJvY2Vzc01lbW9yeShwcm9jSGFuZGxlLCAoTFBDVk9JRClicEluZm8tPmFkZHJlc3MsDQorCQkJCQkJCQkgICAoTFBWT0lEKSZicEluZm8tPm9yaWdpbmFsQnl0ZSwgMSwgTlVMTCkpKQ0KIAkJcmV0dXJuIDo6R2V0TGFzdEVycm9yKCk7DQogDQogCS8vIHdyaXRlIGJyZWFrcG9pbnQgKElOVDMpIHRvIG1lbW9yeQ0KLQlpZiAoISA6OldyaXRlUHJvY2Vzc01lbW9yeShwcm9jSGFuZGxlLCAoTFBWT0lEKWJwSW5mby0+YWRkcmVzcywgKExQVk9JRCkmc0JyZWFrSW5zdCwgMSwgTlVMTCkpDQorCWlmIChGQUlMRUQoOjpXcml0ZVByb2Nlc3NNZW1vcnkocHJvY0hhbmRsZSwgKExQVk9JRClicEluZm8tPmFkZHJlc3MsDQorCQkJCQkJCQkJKExQVk9JRCkmc0JyZWFrSW5zdCwgMSwgTlVMTCkpKQ0KIAkJcmV0dXJuIDo6R2V0TGFzdEVycm9yKCk7DQogDQogCS8vIG1ha2Ugc3VyZSBvcmlnaW5hbCBpbnN0cnVjdGlvbiBpc24ndCBhbHJlYWR5IGluIGNhY2hlDQotCWlmICghIDo6Rmx1c2hJbnN0cnVjdGlvbkNhY2hlKHByb2NIYW5kbGUsIChMUENWT0lEKWJwSW5mby0+YWRkcmVzcywgMSkpDQorCWlmIChGQUlMRUQoOjpGbHVzaEluc3RydWN0aW9uQ2FjaGUocHJvY0hhbmRsZSwgKExQQ1ZPSUQpYnBJbmZvLT5hZGRyZXNzLCAxKSkpDQogCQlyZXR1cm4gOjpHZXRMYXN0RXJyb3IoKTsNCiANCiAJcmV0dXJuIDA7DQpAQCAtMjU1LDE0ICsyNjAsMTggQEAKICAqIENsZWFyIGEgYnJlYWtwb2ludCBmcm9tIGEgcHJvY2Vzcy4NCiAgKi8NCiBpbnQgQnJlYWtwb2ludHNTZXJ2aWNlOjpDbGVhckJyZWFrKGNvbnN0IFRCcmVha3BvaW50KiBicEluZm8pIHsNCisJaWYgKCFicEluZm8tPnByb2Nlc3MpDQorCQlyZXR1cm4gMDsJLy8gcHJvY2VzcyBtYXkgaGF2ZSBjbGVhbmVkIHVwIGFmdGVyIGl0c2VsZiB1cG9uIGV4aXQNCisNCiAJY29uc3QgSEFORExFJiBwcm9jSGFuZGxlID0gYnBJbmZvLT5wcm9jZXNzLT5HZXRQcm9jZXNzSGFuZGxlKCk7DQogDQogCS8vIHdyaXRlIG9yaWdpbmFsIGJ5dGUgYmFjayBvdmVyIHRvcCBvZiAoSU5UMykgaW4gbWVtb3J5DQotCWlmICghIDo6V3JpdGVQcm9jZXNzTWVtb3J5KHByb2NIYW5kbGUsIChMUFZPSUQpYnBJbmZvLT5hZGRyZXNzLCAoTFBWT0lEKSZicEluZm8tPm9yaWdpbmFsQnl0ZSwgMSwgTlVMTCkpDQorCWlmIChGQUlMRUQoOjpXcml0ZVByb2Nlc3NNZW1vcnkocHJvY0hhbmRsZSwgKExQVk9JRClicEluZm8tPmFkZHJlc3MsDQorCQkJCQkJCQkJKExQVk9JRCkmYnBJbmZvLT5vcmlnaW5hbEJ5dGUsIDEsIE5VTEwpKSkNCiAJCXJldHVybiA6OkdldExhc3RFcnJvcigpOw0KIA0KIAkvLyBtYWtlIHN1cmUgYnAgaW5zdHJ1Y3Rpb24gaXNuJ3QgYWxyZWFkeSBpbiBjYWNoZQ0KLQlpZiAoISA6OkZsdXNoSW5zdHJ1Y3Rpb25DYWNoZShwcm9jSGFuZGxlLCAoTFBDVk9JRClicEluZm8tPmFkZHJlc3MsIDEpKQ0KKwlpZiAoRkFJTEVEKDo6Rmx1c2hJbnN0cnVjdGlvbkNhY2hlKHByb2NIYW5kbGUsIChMUENWT0lEKWJwSW5mby0+YWRkcmVzcywgMSkpKQ0KIAkJcmV0dXJuIDo6R2V0TGFzdEVycm9yKCk7DQogDQogCXJldHVybiAwOw0KQEAgLTI3MSwxNSArMjgwLDE3IEBACiAvKg0KICAqIGVzdGFibGlzaCBhIGhhcmR3YXJlIHdhdGNocG9pbnQgdXNpbmcgdGhlIGhhcmR3YXJlIGRlYnVnIHJlZ2lzdGVycw0KICAqLw0KLWludCBCcmVha3BvaW50c1NlcnZpY2U6Okluc2VydFdhdGNoKFRCcmVha3BvaW50KiBicEluZm8pIHsNCi0JcmV0dXJuIFdpbkhXQmtwdE1ncjo6U2V0SGFyZHdhcmVCcmVhayhicEluZm8pOw0KK2ludCBCcmVha3BvaW50c1NlcnZpY2U6Okluc2VydFdhdGNoKFRCcmVha3BvaW50KiB3cEluZm8pIHsNCisJcmV0dXJuIHdwSW5mby0+cHJvY2Vzcy0+U2V0V2F0Y2hwb2ludCh3cEluZm8pOw0KIH0NCiANCiAvKg0KICAqIGNsZWFyIHRoZSBoYXJkd2FyZSBkZWJ1ZyByZWdpc3RlciBmb3IgYSBnaXZlbiB3YXRjaHBvaW50DQogICovDQotaW50IEJyZWFrcG9pbnRzU2VydmljZTo6Q2xlYXJXYXRjaChUQnJlYWtwb2ludCogYnBJbmZvKSB7DQotCXJldHVybiBXaW5IV0JrcHRNZ3I6OkNsZWFySGFyZHdhcmVCcmVhayhicEluZm8pOw0KK2ludCBCcmVha3BvaW50c1NlcnZpY2U6OkNsZWFyV2F0Y2goVEJyZWFrcG9pbnQqIHdwSW5mbykgew0KKwlpZiAoIXdwSW5mby0+cHJvY2VzcykNCisJCXJldHVybiAwOwkvLyBwcm9jZXNzIG1heSBoYXZlIGNsZWFuZWQgdXAgYWZ0ZXIgaXRzZWxmIHVwb24gZXhpdA0KKwlyZXR1cm4gd3BJbmZvLT5wcm9jZXNzLT5DbGVhcldhdGNocG9pbnQod3BJbmZvKTsNCiB9DQogDQogLyoNCkBAIC0yOTAsOCArMzAxLDcgQEAKIAlUSUQyQnJlYWtwb2ludE1hcDo6aXRlcmF0b3IgaXRlcjsNCiAJZm9yIChpdGVyID0gc0JyZWFrUG9pbnRNYXAuYmVnaW4oKTsgaXRlciAhPSBzQnJlYWtQb2ludE1hcC5lbmQoKTsgaXRlcisrKSB7DQogCQlUQnJlYWtwb2ludCogYnAgPSBpdGVyLT5zZWNvbmQ7DQotCQlpZiAoQUNDRVNTTU9ERV9FWEVDVVRFID09IGJwLT5hY2Nlc3NNb2RlDQotCQkJJiYgYnAtPnByb2Nlc3MgJiYgcHJvY2Vzc0hhbmRsZSA9PSBicC0+cHJvY2Vzcy0+R2V0UHJvY2Vzc0hhbmRsZSgpCS8vIHNhbWUgcHJvY2Vzcw0KKwkJaWYgKGJwLT5Jc1R5cGVCcmVha3BvaW50KCkgJiYgYnAtPlNhbWVQcm9jZXNzKHByb2Nlc3NIYW5kbGUpDQogCQkJJiYgYWRkcmVzcyA9PSBicC0+YWRkcmVzcykNCiAJCXsNCiAJCQlyZXR1cm4gYnA7DQpAQCAtMzEwLDggKzMyMCw3IEBACiAJVElEMkJyZWFrcG9pbnRNYXA6Oml0ZXJhdG9yIGl0ZXI7DQogCWZvciAoaXRlciA9IHNCcmVha1BvaW50TWFwLmJlZ2luKCk7IGl0ZXIgIT0gc0JyZWFrUG9pbnRNYXAuZW5kKCk7IGl0ZXIrKykgew0KIAkJVEJyZWFrcG9pbnQqIHdwID0gaXRlci0+c2Vjb25kOw0KLQkJaWYgKEFDQ0VTU01PREVfRVhFQ1VURSAhPSB3cC0+YWNjZXNzTW9kZQ0KLQkJCSYmIHdwLT5wcm9jZXNzICYmIHByb2Nlc3NIYW5kbGUgPT0gd3AtPnByb2Nlc3MtPkdldFByb2Nlc3NIYW5kbGUoKQkvLyBzYW1lIHByb2Nlc3MNCisJCWlmICh3cC0+SXNUeXBlV2F0Y2hwb2ludCgpICYmIHdwLT5TYW1lUHJvY2Vzcyhwcm9jZXNzSGFuZGxlKQ0KIAkJCSYmIHdwLT5hZGRyZXNzIDw9IGFkZHJlc3MgJiYgYWRkcmVzcyA8IHdwLT5hZGRyZXNzK3dwLT5zaXplKQ0KIAkJew0KIAkJCXJldHVybiB3cDsNCkBAIC0zMjEsNyArMzMwLDkgQEAKIH0NCiANCiAvKg0KLSAqIEdpdmVuIGEgbWVtb3J5IGJ1ZmZlciByZWFkIGZyb20gYSBwcm9jZXNzLCByZW1vdmUgYW55IGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb25zIGFkZGVkIGJ5IGRlYnVnZ2VyIGluIHRoZSBidWZmZXIuDQorICogR2l2ZW4gYSBtZW1vcnkgYnVmZmVyIHJlYWQgZnJvbSBhIHByb2Nlc3MsIHJlbW92ZSBhbnkgYnJlYWtwb2ludA0KKyAqIGluc3RydWN0aW9ucyBhZGRlZCBieSBkZWJ1Z2dlciBpbiB0aGUgYnVmZmVyLg0KKyAqIEFTU1VNUFRJT046IGNhbGxlciBoYXMgdGVtcG9yYXJpbHkgZGlhYmxlZCBwYWdlLXByb3RlY3Rpb24gaWYgbmVjZXNzYXJ5DQogICovDQogdm9pZCBCcmVha3BvaW50c1NlcnZpY2U6OlJlbW92ZUJyZWFrcG9pbnRzRnJvbU1lbW9yeVJlYWQoDQogCQljb25zdCBIQU5ETEUmIHByb2Nlc3NIYW5kbGUsIENvbnRleHRBZGRyZXNzIGFkZHJlc3MsIGNoYXIqIG1lbUJ1ZmZlciwNCkBAIC0zMjksOCArMzQwLDcgQEAKIAlUSUQyQnJlYWtwb2ludE1hcDo6aXRlcmF0b3IgaXRlcjsNCiAJZm9yIChpdGVyID0gc0JyZWFrUG9pbnRNYXAuYmVnaW4oKTsgaXRlciAhPSBzQnJlYWtQb2ludE1hcC5lbmQoKTsgaXRlcisrKSB7DQogCQlUQnJlYWtwb2ludCogYnAgPSBpdGVyLT5zZWNvbmQ7DQotCQlpZiAoQUNDRVNTTU9ERV9FWEVDVVRFID09IGJwLT5hY2Nlc3NNb2RlDQotCQkJJiYgYnAtPnByb2Nlc3MgJiYgcHJvY2Vzc0hhbmRsZSA9PSBicC0+cHJvY2Vzcy0+R2V0UHJvY2Vzc0hhbmRsZSgpCS8vIHNhbWUgcHJvY2Vzcw0KKwkJaWYgKGJwLT5Jc1R5cGVCcmVha3BvaW50KCkgJiYgYnAtPlNhbWVQcm9jZXNzKHByb2Nlc3NIYW5kbGUpDQogCQkJJiYgYWRkcmVzcyA8PSBicC0+YWRkcmVzcyAmJiBhZGRyZXNzK3NpemUgPiBicC0+YWRkcmVzcykJLy8gYnAgZmFsbHMgaW4gdGhlIGJ1ZmZlcg0KIAkJew0KIAkJCWNoYXIgKmJ5dGVUb0NoYW5nZSA9IG1lbUJ1ZmZlciArIChicC0+YWRkcmVzcyAtIGFkZHJlc3MpOw0KQEAgLTM0MCw3ICszNTAsOSBAQAogfQ0KIA0KIC8qDQotICogR2l2ZW4gYSBtZW1vcnkgYnVmZmVyIHRoYXQgaGFzIGJlZW4gd3JpdGVuIHRvIGEgcHJvY2VzcywgcmUtaW5zc2VydCBhbnkgYnJlYWtwb2ludHMgaW4gdGhlIGJ1ZmZlciByYW5nZS4NCisgKiBHaXZlbiBhIG1lbW9yeSBidWZmZXIgdGhhdCBoYXMgYmVlbiB3cml0ZW4gdG8gYSBwcm9jZXNzLA0KKyAqIHJlLWluc3NlcnQgYW55IGJyZWFrcG9pbnRzIGluIHRoZSBidWZmZXIgcmFuZ2UuDQorICogQVNTVU1QVElPTjogY2FsbGVyIGhhcyB0ZW1wb3JhcmlseSBkaWFibGVkIHBhZ2UtcHJvdGVjdGlvbiBpZiBuZWNlc3NhcnkNCiAgKi8NCiB2b2lkIEJyZWFrcG9pbnRzU2VydmljZTo6UmVJbnNlcnRCcmVha3BvaW50c0FmdGVyTWVtb3J5V3JpdGUoDQogCQljb25zdCBIQU5ETEUmIHByb2Nlc3NIYW5kbGUsIENvbnRleHRBZGRyZXNzIGFkZHJlc3MsIGNoYXIqIG1lbUJ1ZmZlciwNCkBAIC0zNDgsMTEgKzM2MCwyMyBAQAogCVRJRDJCcmVha3BvaW50TWFwOjppdGVyYXRvciBpdGVyOw0KIAlmb3IgKGl0ZXIgPSBzQnJlYWtQb2ludE1hcC5iZWdpbigpOyBpdGVyICE9IHNCcmVha1BvaW50TWFwLmVuZCgpOyBpdGVyKyspIHsNCiAJCVRCcmVha3BvaW50KiBicCA9IGl0ZXItPnNlY29uZDsNCi0JCWlmIChBQ0NFU1NNT0RFX0VYRUNVVEUgPT0gYnAtPmFjY2Vzc01vZGUNCi0JCQkmJiBicC0+cHJvY2VzcyAmJiBwcm9jZXNzSGFuZGxlID09IGJwLT5wcm9jZXNzLT5HZXRQcm9jZXNzSGFuZGxlKCkJLy8gc2FtZSBwcm9jZXNzDQorCQlpZiAoYnAtPklzVHlwZUJyZWFrcG9pbnQoKSAmJiBicC0+U2FtZVByb2Nlc3MocHJvY2Vzc0hhbmRsZSkNCiAJCQkmJiBhZGRyZXNzIDw9IGJwLT5hZGRyZXNzICYmIGFkZHJlc3Mrc2l6ZSA+IGJwLT5hZGRyZXNzKQkvLyBicCBmYWxscyBpbiB0aGUgYnVmZmVyDQogCQl7DQogCQkJSW5zZXJ0QnJlYWsoYnApOw0KIAkJfQ0KIAl9DQogfQ0KKw0KKw0KK2ludCBCcmVha3BvaW50c1NlcnZpY2U6OlJlbW92ZVByb2Nlc3NGcm9tQnJlYWtwb2ludHMoY29uc3QgV2luUHJvY2VzcyogcHJvY2Vzcykgew0KKwlUSUQyQnJlYWtwb2ludE1hcDo6aXRlcmF0b3IgaXRlcjsNCisJZm9yIChpdGVyID0gc0JyZWFrUG9pbnRNYXAuYmVnaW4oKTsgaXRlciAhPSBzQnJlYWtQb2ludE1hcC5lbmQoKTsgaXRlcisrKSB7DQorCQlUQnJlYWtwb2ludComIGJwID0gaXRlci0+c2Vjb25kOw0KKwkJaWYgKGJwICYmIGJwLT5wcm9jZXNzID09IHByb2Nlc3MpIHsNCisJCQlicC0+cHJvY2VzcyA9IE5VTEw7DQorCQkJYnAtPmFnZW50QnJlYWtJRCA9IEFHRU5UX0JSRUFLX1VOU0VUOw0KKwkJfQ0KKwl9DQorCXJldHVybiAwOw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9CcmVha3BvaW50c1NlcnZpY2UuaCBiL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvd2luX2FnZW50L0JyZWFrcG9pbnRzU2VydmljZS5oCmluZGV4IGFkYjM3NDAuLmY1YTRlOGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvd2luX2FnZW50L0JyZWFrcG9pbnRzU2VydmljZS5oCisrKyBiL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvd2luX2FnZW50L0JyZWFrcG9pbnRzU2VydmljZS5oCkBAIC0zNiw4ICszNiw4IEBACiAJQUNDRVNTTU9ERV9DSEFOR0UJPSAweDA4LA0KIH07DQogDQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIEhXQnJlYWtJRDsNCi0jZGVmaW5lIEhXQlJFQUtfTk9UX1NFVCAwDQordHlwZWRlZiBzaG9ydCBBZ2VudEJyZWFrSUQ7CS8vIDMyNzY4IG91Z2h0IHRvIGJlIGVub3VnaCB3YXRjaHBvaW50cw0KKyNkZWZpbmUJQUdFTlRfQlJFQUtfVU5TRVQgKC0xKQ0KIA0KIC8vDQogLy8gVG8gc3RvcmUgdGhlIGJyZWFrcG9pbnQgaW5mbw0KQEAgLTUxLDE3ICs1MSwyNCBAQAogCXVuc2lnbmVkIGNoYXIgb3JpZ2luYWxCeXRlOwkvLyBvcmlnaW5hbCBieXRlIHdoZXJlIHdlIHNldCB0aGUgYnAuDQogCXVuc2lnbmVkIGNoYXIgc2l6ZTsJCQkvLyBmb3Igd2luZG93cy14ODYsIG1heCBpcyB3ZWxsIGJlbG93IDI1NQ0KIA0KLQlUQ0ZCcmVha3BvaW50VHlwZQlicFR5cGU7CS8vIGlnbm9yZWQ7IGFsd2F5cyBzb2Z0d2FyZSBmb3IgYmtwdA0KLQkJCQkJCQkJLy8gYW5kIGFsd2F5cyBoYXJkd2FyZSBmb3Igd2F0Y2hwb2ludA0KKwlUQ0ZCcmVha3BvaW50VHlwZQlyZXF1ZXN0ZWRUeXBlOw0KKwlUQ0ZCcmVha3BvaW50VHlwZQlhY3R1YWxUeXBlOw0KIA0KIAlUQ0ZBY2Nlc3NNb2RlCQlhY2Nlc3NNb2RlOwkvLyBfRVhFQ1VURSBtZWFucyBia3B0OyBvL3cgLT4gd2F0Y2hwb2ludA0KLQlIV0JyZWFrSUQJCQlod0JyZWFrSUQ7DQorCUFnZW50QnJlYWtJRAkJYWdlbnRCcmVha0lEOw0KIA0KIAlUQnJlYWtwb2ludCgpDQogCSAgOiBwcm9jZXNzKE5VTEwpLCBhZGRyZXNzKDApLCBlbmFibGVkKHRydWUpLCBvcmlnaW5hbEJ5dGUoMCksDQotCQlzaXplKDApLCBicFR5cGUodHlwZV9BdXRvKSwgYWNjZXNzTW9kZShBQ0NFU1NNT0RFX1JFQUQpLA0KLQkJaHdCcmVha0lEKEhXQlJFQUtfTk9UX1NFVCkNCisJCXNpemUoMCksIHJlcXVlc3RlZFR5cGUodHlwZV9BdXRvKSwgYWN0dWFsVHlwZSh0eXBlX0F1dG8pLA0KKwkJYWNjZXNzTW9kZShBQ0NFU1NNT0RFX1JFQUQpLCBhZ2VudEJyZWFrSUQoQUdFTlRfQlJFQUtfVU5TRVQpDQogCXt9DQorDQorCWJvb2wgU2FtZVByb2Nlc3MoY29uc3QgSEFORExFJiBwcm9jSCkgY29uc3Q7DQorDQorCWlubGluZSBib29sIElzVHlwZUJyZWFrcG9pbnQoKSBjb25zdA0KKwkJeyByZXR1cm4gQUNDRVNTTU9ERV9FWEVDVVRFID09IGFjY2Vzc01vZGU7IH0NCisJaW5saW5lIGJvb2wgSXNUeXBlV2F0Y2hwb2ludCgpIGNvbnN0DQorCQl7IHJldHVybiBBQ0NFU1NNT0RFX0VYRUNVVEUgIT0gYWNjZXNzTW9kZTsgfQ0KIH07DQogDQogdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVEJyZWFrcG9pbnQqPiBUSUQyQnJlYWtwb2ludE1hcDsNCkBAIC04OSw2ICs5Niw4IEBACiAJc3RhdGljIGludCBJbnNlcnRXYXRjaChUQnJlYWtwb2ludCopOw0KIAlzdGF0aWMgaW50IENsZWFyV2F0Y2goVEJyZWFrcG9pbnQqKTsNCiANCisJc3RhdGljIGludCBSZW1vdmVQcm9jZXNzRnJvbUJyZWFrcG9pbnRzKGNvbnN0IFdpblByb2Nlc3MqKTsNCisNCiAJc3RhdGljIFRCcmVha3BvaW50KiBGaW5kQnJlYWtwb2ludEJ5QWRkcmVzcyhjb25zdCBIQU5ETEUmIHByb2Nlc3NIYW5kbGUsDQogCQkJY29uc3QgQ29udGV4dEFkZHJlc3MpOw0KIAlzdGF0aWMgVEJyZWFrcG9pbnQqIEZpbmRXYXRjaHBvaW50QnlBZGRyZXNzKGNvbnN0IEhBTkRMRSYgcHJvY2Vzc0hhbmRsZSwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9SZXN1bWVDb250ZXh0QWN0aW9uLmNwcCBiL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvd2luX2FnZW50L1Jlc3VtZUNvbnRleHRBY3Rpb24uY3BwCmluZGV4IDQyMWYwOTAuLjY4ZDY1NjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvd2luX2FnZW50L1Jlc3VtZUNvbnRleHRBY3Rpb24uY3BwCisrKyBiL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvd2luX2FnZW50L1Jlc3VtZUNvbnRleHRBY3Rpb24uY3BwCkBAIC0zMiwxNSArMzIsMTYgQEAKIHZvaWQgUmVzdW1lQ29udGV4dEFjdGlvbjo6UnVuKCkgew0KIAkvLyBTaW5nbGUgc3RlcCBvdmVyIGEgYnJlYWtwb2ludCAoaWYgYW55KSBhdCBjdXJyZW50IFBDLg0KIAkvLw0KLQlUQnJlYWtwb2ludCogYnBBdFN0YXJ0QWRkcmVzcyA9IEJyZWFrcG9pbnRzU2VydmljZTo6RmluZEJyZWFrcG9pbnRCeUFkZHJlc3MocHJvY2Vzc18uR2V0UHJvY2Vzc0hhbmRsZSgpLCB0aHJlYWRfLkdldFBDQWRkcmVzcygpKTsNCisJVEJyZWFrcG9pbnQqIGJwQXRTdGFydEFkZHJlc3MNCisJICAgPSBCcmVha3BvaW50c1NlcnZpY2U6OkZpbmRCcmVha3BvaW50QnlBZGRyZXNzKHByb2Nlc3NfLkdldFByb2Nlc3NIYW5kbGUoKSwgdGhyZWFkXy5HZXRQQ0FkZHJlc3MoKSk7DQogCWlmIChicEF0U3RhcnRBZGRyZXNzKSB7DQogCQlCcmVha3BvaW50c1NlcnZpY2U6OkNsZWFyQnJlYWsoYnBBdFN0YXJ0QWRkcmVzcyk7DQogCQl0aHJlYWRfLkVuYWJsZVNpbmdsZVN0ZXAoKTsNCi0JfQ0KLQllbHNlIGlmIChyZXN1bWVNb2RlXyA9PSBSTV9TVEVQX0lOVE8pDQorCX0gZWxzZSBpZiAocmVzdW1lTW9kZV8gPT0gUk1fU1RFUF9JTlRPKQ0KIAkJdGhyZWFkXy5FbmFibGVTaW5nbGVTdGVwKCk7DQogDQotCUNvbnRpbnVlRGVidWdFdmVudChwcm9jZXNzXy5HZXRPU0lEKCksIHRocmVhZF8uR2V0T1NJRCgpLCB0aHJlYWRfLkdldENvbnRpbnVlU3RhdHVzKCkpOw0KKwl0aHJlYWRfLk1hcmtSZXN1bWVkKCk7DQorCTo6Q29udGludWVEZWJ1Z0V2ZW50KHByb2Nlc3NfLkdldE9TSUQoKSwgdGhyZWFkXy5HZXRPU0lEKCksIHRocmVhZF8uR2V0Q29udGludWVTdGF0dXMoKSk7DQogDQogCS8vIG5vdGlmeSBob3N0IHRoZSBSZXN1bWUgYWN0aW9uIGlzIGRvbmUgYmVmb3JlDQogCS8vIGFueSBzdXNwZW5kIGV2ZW50IGlzIHJlcG9ydGVkLg0KQEAgLTQ5LDcgKzUwLDcgQEAKIAlpZiAoYnBBdFN0YXJ0QWRkcmVzcykgew0KIAkJREVCVUdfRVZFTlQgZGVidWdFdmVudDsNCiANCi0JCWlmIChXYWl0Rm9yRGVidWdFdmVudCgmZGVidWdFdmVudCwgMjAwIC8qIG1zICovKSkgew0KKwkJaWYgKDo6V2FpdEZvckRlYnVnRXZlbnQoJmRlYnVnRXZlbnQsIDIwMCAvKiBtcyAqLykpIHsNCiAJCQkvLyBEb25lIGV4ZWN1dGluZyBzaW5nbGUgaW5zdHJ1Y3Rpb24uDQogCQkJQnJlYWtwb2ludHNTZXJ2aWNlOjpJbnNlcnRCcmVhayhicEF0U3RhcnRBZGRyZXNzKTsJLy8gcmVzdG9yZSB0aGUgYnANCiANCkBAIC01NywyMyArNTgsMTggQEAKIAkJCQlpZiAocmVzdW1lTW9kZV8gPT0gUk1fU1RFUF9JTlRPKQ0KIAkJCQkJLy8gc2luZ2xlLXN0ZXAgZG9uZSwgcmVwb3J0IHN1c3BlbmQgZXZlbnQgdG8gaG9zdC4NCiAJCQkJCXByb2Nlc3NfLkdldE1vbml0b3IoKS0+SGFuZGxlRGVidWdFdmVudChkZWJ1Z0V2ZW50KTsNCi0JCQkJZWxzZSB7DQorCQkJCWVsc2UNCiAJCQkJCS8vIG90aGVyIHJlc3VtZSBtb2Rlcw0KIAkJCQkJLy8gSWdub3JlIHRoZSBTSU5HTEVfU1RFUCBldmVudCwgZ28gb24gdG8gUmVzdW1lIGFnYWluDQotCQkJCQlDb250aW51ZURlYnVnRXZlbnQocHJvY2Vzc18uR2V0T1NJRCgpLCB0aHJlYWRfLkdldE9TSUQoKSwgREJHX0NPTlRJTlVFKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQllbHNlIHsNCisJCQkJCTo6Q29udGludWVEZWJ1Z0V2ZW50KHByb2Nlc3NfLkdldE9TSUQoKSwgdGhyZWFkXy5HZXRPU0lEKCksIERCR19DT05USU5VRSk7DQorCQkJfSBlbHNlIHsNCiAJCQkJLy8gT3RoZXIgZXhjZXB0aW9ucw0KIAkJCQkvLyBIYW5kbGUgdGhlIGV2ZW50LCBzYXksIHJlcG9ydCB0byBob3N0Lg0KIAkJCQlwcm9jZXNzXy5HZXRNb25pdG9yKCktPkhhbmRsZURlYnVnRXZlbnQoZGVidWdFdmVudCk7DQogCQkJfQ0KLQkJfQ0KLQkJZWxzZSB7DQorCQl9IGVsc2Ugew0KIAkJCXRyYWNlKExPR19BTFdBWVMsICJGYWlsZWQgdG8gZXhlY3V0ZSBvbmUgaW5zdHJ1Y3Rpb24uIEVycm9yOiAlZCIsIEdldExhc3RFcnJvcigpKTsNCiAJCX0NCiAJfQ0KLQllbHNlIHsNCi0JCS8vIHRoZSBldmVudCBsb29wIG9mIG1vbml0b3IgdGhyZWFkIHdvdWxkIGNhdGNoIGFuZCByZXBvcnQgZXZlbnQuDQotCX0NCisJLy8gZWxzZSB0aGUgZXZlbnQgbG9vcCBvZiBtb25pdG9yIHRocmVhZCB3b3VsZCBjYXRjaCBhbmQgcmVwb3J0IGV2ZW50Lg0KIH0NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9TZXR0aW5nc1NlcnZpY2UuY3BwIGIvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvU2V0dGluZ3NTZXJ2aWNlLmNwcAppbmRleCAwZWM3YjUxLi4wYTY4MmFkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9TZXR0aW5nc1NlcnZpY2UuY3BwCisrKyBiL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvd2luX2FnZW50L1NldHRpbmdzU2VydmljZS5jcHAKQEAgLTIxMyw5ICsyMTMsOSBAQAogCXJldHVybiBlbmFibGVEZWJ1Z1N0cmluZ0xvZ2dpbmc7DQogfQ0KIA0KLWJvb2wgU2V0dGluZ3NTZXJ2aWNlOjpyZXBvcnRFeGNlcHRpb25FdmVudChjb25zdCBERUJVR19FVkVOVCYgZGVidWdFdmVudCkNCitib29sIFNldHRpbmdzU2VydmljZTo6cmVwb3J0RXhjZXB0aW9uRXZlbnQoY29uc3QgRVhDRVBUSU9OX0RFQlVHX0lORk8mIGV4Y0luZm8pDQogew0KLQlzd2l0Y2ggKGRlYnVnRXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkNvZGUpIHsNCisJc3dpdGNoIChleGNJbmZvLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25Db2RlKSB7DQogDQogCS8vIGFzIGEgZGVidWdnZXIgd2UgYWx3YXlzIHJlcG9ydCB0aGVzZQ0KIAljYXNlIEVYQ0VQVElPTl9TSU5HTEVfU1RFUDoNCkBAIC0yODIsOCArMjgyLDkgQEAKIAkJLy8gaXQncyBub3Qgb25lIG9mIHRoZSB0eXBpY2FsIGV4Y2VwdGlvbnMgYW5kIHdlIGhhdmUgbm8gc2V0dGluZyBmb3IgaXQuDQogCQkvLyBpZiBpdCdzIGZpcnN0IGNoYW5jZSwgZG9uJ3QgcmVwb3J0IGl0LiAgZ2l2ZSBpdCBiYWNrIGZvciB0aGUgcHJvY2Vzcy9vcw0KIAkJLy8gdG8gaGFuZGxlLiAgb3RoZXJ3aXNlIHdlJ2xsIHJlcG9ydCBpdCB0byB0aGUgZGVidWdnZXIuDQotCSAgICB0cmFjZShMT0dfQUxXQVlTLCAiXHQgLS0gZmlyc3QgY2hhbmNlOiVkLCBmbGFnczolZCIsIGRlYnVnRXZlbnQudS5FeGNlcHRpb24uZHdGaXJzdENoYW5jZSwgZGVidWdFdmVudC51LkV4Y2VwdGlvbi5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uRmxhZ3MpOw0KLQkJaWYgKGRlYnVnRXZlbnQudS5FeGNlcHRpb24uZHdGaXJzdENoYW5jZSkNCisJICAgIHRyYWNlKExPR19BTFdBWVMsICJcdCAtLSBmaXJzdCBjaGFuY2U6JWQsIGZsYWdzOjB4OC44JXgiLA0KKwkgICAgCSAgZXhjSW5mby5kd0ZpcnN0Q2hhbmNlLCBleGNJbmZvLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25GbGFncyk7DQorCQlpZiAoZXhjSW5mby5kd0ZpcnN0Q2hhbmNlKQ0KIAkJCXJldHVybiBmYWxzZTsNCiAJfQ0KIA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvd2luX2FnZW50L1NldHRpbmdzU2VydmljZS5oIGIvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvU2V0dGluZ3NTZXJ2aWNlLmgKaW5kZXggMTUxZGNjYi4uZTgwNTY4YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvU2V0dGluZ3NTZXJ2aWNlLmgKKysrIGIvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvU2V0dGluZ3NTZXJ2aWNlLmgKQEAgLTM2LDYgKzM2LDYgQEAKIA0KIAlzdGF0aWMgYm9vbCByZXBvcnREZWJ1Z0V2ZW50Rm9yTW9kdWxlKHN0ZDo6c3RyaW5nIG1vZHVsZSk7DQogCXN0YXRpYyBib29sIHJlcG9ydERlYnVnU3RyaW5nRXZlbnRzKCk7DQotCXN0YXRpYyBib29sIHJlcG9ydEV4Y2VwdGlvbkV2ZW50KGNvbnN0IERFQlVHX0VWRU5UJiBkZWJ1Z0V2ZW50KTsNCisJc3RhdGljIGJvb2wgcmVwb3J0RXhjZXB0aW9uRXZlbnQoY29uc3QgRVhDRVBUSU9OX0RFQlVHX0lORk8mKTsNCiAJc3RhdGljIHZvaWQgZGVidWdTZXNzaW9uRW5kcygpOw0KIH07DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvV2luRGVidWdNb25pdG9yLmNwcCBiL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvd2luX2FnZW50L1dpbkRlYnVnTW9uaXRvci5jcHAKaW5kZXggMTM3OWIzNS4uMzJjNjNkMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvV2luRGVidWdNb25pdG9yLmNwcAorKysgYi9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9XaW5EZWJ1Z01vbml0b3IuY3BwCkBAIC01MzcsMTQgKzUzNywxMiBAQAogDQogdm9pZCBXaW5EZWJ1Z01vbml0b3I6OkhhbmRsZUV4Y2VwdGlvbkV2ZW50KERFQlVHX0VWRU5UJiBkZWJ1Z0V2ZW50KQ0KIHsNCi0JRVhDRVBUSU9OX1JFQ09SRCAmZSA9IGRlYnVnRXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9uUmVjb3JkOw0KKwljb25zdCBFWENFUFRJT05fREVCVUdfSU5GTyYgZXhjSW5mbyA9IGRlYnVnRXZlbnQudS5FeGNlcHRpb247DQorCWNvbnN0IEVYQ0VQVElPTl9SRUNPUkQmIGUgPSBleGNJbmZvLkV4Y2VwdGlvblJlY29yZDsNCisJY29uc3QgRFdPUkQmIGV4Y0NvZGUgPSBlLkV4Y2VwdGlvbkNvZGU7DQogCUxvZ1RyYWNlKCJEZWJ1Z1Byb2Nlc3NNb25pdG9yOjpIYW5kbGVFeGNlcHRpb25FdmVudCIsICJFeGNlcHRpb24gaW4gdGhyZWFkICVkIGF0IDB4JXg6IGNvZGUgMHgleCAoJXMpIiwNCiAJCQlkZWJ1Z0V2ZW50LmR3VGhyZWFkSWQsIGUuRXhjZXB0aW9uQWRkcmVzcywgZS5FeGNlcHRpb25Db2RlLA0KLQkJCUdldERlYnVnRXhjZXB0aW9uRGVzY3JpcHRpb24oZGVidWdFdmVudC51LkV4Y2VwdGlvbikuY19zdHIoKSk7DQotDQotICAgIFdpblRocmVhZCogdGhyZWFkID0gV2luVGhyZWFkOjpHZXRUaHJlYWRCeUlEKGRlYnVnRXZlbnQuZHdQcm9jZXNzSWQsIGRlYnVnRXZlbnQuZHdUaHJlYWRJZCk7DQotCWlmICghdGhyZWFkKQ0KLQkJYXNzZXJ0KGZhbHNlKTsNCisJCQlHZXREZWJ1Z0V4Y2VwdGlvbkRlc2NyaXB0aW9uKGV4Y0luZm8pLmNfc3RyKCkpOw0KIA0KIAkvLyBpZ25vcmUgaW5pdGlhbCBicmVha3BvaW50IGluIE5URExMIURiZ0JyZWFrUG9pbnQgZm9yIG5ld2x5IGxhdW5jaGVkIHByb2Nlc3MgaWYgbmVjZXNzYXJ5DQogCWlmICghaGFuZGxlZEluaXRpYWxEZWJ1Z0JyZWFrcG9pbnQgJiYgZS5FeGNlcHRpb25Db2RlID09IEVYQ0VQVElPTl9CUkVBS1BPSU5UKQ0KQEAgLTU1NywxMiArNTU1LDM4IEBACiAJCXJldHVybjsNCiAJfQ0KIA0KLQlpZiAodGhyZWFkICYmIFNldHRpbmdzU2VydmljZTo6cmVwb3J0RXhjZXB0aW9uRXZlbnQoZGVidWdFdmVudCkpDQorCWJvb2wgcG90ZW50aWFsUHJvdGVjdGVkUGFnZSA9IGV4Y0NvZGUgPT0gRVhDRVBUSU9OX0FDQ0VTU19WSU9MQVRJT047DQorCWJvb2wgcmVwb3J0RXhjZXB0aW9uID0gU2V0dGluZ3NTZXJ2aWNlOjpyZXBvcnRFeGNlcHRpb25FdmVudChleGNJbmZvKTsNCisJYm9vbCBoYW5kbGVkID0gZmFsc2U7DQorCWlmIChyZXBvcnRFeGNlcHRpb24gfHwgcG90ZW50aWFsUHJvdGVjdGVkUGFnZSkNCiAJew0KLQkgICAgdHJhY2UoTE9HX0FMV0FZUywgIlx0IC0tIHJlcG9ydGVkIHRvIGhvc3QgZGVidWdnZXIuIik7DQotCQl0aHJlYWQtPkhhbmRsZUV4Y2VwdGlvbihkZWJ1Z0V2ZW50KTsNCisJCS8vIHdhaXQgdG8gc2VhcmNoIGZvciBhIHRocmVhZEJ5SUQgdW50aWwgbmVjZXNzYXJ5DQorCQlXaW5UaHJlYWQqIHRocmVhZCA9IFdpblRocmVhZDo6R2V0VGhyZWFkQnlJRChkZWJ1Z0V2ZW50LmR3UHJvY2Vzc0lkLCBkZWJ1Z0V2ZW50LmR3VGhyZWFkSWQpOw0KKwkJaWYgKCF0aHJlYWQpDQorCQkJYXNzZXJ0KGZhbHNlKTsNCisNCisJCWlmICh0aHJlYWQgJiYgcG90ZW50aWFsUHJvdGVjdGVkUGFnZSkNCisJCXsNCisJCQl0cmFjZShMT0dfQUxXQVlTLCAiXHQgLS0gY2hlY2tpbmcgcG90ZW50aWFsIHByb3RlY3RlZCBwYWdlLiIpOw0KKwkJCWhhbmRsZWQgPSB0aHJlYWQtPkhhbmRsZVBvdGVudGlhbFByb3RjdGVkUGFnZShkZWJ1Z0V2ZW50KTsNCisJCX0NCisNCisJCWlmICh0aHJlYWQgJiYgIWhhbmRsZWQpDQorCQl7DQorCQkJaWYgKHJlcG9ydEV4Y2VwdGlvbikNCisJCQl7DQorCQkJCXRyYWNlKExPR19BTFdBWVMsICJcdCAtLSByZXBvcnRlZCB0byBob3N0IGRlYnVnZ2VyLiIpOw0KKwkJCQl0aHJlYWQtPkhhbmRsZUV4Y2VwdGlvbihkZWJ1Z0V2ZW50KTsNCisJCQkJaGFuZGxlZCA9IHRydWU7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCXRocmVhZC0+TWFya1Jlc3VtZWQoKTsNCisJCQl9DQorCQl9DQogCX0NCi0JZWxzZQ0KKw0KKwlpZiAoIWhhbmRsZWQpDQogCXsNCiAJCXRyYWNlKExPR19BTFdBWVMsICJcdCAtLSBpZ25vcmVkLiIpOw0KIAkJLy8gTm90ZSBEQkdfRVhDRVBUSU9OX05PVF9IQU5ETEVEIGlzIHVzZWQgaGVyZS4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9XaW5IV0JrcHRNZ3IuY3BwIGIvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvV2luSFdCa3B0TWdyLmNwcAppbmRleCA3NGY3MGQ0Li4zYzNlN2IxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9XaW5IV0JrcHRNZ3IuY3BwCisrKyBiL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvd2luX2FnZW50L1dpbkhXQmtwdE1nci5jcHAKQEAgLTY0LDE4ICs2NCwxNCBAQAogI2luY2x1ZGUgIldpblByb2Nlc3MuaCINCiAjaW5jbHVkZSAiV2luVGhyZWFkLmgiDQogDQotc3RhdGljIGNvbnN0IFdpbkhXQmtwdE1ncjo6TW9kZQ0KLSAgc0RSN01vZGVCaXRzTWFwWzldDQotCT0geyBXaW5IV0JrcHRNZ3I6OmludmFsaWQsDQotCQlXaW5IV0JrcHRNZ3I6OmludmFsaWQsDQotCQlXaW5IV0JrcHRNZ3I6OndyaXRlLA0KLQkJV2luSFdCa3B0TWdyOjpyZWFkd3JpdGUsDQotCQlXaW5IV0JrcHRNZ3I6OmV4ZWN1dGUsDQotCQlXaW5IV0JrcHRNZ3I6OmludmFsaWQsDQotCQlXaW5IV0JrcHRNZ3I6OmludmFsaWQsDQotCQlXaW5IV0JrcHRNZ3I6OmludmFsaWQsDQotCQlXaW5IV0JrcHRNZ3I6OmludmFsaWQNCi0JICB9Ow0KK2lubGluZQ0KK1dpbkhXQmtwdE1ncjo6TW9kZSBXaW5IV0JrcHRNZ3I6OnNEUjdNb2RlQml0c01hcCh1bnNpZ25lZCBjaGFyIGkpIHsNCitzdGF0aWMgY29uc3QgTW9kZSBtYXBbOV0NCisgID0geyBpbnZhbGlkLCBpbnZhbGlkLCB3cml0ZSwgcmVhZHdyaXRlLCBleGVjdXRlLA0KKwkJICAJICAgaW52YWxpZCwgaW52YWxpZCwgaW52YWxpZCwgaW52YWxpZA0KKyAgICB9Ow0KKwlyZXR1cm4gbWFwW2ldOw0KK30NCiANCiAvLyBpbnZhbGlkIGJpdHMgaW4gdGhlIGZvbGxvd2luZyAyIG1hc2tzDQogI2RlZmluZSBYRkYgMHhGRg0KQEAgLTk2LDkgKzkyLDEyIEBACiAjZGVmaW5lIFNCNCAweDBDDQogI2RlZmluZSBTQjggMHgwOA0KIA0KLXN0YXRpYyBjb25zdCBXaW5IV0JrcHRNZ3I6OlNpemVCaXRzDQotICBzRFI3U2l6ZUJpdHNNYXBbOV0NCi0JPSB7WEZGLCBTQjEsIFNCMiwgWEZGLCBTQjQsIFhGRiwgWEZGLCBYRkYsIFNCOH07DQoraW5saW5lDQorV2luSFdCa3B0TWdyOjpTaXplQml0cyBXaW5IV0JrcHRNZ3I6OnNEUjdTaXplQml0c01hcCh1bnNpZ25lZCBjaGFyIGkpIHsNCitzdGF0aWMgY29uc3QgV2luSFdCa3B0TWdyOjpTaXplQml0cyBtYXBbOV0NCisgID0ge1hGRiwgU0IxLCBTQjIsIFhGRiwgU0I0LCBYRkYsIFhGRiwgWEZGLCBTQjh9Ow0KKwlyZXR1cm4gbWFwW2ldOw0KK30NCiANCiAvKg0KICAqIHRoZSBmb2xsb3dpbmcgdGFibGUgcmVwcmVzZW50cyBhIG1hcHBpbmcgb2YNCkBAIC0xNTgsOCArMTU3LDkgQEAKIAkJeyAgNCxYRkYsWEZGLFhGRixYRkYsWEZGLFhGRixYRkZ9LAkvLyAzMg0KIAkgIH07DQogDQotV2luSFdCa3B0TWdyOjpEUk1hc2sgV2luSFdCa3B0TWdyOjppblVzZSA9IDA7DQotV2luSFdCa3B0TWdyOjpIV0JyZWFrSW5mbyBXaW5IV0JrcHRNZ3I6Omh3QmtwdFs0XTsNCitXaW5IV0JrcHRNZ3I6OldpbkhXQmtwdE1ncigpIHsNCisJaW5Vc2UgPSAwOw0KK30NCiANCiB1bnNpZ25lZCBjaGFyIFdpbkhXQmtwdE1ncjo6SW5Vc2VDb3VudCgpIHsNCiAJcmV0dXJuIChEUjAgJiBpblVzZSkNCkBAIC0xOTgsNiArMTk4LDEyIEBACiAJCXJldHVybiBFUlJfSFdCUktfTk9UX1NFVDsNCiAJfQ0KIA0KKwlpZiAoYnAtPmFjY2Vzc01vZGUgPiBBQ0NFU1NNT0RFX0NIQU5HRSkNCisJCXJldHVybiBFUlJfSFdCUktfSU5WQUxJRF9NT0RFOw0KKwlNb2RlIGh3TW9kZSA9IHNEUjdNb2RlQml0c01hcChicC0+YWNjZXNzTW9kZSk7DQorCWlmIChod01vZGUgPT0gaW52YWxpZCkNCisJCXJldHVybiBFUlJfSFdCUktfSU5WQUxJRF9NT0RFOw0KKw0KIAl1bnNpZ25lZCBjaGFyIGxvY1NpemUgPSBicC0+c2l6ZTsNCiAJaWYgKGxvY1NpemUgPiAzMikNCiAJCXJldHVybiBFUlJfSFdCUktfSU5WQUxJRF9TSVpFOw0KQEAgLTIxMiw5ICsyMTgsMTAgQEAKIAkJcmV0dXJuIEVSUl9IV0JSS19OT19SRVNPVVJDRVM7DQogDQogCXVuc2lnbmVkIGNoYXIgd3AgPSBHZXRVbnVzZWRXYXRjaHBvaW50KCk7DQotCWh3QmtwdFt3cF0uYWRkcmVzcyA9IGxvY0FkZHI7DQotCWh3QmtwdFt3cF0uc2l6ZSA9IGxvY1NpemU7DQotCWh3QmtwdFt3cF0uYWNjZXNzTW9kZSA9IHNEUjdNb2RlQml0c01hcFticC0+YWNjZXNzTW9kZV07DQorCWlmICh3cCA9PSBYRkYpCS8vIHNob3VsZG4ndCBoYXBwZW4gd2l0aCBpblVzZSBjaGVjayBhYm92ZQ0KKwkJcmV0dXJuIEVSUl9IV0JSS19OT19SRVNPVVJDRVM7DQorCWh3QmtwdFt3cF0udGNmQnAgPSBicDsNCisJaHdCa3B0W3dwXS5hY2Nlc3NNb2RlID0gaHdNb2RlOw0KIAlmb3IgKDtyZXFkUmVncyA+IDA7LS1yZXFkUmVncykgew0KIAkJRFJNYXNrIGRyID0gVXNlVW51c2VkUmVnaXN0ZXIoKTsNCiAJCWh3QmtwdFt3cF0uaW5Vc2UgfD0gZHI7DQpAQCAtMjMxLDcgKzIzOCw3IEBACiAJCX0NCiANCiAJCS8vIHRoZXNlIGFyZSBzaGlmdGVkIGluc2lkZSBiYXNlZCBvbiB0aGUgcmVnIHVzZWQNCi0JCURSRmxhZ3MgZHI3Yml0cyA9IHNEUjdTaXplQml0c01hcFtkclN6XSB8IGh3QmtwdFt3cF0uYWNjZXNzTW9kZTsNCisJCURSRmxhZ3MgZHI3Yml0cyA9IHNEUjdTaXplQml0c01hcChkclN6KSB8IGh3QmtwdFt3cF0uYWNjZXNzTW9kZTsNCiANCiAJCWJwLT5wcm9jZXNzLT5TZXREZWJ1Z1JlZ2lzdGVyKGRyLCBsb2NBZGRyLCBkcjdiaXRzKTsNCiANCkBAIC0yMzksMTQgKzI0NiwxNiBAQAogCQlsb2NTaXplIC09IGRyU3o7DQogCX0NCiANCi0JYnAtPmh3QnJlYWtJRCA9IHdwOw0KKwlicC0+YWdlbnRCcmVha0lEID0gd3A7DQogCXJldHVybiAwOw0KIH0NCiANCiBpbnQgV2luSFdCa3B0TWdyOjpDbGVhckhhcmR3YXJlQnJlYWsoVEJyZWFrcG9pbnQqIGJwKSB7DQogCWlmICghYnAtPnByb2Nlc3MpDQogCQlyZXR1cm4gRVJSX0lOVl9DT05URVhUOw0KLQl1bnNpZ25lZCBjaGFyJiB3cCA9IGJwLT5od0JyZWFrSUQ7DQorCUFnZW50QnJlYWtJRCYgd3AgPSBicC0+YWdlbnRCcmVha0lEOw0KKwlpZiAod3AgPT0gQUdFTlRfQlJFQUtfVU5TRVQpDQorCQlyZXR1cm4gRVJSX0hXQlJLX05PVF9TRVQ7DQogCWZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0hXQlA7ICsraSkgew0KIAkJRFJNYXNrIGRyID0gMSA8PCBpOw0KIAkJaWYgKGh3QmtwdFt3cF0uaW5Vc2UgJiBkcikgew0KQEAgLTI1NSw3ICsyNjQsOSBAQAogCQl9DQogCX0NCiANCisJaHdCa3B0W3dwXS50Y2ZCcCA9IE5VTEw7DQorCWh3QmtwdFt3cF0uaW5Vc2UgPSAwOw0KIAlicC0+cHJvY2VzcyA9IE5VTEw7DQotCXdwID0gMDsNCisJd3AgPSBBR0VOVF9CUkVBS19VTlNFVDsNCiAJcmV0dXJuIDA7DQogfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvd2luX2FnZW50L1dpbkhXQmtwdE1nci5oIGIvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvV2luSFdCa3B0TWdyLmgKaW5kZXggZWVlODM5ZS4uOTMwZjMwMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvV2luSFdCa3B0TWdyLmgKKysrIGIvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvV2luSFdCa3B0TWdyLmgKQEAgLTY1LDQyICs2NSw0NCBAQAogc3RydWN0IFRCcmVha3BvaW50Ow0KIA0KIGNsYXNzIFdpbkhXQmtwdE1nciB7DQotICBwdWJsaWM6DQorDQorCWZyaWVuZCBjbGFzcyBXaW5Qcm9jZXNzOw0KKwlmcmllbmQgY2xhc3MgV2luVGhyZWFkOw0KKw0KKwkJV2luSFdCa3B0TWdyKCk7DQogDQogCXR5cGVkZWYgdW5zaWduZWQgY2hhciBEUk1hc2s7DQogCXR5cGVkZWYgdW5zaWduZWQgY2hhciBEUkZsYWdzOw0KIA0KLQlzdGF0aWMgaW50IFNldEhhcmR3YXJlQnJlYWsoVEJyZWFrcG9pbnQqKTsNCi0Jc3RhdGljIGludCBDbGVhckhhcmR3YXJlQnJlYWsoVEJyZWFrcG9pbnQqKTsNCi0NCi0gIHB1YmxpYzogLy8gd291bGQgbGlrZSB0aGVzZSB0byBiZSBwcml2YXRlLCBidXQgc3RhdGljIGluaXRpYWxpemVycyByZXF1aXJlIG90aGVyd2lzZQ0KKwlpbnQgU2V0SGFyZHdhcmVCcmVhayhUQnJlYWtwb2ludCopOw0KKwlpbnQgQ2xlYXJIYXJkd2FyZUJyZWFrKFRCcmVha3BvaW50Kik7DQogDQogCXR5cGVkZWYgdW5zaWduZWQgY2hhciBNb2RlOw0KIAl0eXBlZGVmIHVuc2lnbmVkIGNoYXIgU2l6ZUJpdHM7DQogDQotCXN0YXRpYyBjb25zdCBNb2RlIGV4ZWN1dGUJCT0gMHgwMDsNCisJc3RhdGljIGNvbnN0IE1vZGUgZXhlY3V0ZQk9IDB4MDA7DQogCXN0YXRpYyBjb25zdCBNb2RlIHdyaXRlCQk9IDB4MDE7DQogCS8vCTB4MDIgaXMgZGVmaW5lZCB0byBtZWFuIGJyZWFrIG9uIEkvTyByZWFkL3dyaXRlLCB1bnN1cHBvcnRlZA0KIAlzdGF0aWMgY29uc3QgTW9kZSByZWFkd3JpdGUJPSAweDAzOw0KLQlzdGF0aWMgY29uc3QgTW9kZSBpbnZhbGlkCQk9IDB4MDQ7DQorCXN0YXRpYyBjb25zdCBNb2RlIGludmFsaWQJPSAweDA0Ow0KIA0KLSAgcHJpdmF0ZToNCi0NCi0JdHlwZWRlZiBzdHJ1Y3Qgew0KLQkJQ29udGV4dEFkZHJlc3MJYWRkcmVzczsJLy8gYWRkcmVzcyBvZiB0aGUgZnVsbCBIVyBicmVhaw0KKwlzdHJ1Y3QgSFdCcmVha0luZm8gew0KKwkJVEJyZWFrcG9pbnQqCXRjZkJwOw0KIAkJRFJNYXNrCQkJaW5Vc2U7CQkvLyBtYXNrIG9mIHRoZSByZWdzIHVzZWQgZm9yIHRoaXMgaHctYnJlYWsNCiAJCU1vZGUJCQlhY2Nlc3NNb2RlOwkvLyBhY2Nlc3NNb2RlIHRvIHVzZSBmb3IgYWxsIHJlZ3MgdXNlZA0KLQkJdW5zaWduZWQgY2hhcglzaXplOwkJLy8gY29tYmluZWQgc2l6ZSBvZiBIVyBicmVha3MgaW4gYml0cyBvZiBhbGwgRFJlZ3MNCi0JfSBIV0JyZWFrSW5mbzsNCisJCUhXQnJlYWtJbmZvKCkgOiB0Y2ZCcChOVUxMKSwgaW5Vc2UoMCkge30NCisJfTsNCiANCi0Jc3RhdGljIERSTWFzawkJCWluVXNlOw0KLQlzdGF0aWMgdW5zaWduZWQgY2hhcglJblVzZUNvdW50KCk7DQotCXN0YXRpYyB1bnNpZ25lZCBjaGFyCVVudXNlZENvdW50KCk7DQotCXN0YXRpYyBEUk1hc2sJCQlVc2VVbnVzZWRSZWdpc3RlcigpOw0KKwlEUk1hc2sJCQlpblVzZTsNCisJdW5zaWduZWQgY2hhcglJblVzZUNvdW50KCk7DQorCXVuc2lnbmVkIGNoYXIJVW51c2VkQ291bnQoKTsNCisJRFJNYXNrCQkJVXNlVW51c2VkUmVnaXN0ZXIoKTsNCiANCisJSFdCcmVha0luZm8JCWh3QmtwdFtNQVhfSFdCUF07DQorCXVuc2lnbmVkIGNoYXIJR2V0VW51c2VkV2F0Y2hwb2ludCgpOw0KIA0KLQlzdGF0aWMgSFdCcmVha0luZm8JCWh3QmtwdFtNQVhfSFdCUF07DQotCXN0YXRpYyB1bnNpZ25lZCBjaGFyCUdldFVudXNlZFdhdGNocG9pbnQoKTsNCisJc3RhdGljIE1vZGUJCXNEUjdNb2RlQml0c01hcCh1bnNpZ25lZCBjaGFyIGkpOw0KKwlzdGF0aWMgU2l6ZUJpdHMJc0RSN1NpemVCaXRzTWFwKHVuc2lnbmVkIGNoYXIgaSk7DQogfTsNCiANCiAjZW5kaWYgLyogV0lOSFdCS1BUTUdSX0hfICovDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvV2luUHJvY2Vzcy5jcHAgYi9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9XaW5Qcm9jZXNzLmNwcAppbmRleCBmZTA4MmRlLi5mZWVhZTA5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9XaW5Qcm9jZXNzLmNwcAorKysgYi9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9XaW5Qcm9jZXNzLmNwcApAQCAtNzUsNiArNzUsNyBAQAogfQ0KIA0KIFdpblByb2Nlc3M6On5XaW5Qcm9jZXNzKHZvaWQpIHsNCisJQnJlYWtwb2ludHNTZXJ2aWNlOjpSZW1vdmVQcm9jZXNzRnJvbUJyZWFrcG9pbnRzKHRoaXMpOw0KIA0KIAlwcm9jZXNzSURNYXAuZXJhc2UoR2V0T1NJRCgpKTsNCiANCkBAIC05Niw4ICs5NywxMSBAQAogCXJldHVybiBpdGVyLT5zZWNvbmQ7DQogfQ0KIA0KLWludCBXaW5Qcm9jZXNzOjpSZWFkTWVtb3J5KGNvbnN0IFJlYWRXcml0ZU1lbW9yeVBhcmFtcyYgcGFyYW1zKSB0aHJvdyAoQWdlbnRFeGNlcHRpb24pIHsNCi0JaW50IHJlc3VsdCA9IDA7DQoraW50IFdpblByb2Nlc3M6OlJlYWRNZW1vcnkoY29uc3QgUmVhZFdyaXRlTWVtb3J5UGFyYW1zJiBwYXJhbXMpDQorCQl0aHJvdyAoQWdlbnRFeGNlcHRpb24pIHsNCisJaW50IHJlc3VsdCA9IGh3UGFnZVByb3RNZ3IuRGlzYWJsZUZvclBhZ2VzQ29udGFpbmluZ0FkZHJlc3MoDQorCQkJCSAgIHByb2Nlc3NIYW5kbGVfLCBwYXJhbXMuYWRkcmVzcywgcGFyYW1zLnNpemUsIFBBR0VfUkVBRE9OTFkpOw0KKwlib29sIHJlcHJvdGVjdCA9IChFUlJfUEdQUk9fTk9fQUREUiAhPSByZXN1bHQpOw0KIA0KIAlCT09MIHN1Y2Nlc3MNCiAJICA9IDo6UmVhZFByb2Nlc3NNZW1vcnkocHJvY2Vzc0hhbmRsZV8sIChMUENWT0lEKSBwYXJhbXMuYWRkcmVzcywNCkBAIC0xMDUsMjIgKzEwOSwzNyBAQAogCWlmICghc3VjY2VzcykNCiAJCXJlc3VsdCA9IDo6R2V0TGFzdEVycm9yKCk7DQogCWVsc2UNCi0JCUJyZWFrcG9pbnRzU2VydmljZTo6UmVtb3ZlQnJlYWtwb2ludHNGcm9tTWVtb3J5UmVhZChwcm9jZXNzSGFuZGxlXywgcGFyYW1zLmFkZHJlc3MsIHBhcmFtcy5tZW1CdWZmZXIsIHBhcmFtcy5zaXplKTsNCisJCUJyZWFrcG9pbnRzU2VydmljZTo6UmVtb3ZlQnJlYWtwb2ludHNGcm9tTWVtb3J5UmVhZChwcm9jZXNzSGFuZGxlXywNCisJCQkJcGFyYW1zLmFkZHJlc3MsIHBhcmFtcy5tZW1CdWZmZXIsIHBhcmFtcy5zaXplKSwNCisJCXJlc3VsdCA9IDA7DQorDQorCWlmIChyZXByb3RlY3QpDQorCQlod1BhZ2VQcm90TWdyLkVuYWJsZUZvclBhZ2VzQ29udGFpbmluZ0FkZHJlc3MocHJvY2Vzc0hhbmRsZV8sDQorCQkJCXBhcmFtcy5hZGRyZXNzLCBwYXJhbXMuc2l6ZSwgUEFHRV9SRUFET05MWSk7DQogDQogCXJldHVybiByZXN1bHQ7DQogfQ0KIA0KLWludCBXaW5Qcm9jZXNzOjpXcml0ZU1lbW9yeShjb25zdCBSZWFkV3JpdGVNZW1vcnlQYXJhbXMmIHBhcmFtcykgdGhyb3cgKEFnZW50RXhjZXB0aW9uKSB7DQotCWludCByZXN1bHQgPSAwOw0KK2ludCBXaW5Qcm9jZXNzOjpXcml0ZU1lbW9yeShjb25zdCBSZWFkV3JpdGVNZW1vcnlQYXJhbXMmIHBhcmFtcykNCisJCXRocm93IChBZ2VudEV4Y2VwdGlvbikgew0KKwlpbnQgcmVzdWx0ID0gaHdQYWdlUHJvdE1nci5EaXNhYmxlRm9yUGFnZXNDb250YWluaW5nQWRkcmVzcygNCisJCQkJCXByb2Nlc3NIYW5kbGVfLCBwYXJhbXMuYWRkcmVzcywgcGFyYW1zLnNpemUpOw0KKwlib29sIHJlcHJvdGVjdCA9IChFUlJfUEdQUk9fTk9fQUREUiAhPSByZXN1bHQpOw0KIA0KIAlCT09MIHN1Y2Nlc3MNCiAJICA9IDo6V3JpdGVQcm9jZXNzTWVtb3J5KHByb2Nlc3NIYW5kbGVfLCAoTFBWT0lEKSBwYXJhbXMuYWRkcmVzcywNCiAJCQkgIAkgIAkgIAkgIAkgcGFyYW1zLm1lbUJ1ZmZlciwgcGFyYW1zLnNpemUsIHBhcmFtcy5zaXplVHJhbnNmZXJyZWQpOw0KIAlpZiAoIXN1Y2Nlc3MpDQogCQlyZXN1bHQgPSA6OkdldExhc3RFcnJvcigpOw0KLQllbHNlIHsNCi0JCUJyZWFrcG9pbnRzU2VydmljZTo6UmVJbnNlcnRCcmVha3BvaW50c0FmdGVyTWVtb3J5V3JpdGUocHJvY2Vzc0hhbmRsZV8sIHBhcmFtcy5hZGRyZXNzLCBwYXJhbXMubWVtQnVmZmVyLCBwYXJhbXMuc2l6ZSk7DQotCX0NCisJZWxzZQ0KKwkJQnJlYWtwb2ludHNTZXJ2aWNlOjpSZUluc2VydEJyZWFrcG9pbnRzQWZ0ZXJNZW1vcnlXcml0ZSgNCisJCQkJcHJvY2Vzc0hhbmRsZV8sIHBhcmFtcy5hZGRyZXNzLCBwYXJhbXMubWVtQnVmZmVyLCBwYXJhbXMuc2l6ZSksDQorCQlyZXN1bHQgPSAwOw0KKw0KKwlpZiAocmVwcm90ZWN0KQ0KKwkJaHdQYWdlUHJvdE1nci5FbmFibGVGb3JQYWdlc0NvbnRhaW5pbmdBZGRyZXNzKHByb2Nlc3NIYW5kbGVfLA0KKwkJCQlwYXJhbXMuYWRkcmVzcywgcGFyYW1zLnNpemUpOw0KKw0KIAlyZXR1cm4gcmVzdWx0Ow0KIH0NCiANCkBAIC0xNDUsNiArMTY0LDM0IEBACiAJcmV0dXJuIGV4ZWN1dGFibGVzQnlBZGRyZXNzXzsNCiB9DQogDQoraW50IFdpblByb2Nlc3M6OlNldFdhdGNocG9pbnQoVEJyZWFrcG9pbnQqIHdwKSB7DQorCWludCBlcnIgPSBFUlJfT1RIRVI7DQorCWlmICh3cC0+cmVxdWVzdGVkVHlwZSAhPSB0eXBlX1NvZnR3YXJlCQkvLyBpLmUuIHVzZXItZm9yY2VkIHNvZnRhcmUgdHlwZQ0KKwkJJiYgd3AtPmFjY2Vzc01vZGUgIT0gQUNDRVNTTU9ERV9SRUFEKQkvLyBjYW4ndCBkbyByZWFkLW9ubHkgV1BzIHcvaHctYmtwdHMNCisJCWVyciA9IGh3QmtwdE1nci5TZXRIYXJkd2FyZUJyZWFrKHdwKTsNCisJaWYgKGVyciA9PSAwKQ0KKwkJd3AtPmFjdHVhbFR5cGUgPSB0eXBlX0hhcmR3YXJlOw0KKwllbHNlIGlmICh3cC0+cmVxdWVzdGVkVHlwZSAhPSB0eXBlX0hhcmR3YXJlKSB7DQorCQllcnIgPSBod1BhZ2VQcm90TWdyLlNldFBhZ2VQcm90ZWN0V2F0Y2hwb2ludCh3cCk7DQorCQlpZiAoZXJyID09IDApDQorCQkJd3AtPmFjdHVhbFR5cGUgPSB0eXBlX1NvZnR3YXJlOw0KKwl9DQorCXJldHVybiBlcnI7DQorfQ0KKw0KK2ludCBXaW5Qcm9jZXNzOjpDbGVhcldhdGNocG9pbnQoVEJyZWFrcG9pbnQqIHdwKSB7DQorCWludCBlcnI7DQorCWlmICh3cC0+YWN0dWFsVHlwZSA9PSB0eXBlX0hhcmR3YXJlKQ0KKwkJZXJyID0gaHdCa3B0TWdyLkNsZWFySGFyZHdhcmVCcmVhayh3cCk7DQorCWVsc2UNCisJCWVyciA9IGh3UGFnZVByb3RNZ3IuQ2xlYXJQYWdlUHJvdGVjdFdhdGNocG9pbnQod3ApOw0KKwlyZXR1cm4gZXJyOw0KK30NCisNCitzaXplX3QgV2luUHJvY2Vzczo6U29mdHdhcmVXYXRjaHBvaW50Q291bnQoKSBjb25zdCB7DQorCXJldHVybiBod1BhZ2VQcm90TWdyLndhdGNocG9pbnRzLnNpemUoKTsNCit9DQorDQogdm9pZCBXaW5Qcm9jZXNzOjpTZXREZWJ1Z1JlZ2lzdGVyKFdpbkhXQmtwdE1ncjo6RFJNYXNrIGRyTWFzaywgQ29udGV4dEFkZHJlc3MgYWRkciwgV2luSFdCa3B0TWdyOjpEUkZsYWdzIGZsYWdzKSB7DQogCWNvbnN0IHN0ZDo6bGlzdDxDb250ZXh0Kj4mIGNoaWxkcmVuID0gR2V0Q2hpbGRyZW4oKTsNCiAJc3RkOjpsaXN0PENvbnRleHQqPjo6Y29uc3RfaXRlcmF0b3IgYzsNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9XaW5Qcm9jZXNzLmggYi9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9XaW5Qcm9jZXNzLmgKaW5kZXggNTczNTZlNy4uNDk0MjNhMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvV2luUHJvY2Vzcy5oCisrKyBiL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvd2luX2FnZW50L1dpblByb2Nlc3MuaApAQCAtMTAsMTQgKzEwLDE2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiAjcHJhZ21hIG9uY2UNCiANCisjaW5jbHVkZSAic3RkYWZ4LmgiDQorDQogI2luY2x1ZGUgPHZlY3Rvcj4NCiAjaW5jbHVkZSA8c2V0Pg0KLSNpbmNsdWRlICJzdGRhZnguaCINCi0jaW5jbHVkZSAiUHJvY2Vzc0NvbnRleHQuaCINCi0jaW5jbHVkZSAiV2luSFdCa3B0TWdyLmgiDQotI2luY2x1ZGUgIldpbkRlYnVnTW9uaXRvci5oIg0KIA0KLWNsYXNzIFdpblRocmVhZDsNCisjaW5jbHVkZSAiUHJvY2Vzc0NvbnRleHQuaCINCisjaW5jbHVkZSAiV2luRGVidWdNb25pdG9yLmgiDQorI2luY2x1ZGUgIldpbkhXUGFnZVByb3RNZ3IuaCINCisjaW5jbHVkZSAiV2luVGhyZWFkLmgiDQorDQogY2xhc3MgV2luRGVidWdNb25pdG9yOw0KIA0KIGNsYXNzIFdpblByb2Nlc3MgOiBwdWJsaWMgUHJvY2Vzc0NvbnRleHQgew0KQEAgLTQ1LDExICs0NywxOCBAQAogDQogCXN0ZDo6bWFwPGludCwgUHJvcGVydGllcz4mIEdldEV4ZWN1dGFibGVzQnlBZGRyZXNzKCk7DQogDQotCXZvaWQgU2V0RGVidWdSZWdpc3RlcihXaW5IV0JrcHRNZ3I6OkRSTWFzaywgQ29udGV4dEFkZHJlc3MsIFdpbkhXQmtwdE1ncjo6RFJGbGFncyk7DQotCXZvaWQgQ2xlYXJEZWJ1Z1JlZ2lzdGVyKFdpbkhXQmtwdE1ncjo6RFJNYXNrKTsNCisJaW50CVNldFdhdGNocG9pbnQoVEJyZWFrcG9pbnQqKTsNCisJaW50IENsZWFyV2F0Y2hwb2ludChUQnJlYWtwb2ludCopOw0KKwlzaXplX3QgU29mdHdhcmVXYXRjaHBvaW50Q291bnQoKSBjb25zdDsNCisNCiAgIHByaXZhdGU6DQogCXZvaWQgSW5pdGlhbGl6ZSgpOw0KIA0KKwlmcmllbmQgaW50IFdpbkhXQmtwdE1ncjo6U2V0SGFyZHdhcmVCcmVhayhUQnJlYWtwb2ludCopOw0KKwl2b2lkIFNldERlYnVnUmVnaXN0ZXIoV2luSFdCa3B0TWdyOjpEUk1hc2ssIENvbnRleHRBZGRyZXNzLCBXaW5IV0JrcHRNZ3I6OkRSRmxhZ3MpOw0KKwlmcmllbmQgaW50IFdpbkhXQmtwdE1ncjo6Q2xlYXJIYXJkd2FyZUJyZWFrKFRCcmVha3BvaW50Kik7DQorCXZvaWQgQ2xlYXJEZWJ1Z1JlZ2lzdGVyKFdpbkhXQmtwdE1ncjo6RFJNYXNrKTsNCisNCiAJYm9vbCBpc1Jvb3RfOw0KIAlIQU5ETEUgcHJvY2Vzc0hhbmRsZV87DQogCXN0ZDo6c3RyaW5nIHByb2Nlc3NOYW1lXzsNCkBAIC01Nyw0ICs2NiwxMCBAQAogCXN0ZDo6bWFwPGludCwgUHJvcGVydGllcz4gZXhlY3V0YWJsZXNCeUFkZHJlc3NfOw0KIA0KIAlzdGF0aWMgc3RkOjptYXA8aW50LCBXaW5Qcm9jZXNzKj4gcHJvY2Vzc0lETWFwOw0KKw0KKwlXaW5IV0JrcHRNZ3IJCWh3QmtwdE1ncjsNCisNCisJZnJpZW5kIGJvb2wgV2luVGhyZWFkOjpIYW5kbGVQb3RlbnRpYWxQcm90Y3RlZFBhZ2UoY29uc3QgREVCVUdfRVZFTlQmKTsNCisJZnJpZW5kIGludCBXaW5UaHJlYWQ6OkhhbmRsZVJlc3RvcmluZ1Byb3RlY3RlZFBhZ2UoKTsNCisJV2luSFdQYWdlUHJvdE1ncglod1BhZ2VQcm90TWdyOw0KIH07DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvV2luVGhyZWFkLmNwcCBiL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvd2luX2FnZW50L1dpblRocmVhZC5jcHAKaW5kZXggODM0OTRjYi4uZjRjZTUxYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuY2R0LmRlYnVnLmVkYy53aW5kb3dzLmFnZW50L3NyYy93aW5fYWdlbnQvV2luVGhyZWFkLmNwcAorKysgYi9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9XaW5UaHJlYWQuY3BwCkBAIC01MCw2ICs1MCw4IEBACiAJaXNTdXNwZW5kZWRfID0gZmFsc2U7DQogCWlzVGVybWluYXRpbmdfID0gZmFsc2U7DQogCWlzVXNlclN1c3BlbmRlZF8gPSBmYWxzZTsNCisJaXNXYXRjaHBvaW50U3RlcHBpbmdfID0gZmFsc2U7DQorCXdwU3RlcHBpbmdTYXZlZFdQID0gTlVMTDsNCiANCiAJLy8ganVzdCB0byBlbnN1cmUgdGhhdCBuZXcgdGhyZWFkcyBhcmUgcmVzdW1lZCB3aXRoIERCR19DT05USU5VRS4gIHRoaXMgaXMgbm9ybWFsbHkgc2V0L2NoYW5nZWQNCiAJLy8gaW4gSGFuZGxlRXhjZXB0aW9uDQpAQCAtMTM3LDIyICsxMzksMTE3IEBACiAJdGhyZWFkQ29udGV4dFZhbGlkXyA9IGZhbHNlOw0KIH0NCiANCi12b2lkIFdpblRocmVhZDo6SGFuZGxlRXhjZXB0aW9uKERFQlVHX0VWRU5UJiBkZWJ1Z0V2ZW50KSB7DQotCWV4Y2VwdGlvbkluZm9fID0gZGVidWdFdmVudC51LkV4Y2VwdGlvbjsNCit2b2lkIFdpblRocmVhZDo6TWFya1Jlc3VtZWQoKSB7DQorCWlzU3VzcGVuZGVkXyA9IGZhbHNlOw0KKwl0aHJlYWRDb250ZXh0VmFsaWRfID0gZmFsc2U7DQorfQ0KKw0KK2ludCBXaW5UaHJlYWQ6OkhhbmRsZVJlc3RvcmluZ1Byb3RlY3RlZFBhZ2UoKSB7DQorCWlzV2F0Y2hwb2ludFN0ZXBwaW5nXyA9IGZhbHNlOw0KKwljb25zdCBIQU5ETEUmIHByb2NIID0gcGFyZW50UHJvY2Vzc18uR2V0UHJvY2Vzc0hhbmRsZSgpOw0KKwlXaW5IV1BhZ2VQcm90TWdyJiBwcm90TWdyID0gcGFyZW50UHJvY2Vzc18uaHdQYWdlUHJvdE1ncjsNCisJcmV0dXJuIHByb3RNZ3IuRW5hYmxlRm9yUGFnZXNDb250YWluaW5nQWRkcmVzcyhwcm9jSCwgd3BTdGVwcGluZ0FkZHJfKTsNCit9DQorDQordm9pZCBXaW5UaHJlYWQ6OlNlbmRXYXRjaHBvaW50Tm90aWZpY2F0aW9uKGNvbnN0IFRCcmVha3BvaW50KiB3cCkgew0KKwlzdGQ6Om9zdHJpbmdzdHJlYW0gd3BBZGRyOyB3cEFkZHIgPDwgc3RkOjpoZXggPDwgd3AtPmFkZHJlc3M7DQorCUV2ZW50Q2xpZW50Tm90aWZpZXI6OlNlbmRDb250ZXh0U3VzcGVuZGVkKHRoaXMsDQorCQkJR2V0UENBZGRyZXNzKCksIFJFQVNPTl9XQVRDSFBPSU5ULCB3cEFkZHIuc3RyKCkpOw0KK30NCisNCit2b2lkIFdpblRocmVhZDo6SGFuZGxlRXhjZXB0aW9uKGNvbnN0IERFQlVHX0VWRU5UJiBkZWJ1Z0V2ZW50KSB7DQogCU1hcmtTdXNwZW5kZWQoKTsNCiAJRW5zdXJlVmFsaWRDb250ZXh0SW5mbygpOw0KIA0KLQlpZiAodGhyZWFkQ29udGV4dEluZm9fLkRyNiAmIDB4RikgewkvLyBvbmUgd2lsbCBiZSBzZXQgaWYgYSBIVyBia3B0IHRyaWdnZXJlZA0KLQkJSGFuZGxlSGFyZHdhcmVCcmVhaygpOw0KKwlib29sIGhhcmR3YXJlQnJlYWtUcmlnZ2VyZWQgPSB0aHJlYWRDb250ZXh0SW5mb18uRHI2ICYgMHhGOw0KKwlleGNlcHRpb25JbmZvXyA9IGRlYnVnRXZlbnQudS5FeGNlcHRpb247DQorCWlmIChpc1dhdGNocG9pbnRTdGVwcGluZ18pIHsNCisJCUhhbmRsZVJlc3RvcmluZ1Byb3RlY3RlZFBhZ2UoKTsNCisJCWlmICghd3BTdGVwcGluZ1NhdmVkV1AgJiYgIWhhcmR3YXJlQnJlYWtUcmlnZ2VyZWQNCisJCQkmJiBleGNlcHRpb25JbmZvXy5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQ29kZSA9PSBFWENFUFRJT05fU0lOR0xFX1NURVApDQorCQl7DQorCQkJTWFya1Jlc3VtZWQoKTsNCisJCQk6OkNvbnRpbnVlRGVidWdFdmVudChkZWJ1Z0V2ZW50LmR3UHJvY2Vzc0lkLCBkZWJ1Z0V2ZW50LmR3VGhyZWFkSWQsIERCR19DT05USU5VRSk7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwl9DQogDQotCQkvLyBhbHdheXMgcmVzZXQgdG8gdGhpcyBmb3IgdGhlIG5leHQgdGltZSB0aHJvdWdoLg0KLQkJdGhyZWFkQ29udGV4dEluZm9fLkRyNiA9IDB4RkZGRjBGRjA7DQotCQk6OlNldFRocmVhZENvbnRleHQoaGFuZGxlXywgJnRocmVhZENvbnRleHRJbmZvXyk7DQorCWlmIChoYXJkd2FyZUJyZWFrVHJpZ2dlcmVkKSB7DQorCQlIYW5kbGVIYXJkd2FyZUJyZWFrKCk7DQorCX0gZWxzZSBpZiAod3BTdGVwcGluZ1NhdmVkV1ApIHsNCisJCVNlbmRXYXRjaHBvaW50Tm90aWZpY2F0aW9uKHdwU3RlcHBpbmdTYXZlZFdQKTsNCiAJfSBlbHNlIHsNCiAJCUFkanVzdFBDKCk7DQogCQlFdmVudENsaWVudE5vdGlmaWVyOjpTZW5kQ29udGV4dFN1c3BlbmRlZCh0aGlzLA0KIAkJCQlHZXRQQ0FkZHJlc3MoKSwgR2V0U3VzcGVuZFJlYXNvbigpLCBHZXRFeGNlcHRpb25NZXNzYWdlKCkpOw0KIAl9DQorCXdwU3RlcHBpbmdTYXZlZFdQID0gTlVMTDsNCit9DQorDQordm9pZCBXaW5UaHJlYWQ6OkhhbmRsZUhhcmR3YXJlQnJlYWsoKSB7DQorCWNvbnN0IEhBTkRMRSYgcHJvY0ggPSBwYXJlbnRQcm9jZXNzXy5HZXRQcm9jZXNzSGFuZGxlKCk7DQorCUNvbnRleHRBZGRyZXNzKiBkciA9IChDb250ZXh0QWRkcmVzcyopJih0aHJlYWRDb250ZXh0SW5mb18uRHIwKTsNCisJZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpIHsNCisJCWlmICh0aHJlYWRDb250ZXh0SW5mb18uRHI2ICYgKDEgPDwgaSkpIHsNCisJCQlUQnJlYWtwb2ludCogd3ANCisJCQkgID0gQnJlYWtwb2ludHNTZXJ2aWNlOjpGaW5kV2F0Y2hwb2ludEJ5QWRkcmVzcyhwcm9jSCwgZHJbaV0pOw0KKwkJCWlmICh3cCkgew0KKwkJCQlTZW5kV2F0Y2hwb2ludE5vdGlmaWNhdGlvbih3cCk7DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvLyBhbHdheXMgcmVzZXQgdG8gdGhpcyBmb3IgdGhlIG5leHQgdGltZSB0aHJvdWdoLg0KKwl0aHJlYWRDb250ZXh0SW5mb18uRHI2ID0gMHhGRkZGMEZGMDsNCisJOjpTZXRUaHJlYWRDb250ZXh0KGhhbmRsZV8sICZ0aHJlYWRDb250ZXh0SW5mb18pOw0KK30NCisNCitib29sIFdpblRocmVhZDo6SGFuZGxlUG90ZW50aWFsUHJvdGN0ZWRQYWdlKGNvbnN0IERFQlVHX0VWRU5UJiBkZWJ1Z0V2ZW50KSB7DQorCWlmICghcGFyZW50UHJvY2Vzc18uU29mdHdhcmVXYXRjaHBvaW50Q291bnQoKSkNCisJCXJldHVybiBmYWxzZTsNCisNCisJZXhjZXB0aW9uSW5mb18gPSBkZWJ1Z0V2ZW50LnUuRXhjZXB0aW9uOw0KKwlXaW5IV1BhZ2VQcm90TWdyJiBwcm90TWdyID0gcGFyZW50UHJvY2Vzc18uaHdQYWdlUHJvdE1ncjsNCisJd3BTdGVwcGluZ0FkZHJfID0gZXhjZXB0aW9uSW5mb18uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkluZm9ybWF0aW9uWzFdOw0KKwlpZiAoIXByb3RNZ3IuSXNBZGRyZXNzSW5Qcm90ZWN0ZWRQYWdlKHdwU3RlcHBpbmdBZGRyXykpDQorCQlyZXR1cm4gZmFsc2U7DQorDQorCWlzV2F0Y2hwb2ludFN0ZXBwaW5nXyA9IHRydWU7DQorDQorCWNvbnN0IEhBTkRMRSYgcHJvY0ggPSBwYXJlbnRQcm9jZXNzXy5HZXRQcm9jZXNzSGFuZGxlKCk7DQorCXByb3RNZ3IuRGlzYWJsZUZvclBhZ2VzQ29udGFpbmluZ0FkZHJlc3MocHJvY0gsIHdwU3RlcHBpbmdBZGRyXyk7DQorCVRCcmVha3BvaW50KiB3cCA9IHByb3RNZ3IuRmluZFdhdGNocG9pbnRGb3JBZGRyZXNzKHByb2NILCB3cFN0ZXBwaW5nQWRkcl8pOw0KKwlpZiAod3ApIHsNCisJCWJvb2wgYWNjZXNzVyA9IGV4Y2VwdGlvbkluZm9fLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25JbmZvcm1hdGlvblswXSA/IHRydWUgOiBmYWxzZTsNCisJCWlmICgoYWNjZXNzVyAmJiBBQ0NFU1NNT0RFX1dSSVRFICYgd3AtPmFjY2Vzc01vZGUpDQorCQkJfHwgKCFhY2Nlc3NXICYmIEFDQ0VTU01PREVfUkVBRCAmIHdwLT5hY2Nlc3NNb2RlKSkgew0KKwkJCXdwU3RlcHBpbmdTYXZlZFdQID0gd3A7DQorCQl9DQorCX0NCisNCisJLyoNCisJICoJcmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9yIG5vdCBhIFdQIHdhcyBmb3VuZCAmIHNhdmVkIIUgc2luZ2xlLXN0ZXAsDQorCSAqCWFuZCB0aGVuIFdpblRocmVhZDo6SGFuZGxlRXhjZXB0aW9uKCkgd2lsbCBoYW5kbGUgd2l0aCB0aGUgc3RhdGUNCisJICoJbWVtYmVyIHZhcnMgc2V0IGhlcmVpbi4NCisJICoJdGhlIHBvaW50IGluIGRvaW5nIHRoaXM6IGlmIGEgcGFnZS1wcm90ZWN0aW9uIGFjY2VzcyB2aW9sYXRpb24NCisJICoJb2NjdXJyZWQgYXQgdGhlIFdQIGFkZHJlc3MsIGl0IGRpZCBzbyBiZWNhdXNlIHRoZSBleGNlcHRpb24NCisJICoJb2NjdXJyZWQgYmVmb3JlIHRoZSBpbnN0ciB3YXMgZXhlY3V0ZWQsIGFuZCB0aHVzIGJlZm9yZSB0aGUgRUlQDQorCSAqCW1vdmVkLiAgYnkgcGVyZm9ybWluZyBzaW5nbGUtc3RlcCB1bnByb3RlY3RlZCAmIGV4ZWN1dGluZyB0aGUNCisJICoJaW5zdHIgdGhhdCBjYXVzZWQgdGhlIGFjY2Vzcy9wcm90ZWN0aW9uIHZpb2xhdGlvbiwgdGhlIEVJUCBlbmRzDQorCSAqCXVwIHdoZXJlIGl0IHdvdWxkIGFmdGVyIHRoZSBhY2Nlc3MsIGp1c3QgbGlrZSBhIEhXIGJrcHQgdHJpZ2dlci4NCisJICoJYW5kIGlmIHRoZSBwYWdlLXByb3RlY3Rpb24gYWNjZXNzIHZpb2xhdGlvbiBvY2N1cnJlZCBhdCBhbg0KKwkgKglhZGRyZXNzIG90aGVyIHRoYW4gdGhlIHdhdGNocG9pbnQsIHdlIHN0aWxsIG5lZWQgdG8gc3RlcCBvbmNlDQorCSAqCWhlcmUgaW4gdW5wcm90ZWN0ZWQgbW9kZSwgYW5kIHRoZW4gcmUtcHJvdGVjdCB0aGUgcGFnZSBhbmQNCisJICoJY29udGludWUgdXBvbiBoYW5kbGluZyB0aGUgc2luZ2xlLXN0ZXAgaW4gSGFuZGxlRXhjZXB0aW9uLg0KKwkgKi8NCisNCisJTWFya1N1c3BlbmRlZCgpOwkJCS8vIG5lZWRlZCBzbyBFbnN1cmVWYWxpZENvbnRleHRJbmZvKCkgd29ya3MNCisJRW5zdXJlVmFsaWRDb250ZXh0SW5mbygpOwkvLyBuZWVkZWQgc28gRW5hYmxlU2luZ2xlU3RlcCgpIHdvcmtzDQorCUVuYWJsZVNpbmdsZVN0ZXAoKTsJCQkvLyBuZWVkZWQgc28gd2F0Y2hwb2ludCBzdGVwcGluZyB3b3Jrcw0KKwlNYXJrUmVzdW1lZCgpOwkJCQkvLyBuZWVkZWQgdG8gcHJldmVudCBpbmFkdmVydGVudCBjb250ZXh0IGluZm8gYWNjZXNzDQorCTo6Q29udGludWVEZWJ1Z0V2ZW50KGRlYnVnRXZlbnQuZHdQcm9jZXNzSWQsIGRlYnVnRXZlbnQuZHdUaHJlYWRJZCwgREJHX0NPTlRJTlVFKTsNCisJcmV0dXJuIHRydWU7DQogfQ0KIA0KIC8qDQpAQCAtNTMyLDcgKzYyOSw3IEBACiAJCWJyZWFrOw0KIAljYXNlIERSMzoNCiAJCXRocmVhZENvbnRleHRJbmZvXy5EcjMgPSBhZGRyOw0KLQkJRFI3ID0gKERSNyAmIH4weEYwMDAwMDMwKSB8IChkcjdiaXRzPDwyOCkgfCAweDQwOw0KKwkJRFI3ID0gKERSNyAmIH4weEYwMDAwMEMwKSB8IChkcjdiaXRzPDwyOCkgfCAweDQwOw0KIAkJYnJlYWs7DQogCWRlZmF1bHQ6DQogCQlyZXR1cm47DQpAQCAtNTU2LDI0ICs2NTMsNiBAQAogCQlyZXR1cm47DQogCX0NCiAJOjpTZXRUaHJlYWRDb250ZXh0KGhhbmRsZV8sICZ0aHJlYWRDb250ZXh0SW5mb18pOw0KLQk6OlNldFRocmVhZENvbnRleHQoaGFuZGxlXywgJnRocmVhZENvbnRleHRJbmZvXyk7DQogCWlmICghc3VzcGVuZGVkKQ0KIAkJUmVzdW1lKCk7DQogfQ0KLQ0KLXZvaWQgV2luVGhyZWFkOjpIYW5kbGVIYXJkd2FyZUJyZWFrKCkgew0KLQljb25zdCBIQU5ETEUmIHByb2NIYW5kbGUgPSBwYXJlbnRQcm9jZXNzXy5HZXRQcm9jZXNzSGFuZGxlKCk7DQotCUNvbnRleHRBZGRyZXNzKiBkciA9IChDb250ZXh0QWRkcmVzcyopJih0aHJlYWRDb250ZXh0SW5mb18uRHIwKTsNCi0JZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpIHsNCi0JCWlmICh0aHJlYWRDb250ZXh0SW5mb18uRHI2ICYgKDEgPDwgaSkpIHsNCi0JCQlUQnJlYWtwb2ludCogd3ANCi0JCQkgID0gQnJlYWtwb2ludHNTZXJ2aWNlOjpGaW5kV2F0Y2hwb2ludEJ5QWRkcmVzcyhwcm9jSGFuZGxlLCBkcltpXSk7DQotCQkJaWYgKHdwKSB7DQotCQkJCXN0ZDo6b3N0cmluZ3N0cmVhbSB3cEFkZHI7IHdwQWRkciA8PCBzdGQ6OmhleCA8PCB3cC0+YWRkcmVzczsNCi0JCQkJRXZlbnRDbGllbnROb3RpZmllcjo6U2VuZENvbnRleHRTdXNwZW5kZWQodGhpcywNCi0JCQkJCQlHZXRQQ0FkZHJlc3MoKSwgUkVBU09OX1dBVENIUE9JTlQsIHdwQWRkci5zdHIoKSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5jZHQuZGVidWcuZWRjLndpbmRvd3MuYWdlbnQvc3JjL3dpbl9hZ2VudC9XaW5UaHJlYWQuaCBiL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvd2luX2FnZW50L1dpblRocmVhZC5oCmluZGV4IGE1MjVjMmEuLmZmOTYzNjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvd2luX2FnZW50L1dpblRocmVhZC5oCisrKyBiL29yZy5lY2xpcHNlLmNkdC5kZWJ1Zy5lZGMud2luZG93cy5hZ2VudC9zcmMvd2luX2FnZW50L1dpblRocmVhZC5oCkBAIC02MCwxNCArNjAsMTcgQEAKIAkNCiAJdm9pZCBQcmVwYXJlRm9yVGVybWluYXRpb24oY29uc3QgQWdlbnRBY3Rpb25QYXJhbXMmKSB0aHJvdyAoQWdlbnRFeGNlcHRpb24pOw0KIA0KLQl2b2lkIEhhbmRsZUV4Y2VwdGlvbihERUJVR19FVkVOVCYgZGVidWdFdmVudCk7DQorCXZvaWQgSGFuZGxlRXhjZXB0aW9uKGNvbnN0IERFQlVHX0VWRU5UJiBkZWJ1Z0V2ZW50KTsNCiAJdm9pZCBIYW5kbGVFeGVjdXRhYmxlRXZlbnQoYm9vbCBpc0xvYWRlZCwgY29uc3Qgc3RkOjpzdHJpbmcmIGV4ZVBhdGgsDQogCQkJdW5zaWduZWQgbG9uZyBiYXNlQWRkcmVzcywgdW5zaWduZWQgbG9uZyBjb2RlU2l6ZSk7DQorCWJvb2wgSGFuZGxlUG90ZW50aWFsUHJvdGN0ZWRQYWdlKGNvbnN0IERFQlVHX0VWRU5UJik7DQorCWludCBIYW5kbGVSZXN0b3JpbmdQcm90ZWN0ZWRQYWdlKCk7DQogDQogCS8qIEFkZHJlc3Mgd2hlcmUgc3VzcGVuZCBpcyByZXBvcnRlZCAqLw0KIAlDb250ZXh0QWRkcmVzcyBHZXRQQ0FkZHJlc3MoKSBjb25zdDsNCiANCiAJdm9pZCBFbmFibGVTaW5nbGVTdGVwKCk7DQorCXZvaWQgTWFya1Jlc3VtZWQoKTsNCiANCiAJRFdPUkQgR2V0Q29udGludWVTdGF0dXMoKSBjb25zdDsNCiANCkBAIC05NSw2ICs5OCw3IEBACiAJdm9pZCogR2V0UmVnaXN0ZXJWYWx1ZUJ1ZmZlcihjb25zdCBzdGQ6OnN0cmluZyYgcmVnTmFtZSkgY29uc3Q7DQogDQogCXZvaWQgSGFuZGxlSGFyZHdhcmVCcmVhaygpOw0KKwl2b2lkIFNlbmRXYXRjaHBvaW50Tm90aWZpY2F0aW9uKGNvbnN0IFRCcmVha3BvaW50Kik7DQogDQogCXN0ZDo6cGFpcjxpbnQsIGludD4gdGhyZWFkTG9va3VwUGFpcl87DQogDQpAQCAtMTAyLDYgKzEwNiwxNCBAQAogCWJvb2wgaXNTdXNwZW5kZWRfOw0KIAlib29sIGlzVGVybWluYXRpbmdfOw0KIAlib29sIGlzVXNlclN1c3BlbmRlZF87DQorDQorCWJvb2wgaXNXYXRjaHBvaW50U3RlcHBpbmdfOw0KKwlEV09SRCB3cFN0ZXBwaW5nQWRkcl87CQkJLy8gb25seSB2YWxpZCBpZiBpc1dhdGNocG9pbnRTdGVwcGluZ18NCisNCisJLy8gaWYgYSBwYWdlLXByb3RlY3Rpb24gb2NjdXJzLCB0aGlzIHdpbGwgaG9sZCB0aGUNCisJLy8gd2F0Y2hwb2ludCBhc3NvY2lhdGVkIHdpdGggdGhlIGFkZHJlc3MsIGlmIGFueQ0KKwlUQnJlYWtwb2ludCogd3BTdGVwcGluZ1NhdmVkV1A7CS8vIG9ubHkgdmFsaWQgaWYgaXNXYXRjaHBvaW50U3RlcHBpbmdfDQorDQogCUNPTlRFWFQgdGhyZWFkQ29udGV4dEluZm9fOw0KIAlFWENFUFRJT05fREVCVUdfSU5GTyBleGNlcHRpb25JbmZvXzsNCiAJc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiByZWdpc3RlclZhbHVlQ2FjaGVfOw0K