ZGlmZiAtTnVyIEJUTC0yMDAzMDEyNC9hY3Rpb25zL2FjdGlvbl9hYXRfcHJvZHVjdC5oaCBCVEwvYWN0aW9ucy9hY3Rpb25fYWF0X3Byb2R1Y3QuaGgKLS0tIEJUTC0yMDAzMDEyNC9hY3Rpb25zL2FjdGlvbl9hYXRfcHJvZHVjdC5oaAkyMDAyLTEyLTAyIDE0OjU3OjQ5LjAwMDAwMDAwMCArMDEwMAorKysgQlRML2FjdGlvbnMvYWN0aW9uX2FhdF9wcm9kdWN0LmhoCTIwMDMtMTEtMTIgMTk6MDY6MjYuMDAwMDAwMDAwICswMTAwCkBAIC0xLDE0ICsxLDE0IEBACiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBGaWxlICAgOiAgYWN0aW9uX2FhdF9wcm9kdWN0LmhoCi0vLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPiAgICAgICAgCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgogLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoxOSBDRVNUIDIwMDIKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIAorLy8KIC8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIC8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgogLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0vLyAKKy8vCiAvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIC8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCkBAIC0xNiw3ICsxNiw3IEBACiAvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIC8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgotLy8gCisvLwogI2lmbmRlZiBBQ1RJT05fQUFUX1BST0RVQ1QKICNkZWZpbmUgQUNUSU9OX0FBVF9QUk9EVUNUCiAjaW5jbHVkZSAidXRpbGl0aWVzLmgiCkBAIC0yNiwxMDMgKzI2LDM5IEBACiAjaW5jbHVkZSAiaW5pdC9pbml0X3ZlY3Rvci5oaCIKICNpbmNsdWRlICJpbml0L2luaXRfbWF0cml4LmhoIgogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCiB0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+Ci1jbGFzcyBBY3Rpb25fYWF0X3Byb2R1Y3QgeworY2xhc3MgQWN0aW9uX2FhdF9wcm9kdWN0Cit7CisgIEFjdGlvbl9hYXRfcHJvZHVjdChjb25zdCAgQWN0aW9uX2FhdF9wcm9kdWN0ICYpOwogCiBwdWJsaWMgOgotCiAgIC8vIEN0b3IKLQotICBBY3Rpb25fYWF0X3Byb2R1Y3QoIGludCBzaXplICk6X3NpemUoc2l6ZSkKLSAgewotICAgIE1FU1NBR0UoIkFjdGlvbl9hYXRfcHJvZHVjdCBDdG9yIik7Ci0KLSAgICAvLyBTVEwgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KLQotICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KEFfc3RsLF9zaXplKTsKLSAgICBpbml0X21hdHJpeDxudWxsX2Z1bmN0aW9uPihYX3N0bCxfc2l6ZSk7Ci0gICAgaW5pdF9tYXRyaXg8bnVsbF9mdW5jdGlvbj4ocmVzdV9zdGwsX3NpemUpOwotCi0gICAgLy8gZ2VuZXJpYyBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgotCi0gICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQV9yZWYsQV9zdGwpOwotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFhfcmVmLFhfc3RsKTsKLQotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEEsQV9zdGwpOwotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFgsWF9zdGwpOwotCi0gIH0KLQotICAvLyBpbnZhbGlkYXRlIGNvcHkgY3RvcgotCi0gIEFjdGlvbl9hYXRfcHJvZHVjdCggY29uc3QgIEFjdGlvbl9hYXRfcHJvZHVjdCAmICkKLSAgewotICAgIElORk9TKCJpbGxlZ2FsIGNhbGwgdG8gQWN0aW9uX2FhdF9wcm9kdWN0IENvcHkgQ3RvciIpOwotICAgIGV4aXQoMCk7Ci0gIH0KKyAgQWN0aW9uX2FhdF9wcm9kdWN0KGludCBzaXplKTsKIAogICAvLyBEdG9yCisgIH5BY3Rpb25fYWF0X3Byb2R1Y3QoKTsKIAotICB+QWN0aW9uX2FhdF9wcm9kdWN0KCB2b2lkICl7Ci0KLSAgICBNRVNTQUdFKCJBY3Rpb25fYWF0X3Byb2R1Y3QgRHRvciIpOwotCi0gICAgLy8gZGVhbGxvY2F0aW9uCi0KLSAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEEsX3NpemUpOwotICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWCxfc2l6ZSk7Ci0KLSAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEFfcmVmLF9zaXplKTsKLSAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFhfcmVmLF9zaXplKTsKLQotICB9Ci0gIAogICAvLyBhY3Rpb24gbmFtZQotCi0gIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSggdm9pZCApCi0gIHsKLSAgICByZXR1cm4gImFhdF8iK0ludGVyZmFjZTo6bmFtZSgpOworICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoKSB7CisgICAgcmV0dXJuICJhYXRfIiArIEludGVyZmFjZTo6bmFtZSgpOwogICB9CiAKLSAgZG91YmxlIG5iX29wX2Jhc2UoIHZvaWQgKXsKKyAgZG91YmxlIG5iX29wX2Jhc2UoKSB7CiAgICAgcmV0dXJuIDIuMCpfc2l6ZSpfc2l6ZSpfc2l6ZTsKICAgfQogCi0gIGlubGluZSB2b2lkIGluaXRpYWxpemUoIHZvaWQgKXsKLQorICB2b2lkIGluaXRpYWxpemUoKSB7CiAgICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChBX3JlZixBLF9zaXplKTsKICAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KFhfcmVmLFgsX3NpemUpOwotICAgIAogICB9CiAKLSAgaW5saW5lIHZvaWQgY2FsY3VsYXRlKCB2b2lkICkgewotCi0gICAgICBJbnRlcmZhY2U6OmFhdF9wcm9kdWN0KEEsWCxfc2l6ZSk7Ci0KKyAgdm9pZCBjYWxjdWxhdGUoIHZvaWQgKSB7CisgICAgSW50ZXJmYWNlOjphYXRfcHJvZHVjdChBLFgsX3NpemUpOwogICB9CiAKLSAgdm9pZCBjaGVja19yZXN1bHQoIHZvaWQgKXsKLQotICAgIC8vIGNhbGN1bGF0aW9uIGNoZWNrCi0KLSAgICBJbnRlcmZhY2U6Om1hdHJpeF90b19zdGwoWCxyZXN1X3N0bCk7Ci0KLSAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6YWF0X3Byb2R1Y3QoQV9zdGwsWF9zdGwsX3NpemUpOwotICAgIAotICAgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIGVycm9yPQotICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihYX3N0bCxyZXN1X3N0bCk7Ci0gCi0gICAgaWYgKGVycm9yPjEuZS02KXsKLSAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOyAgICAgIAotICAgICAgZXhpdCgwKTsKLSAgICB9Ci0KLSAgfQotCi1wcml2YXRlIDogCisgIHZvaWQgY2hlY2tfcmVzdWx0KCk7CiAKK3ByaXZhdGUgOgogICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggQV9zdGw7CiAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBYX3N0bDsKICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IHJlc3Vfc3RsOwpAQCAtMTMzLDEzICs2OSw2MSBAQAogICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IEE7CiAgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggWDsKIAotCiAgIGludCBfc2l6ZTsKLQogfTsKLSAgCiAKLSNlbmRpZgogCisvKgorICogSW1wbGVtZW50YXRpb24KKyAqLwordGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlPgorQWN0aW9uX2FhdF9wcm9kdWN0PEludGVyZmFjZT46OkFjdGlvbl9hYXRfcHJvZHVjdChpbnQgc2l6ZSkKKyAgOiBfc2l6ZShzaXplKQoreworICBNRVNTQUdFKCJBY3Rpb25fYWF0X3Byb2R1Y3QgQ3RvciIpOworCisgIC8vIFNUTCBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgorICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihBX3N0bCxfc2l6ZSk7CisgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KFhfc3RsLF9zaXplKTsKKyAgaW5pdF9tYXRyaXg8bnVsbF9mdW5jdGlvbj4ocmVzdV9zdGwsX3NpemUpOworCisgIC8vIGdlbmVyaWMgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKyAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQV9yZWYsQV9zdGwpOworICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChYX3JlZixYX3N0bCk7CisKKyAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQSxBX3N0bCk7CisgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFgsWF9zdGwpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+CitBY3Rpb25fYWF0X3Byb2R1Y3Q8SW50ZXJmYWNlPjo6fkFjdGlvbl9hYXRfcHJvZHVjdCgpCit7CisgIE1FU1NBR0UoIkFjdGlvbl9hYXRfcHJvZHVjdCBEdG9yIik7CisKKyAgLy8gZGVhbGxvY2F0aW9uCisgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQSxfc2l6ZSk7CisgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWCxfc2l6ZSk7CisKKyAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBX3JlZixfc2l6ZSk7CisgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWF9yZWYsX3NpemUpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+Cit2b2lkIEFjdGlvbl9hYXRfcHJvZHVjdDxJbnRlcmZhY2U+OjpjaGVja19yZXN1bHQoKQoreworICAvLyBjYWxjdWxhdGlvbiBjaGVjaworCisgIEludGVyZmFjZTo6bWF0cml4X3RvX3N0bChYLHJlc3Vfc3RsKTsKIAorICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6YWF0X3Byb2R1Y3QoQV9zdGwsWF9zdGwsX3NpemUpOwogCisgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIGVycm9yPQorICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+Ojpub3JtX2RpZmYoWF9zdGwscmVzdV9zdGwpOworCisgIGlmIChlcnJvcj4xLmUtNil7CisgICAgSU5GT1MoIldST05HIENBTENVTEFUSU9OLi4ucmVzaWR1YWw9IiA8PCBlcnJvcik7CisgICAgZXhpdCgwKTsKKyAgfQorfQorCisjZW5kaWYKZGlmZiAtTnVyIEJUTC0yMDAzMDEyNC9hY3Rpb25zL2FjdGlvbl9hdGFfcHJvZHVjdC5oaCBCVEwvYWN0aW9ucy9hY3Rpb25fYXRhX3Byb2R1Y3QuaGgKLS0tIEJUTC0yMDAzMDEyNC9hY3Rpb25zL2FjdGlvbl9hdGFfcHJvZHVjdC5oaAkyMDAyLTEyLTAyIDE0OjU4OjE0LjAwMDAwMDAwMCArMDEwMAorKysgQlRML2FjdGlvbnMvYWN0aW9uX2F0YV9wcm9kdWN0LmhoCTIwMDMtMTEtMTIgMTk6MTM6MDcuMDAwMDAwMDAwICswMTAwCkBAIC0xLDE0ICsxLDE0IEBACiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBGaWxlICAgOiAgYWN0aW9uX2F0YV9wcm9kdWN0LmhoCi0vLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPiAgICAgICAgCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgogLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoxOSBDRVNUIDIwMDIKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIAorLy8KIC8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIC8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgogLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0vLyAKKy8vCiAvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIC8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCkBAIC0xNiw3ICsxNiw3IEBACiAvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIC8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgotLy8gCisvLwogI2lmbmRlZiBBQ1RJT05fQVRBX1BST0RVQ1QKICNkZWZpbmUgQUNUSU9OX0FUQV9QUk9EVUNUCiAjaW5jbHVkZSAidXRpbGl0aWVzLmgiCkBAIC0yNiwxMDMgKzI2LDM5IEBACiAjaW5jbHVkZSAiaW5pdC9pbml0X3ZlY3Rvci5oaCIKICNpbmNsdWRlICJpbml0L2luaXRfbWF0cml4LmhoIgogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCiB0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+Ci1jbGFzcyBBY3Rpb25fYXRhX3Byb2R1Y3QgeworY2xhc3MgQWN0aW9uX2F0YV9wcm9kdWN0Cit7CisgIEFjdGlvbl9hdGFfcHJvZHVjdChjb25zdCAgQWN0aW9uX2F0YV9wcm9kdWN0ICYpOwogCiBwdWJsaWMgOgotCiAgIC8vIEN0b3IKLQotICBBY3Rpb25fYXRhX3Byb2R1Y3QoIGludCBzaXplICk6X3NpemUoc2l6ZSkKLSAgewotICAgIE1FU1NBR0UoIkFjdGlvbl9hdGFfcHJvZHVjdCBDdG9yIik7Ci0KLSAgICAvLyBTVEwgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KLQotICAgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KEFfc3RsLF9zaXplKTsKLSAgICBpbml0X21hdHJpeDxudWxsX2Z1bmN0aW9uPihYX3N0bCxfc2l6ZSk7Ci0gICAgaW5pdF9tYXRyaXg8bnVsbF9mdW5jdGlvbj4ocmVzdV9zdGwsX3NpemUpOwotCi0gICAgLy8gZ2VuZXJpYyBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgotCi0gICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQV9yZWYsQV9zdGwpOwotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFhfcmVmLFhfc3RsKTsKLQotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEEsQV9zdGwpOwotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFgsWF9zdGwpOwotCi0gIH0KLQotICAvLyBpbnZhbGlkYXRlIGNvcHkgY3RvcgotCi0gIEFjdGlvbl9hdGFfcHJvZHVjdCggY29uc3QgIEFjdGlvbl9hdGFfcHJvZHVjdCAmICkKLSAgewotICAgIElORk9TKCJpbGxlZ2FsIGNhbGwgdG8gQWN0aW9uX2F0YV9wcm9kdWN0IENvcHkgQ3RvciIpOwotICAgIGV4aXQoMCk7Ci0gIH0KKyAgQWN0aW9uX2F0YV9wcm9kdWN0KGludCBzaXplKTsKIAogICAvLyBEdG9yCisgIH5BY3Rpb25fYXRhX3Byb2R1Y3QoKTsKIAotICB+QWN0aW9uX2F0YV9wcm9kdWN0KCB2b2lkICl7Ci0KLSAgICBNRVNTQUdFKCJBY3Rpb25fYXRhX3Byb2R1Y3QgRHRvciIpOwotCi0gICAgLy8gZGVhbGxvY2F0aW9uCi0KLSAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEEsX3NpemUpOwotICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWCxfc2l6ZSk7Ci0KLSAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEFfcmVmLF9zaXplKTsKLSAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFhfcmVmLF9zaXplKTsKLQotICB9Ci0gIAogICAvLyBhY3Rpb24gbmFtZQotCi0gIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSggdm9pZCApCi0gIHsKLSAgICByZXR1cm4gImF0YV8iK0ludGVyZmFjZTo6bmFtZSgpOworICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoKSB7CisgICAgcmV0dXJuICJhdGFfIiArIEludGVyZmFjZTo6bmFtZSgpOwogICB9CiAKLSAgZG91YmxlIG5iX29wX2Jhc2UoIHZvaWQgKXsKKyAgZG91YmxlIG5iX29wX2Jhc2UoKSB7CiAgICAgcmV0dXJuIDIuMCpfc2l6ZSpfc2l6ZSpfc2l6ZTsKICAgfQogCi0gIGlubGluZSB2b2lkIGluaXRpYWxpemUoIHZvaWQgKXsKLQorICB2b2lkIGluaXRpYWxpemUoKSB7CiAgICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChBX3JlZixBLF9zaXplKTsKICAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KFhfcmVmLFgsX3NpemUpOwotICAgIAogICB9CiAKICAgaW5saW5lIHZvaWQgY2FsY3VsYXRlKCB2b2lkICkgewotCi0gICAgICBJbnRlcmZhY2U6OmF0YV9wcm9kdWN0KEEsWCxfc2l6ZSk7Ci0KKyAgICBJbnRlcmZhY2U6OmF0YV9wcm9kdWN0KEEsWCxfc2l6ZSk7CiAgIH0KIAotICB2b2lkIGNoZWNrX3Jlc3VsdCggdm9pZCApewotCi0gICAgLy8gY2FsY3VsYXRpb24gY2hlY2sKLQotICAgIEludGVyZmFjZTo6bWF0cml4X3RvX3N0bChYLHJlc3Vfc3RsKTsKLQotICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjphdGFfcHJvZHVjdChBX3N0bCxYX3N0bCxfc2l6ZSk7Ci0gICAgCi0gICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9Ci0gICAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKFhfc3RsLHJlc3Vfc3RsKTsKLSAKLSAgICBpZiAoZXJyb3I+MS5lLTYpewotICAgICAgSU5GT1MoIldST05HIENBTENVTEFUSU9OLi4ucmVzaWR1YWw9IiA8PCBlcnJvcik7ICAgICAgCi0gICAgICBleGl0KDApOwotICAgIH0KLQotICB9Ci0KLXByaXZhdGUgOiAKKyAgdm9pZCBjaGVja19yZXN1bHQoKTsKIAorcHJpdmF0ZSA6CiAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBBX3N0bDsKICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IFhfc3RsOwogICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggcmVzdV9zdGw7CkBAIC0xMzMsMTMgKzY5LDYwIEBACiAgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggQTsKICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX21hdHJpeCBYOwogCi0KICAgaW50IF9zaXplOwotCiB9OwotICAKIAotI2VuZGlmCiAKKy8qCisgKiBJbXBsZW1lbnRhdGlvbgorICovCit0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+CitBY3Rpb25fYXRhX3Byb2R1Y3Q8SW50ZXJmYWNlPjo6QWN0aW9uX2F0YV9wcm9kdWN0KGludCBzaXplKQorICA6IF9zaXplKHNpemUpCit7CisgIE1FU1NBR0UoIkFjdGlvbl9hdGFfcHJvZHVjdCBDdG9yIik7CisKKyAgLy8gU1RMIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCisgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KEFfc3RsLF9zaXplKTsKKyAgaW5pdF9tYXRyaXg8bnVsbF9mdW5jdGlvbj4oWF9zdGwsX3NpemUpOworICBpbml0X21hdHJpeDxudWxsX2Z1bmN0aW9uPihyZXN1X3N0bCxfc2l6ZSk7CisKKyAgLy8gZ2VuZXJpYyBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgorICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBX3JlZixBX3N0bCk7CisgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFhfcmVmLFhfc3RsKTsKKworICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBLEFfc3RsKTsKKyAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWCxYX3N0bCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KK0FjdGlvbl9hdGFfcHJvZHVjdDxJbnRlcmZhY2U+Ojp+QWN0aW9uX2F0YV9wcm9kdWN0KCkKK3sKKyAgTUVTU0FHRSgiQWN0aW9uX2F0YV9wcm9kdWN0IER0b3IiKTsKKworICAvLyBkZWFsbG9jYXRpb24KKyAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBLF9zaXplKTsKKyAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChYLF9zaXplKTsKKworICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEFfcmVmLF9zaXplKTsKKyAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChYX3JlZixfc2l6ZSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KK3ZvaWQgQWN0aW9uX2F0YV9wcm9kdWN0PEludGVyZmFjZT46OmNoZWNrX3Jlc3VsdCgpCit7CisgIC8vIGNhbGN1bGF0aW9uIGNoZWNrCisgIEludGVyZmFjZTo6bWF0cml4X3RvX3N0bChYLHJlc3Vfc3RsKTsKIAorICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6YXRhX3Byb2R1Y3QoQV9zdGwsWF9zdGwsX3NpemUpOwogCisgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIGVycm9yPQorICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+Ojpub3JtX2RpZmYoWF9zdGwscmVzdV9zdGwpOworCisgIGlmIChlcnJvcj4xLmUtNil7CisgICAgSU5GT1MoIldST05HIENBTENVTEFUSU9OLi4ucmVzaWR1YWw9IiA8PCBlcnJvcik7CisgICAgZXhpdCgwKTsKKyAgfQorfQorCisjZW5kaWYKZGlmZiAtTnVyIEJUTC0yMDAzMDEyNC9hY3Rpb25zL2FjdGlvbl9heHB5LmhoIEJUTC9hY3Rpb25zL2FjdGlvbl9heHB5LmhoCi0tLSBCVEwtMjAwMzAxMjQvYWN0aW9ucy9hY3Rpb25fYXhweS5oaAkyMDAzLTAxLTA4IDExOjExOjM1LjAwMDAwMDAwMCArMDEwMAorKysgQlRML2FjdGlvbnMvYWN0aW9uX2F4cHkuaGgJMjAwMy0xMS0xMiAxOTowNzo0NC4wMDAwMDAwMDAgKzAxMDAKQEAgLTEsMTQgKzEsMTQgQEAKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vIEZpbGUgICA6ICBhY3Rpb25fYXhweS5oaAotLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4gICAgICAgIAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KIC8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIGx1biBzZXAgMzAgMTQ6MjM6MTkgQ0VTVCAyMDAyCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyAKKy8vCiAvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKIC8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotLy8gCisvLwogLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQpAQCAtMTYsNyArMTYsNyBAQAogLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIC8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KLS8vIAorLy8KICNpZm5kZWYgQUNUSU9OX0FYUFkKICNkZWZpbmUgQUNUSU9OX0FYUFkKICNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKQEAgLTI2LDEwNiArMjYsMzkgQEAKICNpbmNsdWRlICJpbml0L2luaXRfdmVjdG9yLmhoIgogI2luY2x1ZGUgImluaXQvaW5pdF9tYXRyaXguaGgiCiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KIHRlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KLWNsYXNzIEFjdGlvbl9heHB5IHsKLQotcHVibGljIDoKK2NsYXNzIEFjdGlvbl9heHB5Cit7CisgIEFjdGlvbl9heHB5KGNvbnN0IEFjdGlvbl9heHB5ICYpOwogCitwdWJsaWM6CiAgIC8vIEN0b3IKLQotICBBY3Rpb25fYXhweSggaW50IHNpemUgKTpfc2l6ZShzaXplKSxfY29lZigxLjApCi0gIHsKLSAgICBNRVNTQUdFKCJBY3Rpb25fYXhweSBDdG9yIik7Ci0KLSAgICAvLyBTVEwgdmVjdG9yIGluaXRpYWxpemF0aW9uCi0KLSAgICBpbml0X3ZlY3Rvcjxwc2V1ZG9fcmFuZG9tPihYX3N0bCxfc2l6ZSk7Ci0gICAgaW5pdF92ZWN0b3I8cHNldWRvX3JhbmRvbT4oWV9zdGwsX3NpemUpOwotICAgIGluaXRfdmVjdG9yPG51bGxfZnVuY3Rpb24+KHJlc3Vfc3RsLF9zaXplKTsKLQotICAgIC8vIGdlbmVyaWMgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KLQotICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKFhfcmVmLFhfc3RsKTsKLSAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChZX3JlZixZX3N0bCk7Ci0KLSAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChYLFhfc3RsKTsKLSAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChZLFlfc3RsKTsKLSAgICAKLQotICB9Ci0KLSAgLy8gaW52YWxpZGF0ZSBjb3B5IGN0b3IKLQotICBBY3Rpb25fYXhweSggY29uc3QgIEFjdGlvbl9heHB5ICYgKQotICB7Ci0gICAgSU5GT1MoImlsbGVnYWwgY2FsbCB0byBBY3Rpb25fYXhweSBDb3B5IEN0b3IiKTsKLSAgICBleGl0KDApOwotICB9CisgIEFjdGlvbl9heHB5KGludCBzaXplKTsKIAogICAvLyBEdG9yCisgIH5BY3Rpb25fYXhweSgpOwogCi0gIH5BY3Rpb25fYXhweSggdm9pZCApewotCi0gICAgTUVTU0FHRSgiQWN0aW9uX2F4cHkgRHRvciIpOwotCi0gICAgLy8gZGVhbGxvY2F0aW9uCi0KLSAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKFhfcmVmKTsKLSAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKFlfcmVmKTsKLQotICAgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoWCk7Ci0gICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihZKTsKLQotCi0gIH0KLSAgCiAgIC8vIGFjdGlvbiBuYW1lCi0KLSAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCB2b2lkICkKLSAgewotICAgIHJldHVybiAiYXhweV8iK0ludGVyZmFjZTo6bmFtZSgpOworICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoKSB7CisgICAgcmV0dXJuICJheHB5XyIgKyBJbnRlcmZhY2U6Om5hbWUoKTsKICAgfQogCi0gIGRvdWJsZSBuYl9vcF9iYXNlKCB2b2lkICl7CisgIGRvdWJsZSBuYl9vcF9iYXNlKCkgewogICAgIHJldHVybiAyLjAqX3NpemU7CiAgIH0KIAotICBpbmxpbmUgdm9pZCBpbml0aWFsaXplKCB2b2lkICl7Ci0KKyAgdm9pZCBpbml0aWFsaXplKCkgewogICAgIEludGVyZmFjZTo6Y29weV92ZWN0b3IoWF9yZWYsWCxfc2l6ZSk7CiAgICAgSW50ZXJmYWNlOjpjb3B5X3ZlY3RvcihZX3JlZixZLF9zaXplKTsKLSAgICAKICAgfQogCi0gIGlubGluZSB2b2lkIGNhbGN1bGF0ZSggdm9pZCApIHsKLQotICAgICAgSW50ZXJmYWNlOjpheHB5KF9jb2VmLFgsWSxfc2l6ZSk7Ci0KKyAgdm9pZCBjYWxjdWxhdGUoKSB7CisgICAgSW50ZXJmYWNlOjpheHB5KF9jb2VmLFgsWSxfc2l6ZSk7CiAgIH0KIAorICB2b2lkIGNoZWNrX3Jlc3VsdCgpOwogCi0gIHZvaWQgY2hlY2tfcmVzdWx0KCB2b2lkICl7Ci0KLSAgICAvLyBjYWxjdWxhdGlvbiBjaGVjawotCi0gICAgSW50ZXJmYWNlOjp2ZWN0b3JfdG9fc3RsKFkscmVzdV9zdGwpOwotCi0gICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46OmF4cHkoX2NvZWYsWF9zdGwsWV9zdGwsX3NpemUpOwotICAgIAotICAgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIGVycm9yPQotICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihZX3N0bCxyZXN1X3N0bCk7Ci0gCi0gICAgaWYgKGVycm9yPjEuZS02KXsKLSAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOyAgICAgIAotICAgICAgZXhpdCgwKTsKLSAgICB9Ci0KLSAgfQotCi1wcml2YXRlIDogCi0KK3ByaXZhdGUgOgogICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF92ZWN0b3IgWF9zdGw7CiAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX3ZlY3RvciBZX3N0bDsKICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfdmVjdG9yIHJlc3Vfc3RsOwpAQCAtMTM5LDEzICs3Miw1OSBAQAogICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBfY29lZjsKIAogICBpbnQgX3NpemU7Cit9OwogCi0gIAogCi19OwotICAKKy8qCisgKiBJbXBsZW1lbnRhdGlvbgorICovCit0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+CitBY3Rpb25fYXhweTxJbnRlcmZhY2U+OjpBY3Rpb25fYXhweShpbnQgc2l6ZSkKKyAgOiBfY29lZigxLjApLCBfc2l6ZShzaXplKQoreworICBNRVNTQUdFKCJBY3Rpb25fYXhweSBDdG9yIik7CisKKyAgLy8gU1RMIHZlY3RvciBpbml0aWFsaXphdGlvbgorICBpbml0X3ZlY3Rvcjxwc2V1ZG9fcmFuZG9tPihYX3N0bCxfc2l6ZSk7CisgIGluaXRfdmVjdG9yPHBzZXVkb19yYW5kb20+KFlfc3RsLF9zaXplKTsKKyAgaW5pdF92ZWN0b3I8bnVsbF9mdW5jdGlvbj4ocmVzdV9zdGwsX3NpemUpOworCisgIC8vIGdlbmVyaWMgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKyAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoWF9yZWYsWF9zdGwpOworICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChZX3JlZixZX3N0bCk7CisKKyAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoWCxYX3N0bCk7CisgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKFksWV9zdGwpOworfQogCi0jZW5kaWYKK3RlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KK0FjdGlvbl9heHB5PEludGVyZmFjZT46On5BY3Rpb25fYXhweSgpCit7CisgIE1FU1NBR0UoIkFjdGlvbl9heHB5IER0b3IiKTsKKworICAvLyBkZWFsbG9jYXRpb24KKyAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihYX3JlZik7CisgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoWV9yZWYpOworCisgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoWCk7CisgIEludGVyZmFjZTo6ZnJlZV92ZWN0b3IoWSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KK3ZvaWQgQWN0aW9uX2F4cHk8SW50ZXJmYWNlPjo6Y2hlY2tfcmVzdWx0KCkKK3sKKyAgLy8gY2FsY3VsYXRpb24gY2hlY2sKKyAgSW50ZXJmYWNlOjp2ZWN0b3JfdG9fc3RsKFkscmVzdV9zdGwpOwogCisgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjpheHB5KF9jb2VmLFhfc3RsLFlfc3RsLF9zaXplKTsKIAorICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBlcnJvcj0KKyAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKFlfc3RsLHJlc3Vfc3RsKTsKIAorICBpZiAoZXJyb3I+MS5lLTYpeworICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOworICAgIGV4aXQoMCk7CisgIH0KK30KKworI2VuZGlmCmRpZmYgLU51ciBCVEwtMjAwMzAxMjQvYWN0aW9ucy9hY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0LmhoIEJUTC9hY3Rpb25zL2FjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QuaGgKLS0tIEJUTC0yMDAzMDEyNC9hY3Rpb25zL2FjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QuaGgJMjAwMi0xMi0wMiAxNDo1NzoyNy4wMDAwMDAwMDAgKzAxMDAKKysrIEJUTC9hY3Rpb25zL2FjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QuaGgJMjAwMy0xMS0xMiAxOTo0OToxMS4wMDAwMDAwMDAgKzAxMDAKQEAgLTEsMTQgKzEsMTQgQEAKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vIEZpbGUgICA6ICBhY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0LmhoCi0vLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPiAgICAgICAgCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgogLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoxOSBDRVNUIDIwMDIKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIAorLy8KIC8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIC8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgogLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0vLyAKKy8vCiAvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIC8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCkBAIC0xNiw3ICsxNiw3IEBACiAvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIC8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgotLy8gCisvLwogI2lmbmRlZiBBQ1RJT05fTUFUUklYX01BVFJJWF9QUk9EVUNUCiAjZGVmaW5lIEFDVElPTl9NQVRSSVhfTUFUUklYX1BST0RVQ1QKICNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKQEAgLTI2LDEwOSArMjYsNDAgQEAKICNpbmNsdWRlICJpbml0L2luaXRfdmVjdG9yLmhoIgogI2luY2x1ZGUgImluaXQvaW5pdF9tYXRyaXguaGgiCiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KIHRlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KLWNsYXNzIEFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QgewotCi1wdWJsaWMgOgorY2xhc3MgQWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdAoreworICBBY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0KGNvbnN0IEFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QgJik7CiAKK3B1YmxpYzoKICAgLy8gQ3RvcgotCi0gIEFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QoIGludCBzaXplICk6X3NpemUoc2l6ZSkKLSAgewotICAgIE1FU1NBR0UoIkFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QgQ3RvciIpOwotCi0gICAgLy8gU1RMIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCi0KLSAgICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihBX3N0bCxfc2l6ZSk7Ci0gICAgaW5pdF9tYXRyaXg8cHNldWRvX3JhbmRvbT4oQl9zdGwsX3NpemUpOwotICAgIGluaXRfbWF0cml4PG51bGxfZnVuY3Rpb24+KFhfc3RsLF9zaXplKTsKLSAgICBpbml0X21hdHJpeDxudWxsX2Z1bmN0aW9uPihyZXN1X3N0bCxfc2l6ZSk7Ci0KLSAgICAvLyBnZW5lcmljIG1hdHJpeCBhbmQgdmVjdG9yIGluaXRpYWxpemF0aW9uCi0KLSAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBX3JlZixBX3N0bCk7Ci0gICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQl9yZWYsQl9zdGwpOwotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFhfcmVmLFhfc3RsKTsKLQotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEEsQV9zdGwpOwotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEIsQl9zdGwpOwotICAgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKFgsWF9zdGwpOwotCi0gIH0KLQotICAvLyBpbnZhbGlkYXRlIGNvcHkgY3RvcgotCi0gIEFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QoIGNvbnN0ICBBY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0ICYgKQotICB7Ci0gICAgSU5GT1MoImlsbGVnYWwgY2FsbCB0byBBY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0IENvcHkgQ3RvciIpOwotICAgIGV4aXQoMCk7Ci0gIH0KKyAgQWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdChpbnQgc2l6ZSk7CiAKICAgLy8gRHRvcgorICB+QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdCgpOwogCi0gIH5BY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0KCB2b2lkICl7Ci0KLSAgICBNRVNTQUdFKCJBY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0IER0b3IiKTsKLQotICAgIC8vIGRlYWxsb2NhdGlvbgotCi0gICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBLF9zaXplKTsKLSAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEIsX3NpemUpOwotICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWCxfc2l6ZSk7Ci0KLSAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEFfcmVmLF9zaXplKTsKLSAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEJfcmVmLF9zaXplKTsKLSAgICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KFhfcmVmLF9zaXplKTsKLQotICB9Ci0gIAogICAvLyBhY3Rpb24gbmFtZQotCi0gIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSggdm9pZCApCi0gIHsKLSAgICByZXR1cm4gIm1hdHJpeF9tYXRyaXhfIitJbnRlcmZhY2U6Om5hbWUoKTsKKyAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCkgeworICAgIHJldHVybiAibWF0cml4X21hdHJpeF8iICsgSW50ZXJmYWNlOjpuYW1lKCk7CiAgIH0KIAotICBkb3VibGUgbmJfb3BfYmFzZSggdm9pZCApeworICBkb3VibGUgbmJfb3BfYmFzZSgpIHsKICAgICByZXR1cm4gMi4wKl9zaXplKl9zaXplKl9zaXplOwogICB9CiAKLSAgaW5saW5lIHZvaWQgaW5pdGlhbGl6ZSggdm9pZCApewotCisgIHZvaWQgaW5pdGlhbGl6ZSgpIHsKICAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KEFfcmVmLEEsX3NpemUpOwogICAgIEludGVyZmFjZTo6Y29weV9tYXRyaXgoQl9yZWYsQixfc2l6ZSk7CiAgICAgSW50ZXJmYWNlOjpjb3B5X21hdHJpeChYX3JlZixYLF9zaXplKTsKLSAgICAKICAgfQogCi0gIGlubGluZSB2b2lkIGNhbGN1bGF0ZSggdm9pZCApIHsKLQotICAgICAgSW50ZXJmYWNlOjptYXRyaXhfbWF0cml4X3Byb2R1Y3QoQSxCLFgsX3NpemUpOwotCisgIGlubGluZSB2b2lkIGNhbGN1bGF0ZSgpIHsKKyAgICBJbnRlcmZhY2U6Om1hdHJpeF9tYXRyaXhfcHJvZHVjdChBLEIsWCxfc2l6ZSk7CiAgIH0KIAotICB2b2lkIGNoZWNrX3Jlc3VsdCggdm9pZCApewotCi0gICAgLy8gY2FsY3VsYXRpb24gY2hlY2sKLQotICAgIEludGVyZmFjZTo6bWF0cml4X3RvX3N0bChYLHJlc3Vfc3RsKTsKLQotICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjptYXRyaXhfbWF0cml4X3Byb2R1Y3QoQV9zdGwsQl9zdGwsWF9zdGwsX3NpemUpOwotICAgIAotICAgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIGVycm9yPQotICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihYX3N0bCxyZXN1X3N0bCk7Ci0gCi0gICAgaWYgKGVycm9yPjEuZS02KXsKLSAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOyAgICAgIAotICAgICAgZXhpdCgwKTsKLSAgICB9Ci0KLSAgfQotCi1wcml2YXRlIDogCisgIHZvaWQgY2hlY2tfcmVzdWx0KCk7CiAKK3ByaXZhdGUgOgogICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF9tYXRyaXggQV9zdGw7CiAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBCX3N0bDsKICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfbWF0cml4IFhfc3RsOwpAQCAtMTQyLDEzICs3Myw2NiBAQAogICB0eXBlbmFtZSBJbnRlcmZhY2U6OmdlbmVfbWF0cml4IEI7CiAgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV9tYXRyaXggWDsKIAotCiAgIGludCBfc2l6ZTsKLQogfTsKLSAgCiAKLSNlbmRpZgogCisvKgorICogSW1wbGVtZW50YXRpb24KKyAqLwordGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlPgorQWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxJbnRlcmZhY2U+OjpBY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0KGludCBzaXplKQorICA6IF9zaXplKHNpemUpCit7CisgIE1FU1NBR0UoIkFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QgQ3RvciIpOworCisgIC8vIFNUTCBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgorICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihBX3N0bCxfc2l6ZSk7CisgIGluaXRfbWF0cml4PHBzZXVkb19yYW5kb20+KEJfc3RsLF9zaXplKTsKKyAgaW5pdF9tYXRyaXg8bnVsbF9mdW5jdGlvbj4oWF9zdGwsX3NpemUpOworICBpbml0X21hdHJpeDxudWxsX2Z1bmN0aW9uPihyZXN1X3N0bCxfc2l6ZSk7CisKKyAgLy8gZ2VuZXJpYyBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgorICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBX3JlZixBX3N0bCk7CisgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEJfcmVmLEJfc3RsKTsKKyAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWF9yZWYsWF9zdGwpOworCisgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEEsQV9zdGwpOworICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChCLEJfc3RsKTsKKyAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoWCxYX3N0bCk7Cit9CiAKK3RlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KK0FjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3Q8SW50ZXJmYWNlPjo6fkFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QoKQoreworICBNRVNTQUdFKCJBY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0IER0b3IiKTsKKworICAvLyBkZWFsbG9jYXRpb24KKyAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBLF9zaXplKTsKKyAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChCLF9zaXplKTsKKyAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChYLF9zaXplKTsKKworICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEFfcmVmLF9zaXplKTsKKyAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChCX3JlZixfc2l6ZSk7CisgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoWF9yZWYsX3NpemUpOwogCit9CisKK3RlbXBsYXRlPGNsYXNzIEludGVyZmFjZT4KK3ZvaWQgQWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdDxJbnRlcmZhY2U+OjpjaGVja19yZXN1bHQoKQoreworICAvLyBjYWxjdWxhdGlvbiBjaGVjaworICBJbnRlcmZhY2U6Om1hdHJpeF90b19zdGwoWCxyZXN1X3N0bCk7CisKKyAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om1hdHJpeF9tYXRyaXhfcHJvZHVjdChBX3N0bCxCX3N0bCxYX3N0bCxfc2l6ZSk7CisKKyAgdHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGUgZXJyb3I9CisgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihYX3N0bCxyZXN1X3N0bCk7CisKKyAgaWYgKGVycm9yPjEuZS02KXsKKyAgICBJTkZPUygiV1JPTkcgQ0FMQ1VMQVRJT04uLi5yZXNpZHVhbD0iIDw8IGVycm9yKTsKKyAgICBleGl0KDApOworICB9Cit9CisKKyNlbmRpZgpkaWZmIC1OdXIgQlRMLTIwMDMwMTI0L2FjdGlvbnMvYWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdC5oaCBCVEwvYWN0aW9ucy9hY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0LmhoCi0tLSBCVEwtMjAwMzAxMjQvYWN0aW9ucy9hY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0LmhoCTIwMDItMTItMDIgMTQ6NTg6NTcuMDAwMDAwMDAwICswMTAwCisrKyBCVEwvYWN0aW9ucy9hY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0LmhoCTIwMDMtMTEtMTIgMTk6MDg6NDUuMDAwMDAwMDAwICswMTAwCkBAIC0xLDE0ICsxLDE0IEBACiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBGaWxlICAgOiAgYWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdC5oaAotLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4gICAgICAgIAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KIC8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIGx1biBzZXAgMzAgMTQ6MjM6MTkgQ0VTVCAyMDAyCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyAKKy8vCiAvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKIC8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotLy8gCisvLwogLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQpAQCAtMTYsNyArMTYsNyBAQAogLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIC8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KLS8vIAorLy8KICNpZm5kZWYgQUNUSU9OX01BVFJJWF9WRUNUT1JfUFJPRFVDVAogI2RlZmluZSBBQ1RJT05fTUFUUklYX1ZFQ1RPUl9QUk9EVUNUCiAjaW5jbHVkZSAidXRpbGl0aWVzLmgiCkBAIC0yNiwxMDkgKzI2LDQwIEBACiAjaW5jbHVkZSAiaW5pdC9pbml0X3ZlY3Rvci5oaCIKICNpbmNsdWRlICJpbml0L2luaXRfbWF0cml4LmhoIgogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCiB0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+Ci1jbGFzcyBBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0IHsKK2NsYXNzIEFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QKK3sKKyAgQWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdChjb25zdCBBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0ICYpOwogCiBwdWJsaWMgOgotCiAgIC8vIEN0b3IKLQotICBBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0KCBpbnQgc2l6ZSApOl9zaXplKHNpemUpCi0gIHsKLSAgICBNRVNTQUdFKCJBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0IEN0b3IiKTsKLQotICAgIC8vIFNUTCBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgotCi0gICAgaW5pdF9tYXRyaXg8cHNldWRvX3JhbmRvbT4oQV9zdGwsX3NpemUpOwotICAgIGluaXRfdmVjdG9yPHBzZXVkb19yYW5kb20+KEJfc3RsLF9zaXplKTsKLSAgICBpbml0X3ZlY3RvcjxudWxsX2Z1bmN0aW9uPihYX3N0bCxfc2l6ZSk7Ci0gICAgaW5pdF92ZWN0b3I8bnVsbF9mdW5jdGlvbj4ocmVzdV9zdGwsX3NpemUpOwotCi0gICAgLy8gZ2VuZXJpYyBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgotCi0gICAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQV9yZWYsQV9zdGwpOwotICAgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKEJfcmVmLEJfc3RsKTsKLSAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChYX3JlZixYX3N0bCk7Ci0KLSAgICBJbnRlcmZhY2U6Om1hdHJpeF9mcm9tX3N0bChBLEFfc3RsKTsKLSAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChCLEJfc3RsKTsKLSAgICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChYLFhfc3RsKTsKLQotICB9Ci0KLSAgLy8gaW52YWxpZGF0ZSBjb3B5IGN0b3IKLQotICBBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0KCBjb25zdCAgQWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdCAmICkKLSAgewotICAgIElORk9TKCJpbGxlZ2FsIGNhbGwgdG8gQWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdCBDb3B5IEN0b3IiKTsKLSAgICBleGl0KDApOwotICB9CisgIEFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QoaW50IHNpemUpOwogCiAgIC8vIER0b3IKKyAgfkFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QoKTsKIAotICB+QWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdCggdm9pZCApewotCi0gICAgTUVTU0FHRSgiQWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdCBEdG9yIik7Ci0KLSAgICAvLyBkZWFsbG9jYXRpb24KLQotICAgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQSxfc2l6ZSk7Ci0gICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihCKTsKLSAgICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKFgpOwotCi0gICAgSW50ZXJmYWNlOjpmcmVlX21hdHJpeChBX3JlZixfc2l6ZSk7Ci0gICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihCX3JlZik7Ci0gICAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihYX3JlZik7Ci0KLSAgfQotICAKICAgLy8gYWN0aW9uIG5hbWUKLQotICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoIHZvaWQgKQotICB7Ci0gICAgcmV0dXJuICJtYXRyaXhfdmVjdG9yXyIrSW50ZXJmYWNlOjpuYW1lKCk7CisgIHN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgbmFtZSgpIHsKKyAgICByZXR1cm4gIm1hdHJpeF92ZWN0b3JfIiArIEludGVyZmFjZTo6bmFtZSgpOwogICB9CiAKLSAgZG91YmxlIG5iX29wX2Jhc2UoIHZvaWQgKXsKKyAgZG91YmxlIG5iX29wX2Jhc2UoKXsKICAgICByZXR1cm4gMi4wKl9zaXplKl9zaXplOwogICB9CiAKLSAgaW5saW5lIHZvaWQgaW5pdGlhbGl6ZSggdm9pZCApewotCisgIHZvaWQgaW5pdGlhbGl6ZSgpIHsKICAgICBJbnRlcmZhY2U6OmNvcHlfbWF0cml4KEFfcmVmLEEsX3NpemUpOwogICAgIEludGVyZmFjZTo6Y29weV92ZWN0b3IoQl9yZWYsQixfc2l6ZSk7CiAgICAgSW50ZXJmYWNlOjpjb3B5X3ZlY3RvcihYX3JlZixYLF9zaXplKTsKLSAgICAKLSAgfQotCi0gIGlubGluZSB2b2lkIGNhbGN1bGF0ZSggdm9pZCApIHsKLQotICAgICAgSW50ZXJmYWNlOjptYXRyaXhfdmVjdG9yX3Byb2R1Y3QoQSxCLFgsX3NpemUpOwotCiAgIH0KIAotICB2b2lkIGNoZWNrX3Jlc3VsdCggdm9pZCApewotCi0gICAgLy8gY2FsY3VsYXRpb24gY2hlY2sKLQotICAgIEludGVyZmFjZTo6dmVjdG9yX3RvX3N0bChYLHJlc3Vfc3RsKTsKLQotICAgIFNUTF9pbnRlcmZhY2U8dHlwZW5hbWUgSW50ZXJmYWNlOjpyZWFsX3R5cGU+OjptYXRyaXhfdmVjdG9yX3Byb2R1Y3QoQV9zdGwsQl9zdGwsWF9zdGwsX3NpemUpOwotICAgIAotICAgIHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlIGVycm9yPQotICAgICAgU1RMX2ludGVyZmFjZTx0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZT46Om5vcm1fZGlmZihYX3N0bCxyZXN1X3N0bCk7Ci0gCi0gICAgaWYgKGVycm9yPjEuZS02KXsKLSAgICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOyAgICAgIAotICAgICAgZXhpdCgwKTsKLSAgICB9Ci0KKyAgaW5saW5lIHZvaWQgY2FsY3VsYXRlKCkgeworICAgIEludGVyZmFjZTo6bWF0cml4X3ZlY3Rvcl9wcm9kdWN0KEEsQixYLF9zaXplKTsKICAgfQogCi1wcml2YXRlIDogCisgIHZvaWQgY2hlY2tfcmVzdWx0KCk7CiAKK3ByaXZhdGU6CiAgIHR5cGVuYW1lIEludGVyZmFjZTo6c3RsX21hdHJpeCBBX3N0bDsKICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpzdGxfdmVjdG9yIEJfc3RsOwogICB0eXBlbmFtZSBJbnRlcmZhY2U6OnN0bF92ZWN0b3IgWF9zdGw7CkBAIC0xNDIsMTMgKzczLDcxIEBACiAgIHR5cGVuYW1lIEludGVyZmFjZTo6Z2VuZV92ZWN0b3IgQjsKICAgdHlwZW5hbWUgSW50ZXJmYWNlOjpnZW5lX3ZlY3RvciBYOwogCi0KICAgaW50IF9zaXplOwotCiB9OwotICAKIAotI2VuZGlmCiAKKy8qCisgKiBJbXBsZW1lbnRhdGlvbgorICovCit0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+CitBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PEludGVyZmFjZT46OkFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QoIGludCBzaXplICkKKyAgOiBfc2l6ZShzaXplKQoreworICBNRVNTQUdFKCJBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0IEN0b3IiKTsKKworICAvLyBTVEwgbWF0cml4IGFuZCB2ZWN0b3IgaW5pdGlhbGl6YXRpb24KKworICBpbml0X21hdHJpeDxwc2V1ZG9fcmFuZG9tPihBX3N0bCxfc2l6ZSk7CisgIGluaXRfdmVjdG9yPHBzZXVkb19yYW5kb20+KEJfc3RsLF9zaXplKTsKKyAgaW5pdF92ZWN0b3I8bnVsbF9mdW5jdGlvbj4oWF9zdGwsX3NpemUpOworICBpbml0X3ZlY3RvcjxudWxsX2Z1bmN0aW9uPihyZXN1X3N0bCxfc2l6ZSk7CisKKyAgLy8gZ2VuZXJpYyBtYXRyaXggYW5kIHZlY3RvciBpbml0aWFsaXphdGlvbgorCisgIEludGVyZmFjZTo6bWF0cml4X2Zyb21fc3RsKEFfcmVmLEFfc3RsKTsKKyAgSW50ZXJmYWNlOjp2ZWN0b3JfZnJvbV9zdGwoQl9yZWYsQl9zdGwpOworICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChYX3JlZixYX3N0bCk7CisKKyAgSW50ZXJmYWNlOjptYXRyaXhfZnJvbV9zdGwoQSxBX3N0bCk7CisgIEludGVyZmFjZTo6dmVjdG9yX2Zyb21fc3RsKEIsQl9zdGwpOworICBJbnRlcmZhY2U6OnZlY3Rvcl9mcm9tX3N0bChYLFhfc3RsKTsKKworfQorCit0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2U+CitBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PEludGVyZmFjZT46On5BY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0KCkKK3sKKworICBNRVNTQUdFKCJBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0IER0b3IiKTsKKworICAvLyBkZWFsbG9jYXRpb24KKworICBJbnRlcmZhY2U6OmZyZWVfbWF0cml4KEEsX3NpemUpOworICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKEIpOworICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKFgpOworCisgIEludGVyZmFjZTo6ZnJlZV9tYXRyaXgoQV9yZWYsX3NpemUpOworICBJbnRlcmZhY2U6OmZyZWVfdmVjdG9yKEJfcmVmKTsKKyAgSW50ZXJmYWNlOjpmcmVlX3ZlY3RvcihYX3JlZik7CisKK30KKwordGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlPgordm9pZCBBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0PEludGVyZmFjZT46OmNoZWNrX3Jlc3VsdCgpCit7CisgIC8vIGNhbGN1bGF0aW9uIGNoZWNrCisgIEludGVyZmFjZTo6dmVjdG9yX3RvX3N0bChYLHJlc3Vfc3RsKTsKKworICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bWF0cml4X3ZlY3Rvcl9wcm9kdWN0KEFfc3RsLEJfc3RsLFhfc3RsLF9zaXplKTsKKworICB0eXBlbmFtZSBJbnRlcmZhY2U6OnJlYWxfdHlwZSBlcnJvcj0KKyAgICBTVExfaW50ZXJmYWNlPHR5cGVuYW1lIEludGVyZmFjZTo6cmVhbF90eXBlPjo6bm9ybV9kaWZmKFhfc3RsLHJlc3Vfc3RsKTsKIAorICBpZiAoZXJyb3I+MS5lLTYpeworICAgIElORk9TKCJXUk9ORyBDQUxDVUxBVElPTi4uLnJlc2lkdWFsPSIgPDwgZXJyb3IpOworICAgIGV4aXQoMCk7CisgIH0KK30KIAorI2VuZGlmCmRpZmYgLU51ciBCVEwtMjAwMzAxMjQvZGF0YS9hYXQuaGggQlRML2RhdGEvYWF0LmhoCi0tLSBCVEwtMjAwMzAxMjQvZGF0YS9hYXQuaGgJMjAwMi0xMi0wNCAxNTowNjowOC4wMDAwMDAwMDAgKzAxMDAKKysrIEJUTC9kYXRhL2FhdC5oaAkyMDAzLTEyLTA3IDE5OjMxOjI3LjAwMDAwMDAwMCArMDEwMApAQCAtMSwyMSArMSwyMSBAQAogIyEvdXNyL2Jpbi9nbnVwbG90IC1wZXJzaXN0CiAjCi0jICAgIAorIwogIyAgICAJRyBOIFUgUCBMIE8gVAogIyAgICAJTGludXggdmVyc2lvbiAzLjcKICMgICAgCXBhdGNobGV2ZWwgMAogIyAgICAJbGFzdCBtb2RpZmllZCBUaHUgSmFuIDE0IDE5OjM0OjUzIEJTVCAxOTk5Ci0jICAgIAorIwogIyAgICAJQ29weXJpZ2h0KEMpIDE5ODYgLSAxOTkzLCAxOTk4LCAxOTk5CiAjICAgIAlUaG9tYXMgV2lsbGlhbXMsIENvbGluIEtlbGxleSBhbmQgbWFueSBvdGhlcnMKLSMgICAgCisjCiAjICAgIAlUeXBlIGBoZWxwYCB0byBhY2Nlc3MgdGhlIG9uLWxpbmUgcmVmZXJlbmNlIG1hbnVhbAogIyAgICAJVGhlIGdudXBsb3QgRkFRIGlzIGF2YWlsYWJsZSBmcm9tCiAjICAgIAkJPGh0dHA6Ly93d3cudW5pLWthcmxzcnVoZS5kZS9+aWcyNS9nbnVwbG90LWZhcS8+Ci0jICAgIAorIwogIyAgICAJU2VuZCBjb21tZW50cyBhbmQgcmVxdWVzdHMgZm9yIGhlbHAgdG8gPGluZm8tZ251cGxvdEBkYXJ0bW91dGguZWR1PgogIyAgICAJU2VuZCBidWdzLCBzdWdnZXN0aW9ucyBhbmQgbW9kcyB0byA8YnVnLWdudXBsb3RAZGFydG1vdXRoLmVkdT4KLSMgICAgCisjCiAjIHNldCB0ZXJtaW5hbCBwb3N0c2NyaXB0IGxhbmRzY2FwZSBub2VuaGFuY2VkIG1vbm9jaHJvbWUgZGFzaGVkIGRlZmF1bHRwbGV4ICJIZWx2ZXRpY2EiIDE0CiAjIHNldCBvdXRwdXQgJ2JlbmNoX2djYy5wcycKIHNldCBub2NsaXAgcG9pbnRzCkBAIC03Niw5ICs3Niw5IEBACiBzZXQgbXl0aWNzIGRlZmF1bHQKIHNldCBteDJ0aWNzIGRlZmF1bHQKIHNldCBteTJ0aWNzIGRlZmF1bHQKLXNldCB4dGljcyBib3JkZXIgbWlycm9yIG5vcm90YXRlIGF1dG9mcmVxIAotc2V0IHl0aWNzIGJvcmRlciBtaXJyb3Igbm9yb3RhdGUgYXV0b2ZyZXEgCi1zZXQgenRpY3MgYm9yZGVyIG5vbWlycm9yIG5vcm90YXRlIGF1dG9mcmVxIAorc2V0IHh0aWNzIGJvcmRlciBtaXJyb3Igbm9yb3RhdGUgYXV0b2ZyZXEKK3NldCB5dGljcyBib3JkZXIgbWlycm9yIG5vcm90YXRlIGF1dG9mcmVxCitzZXQgenRpY3MgYm9yZGVyIG5vbWlycm9yIG5vcm90YXRlIGF1dG9mcmVxCiBzZXQgbm94MnRpY3MKIHNldCBub3kydGljcwogc2V0IHRpdGxlICJBIHggQXQgcHJvZHVjdCAiIDAuMDAwMDAwLDAuMDAwMDAwICAiIgpAQCAtMTA0LDUgKzEwNCw1IEBACiBzZXQgcm1hcmdpbiAtMQogc2V0IHRtYXJnaW4gLTEKIHNldCBsb2NhbGUgIkMiCi1zZXQgeHJhbmdlIFsxMDoxMDAwXQorc2V0IHhyYW5nZSBbMToxMDBdCiAjI3NldCB5cmFuZ2UgWzA6NDAwXQpkaWZmIC1OdXIgQlRMLTIwMDMwMTI0L2RhdGEvYXRhLmhoIEJUTC9kYXRhL2F0YS5oaAotLS0gQlRMLTIwMDMwMTI0L2RhdGEvYXRhLmhoCTIwMDItMTItMDQgMTU6MDY6MDguMDAwMDAwMDAwICswMTAwCisrKyBCVEwvZGF0YS9hdGEuaGgJMjAwMy0xMi0wNyAxOTozMTozNi4wMDAwMDAwMDAgKzAxMDAKQEAgLTEsMjEgKzEsMjEgQEAKICMhL3Vzci9iaW4vZ251cGxvdCAtcGVyc2lzdAogIwotIyAgICAKKyMKICMgICAgCUcgTiBVIFAgTCBPIFQKICMgICAgCUxpbnV4IHZlcnNpb24gMy43CiAjICAgIAlwYXRjaGxldmVsIDAKICMgICAgCWxhc3QgbW9kaWZpZWQgVGh1IEphbiAxNCAxOTozNDo1MyBCU1QgMTk5OQotIyAgICAKKyMKICMgICAgCUNvcHlyaWdodChDKSAxOTg2IC0gMTk5MywgMTk5OCwgMTk5OQogIyAgICAJVGhvbWFzIFdpbGxpYW1zLCBDb2xpbiBLZWxsZXkgYW5kIG1hbnkgb3RoZXJzCi0jICAgIAorIwogIyAgICAJVHlwZSBgaGVscGAgdG8gYWNjZXNzIHRoZSBvbi1saW5lIHJlZmVyZW5jZSBtYW51YWwKICMgICAgCVRoZSBnbnVwbG90IEZBUSBpcyBhdmFpbGFibGUgZnJvbQogIyAgICAJCTxodHRwOi8vd3d3LnVuaS1rYXJsc3J1aGUuZGUvfmlnMjUvZ251cGxvdC1mYXEvPgotIyAgICAKKyMKICMgICAgCVNlbmQgY29tbWVudHMgYW5kIHJlcXVlc3RzIGZvciBoZWxwIHRvIDxpbmZvLWdudXBsb3RAZGFydG1vdXRoLmVkdT4KICMgICAgCVNlbmQgYnVncywgc3VnZ2VzdGlvbnMgYW5kIG1vZHMgdG8gPGJ1Zy1nbnVwbG90QGRhcnRtb3V0aC5lZHU+Ci0jICAgIAorIwogIyBzZXQgdGVybWluYWwgcG9zdHNjcmlwdCBsYW5kc2NhcGUgbm9lbmhhbmNlZCBtb25vY2hyb21lIGRhc2hlZCBkZWZhdWx0cGxleCAiSGVsdmV0aWNhIiAxNAogIyBzZXQgb3V0cHV0ICdiZW5jaF9nY2MucHMnCiBzZXQgbm9jbGlwIHBvaW50cwpAQCAtNzYsOSArNzYsOSBAQAogc2V0IG15dGljcyBkZWZhdWx0CiBzZXQgbXgydGljcyBkZWZhdWx0CiBzZXQgbXkydGljcyBkZWZhdWx0Ci1zZXQgeHRpY3MgYm9yZGVyIG1pcnJvciBub3JvdGF0ZSBhdXRvZnJlcSAKLXNldCB5dGljcyBib3JkZXIgbWlycm9yIG5vcm90YXRlIGF1dG9mcmVxIAotc2V0IHp0aWNzIGJvcmRlciBub21pcnJvciBub3JvdGF0ZSBhdXRvZnJlcSAKK3NldCB4dGljcyBib3JkZXIgbWlycm9yIG5vcm90YXRlIGF1dG9mcmVxCitzZXQgeXRpY3MgYm9yZGVyIG1pcnJvciBub3JvdGF0ZSBhdXRvZnJlcQorc2V0IHp0aWNzIGJvcmRlciBub21pcnJvciBub3JvdGF0ZSBhdXRvZnJlcQogc2V0IG5veDJ0aWNzCiBzZXQgbm95MnRpY3MKIHNldCB0aXRsZSAiQXQgeCBBIHByb2R1Y3QgIiAwLjAwMDAwMCwwLjAwMDAwMCAgIiIKQEAgLTEwNCw1ICsxMDQsNSBAQAogc2V0IHJtYXJnaW4gLTEKIHNldCB0bWFyZ2luIC0xCiBzZXQgbG9jYWxlICJDIgotc2V0IHhyYW5nZSBbMTA6MTAwMF0KK3NldCB4cmFuZ2UgWzE6MTAwXQogIyNzZXQgeXJhbmdlIFswOjQwMF0KZGlmZiAtTnVyIEJUTC0yMDAzMDEyNC9kYXRhL2F4cHkuaGggQlRML2RhdGEvYXhweS5oaAotLS0gQlRMLTIwMDMwMTI0L2RhdGEvYXhweS5oaAkyMDAzLTAxLTA2IDExOjA3OjExLjAwMDAwMDAwMCArMDEwMAorKysgQlRML2RhdGEvYXhweS5oaAkyMDAzLTExLTE1IDA3OjA2OjQ2LjAwMDAwMDAwMCArMDEwMApAQCAtMSwyMSArMSwyMSBAQAogIyEvdXNyL2Jpbi9nbnVwbG90IC1wZXJzaXN0CiAjCi0jICAgIAorIwogIyAgICAJRyBOIFUgUCBMIE8gVAogIyAgICAJTGludXggdmVyc2lvbiAzLjcKICMgICAgCXBhdGNobGV2ZWwgMAogIyAgICAJbGFzdCBtb2RpZmllZCBUaHUgSmFuIDE0IDE5OjM0OjUzIEJTVCAxOTk5Ci0jICAgIAorIwogIyAgICAJQ29weXJpZ2h0KEMpIDE5ODYgLSAxOTkzLCAxOTk4LCAxOTk5CiAjICAgIAlUaG9tYXMgV2lsbGlhbXMsIENvbGluIEtlbGxleSBhbmQgbWFueSBvdGhlcnMKLSMgICAgCisjCiAjICAgIAlUeXBlIGBoZWxwYCB0byBhY2Nlc3MgdGhlIG9uLWxpbmUgcmVmZXJlbmNlIG1hbnVhbAogIyAgICAJVGhlIGdudXBsb3QgRkFRIGlzIGF2YWlsYWJsZSBmcm9tCiAjICAgIAkJPGh0dHA6Ly93d3cudW5pLWthcmxzcnVoZS5kZS9+aWcyNS9nbnVwbG90LWZhcS8+Ci0jICAgIAorIwogIyAgICAJU2VuZCBjb21tZW50cyBhbmQgcmVxdWVzdHMgZm9yIGhlbHAgdG8gPGluZm8tZ251cGxvdEBkYXJ0bW91dGguZWR1PgogIyAgICAJU2VuZCBidWdzLCBzdWdnZXN0aW9ucyBhbmQgbW9kcyB0byA8YnVnLWdudXBsb3RAZGFydG1vdXRoLmVkdT4KLSMgICAgCisjCiAjIHNldCB0ZXJtaW5hbCBwb3N0c2NyaXB0IGxhbmRzY2FwZSBub2VuaGFuY2VkIG1vbm9jaHJvbWUgZGFzaGVkIGRlZmF1bHRwbGV4ICJIZWx2ZXRpY2EiIDE0CiAjIHNldCBvdXRwdXQgJ2JlbmNoX2djYy5wcycKIHNldCBub2NsaXAgcG9pbnRzCkBAIC03Niw5ICs3Niw5IEBACiBzZXQgbXl0aWNzIGRlZmF1bHQKIHNldCBteDJ0aWNzIGRlZmF1bHQKIHNldCBteTJ0aWNzIGRlZmF1bHQKLXNldCB4dGljcyBib3JkZXIgbWlycm9yIG5vcm90YXRlIGF1dG9mcmVxIAotc2V0IHl0aWNzIGJvcmRlciBtaXJyb3Igbm9yb3RhdGUgYXV0b2ZyZXEgCi1zZXQgenRpY3MgYm9yZGVyIG5vbWlycm9yIG5vcm90YXRlIGF1dG9mcmVxIAorc2V0IHh0aWNzIGJvcmRlciBtaXJyb3Igbm9yb3RhdGUgYXV0b2ZyZXEKK3NldCB5dGljcyBib3JkZXIgbWlycm9yIG5vcm90YXRlIGF1dG9mcmVxCitzZXQgenRpY3MgYm9yZGVyIG5vbWlycm9yIG5vcm90YXRlIGF1dG9mcmVxCiBzZXQgbm94MnRpY3MKIHNldCBub3kydGljcwogc2V0IHRpdGxlICJZKz1hbHBoYSpYICIgMC4wMDAwMDAsMC4wMDAwMDAgICIiCkBAIC0xMDQsNSArMTA0LDUgQEAKIHNldCBybWFyZ2luIC0xCiBzZXQgdG1hcmdpbiAtMQogc2V0IGxvY2FsZSAiQyIKLXNldCB4cmFuZ2UgWzE6MTAwMDAwMF0KK3NldCB4cmFuZ2UgWzE6MTAwXQogIyNzZXQgeXJhbmdlIFswOjU1MF0KZGlmZiAtTnVyIEJUTC0yMDAzMDEyNC9kYXRhL21hdHJpeF9tYXRyaXguaGggQlRML2RhdGEvbWF0cml4X21hdHJpeC5oaAotLS0gQlRMLTIwMDMwMTI0L2RhdGEvbWF0cml4X21hdHJpeC5oaAkyMDAzLTAxLTA2IDExOjA4OjM4LjAwMDAwMDAwMCArMDEwMAorKysgQlRML2RhdGEvbWF0cml4X21hdHJpeC5oaAkyMDAzLTExLTE1IDA3OjA2OjE2LjAwMDAwMDAwMCArMDEwMApAQCAtMSwyMSArMSwyMSBAQAogIyEvdXNyL2Jpbi9nbnVwbG90IC1wZXJzaXN0CiAjCi0jICAgIAorIwogIyAgICAJRyBOIFUgUCBMIE8gVAogIyAgICAJTGludXggdmVyc2lvbiAzLjcKICMgICAgCXBhdGNobGV2ZWwgMAogIyAgICAJbGFzdCBtb2RpZmllZCBUaHUgSmFuIDE0IDE5OjM0OjUzIEJTVCAxOTk5Ci0jICAgIAorIwogIyAgICAJQ29weXJpZ2h0KEMpIDE5ODYgLSAxOTkzLCAxOTk4LCAxOTk5CiAjICAgIAlUaG9tYXMgV2lsbGlhbXMsIENvbGluIEtlbGxleSBhbmQgbWFueSBvdGhlcnMKLSMgICAgCisjCiAjICAgIAlUeXBlIGBoZWxwYCB0byBhY2Nlc3MgdGhlIG9uLWxpbmUgcmVmZXJlbmNlIG1hbnVhbAogIyAgICAJVGhlIGdudXBsb3QgRkFRIGlzIGF2YWlsYWJsZSBmcm9tCiAjICAgIAkJPGh0dHA6Ly93d3cudW5pLWthcmxzcnVoZS5kZS9+aWcyNS9nbnVwbG90LWZhcS8+Ci0jICAgIAorIwogIyAgICAJU2VuZCBjb21tZW50cyBhbmQgcmVxdWVzdHMgZm9yIGhlbHAgdG8gPGluZm8tZ251cGxvdEBkYXJ0bW91dGguZWR1PgogIyAgICAJU2VuZCBidWdzLCBzdWdnZXN0aW9ucyBhbmQgbW9kcyB0byA8YnVnLWdudXBsb3RAZGFydG1vdXRoLmVkdT4KLSMgICAgCisjCiAjIHNldCB0ZXJtaW5hbCBwb3N0c2NyaXB0IGxhbmRzY2FwZSBub2VuaGFuY2VkIG1vbm9jaHJvbWUgZGFzaGVkIGRlZmF1bHRwbGV4ICJIZWx2ZXRpY2EiIDE0CiAjIHNldCBvdXRwdXQgJ2JlbmNoX2djYy5wcycKIHNldCBub2NsaXAgcG9pbnRzCkBAIC03Niw5ICs3Niw5IEBACiBzZXQgbXl0aWNzIGRlZmF1bHQKIHNldCBteDJ0aWNzIGRlZmF1bHQKIHNldCBteTJ0aWNzIGRlZmF1bHQKLXNldCB4dGljcyBib3JkZXIgbWlycm9yIG5vcm90YXRlIGF1dG9mcmVxIAotc2V0IHl0aWNzIGJvcmRlciBtaXJyb3Igbm9yb3RhdGUgYXV0b2ZyZXEgCi1zZXQgenRpY3MgYm9yZGVyIG5vbWlycm9yIG5vcm90YXRlIGF1dG9mcmVxIAorc2V0IHh0aWNzIGJvcmRlciBtaXJyb3Igbm9yb3RhdGUgYXV0b2ZyZXEKK3NldCB5dGljcyBib3JkZXIgbWlycm9yIG5vcm90YXRlIGF1dG9mcmVxCitzZXQgenRpY3MgYm9yZGVyIG5vbWlycm9yIG5vcm90YXRlIGF1dG9mcmVxCiBzZXQgbm94MnRpY3MKIHNldCBub3kydGljcwogc2V0IHRpdGxlICJtYXRyaXggbWF0cml4IHByb2R1Y3QgIiAwLjAwMDAwMCwwLjAwMDAwMCAgIiIKQEAgLTEwNCw1ICsxMDQsNSBAQAogc2V0IHJtYXJnaW4gLTEKIHNldCB0bWFyZ2luIC0xCiBzZXQgbG9jYWxlICJDIgotc2V0IHhyYW5nZSBbMToxMDAwXQorc2V0IHhyYW5nZSBbMToxMDBdCiAjI3NldCB5cmFuZ2UgWzA6NDAwXQpkaWZmIC1OdXIgQlRMLTIwMDMwMTI0L2RhdGEvbWF0cml4X3ZlY3Rvci5oaCBCVEwvZGF0YS9tYXRyaXhfdmVjdG9yLmhoCi0tLSBCVEwtMjAwMzAxMjQvZGF0YS9tYXRyaXhfdmVjdG9yLmhoCTIwMDMtMDEtMDYgMTE6MDg6MjkuMDAwMDAwMDAwICswMTAwCisrKyBCVEwvZGF0YS9tYXRyaXhfdmVjdG9yLmhoCTIwMDMtMTEtMTUgMDc6MDY6MjQuMDAwMDAwMDAwICswMTAwCkBAIC0xLDIxICsxLDIxIEBACiAjIS91c3IvYmluL2dudXBsb3QgLXBlcnNpc3QKICMKLSMgICAgCisjCiAjICAgIAlHIE4gVSBQIEwgTyBUCiAjICAgIAlMaW51eCB2ZXJzaW9uIDMuNwogIyAgICAJcGF0Y2hsZXZlbCAwCiAjICAgIAlsYXN0IG1vZGlmaWVkIFRodSBKYW4gMTQgMTk6MzQ6NTMgQlNUIDE5OTkKLSMgICAgCisjCiAjICAgIAlDb3B5cmlnaHQoQykgMTk4NiAtIDE5OTMsIDE5OTgsIDE5OTkKICMgICAgCVRob21hcyBXaWxsaWFtcywgQ29saW4gS2VsbGV5IGFuZCBtYW55IG90aGVycwotIyAgICAKKyMKICMgICAgCVR5cGUgYGhlbHBgIHRvIGFjY2VzcyB0aGUgb24tbGluZSByZWZlcmVuY2UgbWFudWFsCiAjICAgIAlUaGUgZ251cGxvdCBGQVEgaXMgYXZhaWxhYmxlIGZyb20KICMgICAgCQk8aHR0cDovL3d3dy51bmkta2FybHNydWhlLmRlL35pZzI1L2dudXBsb3QtZmFxLz4KLSMgICAgCisjCiAjICAgIAlTZW5kIGNvbW1lbnRzIGFuZCByZXF1ZXN0cyBmb3IgaGVscCB0byA8aW5mby1nbnVwbG90QGRhcnRtb3V0aC5lZHU+CiAjICAgIAlTZW5kIGJ1Z3MsIHN1Z2dlc3Rpb25zIGFuZCBtb2RzIHRvIDxidWctZ251cGxvdEBkYXJ0bW91dGguZWR1PgotIyAgICAKKyMKICMgc2V0IHRlcm1pbmFsIHBvc3RzY3JpcHQgbGFuZHNjYXBlIG5vZW5oYW5jZWQgbW9ub2Nocm9tZSBkYXNoZWQgZGVmYXVsdHBsZXggIkhlbHZldGljYSIgMTQKICMgc2V0IG91dHB1dCAnYmVuY2hfZ2NjLnBzJwogc2V0IG5vY2xpcCBwb2ludHMKQEAgLTc2LDkgKzc2LDkgQEAKIHNldCBteXRpY3MgZGVmYXVsdAogc2V0IG14MnRpY3MgZGVmYXVsdAogc2V0IG15MnRpY3MgZGVmYXVsdAotc2V0IHh0aWNzIGJvcmRlciBtaXJyb3Igbm9yb3RhdGUgYXV0b2ZyZXEgCi1zZXQgeXRpY3MgYm9yZGVyIG1pcnJvciBub3JvdGF0ZSBhdXRvZnJlcSAKLXNldCB6dGljcyBib3JkZXIgbm9taXJyb3Igbm9yb3RhdGUgYXV0b2ZyZXEgCitzZXQgeHRpY3MgYm9yZGVyIG1pcnJvciBub3JvdGF0ZSBhdXRvZnJlcQorc2V0IHl0aWNzIGJvcmRlciBtaXJyb3Igbm9yb3RhdGUgYXV0b2ZyZXEKK3NldCB6dGljcyBib3JkZXIgbm9taXJyb3Igbm9yb3RhdGUgYXV0b2ZyZXEKIHNldCBub3gydGljcwogc2V0IG5veTJ0aWNzCiBzZXQgdGl0bGUgIm1hdHJpeCB2ZWN0b3IgcHJvZHVjdCAiIDAuMDAwMDAwLDAuMDAwMDAwICAiIgpAQCAtMTA0LDUgKzEwNCw1IEBACiBzZXQgcm1hcmdpbiAtMQogc2V0IHRtYXJnaW4gLTEKIHNldCBsb2NhbGUgIkMiCi1zZXQgeHJhbmdlIFsxOjEwMDBdCitzZXQgeHJhbmdlIFsxOjEwMF0KICMjc2V0IHlyYW5nZSBbMDo0MDBdCmRpZmYgLU51ciBCVEwtMjAwMzAxMjQvZGF0YS9ta19nbnVwbG90X3NjcmlwdC5zaCBCVEwvZGF0YS9ta19nbnVwbG90X3NjcmlwdC5zaAotLS0gQlRMLTIwMDMwMTI0L2RhdGEvbWtfZ251cGxvdF9zY3JpcHQuc2gJMjAwMy0wMS0xMCAxMTo1MjowMS4wMDAwMDAwMDAgKzAxMDAKKysrIEJUTC9kYXRhL21rX2dudXBsb3Rfc2NyaXB0LnNoCTIwMDMtMTEtMzAgMTQ6NTY6NDkuMDAwMDAwMDAwICswMTAwCkBAIC0yNiw4ICsyNiw4IEBACiBCQVNFPSR7TEFTVCMjKi99IDsgQkFTRT0ke0ZJTEUjIyovfSA7IEFWQU5UPWJlbmNoXyR7V0hBVH1fIDsgUkVEVUM9JHtCQVNFIyMqJEFWQU5UfSA7IFRJVExFPSR7UkVEVUMlLmRhdH0KIGVjaG8gIiciJExBU1QiJyIgdGl0bGUgIiciJFRJVExFIiciID4+ICAkV0hBVC5nbnVwbG90CiAKLSNlY2hvIHNldCB0ZXJtIHBvc3RzY3JpcHQgY29sb3IgPj4gJFdIQVQuZ251cGxvdAotI2VjaG8gc2V0IG91dHB1dCAiJyIkV0hBVC5wcyInIiA+PiAkV0hBVC5nbnVwbG90CitlY2hvIHNldCB0ZXJtIHBvc3RzY3JpcHQgY29sb3IgPj4gJFdIQVQuZ251cGxvdAorZWNobyBzZXQgb3V0cHV0ICInIiRXSEFULnBzIiciID4+ICRXSEFULmdudXBsb3QKIGVjaG8gc2V0IHRlcm0gcGJtIHNtYWxsIGNvbG9yID4+ICRXSEFULmdudXBsb3QKIGVjaG8gc2V0IG91dHB1dCAiJyIkV0hBVC5wcG0iJyIgPj4gJFdIQVQuZ251cGxvdAogZWNobyBwbG90IFxcID4+ICRXSEFULmdudXBsb3QKQEAgLTYyLDcgKzYyLDMgQEAKIGdudXBsb3QgLXBlcnNpc3QgPCAkV0hBVC5nbnVwbG90CiAKIHJtICRXSEFULmdudXBsb3QKLQotCi0KLQpkaWZmIC1OdXIgQlRMLTIwMDMwMTI0L2RhdGEvbWtfbWVhbl9zY3JpcHQuc2ggQlRML2RhdGEvbWtfbWVhbl9zY3JpcHQuc2gKLS0tIEJUTC0yMDAzMDEyNC9kYXRhL21rX21lYW5fc2NyaXB0LnNoCTIwMDMtMDEtMjEgMTY6NTc6NTMuMDAwMDAwMDAwICswMTAwCisrKyBCVEwvZGF0YS9ta19tZWFuX3NjcmlwdC5zaAkyMDAzLTExLTMwIDE1OjEwOjAxLjAwMDAwMDAwMCArMDEwMApAQCAtMTAsNyArMTAsNyBAQAogbWtkaXIgJFdPUktfRElSCiAKIERBVEFfRklMRT1gZmluZCAkRElSIC1uYW1lICIqLmRhdCIgfCBncmVwIF8ke1dIQVR9YAotZWNobyAKK2VjaG8KIGZvciBGSUxFIGluICREQVRBX0ZJTEUKIGRvCiAgICAgICAgICMjZWNobyBoZWxsbyB3b3JsZApAQCAtMTksNyArMTksNyBAQAogCiAJIyNlY2hvICJta19tZWFuX3NjcmlwdDEiICR7VElUTEV9CiAJY3AgJEZJTEUgJHtXT1JLX0RJUn0vJHtUSVRMRX0KLQkKKwogZG9uZQogCiBjZCAkV09SS19ESVIKQEAgLTI5LDExICsyOSwzIEBACiBjZCAuLgogCiBybSAtUiAkV09SS19ESVIKLQotCi0KLQotCi0KLQotCmRpZmYgLU51ciBCVEwtMjAwMzAxMjQvZGF0YS9ta19uZXdfZ251cGxvdC5zaCBCVEwvZGF0YS9ta19uZXdfZ251cGxvdC5zaAotLS0gQlRMLTIwMDMwMTI0L2RhdGEvbWtfbmV3X2dudXBsb3Quc2gJMjAwMy0wMS0xMCAxMjowMjo1OC4wMDAwMDAwMDAgKzAxMDAKKysrIEJUTC9kYXRhL21rX25ld19nbnVwbG90LnNoCTIwMDMtMTEtMzAgMTU6NTg6MDkuMDAwMDAwMDAwICswMTAwCkBAIC01LDYgKzUsNyBAQAogCiBEQVRBX0ZJTEU9YGNhdCAuLi9vcmRlcl9saWJgCiAKK2VjaG8gc2V0IGdyaWQgeHRpY3MgeXRpY3MgbXh0aWNzIG15dGljcyA+PiAkV0hBVC5nbnVwbG90CiBlY2hvIHBsb3QgXFwgPj4gJFdIQVQuZ251cGxvdAogCiBmb3IgRklMRSBpbiAkREFUQV9GSUxFCkBAIC0xMiw3ICsxMywyMSBAQAogICAgIExBU1Q9JEZJTEUKIGRvbmUKIAorIyBHVUkgcGxvdAorZm9yIEZJTEUgaW4gJERBVEFfRklMRQorZG8KKyAgICAgaWYgWyAkRklMRSAhPSAkTEFTVCBdCisgICAgIHRoZW4KKwllY2hvICInIiRGSUxFIiciICIsXFwiID4+ICAkV0hBVC5nbnVwbG90CisgICAgIGZpCitkb25lCitlY2hvICInIiRMQVNUIiciID4+ICAkV0hBVC5nbnVwbG90CiAKKyMgcG9zdHNjcmlwdCBwbG90CitlY2hvIHNldCBzaXplIDIsMS40MTIgPj4gJFdIQVQuZ251cGxvdAorZWNobyBzZXQgdGVybWluYWwgcG9zdHNjcmlwdCBlcHMgY29sb3IgXCJBcmlhbFwiIDI0ID4+ICRXSEFULmdudXBsb3QKK2VjaG8gc2V0IG91dHB1dCAiJyIuLi8ke0RJUn0vJFdIQVQuZXBzIiciID4+ICRXSEFULmdudXBsb3QKK2VjaG8gcGxvdCBcXCA+PiAkV0hBVC5nbnVwbG90CiBmb3IgRklMRSBpbiAkREFUQV9GSUxFCiBkbwogICAgICBpZiBbICRGSUxFICE9ICRMQVNUIF0KQEAgLTIyLDEwICszNyw5IEBACiBkb25lCiBlY2hvICInIiRMQVNUIiciID4+ICAkV0hBVC5nbnVwbG90CiAKLWVjaG8gc2V0IHRlcm0gcG9zdHNjcmlwdCBjb2xvciA+PiAkV0hBVC5nbnVwbG90Ci1lY2hvIHNldCBvdXRwdXQgIiciLi4vJHtESVJ9LyRXSEFULnBzIiciID4+ICRXSEFULmdudXBsb3QKLSNlY2hvIHNldCB0ZXJtIHBibSBjb2xvciA+PiAkV0hBVC5nbnVwbG90Ci0jZWNobyBzZXQgb3V0cHV0ICInIi4uLyR7RElSfS8kV0hBVC5wcG0iJyIgPj4gJFdIQVQuZ251cGxvdAorIyBwbmcgcGxvdAorZWNobyBzZXQgdGVybWluYWwgcG5nIHNtYWxsIGNvbG9yID4+ICRXSEFULmdudXBsb3QKK2VjaG8gc2V0IG91dHB1dCAiJyIuLi8ke0RJUn0vJFdIQVQucG5nIiciID4+ICRXSEFULmdudXBsb3QKIGVjaG8gcGxvdCBcXCA+PiAkV0hBVC5nbnVwbG90CiBmb3IgRklMRSBpbiAkREFUQV9GSUxFCiBkbwpAQCAtMzksNyArNTMsMyBAQAogZ251cGxvdCAtcGVyc2lzdCA8ICRXSEFULmdudXBsb3QKIAogcm0gJFdIQVQuZ251cGxvdAotCi0KLQotCmRpZmYgLU51ciBCVEwtMjAwMzAxMjQvZGF0YS9vcmRlcl9saWIgQlRML2RhdGEvb3JkZXJfbGliCi0tLSBCVEwtMjAwMzAxMjQvZGF0YS9vcmRlcl9saWIJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKKysrIEJUTC9kYXRhL29yZGVyX2xpYgkyMDAzLTEyLTA3IDE5OjMxOjQ0LjAwMDAwMDAwMCArMDEwMApAQCAtMCwwICsxLDcgQEAKK0FUTEFTCitDCit1YmxhcworZjc3Cit0dm1ldAorU1RMCitibGl0egpkaWZmIC1OdXIgQlRMLTIwMDMwMTI0L2dlbmVyaWNfYmVuY2gvYmVuY2guaGggQlRML2dlbmVyaWNfYmVuY2gvYmVuY2guaGgKLS0tIEJUTC0yMDAzMDEyNC9nZW5lcmljX2JlbmNoL2JlbmNoLmhoCTIwMDMtMDMtMDggMjI6NDA6MjMuMDAwMDAwMDAwICswMTAwCisrKyBCVEwvZ2VuZXJpY19iZW5jaC9iZW5jaC5oaAkyMDAzLTExLTEyIDE5OjU3OjI3LjAwMDAwMDAwMCArMDEwMApAQCAtMSwxNCArMSwxNCBAQAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gRmlsZSAgIDogIGJlbmNoLmhoCi0vLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPiAgICAgICAgCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgogLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoxNiBDRVNUIDIwMDIKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIAorLy8KIC8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIC8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgogLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0vLyAKKy8vCiAvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIC8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCkBAIC0xNiw3ICsxNiw3IEBACiAvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIC8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgotLy8gCisvLwogI2lmbmRlZiBCRU5DSF9ISAogI2RlZmluZSBCRU5DSF9ISAogI2luY2x1ZGUgImJlbmNoX3BhcmFtZXRlci5oaCIKQEAgLTMxLDU4ICszMSw0NyBAQAogLy8jaW5jbHVkZSAidGltZXJzL3g4Nl9wZXJmX2FuYWx5emVyLmhoIgogLy8jaW5jbHVkZSAidGltZXJzL1NUTF9wZXJmX2FuYWx5emVyLmhoIgogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi10ZW1wbGF0ZSA8dGVtcGxhdGU8Y2xhc3M+IGNsYXNzIFBlcmZfQW5hbHl6ZXIsIGNsYXNzIEFjdGlvbj4KLXZvaWQgYmVuY2goIGludCBzaXplX21pbiwgaW50IHNpemVfbWF4LCBpbnQgbmJfcG9pbnQgKXsKLQotICAvLyBiZW5jaCBuYW1lIAotICAKLSAgc3RyaW5nIGZpbGVuYW1lPSJiZW5jaF8iK0FjdGlvbjo6bmFtZSgpKyIuZGF0IjsKK3RlbXBsYXRlIDwKKyAgdGVtcGxhdGU8Y2xhc3M+IGNsYXNzIFBlcmZfQW5hbHl6ZXIsCisgIGNsYXNzIEFjdGlvbgorPgordm9pZCBiZW5jaChpbnQgc2l6ZV9taW4sIGludCBzaXplX21heCwgaW50IG5iX3BvaW50KSB7CisgIC8vIGJlbmNoIG5hbWUKKyAgc3RkOjpzdHJpbmcgZmlsZW5hbWU9ImJlbmNoXyIgKyBBY3Rpb246Om5hbWUoKSArICIuZGF0IjsKIAogICBJTkZPUygic3RhcnRpbmcgIiA8PGZpbGVuYW1lKTsKIAotICAvLyB1dGlsaXRpZXMgCi0gIAorICAvLyB1dGlsaXRpZXMKICAgc3RkOjp2ZWN0b3I8ZG91YmxlPiB0YWJfbWZsb3BzKG5iX3BvaW50KTsKICAgc3RkOjp2ZWN0b3I8aW50PiB0YWJfc2l6ZXMobmJfcG9pbnQpOwogCiAgIC8vIG1hdHJpY2VzIGFuZCB2ZWN0b3Igc2l6ZSBjYWxjdWxhdGlvbnMKLQotICBzaXplX2xpbl9sb2cobmJfcG9pbnQsc2l6ZV9taW4sc2l6ZV9tYXgsdGFiX3NpemVzKTsKKyAgc2l6ZV9saW5fbG9nKG5iX3BvaW50LCBzaXplX21pbiwgc2l6ZV9tYXgsIHRhYl9zaXplcyk7CiAKICAgLy8gbG9vcCBvbiBtYXRyaXggc2l6ZQotCiAgIFBlcmZfQW5hbHl6ZXI8QWN0aW9uPiBwZXJmX2FjdGlvbjsKIAotICBmb3IgKGludCBpPW5iX3BvaW50LTE7aT49MDtpLS0pewotCisgIGZvciAoaW50IGkgPSBuYl9wb2ludC0xOyBpID49IDA7IGktLSkgewogICAgIElORk9TKCJzaXplPSIgPDx0YWJfc2l6ZXNbaV08PCIgICAoIjw8bmJfcG9pbnQtaTw8Ii8iPDxuYl9wb2ludDw8IikiKTsKICAgICB0YWJfbWZsb3BzW2ldPSBwZXJmX2FjdGlvbi5ldmFsX21mbG9wcyh0YWJfc2l6ZXNbaV0pOwotCiAgIH0KIAogICAvLyBkdW1wIHRoZSByZXN1bHQgaW4gYSBmaWxlICA6Ci0KICAgZHVtcF9maWxlX3hfeSh0YWJfc2l6ZXMsdGFiX21mbG9wcyxmaWxlbmFtZSk7Ci0KIH0KIAogLy8gZGVmYXVsdCBQZXJmIEFuYWx5emVyCi0KIHRlbXBsYXRlIDxjbGFzcyBBY3Rpb24+Ci12b2lkIGJlbmNoKCBpbnQgc2l6ZV9taW4sIGludCBzaXplX21heCwgaW50IG5iX3BvaW50ICl7Cit2b2lkIGJlbmNoKGludCBzaXplX21pbiwgaW50IHNpemVfbWF4LCBpbnQgbmJfcG9pbnQpIHsKIAogICAvLyBpZiB0aGUgcmR0c2MgaXMgbm90IGF2YWlsYWJsZSA6Ci0gIGJlbmNoPFBvcnRhYmxlX1BlcmZfQW5hbHl6ZXIsQWN0aW9uPihzaXplX21pbixzaXplX21heCxuYl9wb2ludCk7CisgIGJlbmNoPFBvcnRhYmxlX1BlcmZfQW5hbHl6ZXIsQWN0aW9uPihzaXplX21pbiwgc2l6ZV9tYXgsIG5iX3BvaW50KTsKICAgLy8gaWYgdGhlIHJkdHNjIGlzIGF2YWlsYWJsZSA6Ci0gIC8vICBiZW5jaDxNaXhlZF9QZXJmX0FuYWx5emVyLEFjdGlvbj4oc2l6ZV9taW4sc2l6ZV9tYXgsbmJfcG9pbnQpOwotCisgIC8vIGJlbmNoPE1peGVkX1BlcmZfQW5hbHl6ZXIsQWN0aW9uPihzaXplX21pbixzaXplX21heCxuYl9wb2ludCk7CiAKICAgLy8gT25seSBmb3Igc21hbGwgcHJvYmxlbSBzaXplLiBPdGhlcndpemUgaXQgd2lsbCBiZSB0b28gbG9uZwotICAvL2JlbmNoPFg4Nl9QZXJmX0FuYWx5emVyLEFjdGlvbj4oc2l6ZV9taW4sc2l6ZV9tYXgsbmJfcG9pbnQpOwotICAvL2JlbmNoPFNUTF9QZXJmX0FuYWx5emVyLEFjdGlvbj4oc2l6ZV9taW4sc2l6ZV9tYXgsbmJfcG9pbnQpOwotCisgIC8vIGJlbmNoPFg4Nl9QZXJmX0FuYWx5emVyLEFjdGlvbj4oc2l6ZV9taW4sc2l6ZV9tYXgsbmJfcG9pbnQpOworICAvLyBiZW5jaDxTVExfUGVyZl9BbmFseXplcixBY3Rpb24+KHNpemVfbWluLHNpemVfbWF4LG5iX3BvaW50KTsKIH0KIAogI2VuZGlmCmRpZmYgLU51ciBCVEwtMjAwMzAxMjQvZ2VuZXJpY19iZW5jaC9iZW5jaC5oaH4gQlRML2dlbmVyaWNfYmVuY2gvYmVuY2guaGh+Ci0tLSBCVEwtMjAwMzAxMjQvZ2VuZXJpY19iZW5jaC9iZW5jaC5oaH4JMjAwMy0wMy0xMyAxNTozNjoxOS4wMDAwMDAwMDAgKzAxMDAKKysrIEJUTC9nZW5lcmljX2JlbmNoL2JlbmNoLmhofgkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAwMCArMDEwMApAQCAtMSw4OCArMCwwIEBACi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBGaWxlICAgOiAgYmVuY2guaGgKLS8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+ICAgICAgICAKLS8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIGx1biBzZXAgMzAgMTQ6MjM6MTYgQ0VTVCAyMDAyCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyAKLS8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLS8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0vLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0vLyAKLS8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLS8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgotLy8gCi0jaWZuZGVmIEJFTkNIX0hICi0jZGVmaW5lIEJFTkNIX0hICi0jaW5jbHVkZSAiYmVuY2hfcGFyYW1ldGVyLmhoIgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgInV0aWxpdGllcy5oIgotI2luY2x1ZGUgInNpemVfbGluX2xvZy5oaCIKLSNpbmNsdWRlICJkdW1wX2ZpbGVfeF95LmhoIgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSAidGltZXJzL3BvcnRhYmxlX3BlcmZfYW5hbHl6ZXIuaGgiCi0jaW5jbHVkZSAidGltZXJzL21peGVkX3BlcmZfYW5hbHl6ZXIuaGgiCi0jaW5jbHVkZSAidGltZXJzL3g4Nl9wZXJmX2FuYWx5emVyLmhoIgotI2luY2x1ZGUgInRpbWVycy9TVExfcGVyZl9hbmFseXplci5oaCIKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotdGVtcGxhdGUgPHRlbXBsYXRlPGNsYXNzPiBjbGFzcyBQZXJmX0FuYWx5emVyLCBjbGFzcyBBY3Rpb24+Ci12b2lkIGJlbmNoKCBpbnQgc2l6ZV9taW4sIGludCBzaXplX21heCwgaW50IG5iX3BvaW50ICl7Ci0KLSAgLy8gYmVuY2ggbmFtZSAKLSAgCi0gIHN0cmluZyBmaWxlbmFtZT0iYmVuY2hfIitBY3Rpb246Om5hbWUoKSsiLmRhdCI7Ci0KLSAgSU5GT1MoInN0YXJ0aW5nICIgPDxmaWxlbmFtZSk7Ci0KLSAgLy8gdXRpbGl0aWVzIAotICAKLSAgc3RkOjp2ZWN0b3I8ZG91YmxlPiB0YWJfbWZsb3BzKG5iX3BvaW50KTsKLSAgc3RkOjp2ZWN0b3I8aW50PiB0YWJfc2l6ZXMobmJfcG9pbnQpOwotCi0gIC8vIG1hdHJpY2VzIGFuZCB2ZWN0b3Igc2l6ZSBjYWxjdWxhdGlvbnMKLQotICBzaXplX2xpbl9sb2cobmJfcG9pbnQsc2l6ZV9taW4sc2l6ZV9tYXgsdGFiX3NpemVzKTsKLQotICAvLyBsb29wIG9uIG1hdHJpeCBzaXplCi0KLSAgUGVyZl9BbmFseXplcjxBY3Rpb24+IHBlcmZfYWN0aW9uOwotCi0gIGZvciAoaW50IGk9bmJfcG9pbnQtMTtpPj0wO2ktLSl7Ci0KLSAgICBJTkZPUygic2l6ZT0iIDw8dGFiX3NpemVzW2ldPDwiICAgKCI8PG5iX3BvaW50LWk8PCIvIjw8bmJfcG9pbnQ8PCIpIik7Ci0gICAgdGFiX21mbG9wc1tpXT0gcGVyZl9hY3Rpb24uZXZhbF9tZmxvcHModGFiX3NpemVzW2ldKTsKLQotICB9Ci0KLSAgLy8gZHVtcCB0aGUgcmVzdWx0IGluIGEgZmlsZSAgOgotCi0gIGR1bXBfZmlsZV94X3kodGFiX3NpemVzLHRhYl9tZmxvcHMsZmlsZW5hbWUpOwotCi19Ci0KLS8vIGRlZmF1bHQgUGVyZiBBbmFseXplcgotCi10ZW1wbGF0ZSA8Y2xhc3MgQWN0aW9uPgotdm9pZCBiZW5jaCggaW50IHNpemVfbWluLCBpbnQgc2l6ZV9tYXgsIGludCBuYl9wb2ludCApewotCi0gIC8vIGlmIHRoZSByZHRzYyBpcyBub3QgYXZhaWxhYmxlIDoKLSAgLy9iZW5jaDxQb3J0YWJsZV9QZXJmX0FuYWx5emVyLEFjdGlvbj4oc2l6ZV9taW4sc2l6ZV9tYXgsbmJfcG9pbnQpOwotICAvLyBpZiB0aGUgcmR0c2MgaXMgYXZhaWxhYmxlIDoKLSAgYmVuY2g8TWl4ZWRfUGVyZl9BbmFseXplcixBY3Rpb24+KHNpemVfbWluLHNpemVfbWF4LG5iX3BvaW50KTsKLQotCi0gIC8vIE9ubHkgZm9yIHNtYWxsIHByb2JsZW0gc2l6ZS4gT3RoZXJ3aXplIGl0IHdpbGwgYmUgdG9vIGxvbmcKLSAgLy9iZW5jaDxYODZfUGVyZl9BbmFseXplcixBY3Rpb24+KHNpemVfbWluLHNpemVfbWF4LG5iX3BvaW50KTsKLSAgLy9iZW5jaDxTVExfUGVyZl9BbmFseXplcixBY3Rpb24+KHNpemVfbWluLHNpemVfbWF4LG5iX3BvaW50KTsKLQotfQotCi0jZW5kaWYKZGlmZiAtTnVyIEJUTC0yMDAzMDEyNC9nZW5lcmljX2JlbmNoL2JlbmNoX3BhcmFtZXRlci5oaCBCVEwvZ2VuZXJpY19iZW5jaC9iZW5jaF9wYXJhbWV0ZXIuaGgKLS0tIEJUTC0yMDAzMDEyNC9nZW5lcmljX2JlbmNoL2JlbmNoX3BhcmFtZXRlci5oaAkyMDAzLTAzLTE3IDE0OjQyOjM3LjAwMDAwMDAwMCArMDEwMAorKysgQlRML2dlbmVyaWNfYmVuY2gvYmVuY2hfcGFyYW1ldGVyLmhoCTIwMDMtMTEtMTMgMjE6Mzc6MTIuMDAwMDAwMDAwICswMTAwCkBAIC0xLDE0ICsxLDE0IEBACiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBGaWxlICAgOiAgYmVuY2hfcGFyYW1ldGVyLmhoCi0vLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPiAgICAgICAgCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgogLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoxNiBDRVNUIDIwMDIKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIAorLy8KIC8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIC8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgogLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0vLyAKKy8vCiAvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIC8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCkBAIC0xNiwzNCArMTYsMzQgQEAKIC8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0vLyAKKy8vCiAjaWZuZGVmIEJFTkNIX1BBUkFNRVRFUl9ISAogI2RlZmluZSBCRU5DSF9QQVJBTUVURVJfSEgKIAogLy8gbWluaW1hbCB0aW1lIGZvciBlYWNoIG1lYXN1cmVtZW50CiAjZGVmaW5lIFJFQUxfVFlQRSBkb3VibGUKIC8vIG1pbmltYWwgdGltZSBmb3IgZWFjaCBtZWFzdXJlbWVudAotI2RlZmluZSBNSU5fVElNRSAyLjAgCisjZGVmaW5lIE1JTl9USU1FIDIuMAogLy8gbmIgb2YgcG9pbnQgb24gYmVuY2ggY3VydmVzCi0jZGVmaW5lIE5CX1BPSU5UIDEwMAorI2RlZmluZSBOQl9QT0lOVCAyMAogLy8gbWluIHZlY3RvciBzaXplIGZvciBheHB5IGJlbmNoCiAjZGVmaW5lIE1JTl9BWFBZIDIwCiAvLyBtYXggdmVjdG9yIHNpemUgZm9yIGF4cHkgYmVuY2gKLSNkZWZpbmUgTUFYX0FYUFkgMTAwMDAwMAorI2RlZmluZSBNQVhfQVhQWSAxMDAKIC8vIG1pbiBtYXRyaXggc2l6ZSBmb3IgbWF0cml4IHZlY3RvciBwcm9kdWN0IGJlbmNoCi0jZGVmaW5lIE1JTl9NViAxMAorI2RlZmluZSBNSU5fTVYgMQogLy8gbWF4IG1hdHJpeCBzaXplIGZvciBtYXRyaXggdmVjdG9yIHByb2R1Y3QgYmVuY2gKLSNkZWZpbmUgTUFYX01WIDEwMDAKKyNkZWZpbmUgTUFYX01WIDEwMAogLy8gbWluIG1hdHJpeCBzaXplIGZvciBtYXRyaXggbWF0cml4IHByb2R1Y3QgYmVuY2gKLSNkZWZpbmUgTUlOX01NIDEwCisjZGVmaW5lIE1JTl9NTSAxCiAvLyBtYXggbWF0cml4IHNpemUgZm9yIG1hdHJpeCBtYXRyaXggcHJvZHVjdCBiZW5jaAotI2RlZmluZSBNQVhfTU0gMTAwMAorI2RlZmluZSBNQVhfTU0gMTAwCiAvLyBtaW4gbWF0cml4IHNpemUgZm9yIExVIGJlbmNoCi0jZGVmaW5lIE1JTl9MVSAxMAorI2RlZmluZSBNSU5fTFUgMQogLy8gbWF4IG1hdHJpeCBzaXplIGZvciBMVSBiZW5jaAotI2RlZmluZSBNQVhfTFUgMTAwMAorI2RlZmluZSBNQVhfTFUgMTAwCiAvLyBtYXggc2l6ZSBmb3IgdGlueSB2ZWN0b3IgYW5kIG1hdHJpeAotI2RlZmluZSBUSU5ZX01WX01BWF9TSVpFIDUKKyNkZWZpbmUgVElOWV9NVl9NQVhfU0laRSAxMAogLy8gZGVmYXVsdCBuYl9zYW1wbGUgZm9yIHg4NiB0aW1lcgogI2RlZmluZSBERUZBVUxUX05CX1NBTVBMRSAxMDAwCiAKZGlmZiAtTnVyIEJUTC0yMDAzMDEyNC9nZW5lcmljX2JlbmNoL2JlbmNoX3BhcmFtZXRlci5oaH4gQlRML2dlbmVyaWNfYmVuY2gvYmVuY2hfcGFyYW1ldGVyLmhofgotLS0gQlRMLTIwMDMwMTI0L2dlbmVyaWNfYmVuY2gvYmVuY2hfcGFyYW1ldGVyLmhofgkyMDAzLTAzLTA4IDIyOjM5OjUyLjAwMDAwMDAwMCArMDEwMAorKysgQlRML2dlbmVyaWNfYmVuY2gvYmVuY2hfcGFyYW1ldGVyLmhofgkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAwMCArMDEwMApAQCAtMSw1MiArMCwwIEBACi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBGaWxlICAgOiAgYmVuY2hfcGFyYW1ldGVyLmhoCi0vLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPiAgICAgICAgCi0vLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjE2IENFU1QgMjAwMgotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gCi0vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLS8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotLy8gCi0vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0vLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLS8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KLS8vIAotI2lmbmRlZiBCRU5DSF9QQVJBTUVURVJfSEgKLSNkZWZpbmUgQkVOQ0hfUEFSQU1FVEVSX0hICi0KLS8vIG1pbmltYWwgdGltZSBmb3IgZWFjaCBtZWFzdXJlbWVudAotI2RlZmluZSBSRUFMX1RZUEUgZG91YmxlCi0vLyBtaW5pbWFsIHRpbWUgZm9yIGVhY2ggbWVhc3VyZW1lbnQKLSNkZWZpbmUgTUlOX1RJTUUgMi4wIAotLy8gbmIgb2YgcG9pbnQgb24gYmVuY2ggY3VydmVzCi0jZGVmaW5lIE5CX1BPSU5UIDEwMAotLy8gbWluIHZlY3RvciBzaXplIGZvciBheHB5IGJlbmNoCi0jZGVmaW5lIE1JTl9BWFBZIDIwCi0vLyBtYXggdmVjdG9yIHNpemUgZm9yIGF4cHkgYmVuY2gKLSNkZWZpbmUgTUFYX0FYUFkgMTAwMDAwMAotLy8gbWluIG1hdHJpeCBzaXplIGZvciBtYXRyaXggdmVjdG9yIHByb2R1Y3QgYmVuY2gKLSNkZWZpbmUgTUlOX01WIDEwCi0vLyBtYXggbWF0cml4IHNpemUgZm9yIG1hdHJpeCB2ZWN0b3IgcHJvZHVjdCBiZW5jaAotI2RlZmluZSBNQVhfTVYgMTAwMAotLy8gbWluIG1hdHJpeCBzaXplIGZvciBtYXRyaXggbWF0cml4IHByb2R1Y3QgYmVuY2gKLSNkZWZpbmUgTUlOX01NIDEwCi0vLyBtYXggbWF0cml4IHNpemUgZm9yIG1hdHJpeCBtYXRyaXggcHJvZHVjdCBiZW5jaAotI2RlZmluZSBNQVhfTU0gMTAwMAotLy8gbWluIG1hdHJpeCBzaXplIGZvciBMVSBiZW5jaAotI2RlZmluZSBNSU5fTFUgMTAKLS8vIG1heCBtYXRyaXggc2l6ZSBmb3IgTFUgYmVuY2gKLSNkZWZpbmUgTUFYX0xVIDEwMDAKLS8vIG1heCBzaXplIGZvciB0aW55IHZlY3RvciBhbmQgbWF0cml4Ci0jZGVmaW5lIFRJTllfTVZfTUFYX1NJWkUgMTAKLS8vIGRlZmF1bHQgbmJfc2FtcGxlIGZvciB4ODYgdGltZXIKLSNkZWZpbmUgREVGQVVMVF9OQl9TQU1QTEUgMTAwMAotCi0KLQotI2VuZGlmCmRpZmYgLU51ciBCVEwtMjAwMzAxMjQvZ2VuZXJpY19iZW5jaC9pbml0L2luaXRfZnVuY3Rpb24uaGggQlRML2dlbmVyaWNfYmVuY2gvaW5pdC9pbml0X2Z1bmN0aW9uLmhoCi0tLSBCVEwtMjAwMzAxMjQvZ2VuZXJpY19iZW5jaC9pbml0L2luaXRfZnVuY3Rpb24uaGgJMjAwMi0xMS0yMSAxNjowNDowNi4wMDAwMDAwMDAgKzAxMDAKKysrIEJUTC9nZW5lcmljX2JlbmNoL2luaXQvaW5pdF9mdW5jdGlvbi5oaAkyMDAzLTEwLTMxIDIxOjQxOjEwLjAwMDAwMDAwMCArMDEwMApAQCAtMSwxNCArMSwxNCBAQAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gRmlsZSAgIDogIGluaXRfZnVuY3Rpb24uaGgKLS8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+ICAgICAgICAKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CiAvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjE4IENFU1QgMjAwMgogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gCisvLwogLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIC8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCiAvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLS8vIAorLy8KIC8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIC8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKQEAgLTE2LDcgKzE2LDcgQEAKIC8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0vLyAKKy8vCiAjaWZuZGVmIElOSVRfRlVOQ1RJT05fSEgKICNkZWZpbmUgSU5JVF9GVU5DVElPTl9ISAogCkBAIC0zMCwyNCArMzAsMjQgQEAKICAgcmV0dXJuIGluZGV4X2kraW5kZXhfajsKIH0KIAotZG91YmxlIHBzZXVkb19yYW5kb20oaW50IGluZGV4KQorZG91YmxlIHBzZXVkb19yYW5kb20oaW50IC8qIGluZGV4ICovKQogewogICAvLyAgSU5GT1MoInJhbmRvbT0iPDwoc3RkOjpyYW5kKCkvZG91YmxlKFJBTkRfTUFYKSkpOwogICByZXR1cm4gc3RkOjpyYW5kKCkvZG91YmxlKFJBTkRfTUFYKTsKIH0KIAotZG91YmxlIHBzZXVkb19yYW5kb20oaW50IGluZGV4X2ksIGludCBpbmRleF9qKQorZG91YmxlIHBzZXVkb19yYW5kb20oaW50IC8qIGluZGV4X2kgKi8sIGludCAvKiBpbmRleF9qICovKQogewogICByZXR1cm4gc3RkOjpyYW5kKCkvZG91YmxlKFJBTkRfTUFYKTsKIH0KIAogCi1kb3VibGUgbnVsbF9mdW5jdGlvbihpbnQgaW5kZXgpCitkb3VibGUgbnVsbF9mdW5jdGlvbihpbnQgLyogaW5kZXggKi8pCiB7CiAgIHJldHVybiAwLjA7CiB9CiAKLWRvdWJsZSBudWxsX2Z1bmN0aW9uKGludCBpbmRleF9pLCBpbnQgaW5kZXhfaikKK2RvdWJsZSBudWxsX2Z1bmN0aW9uKGludCAvKiBpbmRleF9pICovLCBpbnQgLyogaW5kZXhfaiAqLykKIHsKICAgcmV0dXJuIDAuMDsKIH0KZGlmZiAtTnVyIEJUTC0yMDAzMDEyNC9nZW5lcmljX2JlbmNoL2luaXQvaW5pdF9tYXRyaXguaGggQlRML2dlbmVyaWNfYmVuY2gvaW5pdC9pbml0X21hdHJpeC5oaAotLS0gQlRMLTIwMDMwMTI0L2dlbmVyaWNfYmVuY2gvaW5pdC9pbml0X21hdHJpeC5oaAkyMDAyLTExLTIxIDE2OjA0OjA2LjAwMDAwMDAwMCArMDEwMAorKysgQlRML2dlbmVyaWNfYmVuY2gvaW5pdC9pbml0X21hdHJpeC5oaAkyMDAzLTExLTAyIDExOjQ0OjE1LjAwMDAwMDAwMCArMDEwMApAQCAtMSwxNCArMSwxNCBAQAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gRmlsZSAgIDogIGluaXRfbWF0cml4LmhoCi0vLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPiAgICAgICAgCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgogLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoxOSBDRVNUIDIwMDIKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIAorLy8KIC8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIC8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgogLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0vLyAKKy8vCiAvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIC8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCkBAIC0xNiw3ICsxNiw3IEBACiAvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIC8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgotLy8gCisvLwogI2lmbmRlZiBJTklUX01BVFJJWF9ISAogI2RlZmluZSBJTklUX01BVFJJWF9ISAogCkBAIC0yOSw3ICsyOSw3IEBACiAKICAgWC5yZXNpemUoc2l6ZSk7CiAKLSAgZm9yIChpbnQgaj0wO2o8WC5zaXplKCk7aisrKXsKKyAgZm9yICh1bnNpZ25lZCBqPTA7ajxYLnNpemUoKTtqKyspewogICAgIFhbal09dHlwZW5hbWUgVmVjdG9yOjp2YWx1ZV90eXBlKGluaXRfZnVuY3Rpb24ocm93LGopKTsKICAgfQogfQpAQCAtNDMsMTEgKzQzLDExIEBACiB2b2lkIGluaXRfbWF0cml4KFZlY3RvciAmICBBLCBpbnQgc2l6ZSl7CiAKICAgQS5yZXNpemUoc2l6ZSk7Ci0gIGZvciAoaW50IHJvdz0wOyByb3c8QS5zaXplKCkgOyByb3crKyl7CisgIGZvciAodW5zaWduZWQgcm93PTA7IHJvdzxBLnNpemUoKSA7IHJvdysrKXsKICAgICBpbml0X3Jvdzxpbml0X2Z1bmN0aW9uPihBW3Jvd10sc2l6ZSxyb3cpOwogICB9Ci0gIAotICAKKworCiB9CiAKICNlbmRpZgpkaWZmIC1OdXIgQlRMLTIwMDMwMTI0L2dlbmVyaWNfYmVuY2gvaW5pdC9pbml0X3ZlY3Rvci5oaCBCVEwvZ2VuZXJpY19iZW5jaC9pbml0L2luaXRfdmVjdG9yLmhoCi0tLSBCVEwtMjAwMzAxMjQvZ2VuZXJpY19iZW5jaC9pbml0L2luaXRfdmVjdG9yLmhoCTIwMDItMTEtMjEgMTY6MDQ6MDYuMDAwMDAwMDAwICswMTAwCisrKyBCVEwvZ2VuZXJpY19iZW5jaC9pbml0L2luaXRfdmVjdG9yLmhoCTIwMDMtMTEtMTEgMTk6MzA6NTIuMDAwMDAwMDAwICswMTAwCkBAIC0xLDE0ICsxLDE0IEBACiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBGaWxlICAgOiAgaW5pdF92ZWN0b3IuaGgKLS8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+ICAgICAgICAKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CiAvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjE4IENFU1QgMjAwMgogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gCisvLwogLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIC8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCiAvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLS8vIAorLy8KIC8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIC8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKQEAgLTE2LDcgKzE2LDcgQEAKIC8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0vLyAKKy8vCiAjaWZuZGVmIElOSVRfVkVDVE9SX0hICiAjZGVmaW5lIElOSVRfVkVDVE9SX0hICiAKQEAgLTI5LDcgKzI5LDcgQEAKIAogICBYLnJlc2l6ZShzaXplKTsKIAotICBmb3IgKGludCBpPTA7aTxYLnNpemUoKTtpKyspeworICBmb3IgKHVuc2lnbmVkIGk9MDtpPFguc2l6ZSgpO2krKyl7CiAgICAgWFtpXT10eXBlbmFtZSBWZWN0b3I6OnZhbHVlX3R5cGUoaW5pdF9mdW5jdGlvbihpKSk7CiAgIH0KIH0KZGlmZiAtTnVyIEJUTC0yMDAzMDEyNC9nZW5lcmljX2JlbmNoL3N0YXRpYy9iZW5jaF9zdGF0aWMuaGggQlRML2dlbmVyaWNfYmVuY2gvc3RhdGljL2JlbmNoX3N0YXRpYy5oaAotLS0gQlRMLTIwMDMwMTI0L2dlbmVyaWNfYmVuY2gvc3RhdGljL2JlbmNoX3N0YXRpYy5oaAkyMDAzLTAxLTI0IDE2OjIyOjAyLjAwMDAwMDAwMCArMDEwMAorKysgQlRML2dlbmVyaWNfYmVuY2gvc3RhdGljL2JlbmNoX3N0YXRpYy5oaAkyMDAzLTExLTEzIDIxOjEwOjI5LjAwMDAwMDAwMCArMDEwMApAQCAtMSwxNCArMSwxNCBAQAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gRmlsZSAgIDogIGJlbmNoX3N0YXRpYy5oaAotLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4gICAgICAgIAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KIC8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIGx1biBzZXAgMzAgMTQ6MjM6MTYgQ0VTVCAyMDAyCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyAKKy8vCiAvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKIC8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotLy8gCisvLwogLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQpAQCAtMTYsNyArMTYsNyBAQAogLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIC8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KLS8vIAorLy8KICNpZm5kZWYgQkVOQ0hfU1RBVElDX0hICiAjZGVmaW5lIEJFTkNIX1NUQVRJQ19ISAogI2luY2x1ZGUgImJlbmNoX3BhcmFtZXRlci5oaCIKQEAgLTI4LDUxICsyOCw0MSBAQAogI2luY2x1ZGUgInRpbWVycy9taXhlZF9wZXJmX2FuYWx5emVyLmhoIgogI2luY2x1ZGUgInRpbWVycy94ODZfcGVyZl9hbmFseXplci5oaCIKIAotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi10ZW1wbGF0ZSA8dGVtcGxhdGU8Y2xhc3M+IGNsYXNzIFBlcmZfQW5hbHl6ZXIsIHRlbXBsYXRlPGNsYXNzPiBjbGFzcyBBY3Rpb24sIHRlbXBsYXRlPGNsYXNzLGludD4gY2xhc3MgSW50ZXJmYWNlPiAKLXZvaWQgYmVuY2hfc3RhdGljKCB2b2lkICl7Ci0KLSAgc3RyaW5nIGZpbGVuYW1lPSJiZW5jaF8iK0FjdGlvbjxJbnRlcmZhY2U8UkVBTF9UWVBFLDEwPiA+OjpuYW1lKCkrIi5kYXQiOwordGVtcGxhdGUgPAorICB0ZW1wbGF0ZTxjbGFzcz4gY2xhc3MgUGVyZl9BbmFseXplciwKKyAgdGVtcGxhdGU8Y2xhc3M+IGNsYXNzIEFjdGlvbiwKKyAgdGVtcGxhdGU8Y2xhc3MsIGludD4gY2xhc3MgSW50ZXJmYWNlLAorICB1bnNpZ25lZCBTegorPgordm9pZCBiZW5jaF9zdGF0aWMoKQoreworICBzdGQ6OnN0cmluZyBmaWxlbmFtZT0iYmVuY2hfIiArIEFjdGlvbjxJbnRlcmZhY2U8UkVBTF9UWVBFLDEwPiA+OjpuYW1lKCkgKyAiLmRhdCI7CiAKICAgSU5GT1MoInN0YXJ0aW5nICIgPDxmaWxlbmFtZSk7CiAKLSAgY29uc3QgaW50IG1heF9zaXplPVRJTllfTVZfTUFYX1NJWkU7Ci0KICAgc3RkOjp2ZWN0b3I8ZG91YmxlPiB0YWJfbWZsb3BzOwogICBzdGQ6OnZlY3Rvcjxkb3VibGU+IHRhYl9zaXplczsKIAotICBzdGF0aWNfc2l6ZV9nZW5lcmF0b3I8bWF4X3NpemUsUGVyZl9BbmFseXplcixBY3Rpb24sSW50ZXJmYWNlPjo6Z28odGFiX3NpemVzLHRhYl9tZmxvcHMpOwotCi0gIGR1bXBfZmlsZV94X3kodGFiX3NpemVzLHRhYl9tZmxvcHMsZmlsZW5hbWUpOworICBzdGF0aWNfc2l6ZV9nZW5lcmF0b3I8U3osIFBlcmZfQW5hbHl6ZXIsIEFjdGlvbiwgSW50ZXJmYWNlPjo6Z28odGFiX3NpemVzLCB0YWJfbWZsb3BzKTsKIAorICBkdW1wX2ZpbGVfeF95KHRhYl9zaXplcywgdGFiX21mbG9wcywgZmlsZW5hbWUpOwogfQogCiAvLyBkZWZhdWx0IFBlcmYgQW5hbHl6ZXIKK3RlbXBsYXRlIDwKKyAgdGVtcGxhdGU8Y2xhc3M+IGNsYXNzIEFjdGlvbiwKKyAgdGVtcGxhdGU8Y2xhc3MsIGludD4gY2xhc3MgSW50ZXJmYWNlLAorICB1bnNpZ25lZCBTegorPgordm9pZCBiZW5jaF9zdGF0aWMoKQoreworICAvLyBpZiB0aGUgcmR0c2MgaXMgbm90IGF2YWlsYWJsZSA6CisgIGJlbmNoX3N0YXRpYzxQb3J0YWJsZV9QZXJmX0FuYWx5emVyLCBBY3Rpb24sIEludGVyZmFjZSwgU3o+KCk7CisgIC8vIGlmIHRoZSByZHRzYyBpcyBhdmFpbGFibGUgOgorICAvLyBiZW5jaF9zdGF0aWM8TWl4ZWRfUGVyZl9BbmFseXplcixBY3Rpb24sSW50ZXJmYWNlLCBTej4oKTsKIAotdGVtcGxhdGUgPHRlbXBsYXRlPGNsYXNzPiBjbGFzcyBBY3Rpb24sIHRlbXBsYXRlPGNsYXNzLGludD4gY2xhc3MgSW50ZXJmYWNlPiAKLXZvaWQgYmVuY2hfc3RhdGljKCB2b2lkICl7Ci0KLSAgYmVuY2hfc3RhdGljPFBvcnRhYmxlX1BlcmZfQW5hbHl6ZXIsQWN0aW9uLEludGVyZmFjZT4oKTsKLSAgLy9iZW5jaF9zdGF0aWM8TWl4ZWRfUGVyZl9BbmFseXplcixBY3Rpb24sSW50ZXJmYWNlPigpOwotICAvL2JlbmNoX3N0YXRpYzxYODZfUGVyZl9BbmFseXplcixBY3Rpb24sSW50ZXJmYWNlPigpOwotCisgIC8vIE9ubHkgZm9yIHNtYWxsIHByb2JsZW0gc2l6ZS4gT3RoZXJ3aXplIGl0IHdpbGwgYmUgdG9vIGxvbmcKKyAgLy8gYmVuY2hfc3RhdGljPFg4Nl9QZXJmX0FuYWx5emVyLEFjdGlvbixJbnRlcmZhY2UsIFN6PigpOwogfQogCiAjZW5kaWYKLQotCi0KLQotCi0KLQotCi0gCi0KLSAgICAKLQotCi0gICAgCi0gICAgCmRpZmYgLU51ciBCVEwtMjAwMzAxMjQvZ2VuZXJpY19iZW5jaC9zdGF0aWMvc3RhdGljX3NpemVfZ2VuZXJhdG9yLmhoIEJUTC9nZW5lcmljX2JlbmNoL3N0YXRpYy9zdGF0aWNfc2l6ZV9nZW5lcmF0b3IuaGgKLS0tIEJUTC0yMDAzMDEyNC9nZW5lcmljX2JlbmNoL3N0YXRpYy9zdGF0aWNfc2l6ZV9nZW5lcmF0b3IuaGgJMjAwMy0wMS0wOSAxNDozMzo1MC4wMDAwMDAwMDAgKzAxMDAKKysrIEJUTC9nZW5lcmljX2JlbmNoL3N0YXRpYy9zdGF0aWNfc2l6ZV9nZW5lcmF0b3IuaGgJMjAwMy0xMS0xMiAxODoyNjo1Mi4wMDAwMDAwMDAgKzAxMDAKQEAgLTEsMTQgKzEsMTQgQEAKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vIEZpbGUgICA6ICBzdGF0aWNfc2l6ZV9nZW5lcmF0b3IuaGgKLS8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+ICAgICAgICAKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CiAvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBtYXIgZOljIDMgMTg6NTk6MzYgQ0VUIDIwMDIKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIAorLy8KIC8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIC8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgogLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0vLyAKKy8vCiAvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIC8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCkBAIC0xNiw0MSArMTYsNDcgQEAKIC8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0vLyAKKy8vCiAjaWZuZGVmIF9TVEFUSUNfU0laRV9HRU5FUkFUT1JfSEgKICNkZWZpbmUgX1NUQVRJQ19TSVpFX0dFTkVSQVRPUl9ISAotI2luY2x1ZGUgPHZlY3Rvcj4KIAotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNpbmNsdWRlIDx2ZWN0b3I+CiAKIC8vcmVjdXJzaXZlIGdlbmVyYXRpb24gb2Ygc3RhdGljYWxseSBkZWZpbmVkIG1hdHJpeCBhbmQgdmVjdG9yIHNpemVzCi0KLXRlbXBsYXRlIDxpbnQgU0laRSx0ZW1wbGF0ZTxjbGFzcz4gY2xhc3MgUGVyZl9BbmFseXplciwgdGVtcGxhdGU8Y2xhc3M+IGNsYXNzIEFjdGlvbiwgdGVtcGxhdGU8Y2xhc3MsaW50PiBjbGFzcyBJbnRlcmZhY2U+IAotc3RydWN0IHN0YXRpY19zaXplX2dlbmVyYXRvcnsKLSAgc3RhdGljICB2b2lkIGdvKHZlY3Rvcjxkb3VibGU+ICYgdGFiX3NpemVzLCB2ZWN0b3I8ZG91YmxlPiAmIHRhYl9tZmxvcHMpCit0ZW1wbGF0ZSA8CisgIGludCBTSVpFLAorICB0ZW1wbGF0ZTxjbGFzcz4gY2xhc3MgUGVyZl9BbmFseXplciwKKyAgdGVtcGxhdGU8Y2xhc3M+IGNsYXNzIEFjdGlvbiwKKyAgdGVtcGxhdGU8Y2xhc3MsIGludD4gY2xhc3MgSW50ZXJmYWNlCis+CitzdHJ1Y3Qgc3RhdGljX3NpemVfZ2VuZXJhdG9yCit7CisgIHN0YXRpYyB2b2lkIGdvKHN0ZDo6dmVjdG9yPGRvdWJsZT4mIHRhYl9zaXplcywgc3RkOjp2ZWN0b3I8ZG91YmxlPiYgdGFiX21mbG9wcykKICAgewogICAgIHRhYl9zaXplcy5wdXNoX2JhY2soU0laRSk7CiAKICAgICBQZXJmX0FuYWx5emVyPEFjdGlvbjxJbnRlcmZhY2U8UkVBTF9UWVBFLFNJWkU+ID4gPiBwZXJmX2FjdGlvbjsKICAgICB0YWJfbWZsb3BzLnB1c2hfYmFjayhwZXJmX2FjdGlvbi5ldmFsX21mbG9wcyhTSVpFKSk7Ci0gICAgc3RhdGljX3NpemVfZ2VuZXJhdG9yPFNJWkUtMSxQZXJmX0FuYWx5emVyLEFjdGlvbixJbnRlcmZhY2U+Ojpnbyh0YWJfc2l6ZXMsdGFiX21mbG9wcyk7CisKKyAgICBzdGF0aWNfc2l6ZV9nZW5lcmF0b3I8U0laRS0xLCBQZXJmX0FuYWx5emVyLCBBY3Rpb24sIEludGVyZmFjZT46OmdvKHRhYl9zaXplcyx0YWJfbWZsb3BzKTsKICAgfTsKIH07CiAKIC8vcmVjdXJzaW9uIGVuZAotCi10ZW1wbGF0ZSA8dGVtcGxhdGU8Y2xhc3M+IGNsYXNzIFBlcmZfQW5hbHl6ZXIsIHRlbXBsYXRlPGNsYXNzPiBjbGFzcyBBY3Rpb24sIHRlbXBsYXRlPGNsYXNzLGludD4gY2xhc3MgSW50ZXJmYWNlPiAKLXN0cnVjdCBzdGF0aWNfc2l6ZV9nZW5lcmF0b3I8MSxQZXJmX0FuYWx5emVyLEFjdGlvbixJbnRlcmZhY2U+eyAgCi0gIHN0YXRpYyAgdm9pZCBnbyh2ZWN0b3I8ZG91YmxlPiAmIHRhYl9zaXplcywgdmVjdG9yPGRvdWJsZT4gJiB0YWJfbWZsb3BzKQordGVtcGxhdGUgPAorICB0ZW1wbGF0ZTxjbGFzcz4gY2xhc3MgUGVyZl9BbmFseXplciwKKyAgdGVtcGxhdGU8Y2xhc3M+IGNsYXNzIEFjdGlvbiwKKyAgdGVtcGxhdGU8Y2xhc3MsIGludD4gY2xhc3MgSW50ZXJmYWNlCis+CitzdHJ1Y3Qgc3RhdGljX3NpemVfZ2VuZXJhdG9yPDEsIFBlcmZfQW5hbHl6ZXIsIEFjdGlvbiwgSW50ZXJmYWNlPgoreworICBzdGF0aWMgdm9pZCBnbyhzdGQ6OnZlY3Rvcjxkb3VibGU+JiB0YWJfc2l6ZXMsIHN0ZDo6dmVjdG9yPGRvdWJsZT4mIHRhYl9tZmxvcHMpCiAgIHsKICAgICB0YWJfc2l6ZXMucHVzaF9iYWNrKDEpOworCiAgICAgUGVyZl9BbmFseXplcjxBY3Rpb248SW50ZXJmYWNlPFJFQUxfVFlQRSwxPiA+ID4gcGVyZl9hY3Rpb247CiAgICAgdGFiX21mbG9wcy5wdXNoX2JhY2socGVyZl9hY3Rpb24uZXZhbF9tZmxvcHMoMSkpOwogICB9OwogfTsKIAogI2VuZGlmCi0gIAotICAKLSAgCi0gIApkaWZmIC1OdXIgQlRMLTIwMDMwMTI0L2dlbmVyaWNfYmVuY2gvdGltZXJzL3BvcnRhYmxlX3BlcmZfYW5hbHl6ZXIuaGggQlRML2dlbmVyaWNfYmVuY2gvdGltZXJzL3BvcnRhYmxlX3BlcmZfYW5hbHl6ZXIuaGgKLS0tIEJUTC0yMDAzMDEyNC9nZW5lcmljX2JlbmNoL3RpbWVycy9wb3J0YWJsZV9wZXJmX2FuYWx5emVyLmhoCTIwMDMtMDEtMTUgMTE6MDY6MDkuMDAwMDAwMDAwICswMTAwCisrKyBCVEwvZ2VuZXJpY19iZW5jaC90aW1lcnMvcG9ydGFibGVfcGVyZl9hbmFseXplci5oaAkyMDAzLTExLTEyIDIwOjA5OjE0LjAwMDAwMDAwMCArMDEwMApAQCAtMSwxNCArMSwxNCBAQAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gRmlsZSAgIDogIHBvcnRhYmxlX3BlcmZfYW5hbHl6ZXIuaGgKLS8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+ICAgICAgICAKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CiAvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBtYXIgZOljIDMgMTg6NTk6MzUgQ0VUIDIwMDIKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIAorLy8KIC8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIC8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgogLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0vLyAKKy8vCiAvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIC8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCkBAIC0xNiw3ICsxNiw3IEBACiAvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIC8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgotLy8gCisvLwogI2lmbmRlZiBfUE9SVEFCTEVfUEVSRl9BTkFMWVpFUl9ISAogI2RlZmluZSBfUE9SVEFCTEVfUEVSRl9BTkFMWVpFUl9ISAogCkBAIC0yNCwxMTEgKzI0LDExOCBAQAogI2luY2x1ZGUgInRpbWVycy9wb3J0YWJsZV90aW1lci5oaCIKIAogdGVtcGxhdGUgPGNsYXNzIEFjdGlvbj4KLWNsYXNzIFBvcnRhYmxlX1BlcmZfQW5hbHl6ZXJ7Ci1wdWJsaWM6ICAKLSAgUG9ydGFibGVfUGVyZl9BbmFseXplciggdm9pZCApOl9uYl9jYWxjKDEpLF9uYl9pbml0KDEpLF9jaHJvbm9zKCl7Ci0gICAgTUVTU0FHRSgiUG9ydGFibGVfUGVyZl9BbmFseXplciBDdG9yIik7Ci0gIH07Ci0gIFBvcnRhYmxlX1BlcmZfQW5hbHl6ZXIoIGNvbnN0IFBvcnRhYmxlX1BlcmZfQW5hbHl6ZXIgJiApewotICAgIElORk9TKCJDb3B5IEN0b3Igbm90IGltcGxlbWVudGVkIik7Ci0gICAgZXhpdCgwKTsKLSAgfTsKLSAgflBvcnRhYmxlX1BlcmZfQW5hbHl6ZXIoIHZvaWQgKXsKLSAgICBNRVNTQUdFKCJQb3J0YWJsZV9QZXJmX0FuYWx5emVyIER0b3IiKTsKLSAgfTsKLSAgCi0KLQotICBpbmxpbmUgZG91YmxlIGV2YWxfbWZsb3BzKGludCBzaXplKQotICB7Ci0gIAotICAgIEFjdGlvbiBhY3Rpb24oc2l6ZSk7Ci0gICAgCi0gICAgZG91YmxlIHRpbWVfYmFzZWxpbmU9dGltZV9pbml0KGFjdGlvbik7Ci0gICAgCi0gICAgd2hpbGUgKHRpbWVfYmFzZWxpbmUgPCBNSU5fVElNRSkgewotICAgICAgCi0gICAgICBfbmJfaW5pdCo9MjsKLSAgICAgIHRpbWVfYmFzZWxpbmU9dGltZV9pbml0KGFjdGlvbik7Ci0gICAgfQotICAgIAotICAgIHRpbWVfYmFzZWxpbmU9dGltZV9iYXNlbGluZS8oZG91YmxlKF9uYl9pbml0KSk7Ci0gICAgCi0gICAgZG91YmxlIHRpbWVfYWN0aW9uPXRpbWVfY2FsY3VsYXRlKGFjdGlvbik7Ci0gICAgCi0gICAgd2hpbGUgKHRpbWVfYWN0aW9uIDwgTUlOX1RJTUUpIHsKLSAgICAgIAotICAgICAgX25iX2NhbGMqPTI7Ci0gICAgICB0aW1lX2FjdGlvbj10aW1lX2NhbGN1bGF0ZShhY3Rpb24pOwotICAgIH0KLSAgICAKLSAgLy8gICBJTkZPUygic2l6ZT0iPDxzaXplKTsKLS8vICAgICBJTkZPUygiX25iX2luaXQ9Ijw8X25iX2luaXQpOwotLy8gICAgIElORk9TKCJfbmJfY2FsYz0iPDxfbmJfY2FsYyk7Ci0gICAgCi0gICAgCi0gICAgdGltZV9hY3Rpb249dGltZV9hY3Rpb24vKGRvdWJsZShfbmJfY2FsYykpOwotICAgIAotICAgIGFjdGlvbi5jaGVja19yZXN1bHQoKTsKLSAgICAKLS8vICAgICBJTkZPUygidGltZV9iYXNlbGluZT0iPDx0aW1lX2Jhc2VsaW5lKTsgIAotLy8gICAgIElORk9TKCJ0aW1lX2FjdGlvbj0iPDx0aW1lX2FjdGlvbik7ICAKLSAgICAKLSAgICAKLSAgICB0aW1lX2FjdGlvbj10aW1lX2FjdGlvbi10aW1lX2Jhc2VsaW5lOwotICAgIAotLy8gICAgIElORk9TKCJ0aW1lX2NvcnJlY3RlZD0iPDx0aW1lX2FjdGlvbik7ICAKLSAgICAKLSAgICByZXR1cm4gYWN0aW9uLm5iX29wX2Jhc2UoKS8odGltZV9hY3Rpb24qMTAwMDAwMC4wKTsKLSAgfQorY2xhc3MgUG9ydGFibGVfUGVyZl9BbmFseXplcgoreworICBQb3J0YWJsZV9QZXJmX0FuYWx5emVyKGNvbnN0IFBvcnRhYmxlX1BlcmZfQW5hbHl6ZXImKTsKIAotICBpbmxpbmUgZG91YmxlIHRpbWVfaW5pdChBY3Rpb24gJiBhY3Rpb24pCi0gIHsKLSAgICAKLSAgICAvLyB0aW1lIG1lYXN1cmVtZW50Ci0KLSAgICBfY2hyb25vcy5zdGFydCgpOwotICAgIAotICAgIGZvciAoaW50IGlpPTA7aWk8X25iX2luaXQ7aWkrKyl7Ci0KLSAgICAgIGFjdGlvbi5pbml0aWFsaXplKCk7Ci0KLSAgICB9Ci0gIAotICAgIF9jaHJvbm9zLnN0b3AoKTsKK3B1YmxpYzoKKyAgUG9ydGFibGVfUGVyZl9BbmFseXplcigpOwogCi0gICAgcmV0dXJuIF9jaHJvbm9zLnVzZXJfdGltZSgpOwotICB9CisgIH5Qb3J0YWJsZV9QZXJmX0FuYWx5emVyKCk7CiAKKyAgZG91YmxlIGV2YWxfbWZsb3BzKGludCBzaXplKTsKIAotICBpbmxpbmUgZG91YmxlIHRpbWVfY2FsY3VsYXRlKEFjdGlvbiAmIGFjdGlvbil7Ci0gIAotICAgIC8vIHRpbWUgbWVhc3VyZW1lbnQKLQotICAgIF9jaHJvbm9zLnN0YXJ0KCk7Ci0KLSAgICBmb3IgKGludCBpaT0wO2lpPF9uYl9jYWxjO2lpKyspewotCi0gICAgICBhY3Rpb24uaW5pdGlhbGl6ZSgpOwotICAgICAgYWN0aW9uLmNhbGN1bGF0ZSgpOwotICAgICAgCi0gICAgfQotICAKLSAgICBfY2hyb25vcy5zdG9wKCk7Ci0gIAotICAgIHJldHVybiBfY2hyb25vcy51c2VyX3RpbWUoKTsKLSAgfQorICBkb3VibGUgdGltZV9pbml0KEFjdGlvbiYgYWN0aW9uKTsKIAotICB1bnNpZ25lZCBsb25nIGxvbmcgZ2V0X25iX2NhbGMoIHZvaWQgKXsKKyAgZG91YmxlIHRpbWVfY2FsY3VsYXRlKEFjdGlvbiYgYWN0aW9uKTsKKworICB1bnNpZ25lZCBsb25nIGxvbmcgZ2V0X25iX2NhbGMoKSB7CiAgICAgcmV0dXJuIF9uYl9jYWxjOwogICB9CiAKLQogcHJpdmF0ZToKICAgdW5zaWduZWQgbG9uZyBsb25nIF9uYl9jYWxjOwogICB1bnNpZ25lZCBsb25nIGxvbmcgX25iX2luaXQ7CiAgIFBvcnRhYmxlX1RpbWVyIF9jaHJvbm9zOwotICAKIH07CiAKKworLyoKKyAqIEltcGxlbWVudGF0aW9uCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBBY3Rpb24+CitQb3J0YWJsZV9QZXJmX0FuYWx5emVyPEFjdGlvbj46OlBvcnRhYmxlX1BlcmZfQW5hbHl6ZXIoKQorICA6IF9uYl9jYWxjKDEpLCBfbmJfaW5pdCgxKSwgX2Nocm9ub3MoKQoreworICBNRVNTQUdFKCJQb3J0YWJsZV9QZXJmX0FuYWx5emVyIEN0b3IiKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBBY3Rpb24+CitQb3J0YWJsZV9QZXJmX0FuYWx5emVyPEFjdGlvbj46On5Qb3J0YWJsZV9QZXJmX0FuYWx5emVyKCkKK3sKKyAgTUVTU0FHRSgiUG9ydGFibGVfUGVyZl9BbmFseXplciBEdG9yIik7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgQWN0aW9uPgorZG91YmxlIFBvcnRhYmxlX1BlcmZfQW5hbHl6ZXI8QWN0aW9uPjo6dGltZV9pbml0KEFjdGlvbiYgYWN0aW9uKQoreworICAvLyB0aW1lIG1lYXN1cmVtZW50CisgIF9jaHJvbm9zLnN0YXJ0KCk7CisKKyAgZm9yICh1bnNpZ25lZCBpaSA9IDA7IGlpIDwgX25iX2luaXQ7IGlpKyspeworICAgIGFjdGlvbi5pbml0aWFsaXplKCk7CisgIH0KKworICBfY2hyb25vcy5zdG9wKCk7CisKKyAgcmV0dXJuIF9jaHJvbm9zLnVzZXJfdGltZSgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQWN0aW9uPgorZG91YmxlIFBvcnRhYmxlX1BlcmZfQW5hbHl6ZXI8QWN0aW9uPjo6dGltZV9jYWxjdWxhdGUoQWN0aW9uJiBhY3Rpb24pCit7CisgIC8vIHRpbWUgbWVhc3VyZW1lbnQKKyAgX2Nocm9ub3Muc3RhcnQoKTsKKworICBmb3IgKHVuc2lnbmVkIGlpID0gMDsgaWkgPF9uYl9jYWxjOyBpaSsrKSB7CisgICAgLy8gdGhlIG1lYXN1cmVkIGJlbmNoIHNlbGYKKyAgICBhY3Rpb24uaW5pdGlhbGl6ZSgpOworICAgIGFjdGlvbi5jYWxjdWxhdGUoKTsKKyAgfQorCisgIF9jaHJvbm9zLnN0b3AoKTsKKworICByZXR1cm4gX2Nocm9ub3MudXNlcl90aW1lKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBBY3Rpb24+Citkb3VibGUgUG9ydGFibGVfUGVyZl9BbmFseXplcjxBY3Rpb24+OjpldmFsX21mbG9wcyhpbnQgc2l6ZSkKK3sKKyAgQWN0aW9uIGFjdGlvbihzaXplKTsKKworICBkb3VibGUgdGltZV9iYXNlbGluZSA9IHRpbWVfaW5pdChhY3Rpb24pOworCisgIHdoaWxlICh0aW1lX2Jhc2VsaW5lIDwgTUlOX1RJTUUpIHsKKyAgICBfbmJfaW5pdCo9MjsKKyAgICB0aW1lX2Jhc2VsaW5lPXRpbWVfaW5pdChhY3Rpb24pOworICB9CisKKyAgdGltZV9iYXNlbGluZT10aW1lX2Jhc2VsaW5lLyhkb3VibGUoX25iX2luaXQpKTsKKworICAvLyBwZXJmb3JtIHRoZSBiZW5jaG1hcmsgdGltaW5nCisgIGRvdWJsZSB0aW1lX2FjdGlvbj10aW1lX2NhbGN1bGF0ZShhY3Rpb24pOworCisgIHdoaWxlICh0aW1lX2FjdGlvbiA8IE1JTl9USU1FKSB7CisgICAgX25iX2NhbGMqPTI7CisgICAgdGltZV9hY3Rpb249dGltZV9jYWxjdWxhdGUoYWN0aW9uKTsKKyAgfQorCisgIC8vIElORk9TKCJzaXplPSI8PHNpemUpOworICAvLyBJTkZPUygiX25iX2luaXQ9Ijw8X25iX2luaXQpOworICAvLyBJTkZPUygiX25iX2NhbGM9Ijw8X25iX2NhbGMpOworCisgIHRpbWVfYWN0aW9uPXRpbWVfYWN0aW9uLyhkb3VibGUoX25iX2NhbGMpKTsKKworICBhY3Rpb24uY2hlY2tfcmVzdWx0KCk7CisKKyAgLy8gSU5GT1MoInRpbWVfYmFzZWxpbmU9Ijw8dGltZV9iYXNlbGluZSk7CisgIC8vIElORk9TKCJ0aW1lX2FjdGlvbj0iPDx0aW1lX2FjdGlvbik7CisKKyAgdGltZV9hY3Rpb249dGltZV9hY3Rpb24tdGltZV9iYXNlbGluZTsKKworICAvLyBJTkZPUygidGltZV9jb3JyZWN0ZWQ9Ijw8dGltZV9hY3Rpb24pOworCisgIHJldHVybiBhY3Rpb24ubmJfb3BfYmFzZSgpLyh0aW1lX2FjdGlvbioxMDAwMDAwLjApOworfQorCiAjZW5kaWYgLy9fUE9SVEFCTEVfUEVSRl9BTkFMWVpFUl9ISApkaWZmIC1OdXIgQlRMLTIwMDMwMTI0L2dlbmVyaWNfYmVuY2gvdGltZXJzL3BvcnRhYmxlX3RpbWVyLmhofiBCVEwvZ2VuZXJpY19iZW5jaC90aW1lcnMvcG9ydGFibGVfdGltZXIuaGh+Ci0tLSBCVEwtMjAwMzAxMjQvZ2VuZXJpY19iZW5jaC90aW1lcnMvcG9ydGFibGVfdGltZXIuaGh+CTIwMDItMTItMDMgMTk6MDE6MTguMDAwMDAwMDAwICswMTAwCisrKyBCVEwvZ2VuZXJpY19iZW5jaC90aW1lcnMvcG9ydGFibGVfdGltZXIuaGh+CTE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCkBAIC0xLDEwMyArMCwwIEBACi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBGaWxlICAgOiAgcG9ydGFibGVfdGltZXIuaGgKLS8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+IGZyb20gYm9vc3QgbGliCi0vLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjE3IENFU1QgMjAwMgotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gCi0vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLS8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotLy8gCi0vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLS8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0vLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLS8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KLS8vIAotLy8gIHNpbXBsZV90aW1lIGV4dHJhY3RlZCBmcm9tIHRoZSBib29zdCBsaWJyYXJ5Ci0vLyAgCi0jaWZuZGVmIF9QT1JUQUJMRV9USU1FUl9ISAotI2RlZmluZSBfUE9SVEFCTEVfVElNRVJfSEgKLQotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy90aW1lcy5oPgotCi0jZGVmaW5lIFVTRUNfSU5fU0VDIDEwMDAwMDAKLQotCi0vLyAgdGltZXIgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCi0vLyAgQSB0aW1lciBvYmplY3QgbWVhc3VyZXMgQ1BVIHRpbWUuCi0KLWNsYXNzIFBvcnRhYmxlX1RpbWVyCi17Ci0gcHVibGljOgotCi0gIFBvcnRhYmxlX1RpbWVyKCB2b2lkICk6X3V0aW1lX3NlY19zdGFydCgtMSksCi0JCV91dGltZV91c2VjX3N0YXJ0KC0xKSwKLQkJX3V0aW1lX3NlY19zdG9wKC0xKSwKLQkJX3V0aW1lX3VzZWNfc3RvcCgtMSkKLSAgewotICB9Ci0gICAgCi0KLSAgdm9pZCAgIHN0YXJ0KCkgCi0gIHsgCi0gICAgCi0gICAgaW50IHN0YXR1cz1nZXRydXNhZ2UoUlVTQUdFX1NFTEYsICZyZXNvdXJjZXNVc2FnZSkgOwotICAgIAotICAgIF9zdGFydF90aW1lID0gc3RkOjpjbG9jaygpOyAKLQotICAgIF91dGltZV9zZWNfc3RhcnQgID0gIHJlc291cmNlc1VzYWdlLnJ1X3V0aW1lLnR2X3NlYyA7Ci0gICAgX3V0aW1lX3VzZWNfc3RhcnQgPSAgcmVzb3VyY2VzVXNhZ2UucnVfdXRpbWUudHZfdXNlYyA7Ci0KLSAgfQotICAKLSAgdm9pZCBzdG9wKCkgCi0gIHsgCi0gICAgCi0gICAgaW50IHN0YXR1cz1nZXRydXNhZ2UoUlVTQUdFX1NFTEYsICZyZXNvdXJjZXNVc2FnZSkgOwotICAgIAotICAgIF9zdG9wX3RpbWUgPSBzdGQ6OmNsb2NrKCk7IAotICAgIAotICAgIF91dGltZV9zZWNfc3RvcCAgPSAgcmVzb3VyY2VzVXNhZ2UucnVfdXRpbWUudHZfc2VjIDsKLSAgICBfdXRpbWVfdXNlY19zdG9wID0gIHJlc291cmNlc1VzYWdlLnJ1X3V0aW1lLnR2X3VzZWMgOwotICAgIAotICB9Ci0KLSAgZG91YmxlIGVsYXBzZWQoKQotICB7Ci0gICAgcmV0dXJuICBkb3VibGUoX3N0b3BfdGltZSAtIF9zdGFydF90aW1lKSAvIENMT0NLU19QRVJfU0VDOyAKLSAgfQotICAKLSAgZG91YmxlIHVzZXJfdGltZSgpCi0gIHsKLSAgICBsb25nIHRvdF91dGltZV9zZWM9X3V0aW1lX3NlY19zdG9wLV91dGltZV9zZWNfc3RhcnQ7Ci0gICAgbG9uZyB0b3RfdXRpbWVfdXNlYz1fdXRpbWVfdXNlY19zdG9wLV91dGltZV91c2VjX3N0YXJ0OwotICAgIHJldHVybiBkb3VibGUodG90X3V0aW1lX3NlYykrIGRvdWJsZSh0b3RfdXRpbWVfdXNlYykvZG91YmxlKFVTRUNfSU5fU0VDKSA7Ci0gIH0KLQotICAKLXByaXZhdGU6Ci0KLSAgc3RydWN0IHJ1c2FnZSByZXNvdXJjZXNVc2FnZSA7Ci0gIAotICBsb25nIF91dGltZV9zZWNfc3RhcnQgOwotICBsb25nIF91dGltZV91c2VjX3N0YXJ0IDsKLSAgCi0gIGxvbmcgX3V0aW1lX3NlY19zdG9wIDsKLSAgbG9uZyBfdXRpbWVfdXNlY19zdG9wIDsKLSAgCi0gIHN0ZDo6Y2xvY2tfdCBfc3RhcnRfdGltZTsKLSAgc3RkOjpjbG9ja190IF9zdG9wX3RpbWU7Ci0KLX07IC8vIFBvcnRhYmxlX1RpbWVyCi0KLQotI2VuZGlmICAvLyBQT1JUQUJMRV9USU1FUl9IUFAKZGlmZiAtTnVyIEJUTC0yMDAzMDEyNC9nZW5lcmljX2JlbmNoL3RpbWVycy94ODZfdGltZXIuaGggQlRML2dlbmVyaWNfYmVuY2gvdGltZXJzL3g4Nl90aW1lci5oaAotLS0gQlRMLTIwMDMwMTI0L2dlbmVyaWNfYmVuY2gvdGltZXJzL3g4Nl90aW1lci5oaAkyMDAzLTAxLTIxIDEyOjUxOjM1LjAwMDAwMDAwMCArMDEwMAorKysgQlRML2dlbmVyaWNfYmVuY2gvdGltZXJzL3g4Nl90aW1lci5oaAkyMDAzLTEwLTMwIDE5OjEwOjA0LjAwMDAwMDAwMCArMDEwMApAQCAtMSwxNCArMSwxNCBAQAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gRmlsZSAgIDogIHg4Nl90aW1lci5oaAotLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4gICAgICAgIAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KIC8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIG1hciBk6WMgMyAxODo1OTozNSBDRVQgMjAwMgogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gCisvLwogLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIC8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCiAvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLS8vIAorLy8KIC8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIC8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKQEAgLTE2LDcgKzE2LDcgQEAKIC8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0vLyAKKy8vCiAjaWZuZGVmIF9YODZfVElNRVJfSEgKICNkZWZpbmUgX1g4Nl9USU1FUl9ISAogCkBAIC00Niw3ICs0Niw3IEBACiAKICAgWDg2X1RpbWVyKCB2b2lkICk6X2ZyZXF1ZW5jeShGUkVRVUVOQ1kpLF9uYl9zYW1wbGUoMCkKICAgewotICAgIE1FU1NBR0UoIlg4Nl9UaW1lciBEZWZhdWx0IEN0b3IiKTsgICAgCisgICAgTUVTU0FHRSgiWDg2X1RpbWVyIERlZmF1bHQgQ3RvciIpOwogICB9CiAKICAgaW5saW5lIHZvaWQgc3RhcnQoIHZvaWQgKXsKQEAgLTYxLDcgKzYxLDcgQEAKICAgICByZHRzYyhfY2xpY2tfc3RvcC5uMzJbMF0sX2NsaWNrX3N0b3AubjMyWzFdKTsKIAogICB9Ci0gIAorCiAKICAgaW5saW5lIGRvdWJsZSBmcmVxdWVuY3koIHZvaWQgKXsKICAgICByZXR1cm4gX2ZyZXF1ZW5jeTsKQEAgLTcyLDEzICs3MiwxMyBAQAogICAgIHJldHVybiAoX2NsaWNrX3N0b3AubjY0LV9jbGlja19zdGFydC5uNjQpL2RvdWJsZShGUkVRVUVOQ1kpOwogCiAKLSAgfSAgICAKKyAgfQogCiAgIHVuc2lnbmVkIGxvbmcgbG9uZyAgZ2V0X2NsaWNrKCB2b2lkICl7Ci0gICAgCisKICAgICByZXR1cm4gKF9jbGlja19zdG9wLm42NC1fY2xpY2tfc3RhcnQubjY0KTsKIAotICB9ICAgIAorICB9CiAKICAgaW5saW5lIHZvaWQgZmluZF9mcmVxdWVuY3koIHZvaWQgKXsKIApAQCAtMTAzLDcwICsxMDMsNzAgQEAKICAgICAvLyAgICBJTkZPUygiZmluZSBncmFpbmVkIHRpbWUgOiAiPDwgIGdldF9lbGFwc2VkX3RpbWVfaW5fc2Vjb25kKCkpOwogICAgIC8vICBJTkZPUygiY29hcnNlIGdyYWluZWQgdGltZSA6ICI8PCAgZmluYWwtaW5pdGlhbCk7CiAgICAgX2ZyZXF1ZW5jeT1fZnJlcXVlbmN5KmdldF9lbGFwc2VkX3RpbWVfaW5fc2Vjb25kKCkvZG91YmxlKGZpbmFsLWluaXRpYWwpOwotICAgIC8vLyAgSU5GT1MoIkNQVSBmcmVxdWVuY3kgOiAiPDwgIF9mcmVxdWVuY3kpOyAgICAgICAgCisgICAgLy8vICBJTkZPUygiQ1BVIGZyZXF1ZW5jeSA6ICI8PCAgX2ZyZXF1ZW5jeSk7CiAKICAgfQogCiAgIHZvaWQgIGFkZF9nZXRfY2xpY2soIHZvaWQgKXsKLSAgICAgICAKKwogICAgIF9uYl9zYW1wbGUrKzsKICAgICBfY291bnRlZF9jbGlja3NbZ2V0X2NsaWNrKCldKys7CiAgICAgZmlsbF9oaXN0b3J5X2NsaWNrcygpOwogCi0gIH0gICAgCisgIH0KIAogICB2b2lkIGR1bXBfc3RhdGlzdGljcyhzdHJpbmcgZmlsZW1hbmUpewotICAgIAorCiAgICAgb2ZzdHJlYW0gb3V0ZmlsZSAoZmlsZW1hbmUuY19zdHIoKSxpb3M6Om91dCkgOwogCiAgICAgc3RkOjptYXA8dW5zaWduZWQgbG9uZyBsb25nICwgdW5zaWduZWQgbG9uZyBsb25nPjo6aXRlcmF0b3IgaXRyOwogICAgIGZvcihpdHI9X2NvdW50ZWRfY2xpY2tzLmJlZ2luKCkgOyBpdHIhPV9jb3VudGVkX2NsaWNrcy5lbmQoKSAgOyBpdHIrKykKLSAgICAgIHsgICAgICAKLSAgICAgIG91dGZpbGUgIDw8ICgqaXRyKS5maXJzdCA8PCAiICAiIDw8ICgqaXRyKS5zZWNvbmQgPDwgZW5kbCA7ICAgICAgIAotICAgICAgfSAgICAgIAotICAgIAorICAgICAgeworICAgICAgb3V0ZmlsZSAgPDwgKCppdHIpLmZpcnN0IDw8ICIgICIgPDwgKCppdHIpLnNlY29uZCA8PCBlbmRsIDsKKyAgICAgIH0KKwogICAgIG91dGZpbGUuY2xvc2UoKTsKIAogICB9CiAKICAgdm9pZCBkdW1wX2hpc3Rvcnkoc3RyaW5nIGZpbGVtYW5lKXsKLSAgICAKKwogICAgIG9mc3RyZWFtIG91dGZpbGUgKGZpbGVtYW5lLmNfc3RyKCksaW9zOjpvdXQpIDsKIAogCiAKLSAgICBmb3IoaW50IGk9MCA7IGk8X2hpc3RvcnlfbWVhbl9jbGlja3Muc2l6ZSgpIDsgaSsrKQotICAgICAgeyAgICAgIAotCW91dGZpbGUgIDw8IGkgPDwgIiAiIAotCQkgPDwgX2hpc3RvcnlfbWVhbl9jbGlja3NbaV0gPDwgIiAiIAotCQkgPDwgX2hpc3Rvcnlfc2hvcnRlc3RfY2xpY2tzW2ldIDw8ICIgIiAKKyAgICBmb3IodW5zaWduZWQgaT0wIDsgaTxfaGlzdG9yeV9tZWFuX2NsaWNrcy5zaXplKCkgOyBpKyspCisgICAgICB7CisJb3V0ZmlsZSAgPDwgaSA8PCAiICIKKwkJIDw8IF9oaXN0b3J5X21lYW5fY2xpY2tzW2ldIDw8ICIgIgorCQkgPDwgX2hpc3Rvcnlfc2hvcnRlc3RfY2xpY2tzW2ldIDw8ICIgIgogCQkgPDwgX2hpc3RvcnlfbW9zdF9vY2N1cmVkX2NsaWNrc1tpXSA8PCBlbmRsIDsKLSAgICAgIH0gICAgICAKLSAgICAKKyAgICAgIH0KKwogICAgIG91dGZpbGUuY2xvc2UoKTsKIAogICB9Ci0gICAgIAorCiAKIAogICBkb3VibGUgZ2V0X21lYW5fY2xpY2tzKCB2b2lkICl7Ci0gICAgCisKICAgICBzdGQ6Om1hcDx1bnNpZ25lZCBsb25nIGxvbmcsdW5zaWduZWQgbG9uZyBsb25nPjo6aXRlcmF0b3IgaXRyOwotICAgIAorCiAgICAgdW5zaWduZWQgbG9uZyBsb25nIG1lYW5fY2xpY2tzPTA7CiAKICAgICBmb3IoaXRyPV9jb3VudGVkX2NsaWNrcy5iZWdpbigpIDsgaXRyIT1fY291bnRlZF9jbGlja3MuZW5kKCkgIDsgaXRyKyspCi0gICAgICB7ICAgICAgCi0JCisgICAgICB7CisKIAltZWFuX2NsaWNrcys9KCppdHIpLnNlY29uZCooKml0cikuZmlyc3Q7Ci0gICAgICB9ICAgICAgCisgICAgICB9CiAKICAgICByZXR1cm4gbWVhbl9jbGlja3MvZG91YmxlKF9uYl9zYW1wbGUpOwogCiAgIH0KIAogICBkb3VibGUgZ2V0X3Nob3J0ZXN0X2NsaWNrcyggdm9pZCApewotICAgIAorCiAgICAgcmV0dXJuIGRvdWJsZSgoKl9jb3VudGVkX2NsaWNrcy5iZWdpbigpKS5maXJzdCk7CiAKICAgfQpAQCAtMTg4LDE4ICsxODgsMTggQEAKICAgICBzdGQ6Om1hcDx1bnNpZ25lZCBsb25nIGxvbmcsdW5zaWduZWQgbG9uZyBsb25nPjo6aXRlcmF0b3IgaXRyOwogCiAgICAgZm9yKGl0cj1fY291bnRlZF9jbGlja3MuYmVnaW4oKSA7IGl0ciE9X2NvdW50ZWRfY2xpY2tzLmVuZCgpICA7IGl0cisrKQotICAgICAgeyAgICAgIAotCQorICAgICAgeworCiAJaWYgKG1heF9vY2N1cmVuY2U8PSgqaXRyKS5zZWNvbmQpewogCSAgbWF4X29jY3VyZW5jZT0oKml0cikuc2Vjb25kOwogCSAgbW9jPSgqaXRyKS5maXJzdDsKIAl9Ci0gICAgICB9ICAgICAgCi0gICAgCi0gICAgcmV0dXJuIGRvdWJsZShtb2MpOyAgICAKKyAgICAgIH0KKworICAgIHJldHVybiBkb3VibGUobW9jKTsKIAogICB9Ci0gIAorCiAgIHZvaWQgY2xlYXIoIHZvaWQgKQogICB7CiAgICAgX2NvdW50ZWRfY2xpY2tzLmNsZWFyKCk7CkBAIC0yMTIsOSArMjEyLDkgQEAKICAgfQogCiAKLSAgICAKKwogcHJpdmF0ZSA6Ci0gIAorCiAgIHVuaW9uCiAgIHsKICAgICB1bnNpZ25lZCBsb25nIGludCBuMzJbMl0gOwpAQCAtMjM3LDcgKzIzNyw3IEBACiAKICAgdW5zaWduZWQgbG9uZyBsb25nIF9uYl9zYW1wbGU7CiAKLSAgCisKIAogfTsKIApkaWZmIC1OdXIgQlRMLTIwMDMwMTI0L2dlbmVyaWNfYmVuY2gvdGltZXJzL3g4Nl90aW1lci5oaH4gQlRML2dlbmVyaWNfYmVuY2gvdGltZXJzL3g4Nl90aW1lci5oaH4KLS0tIEJUTC0yMDAzMDEyNC9nZW5lcmljX2JlbmNoL3RpbWVycy94ODZfdGltZXIuaGh+CTIwMDMtMDEtMDcgMTc6MzE6NTguMDAwMDAwMDAwICswMTAwCisrKyBCVEwvZ2VuZXJpY19iZW5jaC90aW1lcnMveDg2X3RpbWVyLmhofgkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAwMCArMDEwMApAQCAtMSwyNDUgKzAsMCBAQAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gRmlsZSAgIDogIHg4Nl90aW1lci5oaAotLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4gICAgICAgIAotLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbWFyIGTpYyAzIDE4OjU5OjM1IENFVCAyMDAyCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyAKLS8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLS8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0vLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0vLyAKLS8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLS8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLS8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLS8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgotLy8gCi0jaWZuZGVmIF9YODZfVElNRVJfSEgKLSNkZWZpbmUgX1g4Nl9USU1FUl9ISAotCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvdGltZXMuaD4KLS8vI2luY2x1ZGUgInN5c3RlbV90aW1lLmgiCi0jaW5jbHVkZSA8YXNtL21zci5oPgotI2luY2x1ZGUgInV0aWxpdGllcy5oIgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLQotLy8gZnJlcXVlbmNlIGRlIGxhIGJlY2FubmUgZW4gSHoKLS8vI2RlZmluZSBGUkVRVUVOQ1kgNjQ4MDAwMDAwCi0vLyNkZWZpbmUgRlJFUVVFTkNZIDE0MDAwMDAwMDAKLSNkZWZpbmUgRlJFUVVFTkNZIDE2OTUwMDAwMDAKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi1jbGFzcyBYODZfVGltZXIgewotCi1wdWJsaWMgOgotCi0gIFg4Nl9UaW1lciggdm9pZCApOl9mcmVxdWVuY3koRlJFUVVFTkNZKSxfbmJfc2FtcGxlKDApCi0gIHsKLSAgICBNRVNTQUdFKCJYODZfVGltZXIgRGVmYXVsdCBDdG9yIik7ICAgIAotICB9Ci0KLSAgaW5saW5lIHZvaWQgc3RhcnQoIHZvaWQgKXsKLQotICAgIHJkdHNjKF9jbGlja19zdGFydC5uMzJbMF0sX2NsaWNrX3N0YXJ0Lm4zMlsxXSk7Ci0KLSAgfQotCi0KLSAgaW5saW5lIHZvaWQgc3RvcCggdm9pZCApewotCi0gICAgcmR0c2MoX2NsaWNrX3N0b3AubjMyWzBdLF9jbGlja19zdG9wLm4zMlsxXSk7Ci0KLSAgfQotICAKLQotICBpbmxpbmUgZG91YmxlIGZyZXF1ZW5jeSggdm9pZCApewotICAgIHJldHVybiBfZnJlcXVlbmN5OwotICB9Ci0KLSAgZG91YmxlIGdldF9lbGFwc2VkX3RpbWVfaW5fc2Vjb25kKCB2b2lkICl7Ci0KLSAgICByZXR1cm4gKF9jbGlja19zdG9wLm42NC1fY2xpY2tfc3RhcnQubjY0KS9kb3VibGUoRlJFUVVFTkNZKTsKLQotCi0gIH0gICAgCi0KLSAgdW5zaWduZWQgbG9uZyBsb25nICBnZXRfY2xpY2soIHZvaWQgKXsKLSAgICAKLSAgICByZXR1cm4gKF9jbGlja19zdG9wLm42NC1fY2xpY2tfc3RhcnQubjY0KTsKLQotICB9ICAgIAotCi0gIGlubGluZSB2b2lkIGZpbmRfZnJlcXVlbmN5KCB2b2lkICl7Ci0KLSAgICB0aW1lX3QgaW5pdGlhbCwgZmluYWw7Ci0gICAgaW50IGR1bW15PTI7Ci0KLSAgICBpbml0aWFsID0gdGltZSgwKTsKLSAgICBzdGFydCgpOwotICAgIGRvIHsKLSAgICAgIGR1bW15Kz0yOwotICAgIH0KLSAgICB3aGlsZSh0aW1lKDApPT1pbml0aWFsKTsKLSAgICAvLyBPbiBlc3QgYXUgZGVidXQgZCd1biBjeWNsZSBkJ3VuZSBzZWNvbmRlICEhIQotICAgIGluaXRpYWwgPSB0aW1lKDApOwotICAgIHN0YXJ0KCk7Ci0gICAgZG8gewotICAgICAgZHVtbXkrPTI7Ci0gICAgfQotICAgIHdoaWxlKHRpbWUoMCk9PWluaXRpYWwpOwotICAgIGZpbmFsPXRpbWUoMCk7Ci0gICAgc3RvcCgpOwotICAgIElORk9TKCJmaW5lIGdyYWluZWQgdGltZSA6ICI8PCAgZ2V0X2VsYXBzZWRfdGltZV9pbl9zZWNvbmQoKSk7Ci0gICAgSU5GT1MoImNvYXJzZSBncmFpbmVkIHRpbWUgOiAiPDwgIGZpbmFsLWluaXRpYWwpOwotICAgIF9mcmVxdWVuY3k9X2ZyZXF1ZW5jeSpnZXRfZWxhcHNlZF90aW1lX2luX3NlY29uZCgpL2RvdWJsZShmaW5hbC1pbml0aWFsKTsKLSAgICBJTkZPUygiQ1BVIGZyZXF1ZW5jeSA6ICI8PCAgX2ZyZXF1ZW5jeSk7ICAgICAgICAKLQotICB9Ci0KLSAgdm9pZCAgYWRkX2dldF9jbGljayggdm9pZCApewotICAgICAgIAotICAgIF9uYl9zYW1wbGUrKzsKLSAgICBfY291bnRlZF9jbGlja3NbZ2V0X2NsaWNrKCldKys7Ci0gICAgZmlsbF9oaXN0b3J5X2NsaWNrcygpOwotCi0gIH0gICAgCi0KLSAgdm9pZCBkdW1wX3N0YXRpc3RpY3Moc3RyaW5nIGZpbGVtYW5lKXsKLSAgICAKLSAgICBvZnN0cmVhbSBvdXRmaWxlIChmaWxlbWFuZS5jX3N0cigpLGlvczo6b3V0KSA7Ci0KLSAgICBzdGQ6Om1hcDx1bnNpZ25lZCBsb25nIGxvbmcgLCB1bnNpZ25lZCBsb25nIGxvbmc+OjppdGVyYXRvciBpdHI7Ci0gICAgZm9yKGl0cj1fY291bnRlZF9jbGlja3MuYmVnaW4oKSA7IGl0ciE9X2NvdW50ZWRfY2xpY2tzLmVuZCgpICA7IGl0cisrKQotICAgICAgeyAgICAgIAotICAgICAgb3V0ZmlsZSAgPDwgKCppdHIpLmZpcnN0IDw8ICIgICIgPDwgKCppdHIpLnNlY29uZCA8PCBlbmRsIDsgICAgICAgCi0gICAgICB9ICAgICAgCi0gICAgCi0gICAgb3V0ZmlsZS5jbG9zZSgpOwotCi0gIH0KLQotICB2b2lkIGR1bXBfaGlzdG9yeShzdHJpbmcgZmlsZW1hbmUpewotICAgIAotICAgIG9mc3RyZWFtIG91dGZpbGUgKGZpbGVtYW5lLmNfc3RyKCksaW9zOjpvdXQpIDsKLQotCi0KLSAgICBmb3IoaW50IGk9MCA7IGk8X2hpc3RvcnlfbWVhbl9jbGlja3Muc2l6ZSgpIDsgaSsrKQotICAgICAgeyAgICAgIAotCW91dGZpbGUgIDw8IGkgPDwgIiAiIAotCQkgPDwgX2hpc3RvcnlfbWVhbl9jbGlja3NbaV0gPDwgIiAiIAotCQkgPDwgX2hpc3Rvcnlfc2hvcnRlc3RfY2xpY2tzW2ldIDw8ICIgIiAKLQkJIDw8IF9oaXN0b3J5X21vc3Rfb2NjdXJlZF9jbGlja3NbaV0gPDwgZW5kbCA7Ci0gICAgICB9ICAgICAgCi0gICAgCi0gICAgb3V0ZmlsZS5jbG9zZSgpOwotCi0gIH0KLSAgICAgCi0KLQotICBkb3VibGUgZ2V0X21lYW5fY2xpY2tzKCB2b2lkICl7Ci0gICAgCi0gICAgc3RkOjptYXA8dW5zaWduZWQgbG9uZyBsb25nLHVuc2lnbmVkIGxvbmcgbG9uZz46Oml0ZXJhdG9yIGl0cjsKLSAgICAKLSAgICB1bnNpZ25lZCBsb25nIGxvbmcgbWVhbl9jbGlja3M9MDsKLQotICAgIGZvcihpdHI9X2NvdW50ZWRfY2xpY2tzLmJlZ2luKCkgOyBpdHIhPV9jb3VudGVkX2NsaWNrcy5lbmQoKSAgOyBpdHIrKykKLSAgICAgIHsgICAgICAKLQkKLQltZWFuX2NsaWNrcys9KCppdHIpLnNlY29uZCooKml0cikuZmlyc3Q7Ci0gICAgICB9ICAgICAgCi0KLSAgICByZXR1cm4gbWVhbl9jbGlja3MvZG91YmxlKF9uYl9zYW1wbGUpOwotCi0gIH0KLQotICBkb3VibGUgZ2V0X3Nob3J0ZXN0X2NsaWNrcyggdm9pZCApewotICAgIAotICAgIHJldHVybiBkb3VibGUoKCpfY291bnRlZF9jbGlja3MuYmVnaW4oKSkuZmlyc3QpOwotCi0gIH0KLQotICB2b2lkIGZpbGxfaGlzdG9yeV9jbGlja3MoIHZvaWQgKXsKLQotICAgIF9oaXN0b3J5X21lYW5fY2xpY2tzLnB1c2hfYmFjayhnZXRfbWVhbl9jbGlja3MoKSk7Ci0gICAgX2hpc3Rvcnlfc2hvcnRlc3RfY2xpY2tzLnB1c2hfYmFjayhnZXRfc2hvcnRlc3RfY2xpY2tzKCkpOwotICAgIF9oaXN0b3J5X21vc3Rfb2NjdXJlZF9jbGlja3MucHVzaF9iYWNrKGdldF9tb3N0X29jY3VyZWRfY2xpY2tzKCkpOwotCi0gIH0KLQotCi0gIGRvdWJsZSBnZXRfbW9zdF9vY2N1cmVkX2NsaWNrcyggdm9pZCApewotCi0gICAgdW5zaWduZWQgbG9uZyBsb25nIG1vYz0wOwotICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBtYXhfb2NjdXJlbmNlPTA7Ci0KLSAgICBzdGQ6Om1hcDx1bnNpZ25lZCBsb25nIGxvbmcsdW5zaWduZWQgbG9uZyBsb25nPjo6aXRlcmF0b3IgaXRyOwotCi0gICAgZm9yKGl0cj1fY291bnRlZF9jbGlja3MuYmVnaW4oKSA7IGl0ciE9X2NvdW50ZWRfY2xpY2tzLmVuZCgpICA7IGl0cisrKQotICAgICAgeyAgICAgIAotCQotCWlmIChtYXhfb2NjdXJlbmNlPD0oKml0cikuc2Vjb25kKXsKLQkgIG1heF9vY2N1cmVuY2U9KCppdHIpLnNlY29uZDsKLQkgIG1vYz0oKml0cikuZmlyc3Q7Ci0JfQotICAgICAgfSAgICAgIAotICAgIAotICAgIHJldHVybiBkb3VibGUobW9jKTsgICAgCi0KLSAgfQotICAKLSAgdm9pZCBjbGVhciggdm9pZCApCi0gIHsKLSAgICBfY291bnRlZF9jbGlja3MuY2xlYXIoKTsKLQotICAgIF9oaXN0b3J5X21lYW5fY2xpY2tzLmNsZWFyKCk7Ci0gICAgX2hpc3Rvcnlfc2hvcnRlc3RfY2xpY2tzLmNsZWFyKCk7Ci0gICAgX2hpc3RvcnlfbW9zdF9vY2N1cmVkX2NsaWNrcy5jbGVhcigpOwotCi0gICAgX25iX3NhbXBsZT0wOwotICB9Ci0KLQotICAgIAotcHJpdmF0ZSA6Ci0gIAotICB1bmlvbgotICB7Ci0gICAgdW5zaWduZWQgbG9uZyBpbnQgbjMyWzJdIDsKLSAgICB1bnNpZ25lZCBsb25nIGxvbmcgbjY0IDsKLSAgfSBfY2xpY2tfc3RhcnQ7Ci0KLSAgdW5pb24KLSAgewotICAgIHVuc2lnbmVkIGxvbmcgaW50IG4zMlsyXSA7Ci0gICAgdW5zaWduZWQgbG9uZyBsb25nIG42NCA7Ci0gIH0gX2NsaWNrX3N0b3A7Ci0KLSAgZG91YmxlIF9mcmVxdWVuY3kgOwotCi0gIG1hcDx1bnNpZ25lZCBsb25nIGxvbmcsdW5zaWduZWQgbG9uZyBsb25nPiBfY291bnRlZF9jbGlja3M7Ci0KLSAgdmVjdG9yPGRvdWJsZT4gX2hpc3RvcnlfbWVhbl9jbGlja3M7Ci0gIHZlY3Rvcjxkb3VibGU+IF9oaXN0b3J5X3Nob3J0ZXN0X2NsaWNrczsKLSAgdmVjdG9yPGRvdWJsZT4gX2hpc3RvcnlfbW9zdF9vY2N1cmVkX2NsaWNrczsKLQotICB1bnNpZ25lZCBsb25nIGxvbmcgX25iX3NhbXBsZTsKLQotICAKLQotfTsKLQotCi0jZW5kaWYKZGlmZiAtTnVyIEJUTC0yMDAzMDEyNC9nZW5lcmljX2JlbmNoL3V0aWxzL2R1bXBfZmlsZV94X3kuaGggQlRML2dlbmVyaWNfYmVuY2gvdXRpbHMvZHVtcF9maWxlX3hfeS5oaAotLS0gQlRMLTIwMDMwMTI0L2dlbmVyaWNfYmVuY2gvdXRpbHMvZHVtcF9maWxlX3hfeS5oaAkyMDAyLTExLTIxIDE2OjA0OjA2LjAwMDAwMDAwMCArMDEwMAorKysgQlRML2dlbmVyaWNfYmVuY2gvdXRpbHMvZHVtcF9maWxlX3hfeS5oaAkyMDAzLTExLTEyIDE5OjUzOjIzLjAwMDAwMDAwMCArMDEwMApAQCAtMSwxNCArMSwxNCBAQAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gRmlsZSAgIDogIGR1bXBfZmlsZV94X3kuaGgKLS8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+ICAgICAgICAKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CiAvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjIwIENFU1QgMjAwMgogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gCisvLwogLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIC8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCiAvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLS8vIAorLy8KIC8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIC8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKQEAgLTE2LDkgKzE2LDEwIEBACiAvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIC8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgotLy8gCisvLwogI2lmbmRlZiBEVU1QX0ZJTEVfWF9ZX0hICiAjZGVmaW5lIERVTVBfRklMRV9YX1lfSEgKKwogI2luY2x1ZGUgPGZzdHJlYW0+CiAjaW5jbHVkZSA8c3RyaW5nPgogCkBAIC0yNywyMSArMjgsMTcgQEAKIC8vICAgICAgICAgICAgW10gb3BlcmF0b3IgZm9yIHNldGluZyBlbGVtZW50CiAvLyB0aGUgdmVjdG9yIGVsZW1lbnQgbXVzdCBoYXZlIHRoZSA8PCBvcGVyYXRvciBkZWZpbmUKIAotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQogdGVtcGxhdGU8Y2xhc3MgVmVjdG9yX0EsIGNsYXNzIFZlY3Rvcl9CPgotdm9pZCBkdW1wX2ZpbGVfeF95KGNvbnN0IFZlY3Rvcl9BICYgWCwgY29uc3QgVmVjdG9yX0IgJiBZLCBjb25zdCBzdGQ6OnN0cmluZyAmIGZpbGVuYW1lKXsKLSAgCi0gIG9mc3RyZWFtIG91dGZpbGUgKGZpbGVuYW1lLmNfc3RyKCksaW9zOjpvdXQpIDsKLSAgaW50IHNpemU9WC5zaXplKCk7Ci0gIAotICBmb3IgKGludCBpPTA7aTxzaXplO2krKyl7Cit2b2lkIGR1bXBfZmlsZV94X3koY29uc3QgVmVjdG9yX0EmIFgsIGNvbnN0IFZlY3Rvcl9CJiBZLCBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpIHsKIAotICAgICAgb3V0ZmlsZSA8PCBYW2ldIDw8ICIgIiA8PCBZW2ldIDw8IGVuZGwgOworICBzdGQ6Om9mc3RyZWFtIG91dGZpbGUgKGZpbGVuYW1lLmNfc3RyKCksIHN0ZDo6aW9zOjpvdXQpIDsKKyAgdW5zaWduZWQgc2l6ZT1YLnNpemUoKTsKIAorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgb3V0ZmlsZSA8PCBYW2ldIDw8ICIgIiA8PCBZW2ldIDw8IHN0ZDo6ZW5kbDsKICAgfQogCiAgIG91dGZpbGUuY2xvc2UoKTsKLX0gCit9CiAKICNlbmRpZgpkaWZmIC1OdXIgQlRMLTIwMDMwMTI0L2dlbmVyaWNfYmVuY2gvdXRpbHMvc2l6ZV9saW5fbG9nLmhoIEJUTC9nZW5lcmljX2JlbmNoL3V0aWxzL3NpemVfbGluX2xvZy5oaAotLS0gQlRMLTIwMDMwMTI0L2dlbmVyaWNfYmVuY2gvdXRpbHMvc2l6ZV9saW5fbG9nLmhoCTIwMDMtMDEtMTQgMTk6NTI6NTkuMDAwMDAwMDAwICswMTAwCisrKyBCVEwvZ2VuZXJpY19iZW5jaC91dGlscy9zaXplX2xpbl9sb2cuaGgJMjAwMy0xMS0xMiAxOTo1NToyMy4wMDAwMDAwMDAgKzAxMDAKQEAgLTEsMTQgKzEsMTQgQEAKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vIEZpbGUgICA6ICBzaXplX2xpbl9sb2cuaGgKLS8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+ICAgICAgICAKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CiAvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBtYXIgZOljIDMgMTg6NTk6MzcgQ0VUIDIwMDIKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIAorLy8KIC8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIC8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgogLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0vLyAKKy8vCiAvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIC8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCkBAIC0xNiw3ICsxNiw3IEBACiAvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIC8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgotLy8gCisvLwogI2lmbmRlZiBTSVpFX0xJTl9MT0cKICNkZWZpbmUgU0laRV9MSU5fTE9HCiAKQEAgLTMwLDQxICszMCwyNyBAQAogCiAgIFgucmVzaXplKG5iX3BvaW50KTsKIAotICBpZiAobmJfcG9pbnQ+dGVuKXsKLQotICAgIGZvciAoaW50IGk9MDtpPG5pbmU7aSsrKXsKLSAgICAgIAotICAgICAgWFtpXT1pKzE7Ci0KKyAgaWYobmJfcG9pbnQgPiB0ZW4pIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5pbmU7IGkrKykgeworICAgICAgWFtpXSA9IGkrMTsKICAgICB9CiAKICAgICBWZWN0b3IgbG9nX3NpemU7Ci0gICAgc2l6ZV9sb2cobmJfcG9pbnQtbmluZSx0ZW4sc2l6ZV9tYXgsbG9nX3NpemUpOwogCi0gICAgZm9yIChpbnQgaT0wO2k8bmJfcG9pbnQtbmluZTtpKyspewotICAgICAgCi0gICAgICBYW2krbmluZV09bG9nX3NpemVbaV07CisgICAgc2l6ZV9sb2cobmJfcG9pbnQtbmluZSwgdGVuLCBzaXplX21heCwgbG9nX3NpemUpOwogCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYl9wb2ludC1uaW5lOyBpKyspIHsKKyAgICAgIFhbaStuaW5lXSA9IGxvZ19zaXplW2ldOwogICAgIH0KLSAgfQotICBlbHNlewotCi0gICAgZm9yIChpbnQgaT0wO2k8bmJfcG9pbnQ7aSsrKXsKLSAgICAgIAotICAgICAgWFtpXT1pKzE7Ci0KKyAgfSBlbHNleworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmJfcG9pbnQ7IGkrKykgeworICAgICAgWFtpXSA9IGkrMTsKICAgICB9CiAgIH0KIAotIC8vICBmb3IgKGludCBpPTA7aTxuYl9wb2ludDtpKyspewotICAgIAotLy8gICAgICAgIElORk9TKCJjb21wdXRlZCBzaXplcyA6IFhbIjw8aTw8Il09Ijw8WFtpXSk7Ci0gICAgCi0vLyAgIH0KLQorICAvLyBmb3IgKGludCBpPTA7aTxuYl9wb2ludDtpKyspeworICAvLyAgIElORk9TKCJjb21wdXRlZCBzaXplcyA6IFhbIjw8aTw8Il09Ijw8WFtpXSk7CisgIC8vIH0KIH0KLSAgCi0jZW5kaWYKLSAgICAKLQogCisjZW5kaWYKZGlmZiAtTnVyIEJUTC0yMDAzMDEyNC9nZW5lcmljX2JlbmNoL3V0aWxzL3NpemVfbG9nLmhoIEJUTC9nZW5lcmljX2JlbmNoL3V0aWxzL3NpemVfbG9nLmhoCi0tLSBCVEwtMjAwMzAxMjQvZ2VuZXJpY19iZW5jaC91dGlscy9zaXplX2xvZy5oaAkyMDAyLTEyLTAyIDE5OjU0OjQ2LjAwMDAwMDAwMCArMDEwMAorKysgQlRML2dlbmVyaWNfYmVuY2gvdXRpbHMvc2l6ZV9sb2cuaGgJMjAwMy0xMC0zMCAxOTo1NjoxNC4wMDAwMDAwMDAgKzAxMDAKQEAgLTEsMTQgKzEsMTQgQEAKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vIEZpbGUgICA6ICBzaXplX2xvZy5oaAotLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4gICAgICAgIAorLy8gQXV0aG9yIDogIEwuIFBsYWduZSA8bGF1cmVudC5wbGFnbmVAZWRmLmZyKT4KIC8vIENvcHlyaWdodCAoQykgRURGIFImRCwgIGx1biBzZXAgMzAgMTQ6MjM6MTcgQ0VTVCAyMDAyCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyAKKy8vCiAvLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAvLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogLy8gYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKIC8vIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotLy8gCisvLwogLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQpAQCAtMTYsNyArMTYsNyBAQAogLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIC8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KLS8vIAorLy8KICNpZm5kZWYgU0laRV9MT0cKICNkZWZpbmUgU0laRV9MT0cKIApAQCAtNDIsOCArNDIsOCBAQAogICBmb3IgKGludCBpPTA7aTxuYl9wb2ludDtpKyspewogCiAgICAgbHMgPSBsc19taW4gKyBmbG9hdChpKSpkZWx0YV9scyA7Ci0gICAgCi0gICAgc2l6ZT1pbnQoZXhwKGxzKSk7IAorCisgICAgc2l6ZT1pbnQoZXhwKGxzKSk7CiAKICAgICBYW2ldPXNpemU7CiAgIH0KZGlmZiAtTnVyIEJUTC0yMDAzMDEyNC9saWJzL0FUTEFTL01ha2VmaWxlIEJUTC9saWJzL0FUTEFTL01ha2VmaWxlCi0tLSBCVEwtMjAwMzAxMjQvbGlicy9BVExBUy9NYWtlZmlsZQkyMDAyLTExLTIxIDE2OjA0OjA2LjAwMDAwMDAwMCArMDEwMAorKysgQlRML2xpYnMvQVRMQVMvTWFrZWZpbGUJMjAwMy0xMS0xNSAwNzozMToxMC4wMDAwMDAwMDAgKzAxMDAKQEAgLTEsMTAgKzEsMTAgQEAKLWluY2x1ZGUgJChCRU5DSF9CQVNFKS9NYWtlZmlsZS5pbiAKK2luY2x1ZGUgJChCRU5DSF9CQVNFKS9NYWtlZmlsZS5pbgogCiBJTkNMVURFUz0kKElOQ0xVREVTX0JBU0UpIC1JJChGT1JUUkFOX0RJUikgLUkkKEFUTEFTX0JMQVNfSU5DTFVERSkgLUkkKEFUTEFTX0JMQVNfSU5DTFVERTIpCiBPUFRJTT0kKE9QVElNX0JBU0UpCiBERUJVRz0kKERFQlVHX0JBU0UpCiAKLUNYWEZMQUdTID0gJChPUFRJTSkgJChJTkNMVURFUykKK0NYWEZMQUdTID0gJChPUFRJTSkgJChJTkNMVURFUykgLUREUkVBTAogCiBMSUJTPSQoTElCU19CQVNFKSAtTCQoQVRMQVNfQkxBU19MSUIpIC1sbGFwYWNrIC1sY2JsYXMgLWxhdGxhcwogCkBAIC0xMiwxMiArMTIsMTAgQEAKIAogYWxsIDogJChERVBFTkRfQkFTRSkgbWFpbgogCi1tYWluOglNYWtlZmlsZSBtYWluLm8gIAotCSQoQ1hYKSAtbyBtYWluIG1haW4ubyAgICQoTElCUykgCittYWluOglNYWtlZmlsZSBtYWluLm8KKwkkKENYWCkgLW8gbWFpbiBtYWluLm8gICAkKExJQlMpCiAKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKIG1haW4ubyA6ICQoREVQRU5EX0JBU0UpIG1haW4uY3BwIEFUTEFTX2ludGVyZmFjZS5oaAotCi0KZGlmZiAtTnVyIEJUTC0yMDAzMDEyNC9saWJzL3RpbnlfYmxpdHovbWFpbi5jcHAgQlRML2xpYnMvdGlueV9ibGl0ei9tYWluLmNwcAotLS0gQlRMLTIwMDMwMTI0L2xpYnMvdGlueV9ibGl0ei9tYWluLmNwcAkyMDAzLTAxLTIxIDEzOjAzOjQwLjAwMDAwMDAwMCArMDEwMAorKysgQlRML2xpYnMvdGlueV9ibGl0ei9tYWluLmNwcAkyMDAzLTExLTEzIDIxOjExOjUyLjAwMDAwMDAwMCArMDEwMApAQCAtMSwxNCArMSwxNCBAQAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gRmlsZSAgIDogIG1haW4uY3BwCi0vLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPiAgICAgICAgCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgogLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzozMCBDRVNUIDIwMDIKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIAorLy8KIC8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIC8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgogLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0vLyAKKy8vCiAvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIC8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCkBAIC0xNiw3ICsxNiw3IEBACiAvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIC8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgotLy8gCisvLwogI2luY2x1ZGUgInV0aWxpdGllcy5oIgogI2luY2x1ZGUgInRpbnlfYmxpdHpfaW50ZXJmYWNlLmhoIgogI2luY2x1ZGUgInN0YXRpYy9iZW5jaF9zdGF0aWMuaGgiCkBAIC0yNywxMSArMjcsOSBAQAogCiBpbnQgbWFpbigpCiB7Ci0gIGJlbmNoX3N0YXRpYzxBY3Rpb25fYXhweSx0aW55X2JsaXR6X2ludGVyZmFjZT4oKTsKLSAgYmVuY2hfc3RhdGljPEFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QsdGlueV9ibGl0el9pbnRlcmZhY2U+KCk7Ci0gIGJlbmNoX3N0YXRpYzxBY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0LHRpbnlfYmxpdHpfaW50ZXJmYWNlPigpOworICBiZW5jaF9zdGF0aWM8QWN0aW9uX2F4cHksdGlueV9ibGl0el9pbnRlcmZhY2UsIFRJTllfTVZfTUFYX1NJWkU+KCk7CisgIGJlbmNoX3N0YXRpYzxBY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0LHRpbnlfYmxpdHpfaW50ZXJmYWNlLCBUSU5ZX01WX01BWF9TSVpFPigpOworICBiZW5jaF9zdGF0aWM8QWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdCx0aW55X2JsaXR6X2ludGVyZmFjZSwgVElOWV9NVl9NQVhfU0laRT4oKTsKIAogICByZXR1cm4gMDsKIH0KLQotCmRpZmYgLU51ciBCVEwtMjAwMzAxMjQvbGlicy90dm1ldC9tYWluLmNwcCBCVEwvbGlicy90dm1ldC9tYWluLmNwcAotLS0gQlRMLTIwMDMwMTI0L2xpYnMvdHZtZXQvbWFpbi5jcHAJMjAwMy0wMS0yMSAxMzowNToxNy4wMDAwMDAwMDAgKzAxMDAKKysrIEJUTC9saWJzL3R2bWV0L21haW4uY3BwCTIwMDMtMTEtMTQgMTM6Mjk6NTcuMDAwMDAwMDAwICswMTAwCkBAIC0xLDE0ICsxLDE0IEBACiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBGaWxlICAgOiAgbWFpbi5jcHAKLS8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+ICAgICAgICAKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CiAvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjMwIENFU1QgMjAwMgogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gCisvLwogLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIC8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCiAvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLS8vIAorLy8KIC8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIC8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKQEAgLTE2LDIxICsxNiwyNCBAQAogLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIC8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KLS8vIAorLy8KICNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKICNpbmNsdWRlICJ0dm1ldF9pbnRlcmZhY2UuaGgiCiAjaW5jbHVkZSAic3RhdGljL2JlbmNoX3N0YXRpYy5oaCIKICNpbmNsdWRlICJhY3Rpb25fbWF0cml4X3ZlY3Rvcl9wcm9kdWN0LmhoIgogI2luY2x1ZGUgImFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QuaGgiCiAjaW5jbHVkZSAiYWN0aW9uX2F4cHkuaGgiCisjaW5jbHVkZSAiYWN0aW9uX2F0YV9wcm9kdWN0LmhoIgorI2luY2x1ZGUgImFjdGlvbl9hYXRfcHJvZHVjdC5oaCIKKwogCiBpbnQgbWFpbigpCiB7Ci0gIGJlbmNoX3N0YXRpYzxBY3Rpb25fYXhweSx0dm1ldF9pbnRlcmZhY2U+KCk7Ci0gIGJlbmNoX3N0YXRpYzxBY3Rpb25fbWF0cml4X21hdHJpeF9wcm9kdWN0LHR2bWV0X2ludGVyZmFjZT4oKTsKLSAgYmVuY2hfc3RhdGljPEFjdGlvbl9tYXRyaXhfdmVjdG9yX3Byb2R1Y3QsdHZtZXRfaW50ZXJmYWNlPigpOworICBiZW5jaF9zdGF0aWM8QWN0aW9uX2F4cHksdHZtZXRfaW50ZXJmYWNlLCBUSU5ZX01WX01BWF9TSVpFPigpOworICBiZW5jaF9zdGF0aWM8QWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdCx0dm1ldF9pbnRlcmZhY2UsIE1BWF9NVj4oKTsKKyAgYmVuY2hfc3RhdGljPEFjdGlvbl9tYXRyaXhfbWF0cml4X3Byb2R1Y3QsdHZtZXRfaW50ZXJmYWNlLCBNQVhfTU0+KCk7CisgIGJlbmNoX3N0YXRpYzxBY3Rpb25fYXRhX3Byb2R1Y3QsdHZtZXRfaW50ZXJmYWNlLCBNQVhfTU0+KCk7CisgIGJlbmNoX3N0YXRpYzxBY3Rpb25fYWF0X3Byb2R1Y3QsdHZtZXRfaW50ZXJmYWNlLCBNQVhfTU0+KCk7CiAKICAgcmV0dXJuIDA7CiB9Ci0KLQpkaWZmIC1OdXIgQlRMLTIwMDMwMTI0L2xpYnMvdHZtZXQvTWFrZWZpbGUgQlRML2xpYnMvdHZtZXQvTWFrZWZpbGUKLS0tIEJUTC0yMDAzMDEyNC9saWJzL3R2bWV0L01ha2VmaWxlCTIwMDMtMDEtMjEgMTE6Mzg6NTMuMDAwMDAwMDAwICswMTAwCisrKyBCVEwvbGlicy90dm1ldC9NYWtlZmlsZQkyMDAzLTEwLTMwIDE5OjAyOjA4LjAwMDAwMDAwMCArMDEwMApAQCAtMSw4ICsxLDggQEAKLWluY2x1ZGUgJChCRU5DSF9CQVNFKS9NYWtlZmlsZS5pbiAKK2luY2x1ZGUgJChCRU5DSF9CQVNFKS9NYWtlZmlsZS5pbgogCi1MSUJTPSQoTElCU19CQVNFKSAKLUlOQ0xVREVTPS1JLiAkKElOQ0xVREVTX0JBU0UpIC1JJChUVk1FVF9JTkNMVURFUykKLU9QVElNPSQoT1BUSU1fQkFTRSkgCitMSUJTPSQoTElCU19CQVNFKQorSU5DTFVERVM9LUkuICQoSU5DTFVERVNfQkFTRSkgLUkkKFRWTUVUX1JPT1QpL2luY2x1ZGUKK09QVElNPSQoc2hlbGwgZWNobyBgJChUVk1FVF9ST09UKS90dm1ldC1jb25maWcgLS1jeHhmbGFnc2ApCiBERUJVRz0kKERFQlVHX0JBU0UpCiAKIENYWEZMQUdTID0gJChPUFRJTSkgJChJTkNMVURFUykKQEAgLTEzLDggKzEzLDggQEAKIAogYWxsIDogJChERVBFTkRfQkFTRSkgbWFpbgogCi1tYWluOglNYWtlZmlsZSBtYWluLm8gIAotCSQoQ1hYKSAtbyBtYWluIG1haW4ubyAkKExJQlMpIAorbWFpbjoJTWFrZWZpbGUgbWFpbi5vCisJJChDWFgpIC1vIG1haW4gbWFpbi5vICQoTElCUykKIAogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtTnVyIEJUTC0yMDAzMDEyNC9saWJzL3R2bWV0L3R2bWV0X2ludGVyZmFjZS5oaCBCVEwvbGlicy90dm1ldC90dm1ldF9pbnRlcmZhY2UuaGgKLS0tIEJUTC0yMDAzMDEyNC9saWJzL3R2bWV0L3R2bWV0X2ludGVyZmFjZS5oaAkyMDAzLTAxLTIxIDEyOjA1OjE5LjAwMDAwMDAwMCArMDEwMAorKysgQlRML2xpYnMvdHZtZXQvdHZtZXRfaW50ZXJmYWNlLmhoCTIwMDMtMTEtMTMgMTg6MjA6MTMuMDAwMDAwMDAwICswMTAwCkBAIC0xLDE0ICsxLDE0IEBACiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBGaWxlICAgOiAgdHZtZXRfaW50ZXJmYWNlLmhoCi0vLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPiAgICAgICAgCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgogLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzozMCBDRVNUIDIwMDIKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIAorLy8KIC8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIC8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgogLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0vLyAKKy8vCiAvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIC8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCkBAIC0xNiw3ICsxNiw3IEBACiAvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIC8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgotLy8gCisvLwogI2lmbmRlZiBUVk1FVF9JTlRFUkZBQ0VfSEgKICNkZWZpbmUgVFZNRVRfSU5URVJGQUNFX0hICiAKQEAgLTI1LDExNyArMjUsOTggQEAKIAogI2luY2x1ZGUgPHZlY3Rvcj4KIAotdXNpbmcgbmFtZXNwYWNlIHR2bWV0OwotCiB0ZW1wbGF0ZTxjbGFzcyByZWFsLCBpbnQgU0laRT4KLWNsYXNzIHR2bWV0X2ludGVyZmFjZXsKLSAgCitjbGFzcyB0dm1ldF9pbnRlcmZhY2UKK3sKIHB1YmxpYyA6Ci0gIAorCiAgIHR5cGVkZWYgcmVhbCByZWFsX3R5cGUgOwogCiAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8cmVhbD4gIHN0bF92ZWN0b3I7CiAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RsX3ZlY3RvciA+IHN0bF9tYXRyaXg7Ci0gIAotICB0eXBlZGVmIFZlY3RvcjxyZWFsLFNJWkU+IGdlbmVfdmVjdG9yOwotICB0eXBlZGVmIE1hdHJpeDxyZWFsLFNJWkUsU0laRT4gZ2VuZV9tYXRyaXg7CiAKLSAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyBuYW1lKCB2b2lkICkKLSAgeworICB0eXBlZGVmIHR2bWV0OjpWZWN0b3I8cmVhbCwgU0laRT4gZ2VuZV92ZWN0b3I7CisgIHR5cGVkZWYgdHZtZXQ6Ok1hdHJpeDxyZWFsLCBTSVpFLCBTSVpFPiBnZW5lX21hdHJpeDsKKworICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoKSB7CiAgICAgcmV0dXJuICJ0dm1ldCI7CiAgIH0KLSAgCi0gCi0gIHN0YXRpYyB2b2lkIGZyZWVfbWF0cml4KGdlbmVfbWF0cml4ICYgQSwgaW50IE4pewotICAgIAotICAgIHJldHVybiA7Ci0gIH0KLSAgCi0gIHN0YXRpYyB2b2lkIGZyZWVfdmVjdG9yKGdlbmVfdmVjdG9yICYgQil7Ci0gICAgCi0gICAgcmV0dXJuIDsKLSAgICAKLSAgfQotICAKLSAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF9mcm9tX3N0bChnZW5lX21hdHJpeCAmIEEsIHN0bF9tYXRyaXggJiBBX3N0bCl7Ci0gICAgCi0gICAgZm9yIChpbnQgaT0wOyBpPEFfc3RsLnNpemUoKSA7IGkrKyl7Ci0gICAgICBmb3IgKGludCBqPTA7IGo8QV9zdGxbaV0uc2l6ZSgpIDsgaisrKXsKLQlBKGksaik9QV9zdGxbaV1bal07CisKKyAgc3RhdGljIHZvaWQgZnJlZV9tYXRyaXgoZ2VuZV9tYXRyaXgmIEEsIGludCBOKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RhdGljIHZvaWQgZnJlZV92ZWN0b3IoZ2VuZV92ZWN0b3ImIEIpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X2Zyb21fc3RsKGdlbmVfbWF0cml4JiBBLCBzdGxfbWF0cml4JiBBX3N0bCkgeworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBBX3N0bC5zaXplKCk7IGkrKyl7CisgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgQV9zdGxbaV0uc2l6ZSgpOyBqKyspIHsKKwlBKGksaikgPSBBX3N0bFtpXVtqXTsKICAgICAgIH0KLSAgICAgIAogICAgIH0KICAgfQotICAKLSAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl9mcm9tX3N0bChnZW5lX3ZlY3RvciAmIEIsIHN0bF92ZWN0b3IgJiBCX3N0bCl7Ci0gICAgCi0gICAgZm9yIChpbnQgaT0wOyBpPEJfc3RsLnNpemUoKSA7IGkrKyl7Ci0gICAgICBCW2ldPUJfc3RsW2ldOworCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB2ZWN0b3JfZnJvbV9zdGwoZ2VuZV92ZWN0b3ImIEIsIHN0bF92ZWN0b3ImIEJfc3RsKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEJfc3RsLnNpemUoKTsgaSsrKSB7CisgICAgICBCW2ldID0gQl9zdGxbaV07CiAgICAgfQogICB9Ci0gIAotICBzdGF0aWMgaW5saW5lIHZvaWQgdmVjdG9yX3RvX3N0bChnZW5lX3ZlY3RvciAmIEIsIHN0bF92ZWN0b3IgJiBCX3N0bCl7Ci0gICAgCi0gICAgZm9yIChpbnQgaT0wOyBpPEJfc3RsLnNpemUoKSA7IGkrKyl7Ci0gICAgICBCX3N0bFtpXT1CW2ldOworCisgIHN0YXRpYyBpbmxpbmUgdm9pZCB2ZWN0b3JfdG9fc3RsKGdlbmVfdmVjdG9yJiBCLCBzdGxfdmVjdG9yJiBCX3N0bCkgeworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBCX3N0bC5zaXplKCk7IGkrKykgeworICAgICAgQl9zdGxbaV0gPSBCW2ldOwogICAgIH0KICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdG9fc3RsKGdlbmVfbWF0cml4ICYgQSwgc3RsX21hdHJpeCAmIEFfc3RsKXsKLSAgICAKLSAgICBpbnQgTj1BX3N0bC5zaXplKCk7Ci0gICAgCi0gICAgZm9yIChpbnQgaT0wO2k8TjtpKyspeworICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X3RvX3N0bChnZW5lX21hdHJpeCYgQSwgc3RsX21hdHJpeCYgQV9zdGwpIHsKKyAgICB1bnNpZ25lZCBOID0gQV9zdGwuc2l6ZSgpOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDtpIDwgTjtpKyspIHsKICAgICAgIEFfc3RsW2ldLnJlc2l6ZShOKTsKLSAgICAgIGZvciAoaW50IGo9MDtqPE47aisrKXsKLQlBX3N0bFtpXVtqXT1BKGksaik7CisgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwO2ogPCBOO2orKykgeworCUFfc3RsW2ldW2pdID0gQShpLGopOwogICAgICAgfQogICAgIH0KLSAgICAKICAgfQogCi0KLSAgc3RhdGljIGlubGluZSB2b2lkIGNvcHlfbWF0cml4KGNvbnN0IGdlbmVfbWF0cml4ICYgc291cmNlLCBnZW5lX21hdHJpeCAmIGNpYmxlLCBpbnQgTikKLSAgewotICAgIAotICAgIGZvciAoaW50IGk9MDtpPE47aSsrKXsKLSAgICAgIGZvciAoaW50IGo9MDtqPE47aisrKXsKLQljaWJsZShpLGopPXNvdXJjZShpLGopOworICBzdGF0aWMgaW5saW5lIHZvaWQgY29weV9tYXRyaXgoY29uc3QgZ2VuZV9tYXRyaXgmIHNvdXJjZSwgZ2VuZV9tYXRyaXgmIGNpYmxlLCB1bnNpZ25lZCBOKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDtpIDwgTjtpKyspIHsKKyAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7aiA8IE47aisrKSB7CisJY2libGUoaSxqKSA9IHNvdXJjZShpLGopOwogICAgICAgfQogICAgIH0KLSAgICAKICAgfQogCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X3ZlY3Rvcihjb25zdCBnZW5lX3ZlY3RvciAmIHNvdXJjZSwgZ2VuZV92ZWN0b3IgJiBjaWJsZSwgaW50IE4pCi0gIHsKLSAgICAKLSAgICBmb3IgKGludCBpPTA7aTxOO2krKyl7Ci0gICAgICBjaWJsZVtpXT1zb3VyY2VbaV07CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X3ZlY3Rvcihjb25zdCBnZW5lX3ZlY3RvciYgc291cmNlLCBnZW5lX3ZlY3RvciYgY2libGUsIHVuc2lnbmVkIE4pIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwO2kgPCBOO2krKykgeworICAgICAgY2libGVbaV0gPSBzb3VyY2VbaV07CiAgICAgfQotICAgIAotICB9Ci0gIAotICAKLSAgCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfbWF0cml4X3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXggJiBBLCBjb25zdCBnZW5lX21hdHJpeCAmIEIsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4pCi0gIHsKLSAgICBYPXByb2R1Y3QoQSxCKTsKICAgfQogCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfbWF0cml4X3Byb2R1Y3QoY29uc3QgZ2VuZV9tYXRyaXgmIEEsIGNvbnN0IGdlbmVfbWF0cml4JiBCLCBnZW5lX21hdHJpeCYgWCwgdW5zaWduZWQgTikgeworICAgIFggPSBwcm9kKEEsQik7CisgIH0KIAotICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X3ZlY3Rvcl9wcm9kdWN0KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKQotICB7Ci0gICAgWD1wcm9kdWN0KEEsQik7ICAgIAotICAgIAorICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X3ZlY3Rvcl9wcm9kdWN0KGdlbmVfbWF0cml4JiBBLCBnZW5lX3ZlY3RvciYgQiwgZ2VuZV92ZWN0b3ImIFgsIHVuc2lnbmVkIE4pIHsKKyAgICBYID0gcHJvZChBLEIpOwogICB9CiAKLSAgc3RhdGljIGlubGluZSB2b2lkIGF4cHkoY29uc3QgcmVhbCBjb2VmLCBjb25zdCBnZW5lX3ZlY3RvciAmIFgsIGdlbmVfdmVjdG9yICYgWSwgaW50IE4pCi0gIHsgICAgCi0gICAgWSs9Y29lZipYOworICBzdGF0aWMgaW5saW5lIHZvaWQgYXhweShjb25zdCByZWFsIGNvZWYsIGNvbnN0IGdlbmVfdmVjdG9yJiBYLCBnZW5lX3ZlY3RvciYgWSwgdW5zaWduZWQgTikgeworICAgIFkgKz0gY29lZipYOwogICB9CiAKKyAgc3RhdGljIGlubGluZSB2b2lkIGF0YV9wcm9kdWN0KGdlbmVfbWF0cml4JiBBLCBnZW5lX21hdHJpeCYgWCwgdW5zaWduZWQgTikgeworICAgIC8vWCA9IHByb2QodHJhbnMoQSksQSk7CisgICAgWCAgPSAgTXRNX3Byb2QoQSwgQSk7CisgIH0KIAorICBzdGF0aWMgaW5saW5lIHZvaWQgYWF0X3Byb2R1Y3QoZ2VuZV9tYXRyaXgmIEEsIGdlbmVfbWF0cml4JiBYLCB1bnNpZ25lZCBOKSB7CisgICAgLy9YID0gcHJvZChBLHRyYW5zKEEpKTsKKyAgICBYICA9ICBNTXRfcHJvZChBLCBBKTsKKyAgfQogfTsKIAotICAKKwogI2VuZGlmCmRpZmYgLU51ciBCVEwtMjAwMzAxMjQvbGlicy91Ymxhcy9tYWluLmNwcCBCVEwvbGlicy91Ymxhcy9tYWluLmNwcAotLS0gQlRMLTIwMDMwMTI0L2xpYnMvdWJsYXMvbWFpbi5jcHAJMjAwMi0xMS0yMSAxNjowNDowNi4wMDAwMDAwMDAgKzAxMDAKKysrIEJUTC9saWJzL3VibGFzL21haW4uY3BwCTIwMDMtMTEtMTMgMjE6NTc6NDIuMDAwMDAwMDAwICswMTAwCkBAIC0xLDE0ICsxLDE0IEBACiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBGaWxlICAgOiAgbWFpbi5jcHAKLS8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+ICAgICAgICAKKy8vIEF1dGhvciA6ICBMLiBQbGFnbmUgPGxhdXJlbnQucGxhZ25lQGVkZi5mcik+CiAvLyBDb3B5cmlnaHQgKEMpIEVERiBSJkQsICBsdW4gc2VwIDMwIDE0OjIzOjI3IENFU1QgMjAwMgogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gCisvLwogLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIC8vIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCiAvLyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLS8vIAorLy8KIC8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIC8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKQEAgLTE2LDcgKzE2LDcgQEAKIC8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0vLyAKKy8vCiAjaW5jbHVkZSAidXRpbGl0aWVzLmgiCiAjaW5jbHVkZSAidWJsYXNfaW50ZXJmYWNlLmhoIgogI2luY2x1ZGUgImJlbmNoLmhoIgpAQCAtMjYsMTQgKzI2LDE2IEBACiAjaW5jbHVkZSAiYWN0aW9uX2F0YV9wcm9kdWN0LmhoIgogI2luY2x1ZGUgImFjdGlvbl9hYXRfcHJvZHVjdC5oaCIKIAordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwogaW50IG1haW4oKQogewotICBiZW5jaDxBY3Rpb25fYXhweTx1Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX0FYUFksTUFYX0FYUFksTkJfUE9JTlQpOyAgCisgIGJlbmNoPEFjdGlvbl9heHB5PHVibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fQVhQWSxNQVhfQVhQWSxOQl9QT0lOVCk7CisKKyAgYmVuY2g8QWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdDx1Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7CiAKLSAgYmVuY2g8QWN0aW9uX21hdHJpeF92ZWN0b3JfcHJvZHVjdDx1Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01WLE1BWF9NVixOQl9QT0lOVCk7ICAKKyAgYmVuY2g8QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdDx1Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7CiAKLSAgYmVuY2g8QWN0aW9uX21hdHJpeF9tYXRyaXhfcHJvZHVjdDx1Ymxhc19pbnRlcmZhY2U8UkVBTF9UWVBFPiA+ID4oTUlOX01NLE1BWF9NTSxOQl9QT0lOVCk7ICAKLSAKICAgYmVuY2g8QWN0aW9uX2F0YV9wcm9kdWN0PHVibGFzX2ludGVyZmFjZTxSRUFMX1RZUEU+ID4gPihNSU5fTU0sTUFYX01NLE5CX1BPSU5UKTsKIAogICBiZW5jaDxBY3Rpb25fYWF0X3Byb2R1Y3Q8dWJsYXNfaW50ZXJmYWNlPFJFQUxfVFlQRT4gPiA+KE1JTl9NTSxNQVhfTU0sTkJfUE9JTlQpOwpAQCAtNDEsNSArNDMsMyBAQAogCiAgIHJldHVybiAwOwogfQotCi0KZGlmZiAtTnVyIEJUTC0yMDAzMDEyNC9saWJzL3VibGFzL3VibGFzX2ludGVyZmFjZS5oaCBCVEwvbGlicy91Ymxhcy91Ymxhc19pbnRlcmZhY2UuaGgKLS0tIEJUTC0yMDAzMDEyNC9saWJzL3VibGFzL3VibGFzX2ludGVyZmFjZS5oaAkyMDAyLTExLTI5IDE2OjQzOjI4LjAwMDAwMDAwMCArMDEwMAorKysgQlRML2xpYnMvdWJsYXMvdWJsYXNfaW50ZXJmYWNlLmhoCTIwMDMtMTEtMTMgMjE6NTg6MDguMDAwMDAwMDAwICswMTAwCkBAIC0xLDE0ICsxLDE0IEBACiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBGaWxlICAgOiAgdWJsYXNfaW50ZXJmYWNlLmhoCi0vLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPiAgICAgICAgCisvLyBBdXRob3IgOiAgTC4gUGxhZ25lIDxsYXVyZW50LnBsYWduZUBlZGYuZnIpPgogLy8gQ29weXJpZ2h0IChDKSBFREYgUiZELCAgbHVuIHNlcCAzMCAxNDoyMzoyNyBDRVNUIDIwMDIKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIAorLy8KIC8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIC8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAvLyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgogLy8gb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0vLyAKKy8vCiAvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIC8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCkBAIC0xNiw3ICsxNiw3IEBACiAvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIC8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgotLy8gCisvLwogI2lmbmRlZiBVQkxBU19JTlRFUkZBQ0VfSEgKICNkZWZpbmUgVUJMQVNfSU5URVJGQUNFX0hICiAKQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxib29zdC9udW1lcmljL3VibGFzL2NvbmNlcHRzLmhwcD4KICNpbmNsdWRlIDxib29zdC9udW1lcmljL3VibGFzL3N0b3JhZ2UuaHBwPgogCi0KIHRlbXBsYXRlIDxjbGFzcyByZWFsPgogY2xhc3MgdWJsYXNfaW50ZXJmYWNlewogCkBAIC00NSw2NSArNDQsNjUgQEAKICAgLy90eXBlZGVmICBudW1lcmljczo6dmVjdG9yPHJlYWwsbnVtZXJpY3M6OnVuYm91bmRlZF9hcnJheTxyZWFsPiA+IGdlbmVfdmVjdG9yOwogICB0eXBlZGVmICB0eXBlbmFtZSBib29zdDo6bnVtZXJpYzo6dWJsYXM6Om1hdHJpeDxyZWFsPiAgZ2VuZV9tYXRyaXg7CiAgIHR5cGVkZWYgIHR5cGVuYW1lIGJvb3N0OjpudW1lcmljOjp1Ymxhczo6dmVjdG9yPHJlYWw+IGdlbmVfdmVjdG9yOwotICAKKwogICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIG5hbWUoIHZvaWQgKQogICB7CiAgICAgcmV0dXJuICJ1YmxhcyI7CiAgIH0KIAogCi0gIAorCiAKICAgc3RhdGljIHZvaWQgZnJlZV9tYXRyaXgoZ2VuZV9tYXRyaXggJiBBLCBpbnQgTil7Ci0gICAgCisKICAgICByZXR1cm4gOwogICB9Ci0gIAorCiAgIHN0YXRpYyB2b2lkIGZyZWVfdmVjdG9yKGdlbmVfdmVjdG9yICYgQil7Ci0gICAgCisKICAgICByZXR1cm4gOwotICAgIAorCiAgIH0KLSAgCisKICAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF9mcm9tX3N0bChnZW5lX21hdHJpeCAmIEEsIHN0bF9tYXRyaXggJiBBX3N0bCl7Ci0gICAgCisKICAgICBBLnJlc2l6ZShBX3N0bC5zaXplKCksQV9zdGxbMF0uc2l6ZSgpKTsKLSAgICAKKwogICAgIGZvciAoaW50IGk9MDsgaTxBX3N0bC5zaXplKCkgOyBpKyspewogICAgICAgZm9yIChpbnQgaj0wOyBqPEFfc3RsW2ldLnNpemUoKSA7IGorKyl7CiAJQShpLGopPUFfc3RsW2ldW2pdOwogICAgICAgfQotICAgICAgCisKICAgICB9CiAgIH0KLSAgCisKICAgc3RhdGljIGlubGluZSB2b2lkIHZlY3Rvcl9mcm9tX3N0bChnZW5lX3ZlY3RvciAmIEIsIHN0bF92ZWN0b3IgJiBCX3N0bCl7Ci0gICAgCisKICAgICBCLnJlc2l6ZShCX3N0bC5zaXplKCkpOwotICAgIAorCiAgICAgZm9yIChpbnQgaT0wOyBpPEJfc3RsLnNpemUoKSA7IGkrKyl7CiAgICAgICBCKGkpPUJfc3RsW2ldOwogICAgIH0KICAgfQotICAKKwogICBzdGF0aWMgaW5saW5lIHZvaWQgdmVjdG9yX3RvX3N0bChnZW5lX3ZlY3RvciAmIEIsIHN0bF92ZWN0b3IgJiBCX3N0bCl7Ci0gICAgCisKICAgICBmb3IgKGludCBpPTA7IGk8Ql9zdGwuc2l6ZSgpIDsgaSsrKXsKICAgICAgIEJfc3RsW2ldPUIoaSk7CiAgICAgfQogICB9CiAKICAgc3RhdGljIGlubGluZSB2b2lkIG1hdHJpeF90b19zdGwoZ2VuZV9tYXRyaXggJiBBLCBzdGxfbWF0cml4ICYgQV9zdGwpewotICAgIAorCiAgICAgaW50IE49QV9zdGwuc2l6ZSgpOwotICAgIAorCiAgICAgZm9yIChpbnQgaT0wO2k8TjtpKyspewogICAgICAgQV9zdGxbaV0ucmVzaXplKE4pOwogICAgICAgZm9yIChpbnQgaj0wO2o8TjtqKyspewogCUFfc3RsW2ldW2pdPUEoaSxqKTsKICAgICAgIH0KICAgICB9Ci0gIAorCiAgIH0KIAogICBzdGF0aWMgaW5saW5lIHZvaWQgY29weV92ZWN0b3IoY29uc3QgZ2VuZV92ZWN0b3IgJiBzb3VyY2UsIGdlbmVfdmVjdG9yICYgY2libGUsIGludCBOKXsKQEAgLTExOSwxOSArMTE4LDE5IEBACiAgICAgICB9CiAgICAgfQogICB9Ci0gCisKICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfdmVjdG9yX3Byb2R1Y3Rfc2xvdyhnZW5lX21hdHJpeCAmIEEsIGdlbmVfdmVjdG9yICYgQiwgZ2VuZV92ZWN0b3IgJiBYLCBpbnQgTikKICAgewotICAgIFggPSAgcHJvZChBLEIpOyAgICAKKyAgICBYID0gIHByb2QoQSxCKTsKICAgfQogCiAgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfbWF0cml4X3Byb2R1Y3Rfc2xvdyhnZW5lX21hdHJpeCAmIEEsIGdlbmVfbWF0cml4ICYgQiwgZ2VuZV9tYXRyaXggJiBYLCBpbnQgTikKICAgewotICAgIFggPSAgcHJvZChBLEIpOyAgICAKKyAgICBYID0gIHByb2QoQSxCKTsKICAgfQogCiAgIHN0YXRpYyBpbmxpbmUgdm9pZCBheHB5X3Nsb3coY29uc3QgcmVhbCBjb2VmLCBjb25zdCBnZW5lX3ZlY3RvciAmIFgsIGdlbmVfdmVjdG9yICYgWSwgaW50IE4pCi0gIHsgICAgCisgIHsKICAgICBZKz1jb2VmKlg7CiAgIH0KIApAQCAtMTM5LDE2ICsxMzgsMTYgQEAKIAogICBzdGF0aWMgaW5saW5lIHZvaWQgbWF0cml4X3ZlY3Rvcl9wcm9kdWN0KGdlbmVfbWF0cml4ICYgQSwgZ2VuZV92ZWN0b3IgJiBCLCBnZW5lX3ZlY3RvciAmIFgsIGludCBOKQogICB7Ci0gICAgWC5hc3NpZ24ocHJvZChBLEIpKTsgICAgCisgICAgWC5hc3NpZ24ocHJvZChBLEIpKTsKICAgfQogCiAgIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXRyaXhfbWF0cml4X3Byb2R1Y3QoZ2VuZV9tYXRyaXggJiBBLCBnZW5lX21hdHJpeCAmIEIsIGdlbmVfbWF0cml4ICYgWCwgaW50IE4pCiAgIHsKLSAgICBYLmFzc2lnbihwcm9kKEEsQikpOyAgICAKKyAgICBYLmFzc2lnbihwcm9kKEEsQikpOwogICB9CiAKICAgc3RhdGljIGlubGluZSB2b2lkIGF4cHkoY29uc3QgcmVhbCBjb2VmLCBjb25zdCBnZW5lX3ZlY3RvciAmIFgsIGdlbmVfdmVjdG9yICYgWSwgaW50IE4pCi0gIHsgICAgCisgIHsKICAgICBZLnBsdXNfYXNzaWduKGNvZWYqWCk7CiAgIH0KIApAQCAtMTY2LDcgKzE2NSw3IEBACiAKIAogCi0gIAorCiB9OwogCiAjZW5kaWYKZGlmZiAtTnVyIEJUTC0yMDAzMDEyNC9NYWtlZmlsZSBCVEwvTWFrZWZpbGUKLS0tIEJUTC0yMDAzMDEyNC9NYWtlZmlsZQkyMDAzLTAxLTIxIDE3OjQxOjU1LjAwMDAwMDAwMCArMDEwMAorKysgQlRML01ha2VmaWxlCTIwMDMtMTEtMTUgMDc6MDk6MTMuMDAwMDAwMDAwICswMTAwCkBAIC0yLDQyICsyLDQzIEBACiAKIEJFTkNIX0xJQj0kKEJFTkNIX0JBU0UpL2xpYnMKIAotYWxsIDogQyBTVEwgZjc3IGJsaXR6IEFUTEFTIE1UTCB1YmxhcyBJTlRFTF9CTEFTIFNUTF9hbGdvIHRpbnlfYmxpdHogdHZtZXQjI0NfQkxBUworI2FsbCA6IEMgU1RMIGY3NyBibGl0eiBBVExBUyBNVEwgdWJsYXMgSU5URUxfQkxBUyBTVExfYWxnbyB0aW55X2JsaXR6IHR2bWV0IyNDX0JMQVMKK2FsbCA6IEMgU1RMIGY3NyBibGl0eiBBVExBUyB1YmxhcyBTVExfYWxnbyB0aW55X2JsaXR6IHR2bWV0CiAKLWJsaXR6IDogdGVzdF9jb25mICAKK2JsaXR6IDogdGVzdF9jb25mCiAJKCBjZCAkKEJFTkNIX0xJQikvYmxpdHogOyBtYWtlICkKIAotTVRMIDogdGVzdF9jb25mICAKK01UTCA6IHRlc3RfY29uZgogCShjZCAkKEJFTkNIX0xJQikvTVRMIDsgbWFrZSApCiAKLWY3NyA6IHRlc3RfY29uZiAgCitmNzcgOiB0ZXN0X2NvbmYKIAkoY2QgJChCRU5DSF9MSUIpL2Y3NyA7IG1ha2UgKQogCi1DIDogdGVzdF9jb25mICAKK0MgOiB0ZXN0X2NvbmYKIAkoY2QgJChCRU5DSF9MSUIpL0MgOyBtYWtlICkKIAotU1RMIDogdGVzdF9jb25mICAKK1NUTCA6IHRlc3RfY29uZgogCShjZCAkKEJFTkNIX0xJQikvU1RMIDsgbWFrZSApCiAKLUFUTEFTIDogdGVzdF9jb25mICAKK0FUTEFTIDogdGVzdF9jb25mCiAJKGNkICQoQkVOQ0hfTElCKS9BVExBUyA7IG1ha2UgKQogCi11YmxhcyA6IHRlc3RfY29uZiAgCit1YmxhcyA6IHRlc3RfY29uZgogCShjZCAkKEJFTkNIX0xJQikvdWJsYXMgOyBtYWtlICkKIAotQ19CTEFTIDogdGVzdF9jb25mICAKK0NfQkxBUyA6IHRlc3RfY29uZgogCShjZCAkKEJFTkNIX0xJQikvQ19CTEFTIDsgbWFrZSApCiAKLUlOVEVMX0JMQVMgOiB0ZXN0X2NvbmYgIAorSU5URUxfQkxBUyA6IHRlc3RfY29uZgogCShjZCAkKEJFTkNIX0xJQikvSU5URUxfQkxBUyA7IG1ha2UgKQogCi1TVExfYWxnbyA6IHRlc3RfY29uZiAgCitTVExfYWxnbyA6IHRlc3RfY29uZgogCShjZCAkKEJFTkNIX0xJQikvU1RMX2FsZ28gOyBtYWtlICkKIAotdGlueV9ibGl0eiA6IHRlc3RfY29uZiAgCit0aW55X2JsaXR6IDogdGVzdF9jb25mCiAJKGNkICQoQkVOQ0hfTElCKS90aW55X2JsaXR6IDsgbWFrZSApCiAKLXR2bWV0IDogdGVzdF9jb25mICAKK3R2bWV0IDogdGVzdF9jb25mCiAJKGNkICQoQkVOQ0hfTElCKS90dm1ldCA7IG1ha2UgKQogCiAKQEAgLTYyLDUgKzYzLDMgQEAKIAkJZWNobyBkb25lIDtcCiAJKVwKIAlkb25lCi0KLQpkaWZmIC1OdXIgQlRMLTIwMDMwMTI0L01ha2VmaWxlLmluIEJUTC9NYWtlZmlsZS5pbgotLS0gQlRMLTIwMDMwMTI0L01ha2VmaWxlLmluCTIwMDMtMDEtMjEgMTI6MDI6MTYuMDAwMDAwMDAwICswMTAwCisrKyBCVEwvTWFrZWZpbGUuaW4JMjAwMy0xMS0xMyAyMToxNToyMy4wMDAwMDAwMDAgKzAxMDAKQEAgLTEsNDQgKzEsMzcgQEAKLSMjIFRWTUVUCi0KLVRWTUVUX0lOQ0xVREVTPS9ob21lMDEvbHBsYWduZS9wdWJsaWMvdHZtZXQtMC43LjAvaW5jbHVkZQorIyMgVFZNRVQgPjEuMy4wCitUVk1FVF9ST09UPS9ob21lL29wZXR6b2xkL3dvcmsvdHZtZXQKIAogIyMgIFVCTEFTCi0KLUJPT1NUX1JPT1Q9L2hvbWUwMS9scGxhZ25lL3B1YmxpYy9ib29zdC9ib29zdF8xXzI4XzAKK0JPT1NUX1JPT1Q9L3Vzci9pbmNsdWRlL2Jvb3N0CiAKICMjICBCTElUWgotCi0jI0JMSVRaX1JPT1Q9L2hvbWUwMS9scGxhZ25lL3B1YmxpYy9ibGl0ei9ibGl0ei0yMDAwMTIxMwotQkxJVFpfUk9PVD0vaG9tZTAxL2xwbGFnbmUvcHVibGljL2JsaXR6L2JsaXR6LTAuNgorQkxJVFpfUk9PVD0vaG9tZS9vcGV0em9sZC93b3JrL2JsaXR6KystMC43CiAKICMjICBNVEwKLU1UTF9ST09UPS9ob21lMDEvbHBsYWduZS9wdWJsaWMvTVRML2luY2x1ZGUKKyMjTVRMX1JPT1Q9L2hvbWUwMS9scGxhZ25lL3B1YmxpYy9NVEwvaW5jbHVkZQogIyNNVExfUk9PVD0vaG9tZTAxL2xwbGFnbmUvcHVibGljL01UTC9tdGwtMi4xLjItMjAKICMjTVRMX1BBVENIPS9ob21lMDEvbHBsYWduZS9tdGxfcGF0Y2gvbXRsLXNwZWMtMS4wCiAjI0lUTF9ST09UPS9ob21lMDEvbHBsYWduZS9wdWJsaWMvTVRML0lUTC9pdGwtNC4wLjAtMQogCiAjIyAgQVRMQVMKLQotQVRMQVNfQkxBU19MSUI9L2hvbWUwMS9scGxhZ25lL3B1YmxpYy9hdGxhcy9BVExBUy9saWIvTGludXhfUElJSVNTRTEKLUFUTEFTX0JMQVNfSU5DTFVERTI9L2hvbWUwMS9scGxhZ25lL3B1YmxpYy9hdGxhcy9BVExBUy9pbmNsdWRlL0xpbnV4X1BJSUlTU0UxCi1BVExBU19CTEFTX0lOQ0xVREU9L2hvbWUwMS9scGxhZ25lL3B1YmxpYy9hdGxhcy9BVExBUy9pbmNsdWRlCitBVExBU19CTEFTX0xJQj0vdXNyL2xvY2FsL2xpYgorQVRMQVNfQkxBU19JTkNMVURFMj0vdXNyL2xvY2FsL2luY2x1ZGUvYXRsYXMvTGludXhfUDRTU0UyCitBVExBU19CTEFTX0lOQ0xVREU9L3Vzci9sb2NhbC9pbmNsdWRlL2F0bGFzCiAKICMjIENfQkxBUwotCi1DX0JMQVNfSU5DTFVERT0vaG9tZTAxL2xwbGFnbmUvcHVibGljL2JsYXNfbmV0bGliL0NCTEFTL3NyYwotQ19CTEFTX0xJQj0vaG9tZTAxL2xwbGFnbmUvcHVibGljL2JsYXNfbmV0bGliL0NCTEFTL2xpYi9MSU5VWC9jYmxhc19MSU5VWC5hCi1GNzdfQkxBU19MSUI9L2hvbWUwMS9scGxhZ25lL3B1YmxpYy9ibGFzX25ldGxpYi9mNzdfYmxhcy9saWJibGFzLmEgCisjQ19CTEFTX0lOQ0xVREU9L2hvbWUwMS9scGxhZ25lL3B1YmxpYy9ibGFzX25ldGxpYi9DQkxBUy9zcmMKKyNDX0JMQVNfTElCPS9ob21lMDEvbHBsYWduZS9wdWJsaWMvYmxhc19uZXRsaWIvQ0JMQVMvbGliL0xJTlVYL2NibGFzX0xJTlVYLmEKKyNGNzdfQkxBU19MSUI9L2hvbWUwMS9scGxhZ25lL3B1YmxpYy9ibGFzX25ldGxpYi9mNzdfYmxhcy9saWJibGFzLmEKIAogIyMgSU5URUxfQkxBUwotCi1JTlRFTF9CTEFTX0lOQ0xVREU9L29wdC9pbnRlbC9ta2wvaW5jbHVkZQotSUJMSUI9L29wdC9pbnRlbC9ta2wvbGliLzMyCi1JTlRFTF9CTEFTX0xJQj0kKElCTElCKS9saWJta2xfbGFwYWNrLmEgJChJQkxJQikvbGlibWtsX3AzLmEgJChJQkxJQikvbGlibWtsX3A0LmEgJChJQkxJQikvbGliZ3VpZGUuYSAkKElCTElCKS9saWJta2xfZGVmLmEgLWxnMmMgLWxwdGhyZWFkCi0jI0lOVEVMX0JMQVNfTElCPS1ML29wdC9pbnRlbC9ta2wvbGliLzMyIC1sbWtsX2xhcGFjazY0IC1sbWtsX2xhcGFjazMyIC1sbWtsX3A0IC1sbWtsX3AzIC1sZ3VpZGUgLWxta2xfZGVmIC1sZzJjIAorI0lOVEVMX0JMQVNfSU5DTFVERT0vb3B0L2ludGVsL21rbC9pbmNsdWRlCisjSUJMSUI9L29wdC9pbnRlbC9ta2wvbGliLzMyCisjSU5URUxfQkxBU19MSUI9JChJQkxJQikvbGlibWtsX2xhcGFjay5hICQoSUJMSUIpL2xpYm1rbF9wMy5hICQoSUJMSUIpL2xpYm1rbF9wNC5hICQoSUJMSUIpL2xpYmd1aWRlLmEgJChJQkxJQikvbGlibWtsX2RlZi5hIC1sZzJjIC1scHRocmVhZAorIyNJTlRFTF9CTEFTX0xJQj0tTC9vcHQvaW50ZWwvbWtsL2xpYi8zMiAtbG1rbF9sYXBhY2s2NCAtbG1rbF9sYXBhY2szMiAtbG1rbF9wNCAtbG1rbF9wMyAtbGd1aWRlIC1sbWtsX2RlZiAtbGcyYwogCiAKIAotIyMgSU5DTFVERVMgCisjIyBJTkNMVURFUwogCiBBQ1RJT05TPSQoQkVOQ0hfQkFTRSkvYWN0aW9ucwogCkBAIC01MiwxMyArNDUsMTMgQEAKIElOQ0xVREVTX0JBU0U9ICAtSSQoQkVOQ0hfQkFTRSkvaW5jbHVkZXMgLUkkKFNUTCkgLUkkKEdFTkVSSUMpIC1JJChBQ1RJT05TKSAtSSQoQkVOQ0hfVVRJTFMpCiAKIAotIyMgTElCUyAKKyMjIExJQlMKIAotTElCU19CQVNFID0gLWxtIAkKK0xJQlNfQkFTRSA9IC1sbQogCiAjI0NYWCA9IEtDQwogCi1ERUZJTkVEX1ZBUj0gCitERUZJTkVEX1ZBUj0KIENYWD1nKysgJChERUZJTkVEX1ZBUikKIE1BS0VfTElCPSBhciBjcgogCkBAIC03OCw3ICs3MSw3IEBACiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi0uU1VGRklYRVM6IC5vIC5jcHAgCisuU1VGRklYRVM6IC5vIC5jcHAKIAogLmNwcC5vOgogCSQoQ1hYKSAkKENYWEZMQUdTKSAtYyAkPApAQCAtODYsMTQgKzc5LDE0IEBACiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi0uU1VGRklYRVM6IC5vIC5jeHggCisuU1VGRklYRVM6IC5vIC5jeHgKIAogLmN4eC5vOgogCSQoQ1hYKSAkKENYWEZMQUdTKSAtYyAkPAogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotZGVmYXVsdDogCitkZWZhdWx0OgogCW1ha2UgYWxsCiAKIHRlc3RfY29uZiA6CkBAIC0xMDUsNSArOTgsMyBAQAogY2xlYW46CiAJcm0gLWYgKi5vICouaWkgKi5pbnQuYyAqLnMgKn4gXCMqIG1haW4gY29yZSBybSAqLmRhdCAqLmEKIAlybSAtcmYgdGlfZmlsZXMKLQotCg==