ZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YWFjZDIKLS0tIC9kZXYvbnVsbAorKysgYi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGliaGFyZHdhcmVfaGVhZGVycyIsCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvX3N5c3RlbV9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN5c3RlbV9oZWFkZXJzIiwKKyAgICBdLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmF1ZGlvX3N5c3RlbV9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN5c3RlbV9oZWFkZXJzIgorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmhhcmR3YXJlIiwKKworICAgIHNyY3M6IFsiaGFyZHdhcmUuYyJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYmRsIiwKKyAgICBdLAorICAgIGNmbGFnczogWyItRFFFTVVfSEFSRFdBUkUiXSwKKworICAgIGhlYWRlcl9saWJzOiBbImxpYmhhcmR3YXJlX2hlYWRlcnMiXSwKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbImxpYmhhcmR3YXJlX2hlYWRlcnMiXSwKKworICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCit9CisKK3N1YmRpcnMgPSBbCisgICAgIm1vZHVsZXMvKiIsCisgICAgInRlc3RzLyoiLAorXQpkaWZmIC0tZ2l0IGEvQW5kcm9pZC5tayBiL0FuZHJvaWQubWsKaW5kZXggYWVjNjc4MS4uODc0NGY0NiAxMDA2NDQKLS0tIGEvQW5kcm9pZC5taworKysgYi9BbmRyb2lkLm1rCkBAIC0xLDI0ICsxLDMgQEAKICMgQ29weXJpZ2h0IDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogCi0jIFNldHRpbmcgTE9DQUxfUEFUSCB3aWxsIG1lc3MgdXAgYWxsLXN1YmRpci1tYWtlZmlsZXMsIHNvIGRvIGl0IGJlZm9yZWhhbmQuCi1TVUJESVJfTUFLRUZJTEVTIDo9ICQoY2FsbCBhbGwtbmFtZWQtc3ViZGlyLW1ha2VmaWxlcyxtb2R1bGVzIHRlc3RzKQotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN1dGlscyBsaWJsb2cKLQotTE9DQUxfSU5DTFVERVMgKz0gJChMT0NBTF9QQVRIKQotCi1MT0NBTF9DRkxBR1MgICs9IC1EUUVNVV9IQVJEV0FSRQotUUVNVV9IQVJEV0FSRSA6PSB0cnVlCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKLQotTE9DQUxfU1JDX0ZJTEVTICs9IGhhcmR3YXJlLmMKLQotTE9DQUxfTU9EVUxFOj0gbGliaGFyZHdhcmUKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi1pbmNsdWRlICQoU1VCRElSX01BS0VGSUxFUykKK2luY2x1ZGUgJChjYWxsIGFsbC1uYW1lZC1zdWJkaXItbWFrZWZpbGVzLG1vZHVsZXMgdGVzdHMpCmRpZmYgLS1naXQgYS9DbGVhblNwZWMubWsgYi9DbGVhblNwZWMubWsKaW5kZXggYjg0ZTFiNi4uMWM2NGJmYyAxMDA2NDQKLS0tIGEvQ2xlYW5TcGVjLm1rCisrKyBiL0NsZWFuU3BlYy5tawpAQCAtNDcsMyArNDcsMTMgQEAKICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAjIE5FV0VSIENMRUFOIFNURVBTIE1VU1QgQkUgQVQgVEhFIEVORCBPRiBUSEUgTElTVAogIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliL2xpYmR5bmFtaWNfc2Vuc29yX2V4dC5zbykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLWYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYjY0L2xpYmR5bmFtaWNfc2Vuc29yX2V4dC5zbykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLWYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYi9ody9zZW5zb3JzLmR5bmFtaWNfc2Vuc29yX2hhbC5zbykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLWYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYjY0L2h3L3NlbnNvcnMuZHluYW1pY19zZW5zb3JfaGFsLnNvKQorCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyBORVdFUiBDTEVBTiBTVEVQUyBNVVNUIEJFIEFUIFRIRSBFTkQgT0YgVEhFIExJU1QKKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKZGlmZiAtLWdpdCBhL2hhcmR3YXJlLmMgYi9oYXJkd2FyZS5jCmluZGV4IDUzOTQ3ODcuLjdlNGRlYmUgMTAwNjQ0Ci0tLSBhL2hhcmR3YXJlLmMKKysrIGIvaGFyZHdhcmUuYwpAQCAtMjMsOSArMjMsMTEgQEAKICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjZGVmaW5lIExPR19UQUcgIkhBTCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKIC8qKiBCYXNlIHBhdGggb2YgdGhlIGhhbCBtb2R1bGVzICovCiAjaWYgZGVmaW5lZChfX0xQNjRfXykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvYXVkaW8uaCBiL2luY2x1ZGUvaGFyZHdhcmUvYXVkaW8uaAppbmRleCBlYzdmZDRiLi4yZDZlYjMwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2hhcmR3YXJlL2F1ZGlvLmgKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS9hdWRpby5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8c3RyaW5ncy5oPgogI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KIAogI2luY2x1ZGUgPGN1dGlscy9iaXRvcHMuaD4KIApAQCAtNTksMTkgKzYwLDYgQEAKIC8qIE1pbmltYWwgYXVkaW8gSEFMIHZlcnNpb24gc3VwcG9ydGVkIGJ5IHRoZSBhdWRpbyBmcmFtZXdvcmsgKi8KICNkZWZpbmUgQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OX01JTiBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fMl8wCiAKLS8qKgotICogTGlzdCBvZiBrbm93biBhdWRpbyBIQUwgbW9kdWxlcy4gVGhpcyBpcyB0aGUgYmFzZSBuYW1lIG9mIHRoZSBhdWRpbyBIQUwKLSAqIGxpYnJhcnkgY29tcG9zZWQgb2YgdGhlICJhdWRpby4iIHByZWZpeCwgb25lIG9mIHRoZSBiYXNlIG5hbWVzIGJlbG93IGFuZAotICogYSBzdWZmaXggc3BlY2lmaWMgdG8gdGhlIGRldmljZS4KLSAqIGUuZzogYXVkaW8ucHJpbWFyeS5nb2xkZmlzaC5zbyBvciBhdWRpby5hMmRwLmRlZmF1bHQuc28KLSAqLwotCi0jZGVmaW5lIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZICJwcmltYXJ5IgotI2RlZmluZSBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfQTJEUCAiYTJkcCIKLSNkZWZpbmUgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1VTQiAidXNiIgotI2RlZmluZSBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUkVNT1RFX1NVQk1JWCAicl9zdWJtaXgiCi0jZGVmaW5lIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9DT0RFQ19PRkZMT0FEICJjb2RlY19vZmZsb2FkIgotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKgpAQCAtODIsMTEgKzcwLDYgQEAKICAqICBhdWRpbyBkZXZpY2UgcGFyYW1ldGVycwogICovCiAKLS8qIEJUIFNDTyBOb2lzZSBSZWR1Y3Rpb24gKyBFY2hvIENhbmNlbGxhdGlvbiBwYXJhbWV0ZXJzICovCi0jZGVmaW5lIEFVRElPX1BBUkFNRVRFUl9LRVlfQlRfTlJFQyAiYnRfaGVhZHNldF9ucmVjIgotI2RlZmluZSBBVURJT19QQVJBTUVURVJfVkFMVUVfT04gIm9uIgotI2RlZmluZSBBVURJT19QQVJBTUVURVJfVkFMVUVfT0ZGICJvZmYiCi0KIC8qIFRUWSBtb2RlIHNlbGVjdGlvbiAqLwogI2RlZmluZSBBVURJT19QQVJBTUVURVJfS0VZX1RUWV9NT0RFICJ0dHlfbW9kZSIKICNkZWZpbmUgQVVESU9fUEFSQU1FVEVSX1ZBTFVFX1RUWV9PRkYgInR0eV9vZmYiCkBAIC05NCw4ICs3Nyw3IEBACiAjZGVmaW5lIEFVRElPX1BBUkFNRVRFUl9WQUxVRV9UVFlfSENPICJ0dHlfaGNvIgogI2RlZmluZSBBVURJT19QQVJBTUVURVJfVkFMVUVfVFRZX0ZVTEwgInR0eV9mdWxsIgogCi0vKiBIZWFyaW5nIEFpZCBDb21wYXRpYmlsaXR5IC0gVGVsZWNvaWwgKEhBQy1UKSBtb2RlIG9uL29mZgotICAgU3RyaW5ncyBtdXN0IGJlIGluIHN5bmMgd2l0aCBDYWxsRmVhdHVyZXNTZXR0aW5nLmphdmEgKi8KKy8qIEhlYXJpbmcgQWlkIENvbXBhdGliaWxpdHkgLSBUZWxlY29pbCAoSEFDLVQpIG1vZGUgb24vb2ZmICovCiAjZGVmaW5lIEFVRElPX1BBUkFNRVRFUl9LRVlfSEFDICJIQUNTZXR0aW5nIgogI2RlZmluZSBBVURJT19QQVJBTUVURVJfVkFMVUVfSEFDX09OICJPTiIKICNkZWZpbmUgQVVESU9fUEFSQU1FVEVSX1ZBTFVFX0hBQ19PRkYgIk9GRiIKQEAgLTEwNiw2MyArODgsMTUgQEAKIC8qIEEyRFAgc291cmNlIGFkZHJlc3Mgc2V0IGJ5IGZyYW1ld29yayAqLwogI2RlZmluZSBBVURJT19QQVJBTUVURVJfQTJEUF9TT1VSQ0VfQUREUkVTUyAiYTJkcF9zb3VyY2VfYWRkcmVzcyIKIAotLyogU2NyZWVuIHN0YXRlICovCi0jZGVmaW5lIEFVRElPX1BBUkFNRVRFUl9LRVlfU0NSRUVOX1NUQVRFICJzY3JlZW5fc3RhdGUiCi0KIC8qIEJsdWV0b290aCBTQ08gd2lkZWJhbmQgKi8KICNkZWZpbmUgQVVESU9fUEFSQU1FVEVSX0tFWV9CVF9TQ09fV0IgImJ0X3dicyIKIAotLyogR2V0IGEgbmV3IEhXIHN5bmNocm9uaXphdGlvbiBzb3VyY2UgaWRlbnRpZmllci4KLSAqIFJldHVybiBhIHZhbGlkIHNvdXJjZSAocG9zaXRpdmUgaW50ZWdlcikgb3IgQVVESU9fSFdfU1lOQ19JTlZBTElEIGlmIGFuIGVycm9yIG9jY3VycwotICogb3Igbm8gSFcgc3luYyBpcyBhdmFpbGFibGUuICovCi0jZGVmaW5lIEFVRElPX1BBUkFNRVRFUl9IV19BVl9TWU5DICJod19hdl9zeW5jIgotCiAvKioKICAqICBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycwogICovCiAKLSNkZWZpbmUgQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9ST1VUSU5HICJyb3V0aW5nIiAgICAgICAgICAgICAvKiBhdWRpb19kZXZpY2VzX3QgKi8KLSNkZWZpbmUgQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9GT1JNQVQgImZvcm1hdCIgICAgICAgICAgICAgICAvKiBhdWRpb19mb3JtYXRfdCAqLwotI2RlZmluZSBBVURJT19QQVJBTUVURVJfU1RSRUFNX0NIQU5ORUxTICJjaGFubmVscyIgICAgICAgICAgIC8qIGF1ZGlvX2NoYW5uZWxfbWFza190ICovCi0jZGVmaW5lIEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fRlJBTUVfQ09VTlQgImZyYW1lX2NvdW50IiAgICAgLyogc2l6ZV90ICovCi0jZGVmaW5lIEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fSU5QVVRfU09VUkNFICJpbnB1dF9zb3VyY2UiICAgLyogYXVkaW9fc291cmNlX3QgKi8KLSNkZWZpbmUgQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TQU1QTElOR19SQVRFICJzYW1wbGluZ19yYXRlIiAvKiB1aW50MzJfdCAqLwotCi0jZGVmaW5lIEFVRElPX1BBUkFNRVRFUl9ERVZJQ0VfQ09OTkVDVCAiY29ubmVjdCIgICAgICAgICAgICAvKiBhdWRpb19kZXZpY2VzX3QgKi8KLSNkZWZpbmUgQVVESU9fUEFSQU1FVEVSX0RFVklDRV9ESVNDT05ORUNUICJkaXNjb25uZWN0IiAgICAgIC8qIGF1ZGlvX2RldmljZXNfdCAqLwotCi0vKiBRdWVyeSBzdXBwb3J0ZWQgZm9ybWF0cy4gVGhlIHJlc3BvbnNlIGlzIGEgJ3wnIHNlcGFyYXRlZCBsaXN0IG9mIHN0cmluZ3MgZnJvbQotICogYXVkaW9fZm9ybWF0X3QgZW51bSBlLmc6ICJzdXBfZm9ybWF0cz1BVURJT19GT1JNQVRfUENNXzE2X0JJVCIgKi8KLSNkZWZpbmUgQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfRk9STUFUUyAic3VwX2Zvcm1hdHMiCi0vKiBRdWVyeSBzdXBwb3J0ZWQgY2hhbm5lbCBtYXNrcy4gVGhlIHJlc3BvbnNlIGlzIGEgJ3wnIHNlcGFyYXRlZCBsaXN0IG9mIHN0cmluZ3MgZnJvbQotICogYXVkaW9fY2hhbm5lbF9tYXNrX3QgZW51bSBlLmc6ICJzdXBfY2hhbm5lbHM9QVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPfEFVRElPX0NIQU5ORUxfT1VUX01PTk8iICovCi0jZGVmaW5lIEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX0NIQU5ORUxTICJzdXBfY2hhbm5lbHMiCi0vKiBRdWVyeSBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMuIFRoZSByZXNwb25zZSBpcyBhICd8JyBzZXBhcmF0ZWQgbGlzdCBvZiBpbnRlZ2VyIHZhbHVlcyBlLmc6Ci0gKiAic3VwX3NhbXBsaW5nX3JhdGVzPTQ0MTAwfDQ4MDAwIiAqLwotI2RlZmluZSBBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9TQU1QTElOR19SQVRFUyAic3VwX3NhbXBsaW5nX3JhdGVzIgotCi0vKiBTZXQgdGhlIEhXIHN5bmNocm9uaXphdGlvbiBzb3VyY2UgZm9yIGFuIG91dHB1dCBzdHJlYW0uICovCi0jZGVmaW5lIEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fSFdfQVZfU1lOQyAiaHdfYXZfc3luYyIKLQotLyogRW5hYmxlIG1vbm8gYXVkaW8gcGxheWJhY2sgaWYgMSwgZWxzZSBzaG91bGQgYmUgMC4gKi8KLSNkZWZpbmUgQVVESU9fUEFSQU1FVEVSX01PTk9fT1VUUFVUICJtb25vX291dHB1dCIKLQotLyoqCi0gKiBhdWRpbyBjb2RlYyBwYXJhbWV0ZXJzCi0gKi8KLQotI2RlZmluZSBBVURJT19PRkZMT0FEX0NPREVDX1BBUkFNUyAibXVzaWNfb2ZmbG9hZF9jb2RlY19wYXJhbSIKLSNkZWZpbmUgQVVESU9fT0ZGTE9BRF9DT0RFQ19CSVRfUEVSX1NBTVBMRSAibXVzaWNfb2ZmbG9hZF9iaXRfcGVyX3NhbXBsZSIKLSNkZWZpbmUgQVVESU9fT0ZGTE9BRF9DT0RFQ19CSVRfUkFURSAibXVzaWNfb2ZmbG9hZF9iaXRfcmF0ZSIKLSNkZWZpbmUgQVVESU9fT0ZGTE9BRF9DT0RFQ19BVkdfQklUX1JBVEUgIm11c2ljX29mZmxvYWRfYXZnX2JpdF9yYXRlIgotI2RlZmluZSBBVURJT19PRkZMT0FEX0NPREVDX0lEICJtdXNpY19vZmZsb2FkX2NvZGVjX2lkIgotI2RlZmluZSBBVURJT19PRkZMT0FEX0NPREVDX0JMT0NLX0FMSUdOICJtdXNpY19vZmZsb2FkX2Jsb2NrX2FsaWduIgotI2RlZmluZSBBVURJT19PRkZMT0FEX0NPREVDX1NBTVBMRV9SQVRFICJtdXNpY19vZmZsb2FkX3NhbXBsZV9yYXRlIgotI2RlZmluZSBBVURJT19PRkZMT0FEX0NPREVDX0VOQ09ERV9PUFRJT04gIm11c2ljX29mZmxvYWRfZW5jb2RlX29wdGlvbiIKLSNkZWZpbmUgQVVESU9fT0ZGTE9BRF9DT0RFQ19OVU1fQ0hBTk5FTCAgIm11c2ljX29mZmxvYWRfbnVtX2NoYW5uZWxzIgotI2RlZmluZSBBVURJT19PRkZMT0FEX0NPREVDX0RPV05fU0FNUExJTkcgICJtdXNpY19vZmZsb2FkX2Rvd25fc2FtcGxpbmciCi0jZGVmaW5lIEFVRElPX09GRkxPQURfQ09ERUNfREVMQVlfU0FNUExFUyAgImRlbGF5X3NhbXBsZXMiCi0jZGVmaW5lIEFVRElPX09GRkxPQURfQ09ERUNfUEFERElOR19TQU1QTEVTICAicGFkZGluZ19zYW1wbGVzIgorLyogRW5hYmxlIEFBTkMgKi8KKyNkZWZpbmUgQVVESU9fUEFSQU1FVEVSX0tFWV9BQU5DICJhYW5jX2VuYWJsZWQiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMzk5LDYgKzMzMyw2NSBAQAogICAgIGludCAoKmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24pKGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0ICpzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApOwogCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gc3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICAgKiBjcmVhdGVfbW1hcF9idWZmZXIgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgc3RhcnQoKQorICAgICAqCisgICAgICogXG5vdGUgRnVuY3Rpb24gb25seSBpbXBsZW1lbnRlZCBieSBzdHJlYW1zIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgICoKKyAgICAgKiBccGFyYW1baW5dIHN0cmVhbSB0aGUgc3RyZWFtIG9iamVjdC4KKyAgICAgKiBccmV0dXJuIDAgaW4gY2FzZSBvZiBzdWNjZXNzLgorICAgICAqICAgICAgICAgLUVOT1NZUyBpZiBjYWxsZWQgb3V0IG9mIHNlcXVlbmNlIG9yIG9uIG5vbiBtbWFwIHN0cmVhbQorICAgICAqLworICAgIGludCAoKnN0YXJ0KShjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCogc3RyZWFtKTsKKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgZnJhbWV3b3JrIHRvIHN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICAgKiBNdXN0IGJlIGNhbGxlZCBhZnRlciBzdGFydCgpCisgICAgICoKKyAgICAgKiBcbm90ZSBGdW5jdGlvbiBvbmx5IGltcGxlbWVudGVkIGJ5IHN0cmVhbXMgb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gc3RyZWFtIHRoZSBzdHJlYW0gb2JqZWN0LgorICAgICAqIFxyZXR1cm4gMCBpbiBjYXNlIG9mIHN1Y2Nlc3MuCisgICAgICogICAgICAgICAtRU5PU1lTIGlmIGNhbGxlZCBvdXQgb2Ygc2VxdWVuY2Ugb3Igb24gbm9uIG1tYXAgc3RyZWFtCisgICAgICovCisgICAgaW50ICgqc3RvcCkoY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQqIHN0cmVhbSk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgdGhlIGZyYW1ld29yayB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgbW1hcCBidWZmZXIgdXNlZCBmb3IgYXVkaW8KKyAgICAgKiBzYW1wbGVzIHRyYW5zZmVyLgorICAgICAqCisgICAgICogXG5vdGUgRnVuY3Rpb24gb25seSBpbXBsZW1lbnRlZCBieSBzdHJlYW1zIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgICoKKyAgICAgKiBccGFyYW1baW5dIHN0cmVhbSB0aGUgc3RyZWFtIG9iamVjdC4KKyAgICAgKiBccGFyYW1baW5dIG1pbl9zaXplX2ZyYW1lcyBtaW5pbXVtIGJ1ZmZlciBzaXplIHJlcXVlc3RlZC4gVGhlIGFjdHVhbCBidWZmZXIKKyAgICAgKiAgICAgICAgc2l6ZSByZXR1cm5lZCBpbiBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyBjYW4gYmUgbGFyZ2VyLgorICAgICAqIFxwYXJhbVtvdXRdIGluZm8gYWRkcmVzcyBhdCB3aGljaCB0aGUgbW1hcCBidWZmZXIgaW5mb3JtYXRpb24gc2hvdWxkIGJlIHJldHVybmVkLgorICAgICAqCisgICAgICogXHJldHVybiAwIGlmIHRoZSBidWZmZXIgd2FzIGFsbG9jYXRlZC4KKyAgICAgKiAgICAgICAgIC1FTk9ERVYgaW4gY2FzZSBvZiBpbml0aWFsaXphdGlvbiBlcnJvcgorICAgICAqICAgICAgICAgLUVJTlZBTCBpZiB0aGUgcmVxdWVzdGVkIGJ1ZmZlciBzaXplIGlzIHRvbyBsYXJnZQorICAgICAqICAgICAgICAgLUVOT1NZUyBpZiBjYWxsZWQgb3V0IG9mIHNlcXVlbmNlIChlLmcuIGJ1ZmZlciBhbHJlYWR5IGFsbG9jYXRlZCkKKyAgICAgKi8KKyAgICBpbnQgKCpjcmVhdGVfbW1hcF9idWZmZXIpKGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1pbl9zaXplX2ZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgZnJhbWV3b3JrIHRvIHJlYWQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgorICAgICAqIHdpdGggYXNzb2NpYXRlZCB0aW1lIHN0YW1wLgorICAgICAqCisgICAgICogXG5vdGUgRnVuY3Rpb24gb25seSBpbXBsZW1lbnRlZCBieSBzdHJlYW1zIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgICoKKyAgICAgKiBccGFyYW1baW5dIHN0cmVhbSB0aGUgc3RyZWFtIG9iamVjdC4KKyAgICAgKiBccGFyYW1bb3V0XSBwb3NpdGlvbiBhZGRyZXNzIGF0IHdoaWNoIHRoZSBtbWFwIHJlYWQvd3JpdGUgcG9zaXRpb24gc2hvdWxkIGJlIHJldHVybmVkLgorICAgICAqCisgICAgICogXHJldHVybiAwIGlmIHRoZSBwb3NpdGlvbiBpcyBzdWNjZXNzZnVsbHkgcmV0dXJuZWQuCisgICAgICogICAgICAgICAtRU5PREFUQSBpZiB0aGUgcG9zaXRpb24gY2Fubm90IGJlIHJldHJpZXZlZAorICAgICAqICAgICAgICAgLUVOT1NZUyBpZiBjYWxsZWQgYmVmb3JlIGNyZWF0ZV9tbWFwX2J1ZmZlcigpCisgICAgICovCisgICAgaW50ICgqZ2V0X21tYXBfcG9zaXRpb24pKGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7CiB9OwogdHlwZWRlZiBzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCBhdWRpb19zdHJlYW1fb3V0X3Q7CiAKQEAgLTQ0OSw2ICs0NDIsNjUgQEAKICAgICAgKi8KICAgICBpbnQgKCpnZXRfY2FwdHVyZV9wb3NpdGlvbikoY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gc3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICAgKiBjcmVhdGVfbW1hcF9idWZmZXIgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgc3RhcnQoKQorICAgICAqCisgICAgICogXG5vdGUgRnVuY3Rpb24gb25seSBpbXBsZW1lbnRlZCBieSBzdHJlYW1zIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgICoKKyAgICAgKiBccGFyYW1baW5dIHN0cmVhbSB0aGUgc3RyZWFtIG9iamVjdC4KKyAgICAgKiBccmV0dXJuIDAgaW4gY2FzZSBvZmYgc3VjY2Vzcy4KKyAgICAgKiAgICAgICAgIC1FTk9TWVMgaWYgY2FsbGVkIG91dCBvZiBzZXF1ZW5jZSBvciBvbiBub24gbW1hcCBzdHJlYW0KKyAgICAgKi8KKyAgICBpbnQgKCpzdGFydCkoY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiogc3RyZWFtKTsKKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgZnJhbWV3b3JrIHRvIHN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICAgKgorICAgICAqIFxub3RlIEZ1bmN0aW9uIG9ubHkgaW1wbGVtZW50ZWQgYnkgc3RyZWFtcyBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSBzdHJlYW0gdGhlIHN0cmVhbSBvYmplY3QuCisgICAgICogXHJldHVybiAwIGluIGNhc2Ugb2Ygc3VjY2Vzcy4KKyAgICAgKiAgICAgICAgIC1FTk9TWVMgaWYgY2FsbGVkIG91dCBvZiBzZXF1ZW5jZSBvciBvbiBub24gbW1hcCBzdHJlYW0KKyAgICAgKi8KKyAgICBpbnQgKCpzdG9wKShjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luKiBzdHJlYW0pOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIG1tYXAgYnVmZmVyIHVzZWQgZm9yIGF1ZGlvCisgICAgICogc2FtcGxlcyB0cmFuc2Zlci4KKyAgICAgKgorICAgICAqIFxub3RlIEZ1bmN0aW9uIG9ubHkgaW1wbGVtZW50ZWQgYnkgc3RyZWFtcyBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSBzdHJlYW0gdGhlIHN0cmVhbSBvYmplY3QuCisgICAgICogXHBhcmFtW2luXSBtaW5fc2l6ZV9mcmFtZXMgbWluaW11bSBidWZmZXIgc2l6ZSByZXF1ZXN0ZWQuIFRoZSBhY3R1YWwgYnVmZmVyCisgICAgICogICAgICAgIHNpemUgcmV0dXJuZWQgaW4gc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gY2FuIGJlIGxhcmdlci4KKyAgICAgKiBccGFyYW1bb3V0XSBpbmZvIGFkZHJlc3MgYXQgd2hpY2ggdGhlIG1tYXAgYnVmZmVyIGluZm9ybWF0aW9uIHNob3VsZCBiZSByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gMCBpZiB0aGUgYnVmZmVyIHdhcyBhbGxvY2F0ZWQuCisgICAgICogICAgICAgICAtRU5PREVWIGluIGNhc2Ugb2YgaW5pdGlhbGl6YXRpb24gZXJyb3IKKyAgICAgKiAgICAgICAgIC1FSU5WQUwgaWYgdGhlIHJlcXVlc3RlZCBidWZmZXIgc2l6ZSBpcyB0b28gbGFyZ2UKKyAgICAgKiAgICAgICAgIC1FTk9TWVMgaWYgY2FsbGVkIG91dCBvZiBzZXF1ZW5jZSAoZS5nLiBidWZmZXIgYWxyZWFkeSBhbGxvY2F0ZWQpCisgICAgICovCisgICAgaW50ICgqY3JlYXRlX21tYXBfYnVmZmVyKShjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1pbl9zaXplX2ZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgZnJhbWV3b3JrIHRvIHJlYWQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgorICAgICAqIHdpdGggYXNzb2NpYXRlZCB0aW1lIHN0YW1wLgorICAgICAqCisgICAgICogXG5vdGUgRnVuY3Rpb24gb25seSBpbXBsZW1lbnRlZCBieSBzdHJlYW1zIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgICoKKyAgICAgKiBccGFyYW1baW5dIHN0cmVhbSB0aGUgc3RyZWFtIG9iamVjdC4KKyAgICAgKiBccGFyYW1bb3V0XSBwb3NpdGlvbiBhZGRyZXNzIGF0IHdoaWNoIHRoZSBtbWFwIHJlYWQvd3JpdGUgcG9zaXRpb24gc2hvdWxkIGJlIHJldHVybmVkLgorICAgICAqCisgICAgICogXHJldHVybiAwIGlmIHRoZSBwb3NpdGlvbiBpcyBzdWNjZXNzZnVsbHkgcmV0dXJuZWQuCisgICAgICogICAgICAgICAtRU5PREFUQSBpZiB0aGUgcG9zaXRpb24gY2Fubm90IGJlIHJldHJlaXZlZAorICAgICAqICAgICAgICAgLUVOT1NZUyBpZiBjYWxsZWQgYmVmb3JlIG1tYXBfcmVhZF9wb3NpdGlvbigpCisgICAgICovCisgICAgaW50ICgqZ2V0X21tYXBfcG9zaXRpb24pKGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW1faW4gKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKIH07CiB0eXBlZGVmIHN0cnVjdCBhdWRpb19zdHJlYW1faW4gYXVkaW9fc3RyZWFtX2luX3Q7CiAKQEAgLTY3OSw3ICs3MzEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2h3X2RldmljZSoqIGRldmljZSkKIHsKICAgICByZXR1cm4gbW9kdWxlLT5tZXRob2RzLT5vcGVuKG1vZHVsZSwgQVVESU9fSEFSRFdBUkVfSU5URVJGQUNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBod19kZXZpY2VfdCoqKWRldmljZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT19IV19ERVZJQ0VfVF9PUEVOKGRldmljZSkpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBhdWRpb19od19kZXZpY2VfY2xvc2Uoc3RydWN0IGF1ZGlvX2h3X2RldmljZSogZGV2aWNlKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS9hdWRpb19hbHNhb3BzLmggYi9pbmNsdWRlL2hhcmR3YXJlL2F1ZGlvX2Fsc2FvcHMuaAppbmRleCAwZDI2NmZmLi5lOTk0OTI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2hhcmR3YXJlL2F1ZGlvX2Fsc2FvcHMuaAorKysgYi9pbmNsdWRlL2hhcmR3YXJlL2F1ZGlvX2Fsc2FvcHMuaApAQCAtMzcsNyArMzcsNyBAQAogc3RhdGljIGlubGluZSBlbnVtIHBjbV9mb3JtYXQgcGNtX2Zvcm1hdF9mcm9tX2F1ZGlvX2Zvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpCiB7CiAgICAgc3dpdGNoIChmb3JtYXQpIHsKLSNpZmRlZiBIQVZFX0JJR19FTkRJQU4KKyNpZiBIQVZFX0JJR19FTkRJQU4KICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgogICAgICAgICByZXR1cm4gUENNX0ZPUk1BVF9TMTZfQkU7CiAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQ6CkBAIC03Miw3ICs3Miw3IEBACiBzdGF0aWMgaW5saW5lIGF1ZGlvX2Zvcm1hdF90IGF1ZGlvX2Zvcm1hdF9mcm9tX3BjbV9mb3JtYXQoZW51bSBwY21fZm9ybWF0IGZvcm1hdCkKIHsKICAgICBzd2l0Y2ggKGZvcm1hdCkgewotI2lmZGVmIEhBVkVfQklHX0VORElBTgorI2lmIEhBVkVfQklHX0VORElBTgogICAgIGNhc2UgUENNX0ZPUk1BVF9TMTZfQkU6CiAgICAgICAgIHJldHVybiBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKICAgICBjYXNlIFBDTV9GT1JNQVRfUzI0XzNCRToKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvYXVkaW9fZWZmZWN0LmggYi9pbmNsdWRlL2hhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oCmluZGV4IDhhODg0MTQuLjMzNjZlMTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvYXVkaW9fZWZmZWN0LmgKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS9hdWRpb19lZmZlY3QuaApAQCAtMjYsNyArMjYsNyBAQAogCiAjaW5jbHVkZSA8Y3V0aWxzL2JpdG9wcy5oPgogCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgogCiAKIF9fQkVHSU5fREVDTFMKQEAgLTM2LDIzMSArMzYsMTEgQEAKIC8vICAgICAgQ29tbW9uIERlZmluaXRpb25zCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLS8vCi0vLy0tLSBFZmZlY3QgZGVzY3JpcHRvciBzdHJ1Y3R1cmUgZWZmZWN0X2Rlc2NyaXB0b3JfdAotLy8KLQotLy8gVW5pcXVlIGVmZmVjdCBJRCAoY2FuIGJlIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgc2l0ZToKLS8vICBodHRwOi8vd3d3Lml0dS5pbnQvSVRVLVQvYXNuMS91dWlkLmh0bWwpCi0vLyBUaGlzIGZvcm1hdCBpcyB1c2VkIGZvciBib3RoICJ0eXBlIiBhbmQgInV1aWQiIGZpZWxkcyBvZiB0aGUgZWZmZWN0IGRlc2NyaXB0b3Igc3RydWN0dXJlLgotLy8gLSBXaGVuIHVzZWQgZm9yIGVmZmVjdCB0eXBlIGFuZCB0aGUgZW5naW5lIGlzIGltcGxlbWVudGluZyBhbmQgZWZmZWN0IGNvcnJlc3BvbmRpbmcgdG8gYSBzdGFuZGFyZAotLy8gT3BlblNMIEVTIGludGVyZmFjZSwgdGhpcyBJRCBtdXN0IGJlIHRoZSBvbmUgZGVmaW5lZCBpbiBPcGVuU0xFU19JSUQuaCBmb3IgdGhhdCBpbnRlcmZhY2UuCi0vLyAtIFdoZW4gdXNlZCBhcyB1dWlkLCBpdCBzaG91bGQgYmUgYSB1bmlxdWUgVVVJRCBmb3IgdGhpcyBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uLgotdHlwZWRlZiBzdHJ1Y3QgZWZmZWN0X3V1aWRfcyB7Ci0gICAgdWludDMyX3QgdGltZUxvdzsKLSAgICB1aW50MTZfdCB0aW1lTWlkOwotICAgIHVpbnQxNl90IHRpbWVIaUFuZFZlcnNpb247Ci0gICAgdWludDE2X3QgY2xvY2tTZXE7Ci0gICAgdWludDhfdCBub2RlWzZdOwotfSBlZmZlY3RfdXVpZF90OwotCi0vLyBNYXhpbXVtIGxlbmd0aCBvZiBjaGFyYWN0ZXIgc3RyaW5ncyBpbiBzdHJ1Y3R1cmVzIGRlZmluZXMgYnkgdGhpcyBBUEkuCi0jZGVmaW5lIEVGRkVDVF9TVFJJTkdfTEVOX01BWCA2NAotCi0vLyBOVUxMIFVVSUQgZGVmaW5pdGlvbiAobWF0Y2hlcyBTTF9JSURfTlVMTF8pCi0jZGVmaW5lIEVGRkVDVF9VVUlEX0lOSVRJQUxJWkVSIHsgMHhlYzcxNzhlYywgMHhlNWUxLCAweDQ0MzIsIDB4YTNmNCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMHg0NiwgMHg1NywgMHhlNiwgMHg3OSwgMHg1MiwgMHgxMCB9IH0KLXN0YXRpYyBjb25zdCBlZmZlY3RfdXVpZF90IEVGRkVDVF9VVUlEX05VTExfID0gRUZGRUNUX1VVSURfSU5JVElBTElaRVI7Ci1zdGF0aWMgY29uc3QgZWZmZWN0X3V1aWRfdCAqIGNvbnN0IEVGRkVDVF9VVUlEX05VTEwgPSAmRUZGRUNUX1VVSURfTlVMTF87Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IEVGRkVDVF9VVUlEX05VTExfU1RSID0gImVjNzE3OGVjLWU1ZTEtNDQzMi1hM2Y0LTQ2NTdlNjc5NTIxMCI7Ci0KLQotLy8gVGhlIGVmZmVjdCBkZXNjcmlwdG9yIGNvbnRhaW5zIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiB0byBmYWNpbGl0YXRlIHRoZSBlbnVtZXJhdGlvbiBvZiB0aGUgZWZmZWN0Ci0vLyBlbmdpbmVzIHByZXNlbnQgaW4gYSBsaWJyYXJ5LgotdHlwZWRlZiBzdHJ1Y3QgZWZmZWN0X2Rlc2NyaXB0b3JfcyB7Ci0gICAgZWZmZWN0X3V1aWRfdCB0eXBlOyAgICAgLy8gVVVJRCBvZiB0byB0aGUgT3BlblNMIEVTIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGlzIGVmZmVjdAotICAgIGVmZmVjdF91dWlkX3QgdXVpZDsgICAgIC8vIFVVSUQgZm9yIHRoaXMgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbgotICAgIHVpbnQzMl90IGFwaVZlcnNpb247ICAgIC8vIFZlcnNpb24gb2YgdGhlIGVmZmVjdCBjb250cm9sIEFQSSBpbXBsZW1lbnRlZAotICAgIHVpbnQzMl90IGZsYWdzOyAgICAgICAgIC8vIGVmZmVjdCBlbmdpbmUgY2FwYWJpbGl0aWVzL3JlcXVpcmVtZW50cyBmbGFncyAoc2VlIGJlbG93KQotICAgIHVpbnQxNl90IGNwdUxvYWQ7ICAgICAgIC8vIENQVSBsb2FkIGluZGljYXRpb24gKHNlZSBiZWxvdykKLSAgICB1aW50MTZfdCBtZW1vcnlVc2FnZTsgICAvLyBEYXRhIE1lbW9yeSB1c2FnZSAoc2VlIGJlbG93KQotICAgIGNoYXIgICAgbmFtZVtFRkZFQ1RfU1RSSU5HX0xFTl9NQVhdOyAgIC8vIGh1bWFuIHJlYWRhYmxlIGVmZmVjdCBuYW1lCi0gICAgY2hhciAgICBpbXBsZW1lbnRvcltFRkZFQ1RfU1RSSU5HX0xFTl9NQVhdOyAgICAvLyBodW1hbiByZWFkYWJsZSBlZmZlY3QgaW1wbGVtZW50b3IgbmFtZQotfSBlZmZlY3RfZGVzY3JpcHRvcl90OwotCi0vLyBDUFUgbG9hZCBhbmQgbWVtb3J5IHVzYWdlIGluZGljYXRpb246IGVhY2ggZWZmZWN0IGltcGxlbWVudGF0aW9uIG11c3QgcHJvdmlkZSBhbiBpbmRpY2F0aW9uIG9mCi0vLyBpdHMgQ1BVIGFuZCBtZW1vcnkgdXNhZ2UgZm9yIHRoZSBhdWRpbyBlZmZlY3QgZnJhbWV3b3JrIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgZWZmZWN0cwotLy8gaW5zdGFudGlhdGVkIGF0IGEgZ2l2ZW4gdGltZSBvbiBhIGdpdmVuIHBsYXRmb3JtLgotLy8gVGhlIENQVSBsb2FkIGlzIGV4cHJlc3NlZCBpbiAwLjEgTUlQUyB1bml0cyBhcyBlc3RpbWF0ZWQgb24gYW4gQVJNOUUgY29yZSAoQVJNdjVURSkgd2l0aCAwIFdTLgotLy8gVGhlIG1lbW9yeSB1c2FnZSBpcyBleHByZXNzZWQgaW4gS0IgYW5kIGluY2x1ZGVzIG9ubHkgZHluYW1pY2FsbHkgYWxsb2NhdGVkIG1lbW9yeQotCi0vLyBEZWZpbml0aW9ucyBmb3IgZmxhZ3MgZmllbGQgb2YgZWZmZWN0IGRlc2NyaXB0b3IuCi0vLyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIHwgZGVzY3JpcHRpb24gICAgICAgICAgICAgICB8IGJpdHMgICAgICB8IHZhbHVlcwotLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICB8IGNvbm5lY3Rpb24gbW9kZSAgICAgICAgICAgfCAwLi4yICAgICAgfCAwIGluc2VydDogYWZ0ZXIgdHJhY2sgcHJvY2VzcwotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDEgYXV4aWxpYXJ5OiBjb25uZWN0IHRvIHRyYWNrIGF1eGlsaWFyeQotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICBvdXRwdXQgYW5kIHVzZSBzZW5kIGxldmVsCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMiByZXBsYWNlOiByZXBsYWNlcyB0cmFjayBwcm9jZXNzIGZ1bmN0aW9uOwotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgbXVzdCBpbXBsZW1lbnQgU1JDLCB2b2x1bWUgYW5kIG1vbm8gdG8gc3RlcmVvLgotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDMgcHJlIHByb2Nlc3Npbmc6IGFwcGxpZWQgYmVsb3cgYXVkaW8gSEFMIG9uIGlucHV0Ci0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgNCBwb3N0IHByb2Nlc3Npbmc6IGFwcGxpZWQgYmVsb3cgYXVkaW8gSEFMIG9uIG91dHB1dAotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDUgLSA3IHJlc2VydmVkCi0vLyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIHwgaW5zZXJ0aW9uIHByZWZlcmVuY2UgICAgICB8IDMuLjUgICAgICB8IDAgbm9uZQotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDEgZmlyc3Qgb2YgdGhlIGNoYWluCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMiBsYXN0IG9mIHRoZSBjaGFpbgotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDMgZXhjbHVzaXZlIChvbmx5IGVmZmVjdCBpbiB0aGUgaW5zZXJ0IGNoYWluKQotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDQuLjcgcmVzZXJ2ZWQKLS8vICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgfCBWb2x1bWUgbWFuYWdlbWVudCAgICAgICAgIHwgNi4uOCAgICAgIHwgMCBub25lCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMSBpbXBsZW1lbnRzIHZvbHVtZSBjb250cm9sCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMiByZXF1aXJlcyB2b2x1bWUgaW5kaWNhdGlvbgotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDQgcmVzZXJ2ZWQKLS8vICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgfCBEZXZpY2UgaW5kaWNhdGlvbiAgICAgICAgIHwgOS4uMTEgICAgIHwgMCBub25lCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMSByZXF1aXJlcyBkZXZpY2UgdXBkYXRlcwotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDIsIDQgcmVzZXJ2ZWQKLS8vICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgfCBTYW1wbGUgaW5wdXQgbW9kZSAgICAgICAgIHwgMTIuLjEzICAgIHwgMSBkaXJlY3Q6IHByb2Nlc3MoKSBmdW5jdGlvbiBvciBFRkZFQ1RfQ01EX1NFVF9DT05GSUcKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGNvbW1hbmQgbXVzdCBzcGVjaWZ5IGEgYnVmZmVyIGRlc2NyaXB0b3IKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAyIHByb3ZpZGVyOiBwcm9jZXNzKCkgZnVuY3Rpb24gdXNlcyB0aGUKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGJ1ZmZlclByb3ZpZGVyIGluZGljYXRlZCBieSB0aGUKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIEVGRkVDVF9DTURfU0VUX0NPTkZJRyBjb21tYW5kIHRvIHJlcXVlc3QgaW5wdXQuCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBidWZmZXJzLgotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDMgYm90aDogYm90aCBpbnB1dCBtb2RlcyBhcmUgc3VwcG9ydGVkCi0vLyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIHwgU2FtcGxlIG91dHB1dCBtb2RlICAgICAgICB8IDE0Li4xNSAgICB8IDEgZGlyZWN0OiBwcm9jZXNzKCkgZnVuY3Rpb24gb3IgRUZGRUNUX0NNRF9TRVRfQ09ORklHCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBjb21tYW5kIG11c3Qgc3BlY2lmeSBhIGJ1ZmZlciBkZXNjcmlwdG9yCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMiBwcm92aWRlcjogcHJvY2VzcygpIGZ1bmN0aW9uIHVzZXMgdGhlCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBidWZmZXJQcm92aWRlciBpbmRpY2F0ZWQgYnkgdGhlCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgY29tbWFuZCB0byByZXF1ZXN0IG91dHB1dAotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgYnVmZmVycy4KLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAzIGJvdGg6IGJvdGggb3V0cHV0IG1vZGVzIGFyZSBzdXBwb3J0ZWQKLS8vICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgfCBIYXJkd2FyZSBhY2NlbGVyYXRpb24gICAgIHwgMTYuLjE3ICAgIHwgMCBObyBoYXJkd2FyZSBhY2NlbGVyYXRpb24KLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAxIG5vbiB0dW5uZWxlZCBodyBhY2NlbGVyYXRpb246IHRoZSBwcm9jZXNzKCkgZnVuY3Rpb24KLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIHJlYWRzIHRoZSBzYW1wbGVzLCBzZW5kIHRoZW0gdG8gSFcgYWNjZWxlcmF0ZWQKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGVmZmVjdCBwcm9jZXNzb3IsIHJlYWRzIGJhY2sgdGhlIHByb2Nlc3NlZCBzYW1wbGVzCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBhbmQgcmV0dXJucyB0aGVtIHRvIHRoZSBvdXRwdXQgYnVmZmVyLgotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDIgdHVubmVsZWQgaHcgYWNjZWxlcmF0aW9uOiB0aGUgcHJvY2VzcygpIGZ1bmN0aW9uIGlzCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICB0cmFuc3BhcmVudC4gVGhlIGVmZmVjdCBpbnRlcmZhY2UgaXMgb25seSB1c2VkIHRvCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBjb250cm9sIHRoZSBlZmZlY3QgZW5naW5lLiBUaGlzIG1vZGUgaXMgcmVsZXZhbnQgZm9yCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBnbG9iYWwgZWZmZWN0cyBhY3R1YWxseSBhcHBsaWVkIGJ5IHRoZSBhdWRpbwotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgaGFyZHdhcmUgb24gdGhlIG91dHB1dCBzdHJlYW0uCi0vLyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIHwgQXVkaW8gTW9kZSBpbmRpY2F0aW9uICAgICB8IDE4Li4xOSAgICB8IDAgbm9uZQotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDEgcmVxdWlyZXMgYXVkaW8gbW9kZSB1cGRhdGVzCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMi4uMyByZXNlcnZlZAotLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICB8IEF1ZGlvIHNvdXJjZSBpbmRpY2F0aW9uICAgfCAyMC4uMjEgICAgfCAwIG5vbmUKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAxIHJlcXVpcmVzIGF1ZGlvIHNvdXJjZSB1cGRhdGVzCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMi4uMyByZXNlcnZlZAotLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICB8IEVmZmVjdCBvZmZsb2FkIHN1cHBvcnRlZCAgfCAyMiAgICAgICAgfCAwIFRoZSBlZmZlY3QgY2Fubm90IGJlIG9mZmxvYWRlZCB0byBhbiBhdWRpbyBEU1AKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAxIFRoZSBlZmZlY3QgY2FuIGJlIG9mZmxvYWRlZCB0byBhbiBhdWRpbyBEU1AKLS8vICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgfCBQcm9jZXNzIGZ1bmN0aW9uIG5vdCAgICAgIHwgMjMgICAgICAgIHwgMCBUaGUgZWZmZWN0IGltcGxlbWVudHMgYSBwcm9jZXNzIGZ1bmN0aW9uLgotLy8gIHwgaW1wbGVtZW50ZWQgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDEgVGhlIGVmZmVjdCBkb2VzIG5vdCBpbXBsZW1lbnQgYSBwcm9jZXNzIGZ1bmN0aW9uOgotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgZW5hYmxpbmcgdGhlIGVmZmVjdCBoYXMgbm8gaW1wYWN0IG9uIGxhdGVuY3kgb3IKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIENQVSBsb2FkLgotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgRWZmZWN0IGltcGxlbWVudGF0aW9ucyBzZXR0aW5nIHRoaXMgZmxhZyBkbyBub3QgaGF2ZQotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgdG8gaW1wbGVtZW50IGEgcHJvY2VzcyBmdW5jdGlvbi4KLS8vICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEluc2VydCBtb2RlCi0jZGVmaW5lIEVGRkVDVF9GTEFHX1RZUEVfU0hJRlQgICAgICAgICAgMAotI2RlZmluZSBFRkZFQ1RfRkxBR19UWVBFX1NJWkUgICAgICAgICAgIDMKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLICAgICAgICAgICAoKCgxIDw8IEVGRkVDVF9GTEFHX1RZUEVfU0laRSkgLTEpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgRUZGRUNUX0ZMQUdfVFlQRV9TSElGVCkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQgICAgICAgICAoMCA8PCBFRkZFQ1RfRkxBR19UWVBFX1NISUZUKQotI2RlZmluZSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSAgICAgICgxIDw8IEVGRkVDVF9GTEFHX1RZUEVfU0hJRlQpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX1RZUEVfUkVQTEFDRSAgICAgICAgKDIgPDwgRUZGRUNUX0ZMQUdfVFlQRV9TSElGVCkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQyAgICAgICAoMyA8PCBFRkZFQ1RfRkxBR19UWVBFX1NISUZUKQotI2RlZmluZSBFRkZFQ1RfRkxBR19UWVBFX1BPU1RfUFJPQyAgICAgICg0IDw8IEVGRkVDVF9GTEFHX1RZUEVfU0hJRlQpCi0KLS8vIEluc2VydCBwcmVmZXJlbmNlCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0lOU0VSVF9TSElGVCAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfU0hJRlQgKyBFRkZFQ1RfRkxBR19UWVBFX1NJWkUpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0lOU0VSVF9TSVpFICAgICAgICAgMwotI2RlZmluZSBFRkZFQ1RfRkxBR19JTlNFUlRfTUFTSyAgICAgICAgICgoKDEgPDwgRUZGRUNUX0ZMQUdfSU5TRVJUX1NJWkUpIC0xKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEVGRkVDVF9GTEFHX0lOU0VSVF9TSElGVCkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5TRVJUX0FOWSAgICAgICAgICAoMCA8PCBFRkZFQ1RfRkxBR19JTlNFUlRfU0hJRlQpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0lOU0VSVF9GSVJTVCAgICAgICAgKDEgPDwgRUZGRUNUX0ZMQUdfSU5TRVJUX1NISUZUKQotI2RlZmluZSBFRkZFQ1RfRkxBR19JTlNFUlRfTEFTVCAgICAgICAgICgyIDw8IEVGRkVDVF9GTEFHX0lOU0VSVF9TSElGVCkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5TRVJUX0VYQ0xVU0lWRSAgICAoMyA8PCBFRkZFQ1RfRkxBR19JTlNFUlRfU0hJRlQpCi0KLQotLy8gVm9sdW1lIGNvbnRyb2wKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfVk9MVU1FX1NISUZUICAgICAgICAoRUZGRUNUX0ZMQUdfSU5TRVJUX1NISUZUICsgRUZGRUNUX0ZMQUdfSU5TRVJUX1NJWkUpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX1ZPTFVNRV9TSVpFICAgICAgICAgMwotI2RlZmluZSBFRkZFQ1RfRkxBR19WT0xVTUVfTUFTSyAgICAgICAgICgoKDEgPDwgRUZGRUNUX0ZMQUdfVk9MVU1FX1NJWkUpIC0xKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEVGRkVDVF9GTEFHX1ZPTFVNRV9TSElGVCkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwgICAgICAgICAoMSA8PCBFRkZFQ1RfRkxBR19WT0xVTUVfU0hJRlQpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX1ZPTFVNRV9JTkQgICAgICAgICAgKDIgPDwgRUZGRUNUX0ZMQUdfVk9MVU1FX1NISUZUKQotI2RlZmluZSBFRkZFQ1RfRkxBR19WT0xVTUVfTk9ORSAgICAgICAgICgwIDw8IEVGRkVDVF9GTEFHX1ZPTFVNRV9TSElGVCkKLQotLy8gRGV2aWNlIGluZGljYXRpb24KLSNkZWZpbmUgRUZGRUNUX0ZMQUdfREVWSUNFX1NISUZUICAgICAgICAoRUZGRUNUX0ZMQUdfVk9MVU1FX1NISUZUICsgRUZGRUNUX0ZMQUdfVk9MVU1FX1NJWkUpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0RFVklDRV9TSVpFICAgICAgICAgMwotI2RlZmluZSBFRkZFQ1RfRkxBR19ERVZJQ0VfTUFTSyAgICAgICAgICgoKDEgPDwgRUZGRUNUX0ZMQUdfREVWSUNFX1NJWkUpIC0xKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEVGRkVDVF9GTEFHX0RFVklDRV9TSElGVCkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfREVWSUNFX0lORCAgICAgICAgICAoMSA8PCBFRkZFQ1RfRkxBR19ERVZJQ0VfU0hJRlQpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0RFVklDRV9OT05FICAgICAgICAgKDAgPDwgRUZGRUNUX0ZMQUdfREVWSUNFX1NISUZUKQotCi0vLyBTYW1wbGUgaW5wdXQgbW9kZXMKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5QVVRfU0hJRlQgICAgICAgICAoRUZGRUNUX0ZMQUdfREVWSUNFX1NISUZUICsgRUZGRUNUX0ZMQUdfREVWSUNFX1NJWkUpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0lOUFVUX1NJWkUgICAgICAgICAgMgotI2RlZmluZSBFRkZFQ1RfRkxBR19JTlBVVF9NQVNLICAgICAgICAgICgoKDEgPDwgRUZGRUNUX0ZMQUdfSU5QVVRfU0laRSkgLTEpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgRUZGRUNUX0ZMQUdfSU5QVVRfU0hJRlQpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0lOUFVUX0RJUkVDVCAgICAgICAgKDEgPDwgRUZGRUNUX0ZMQUdfSU5QVVRfU0hJRlQpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0lOUFVUX1BST1ZJREVSICAgICAgKDIgPDwgRUZGRUNUX0ZMQUdfSU5QVVRfU0hJRlQpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0lOUFVUX0JPVEggICAgICAgICAgKDMgPDwgRUZGRUNUX0ZMQUdfSU5QVVRfU0hJRlQpCi0KLS8vIFNhbXBsZSBvdXRwdXQgbW9kZXMKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfT1VUUFVUX1NISUZUICAgICAgICAoRUZGRUNUX0ZMQUdfSU5QVVRfU0hJRlQgKyBFRkZFQ1RfRkxBR19JTlBVVF9TSVpFKQotI2RlZmluZSBFRkZFQ1RfRkxBR19PVVRQVVRfU0laRSAgICAgICAgIDIKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfT1VUUFVUX01BU0sgICAgICAgICAoKCgxIDw8IEVGRkVDVF9GTEFHX09VVFBVVF9TSVpFKSAtMSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBFRkZFQ1RfRkxBR19PVVRQVVRfU0hJRlQpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX09VVFBVVF9ESVJFQ1QgICAgICAgKDEgPDwgRUZGRUNUX0ZMQUdfT1VUUFVUX1NISUZUKQotI2RlZmluZSBFRkZFQ1RfRkxBR19PVVRQVVRfUFJPVklERVIgICAgICgyIDw8IEVGRkVDVF9GTEFHX09VVFBVVF9TSElGVCkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfT1VUUFVUX0JPVEggICAgICAgICAoMyA8PCBFRkZFQ1RfRkxBR19PVVRQVVRfU0hJRlQpCi0KLS8vIEhhcmR3YXJlIGFjY2VsZXJhdGlvbiBtb2RlCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0hXX0FDQ19TSElGVCAgICAgICAgKEVGRkVDVF9GTEFHX09VVFBVVF9TSElGVCArIEVGRkVDVF9GTEFHX09VVFBVVF9TSVpFKQotI2RlZmluZSBFRkZFQ1RfRkxBR19IV19BQ0NfU0laRSAgICAgICAgIDIKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSFdfQUNDX01BU0sgICAgICAgICAoKCgxIDw8IEVGRkVDVF9GTEFHX0hXX0FDQ19TSVpFKSAtMSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBFRkZFQ1RfRkxBR19IV19BQ0NfU0hJRlQpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0hXX0FDQ19TSU1QTEUgICAgICAgKDEgPDwgRUZGRUNUX0ZMQUdfSFdfQUNDX1NISUZUKQotI2RlZmluZSBFRkZFQ1RfRkxBR19IV19BQ0NfVFVOTkVMICAgICAgICgyIDw8IEVGRkVDVF9GTEFHX0hXX0FDQ19TSElGVCkKLQotLy8gQXVkaW8gbW9kZSBpbmRpY2F0aW9uCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0FVRElPX01PREVfU0hJRlQgICAgKEVGRkVDVF9GTEFHX0hXX0FDQ19TSElGVCArIEVGRkVDVF9GTEFHX0hXX0FDQ19TSVpFKQotI2RlZmluZSBFRkZFQ1RfRkxBR19BVURJT19NT0RFX1NJWkUgICAgIDIKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9NQVNLICAgICAoKCgxIDw8IEVGRkVDVF9GTEFHX0FVRElPX01PREVfU0laRSkgLTEpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9TSElGVCkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9JTkQgICAgICAoMSA8PCBFRkZFQ1RfRkxBR19BVURJT19NT0RFX1NISUZUKQotI2RlZmluZSBFRkZFQ1RfRkxBR19BVURJT19NT0RFX05PTkUgICAgICgwIDw8IEVGRkVDVF9GTEFHX0FVRElPX01PREVfU0hJRlQpCi0KLS8vIEF1ZGlvIHNvdXJjZSBpbmRpY2F0aW9uCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0FVRElPX1NPVVJDRV9TSElGVCAgKEVGRkVDVF9GTEFHX0FVRElPX01PREVfU0hJRlQgKyBFRkZFQ1RfRkxBR19BVURJT19NT0RFX1NJWkUpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0FVRElPX1NPVVJDRV9TSVpFICAgMgotI2RlZmluZSBFRkZFQ1RfRkxBR19BVURJT19TT1VSQ0VfTUFTSyAgICgoKDEgPDwgRUZGRUNUX0ZMQUdfQVVESU9fU09VUkNFX1NJWkUpIC0xKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBFRkZFQ1RfRkxBR19BVURJT19TT1VSQ0VfU0hJRlQpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0FVRElPX1NPVVJDRV9JTkQgICAgKDEgPDwgRUZGRUNUX0ZMQUdfQVVESU9fU09VUkNFX1NISUZUKQotI2RlZmluZSBFRkZFQ1RfRkxBR19BVURJT19TT1VSQ0VfTk9ORSAgICgwIDw8IEVGRkVDVF9GTEFHX0FVRElPX1NPVVJDRV9TSElGVCkKLQotLy8gRWZmZWN0IG9mZmxvYWQgaW5kaWNhdGlvbgotI2RlZmluZSBFRkZFQ1RfRkxBR19PRkZMT0FEX1NISUZUICAgICAgIChFRkZFQ1RfRkxBR19BVURJT19TT1VSQ0VfU0hJRlQgKyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZGRUNUX0ZMQUdfQVVESU9fU09VUkNFX1NJWkUpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX09GRkxPQURfU0laRSAgICAgICAgMQotI2RlZmluZSBFRkZFQ1RfRkxBR19PRkZMT0FEX01BU0sgICAgICAgICgoKDEgPDwgRUZGRUNUX0ZMQUdfT0ZGTE9BRF9TSVpFKSAtMSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgRUZGRUNUX0ZMQUdfT0ZGTE9BRF9TSElGVCkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfT0ZGTE9BRF9TVVBQT1JURUQgICAoMSA8PCBFRkZFQ1RfRkxBR19PRkZMT0FEX1NISUZUKQotCi0vLyBFZmZlY3QgaGFzIG5vIHByb2Nlc3MgaW5kaWNhdGlvbgotI2RlZmluZSBFRkZFQ1RfRkxBR19OT19QUk9DRVNTX1NISUZUICAgICAgIChFRkZFQ1RfRkxBR19PRkZMT0FEX1NISUZUICsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9GTEFHX09GRkxPQURfU0laRSkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfTk9fUFJPQ0VTU19TSVpFICAgICAgICAxCi0jZGVmaW5lIEVGRkVDVF9GTEFHX05PX1BST0NFU1NfTUFTSyAgICAgICAgKCgoMSA8PCBFRkZFQ1RfRkxBR19OT19QUk9DRVNTX1NJWkUpIC0xKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBFRkZFQ1RfRkxBR19OT19QUk9DRVNTX1NISUZUKQotI2RlZmluZSBFRkZFQ1RfRkxBR19OT19QUk9DRVNTICAgICAgICAgICgxIDw8IEVGRkVDVF9GTEFHX05PX1BST0NFU1NfU0hJRlQpCi0KICNkZWZpbmUgRUZGRUNUX01BS0VfQVBJX1ZFUlNJT04oTSwgbSkgICgoKE0pPDwxNikgfCAoKG0pICYgMHhGRkZGKSkKICNkZWZpbmUgRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKHYpICAgICgodik+PjE2KQogI2RlZmluZSBFRkZFQ1RfQVBJX1ZFUlNJT05fTUlOT1IodikgICAgKChtKSAmIDB4RkZGRikKIAogCi0KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vICAgICAgRWZmZWN0IGNvbnRyb2wgaW50ZXJmYWNlCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0yODgsMTUgKzY4LDYgQEAKIC8vIHR5cGUgYW5kIHJldHVybiBpdHMgYWRkcmVzcyBhcyBlZmZlY3RfaGFuZGxlX3QKIHR5cGVkZWYgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyAqKmVmZmVjdF9oYW5kbGVfdDsKIAotCi0vLyBGb3J3YXJkIGRlZmluaXRpb24gb2YgdHlwZSBhdWRpb19idWZmZXJfdAotdHlwZWRlZiBzdHJ1Y3QgYXVkaW9fYnVmZmVyX3MgYXVkaW9fYnVmZmVyX3Q7Ci0KLQotCi0KLQotCiAvLyBFZmZlY3QgY29udHJvbCBpbnRlcmZhY2UgZGVmaW5pdGlvbgogc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyB7CiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTQyOCw0OTkgKzE5OSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QgKm91dEJ1ZmZlcik7CiB9OwogCi0KLS8vCi0vLy0tLSBTdGFuZGFyZGl6ZWQgY29tbWFuZCBjb2RlcyBmb3IgY29tbWFuZCgpIGZ1bmN0aW9uCi0vLwotZW51bSBlZmZlY3RfY29tbWFuZF9lIHsKLSAgIEVGRkVDVF9DTURfSU5JVCwgICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgZWZmZWN0IGVuZ2luZQotICAgRUZGRUNUX0NNRF9TRVRfQ09ORklHLCAgICAgICAgICAgLy8gY29uZmlndXJlIGVmZmVjdCBlbmdpbmUgKHNlZSBlZmZlY3RfY29uZmlnX3QpCi0gICBFRkZFQ1RfQ01EX1JFU0VULCAgICAgICAgICAgICAgICAvLyByZXNldCBlZmZlY3QgZW5naW5lCi0gICBFRkZFQ1RfQ01EX0VOQUJMRSwgICAgICAgICAgICAgICAvLyBlbmFibGUgZWZmZWN0IHByb2Nlc3MKLSAgIEVGRkVDVF9DTURfRElTQUJMRSwgICAgICAgICAgICAgIC8vIGRpc2FibGUgZWZmZWN0IHByb2Nlc3MKLSAgIEVGRkVDVF9DTURfU0VUX1BBUkFNLCAgICAgICAgICAgIC8vIHNldCBwYXJhbWV0ZXIgaW1tZWRpYXRlbHkgKHNlZSBlZmZlY3RfcGFyYW1fdCkKLSAgIEVGRkVDVF9DTURfU0VUX1BBUkFNX0RFRkVSUkVELCAgIC8vIHNldCBwYXJhbWV0ZXIgZGVmZXJyZWQKLSAgIEVGRkVDVF9DTURfU0VUX1BBUkFNX0NPTU1JVCwgICAgIC8vIGNvbW1pdCBwcmV2aW91cyBzZXQgcGFyYW1ldGVyIGRlZmVycmVkCi0gICBFRkZFQ1RfQ01EX0dFVF9QQVJBTSwgICAgICAgICAgICAvLyBnZXQgcGFyYW1ldGVyCi0gICBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UsICAgICAgICAgICAvLyBzZXQgYXVkaW8gZGV2aWNlIChzZWUgYXVkaW8uaCwgYXVkaW9fZGV2aWNlc190KQotICAgRUZGRUNUX0NNRF9TRVRfVk9MVU1FLCAgICAgICAgICAgLy8gc2V0IHZvbHVtZQotICAgRUZGRUNUX0NNRF9TRVRfQVVESU9fTU9ERSwgICAgICAgLy8gc2V0IHRoZSBhdWRpbyBtb2RlIChub3JtYWwsIHJpbmcsIC4uLikKLSAgIEVGRkVDVF9DTURfU0VUX0NPTkZJR19SRVZFUlNFLCAgIC8vIGNvbmZpZ3VyZSBlZmZlY3QgZW5naW5lIHJldmVyc2Ugc3RyZWFtKHNlZSBlZmZlY3RfY29uZmlnX3QpCi0gICBFRkZFQ1RfQ01EX1NFVF9JTlBVVF9ERVZJQ0UsICAgICAvLyBzZXQgY2FwdHVyZSBkZXZpY2UgKHNlZSBhdWRpby5oLCBhdWRpb19kZXZpY2VzX3QpCi0gICBFRkZFQ1RfQ01EX0dFVF9DT05GSUcsICAgICAgICAgICAvLyByZWFkIGVmZmVjdCBlbmdpbmUgY29uZmlndXJhdGlvbgotICAgRUZGRUNUX0NNRF9HRVRfQ09ORklHX1JFVkVSU0UsICAgLy8gcmVhZCBjb25maWd1cmUgZWZmZWN0IGVuZ2luZSByZXZlcnNlIHN0cmVhbSBjb25maWd1cmF0aW9uCi0gICBFRkZFQ1RfQ01EX0dFVF9GRUFUVVJFX1NVUFBPUlRFRF9DT05GSUdTLC8vIGdldCBhbGwgc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb25zIGZvciBhIGZlYXR1cmUuCi0gICBFRkZFQ1RfQ01EX0dFVF9GRUFUVVJFX0NPTkZJRywgICAvLyBnZXQgY3VycmVudCBmZWF0dXJlIGNvbmZpZ3VyYXRpb24KLSAgIEVGRkVDVF9DTURfU0VUX0ZFQVRVUkVfQ09ORklHLCAgIC8vIHNldCBjdXJyZW50IGZlYXR1cmUgY29uZmlndXJhdGlvbgotICAgRUZGRUNUX0NNRF9TRVRfQVVESU9fU09VUkNFLCAgICAgLy8gc2V0IHRoZSBhdWRpbyBzb3VyY2UgKHNlZSBhdWRpby5oLCBhdWRpb19zb3VyY2VfdCkKLSAgIEVGRkVDVF9DTURfT0ZGTE9BRCwgICAgICAgICAgICAgIC8vIHNldCBpZiBlZmZlY3QgdGhyZWFkIGlzIGFuIG9mZmxvYWQgb25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCB0aGUgaW9IYW5kbGUgb2YgdGhlIGVmZmVjdCB0aHJlYWQKLSAgIEVGRkVDVF9DTURfRklSU1RfUFJPUFJJRVRBUlkgPSAweDEwMDAwIC8vIGZpcnN0IHByb3ByaWV0YXJ5IGNvbW1hbmQgY29kZQotfTsKLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9JTklUCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBJbml0aWFsaXplIGVmZmVjdCBlbmdpbmU6IEFsbCBjb25maWd1cmF0aW9ucyByZXR1cm4gdG8gZGVmYXVsdAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gY29tbWFuZCBmb3JtYXQ6Ci0vLyAgc2l6ZTogMAotLy8gIGRhdGE6IE4vQQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gcmVwbHkgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZihpbnQpCi0vLyAgZGF0YTogc3RhdHVzCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX1NFVF9DT05GSUcKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIEFwcGx5IG5ldyBhdWRpbyBwYXJhbWV0ZXJzIGNvbmZpZ3VyYXRpb25zIGZvciBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZihlZmZlY3RfY29uZmlnX3QpCi0vLyAgZGF0YTogZWZmZWN0X2NvbmZpZ190Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKGludCkKLS8vICBkYXRhOiBzdGF0dXMKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfUkVTRVQKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIFJlc2V0IHRoZSBlZmZlY3QgZW5naW5lLiBLZWVwIGNvbmZpZ3VyYXRpb24gYnV0IHJlc2V0cyBzdGF0ZSBhbmQgYnVmZmVyIGNvbnRlbnQKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IDAKLS8vICBkYXRhOiBOL0EKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiAwCi0vLyAgZGF0YTogTi9BCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX0VOQUJMRQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgRW5hYmxlIHRoZSBwcm9jZXNzLiBDYWxsZWQgYnkgdGhlIGZyYW1ld29yayBiZWZvcmUgdGhlIGZpcnN0IGNhbGwgdG8gcHJvY2VzcygpCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb21tYW5kIGZvcm1hdDoKLS8vICBzaXplOiAwCi0vLyAgZGF0YTogTi9BCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKGludCkKLS8vICBkYXRhOiBzdGF0dXMKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfRElTQUJMRQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgRGlzYWJsZSB0aGUgcHJvY2Vzcy4gQ2FsbGVkIGJ5IHRoZSBmcmFtZXdvcmsgYWZ0ZXIgdGhlIGxhc3QgY2FsbCB0byBwcm9jZXNzKCkKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IDAKLS8vICBkYXRhOiBOL0EKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YoaW50KQotLy8gIGRhdGE6IHN0YXR1cwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9TRVRfUEFSQU0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIFNldCBhIHBhcmFtZXRlciBhbmQgYXBwbHkgaXQgaW1tZWRpYXRlbHkKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplIG9mIHBhcmFtIGFuZCB2YWx1ZQotLy8gIGRhdGE6IGVmZmVjdF9wYXJhbV90ICsgcGFyYW0gKyB2YWx1ZS4gU2VlIGVmZmVjdF9wYXJhbV90IGRlZmluaXRpb24gYmVsb3cgZm9yIHZhbHVlIG9mZnNldAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gcmVwbHkgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZihpbnQpCi0vLyAgZGF0YTogc3RhdHVzCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX1NFVF9QQVJBTV9ERUZFUlJFRAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgU2V0IGEgcGFyYW1ldGVyIGJ1dCBhcHBseSBpdCBvbmx5IHdoZW4gcmVjZWl2aW5nIEVGRkVDVF9DTURfU0VUX1BBUkFNX0NPTU1JVCBjb21tYW5kCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb21tYW5kIGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZSBvZiBwYXJhbSBhbmQgdmFsdWUKLS8vICBkYXRhOiBlZmZlY3RfcGFyYW1fdCArIHBhcmFtICsgdmFsdWUuIFNlZSBlZmZlY3RfcGFyYW1fdCBkZWZpbml0aW9uIGJlbG93IGZvciB2YWx1ZSBvZmZzZXQKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiAwCi0vLyAgZGF0YTogTi9BCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX1NFVF9QQVJBTV9DT01NSVQKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIEFwcGx5IGFsbCBwcmV2aW91c2x5IHJlY2VpdmVkIEVGRkVDVF9DTURfU0VUX1BBUkFNX0RFRkVSUkVEIGNvbW1hbmRzCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb21tYW5kIGZvcm1hdDoKLS8vICBzaXplOiAwCi0vLyAgZGF0YTogTi9BCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKGludCkKLS8vICBkYXRhOiBzdGF0dXMKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfR0VUX1BBUkFNCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBHZXQgYSBwYXJhbWV0ZXIgdmFsdWUKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplIG9mIHBhcmFtCi0vLyAgZGF0YTogZWZmZWN0X3BhcmFtX3QgKyBwYXJhbQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gcmVwbHkgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplIG9mIHBhcmFtIGFuZCB2YWx1ZQotLy8gIGRhdGE6IGVmZmVjdF9wYXJhbV90ICsgcGFyYW0gKyB2YWx1ZS4gU2VlIGVmZmVjdF9wYXJhbV90IGRlZmluaXRpb24gYmVsb3cgZm9yIHZhbHVlIG9mZnNldAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9TRVRfREVWSUNFCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBTZXQgdGhlIHJlbmRlcmluZyBkZXZpY2UgdGhlIGF1ZGlvIG91dHB1dCBwYXRoIGlzIGNvbm5lY3RlZCB0by4gU2VlIGF1ZGlvLmgsIGF1ZGlvX2RldmljZXNfdAotLy8gIGZvciBkZXZpY2UgdmFsdWVzLgotLy8gIFRoZSBlZmZlY3QgaW1wbGVtZW50YXRpb24gbXVzdCBzZXQgRUZGRUNUX0ZMQUdfREVWSUNFX0lORCBmbGFnIGluIGl0cyBkZXNjcmlwdG9yIHRvIHJlY2VpdmUgdGhpcwotLy8gIGNvbW1hbmQgd2hlbiB0aGUgZGV2aWNlIGNoYW5nZXMKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZih1aW50MzJfdCkKLS8vICBkYXRhOiB1aW50MzJfdAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gcmVwbHkgZm9ybWF0OgotLy8gIHNpemU6IDAKLS8vICBkYXRhOiBOL0EKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfU0VUX1ZPTFVNRQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgU2V0IGFuZCBnZXQgdm9sdW1lLiBVc2VkIGJ5IGF1ZGlvIGZyYW1ld29yayB0byBkZWxlZ2F0ZSB2b2x1bWUgY29udHJvbCB0byBlZmZlY3QgZW5naW5lLgotLy8gIFRoZSBlZmZlY3QgaW1wbGVtZW50YXRpb24gbXVzdCBzZXQgRUZGRUNUX0ZMQUdfVk9MVU1FX0lORCBvciBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCBmbGFnIGluCi0vLyAgaXRzIGRlc2NyaXB0b3IgdG8gcmVjZWl2ZSB0aGlzIGNvbW1hbmQgYmVmb3JlIGV2ZXJ5IGNhbGwgdG8gcHJvY2VzcygpIGZ1bmN0aW9uCi0vLyAgSWYgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwgZmxhZyBpcyBzZXQgaW4gdGhlIGVmZmVjdCBkZXNjcmlwdG9yLCB0aGUgZWZmZWN0IGVuZ2luZSBtdXN0IHJldHVybgotLy8gIHRoZSB2b2x1bWUgdGhhdCBzaG91bGQgYmUgYXBwbGllZCBiZWZvcmUgdGhlIGVmZmVjdCBpcyBwcm9jZXNzZWQuIFRoZSBvdmVyYWxsIHZvbHVtZSAodGhlIHZvbHVtZQotLy8gIGFjdHVhbGx5IGFwcGxpZWQgYnkgdGhlIGVmZmVjdCBlbmdpbmUgbXVsdGlwbGllZCBieSB0aGUgcmV0dXJuZWQgdmFsdWUpIHNob3VsZCBtYXRjaCB0aGUgdmFsdWUKLS8vICBpbmRpY2F0ZWQgaW4gdGhlIGNvbW1hbmQuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb21tYW5kIGZvcm1hdDoKLS8vICBzaXplOiBuICogc2l6ZW9mKHVpbnQzMl90KQotLy8gIGRhdGE6IHZvbHVtZSBmb3IgZWFjaCBjaGFubmVsIGRlZmluZWQgaW4gZWZmZWN0X2NvbmZpZ190IGZvciBvdXRwdXQgYnVmZmVyIGV4cHJlc3NlZCBpbgotLy8gICAgICA4LjI0IGZpeGVkIHBvaW50IGZvcm1hdAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gcmVwbHkgZm9ybWF0OgotLy8gIHNpemU6IG4gKiBzaXplb2YodWludDMyX3QpIC8gMAotLy8gIGRhdGE6IC0gaWYgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwgaXMgc2V0IGluIGVmZmVjdCBkZXNjcmlwdG9yOgotLy8gICAgICAgICAgICAgIHZvbHVtZSBmb3IgZWFjaCBjaGFubmVsIGRlZmluZWQgaW4gZWZmZWN0X2NvbmZpZ190IGZvciBvdXRwdXQgYnVmZmVyIGV4cHJlc3NlZCBpbgotLy8gICAgICAgICAgICAgIDguMjQgZml4ZWQgcG9pbnQgZm9ybWF0Ci0vLyAgICAgICAgLSBpZiBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCBpcyBub3Qgc2V0IGluIGVmZmVjdCBkZXNjcmlwdG9yOgotLy8gICAgICAgICAgICAgIE4vQQotLy8gIEl0IGlzIGxlZ2FsIHRvIHJlY2VpdmUgYSBudWxsIHBvaW50ZXIgYXMgcFJlcGx5RGF0YSBpbiB3aGljaCBjYXNlIHRoZSBlZmZlY3QgZnJhbWV3b3JrIGhhcwotLy8gIGRlbGVnYXRlZCB2b2x1bWUgY29udHJvbCB0byBhbm90aGVyIGVmZmVjdAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9TRVRfQVVESU9fTU9ERQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgU2V0IHRoZSBhdWRpbyBtb2RlLiBUaGUgZWZmZWN0IGltcGxlbWVudGF0aW9uIG11c3Qgc2V0IEVGRkVDVF9GTEFHX0FVRElPX01PREVfSU5EIGZsYWcgaW4gaXRzCi0vLyAgZGVzY3JpcHRvciB0byByZWNlaXZlIHRoaXMgY29tbWFuZCB3aGVuIHRoZSBhdWRpbyBtb2RlIGNoYW5nZXMuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb21tYW5kIGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YodWludDMyX3QpCi0vLyAgZGF0YTogYXVkaW9fbW9kZV90Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogMAotLy8gIGRhdGE6IE4vQQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9TRVRfQ09ORklHX1JFVkVSU0UKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIEFwcGx5IG5ldyBhdWRpbyBwYXJhbWV0ZXJzIGNvbmZpZ3VyYXRpb25zIGZvciBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgb2YgcmV2ZXJzZSBzdHJlYW0uCi0vLyAgQW4gZXhhbXBsZSBvZiByZXZlcnNlIHN0cmVhbSBpcyB0aGUgZWNobyByZWZlcmVuY2Ugc3VwcGxpZWQgdG8gYW4gQWNvdXN0aWMgRWNobyBDYW5jZWxlci4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZihlZmZlY3RfY29uZmlnX3QpCi0vLyAgZGF0YTogZWZmZWN0X2NvbmZpZ190Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKGludCkKLS8vICBkYXRhOiBzdGF0dXMKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfU0VUX0lOUFVUX0RFVklDRQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgU2V0IHRoZSBjYXB0dXJlIGRldmljZSB0aGUgYXVkaW8gaW5wdXQgcGF0aCBpcyBjb25uZWN0ZWQgdG8uIFNlZSBhdWRpby5oLCBhdWRpb19kZXZpY2VzX3QKLS8vICBmb3IgZGV2aWNlIHZhbHVlcy4KLS8vICBUaGUgZWZmZWN0IGltcGxlbWVudGF0aW9uIG11c3Qgc2V0IEVGRkVDVF9GTEFHX0RFVklDRV9JTkQgZmxhZyBpbiBpdHMgZGVzY3JpcHRvciB0byByZWNlaXZlIHRoaXMKLS8vICBjb21tYW5kIHdoZW4gdGhlIGRldmljZSBjaGFuZ2VzCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb21tYW5kIGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YodWludDMyX3QpCi0vLyAgZGF0YTogdWludDMyX3QKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiAwCi0vLyAgZGF0YTogTi9BCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX0dFVF9DT05GSUcKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIFJlYWQgYXVkaW8gcGFyYW1ldGVycyBjb25maWd1cmF0aW9ucyBmb3IgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb21tYW5kIGZvcm1hdDoKLS8vICBzaXplOiAwCi0vLyAgZGF0YTogTi9BCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkKLS8vICBkYXRhOiBlZmZlY3RfY29uZmlnX3QKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfR0VUX0NPTkZJR19SRVZFUlNFCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBSZWFkIGF1ZGlvIHBhcmFtZXRlcnMgY29uZmlndXJhdGlvbnMgZm9yIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBvZiByZXZlcnNlIHN0cmVhbQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gY29tbWFuZCBmb3JtYXQ6Ci0vLyAgc2l6ZTogMAotLy8gIGRhdGE6IE4vQQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gcmVwbHkgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZihlZmZlY3RfY29uZmlnX3QpCi0vLyAgZGF0YTogZWZmZWN0X2NvbmZpZ190Ci0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX0dFVF9GRUFUVVJFX1NVUFBPUlRFRF9DT05GSUdTCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBRdWVyaWVzIGZvciBzdXBwb3J0ZWQgY29uZmlndXJhdGlvbnMgZm9yIGEgcGFydGljdWxhciBmZWF0dXJlIChlLmcuIGdldCB0aGUgc3VwcG9ydGVkCi0vLyBjb21iaW5hdGlvbnMgb2YgbWFpbiBhbmQgYXV4aWxpYXJ5IGNoYW5uZWxzIGZvciBhIG5vaXNlIHN1cHByZXNzb3IpLgotLy8gVGhlIGNvbW1hbmQgcGFyYW1ldGVyIGlzIHRoZSBmZWF0dXJlIGlkZW50aWZpZXIgKFNlZSBlZmZlY3RfZmVhdHVyZV9lIGZvciBhIGxpc3Qgb2YgZGVmaW5lZAotLy8gZmVhdHVyZXMpIGZvbGxvd2VkIGJ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25maWd1cmF0aW9uIGRlc2NyaXB0b3IgdG8gcmV0dXJuLgotLy8gVGhlIHJlcGx5IGlzIGNvbXBvc2VkIG9mOgotLy8gIC0gc3RhdHVzICh1aW50MzJfdCk6Ci0vLyAgICAgICAgICAtIDAgaWYgZmVhdHVyZSBpcyBzdXBwb3J0ZWQKLS8vICAgICAgICAgIC0gLUVOT1NZUyBpZiB0aGUgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkLAotLy8gICAgICAgICAgLSAtRU5PTUVNIGlmIHRoZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBidXQgdGhlIHRvdGFsIG51bWJlciBvZiBzdXBwb3J0ZWQgY29uZmlndXJhdGlvbnMKLS8vICAgICAgICAgIGV4Y2VlZHMgdGhlIG1heGltdW0gbnVtYmVyIGluZGljYXRlZCBieSB0aGUgY2FsbGVyLgotLy8gIC0gdG90YWwgbnVtYmVyIG9mIHN1cHBvcnRlZCBjb25maWd1cmF0aW9ucyAodWludDMyX3QpCi0vLyAgLSBhbiBhcnJheSBvZiBjb25maWd1cmF0aW9uIGRlc2NyaXB0b3JzLgotLy8gVGhlIGFjdHVhbCBudW1iZXIgb2YgZGVzY3JpcHRvcnMgcmV0dXJuZWQgbXVzdCBub3QgZXhjZWVkIHRoZSBtYXhpbXVtIG51bWJlciBpbmRpY2F0ZWQgYnkKLS8vIHRoZSBjYWxsZXIuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb21tYW5kIGZvcm1hdDoKLS8vICBzaXplOiAyIHggc2l6ZW9mKHVpbnQzMl90KQotLy8gIGRhdGE6IGVmZmVjdF9mZWF0dXJlX2UgKyBtYXhpbXVtIG51bWJlciBvZiBjb25maWd1cmF0aW9ucyB0byByZXR1cm4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiAyIHggc2l6ZW9mKHVpbnQzMl90KSArIG4geCBzaXplb2YgKDxjb25maWcgZGVzY3JpcHRvcj4pCi0vLyAgZGF0YTogc3RhdHVzICsgdG90YWwgbnVtYmVyIG9mIGNvbmZpZ3VyYXRpb25zIHN1cHBvcnRlZCArIGFycmF5IG9mIG4gY29uZmlnIGRlc2NyaXB0b3JzCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX0dFVF9GRUFUVVJFX0NPTkZJRwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgUmV0cmlldmVzIGN1cnJlbnQgY29uZmlndXJhdGlvbiBmb3IgYSBnaXZlbiBmZWF0dXJlLgotLy8gVGhlIHJlcGx5IHN0YXR1cyBpczoKLS8vICAgICAgLSAwIGlmIGZlYXR1cmUgaXMgc3VwcG9ydGVkCi0vLyAgICAgIC0gLUVOT1NZUyBpZiB0aGUgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkLAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gY29tbWFuZCBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKHVpbnQzMl90KQotLy8gIGRhdGE6IGVmZmVjdF9mZWF0dXJlX2UKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YodWludDMyX3QpICsgc2l6ZW9mICg8Y29uZmlnIGRlc2NyaXB0b3I+KQotLy8gIGRhdGE6IHN0YXR1cyArIGNvbmZpZyBkZXNjcmlwdG9yCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX1NFVF9GRUFUVVJFX0NPTkZJRwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgU2V0cyBjdXJyZW50IGNvbmZpZ3VyYXRpb24gZm9yIGEgZ2l2ZW4gZmVhdHVyZS4KLS8vIFRoZSByZXBseSBzdGF0dXMgaXM6Ci0vLyAgICAgIC0gMCBpZiBmZWF0dXJlIGlzIHN1cHBvcnRlZAotLy8gICAgICAtIC1FTk9TWVMgaWYgdGhlIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCwKLS8vICAgICAgLSAtRUlOVkFMIGlmIHRoZSBjb25maWd1cmF0aW9uIGlzIGludmFsaWQKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZih1aW50MzJfdCkgKyBzaXplb2YgKDxjb25maWcgZGVzY3JpcHRvcj4pCi0vLyAgZGF0YTogZWZmZWN0X2ZlYXR1cmVfZSArIGNvbmZpZyBkZXNjcmlwdG9yCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKHVpbnQzMl90KQotLy8gIGRhdGE6IHN0YXR1cwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9TRVRfQVVESU9fU09VUkNFCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBTZXQgdGhlIGF1ZGlvIHNvdXJjZSB0aGUgY2FwdHVyZSBwYXRoIGlzIGNvbmZpZ3VyZWQgZm9yIChDYW1jb3JkZXIsIHZvaWNlIHJlY29nbml0aW9uLi4uKS4KLS8vICBTZWUgYXVkaW8uaCwgYXVkaW9fc291cmNlX3QgZm9yIHZhbHVlcy4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZih1aW50MzJfdCkKLS8vICBkYXRhOiB1aW50MzJfdAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gcmVwbHkgZm9ybWF0OgotLy8gIHNpemU6IDAKLS8vICBkYXRhOiBOL0EKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfT0ZGTE9BRAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgMS5pbmRpY2F0ZSBpZiB0aGUgcGxheWJhY2sgdGhyZWFkIHRoZSBlZmZlY3QgaXMgYXR0YWNoZWQgdG8gaXMgb2ZmbG9hZGVkIG9yIG5vdAotLy8gIDIudXBkYXRlIHRoZSBpbyBoYW5kbGUgb2YgdGhlIHBsYXliYWNrIHRocmVhZCB0aGUgZWZmZWN0IGlzIGF0dGFjaGVkIHRvCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb21tYW5kIGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YoZWZmZWN0X29mZmxvYWRfcGFyYW1fdCkKLS8vICBkYXRhOiBlZmZlY3Rfb2ZmbG9hZF9wYXJhbV90Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKHVpbnQzMl90KQotLy8gIGRhdGE6IHVpbnQzMl90Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX0ZJUlNUX1BST1BSSUVUQVJZCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBBbGwgcHJvcHJpZXRhcnkgZWZmZWN0IGNvbW1hbmRzIG11c3QgdXNlIGNvbW1hbmQgY29kZXMgYWJvdmUgdGhpcyB2YWx1ZS4gVGhlIHNpemUgYW5kIGZvcm1hdCBvZgotLy8gIGNvbW1hbmQgYW5kIHJlc3BvbnNlIGZpZWxkcyBpcyBmcmVlIGluIHRoaXMgY2FzZQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLS8vIEF1ZGlvIGJ1ZmZlciBkZXNjcmlwdG9yIHVzZWQgYnkgcHJvY2VzcygpLCBidWZmZXJQcm92aWRlcigpIGZ1bmN0aW9ucyBhbmQgYnVmZmVyX2NvbmZpZ190Ci0vLyBzdHJ1Y3R1cmUuIE11bHRpLWNoYW5uZWwgYXVkaW8gaXMgYWx3YXlzIGludGVybGVhdmVkLiBUaGUgY2hhbm5lbCBvcmRlciBpcyBmcm9tIExTQiB0byBNU0Igd2l0aAotLy8gcmVnYXJkIHRvIHRoZSBjaGFubmVsIG1hc2sgZGVmaW5pdGlvbiBpbiBhdWRpby5oLCBhdWRpb19jaGFubmVsX21hc2tfdCBlLmcgOgotLy8gU3RlcmVvOiBsZWZ0LCByaWdodAotLy8gNSBwb2ludCAxOiBmcm9udCBsZWZ0LCBmcm9udCByaWdodCwgZnJvbnQgY2VudGVyLCBsb3cgZnJlcXVlbmN5LCBiYWNrIGxlZnQsIGJhY2sgcmlnaHQKLS8vIFRoZSBidWZmZXIgc2l6ZSBpcyBleHByZXNzZWQgaW4gZnJhbWUgY291bnQsIGEgZnJhbWUgYmVpbmcgY29tcG9zZWQgb2Ygc2FtcGxlcyBmb3IgYWxsCi0vLyBjaGFubmVscyBhdCBhIGdpdmVuIHRpbWUuIEZyYW1lIHNpemUgZm9yIHVuc3BlY2lmaWVkIGZvcm1hdCAoQVVESU9fRk9STUFUX09USEVSKSBpcyA4IGJpdCBieQotLy8gZGVmaW5pdGlvbgotc3RydWN0IGF1ZGlvX2J1ZmZlcl9zIHsKLSAgICBzaXplX3QgICBmcmFtZUNvdW50OyAgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBpbiBidWZmZXIKLSAgICB1bmlvbiB7Ci0gICAgICAgIHZvaWQqICAgICAgIHJhdzsgICAgICAgIC8vIHJhdyBwb2ludGVyIHRvIHN0YXJ0IG9mIGJ1ZmZlcgotICAgICAgICBpbnQzMl90KiAgICBzMzI7ICAgICAgICAvLyBwb2ludGVyIHRvIHNpZ25lZCAzMiBiaXQgZGF0YSBhdCBzdGFydCBvZiBidWZmZXIKLSAgICAgICAgaW50MTZfdCogICAgczE2OyAgICAgICAgLy8gcG9pbnRlciB0byBzaWduZWQgMTYgYml0IGRhdGEgYXQgc3RhcnQgb2YgYnVmZmVyCi0gICAgICAgIHVpbnQ4X3QqICAgIHU4OyAgICAgICAgIC8vIHBvaW50ZXIgdG8gdW5zaWduZWQgOCBiaXQgZGF0YSBhdCBzdGFydCBvZiBidWZmZXIKLSAgICB9OwotfTsKLQotLy8gVGhlIGJ1ZmZlcl9wcm92aWRlcl9zIHN0cnVjdHVyZSBjb250YWlucyBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZAotLy8gYnkgdGhlIGVmZmVjdCBlbmdpbmUgcHJvY2VzcygpIGZ1bmN0aW9uIHRvIHF1ZXJ5IGFuZCByZWxlYXNlIGlucHV0Ci0vLyBvciBvdXRwdXQgYXVkaW8gYnVmZmVyLgotLy8gVGhlIGdldEJ1ZmZlcigpIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZXRyaWV2ZSBhIGJ1ZmZlciB3aGVyZSBkYXRhCi0vLyBzaG91bGQgcmVhZCBmcm9tIG9yIHdyaXR0ZW4gdG8gYnkgcHJvY2VzcygpIGZ1bmN0aW9uLgotLy8gVGhlIHJlbGVhc2VCdWZmZXIoKSBmdW5jdGlvbiBNVVNUIGJlIGNhbGxlZCB3aGVuIHRoZSBidWZmZXIgcmV0cmlldmVkCi0vLyB3aXRoIGdldEJ1ZmZlcigpIGlzIG5vdCBuZWVkZWQgYW55bW9yZS4KLS8vIFRoZSBwcm9jZXNzIGZ1bmN0aW9uIHNob3VsZCB1c2UgdGhlIGJ1ZmZlciBwcm92aWRlciBtZWNoYW5pc20gdG8gcmV0cmlldmUKLS8vIGlucHV0IG9yIG91dHB1dCBidWZmZXIgaWYgdGhlIGluQnVmZmVyIG9yIG91dEJ1ZmZlciBwYXNzZWQgYXMgYXJndW1lbnQgaXMgTlVMTAotLy8gYW5kIHRoZSBidWZmZXIgY29uZmlndXJhdGlvbiAoYnVmZmVyX2NvbmZpZ190KSBnaXZlbiBieSB0aGUgRUZGRUNUX0NNRF9TRVRfQ09ORklHCi0vLyBjb21tYW5kIGRpZCBub3Qgc3BlY2lmeSBhbiBhdWRpbyBidWZmZXIuCi0KLXR5cGVkZWYgaW50MzJfdCAoKiBidWZmZXJfZnVuY3Rpb25fdCkodm9pZCAqY29va2llLCBhdWRpb19idWZmZXJfdCAqYnVmZmVyKTsKLQotdHlwZWRlZiBzdHJ1Y3QgYnVmZmVyX3Byb3ZpZGVyX3MgewotICAgIGJ1ZmZlcl9mdW5jdGlvbl90IGdldEJ1ZmZlcjsgICAgICAgLy8gcmV0cmlldmUgbmV4dCBidWZmZXIKLSAgICBidWZmZXJfZnVuY3Rpb25fdCByZWxlYXNlQnVmZmVyOyAgIC8vIHJlbGVhc2UgdXNlZCBidWZmZXIKLSAgICB2b2lkICAgICAgICpjb29raWU7ICAgICAgICAgICAgICAgIC8vIGZvciB1c2UgYnkgY2xpZW50IG9mIGJ1ZmZlciBwcm92aWRlciBmdW5jdGlvbnMKLX0gYnVmZmVyX3Byb3ZpZGVyX3Q7Ci0KLQotLy8gVGhlIGJ1ZmZlcl9jb25maWdfcyBzdHJ1Y3R1cmUgc3BlY2lmaWVzIHRoZSBpbnB1dCBvciBvdXRwdXQgYXVkaW8gZm9ybWF0Ci0vLyB0byBiZSB1c2VkIGJ5IHRoZSBlZmZlY3QgZW5naW5lLiBJdCBpcyBwYXJ0IG9mIHRoZSBlZmZlY3RfY29uZmlnX3QKLS8vIHN0cnVjdHVyZSB0aGF0IGRlZmluZXMgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlciBjb25maWd1cmF0aW9ucyBhbmQgaXMKLS8vIHBhc3NlZCBieSB0aGUgRUZGRUNUX0NNRF9TRVRfQ09ORklHIG9yIEVGRkVDVF9DTURfU0VUX0NPTkZJR19SRVZFUlNFIGNvbW1hbmQuCi10eXBlZGVmIHN0cnVjdCBidWZmZXJfY29uZmlnX3MgewotICAgIGF1ZGlvX2J1ZmZlcl90ICBidWZmZXI7ICAgICAvLyBidWZmZXIgZm9yIHVzZSBieSBwcm9jZXNzKCkgZnVuY3Rpb24gaWYgbm90IHBhc3NlZCBleHBsaWNpdGx5Ci0gICAgdWludDMyX3QgICBzYW1wbGluZ1JhdGU7ICAgIC8vIHNhbXBsaW5nIHJhdGUKLSAgICB1aW50MzJfdCAgIGNoYW5uZWxzOyAgICAgICAgLy8gY2hhbm5lbCBtYXNrIChzZWUgYXVkaW9fY2hhbm5lbF9tYXNrX3QgaW4gYXVkaW8uaCkKLSAgICBidWZmZXJfcHJvdmlkZXJfdCBidWZmZXJQcm92aWRlcjsgICAvLyBidWZmZXIgcHJvdmlkZXIKLSAgICB1aW50OF90ICAgIGZvcm1hdDsgICAgICAgICAgLy8gQXVkaW8gZm9ybWF0IChzZWUgYXVkaW9fZm9ybWF0X3QgaW4gYXVkaW8uaCkKLSAgICB1aW50OF90ICAgIGFjY2Vzc01vZGU7ICAgICAgLy8gcmVhZC93cml0ZSBvciBhY2N1bXVsYXRlIGluIGJ1ZmZlciAoZWZmZWN0X2J1ZmZlcl9hY2Nlc3NfZSkKLSAgICB1aW50MTZfdCAgIG1hc2s7ICAgICAgICAgICAgLy8gaW5kaWNhdGVzIHdoaWNoIG9mIHRoZSBhYm92ZSBmaWVsZHMgaXMgdmFsaWQKLX0gYnVmZmVyX2NvbmZpZ190OwotCi0vLyBWYWx1ZXMgZm9yICJhY2Nlc3NNb2RlIiBmaWVsZCBvZiBidWZmZXJfY29uZmlnX3Q6Ci0vLyAgIG92ZXJ3cml0ZSwgcmVhZCBvbmx5LCBhY2N1bXVsYXRlIChyZWFkL21vZGlmeS93cml0ZSkKLWVudW0gZWZmZWN0X2J1ZmZlcl9hY2Nlc3NfZSB7Ci0gICAgRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUsCi0gICAgRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRCwKLSAgICBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFCi0KLX07Ci0KLS8vIGZlYXR1cmUgaWRlbnRpZmllcnMgZm9yIEVGRkVDVF9DTURfR0VUX0ZFQVRVUkVfU1VQUE9SVEVEX0NPTkZJR1MgY29tbWFuZAotZW51bSBlZmZlY3RfZmVhdHVyZV9lIHsKLSAgICBFRkZFQ1RfRkVBVFVSRV9BVVhfQ0hBTk5FTFMsIC8vIHN1cHBvcnRzIGF1eGlsaWFyeSBjaGFubmVscyAoZS5nLiBkdWFsIG1pYyBub2lzZSBzdXBwcmVzc29yKQotICAgIEVGRkVDVF9GRUFUVVJFX0NOVAotfTsKLQotLy8gRUZGRUNUX0ZFQVRVUkVfQVVYX0NIQU5ORUxTIGZlYXR1cmUgY29uZmlndXJhdGlvbiBkZXNjcmlwdG9yLiBEZXNjcmliZSBhIGNvbWJpbmF0aW9uCi0vLyBvZiBtYWluIGFuZCBhdXhpbGlhcnkgY2hhbm5lbHMgc3VwcG9ydGVkCi10eXBlZGVmIHN0cnVjdCBjaGFubmVsX2NvbmZpZ19zIHsKLSAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtYWluX2NoYW5uZWxzOyAvLyBjaGFubmVsIG1hc2sgZm9yIG1haW4gY2hhbm5lbHMKLSAgICBhdWRpb19jaGFubmVsX21hc2tfdCBhdXhfY2hhbm5lbHM7ICAvLyBjaGFubmVsIG1hc2sgZm9yIGF1eGlsaWFyeSBjaGFubmVscwotfSBjaGFubmVsX2NvbmZpZ190OwotCi0KLS8vIFZhbHVlcyBmb3IgYml0IGZpZWxkICJtYXNrIiBpbiBidWZmZXJfY29uZmlnX3QuIElmIGEgYml0IGlzIHNldCwgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGQKLS8vIGluIGJ1ZmZlcl9jb25maWdfdCBtdXN0IGJlIHRha2VuIGludG8gYWNjb3VudCB3aGVuIGV4ZWN1dGluZyB0aGUgRUZGRUNUX0NNRF9TRVRfQ09ORklHIGNvbW1hbmQKLSNkZWZpbmUgRUZGRUNUX0NPTkZJR19CVUZGRVIgICAgMHgwMDAxICAvLyBidWZmZXIgZmllbGQgbXVzdCBiZSB0YWtlbiBpbnRvIGFjY291bnQKLSNkZWZpbmUgRUZGRUNUX0NPTkZJR19TTVBfUkFURSAgMHgwMDAyICAvLyBzYW1wbGluZ1JhdGUgZmllbGQgbXVzdCBiZSB0YWtlbiBpbnRvIGFjY291bnQKLSNkZWZpbmUgRUZGRUNUX0NPTkZJR19DSEFOTkVMUyAgMHgwMDA0ICAvLyBjaGFubmVscyBmaWVsZCBtdXN0IGJlIHRha2VuIGludG8gYWNjb3VudAotI2RlZmluZSBFRkZFQ1RfQ09ORklHX0ZPUk1BVCAgICAweDAwMDggIC8vIGZvcm1hdCBmaWVsZCBtdXN0IGJlIHRha2VuIGludG8gYWNjb3VudAotI2RlZmluZSBFRkZFQ1RfQ09ORklHX0FDQ19NT0RFICAweDAwMTAgIC8vIGFjY2Vzc01vZGUgZmllbGQgbXVzdCBiZSB0YWtlbiBpbnRvIGFjY291bnQKLSNkZWZpbmUgRUZGRUNUX0NPTkZJR19QUk9WSURFUiAgMHgwMDIwICAvLyBidWZmZXJQcm92aWRlciBmaWVsZCBtdXN0IGJlIHRha2VuIGludG8gYWNjb3VudAotI2RlZmluZSBFRkZFQ1RfQ09ORklHX0FMTCAoRUZGRUNUX0NPTkZJR19CVUZGRVIgfCBFRkZFQ1RfQ09ORklHX1NNUF9SQVRFIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZGRUNUX0NPTkZJR19DSEFOTkVMUyB8IEVGRkVDVF9DT05GSUdfRk9STUFUIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZGRUNUX0NPTkZJR19BQ0NfTU9ERSB8IEVGRkVDVF9DT05GSUdfUFJPVklERVIpCi0KLQotLy8gZWZmZWN0X2NvbmZpZ19zIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIGZvcm1hdCBvZiB0aGUgcENtZERhdGEgYXJndW1lbnQgb2YgRUZGRUNUX0NNRF9TRVRfQ09ORklHCi0vLyBjb21tYW5kIHRvIGNvbmZpZ3VyZSBhdWRpbyBwYXJhbWV0ZXJzIGFuZCBidWZmZXJzIGZvciBlZmZlY3QgZW5naW5lIGlucHV0IGFuZCBvdXRwdXQuCi10eXBlZGVmIHN0cnVjdCBlZmZlY3RfY29uZmlnX3MgewotICAgIGJ1ZmZlcl9jb25maWdfdCAgIGlucHV0Q2ZnOwotICAgIGJ1ZmZlcl9jb25maWdfdCAgIG91dHB1dENmZzsKLX0gZWZmZWN0X2NvbmZpZ190OwotCi0KLS8vIGVmZmVjdF9wYXJhbV9zIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIGZvcm1hdCBvZiB0aGUgcENtZERhdGEgYXJndW1lbnQgb2YgRUZGRUNUX0NNRF9TRVRfUEFSQU0KLS8vIGNvbW1hbmQgYW5kIHBDbWREYXRhIGFuZCBwUmVwbHlEYXRhIG9mIEVGRkVDVF9DTURfR0VUX1BBUkFNIGNvbW1hbmQuCi0vLyBwc2l6ZSBhbmQgdnNpemUgcmVwcmVzZW50IHRoZSBhY3R1YWwgc2l6ZSBvZiBwYXJhbWV0ZXIgYW5kIHZhbHVlLgotLy8KLS8vIE5PVEU6IHRoZSBzdGFydCBvZiB2YWx1ZSBmaWVsZCBpbnNpZGUgdGhlIGRhdGEgZmllbGQgaXMgYWx3YXlzIG9uIGEgMzIgYml0IGJvdW5kYXJ5OgotLy8KLS8vICArLS0tLS0tLS0tLS0rCi0vLyAgfCBzdGF0dXMgICAgfCBzaXplb2YoaW50KQotLy8gICstLS0tLS0tLS0tLSsKLS8vICB8IHBzaXplICAgICB8IHNpemVvZihpbnQpCi0vLyAgKy0tLS0tLS0tLS0tKwotLy8gIHwgdnNpemUgICAgIHwgc2l6ZW9mKGludCkKLS8vICArLS0tLS0tLS0tLS0rCi0vLyAgfCAgICAgICAgICAgfCAgIHwgICAgICAgICAgIHwKLS8vICB+IHBhcmFtZXRlciB+ICAgPiBwc2l6ZSAgICAgfAotLy8gIHwgICAgICAgICAgIHwgICB8ICAgICAgICAgICA+ICAoKHBzaXplIC0gMSkvc2l6ZW9mKGludCkgKyAxKSAqIHNpemVvZihpbnQpCi0vLyAgKy0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgIHwKLS8vICB8IHBhZGRpbmcgICB8ICAgICAgICAgICAgICAgfAotLy8gICstLS0tLS0tLS0tLSsKLS8vICB8ICAgICAgICAgICB8ICAgfAotLy8gIH4gdmFsdWUgICAgIH4gICA+IHZzaXplCi0vLyAgfCAgICAgICAgICAgfCAgIHwKLS8vICArLS0tLS0tLS0tLS0rCi0KLXR5cGVkZWYgc3RydWN0IGVmZmVjdF9wYXJhbV9zIHsKLSAgICBpbnQzMl90ICAgICBzdGF0dXM7ICAgICAvLyBUcmFuc2FjdGlvbiBzdGF0dXMgKHVudXNlZCBmb3IgY29tbWFuZCwgdXNlZCBmb3IgcmVwbHkpCi0gICAgdWludDMyX3QgICAgcHNpemU7ICAgICAgLy8gUGFyYW1ldGVyIHNpemUKLSAgICB1aW50MzJfdCAgICB2c2l6ZTsgICAgICAvLyBWYWx1ZSBzaXplCi0gICAgY2hhciAgICAgICAgZGF0YVtdOyAgICAgLy8gU3RhcnQgb2YgUGFyYW1ldGVyICsgVmFsdWUgZGF0YQotfSBlZmZlY3RfcGFyYW1fdDsKLQotLy8gTWF4aW11bSBlZmZlY3RfcGFyYW1fdCBzaXplCi0jZGVmaW5lIEVGRkVDVF9QQVJBTV9TSVpFX01BWCAgICAgICA2NTUzNgotCi0vLyBzdHJ1Y3R1cmUgdXNlZCBieSBFRkZFQ1RfQ01EX09GRkxPQUQgY29tbWFuZAotdHlwZWRlZiBzdHJ1Y3QgZWZmZWN0X29mZmxvYWRfcGFyYW1fcyB7Ci0gICAgYm9vbCBpc09mZmxvYWQ7ICAgICAgICAgLy8gdHJ1ZSBpZiB0aGUgcGxheWJhY2sgdGhyZWFkIHRoZSBlZmZlY3QgaXMgYXR0YWNoZWQgdG8gaXMgb2ZmbG9hZGVkCi0gICAgaW50IGlvSGFuZGxlOyAgICAgICAgICAgLy8gaW8gaGFuZGxlIG9mIHRoZSBwbGF5YmFjayB0aHJlYWQgdGhlIGVmZmVjdCBpcyBhdHRhY2hlZCB0bwotfSBlZmZlY3Rfb2ZmbG9hZF9wYXJhbV90OwotCi0KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vICAgICAgRWZmZWN0IGxpYnJhcnkgaW50ZXJmYWNlCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2JsZV9hZHZlcnRpc2VyLmggYi9pbmNsdWRlL2hhcmR3YXJlL2JsZV9hZHZlcnRpc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFiY2EwMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvaGFyZHdhcmUvYmxlX2FkdmVydGlzZXIuaApAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9JTkNMVURFX0JMRV9BRFZFUlRJU0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9JTkNMVURFX0JMRV9BRFZFUlRJU0VSX0gKKworI2luY2x1ZGUgPGJhc2UvY2FsbGJhY2tfZm9yd2FyZC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJidF9jb21tb25fdHlwZXMuaCIKKyNpbmNsdWRlICJidF9nYXR0X3R5cGVzLmgiCisKK3N0cnVjdCBBZHZlcnRpc2VQYXJhbWV0ZXJzIHsKKyAgdWludDE2X3QgYWR2ZXJ0aXNpbmdfZXZlbnRfcHJvcGVydGllczsKKyAgdWludDMyX3QgbWluX2ludGVydmFsOworICB1aW50MzJfdCBtYXhfaW50ZXJ2YWw7CisgIHVpbnQ4X3QgY2hhbm5lbF9tYXA7CisgIGludDhfdCB0eF9wb3dlcjsKKyAgdWludDhfdCBwcmltYXJ5X2FkdmVydGlzaW5nX3BoeTsKKyAgdWludDhfdCBzZWNvbmRhcnlfYWR2ZXJ0aXNpbmdfcGh5OworICB1aW50OF90IHNjYW5fcmVxdWVzdF9ub3RpZmljYXRpb25fZW5hYmxlOworfTsKKworc3RydWN0IFBlcmlvZGljQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzIHsKKyAgdWludDhfdCBlbmFibGU7CisgIHVpbnQxNl90IG1pbl9pbnRlcnZhbDsKKyAgdWludDE2X3QgbWF4X2ludGVydmFsOworICB1aW50MTZfdCBwZXJpb2RpY19hZHZlcnRpc2luZ19wcm9wZXJ0aWVzOworfTsKKworY2xhc3MgQmxlQWR2ZXJ0aXNlckludGVyZmFjZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5CbGVBZHZlcnRpc2VySW50ZXJmYWNlKCkgPSBkZWZhdWx0OworCisgIC8qKiBDYWxsYmFjayBpbnZva2VkIHdoZW4gbXVsdGktYWR2IG9wZXJhdGlvbiBoYXMgY29tcGxldGVkICovCisgIHVzaW5nIFN0YXR1c0NhbGxiYWNrID0gYmFzZTo6Q2FsbGJhY2s8dm9pZCh1aW50OF90IC8qIHN0YXR1cyAqLyk+OworICB1c2luZyBJZFN0YXR1c0NhbGxiYWNrID0KKyAgICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCAvKiBhZHZlcnRpc2VyX2lkICovLCB1aW50OF90IC8qIHN0YXR1cyAqLyk+OworICB1c2luZyBJZFR4UG93ZXJTdGF0dXNDYWxsYmFjayA9CisgICAgICBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQ4X3QgLyogYWR2ZXJ0aXNlcl9pZCAqLywgaW50OF90IC8qIHR4X3Bvd2VyICovLCB1aW50OF90IC8qIHN0YXR1cyAqLyk+OworICB1c2luZyBQYXJhbWV0ZXJzQ2FsbGJhY2sgPQorICAgICAgYmFzZTo6Q2FsbGJhY2s8dm9pZCh1aW50OF90IC8qIHN0YXR1cyAqLywgaW50OF90IC8qIHR4X3Bvd2VyICovKT47CisKKyAgLyoqIFJlZ2lzdGVycyBhbiBhZHZlcnRpc2VyIHdpdGggdGhlIHN0YWNrICovCisgIHZpcnR1YWwgdm9pZCBSZWdpc3RlckFkdmVydGlzZXIoSWRTdGF0dXNDYWxsYmFjaykgPSAwOworCisgIC8qIFNldCB0aGUgcGFyYW1ldGVycyBhcyBwZXIgc3BlYywgdXNlciBtYW51YWwgc3BlY2lmaWVkIHZhbHVlcyAqLworICB2aXJ0dWFsIHZvaWQgU2V0UGFyYW1ldGVycyh1aW50OF90IGFkdmVydGlzZXJfaWQsIEFkdmVydGlzZVBhcmFtZXRlcnMgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzQ2FsbGJhY2sgY2IpID0gMDsKKworICAvKiBTZXR1cCB0aGUgZGF0YSAqLworICB2aXJ0dWFsIHZvaWQgU2V0RGF0YShpbnQgYWR2ZXJ0aXNlcl9pZCwgYm9vbCBzZXRfc2Nhbl9yc3AsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEsIFN0YXR1c0NhbGxiYWNrIGNiKSA9IDA7CisKKyAgLyogRW5hYmxlIHRoZSBhZHZlcnRpc2luZyBpbnN0YW5jZSAqLworICB2aXJ0dWFsIHZvaWQgRW5hYmxlKHVpbnQ4X3QgYWR2ZXJ0aXNlcl9pZCwgYm9vbCBlbmFibGUsIFN0YXR1c0NhbGxiYWNrIGNiLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGR1cmF0aW9uLCB1aW50OF90IG1heEV4dEFkdkV2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNDYWxsYmFjayB0aW1lb3V0X2NiKSA9IDA7CisKKyAgLyogIFVucmVnaXN0ZXJzIGFuIGFkdmVydGlzZXIgKi8KKyAgdmlydHVhbCB2b2lkIFVucmVnaXN0ZXIodWludDhfdCBhZHZlcnRpc2VyX2lkKSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIFN0YXJ0QWR2ZXJ0aXNpbmcodWludDhfdCBhZHZlcnRpc2VyX2lkLCBTdGF0dXNDYWxsYmFjayBjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWR2ZXJ0aXNlUGFyYW1ldGVycyBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFkdmVydGlzZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzY2FuX3Jlc3BvbnNlX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lb3V0X3MsIFN0YXR1c0NhbGxiYWNrIHRpbWVvdXRfY2IpID0gMDsKKworICAvKiogU3RhcnQgdGhlIGFkdmVydGlzaW5nIHNldC4gVGhpcyBpbmNsdWRlIHJlZ2lzdGVyaW5nLCBzZXR0aW5nIGFsbAorICAgKiBwYXJhbWV0ZXJzIGFuZCBkYXRhLCBhbmQgZW5hYmxpbmcgaXQuIHxyZWdpc3Rlcl9jYnwgaXMgY2FsbGVkIHdoZW4gdGhlIHNldAorICAgKiBpcyBhZHZlcnRpc2luZy4gfHRpbWVvdXRfY2J8IGlzIGNhbGxlZCB3aGVuIHRoZSB0aW1lb3V0X3MgaGF2ZSBwYXNzZWQgKi8KKyAgdmlydHVhbCB2b2lkIFN0YXJ0QWR2ZXJ0aXNpbmdTZXQoCisgICAgICBJZFR4UG93ZXJTdGF0dXNDYWxsYmFjayByZWdpc3Rlcl9jYiwgQWR2ZXJ0aXNlUGFyYW1ldGVycyBwYXJhbXMsCisgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBhZHZlcnRpc2VfZGF0YSwKKyAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNjYW5fcmVzcG9uc2VfZGF0YSwKKyAgICAgIFBlcmlvZGljQWR2ZXJ0aXNpbmdQYXJhbWV0ZXJzIHBlcmlvZGljX3BhcmFtcywKKyAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBlcmlvZGljX2RhdGEsIHVpbnQxNl90IGR1cmF0aW9uLAorICAgICAgdWludDhfdCBtYXhFeHRBZHZFdmVudHMsIElkU3RhdHVzQ2FsbGJhY2sgdGltZW91dF9jYikgPSAwOworCisgIHZpcnR1YWwgdm9pZCBTZXRQZXJpb2RpY0FkdmVydGlzaW5nUGFyYW1ldGVycygKKyAgICAgIGludCBhZHZlcnRpc2VyX2lkLCBQZXJpb2RpY0FkdmVydGlzaW5nUGFyYW1ldGVycyBwYXJhbWV0ZXJzLAorICAgICAgU3RhdHVzQ2FsbGJhY2sgY2IpID0gMDsKKworICB2aXJ0dWFsIHZvaWQgU2V0UGVyaW9kaWNBZHZlcnRpc2luZ0RhdGEoaW50IGFkdmVydGlzZXJfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzQ2FsbGJhY2sgY2IpID0gMDsKKworICB2aXJ0dWFsIHZvaWQgU2V0UGVyaW9kaWNBZHZlcnRpc2luZ0VuYWJsZShpbnQgYWR2ZXJ0aXNlcl9pZCwgYm9vbCBlbmFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1c0NhbGxiYWNrIGNiKSA9IDA7Cit9OworCisjZW5kaWYgLyogQU5EUk9JRF9JTkNMVURFX0JMRV9BRFZFUlRJU0VSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvYmxlX3NjYW5uZXIuaCBiL2luY2x1ZGUvaGFyZHdhcmUvYmxlX3NjYW5uZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGY5ZWMyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS9ibGVfc2Nhbm5lci5oCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0lOQ0xVREVfQkxFX1NDQU5ORVJfSAorI2RlZmluZSBBTkRST0lEX0lOQ0xVREVfQkxFX1NDQU5ORVJfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgImJ0X2NvbW1vbl90eXBlcy5oIgorI2luY2x1ZGUgImJ0X2dhdHRfY2xpZW50LmgiCisjaW5jbHVkZSAiYnRfZ2F0dF90eXBlcy5oIgorCisvKiogQ2FsbGJhY2sgaW52b2tlZCB3aGVuIGJhdGNoc2NhbiByZXBvcnRzIGFyZSBvYnRhaW5lZCAqLwordHlwZWRlZiB2b2lkICgqYmF0Y2hzY2FuX3JlcG9ydHNfY2FsbGJhY2spKGludCBjbGllbnRfaWYsIGludCBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlcG9ydF9mb3JtYXQsIGludCBudW1fcmVjb3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKTsKKworLyoqIENhbGxiYWNrIGludm9rZWQgd2hlbiBiYXRjaHNjYW4gc3RvcmFnZSB0aHJlc2hvbGQgbGltaXQgaXMgY3Jvc3NlZCAqLwordHlwZWRlZiB2b2lkICgqYmF0Y2hzY2FuX3RocmVzaG9sZF9jYWxsYmFjaykoaW50IGNsaWVudF9pZik7CisKKy8qKiBUcmFjayBBRFYgVlNFIGNhbGxiYWNrIGludm9rZWQgd2hlbiB0cmFja2VkIGRldmljZSBpcyBmb3VuZCBvciBsb3N0ICovCit0eXBlZGVmIHZvaWQgKCp0cmFja19hZHZfZXZlbnRfY2FsbGJhY2spKAorICAgIGJ0Z2F0dF90cmFja19hZHZfaW5mb190ICpwX3RyYWNrX2Fkdl9pbmZvKTsKKworLyoqIENhbGxiYWNrIGZvciBzY2FuIHJlc3VsdHMgKi8KK3R5cGVkZWYgdm9pZCAoKnNjYW5fcmVzdWx0X2NhbGxiYWNrKSh1aW50MTZfdCBldmVudF90eXBlLCB1aW50OF90IGFkZHJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidF9iZGFkZHJfdCAqYmRhLCB1aW50OF90IHByaW1hcnlfcGh5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2Vjb25kYXJ5X3BoeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFkdmVydGlzaW5nX3NpZCwgaW50OF90IHR4X3Bvd2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCByc3NpLCB1aW50MTZfdCBwZXJpb2RpY19hZHZfaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFkdl9kYXRhKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBzY2FuX3Jlc3VsdF9jYWxsYmFjayBzY2FuX3Jlc3VsdF9jYjsKKyAgYmF0Y2hzY2FuX3JlcG9ydHNfY2FsbGJhY2sgYmF0Y2hzY2FuX3JlcG9ydHNfY2I7CisgIGJhdGNoc2Nhbl90aHJlc2hvbGRfY2FsbGJhY2sgYmF0Y2hzY2FuX3RocmVzaG9sZF9jYjsKKyAgdHJhY2tfYWR2X2V2ZW50X2NhbGxiYWNrIHRyYWNrX2Fkdl9ldmVudF9jYjsKK30gYnRnYXR0X3NjYW5uZXJfY2FsbGJhY2tzX3Q7CisKK2NsYXNzIEJsZVNjYW5uZXJJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+QmxlU2Nhbm5lckludGVyZmFjZSgpID0gZGVmYXVsdDsKKworICB1c2luZyBSZWdpc3RlckNhbGxiYWNrID0KKyAgICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCAvKiBzY2FubmVyX2lkICovLCB1aW50OF90IC8qIHN0YXR1cyAqLyk+OworCisgIHVzaW5nIENhbGxiYWNrID0gYmFzZTo6Q2FsbGJhY2s8dm9pZCh1aW50OF90IC8qIHN0YXR1cyAqLyk+OworCisgIHVzaW5nIEVuYWJsZUNhbGxiYWNrID0KKyAgICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCAvKiBhY3Rpb24gKi8sIHVpbnQ4X3QgLyogc3RhdHVzICovKT47CisKKyAgdXNpbmcgRmlsdGVyUGFyYW1TZXR1cENhbGxiYWNrID0KKyAgICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCAvKiBhdmJsX3NwYWNlICovLCB1aW50OF90IC8qIGFjdGlvbl90eXBlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IC8qIHN0YXR1cyAqLyk+OworCisgIHVzaW5nIEZpbHRlckNvbmZpZ0NhbGxiYWNrID0KKyAgICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCAvKiBmaWx0X3R5cGUgKi8sIHVpbnQ4X3QgLyogYXZibF9zcGFjZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAvKiBhY3Rpb24gKi8sIHVpbnQ4X3QgLyogc3RhdHVzICovKT47CisKKyAgLyoqIFJlZ2lzdGVycyBhIHNjYW5uZXIgd2l0aCB0aGUgc3RhY2sgKi8KKyAgdmlydHVhbCB2b2lkIFJlZ2lzdGVyU2Nhbm5lcihSZWdpc3RlckNhbGxiYWNrKSA9IDA7CisKKyAgLyoqIFVucmVnaXN0ZXIgYSBzY2FubmVyIGZyb20gdGhlIHN0YWNrICovCisgIHZpcnR1YWwgdm9pZCBVbnJlZ2lzdGVyKGludCBzY2FubmVyX2lkKSA9IDA7CisKKyAgLyoqIFN0YXJ0IG9yIHN0b3AgTEUgZGV2aWNlIHNjYW5uaW5nICovCisgIHZpcnR1YWwgdm9pZCBTY2FuKGJvb2wgc3RhcnQpID0gMDsKKworICAvKiogU2V0dXAgc2NhbiBmaWx0ZXIgcGFyYW1zICovCisgIHZpcnR1YWwgdm9pZCBTY2FuRmlsdGVyUGFyYW1TZXR1cCgKKyAgICAgIHVpbnQ4X3QgY2xpZW50X2lmLCB1aW50OF90IGFjdGlvbiwgdWludDhfdCBmaWx0X2luZGV4LAorICAgICAgc3RkOjp1bmlxdWVfcHRyPGJ0Z2F0dF9maWx0X3BhcmFtX3NldHVwX3Q+IGZpbHRfcGFyYW0sCisgICAgICBGaWx0ZXJQYXJhbVNldHVwQ2FsbGJhY2sgY2IpID0gMDsKKworICAvKiogQ29uZmlndXJlIGEgc2NhbiBmaWx0ZXIgY29uZGl0aW9uICAqLworICB2aXJ0dWFsIHZvaWQgU2NhbkZpbHRlckFkZFJlbW92ZShpbnQgYWN0aW9uLCBpbnQgZmlsdF90eXBlLCBpbnQgZmlsdF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbXBhbnlfaWQsIGludCBjb21wYW55X2lkX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ0X3V1aWRfdCAqcF91dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBidF91dWlkX3QgKnBfdXVpZF9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBidF9iZGFkZHJfdCAqYmRfYWRkciwgY2hhciBhZGRyX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyQ29uZmlnQ2FsbGJhY2sgY2IpID0gMDsKKworICAvKiogQ2xlYXIgYWxsIHNjYW4gZmlsdGVyIGNvbmRpdGlvbnMgZm9yIHNwZWNpZmljIGZpbHRlciBpbmRleCovCisgIHZpcnR1YWwgdm9pZCBTY2FuRmlsdGVyQ2xlYXIoaW50IGZpbHRfaW5kZXgsIEZpbHRlckNvbmZpZ0NhbGxiYWNrIGNiKSA9IDA7CisKKyAgLyoqIEVuYWJsZSAvIGRpc2FibGUgc2NhbiBmaWx0ZXIgZmVhdHVyZSovCisgIHZpcnR1YWwgdm9pZCBTY2FuRmlsdGVyRW5hYmxlKGJvb2wgZW5hYmxlLCBFbmFibGVDYWxsYmFjayBjYikgPSAwOworCisgIC8qKiBTZXRzIHRoZSBMRSBzY2FuIGludGVydmFsIGFuZCB3aW5kb3cgaW4gdW5pdHMgb2YgTiowLjYyNSBtc2VjICovCisgIHZpcnR1YWwgdm9pZCBTZXRTY2FuUGFyYW1ldGVycyhpbnQgc2Nhbl9pbnRlcnZhbCwgaW50IHNjYW5fd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2sgY2IpID0gMDsKKworICAvKiBDb25maWd1cmUgdGhlIGJhdGNoc2NhbiBzdG9yYWdlICovCisgIHZpcnR1YWwgdm9pZCBCYXRjaHNjYW5Db25maWdTdG9yYWdlKGludCBjbGllbnRfaWYsIGludCBiYXRjaF9zY2FuX2Z1bGxfbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmF0Y2hfc2Nhbl90cnVuY19tYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiYXRjaF9zY2FuX25vdGlmeV90aHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrIGNiKSA9IDA7CisKKyAgLyogRW5hYmxlIGJhdGNoc2NhbiAqLworICB2aXJ0dWFsIHZvaWQgQmF0Y2hzY2FuRW5hYmxlKGludCBzY2FuX21vZGUsIGludCBzY2FuX2ludGVydmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzY2FuX3dpbmRvdywgaW50IGFkZHJfdHlwZSwgaW50IGRpc2NhcmRfcnVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsYmFjayBjYikgPSAwOworCisgIC8qIERpc2FibGUgYmF0Y2hzY2FuICovCisgIHZpcnR1YWwgdm9pZCBCYXRjaHNjYW5EaXNhYmxlKENhbGxiYWNrIGNiKSA9IDA7CisKKyAgLyogUmVhZCBvdXQgYmF0Y2hzY2FuIHJlcG9ydHMgKi8KKyAgdmlydHVhbCB2b2lkIEJhdGNoc2NhblJlYWRSZXBvcnRzKGludCBjbGllbnRfaWYsIGludCBzY2FuX21vZGUpID0gMDsKKworICB1c2luZyBTdGFydFN5bmNDYiA9CisgICAgICBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQ4X3Qgc3RhdHVzLCB1aW50MTZfdCBzeW5jX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhZHZlcnRpc2luZ19zaWQsIHVpbnQ4X3QgYWRkcmVzc190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBidF9iZGFkZHJfdCBhZGRyZXNzLCB1aW50OF90IHBoeSwgdWludDE2X3QgaW50ZXJ2YWwpPjsKKyAgdXNpbmcgU3luY1JlcG9ydENiID0KKyAgICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDE2X3Qgc3luY19oYW5kbGUsIGludDhfdCB0eF9wb3dlciwgaW50OF90IHJzc2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdHVzLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKT47CisgIHVzaW5nIFN5bmNMb3N0Q2IgPSBiYXNlOjpDYWxsYmFjazx2b2lkKHVpbnQxNl90IHN5bmNfaGFuZGxlKT47CisgIHZpcnR1YWwgdm9pZCBTdGFydFN5bmModWludDhfdCBzaWQsIGJ0X2JkYWRkcl90IGFkZHJlc3MsIHVpbnQxNl90IHNraXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgdGltZW91dCwgU3RhcnRTeW5jQ2Igc3RhcnRfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgU3luY1JlcG9ydENiIHJlcG9ydF9jYiwgU3luY0xvc3RDYiBsb3N0X2NiKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTdG9wU3luYyh1aW50MTZfdCBoYW5kbGUpID0gMDsKK307CisKKyNlbmRpZiAvKiBBTkRST0lEX0lOQ0xVREVfQkxFX1NDQU5ORVJfSCAqLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvYmx1ZXRvb3RoLmggYi9pbmNsdWRlL2hhcmR3YXJlL2JsdWV0b290aC5oCmluZGV4IGRkNWVhOGEuLjVkNjlhYjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvYmx1ZXRvb3RoLmgKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS9ibHVldG9vdGguaApAQCAtNDQsNiArNDQsNyBAQAogI2RlZmluZSBCVF9QUk9GSUxFX0hFQUxUSF9JRCAiaGVhbHRoIgogI2RlZmluZSBCVF9QUk9GSUxFX1NPQ0tFVFNfSUQgInNvY2tldCIKICNkZWZpbmUgQlRfUFJPRklMRV9ISURIT1NUX0lEICJoaWRob3N0IgorI2RlZmluZSBCVF9QUk9GSUxFX0hJRERFVl9JRCAiaGlkZGV2IgogI2RlZmluZSBCVF9QUk9GSUxFX1BBTl9JRCAicGFuIgogI2RlZmluZSBCVF9QUk9GSUxFX01BUF9DTElFTlRfSUQgIm1hcF9jbGllbnQiCiAjZGVmaW5lIEJUX1BST0ZJTEVfU0RQX0NMSUVOVF9JRCAic2RwIgpAQCAtMTYyLDYgKzE2MywxMSBAQAogICAgIHVpbnQxNl90IHRvdGFsX3RyYWNrYWJsZV9hZHZlcnRpc2VyczsKICAgICBib29sIGV4dGVuZGVkX3NjYW5fc3VwcG9ydDsKICAgICBib29sIGRlYnVnX2xvZ2dpbmdfc3VwcG9ydGVkOworICAgIGJvb2wgbGVfMm1fcGh5X3N1cHBvcnRlZDsKKyAgICBib29sIGxlX2NvZGVkX3BoeV9zdXBwb3J0ZWQ7CisgICAgYm9vbCBsZV9leHRlbmRlZF9hZHZlcnRpc2luZ19zdXBwb3J0ZWQ7CisgICAgYm9vbCBsZV9wZXJpb2RpY19hZHZlcnRpc2luZ19zdXBwb3J0ZWQ7CisgICAgdWludDE2X3QgbGVfbWF4aW11bV9hZHZlcnRpc2luZ19kYXRhX2xlbmd0aDsKIH1idF9sb2NhbF9sZV9mZWF0dXJlc190OwogCiAvKiBCbHVldG9vdGggQWRhcHRlciBhbmQgUmVtb3RlIERldmljZSBwcm9wZXJ0eSB0eXBlcyAqLwpAQCAtMjczLDcgKzI3OSw3IEBACiAgICB1aW50OF90IGMyNTZbMTZdOyAvKiBTaW1wbGUgUGFpcmluZyBIYXNoIEMtMjU2ICovCiAgICB1aW50OF90IHIyNTZbMTZdOyAvKiBTaW1wbGUgUGFpcmluZyBSYW5kb21pemVyIFItMjU2ICovCiAgICB1aW50OF90IHNtX3RrWzE2XTsgLyogU2VjdXJpdHkgTWFuYWdlciBUSyBWYWx1ZSAqLwotICAgdWludDhfdCBsZV9zY19jWzE2XTsgLyogTEUgU2VjdXJlIENvbm5lY3Rpb25zIFJhbmRvbSBWYWx1ZSAqLworICAgdWludDhfdCBsZV9zY19jWzE2XTsgLyogTEUgU2VjdXJlIENvbm5lY3Rpb25zIENvbmZpcm1hdGlvbiBWYWx1ZSAqLwogICAgdWludDhfdCBsZV9zY19yWzE2XTsgLyogTEUgU2VjdXJlIENvbm5lY3Rpb25zIFJhbmRvbSBWYWx1ZSAqLwogfSBidF9vdXRfb2ZfYmFuZF9kYXRhX3Q7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvYnRfYXYuaCBiL2luY2x1ZGUvaGFyZHdhcmUvYnRfYXYuaAppbmRleCA5YjMyMjE2Li45MWFlMmFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2hhcmR3YXJlL2J0X2F2LmgKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS9idF9hdi5oCkBAIC0xNyw2ICsxNywxMCBAQAogI2lmbmRlZiBBTkRST0lEX0lOQ0xVREVfQlRfQVZfSAogI2RlZmluZSBBTkRST0lEX0lOQ0xVREVfQlRfQVZfSAogCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8aGFyZHdhcmUvYmx1ZXRvb3RoLmg+CisKIF9fQkVHSU5fREVDTFMKIAogLyogQmx1ZXRvb3RoIEFWIGNvbm5lY3Rpb24gc3RhdGVzICovCkBAIC0zNCw2ICszOCw5MyBAQAogICAgIEJUQVZfQVVESU9fU1RBVEVfU1RBUlRFRCwKIH0gYnRhdl9hdWRpb19zdGF0ZV90OwogCisvKgorICogRW51bSB2YWx1ZXMgZm9yIGVhY2ggQTJEUCBzdXBwb3J0ZWQgY29kZWMuCisgKiBUaGVyZSBzaG91bGQgYmUgYSBzZXBhcmF0ZSBlbnRyeSBmb3IgZWFjaCBBMkRQIGNvZGVjIHRoYXQgaXMgc3VwcG9ydGVkCisgKiBmb3IgZW5jb2RpbmcgKFNSQyksIGFuZCBmb3IgZGVjb2RpbmcgcHVycG9zZSAoU0lOSykuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfTUlOID0gMCwKKworICAvLyBBZGQgYW4gZW50cnkgZm9yIGVhY2ggc291cmNlIGNvZGVjIGhlcmUuCisgIC8vIE5PVEU6IFRoZSB2YWx1ZXMgc2hvdWxkIGJlIHNhbWUgYXMgdGhvc2UgbGlzdGVkIGluIHRoZSBmb2xsb3dpbmcgZmlsZToKKyAgLy8gICBCbHVldG9vdGhDb2RlY0NvbmZpZy5qYXZhCisgIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfU0JDID0gMCwKKyAgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9BQUMsCisgIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TT1VSQ0VfQVBUWCwKKyAgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9BUFRYX0hELAorICBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX0xEQUMsCisKKyAgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9NQVgsCisKKyAgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NJTktfTUlOID0gQlRBVl9BMkRQX0NPREVDX0lOREVYX1NPVVJDRV9NQVgsCisKKyAgLy8gQWRkIGFuIGVudHJ5IGZvciBlYWNoIHNpbmsgY29kZWMgaGVyZQorICBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU0lOS19TQkMgPSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU0lOS19NSU4sCisKKyAgQlRBVl9BMkRQX0NPREVDX0lOREVYX1NJTktfTUFYLAorCisgIEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9NSU4gPSBCVEFWX0EyRFBfQ09ERUNfSU5ERVhfU09VUkNFX01JTiwKKyAgQlRBVl9BMkRQX0NPREVDX0lOREVYX01BWCA9IEJUQVZfQTJEUF9DT0RFQ19JTkRFWF9TSU5LX01BWAorfSBidGF2X2EyZHBfY29kZWNfaW5kZXhfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgLy8gRGlzYWJsZSB0aGUgY29kZWMuCisgIC8vIE5PVEU6IFRoaXMgdmFsdWUgY2FuIGJlIHVzZWQgb25seSBkdXJpbmcgaW5pdGlhbGl6YXRpb24gd2hlbgorICAvLyBmdW5jdGlvbiBidGF2X3NvdXJjZV9pbnRlcmZhY2VfdDo6aW5pdCgpIGlzIGNhbGxlZC4KKyAgQlRBVl9BMkRQX0NPREVDX1BSSU9SSVRZX0RJU0FCTEVEID0gLTEsCisKKyAgLy8gUmVzZXQgdGhlIGNvZGVjIHByaW9yaXR5IHRvIGl0cyBkZWZhdWx0IHZhbHVlLgorICBCVEFWX0EyRFBfQ09ERUNfUFJJT1JJVFlfREVGQVVMVCA9IDAsCisKKyAgLy8gSGlnaGVzdCBjb2RlYyBwcmlvcml0eS4KKyAgQlRBVl9BMkRQX0NPREVDX1BSSU9SSVRZX0hJR0hFU1QgPSAxMDAwICogMTAwMAorfSBidGF2X2EyZHBfY29kZWNfcHJpb3JpdHlfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFX05PTkUgICA9IDB4MCwKKyAgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzQ0MTAwICA9IDB4MSA8PCAwLAorICBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfNDgwMDAgID0gMHgxIDw8IDEsCisgIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV84ODIwMCAgPSAweDEgPDwgMiwKKyAgQlRBVl9BMkRQX0NPREVDX1NBTVBMRV9SQVRFXzk2MDAwICA9IDB4MSA8PCAzLAorICBCVEFWX0EyRFBfQ09ERUNfU0FNUExFX1JBVEVfMTc2NDAwID0gMHgxIDw8IDQsCisgIEJUQVZfQTJEUF9DT0RFQ19TQU1QTEVfUkFURV8xOTIwMDAgPSAweDEgPDwgNQorfSBidGF2X2EyZHBfY29kZWNfc2FtcGxlX3JhdGVfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV9OT05FID0gMHgwLAorICBCVEFWX0EyRFBfQ09ERUNfQklUU19QRVJfU0FNUExFXzE2ICAgPSAweDEgPDwgMCwKKyAgQlRBVl9BMkRQX0NPREVDX0JJVFNfUEVSX1NBTVBMRV8yNCAgID0gMHgxIDw8IDEsCisgIEJUQVZfQTJEUF9DT0RFQ19CSVRTX1BFUl9TQU1QTEVfMzIgICA9IDB4MSA8PCAyCit9IGJ0YXZfYTJkcF9jb2RlY19iaXRzX3Blcl9zYW1wbGVfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgQlRBVl9BMkRQX0NPREVDX0NIQU5ORUxfTU9ERV9OT05FICAgPSAweDAsCisgIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfTU9OTyAgID0gMHgxIDw8IDAsCisgIEJUQVZfQTJEUF9DT0RFQ19DSEFOTkVMX01PREVfU1RFUkVPID0gMHgxIDw8IDEKK30gYnRhdl9hMmRwX2NvZGVjX2NoYW5uZWxfbW9kZV90OworCisvKgorICogU3RydWN0dXJlIGZvciByZXByZXNlbnRpbmcgY29kZWMgY2FwYWJpbGl0eSBvciBjb25maWd1cmF0aW9uLgorICogSXQgaXMgdXNlZCBmb3IgY29uZmlndXJpbmcgQTJEUCBjb2RlYyBwcmVmZXJlbmNlLCBhbmQgZm9yIHJlcG9ydGluZyBiYWNrCisgKiBjdXJyZW50IGNvbmZpZ3VyYXRpb24gb3IgY29kZWMgY2FwYWJpbGl0eS4KKyAqIEZvciBjb2RlYyBjYXBhYmlsaXR5LCBmaWVsZHMgInNhbXBsZV9yYXRlIiwgImJpdHNfcGVyX3NhbXBsZSIgYW5kCisgKiAiY2hhbm5lbF9tb2RlIiBjYW4gY29udGFpbiBiaXQtbWFza3Mgd2l0aCBhbGwgc3VwcG9ydGVkIGZlYXR1cmVzLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIGJ0YXZfYTJkcF9jb2RlY19pbmRleF90IGNvZGVjX3R5cGU7CisgIGJ0YXZfYTJkcF9jb2RlY19wcmlvcml0eV90IGNvZGVjX3ByaW9yaXR5OyAvLyBDb2RlYyBzZWxlY3Rpb24gcHJpb3JpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVsYXRpdmUgdG8gb3RoZXIgY29kZWNzOiBsYXJnZXIgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVhbnMgaGlnaGVyIHByaW9yaXR5LiBJZiAwLCByZXNldCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0LgorICBidGF2X2EyZHBfY29kZWNfc2FtcGxlX3JhdGVfdCBzYW1wbGVfcmF0ZTsKKyAgYnRhdl9hMmRwX2NvZGVjX2JpdHNfcGVyX3NhbXBsZV90IGJpdHNfcGVyX3NhbXBsZTsKKyAgYnRhdl9hMmRwX2NvZGVjX2NoYW5uZWxfbW9kZV90IGNoYW5uZWxfbW9kZTsKKyAgaW50NjRfdCBjb2RlY19zcGVjaWZpY18xOyAgICAgLy8gQ29kZWMtc3BlY2lmaWMgdmFsdWUgMQorICBpbnQ2NF90IGNvZGVjX3NwZWNpZmljXzI7ICAgICAvLyBDb2RlYy1zcGVjaWZpYyB2YWx1ZSAyCisgIGludDY0X3QgY29kZWNfc3BlY2lmaWNfMzsgICAgIC8vIENvZGVjLXNwZWNpZmljIHZhbHVlIDMKKyAgaW50NjRfdCBjb2RlY19zcGVjaWZpY180OyAgICAgLy8gQ29kZWMtc3BlY2lmaWMgdmFsdWUgNAorfSBidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q7CiAKIC8qKiBDYWxsYmFjayBmb3IgY29ubmVjdGlvbiBzdGF0ZSBjaGFuZ2UuCiAgKiAgc3RhdGUgd2lsbCBoYXZlIG9uZSBvZiB0aGUgdmFsdWVzIGZyb20gYnRhdl9jb25uZWN0aW9uX3N0YXRlX3QKQEAgLTQ4LDIzICsxMzksMzkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfYmRhZGRyX3QgKmJkX2FkZHIpOwogCiAvKiogQ2FsbGJhY2sgZm9yIGF1ZGlvIGNvbmZpZ3VyYXRpb24gY2hhbmdlLgotICogIFVzZWQgb25seSBmb3IgdGhlIEEyRFAgc2luayBpbnRlcmZhY2UuCi0gKiAgc3RhdGUgd2lsbCBoYXZlIG9uZSBvZiB0aGUgdmFsdWVzIGZyb20gYnRhdl9hdWRpb19zdGF0ZV90CisgKiAgVXNlZCBvbmx5IGZvciB0aGUgQTJEUCBTb3VyY2UgaW50ZXJmYWNlLgorICovCit0eXBlZGVmIHZvaWQgKCogYnRhdl9hdWRpb19zb3VyY2VfY29uZmlnX2NhbGxiYWNrKSgKKyAgICBidGF2X2EyZHBfY29kZWNfY29uZmlnX3QgY29kZWNfY29uZmlnLAorICAgIHN0ZDo6dmVjdG9yPGJ0YXZfYTJkcF9jb2RlY19jb25maWdfdD4gY29kZWNzX2xvY2FsX2NhcGFiaWxpdGllcywKKyAgICBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+IGNvZGVjc19zZWxlY3RhYmxlX2NhcGFiaWxpdGllcyk7CisKKy8qKiBDYWxsYmFjayBmb3IgYXVkaW8gY29uZmlndXJhdGlvbiBjaGFuZ2UuCisgKiAgVXNlZCBvbmx5IGZvciB0aGUgQTJEUCBTaW5rIGludGVyZmFjZS4KICAqICBzYW1wbGVfcmF0ZTogc2FtcGxlIHJhdGUgaW4gSHoKICAqICBjaGFubmVsX2NvdW50OiBudW1iZXIgb2YgY2hhbm5lbHMgKDEgZm9yIG1vbm8sIDIgZm9yIHN0ZXJlbykKICAqLwotdHlwZWRlZiB2b2lkICgqIGJ0YXZfYXVkaW9fY29uZmlnX2NhbGxiYWNrKShidF9iZGFkZHJfdCAqYmRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjaGFubmVsX2NvdW50KTsKK3R5cGVkZWYgdm9pZCAoKiBidGF2X2F1ZGlvX3NpbmtfY29uZmlnX2NhbGxiYWNrKShidF9iZGFkZHJfdCAqYmRfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNoYW5uZWxfY291bnQpOwogCi0vKiogQlQtQVYgY2FsbGJhY2sgc3RydWN0dXJlLiAqLworLyoqIEJULUFWIEEyRFAgU291cmNlIGNhbGxiYWNrIHN0cnVjdHVyZS4gKi8KIHR5cGVkZWYgc3RydWN0IHsKLSAgICAvKiogc2V0IHRvIHNpemVvZihidGF2X2NhbGxiYWNrc190KSAqLworICAgIC8qKiBzZXQgdG8gc2l6ZW9mKGJ0YXZfc291cmNlX2NhbGxiYWNrc190KSAqLwogICAgIHNpemVfdCAgICAgIHNpemU7CiAgICAgYnRhdl9jb25uZWN0aW9uX3N0YXRlX2NhbGxiYWNrICBjb25uZWN0aW9uX3N0YXRlX2NiOwogICAgIGJ0YXZfYXVkaW9fc3RhdGVfY2FsbGJhY2sgYXVkaW9fc3RhdGVfY2I7Ci0gICAgYnRhdl9hdWRpb19jb25maWdfY2FsbGJhY2sgYXVkaW9fY29uZmlnX2NiOwotfSBidGF2X2NhbGxiYWNrc190OworICAgIGJ0YXZfYXVkaW9fc291cmNlX2NvbmZpZ19jYWxsYmFjayBhdWRpb19jb25maWdfY2I7Cit9IGJ0YXZfc291cmNlX2NhbGxiYWNrc190OworCisvKiogQlQtQVYgQTJEUCBTaW5rIGNhbGxiYWNrIHN0cnVjdHVyZS4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvKiogc2V0IHRvIHNpemVvZihidGF2X3NpbmtfY2FsbGJhY2tzX3QpICovCisgICAgc2l6ZV90ICAgICAgc2l6ZTsKKyAgICBidGF2X2Nvbm5lY3Rpb25fc3RhdGVfY2FsbGJhY2sgIGNvbm5lY3Rpb25fc3RhdGVfY2I7CisgICAgYnRhdl9hdWRpb19zdGF0ZV9jYWxsYmFjayBhdWRpb19zdGF0ZV9jYjsKKyAgICBidGF2X2F1ZGlvX3NpbmtfY29uZmlnX2NhbGxiYWNrIGF1ZGlvX2NvbmZpZ19jYjsKK30gYnRhdl9zaW5rX2NhbGxiYWNrc190OwogCiAvKioKICAqIE5PVEU6CkBAIC03NiwxNyArMTgzLDQzIEBACiAgKiAgICBhbmRyb2lkX2F1ZGlvX2h3IGxpYnJhcnkgYW5kIHRoZSBCbHVldG9vdGggc3RhY2suCiAgKgogICovCi0vKiogUmVwcmVzZW50cyB0aGUgc3RhbmRhcmQgQlQtQVYgaW50ZXJmYWNlLgotICogIFVzZWQgZm9yIGJvdGggdGhlIEEyRFAgc291cmNlIGFuZCBzaW5rIGludGVyZmFjZXMuCisKKy8qKiBSZXByZXNlbnRzIHRoZSBzdGFuZGFyZCBCVC1BViBBMkRQIFNvdXJjZSBpbnRlcmZhY2UuCiAgKi8KIHR5cGVkZWYgc3RydWN0IHsKIAotICAgIC8qKiBzZXQgdG8gc2l6ZW9mKGJ0YXZfaW50ZXJmYWNlX3QpICovCisgICAgLyoqIHNldCB0byBzaXplb2YoYnRhdl9zb3VyY2VfaW50ZXJmYWNlX3QpICovCisgICAgc2l6ZV90ICAgICAgICAgIHNpemU7CisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgdGhlIEJ0QXYgY2FsbGJhY2tzLgorICAgICAqLworICAgIGJ0X3N0YXR1c190ICgqaW5pdCkoYnRhdl9zb3VyY2VfY2FsbGJhY2tzX3QqIGNhbGxiYWNrcywKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+IGNvZGVjX3ByaW9yaXRpZXMpOworCisgICAgLyoqIGNvbm5lY3QgdG8gaGVhZHNldCAqLworICAgIGJ0X3N0YXR1c190ICgqY29ubmVjdCkoIGJ0X2JkYWRkcl90ICpiZF9hZGRyICk7CisKKyAgICAvKiogZGlzLWNvbm5lY3QgZnJvbSBoZWFkc2V0ICovCisgICAgYnRfc3RhdHVzX3QgKCpkaXNjb25uZWN0KSggYnRfYmRhZGRyX3QgKmJkX2FkZHIgKTsKKworICAgIC8qKiBjb25maWd1cmUgdGhlIGNvZGVjcyBzZXR0aW5ncyBwcmVmZXJlbmNlcyAqLworICAgIGJ0X3N0YXR1c190ICgqY29uZmlnX2NvZGVjKShzdGQ6OnZlY3RvcjxidGF2X2EyZHBfY29kZWNfY29uZmlnX3Q+IGNvZGVjX3ByZWZlcmVuY2VzKTsKKworICAgIC8qKiBDbG9zZXMgdGhlIGludGVyZmFjZS4gKi8KKyAgICB2b2lkICAoKmNsZWFudXApKCB2b2lkICk7CisKK30gYnRhdl9zb3VyY2VfaW50ZXJmYWNlX3Q7CisKKy8qKiBSZXByZXNlbnRzIHRoZSBzdGFuZGFyZCBCVC1BViBBMkRQIFNpbmsgaW50ZXJmYWNlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgICAvKiogc2V0IHRvIHNpemVvZihidGF2X3NpbmtfaW50ZXJmYWNlX3QpICovCiAgICAgc2l6ZV90ICAgICAgICAgIHNpemU7CiAgICAgLyoqCiAgICAgICogUmVnaXN0ZXIgdGhlIEJ0QXYgY2FsbGJhY2tzCiAgICAgICovCi0gICAgYnRfc3RhdHVzX3QgKCppbml0KSggYnRhdl9jYWxsYmFja3NfdCogY2FsbGJhY2tzICk7CisgICAgYnRfc3RhdHVzX3QgKCppbml0KSggYnRhdl9zaW5rX2NhbGxiYWNrc190KiBjYWxsYmFja3MgKTsKIAogICAgIC8qKiBjb25uZWN0IHRvIGhlYWRzZXQgKi8KICAgICBidF9zdGF0dXNfdCAoKmNvbm5lY3QpKCBidF9iZGFkZHJfdCAqYmRfYWRkciApOwpAQCAtMTAyLDcgKzIzNSw3IEBACiAKICAgICAvKiogU2V0cyB0aGUgYXVkaW8gdHJhY2sgZ2Fpbi4gKi8KICAgICB2b2lkICAoKnNldF9hdWRpb190cmFja19nYWluKSggZmxvYXQgZ2FpbiApOwotfSBidGF2X2ludGVyZmFjZV90OworfSBidGF2X3NpbmtfaW50ZXJmYWNlX3Q7CiAKIF9fRU5EX0RFQ0xTCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvYnRfY29tbW9uX3R5cGVzLmggYi9pbmNsdWRlL2hhcmR3YXJlL2J0X2NvbW1vbl90eXBlcy5oCmluZGV4IDAxYjUyNTYuLmNmZjMwNzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvYnRfY29tbW9uX3R5cGVzLmgKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS9idF9jb21tb25fdHlwZXMuaApAQCAtNzAsNiArNzAsMjIgQEAKICAgICAgKiB0aGUgY2hhcmFjdGVyaXN0aWMuCiAgICAgICovCiAgICAgdWludDhfdCAgICAgICAgICAgICBwcm9wZXJ0aWVzOworICAgIHVpbnQxNl90ICAgICAgICAgICAgcGVybWlzc2lvbnM7CiB9IGJ0Z2F0dF9kYl9lbGVtZW50X3Q7CiAKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDE2X3QgZmVhdF9zZWxuOworICAgIHVpbnQxNl90IGxpc3RfbG9naWNfdHlwZTsKKyAgICB1aW50OF90ICBmaWx0X2xvZ2ljX3R5cGU7CisgICAgdWludDhfdCAgcnNzaV9oaWdoX3RocmVzOworICAgIHVpbnQ4X3QgIHJzc2lfbG93X3RocmVzOworICAgIHVpbnQ4X3QgIGRlbHlfbW9kZTsKKyAgICB1aW50MTZfdCBmb3VuZF90aW1lb3V0OworICAgIHVpbnQxNl90IGxvc3RfdGltZW91dDsKKyAgICB1aW50OF90ICBmb3VuZF90aW1lb3V0X2NudDsKKyAgICB1aW50MTZfdCAgbnVtX29mX3RyYWNraW5nX2VudHJpZXM7Cit9IGJ0Z2F0dF9maWx0X3BhcmFtX3NldHVwX3Q7CisKKwogI2VuZGlmICAvKiBBTkRST0lEX0lOQ0xVREVfQlRfQ09NTU9OX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvYnRfZ2F0dC5oIGIvaW5jbHVkZS9oYXJkd2FyZS9idF9nYXR0LmgKaW5kZXggNDJlMTRjMi4uMzkzZDFhNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9idF9nYXR0LmgKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS9idF9nYXR0LmgKQEAgLTE5LDYgKzE5LDggQEAKICNkZWZpbmUgQU5EUk9JRF9JTkNMVURFX0JUX0dBVFRfSAogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAiYmxlX2FkdmVydGlzZXIuaCIKKyNpbmNsdWRlICJibGVfc2Nhbm5lci5oIgogI2luY2x1ZGUgImJ0X2dhdHRfY2xpZW50LmgiCiAjaW5jbHVkZSAiYnRfZ2F0dF9zZXJ2ZXIuaCIKIApAQCAtMzQsNiArMzYsOSBAQAogCiAgICAgLyoqIEdBVFQgU2VydmVyIGNhbGxiYWNrcyAqLwogICAgIGNvbnN0IGJ0Z2F0dF9zZXJ2ZXJfY2FsbGJhY2tzX3QqIHNlcnZlcjsKKworICAgIC8qKiBMRSBzY2FubmVyIGNhbGxiYWNrcyAqLworICAgIGNvbnN0IGJ0Z2F0dF9zY2FubmVyX2NhbGxiYWNrc190KiBzY2FubmVyOwogfSBidGdhdHRfY2FsbGJhY2tzX3Q7CiAKIC8qKiBSZXByZXNlbnRzIHRoZSBzdGFuZGFyZCBCbHVldG9vdGggR0FUVCBpbnRlcmZhY2UuICovCkBAIC01NCw2ICs1OSwxMiBAQAogCiAgICAgLyoqIFBvaW50ZXIgdG8gdGhlIEdBVFQgc2VydmVyIGludGVyZmFjZSBtZXRob2RzLiovCiAgICAgY29uc3QgYnRnYXR0X3NlcnZlcl9pbnRlcmZhY2VfdCogc2VydmVyOworCisgICAgLyoqIFBvaW50ZXIgdG8gdGhlIExFIHNjYW5uZXIgaW50ZXJmYWNlIG1ldGhvZHMuKi8KKyAgICBCbGVTY2FubmVySW50ZXJmYWNlKiBzY2FubmVyOworCisgICAgLyoqIFBvaW50ZXIgdG8gdGhlIGFkdmVydGlzZXIgaW50ZXJmYWNlIG1ldGhvZHMuKi8KKyAgICBCbGVBZHZlcnRpc2VySW50ZXJmYWNlKiBhZHZlcnRpc2VyOwogfSBidGdhdHRfaW50ZXJmYWNlX3Q7CiAKIF9fRU5EX0RFQ0xTCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2J0X2dhdHRfY2xpZW50LmggYi9pbmNsdWRlL2hhcmR3YXJlL2J0X2dhdHRfY2xpZW50LmgKaW5kZXggZTJjOGE5Mi4uZWM4ZGQxNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9idF9nYXR0X2NsaWVudC5oCisrKyBiL2luY2x1ZGUvaGFyZHdhcmUvYnRfZ2F0dF9jbGllbnQuaApAQCAtMTksNiArMTksNyBAQAogI2RlZmluZSBBTkRST0lEX0lOQ0xVREVfQlRfR0FUVF9DTElFTlRfSAogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgImJ0X2dhdHRfdHlwZXMuaCIKICNpbmNsdWRlICJidF9jb21tb25fdHlwZXMuaCIKIApAQCAtNjcsMjMgKzY4LDYgQEAKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICB1aW50OF90ICBjbGllbnRfaWY7Ci0gICAgdWludDhfdCAgYWN0aW9uOwotICAgIHVpbnQ4X3QgIGZpbHRfaW5kZXg7Ci0gICAgdWludDE2X3QgZmVhdF9zZWxuOwotICAgIHVpbnQxNl90IGxpc3RfbG9naWNfdHlwZTsKLSAgICB1aW50OF90ICBmaWx0X2xvZ2ljX3R5cGU7Ci0gICAgdWludDhfdCAgcnNzaV9oaWdoX3RocmVzOwotICAgIHVpbnQ4X3QgIHJzc2lfbG93X3RocmVzOwotICAgIHVpbnQ4X3QgIGRlbHlfbW9kZTsKLSAgICB1aW50MTZfdCBmb3VuZF90aW1lb3V0OwotICAgIHVpbnQxNl90IGxvc3RfdGltZW91dDsKLSAgICB1aW50OF90ICBmb3VuZF90aW1lb3V0X2NudDsKLSAgICB1aW50MTZfdCAgbnVtX29mX3RyYWNraW5nX2VudHJpZXM7Ci19IGJ0Z2F0dF9maWx0X3BhcmFtX3NldHVwX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17CiAgICAgYnRfYmRhZGRyX3QgICAgICAgICpiZGExOwogICAgIGJ0X3V1aWRfdCAgICAgICAgICAqdXVpZDE7CiAgICAgdWludDE2X3QgICAgICAgICAgICB1MTsKQEAgLTExOCw5ICsxMDIsNiBAQAogdHlwZWRlZiB2b2lkICgqcmVnaXN0ZXJfY2xpZW50X2NhbGxiYWNrKShpbnQgc3RhdHVzLCBpbnQgY2xpZW50X2lmLAogICAgICAgICAgICAgICAgIGJ0X3V1aWRfdCAqYXBwX3V1aWQpOwogCi0vKiogQ2FsbGJhY2sgZm9yIHNjYW4gcmVzdWx0cyAqLwotdHlwZWRlZiB2b2lkICgqc2Nhbl9yZXN1bHRfY2FsbGJhY2spKGJ0X2JkYWRkcl90KiBiZGEsIGludCByc3NpLCB1aW50OF90KiBhZHZfZGF0YSk7Ci0KIC8qKiBHQVRUIG9wZW4gY2FsbGJhY2sgaW52b2tlZCBpbiByZXNwb25zZSB0byBvcGVuICovCiB0eXBlZGVmIHZvaWQgKCpjb25uZWN0X2NhbGxiYWNrKShpbnQgY29ubl9pZCwgaW50IHN0YXR1cywgaW50IGNsaWVudF9pZiwgYnRfYmRhZGRyX3QqIGJkYSk7CiAKQEAgLTE2NSwzNiArMTQ2LDkgQEAKIHR5cGVkZWYgdm9pZCAoKnJlYWRfcmVtb3RlX3Jzc2lfY2FsbGJhY2spKGludCBjbGllbnRfaWYsIGJ0X2JkYWRkcl90KiBiZGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcnNzaSwgaW50IHN0YXR1cyk7CiAKLS8qKgotICogQ2FsbGJhY2sgaW5kaWNhdGluZyB0aGUgc3RhdHVzIG9mIGEgbGlzdGVuKCkgb3BlcmF0aW9uCi0gKi8KLXR5cGVkZWYgdm9pZCAoKmxpc3Rlbl9jYWxsYmFjaykoaW50IHN0YXR1cywgaW50IHNlcnZlcl9pZik7Ci0KIC8qKiBDYWxsYmFjayBpbnZva2VkIHdoZW4gdGhlIE1UVSBmb3IgYSBnaXZlbiBjb25uZWN0aW9uIGNoYW5nZXMgKi8KIHR5cGVkZWYgdm9pZCAoKmNvbmZpZ3VyZV9tdHVfY2FsbGJhY2spKGludCBjb25uX2lkLCBpbnQgc3RhdHVzLCBpbnQgbXR1KTsKIAotLyoqIENhbGxiYWNrIGludm9rZWQgd2hlbiBhIHNjYW4gZmlsdGVyIGNvbmZpZ3VyYXRpb24gY29tbWFuZCBoYXMgY29tcGxldGVkICovCi10eXBlZGVmIHZvaWQgKCpzY2FuX2ZpbHRlcl9jZmdfY2FsbGJhY2spKGludCBhY3Rpb24sIGludCBjbGllbnRfaWYsIGludCBzdGF0dXMsIGludCBmaWx0X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdmJsX3NwYWNlKTsKLQotLyoqIENhbGxiYWNrIGludm9rZWQgd2hlbiBzY2FuIHBhcmFtIGhhcyBiZWVuIGFkZGVkLCBjbGVhcmVkLCBvciBkZWxldGVkICovCi10eXBlZGVmIHZvaWQgKCpzY2FuX2ZpbHRlcl9wYXJhbV9jYWxsYmFjaykoaW50IGFjdGlvbiwgaW50IGNsaWVudF9pZiwgaW50IHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF2Ymxfc3BhY2UpOwotCi0vKiogQ2FsbGJhY2sgaW52b2tlZCB3aGVuIGEgc2NhbiBmaWx0ZXIgY29uZmlndXJhdGlvbiBjb21tYW5kIGhhcyBjb21wbGV0ZWQgKi8KLXR5cGVkZWYgdm9pZCAoKnNjYW5fZmlsdGVyX3N0YXR1c19jYWxsYmFjaykoaW50IGVuYWJsZSwgaW50IGNsaWVudF9pZiwgaW50IHN0YXR1cyk7Ci0KLS8qKiBDYWxsYmFjayBpbnZva2VkIHdoZW4gbXVsdGktYWR2IGVuYWJsZSBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZCAqLwotdHlwZWRlZiB2b2lkICgqbXVsdGlfYWR2X2VuYWJsZV9jYWxsYmFjaykoaW50IGNsaWVudF9pZiwgaW50IHN0YXR1cyk7Ci0KLS8qKiBDYWxsYmFjayBpbnZva2VkIHdoZW4gbXVsdGktYWR2IHBhcmFtIHVwZGF0ZSBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZCAqLwotdHlwZWRlZiB2b2lkICgqbXVsdGlfYWR2X3VwZGF0ZV9jYWxsYmFjaykoaW50IGNsaWVudF9pZiwgaW50IHN0YXR1cyk7Ci0KLS8qKiBDYWxsYmFjayBpbnZva2VkIHdoZW4gbXVsdGktYWR2IGluc3RhbmNlIGRhdGEgc2V0IG9wZXJhdGlvbiBoYXMgY29tcGxldGVkICovCi10eXBlZGVmIHZvaWQgKCptdWx0aV9hZHZfZGF0YV9jYWxsYmFjaykoaW50IGNsaWVudF9pZiwgaW50IHN0YXR1cyk7Ci0KLS8qKiBDYWxsYmFjayBpbnZva2VkIHdoZW4gbXVsdGktYWR2IGRpc2FibGUgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQgKi8KLXR5cGVkZWYgdm9pZCAoKm11bHRpX2Fkdl9kaXNhYmxlX2NhbGxiYWNrKShpbnQgY2xpZW50X2lmLCBpbnQgc3RhdHVzKTsKIAogLyoqCiAgKiBDYWxsYmFjayBub3RpZnlpbmcgYW4gYXBwbGljYXRpb24gdGhhdCBhIHJlbW90ZSBkZXZpY2UgY29ubmVjdGlvbiBpcyBjdXJyZW50bHkgY29uZ2VzdGVkCkBAIC0yMDIsMjUgKzE1Niw2IEBACiAgKiBhIGZ1cnRoZXIgY2FsbGJhY2sgaXMgcmVjZWl2ZWQgaW5kaWNhdGluZyB0aGUgY29uZ2VzdGlvbiBzdGF0dXMgaGFzIGJlZW4gY2xlYXJlZC4KICAqLwogdHlwZWRlZiB2b2lkICgqY29uZ2VzdGlvbl9jYWxsYmFjaykoaW50IGNvbm5faWQsIGJvb2wgY29uZ2VzdGVkKTsKLS8qKiBDYWxsYmFjayBpbnZva2VkIHdoZW4gYmF0Y2hzY2FuIHN0b3JhZ2UgY29uZmlnIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkICovCi10eXBlZGVmIHZvaWQgKCpiYXRjaHNjYW5fY2ZnX3N0b3JhZ2VfY2FsbGJhY2spKGludCBjbGllbnRfaWYsIGludCBzdGF0dXMpOwotCi0vKiogQ2FsbGJhY2sgaW52b2tlZCB3aGVuIGJhdGNoc2NhbiBlbmFibGUgLyBkaXNhYmxlIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkICovCi10eXBlZGVmIHZvaWQgKCpiYXRjaHNjYW5fZW5hYmxlX2Rpc2FibGVfY2FsbGJhY2spKGludCBhY3Rpb24sIGludCBjbGllbnRfaWYsIGludCBzdGF0dXMpOwotCi0vKiogQ2FsbGJhY2sgaW52b2tlZCB3aGVuIGJhdGNoc2NhbiByZXBvcnRzIGFyZSBvYnRhaW5lZCAqLwotdHlwZWRlZiB2b2lkICgqYmF0Y2hzY2FuX3JlcG9ydHNfY2FsbGJhY2spKGludCBjbGllbnRfaWYsIGludCBzdGF0dXMsIGludCByZXBvcnRfZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcmVjb3JkcywgaW50IGRhdGFfbGVuLCB1aW50OF90KiByZXBfZGF0YSk7Ci0KLS8qKiBDYWxsYmFjayBpbnZva2VkIHdoZW4gYmF0Y2hzY2FuIHN0b3JhZ2UgdGhyZXNob2xkIGxpbWl0IGlzIGNyb3NzZWQgKi8KLXR5cGVkZWYgdm9pZCAoKmJhdGNoc2Nhbl90aHJlc2hvbGRfY2FsbGJhY2spKGludCBjbGllbnRfaWYpOwotCi0vKiogVHJhY2sgQURWIFZTRSBjYWxsYmFjayBpbnZva2VkIHdoZW4gdHJhY2tlZCBkZXZpY2UgaXMgZm91bmQgb3IgbG9zdCAqLwotdHlwZWRlZiB2b2lkICgqdHJhY2tfYWR2X2V2ZW50X2NhbGxiYWNrKShidGdhdHRfdHJhY2tfYWR2X2luZm9fdCAqcF90cmFja19hZHZfaW5mbyk7Ci0KLS8qKiBDYWxsYmFjayBpbnZva2VkIHdoZW4gc2NhbiBwYXJhbWV0ZXIgc2V0dXAgaGFzIGNvbXBsZXRlZCAqLwotdHlwZWRlZiB2b2lkICgqc2Nhbl9wYXJhbWV0ZXJfc2V0dXBfY29tcGxldGVkX2NhbGxiYWNrKShpbnQgY2xpZW50X2lmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGdhdHRjX2Vycm9yX3Qgc3RhdHVzKTsKIAogLyoqIEdBVFQgZ2V0IGRhdGFiYXNlIGNhbGxiYWNrICovCiB0eXBlZGVmIHZvaWQgKCpnZXRfZ2F0dF9kYl9jYWxsYmFjaykoaW50IGNvbm5faWQsIGJ0Z2F0dF9kYl9lbGVtZW50X3QgKmRiLCBpbnQgY291bnQpOwpAQCAtMjMxLDkgKzE2NiwxNyBAQAogLyoqIEdBVFQgc2VydmljZXMgd2VyZSBhZGRlZCAqLwogdHlwZWRlZiB2b2lkICgqc2VydmljZXNfYWRkZWRfY2FsbGJhY2spKGludCBjb25uX2lkLCBidGdhdHRfZGJfZWxlbWVudF90ICphZGRlZCwgaW50IGFkZGVkX2NvdW50KTsKIAorLyoqIENhbGxiYWNrIGludm9rZWQgd2hlbiB0aGUgUEhZIGZvciBhIGdpdmVuIGNvbm5lY3Rpb24gY2hhbmdlcyAqLwordHlwZWRlZiB2b2lkICgqcGh5X3VwZGF0ZWRfY2FsbGJhY2spKGludCBjb25uX2lkLCB1aW50OF90IHR4X3BoeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJ4X3BoeSwgdWludDhfdCBzdGF0dXMpOworCisvKiogQ2FsbGJhY2sgaW52b2tlZCB3aGVuIHRoZSBjb25uZWN0aW9uIHBhcmFtZXRlcnMgZm9yIGEgZ2l2ZW4gY29ubmVjdGlvbiBjaGFuZ2VzICovCit0eXBlZGVmIHZvaWQgKCpjb25uX3VwZGF0ZWRfY2FsbGJhY2spKGludCBjb25uX2lkLCB1aW50MTZfdCBpbnRlcnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGF0ZW5jeSwgdWludDE2X3QgdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzdGF0dXMpOworCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgcmVnaXN0ZXJfY2xpZW50X2NhbGxiYWNrICAgICAgICAgICAgcmVnaXN0ZXJfY2xpZW50X2NiOwotICAgIHNjYW5fcmVzdWx0X2NhbGxiYWNrICAgICAgICAgICAgICAgIHNjYW5fcmVzdWx0X2NiOwogICAgIGNvbm5lY3RfY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgIG9wZW5fY2I7CiAgICAgZGlzY29ubmVjdF9jYWxsYmFjayAgICAgICAgICAgICAgICAgY2xvc2VfY2I7CiAgICAgc2VhcmNoX2NvbXBsZXRlX2NhbGxiYWNrICAgICAgICAgICAgc2VhcmNoX2NvbXBsZXRlX2NiOwpAQCAtMjQ1LDI1ICsxODgsMTMgQEAKICAgICB3cml0ZV9kZXNjcmlwdG9yX2NhbGxiYWNrICAgICAgICAgICB3cml0ZV9kZXNjcmlwdG9yX2NiOwogICAgIGV4ZWN1dGVfd3JpdGVfY2FsbGJhY2sgICAgICAgICAgICAgIGV4ZWN1dGVfd3JpdGVfY2I7CiAgICAgcmVhZF9yZW1vdGVfcnNzaV9jYWxsYmFjayAgICAgICAgICAgcmVhZF9yZW1vdGVfcnNzaV9jYjsKLSAgICBsaXN0ZW5fY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5fY2I7CiAgICAgY29uZmlndXJlX210dV9jYWxsYmFjayAgICAgICAgICAgICAgY29uZmlndXJlX210dV9jYjsKLSAgICBzY2FuX2ZpbHRlcl9jZmdfY2FsbGJhY2sgICAgICAgICAgICBzY2FuX2ZpbHRlcl9jZmdfY2I7Ci0gICAgc2Nhbl9maWx0ZXJfcGFyYW1fY2FsbGJhY2sgICAgICAgICAgc2Nhbl9maWx0ZXJfcGFyYW1fY2I7Ci0gICAgc2Nhbl9maWx0ZXJfc3RhdHVzX2NhbGxiYWNrICAgICAgICAgc2Nhbl9maWx0ZXJfc3RhdHVzX2NiOwotICAgIG11bHRpX2Fkdl9lbmFibGVfY2FsbGJhY2sgICAgICAgICAgIG11bHRpX2Fkdl9lbmFibGVfY2I7Ci0gICAgbXVsdGlfYWR2X3VwZGF0ZV9jYWxsYmFjayAgICAgICAgICAgbXVsdGlfYWR2X3VwZGF0ZV9jYjsKLSAgICBtdWx0aV9hZHZfZGF0YV9jYWxsYmFjayAgICAgICAgICAgICBtdWx0aV9hZHZfZGF0YV9jYjsKLSAgICBtdWx0aV9hZHZfZGlzYWJsZV9jYWxsYmFjayAgICAgICAgICBtdWx0aV9hZHZfZGlzYWJsZV9jYjsKICAgICBjb25nZXN0aW9uX2NhbGxiYWNrICAgICAgICAgICAgICAgICBjb25nZXN0aW9uX2NiOwotICAgIGJhdGNoc2Nhbl9jZmdfc3RvcmFnZV9jYWxsYmFjayAgICAgIGJhdGNoc2Nhbl9jZmdfc3RvcmFnZV9jYjsKLSAgICBiYXRjaHNjYW5fZW5hYmxlX2Rpc2FibGVfY2FsbGJhY2sgICBiYXRjaHNjYW5fZW5iX2Rpc2FibGVfY2I7Ci0gICAgYmF0Y2hzY2FuX3JlcG9ydHNfY2FsbGJhY2sgICAgICAgICAgYmF0Y2hzY2FuX3JlcG9ydHNfY2I7Ci0gICAgYmF0Y2hzY2FuX3RocmVzaG9sZF9jYWxsYmFjayAgICAgICAgYmF0Y2hzY2FuX3RocmVzaG9sZF9jYjsKLSAgICB0cmFja19hZHZfZXZlbnRfY2FsbGJhY2sgICAgICAgICAgICB0cmFja19hZHZfZXZlbnRfY2I7Ci0gICAgc2Nhbl9wYXJhbWV0ZXJfc2V0dXBfY29tcGxldGVkX2NhbGxiYWNrIHNjYW5fcGFyYW1ldGVyX3NldHVwX2NvbXBsZXRlZF9jYjsKICAgICBnZXRfZ2F0dF9kYl9jYWxsYmFjayAgICAgICAgICAgICAgICBnZXRfZ2F0dF9kYl9jYjsKICAgICBzZXJ2aWNlc19yZW1vdmVkX2NhbGxiYWNrICAgICAgICAgICBzZXJ2aWNlc19yZW1vdmVkX2NiOwogICAgIHNlcnZpY2VzX2FkZGVkX2NhbGxiYWNrICAgICAgICAgICAgIHNlcnZpY2VzX2FkZGVkX2NiOworICAgIHBoeV91cGRhdGVkX2NhbGxiYWNrICAgICAgICAgICAgICAgIHBoeV91cGRhdGVkX2NiOworICAgIGNvbm5fdXBkYXRlZF9jYWxsYmFjayAgICAgICAgICAgICAgIGNvbm5fdXBkYXRlZF9jYjsKIH0gYnRnYXR0X2NsaWVudF9jYWxsYmFja3NfdDsKIAogLyoqIFJlcHJlc2VudHMgdGhlIHN0YW5kYXJkIEJULUdBVFQgY2xpZW50IGludGVyZmFjZS4gKi8KQEAgLTI3NSwyMCArMjA2LDE0IEBACiAgICAgLyoqIFVucmVnaXN0ZXIgYSBjbGllbnQgYXBwbGljYXRpb24gZnJvbSB0aGUgc3RhY2sgKi8KICAgICBidF9zdGF0dXNfdCAoKnVucmVnaXN0ZXJfY2xpZW50KShpbnQgY2xpZW50X2lmICk7CiAKLSAgICAvKiogU3RhcnQgb3Igc3RvcCBMRSBkZXZpY2Ugc2Nhbm5pbmcgKi8KLSAgICBidF9zdGF0dXNfdCAoKnNjYW4pKCBib29sIHN0YXJ0ICk7Ci0KICAgICAvKiogQ3JlYXRlIGEgY29ubmVjdGlvbiB0byBhIHJlbW90ZSBMRSBvciBkdWFsLW1vZGUgZGV2aWNlICovCi0gICAgYnRfc3RhdHVzX3QgKCpjb25uZWN0KSggaW50IGNsaWVudF9pZiwgY29uc3QgYnRfYmRhZGRyX3QgKmJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19kaXJlY3QsIGludCB0cmFuc3BvcnQgKTsKKyAgICBidF9zdGF0dXNfdCAoKmNvbm5lY3QpKGludCBjbGllbnRfaWYsIGNvbnN0IGJ0X2JkYWRkcl90ICpiZF9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19kaXJlY3QsIGludCB0cmFuc3BvcnQsIGludCBpbml0aWF0aW5nX3BoeXMpOwogCiAgICAgLyoqIERpc2Nvbm5lY3QgYSByZW1vdGUgZGV2aWNlIG9yIGNhbmNlbCBhIHBlbmRpbmcgY29ubmVjdGlvbiAqLwogICAgIGJ0X3N0YXR1c190ICgqZGlzY29ubmVjdCkoIGludCBjbGllbnRfaWYsIGNvbnN0IGJ0X2JkYWRkcl90ICpiZF9hZGRyLAogICAgICAgICAgICAgICAgICAgICBpbnQgY29ubl9pZCk7CiAKLSAgICAvKiogU3RhcnQgb3Igc3RvcCBhZHZlcnRpc2VtZW50cyB0byBsaXN0ZW4gZm9yIGluY29taW5nIGNvbm5lY3Rpb25zICovCi0gICAgYnRfc3RhdHVzX3QgKCpsaXN0ZW4pKGludCBjbGllbnRfaWYsIGJvb2wgc3RhcnQpOwotCiAgICAgLyoqIENsZWFyIHRoZSBhdHRyaWJ1dGUgY2FjaGUgZm9yIGEgZ2l2ZW4gZGV2aWNlICovCiAgICAgYnRfc3RhdHVzX3QgKCpyZWZyZXNoKSggaW50IGNsaWVudF9pZiwgY29uc3QgYnRfYmRhZGRyX3QgKmJkX2FkZHIgKTsKIApAQCAtMzA0LDE2ICsyMjksMTUgQEAKIAogICAgIC8qKiBXcml0ZSBhIHJlbW90ZSBjaGFyYWN0ZXJpc3RpYyAqLwogICAgIGJ0X3N0YXR1c190ICgqd3JpdGVfY2hhcmFjdGVyaXN0aWMpKGludCBjb25uX2lkLCB1aW50MTZfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgIGludCB3cml0ZV90eXBlLCBpbnQgbGVuLCBpbnQgYXV0aF9yZXEsCi0gICAgICAgICAgICAgICAgICAgIGNoYXIqIHBfdmFsdWUpOworICAgICAgICAgICAgICAgICAgICBpbnQgd3JpdGVfdHlwZSwgaW50IGF1dGhfcmVxLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2YWx1ZSk7CiAKICAgICAvKiogUmVhZCB0aGUgZGVzY3JpcHRvciBmb3IgYSBnaXZlbiBjaGFyYWN0ZXJpc3RpYyAqLwogICAgIGJ0X3N0YXR1c190ICgqcmVhZF9kZXNjcmlwdG9yKShpbnQgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLCBpbnQgYXV0aF9yZXEpOwogCiAgICAgLyoqIFdyaXRlIGEgcmVtb3RlIGRlc2NyaXB0b3IgZm9yIGEgZ2l2ZW4gY2hhcmFjdGVyaXN0aWMgKi8KICAgICBidF9zdGF0dXNfdCAoKndyaXRlX2Rlc2NyaXB0b3IpKCBpbnQgY29ubl9pZCwgdWludDE2X3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICBpbnQgd3JpdGVfdHlwZSwgaW50IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgaW50IGF1dGhfcmVxLCBjaGFyKiBwX3ZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXV0aF9yZXEsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlKTsKIAogICAgIC8qKiBFeGVjdXRlIGEgcHJlcGFyZWQgd3JpdGUgb3BlcmF0aW9uICovCiAgICAgYnRfc3RhdHVzX3QgKCpleGVjdXRlX3dyaXRlKShpbnQgY29ubl9pZCwgaW50IGV4ZWN1dGUpOwpAQCAtMzMyLDM0ICsyNTYsOSBAQAogICAgIC8qKiBSZXF1ZXN0IFJTU0kgZm9yIGEgZ2l2ZW4gcmVtb3RlIGRldmljZSAqLwogICAgIGJ0X3N0YXR1c190ICgqcmVhZF9yZW1vdGVfcnNzaSkoIGludCBjbGllbnRfaWYsIGNvbnN0IGJ0X2JkYWRkcl90ICpiZF9hZGRyKTsKIAotICAgIC8qKiBTZXR1cCBzY2FuIGZpbHRlciBwYXJhbXMgKi8KLSAgICBidF9zdGF0dXNfdCAoKnNjYW5fZmlsdGVyX3BhcmFtX3NldHVwKShidGdhdHRfZmlsdF9wYXJhbV9zZXR1cF90IGZpbHRfcGFyYW0pOwotCi0KLSAgICAvKiogQ29uZmlndXJlIGEgc2NhbiBmaWx0ZXIgY29uZGl0aW9uICAqLwotICAgIGJ0X3N0YXR1c190ICgqc2Nhbl9maWx0ZXJfYWRkX3JlbW92ZSkoaW50IGNsaWVudF9pZiwgaW50IGFjdGlvbiwgaW50IGZpbHRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbHRfaW5kZXgsIGludCBjb21wYW55X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tcGFueV9pZF9tYXNrLCBjb25zdCBidF91dWlkX3QgKnBfdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRfdXVpZF90ICpwX3V1aWRfbWFzaywgY29uc3QgYnRfYmRhZGRyX3QgKmJkX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYWRkcl90eXBlLCBpbnQgZGF0YV9sZW4sIGNoYXIqIHBfZGF0YSwgaW50IG1hc2tfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBwX21hc2spOwotCi0gICAgLyoqIENsZWFyIGFsbCBzY2FuIGZpbHRlciBjb25kaXRpb25zIGZvciBzcGVjaWZpYyBmaWx0ZXIgaW5kZXgqLwotICAgIGJ0X3N0YXR1c190ICgqc2Nhbl9maWx0ZXJfY2xlYXIpKGludCBjbGllbnRfaWYsIGludCBmaWx0X2luZGV4KTsKLQotICAgIC8qKiBFbmFibGUgLyBkaXNhYmxlIHNjYW4gZmlsdGVyIGZlYXR1cmUqLwotICAgIGJ0X3N0YXR1c190ICgqc2Nhbl9maWx0ZXJfZW5hYmxlKShpbnQgY2xpZW50X2lmLCBib29sIGVuYWJsZSk7Ci0KICAgICAvKiogRGV0ZXJtaW5lIHRoZSB0eXBlIG9mIHRoZSByZW1vdGUgZGV2aWNlIChMRSwgQlIvRURSLCBEdWFsLW1vZGUpICovCiAgICAgaW50ICgqZ2V0X2RldmljZV90eXBlKSggY29uc3QgYnRfYmRhZGRyX3QgKmJkX2FkZHIgKTsKIAotICAgIC8qKiBTZXQgdGhlIGFkdmVydGlzaW5nIGRhdGEgb3Igc2NhbiByZXNwb25zZSBkYXRhICovCi0gICAgYnRfc3RhdHVzX3QgKCpzZXRfYWR2X2RhdGEpKGludCBjbGllbnRfaWYsIGJvb2wgc2V0X3NjYW5fcnNwLCBib29sIGluY2x1ZGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlX3R4cG93ZXIsIGludCBtaW5faW50ZXJ2YWwsIGludCBtYXhfaW50ZXJ2YWwsIGludCBhcHBlYXJhbmNlLAotICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYW51ZmFjdHVyZXJfbGVuLCBjaGFyKiBtYW51ZmFjdHVyZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2VydmljZV9kYXRhX2xlbiwgY2hhciogc2VydmljZV9kYXRhLAotICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzZXJ2aWNlX3V1aWRfbGVuLCBjaGFyKiBzZXJ2aWNlX3V1aWQpOwotCiAgICAgLyoqIENvbmZpZ3VyZSB0aGUgTVRVIGZvciBhIGdpdmVuIGNvbm5lY3Rpb24gKi8KICAgICBidF9zdGF0dXNfdCAoKmNvbmZpZ3VyZV9tdHUpKGludCBjb25uX2lkLCBpbnQgbXR1KTsKIApAQCAtMzY3LDM5ICsyNjYsMTMgQEAKICAgICBidF9zdGF0dXNfdCAoKmNvbm5fcGFyYW1ldGVyX3VwZGF0ZSkoY29uc3QgYnRfYmRhZGRyX3QgKmJkX2FkZHIsIGludCBtaW5faW50ZXJ2YWwsCiAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfaW50ZXJ2YWwsIGludCBsYXRlbmN5LCBpbnQgdGltZW91dCk7CiAKLSAgICAvKiogU2V0cyB0aGUgTEUgc2NhbiBpbnRlcnZhbCBhbmQgd2luZG93IGluIHVuaXRzIG9mIE4qMC42MjUgbXNlYyAqLwotICAgIGJ0X3N0YXR1c190ICgqc2V0X3NjYW5fcGFyYW1ldGVycykoaW50IGNsaWVudF9pZiwgaW50IHNjYW5faW50ZXJ2YWwsIGludCBzY2FuX3dpbmRvdyk7CisgICAgYnRfc3RhdHVzX3QgKCpzZXRfcHJlZmVycmVkX3BoeSkoaW50IGNvbm5faWQsIHVpbnQ4X3QgdHhfcGh5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcnhfcGh5LCB1aW50MTZfdCBwaHlfb3B0aW9ucyk7CiAKLSAgICAvKiBTZXR1cCB0aGUgcGFyYW1ldGVycyBhcyBwZXIgc3BlYywgdXNlciBtYW51YWwgc3BlY2lmaWVkIHZhbHVlcyBhbmQgZW5hYmxlIG11bHRpIEFEViAqLwotICAgIGJ0X3N0YXR1c190ICgqbXVsdGlfYWR2X2VuYWJsZSkoaW50IGNsaWVudF9pZiwgaW50IG1pbl9pbnRlcnZhbCxpbnQgbWF4X2ludGVydmFsLGludCBhZHZfdHlwZSwKLSAgICAgICAgICAgICAgICAgaW50IGNobmxfbWFwLCBpbnQgdHhfcG93ZXIsIGludCB0aW1lb3V0X3MpOwotCi0gICAgLyogVXBkYXRlIHRoZSBwYXJhbWV0ZXJzIGFzIHBlciBzcGVjLCB1c2VyIG1hbnVhbCBzcGVjaWZpZWQgdmFsdWVzIGFuZCByZXN0YXJ0IG11bHRpIEFEViAqLwotICAgIGJ0X3N0YXR1c190ICgqbXVsdGlfYWR2X3VwZGF0ZSkoaW50IGNsaWVudF9pZiwgaW50IG1pbl9pbnRlcnZhbCxpbnQgbWF4X2ludGVydmFsLGludCBhZHZfdHlwZSwKLSAgICAgICAgICAgICAgICAgaW50IGNobmxfbWFwLCBpbnQgdHhfcG93ZXIsIGludCB0aW1lb3V0X3MpOwotCi0gICAgLyogU2V0dXAgdGhlIGRhdGEgZm9yIHRoZSBzcGVjaWZpZWQgaW5zdGFuY2UgKi8KLSAgICBidF9zdGF0dXNfdCAoKm11bHRpX2Fkdl9zZXRfaW5zdF9kYXRhKShpbnQgY2xpZW50X2lmLCBib29sIHNldF9zY2FuX3JzcCwgYm9vbCBpbmNsdWRlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbF90eHBvd2VyLCBpbnQgYXBwZWFyYW5jZSwgaW50IG1hbnVmYWN0dXJlcl9sZW4sCi0gICAgICAgICAgICAgICAgICAgIGNoYXIqIG1hbnVmYWN0dXJlcl9kYXRhLCBpbnQgc2VydmljZV9kYXRhX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgY2hhciogc2VydmljZV9kYXRhLCBpbnQgc2VydmljZV91dWlkX2xlbiwgY2hhciogc2VydmljZV91dWlkKTsKLQotICAgIC8qIERpc2FibGUgdGhlIG11bHRpIGFkdiBpbnN0YW5jZSAqLwotICAgIGJ0X3N0YXR1c190ICgqbXVsdGlfYWR2X2Rpc2FibGUpKGludCBjbGllbnRfaWYpOwotCi0gICAgLyogQ29uZmlndXJlIHRoZSBiYXRjaHNjYW4gc3RvcmFnZSAqLwotICAgIGJ0X3N0YXR1c190ICgqYmF0Y2hzY2FuX2NmZ19zdG9yYWdlKShpbnQgY2xpZW50X2lmLCBpbnQgYmF0Y2hfc2Nhbl9mdWxsX21heCwKLSAgICAgICAgaW50IGJhdGNoX3NjYW5fdHJ1bmNfbWF4LCBpbnQgYmF0Y2hfc2Nhbl9ub3RpZnlfdGhyZXNob2xkKTsKLQotICAgIC8qIEVuYWJsZSBiYXRjaHNjYW4gKi8KLSAgICBidF9zdGF0dXNfdCAoKmJhdGNoc2Nhbl9lbmJfYmF0Y2hfc2NhbikoaW50IGNsaWVudF9pZiwgaW50IHNjYW5fbW9kZSwKLSAgICAgICAgaW50IHNjYW5faW50ZXJ2YWwsIGludCBzY2FuX3dpbmRvdywgaW50IGFkZHJfdHlwZSwgaW50IGRpc2NhcmRfcnVsZSk7Ci0KLSAgICAvKiBEaXNhYmxlIGJhdGNoc2NhbiAqLwotICAgIGJ0X3N0YXR1c190ICgqYmF0Y2hzY2FuX2Rpc19iYXRjaF9zY2FuKShpbnQgY2xpZW50X2lmKTsKLQotICAgIC8qIFJlYWQgb3V0IGJhdGNoc2NhbiByZXBvcnRzICovCi0gICAgYnRfc3RhdHVzX3QgKCpiYXRjaHNjYW5fcmVhZF9yZXBvcnRzKShpbnQgY2xpZW50X2lmLCBpbnQgc2Nhbl9tb2RlKTsKKyAgICBidF9zdGF0dXNfdCAoKnJlYWRfcGh5KSgKKyAgICAgICAgaW50IGNvbm5faWQsCisgICAgICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQodWludDhfdCB0eF9waHksIHVpbnQ4X3QgcnhfcGh5LCB1aW50OF90IHN0YXR1cyk+CisgICAgICAgICAgICBjYik7CiAKICAgICAvKiogVGVzdCBtb2RlIGludGVyZmFjZSAqLwogICAgIGJ0X3N0YXR1c190ICgqdGVzdF9jb21tYW5kKSggaW50IGNvbW1hbmQsIGJ0Z2F0dF90ZXN0X3BhcmFtc190KiBwYXJhbXMpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS9idF9nYXR0X3NlcnZlci5oIGIvaW5jbHVkZS9oYXJkd2FyZS9idF9nYXR0X3NlcnZlci5oCmluZGV4IDBkNmNjMWUuLjM2MjU5YTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvYnRfZ2F0dF9zZXJ2ZXIuaAorKysgYi9pbmNsdWRlL2hhcmR3YXJlL2J0X2dhdHRfc2VydmVyLmgKQEAgLTE5LDYgKzE5LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9JTkNMVURFX0JUX0dBVFRfU0VSVkVSX0gKIAogI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgImJ0X2dhdHRfdHlwZXMuaCIKIApAQCAtNTMsMjMgKzU0LDcgQEAKIAogLyoqIENhbGxiYWNrIGludm9rZWQgaW4gcmVzcG9uc2UgdG8gY3JlYXRlX3NlcnZpY2UgKi8KIHR5cGVkZWYgdm9pZCAoKnNlcnZpY2VfYWRkZWRfY2FsbGJhY2spKGludCBzdGF0dXMsIGludCBzZXJ2ZXJfaWYsCi0gICAgICAgICAgICAgICAgYnRnYXR0X3NydmNfaWRfdCAqc3J2Y19pZCwgaW50IHNydmNfaGFuZGxlKTsKLQotLyoqIENhbGxiYWNrIGluZGljYXRpbmcgdGhhdCBhbiBpbmNsdWRlZCBzZXJ2aWNlIGhhcyBiZWVuIGFkZGVkIHRvIGEgc2VydmljZSAqLwotdHlwZWRlZiB2b2lkICgqaW5jbHVkZWRfc2VydmljZV9hZGRlZF9jYWxsYmFjaykoaW50IHN0YXR1cywgaW50IHNlcnZlcl9pZiwKLSAgICAgICAgICAgICAgICBpbnQgc3J2Y19oYW5kbGUsIGludCBpbmNsX3NydmNfaGFuZGxlKTsKLQotLyoqIENhbGxiYWNrIGludm9rZWQgd2hlbiBhIGNoYXJhY3RlcmlzdGljIGhhcyBiZWVuIGFkZGVkIHRvIGEgc2VydmljZSAqLwotdHlwZWRlZiB2b2lkICgqY2hhcmFjdGVyaXN0aWNfYWRkZWRfY2FsbGJhY2spKGludCBzdGF0dXMsIGludCBzZXJ2ZXJfaWYsCi0gICAgICAgICAgICAgICAgYnRfdXVpZF90ICp1dWlkLCBpbnQgc3J2Y19oYW5kbGUsIGludCBjaGFyX2hhbmRsZSk7Ci0KLS8qKiBDYWxsYmFjayBpbnZva2VkIHdoZW4gYSBkZXNjcmlwdG9yIGhhcyBiZWVuIGFkZGVkIHRvIGEgY2hhcmFjdGVyaXN0aWMgKi8KLXR5cGVkZWYgdm9pZCAoKmRlc2NyaXB0b3JfYWRkZWRfY2FsbGJhY2spKGludCBzdGF0dXMsIGludCBzZXJ2ZXJfaWYsCi0gICAgICAgICAgICAgICAgYnRfdXVpZF90ICp1dWlkLCBpbnQgc3J2Y19oYW5kbGUsIGludCBkZXNjcl9oYW5kbGUpOwotCi0vKiogQ2FsbGJhY2sgaW52b2tlZCBpbiByZXNwb25zZSB0byBzdGFydF9zZXJ2aWNlICovCi10eXBlZGVmIHZvaWQgKCpzZXJ2aWNlX3N0YXJ0ZWRfY2FsbGJhY2spKGludCBzdGF0dXMsIGludCBzZXJ2ZXJfaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcnZjX2hhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxidGdhdHRfZGJfZWxlbWVudF90PiBzZXJ2aWNlKTsKIAogLyoqIENhbGxiYWNrIGludm9rZWQgaW4gcmVzcG9uc2UgdG8gc3RvcF9zZXJ2aWNlICovCiB0eXBlZGVmIHZvaWQgKCpzZXJ2aWNlX3N0b3BwZWRfY2FsbGJhY2spKGludCBzdGF0dXMsIGludCBzZXJ2ZXJfaWYsCkBAIC05MSw4ICs3Niw4IEBACiAgKiBjaGFyYWN0ZXJpc3RpYyBvciBkZXNjcmlwdG9yLgogICovCiB0eXBlZGVmIHZvaWQgKCpyZXF1ZXN0X3dyaXRlX2NhbGxiYWNrKShpbnQgY29ubl9pZCwgaW50IHRyYW5zX2lkLCBidF9iZGFkZHJfdCAqYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF0dHJfaGFuZGxlLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkX3JzcCwgYm9vbCBpc19wcmVwLCB1aW50OF90KiB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXR0cl9oYW5kbGUsIGludCBvZmZzZXQsIGJvb2wgbmVlZF9yc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByZXAsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlKTsKIAogLyoqIENhbGxiYWNrIGludm9rZWQgd2hlbiBhIHByZXZpb3VzbHkgcHJlcGFyZWQgd3JpdGUgaXMgdG8gYmUgZXhlY3V0ZWQgKi8KIHR5cGVkZWYgdm9pZCAoKnJlcXVlc3RfZXhlY193cml0ZV9jYWxsYmFjaykoaW50IGNvbm5faWQsIGludCB0cmFuc19pZCwKQEAgLTEyMCwyMyArMTA1LDMxIEBACiAvKiogQ2FsbGJhY2sgaW52b2tlZCB3aGVuIHRoZSBNVFUgZm9yIGEgZ2l2ZW4gY29ubmVjdGlvbiBjaGFuZ2VzICovCiB0eXBlZGVmIHZvaWQgKCptdHVfY2hhbmdlZF9jYWxsYmFjaykoaW50IGNvbm5faWQsIGludCBtdHUpOwogCisvKiogQ2FsbGJhY2sgaW52b2tlZCB3aGVuIHRoZSBQSFkgZm9yIGEgZ2l2ZW4gY29ubmVjdGlvbiBjaGFuZ2VzICovCit0eXBlZGVmIHZvaWQgKCpwaHlfdXBkYXRlZF9jYWxsYmFjaykoaW50IGNvbm5faWQsIHVpbnQ4X3QgdHhfcGh5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcnhfcGh5LCB1aW50OF90IHN0YXR1cyk7CisKKy8qKiBDYWxsYmFjayBpbnZva2VkIHdoZW4gdGhlIGNvbm5lY3Rpb24gcGFyYW1ldGVycyBmb3IgYSBnaXZlbiBjb25uZWN0aW9uIGNoYW5nZXMgKi8KK3R5cGVkZWYgdm9pZCAoKmNvbm5fdXBkYXRlZF9jYWxsYmFjaykoaW50IGNvbm5faWQsIHVpbnQxNl90IGludGVydmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsYXRlbmN5LCB1aW50MTZfdCB0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHN0YXR1cyk7CiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgcmVnaXN0ZXJfc2VydmVyX2NhbGxiYWNrICAgICAgICByZWdpc3Rlcl9zZXJ2ZXJfY2I7CiAgICAgY29ubmVjdGlvbl9jYWxsYmFjayAgICAgICAgICAgICBjb25uZWN0aW9uX2NiOwogICAgIHNlcnZpY2VfYWRkZWRfY2FsbGJhY2sgICAgICAgICAgc2VydmljZV9hZGRlZF9jYjsKLSAgICBpbmNsdWRlZF9zZXJ2aWNlX2FkZGVkX2NhbGxiYWNrIGluY2x1ZGVkX3NlcnZpY2VfYWRkZWRfY2I7Ci0gICAgY2hhcmFjdGVyaXN0aWNfYWRkZWRfY2FsbGJhY2sgICBjaGFyYWN0ZXJpc3RpY19hZGRlZF9jYjsKLSAgICBkZXNjcmlwdG9yX2FkZGVkX2NhbGxiYWNrICAgICAgIGRlc2NyaXB0b3JfYWRkZWRfY2I7Ci0gICAgc2VydmljZV9zdGFydGVkX2NhbGxiYWNrICAgICAgICBzZXJ2aWNlX3N0YXJ0ZWRfY2I7CiAgICAgc2VydmljZV9zdG9wcGVkX2NhbGxiYWNrICAgICAgICBzZXJ2aWNlX3N0b3BwZWRfY2I7CiAgICAgc2VydmljZV9kZWxldGVkX2NhbGxiYWNrICAgICAgICBzZXJ2aWNlX2RlbGV0ZWRfY2I7Ci0gICAgcmVxdWVzdF9yZWFkX2NhbGxiYWNrICAgICAgICAgICByZXF1ZXN0X3JlYWRfY2I7Ci0gICAgcmVxdWVzdF93cml0ZV9jYWxsYmFjayAgICAgICAgICByZXF1ZXN0X3dyaXRlX2NiOworICAgIHJlcXVlc3RfcmVhZF9jYWxsYmFjayAgICAgICAgICAgcmVxdWVzdF9yZWFkX2NoYXJhY3RlcmlzdGljX2NiOworICAgIHJlcXVlc3RfcmVhZF9jYWxsYmFjayAgICAgICAgICAgcmVxdWVzdF9yZWFkX2Rlc2NyaXB0b3JfY2I7CisgICAgcmVxdWVzdF93cml0ZV9jYWxsYmFjayAgICAgICAgICByZXF1ZXN0X3dyaXRlX2NoYXJhY3RlcmlzdGljX2NiOworICAgIHJlcXVlc3Rfd3JpdGVfY2FsbGJhY2sgICAgICAgICAgcmVxdWVzdF93cml0ZV9kZXNjcmlwdG9yX2NiOwogICAgIHJlcXVlc3RfZXhlY193cml0ZV9jYWxsYmFjayAgICAgcmVxdWVzdF9leGVjX3dyaXRlX2NiOwogICAgIHJlc3BvbnNlX2NvbmZpcm1hdGlvbl9jYWxsYmFjayAgcmVzcG9uc2VfY29uZmlybWF0aW9uX2NiOwogICAgIGluZGljYXRpb25fc2VudF9jYWxsYmFjayAgICAgICAgaW5kaWNhdGlvbl9zZW50X2NiOwogICAgIGNvbmdlc3Rpb25fY2FsbGJhY2sgICAgICAgICAgICAgY29uZ2VzdGlvbl9jYjsKICAgICBtdHVfY2hhbmdlZF9jYWxsYmFjayAgICAgICAgICAgIG10dV9jaGFuZ2VkX2NiOworICAgIHBoeV91cGRhdGVkX2NhbGxiYWNrICAgICAgICAgICAgcGh5X3VwZGF0ZWRfY2I7CisgICAgY29ubl91cGRhdGVkX2NhbGxiYWNrICAgICAgICAgICBjb25uX3VwZGF0ZWRfY2I7CiB9IGJ0Z2F0dF9zZXJ2ZXJfY2FsbGJhY2tzX3Q7CiAKIC8qKiBSZXByZXNlbnRzIHRoZSBzdGFuZGFyZCBCVC1HQVRUIHNlcnZlciBpbnRlcmZhY2UuICovCkBAIC0xNTYsMjMgKzE0OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGludCBjb25uX2lkICk7CiAKICAgICAvKiogQ3JlYXRlIGEgbmV3IHNlcnZpY2UgKi8KLSAgICBidF9zdGF0dXNfdCAoKmFkZF9zZXJ2aWNlKSggaW50IHNlcnZlcl9pZiwgYnRnYXR0X3NydmNfaWRfdCAqc3J2Y19pZCwgaW50IG51bV9oYW5kbGVzKTsKLQotICAgIC8qKiBBc3NpZ24gYW4gaW5jbHVkZWQgc2VydmljZSB0byBpdCdzIHBhcmVudCBzZXJ2aWNlICovCi0gICAgYnRfc3RhdHVzX3QgKCphZGRfaW5jbHVkZWRfc2VydmljZSkoIGludCBzZXJ2ZXJfaWYsIGludCBzZXJ2aWNlX2hhbmRsZSwgaW50IGluY2x1ZGVkX2hhbmRsZSk7Ci0KLSAgICAvKiogQWRkIGEgY2hhcmFjdGVyaXN0aWMgdG8gYSBzZXJ2aWNlICovCi0gICAgYnRfc3RhdHVzX3QgKCphZGRfY2hhcmFjdGVyaXN0aWMpKCBpbnQgc2VydmVyX2lmLAotICAgICAgICAgICAgICAgICAgICBpbnQgc2VydmljZV9oYW5kbGUsIGJ0X3V1aWRfdCAqdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgaW50IHByb3BlcnRpZXMsIGludCBwZXJtaXNzaW9ucyk7Ci0KLSAgICAvKiogQWRkIGEgZGVzY3JpcHRvciB0byBhIGdpdmVuIHNlcnZpY2UgKi8KLSAgICBidF9zdGF0dXNfdCAoKmFkZF9kZXNjcmlwdG9yKShpbnQgc2VydmVyX2lmLCBpbnQgc2VydmljZV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRfdXVpZF90ICp1dWlkLCBpbnQgcGVybWlzc2lvbnMpOwotCi0gICAgLyoqIFN0YXJ0cyBhIGxvY2FsIHNlcnZpY2UgKi8KLSAgICBidF9zdGF0dXNfdCAoKnN0YXJ0X3NlcnZpY2UpKGludCBzZXJ2ZXJfaWYsIGludCBzZXJ2aWNlX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuc3BvcnQpOworICAgIGJ0X3N0YXR1c190ICgqYWRkX3NlcnZpY2UpKGludCBzZXJ2ZXJfaWYsIHN0ZDo6dmVjdG9yPGJ0Z2F0dF9kYl9lbGVtZW50X3Q+IHNlcnZpY2UpOwogCiAgICAgLyoqIFN0b3BzIGEgbG9jYWwgc2VydmljZSAqLwogICAgIGJ0X3N0YXR1c190ICgqc3RvcF9zZXJ2aWNlKShpbnQgc2VydmVyX2lmLCBpbnQgc2VydmljZV9oYW5kbGUpOwpAQCAtMTgyLDEzICsxNTksMjEgQEAKIAogICAgIC8qKiBTZW5kIHZhbHVlIGluZGljYXRpb24gdG8gYSByZW1vdGUgZGV2aWNlICovCiAgICAgYnRfc3RhdHVzX3QgKCpzZW5kX2luZGljYXRpb24pKGludCBzZXJ2ZXJfaWYsIGludCBhdHRyaWJ1dGVfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29ubl9pZCwgaW50IGxlbiwgaW50IGNvbmZpcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIHBfdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29ubl9pZCwgaW50IGNvbmZpcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlKTsKIAogICAgIC8qKiBTZW5kIGEgcmVzcG9uc2UgdG8gYSByZWFkL3dyaXRlIG9wZXJhdGlvbiAqLwogICAgIGJ0X3N0YXR1c190ICgqc2VuZF9yZXNwb25zZSkoaW50IGNvbm5faWQsIGludCB0cmFuc19pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGF0dXMsIGJ0Z2F0dF9yZXNwb25zZV90ICpyZXNwb25zZSk7CiAKKyAgICBidF9zdGF0dXNfdCAoKnNldF9wcmVmZXJyZWRfcGh5KShpbnQgY29ubl9pZCwgdWludDhfdCB0eF9waHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByeF9waHksIHVpbnQxNl90IHBoeV9vcHRpb25zKTsKKworICAgIGJ0X3N0YXR1c190ICgqcmVhZF9waHkpKAorICAgICAgICBpbnQgY29ubl9pZCwKKyAgICAgICAgYmFzZTo6Q2FsbGJhY2s8dm9pZCh1aW50OF90IHR4X3BoeSwgdWludDhfdCByeF9waHksIHVpbnQ4X3Qgc3RhdHVzKT4KKyAgICAgICAgICAgIGNiKTsKKwogfSBidGdhdHRfc2VydmVyX2ludGVyZmFjZV90OwogCiBfX0VORF9ERUNMUwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS9idF9oZC5oIGIvaW5jbHVkZS9oYXJkd2FyZS9idF9oZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2M2YyOWYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2hhcmR3YXJlL2J0X2hkLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSU5DTFVERV9CVF9IRF9ICisjZGVmaW5lIEFORFJPSURfSU5DTFVERV9CVF9IRF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworX19CRUdJTl9ERUNMUworCit0eXBlZGVmIGVudW0KK3sKKyAgICBCVEhEX1JFUE9SVF9UWVBFX09USEVSID0gMCwKKyAgICBCVEhEX1JFUE9SVF9UWVBFX0lOUFVULAorICAgIEJUSERfUkVQT1JUX1RZUEVfT1VUUFVULAorICAgIEJUSERfUkVQT1JUX1RZUEVfRkVBVFVSRSwKKyAgICBCVEhEX1JFUE9SVF9UWVBFX0lOVFJEQVRBIC8vIHNwZWNpYWwgdmFsdWUgZm9yIHJlcG9ydHMgdG8gYmUgc2VudCBvbiBJTlRSIChJTlBVVCBpcyBhc3N1bWVkKQorfSBidGhkX3JlcG9ydF90eXBlX3Q7CisKK3R5cGVkZWYgZW51bQoreworICAgIEJUSERfQVBQX1NUQVRFX05PVF9SRUdJU1RFUkVELAorICAgIEJUSERfQVBQX1NUQVRFX1JFR0lTVEVSRUQKK30gYnRoZF9hcHBsaWNhdGlvbl9zdGF0ZV90OworCit0eXBlZGVmIGVudW0KK3sKKyAgICBCVEhEX0NPTk5fU1RBVEVfQ09OTkVDVEVELAorICAgIEJUSERfQ09OTl9TVEFURV9DT05ORUNUSU5HLAorICAgIEJUSERfQ09OTl9TVEFURV9ESVNDT05ORUNURUQsCisgICAgQlRIRF9DT05OX1NUQVRFX0RJU0NPTk5FQ1RJTkcsCisgICAgQlRIRF9DT05OX1NUQVRFX1VOS05PV04KK30gYnRoZF9jb25uZWN0aW9uX3N0YXRlX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgY29uc3QgY2hhciAgICAgICpuYW1lOworICAgIGNvbnN0IGNoYXIgICAgICAqZGVzY3JpcHRpb247CisgICAgY29uc3QgY2hhciAgICAgICpwcm92aWRlcjsKKyAgICB1aW50OF90ICAgICAgICAgc3ViY2xhc3M7CisgICAgdWludDhfdCAgICAgICAgICpkZXNjX2xpc3Q7CisgICAgaW50ICAgICAgICAgICAgIGRlc2NfbGlzdF9sZW47Cit9IGJ0aGRfYXBwX3BhcmFtX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDhfdCAgc2VydmljZV90eXBlOworICAgIHVpbnQzMl90IHRva2VuX3JhdGU7CisgICAgdWludDMyX3QgdG9rZW5fYnVja2V0X3NpemU7CisgICAgdWludDMyX3QgcGVha19iYW5kd2lkdGg7CisgICAgdWludDMyX3QgYWNjZXNzX2xhdGVuY3k7CisgICAgdWludDMyX3QgZGVsYXlfdmFyaWF0aW9uOworfSBidGhkX3Fvc19wYXJhbV90OworCit0eXBlZGVmIHZvaWQgKCogYnRoZF9hcHBsaWNhdGlvbl9zdGF0ZV9jYWxsYmFjaykoYnRfYmRhZGRyX3QgKmJkX2FkZHIsIGJ0aGRfYXBwbGljYXRpb25fc3RhdGVfdCBzdGF0ZSk7Cit0eXBlZGVmIHZvaWQgKCogYnRoZF9jb25uZWN0aW9uX3N0YXRlX2NhbGxiYWNrKShidF9iZGFkZHJfdCAqYmRfYWRkciwgYnRoZF9jb25uZWN0aW9uX3N0YXRlX3Qgc3RhdGUpOwordHlwZWRlZiB2b2lkICgqIGJ0aGRfZ2V0X3JlcG9ydF9jYWxsYmFjaykodWludDhfdCB0eXBlLCB1aW50OF90IGlkLCB1aW50MTZfdCBidWZmZXJfc2l6ZSk7Cit0eXBlZGVmIHZvaWQgKCogYnRoZF9zZXRfcmVwb3J0X2NhbGxiYWNrKSh1aW50OF90IHR5cGUsIHVpbnQ4X3QgaWQsIHVpbnQxNl90IGxlbiwgdWludDhfdCAqcF9kYXRhKTsKK3R5cGVkZWYgdm9pZCAoKiBidGhkX3NldF9wcm90b2NvbF9jYWxsYmFjaykodWludDhfdCBwcm90b2NvbCk7Cit0eXBlZGVmIHZvaWQgKCogYnRoZF9pbnRyX2RhdGFfY2FsbGJhY2spKHVpbnQ4X3QgcmVwb3J0X2lkLCB1aW50MTZfdCBsZW4sIHVpbnQ4X3QgKnBfZGF0YSk7Cit0eXBlZGVmIHZvaWQgKCogYnRoZF92Y191bnBsdWdfY2FsbGJhY2spKHZvaWQpOworCisvKiogQlQtSEQgY2FsbGJhY2tzICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgc2l6ZV90ICAgICAgc2l6ZTsKKworICAgIGJ0aGRfYXBwbGljYXRpb25fc3RhdGVfY2FsbGJhY2sgYXBwbGljYXRpb25fc3RhdGVfY2I7CisgICAgYnRoZF9jb25uZWN0aW9uX3N0YXRlX2NhbGxiYWNrICBjb25uZWN0aW9uX3N0YXRlX2NiOworICAgIGJ0aGRfZ2V0X3JlcG9ydF9jYWxsYmFjayAgICAgICAgZ2V0X3JlcG9ydF9jYjsKKyAgICBidGhkX3NldF9yZXBvcnRfY2FsbGJhY2sgICAgICAgIHNldF9yZXBvcnRfY2I7CisgICAgYnRoZF9zZXRfcHJvdG9jb2xfY2FsbGJhY2sgICAgICBzZXRfcHJvdG9jb2xfY2I7CisgICAgYnRoZF9pbnRyX2RhdGFfY2FsbGJhY2sgICAgICAgICBpbnRyX2RhdGFfY2I7CisgICAgYnRoZF92Y191bnBsdWdfY2FsbGJhY2sgICAgICAgICB2Y191bnBsdWdfY2I7Cit9IGJ0aGRfY2FsbGJhY2tzX3Q7CisKKy8qKiBCVC1IRCBpbnRlcmZhY2UgKi8KK3R5cGVkZWYgc3RydWN0IHsKKworICAgIHNpemVfdCAgICAgICAgICBzaXplOworCisgICAgLyoqIGluaXQgaW50ZXJmYWNlIGFuZCByZWdpc3RlciBjYWxsYmFja3MgKi8KKyAgICBidF9zdGF0dXNfdCAoKmluaXQpKGJ0aGRfY2FsbGJhY2tzX3QqIGNhbGxiYWNrcyk7CisKKyAgICAvKiogY2xvc2UgaW50ZXJmYWNlICovCisgICAgdm9pZCAgKCpjbGVhbnVwKSh2b2lkKTsKKworICAgIC8qKiByZWdpc3RlciBhcHBsaWNhdGlvbiAqLworICAgIGJ0X3N0YXR1c190ICgqcmVnaXN0ZXJfYXBwKShidGhkX2FwcF9wYXJhbV90ICphcHBfcGFyYW0sIGJ0aGRfcW9zX3BhcmFtX3QgKmluX3FvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRoZF9xb3NfcGFyYW1fdCAqb3V0X3Fvcyk7CisKKyAgICAvKiogdW5yZWdpc3RlciBhcHBsaWNhdGlvbiAqLworICAgIGJ0X3N0YXR1c190ICgqdW5yZWdpc3Rlcl9hcHApKHZvaWQpOworCisgICAgLyoqIGNvbm5lY3RzIHRvIGhvc3Qgd2l0aCB2aXJ0dWFsIGNhYmxlICovCisgICAgYnRfc3RhdHVzX3QgKCpjb25uZWN0KShidF9iZGFkZHJfdCAqYmRfYWRkcik7CisKKyAgICAvKiogZGlzY29ubmVjdHMgZnJvbSBjdXJyZW50bHkgY29ubmVjdGVkIGhvc3QgKi8KKyAgICBidF9zdGF0dXNfdCAoKmRpc2Nvbm5lY3QpKHZvaWQpOworCisgICAgLyoqIHNlbmQgcmVwb3J0ICovCisgICAgYnRfc3RhdHVzX3QgKCpzZW5kX3JlcG9ydCkoYnRoZF9yZXBvcnRfdHlwZV90IHR5cGUsIHVpbnQ4X3QgaWQsIHVpbnQxNl90IGxlbiwgdWludDhfdCAqcF9kYXRhKTsKKworICAgIC8qKiBub3RpZmllcyBlcnJvciBmb3IgaW52YWxpZCBTRVRfUkVQT1JUICovCisgICAgYnRfc3RhdHVzX3QgKCpyZXBvcnRfZXJyb3IpKHVpbnQ4X3QgZXJyb3IpOworCisgICAgLyoqIHNlbmQgVmlydHVhbCBDYWJsZSBVbnBsdWcgICovCisgICAgYnRfc3RhdHVzX3QgKCp2aXJ0dWFsX2NhYmxlX3VucGx1Zykodm9pZCk7CisKK30gYnRoZF9pbnRlcmZhY2VfdDsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIEFORFJPSURfSU5DTFVERV9CVF9IRF9IICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvYnRfaGYuaCBiL2luY2x1ZGUvaGFyZHdhcmUvYnRfaGYuaAppbmRleCAwYTc3Njc1Li44OTJmYmRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2hhcmR3YXJlL2J0X2hmLmgKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS9idF9oZi5oCkBAIC0yNTIsNyArMjUyLDcgQEAKICAgICAvKioKICAgICAgKiBSZWdpc3RlciB0aGUgQnRIZiBjYWxsYmFja3MKICAgICAgKi8KLSAgICBidF9zdGF0dXNfdCAoKmluaXQpKCBidGhmX2NhbGxiYWNrc190KiBjYWxsYmFja3MsIGludCBtYXhfaGZfY2xpZW50cyk7CisgICAgYnRfc3RhdHVzX3QgKCppbml0KSggYnRoZl9jYWxsYmFja3NfdCogY2FsbGJhY2tzLCBpbnQgbWF4X2hmX2NsaWVudHMsIGJvb2wgaW5iYW5kX3Jpbmdpbmdfc3VwcG9ydGVkKTsKIAogICAgIC8qKiBjb25uZWN0IHRvIGhlYWRzZXQgKi8KICAgICBidF9zdGF0dXNfdCAoKmNvbm5lY3QpKCBidF9iZGFkZHJfdCAqYmRfYWRkciApOwpAQCAtMjk1LDcgKzI5NSw3IEBACiAgICAgICovCiAgICAgYnRfc3RhdHVzX3QgKCphdF9yZXNwb25zZSkgKGJ0aGZfYXRfcmVzcG9uc2VfdCByZXNwb25zZV9jb2RlLCBpbnQgZXJyb3JfY29kZSwgYnRfYmRhZGRyX3QgKmJkX2FkZHIgKTsKIAotICAgIC8qKiByZXNwb25zZSBmb3IgQ0xDQyBjb21tYW5kIAorICAgIC8qKiByZXNwb25zZSBmb3IgQ0xDQyBjb21tYW5kCiAgICAgICogIENhbiBiZSBpdGVyYXRpdmVseSBjYWxsZWQgZm9yIGVhY2ggY2FsbCBpbmRleAogICAgICAqICBDYWxsIGluZGV4IG9mIDAgd2lsbCBiZSB0cmVhdGVkIGFzIE5VTEwgdGVybWluYXRpb24gKENvbXBsZXRlcyByZXNwb25zZSkKICAgICAgKi8KQEAgLTMwNSw3ICszMDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGhmX2NhbGxfYWRkcnR5cGVfdCB0eXBlLCBidF9iZGFkZHJfdCAqYmRfYWRkciApOwogCiAgICAgLyoqIG5vdGlmeSBvZiBhIGNhbGwgc3RhdGUgY2hhbmdlCi0gICAgICogIEVhY2ggdXBkYXRlIG5vdGlmaWVzIAorICAgICAqICBFYWNoIHVwZGF0ZSBub3RpZmllcwogICAgICAqICAgIDEuIE51bWJlciBvZiBhY3RpdmUvaGVsZC9yaW5naW5nIGNhbGxzCiAgICAgICogICAgMi4gY2FsbF9zdGF0ZTogVGhpcyBkZW5vdGVzIHRoZSBzdGF0ZSBjaGFuZ2UgdGhhdCB0cmlnZ2VyZWQgdGhpcyBtc2cKICAgICAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHdpbGwgdGFrZSBvbmUgb2YgdGhlIHZhbHVlcyBmcm9tIEJ0SGZDYWxsU3RhdGUKQEAgLTMxNyw3ICszMTcsNyBAQAogICAgIC8qKiBDbG9zZXMgdGhlIGludGVyZmFjZS4gKi8KICAgICB2b2lkICAoKmNsZWFudXApKCB2b2lkICk7CiAKLSAgICAvKiogY29uZmlndXJlYXRpb24gZm9yIHRoZSBTQ08gY29kZWMgKi8KKyAgICAvKiogY29uZmlndXJhdGlvbiBmb3IgdGhlIFNDTyBjb2RlYyAqLwogICAgIGJ0X3N0YXR1c190ICgqY29uZmlndXJlX3dicykoIGJ0X2JkYWRkcl90ICpiZF9hZGRyICxidGhmX3dic19jb25maWdfdCBjb25maWcgKTsKIAogICAgIC8qKiBSZXNwb25zZSBmb3IgSEYgSW5kaWNhdG9yIGNoYW5nZSAoK0JJTkQpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2J0X2hmX2NsaWVudC5oIGIvaW5jbHVkZS9oYXJkd2FyZS9idF9oZl9jbGllbnQuaAppbmRleCA4YWNmMWIyLi5iNzI4YmUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2hhcmR3YXJlL2J0X2hmX2NsaWVudC5oCisrKyBiL2luY2x1ZGUvaGFyZHdhcmUvYnRfaGZfY2xpZW50LmgKQEAgLTE2NywxMDQgKzE2NywxMjAgQEAKICAqICBzdGF0ZSB3aWxsIGhhdmUgb25lIG9mIHRoZSB2YWx1ZXMgZnJvbSBCdEhmQ29ubmVjdGlvblN0YXRlCiAgKiAgcGVlci9jaGxkX2ZlYXR1cmVzIGFyZSB2YWxpZCBvbmx5IGZvciBCVEhGX0NMSUVOVF9DT05ORUNUSU9OX1NUQVRFX1NMQ19DT05ORUNURUQgc3RhdGUKICAqLwotdHlwZWRlZiB2b2lkICgqIGJ0aGZfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGVfY2FsbGJhY2spKGJ0aGZfY2xpZW50X2Nvbm5lY3Rpb25fc3RhdGVfdCBzdGF0ZSwKK3R5cGVkZWYgdm9pZCAoKiBidGhmX2NsaWVudF9jb25uZWN0aW9uX3N0YXRlX2NhbGxiYWNrKShjb25zdCBidF9iZGFkZHJfdCAqYmRfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGhmX2NsaWVudF9jb25uZWN0aW9uX3N0YXRlX3Qgc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHBlZXJfZmVhdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY2hsZF9mZWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X2JkYWRkcl90ICpiZF9hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY2hsZF9mZWF0KTsKIAogLyoqIENhbGxiYWNrIGZvciBhdWRpbyBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZS4KICAqICBzdGF0ZSB3aWxsIGhhdmUgb25lIG9mIHRoZSB2YWx1ZXMgZnJvbSBCdEhmQXVkaW9TdGF0ZQogICovCi10eXBlZGVmIHZvaWQgKCogYnRoZl9jbGllbnRfYXVkaW9fc3RhdGVfY2FsbGJhY2spKGJ0aGZfY2xpZW50X2F1ZGlvX3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0X2JkYWRkcl90ICpiZF9hZGRyKTsKK3R5cGVkZWYgdm9pZCAoKiBidGhmX2NsaWVudF9hdWRpb19zdGF0ZV9jYWxsYmFjaykoY29uc3QgYnRfYmRhZGRyX3QgKmJkX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aGZfY2xpZW50X2F1ZGlvX3N0YXRlX3Qgc3RhdGUpOwogCiAvKiogQ2FsbGJhY2sgZm9yIFZSIGNvbm5lY3Rpb24gc3RhdGUgY2hhbmdlLgogICogIHN0YXRlIHdpbGwgaGF2ZSBvbmUgb2YgdGhlIHZhbHVlcyBmcm9tIEJ0SGZWUlN0YXRlCiAgKi8KLXR5cGVkZWYgdm9pZCAoKiBidGhmX2NsaWVudF92cl9jbWRfY2FsbGJhY2spKGJ0aGZfY2xpZW50X3ZyX3N0YXRlX3Qgc3RhdGUpOwordHlwZWRlZiB2b2lkICgqIGJ0aGZfY2xpZW50X3ZyX2NtZF9jYWxsYmFjaykoY29uc3QgYnRfYmRhZGRyX3QgKmJkX2FkZHIsIGJ0aGZfY2xpZW50X3ZyX3N0YXRlX3Qgc3RhdGUpOwogCiAvKiogQ2FsbGJhY2sgZm9yIG5ldHdvcmsgc3RhdGUgY2hhbmdlCiAgKi8KLXR5cGVkZWYgdm9pZCAoKiBidGhmX2NsaWVudF9uZXR3b3JrX3N0YXRlX2NhbGxiYWNrKSAoYnRoZl9jbGllbnRfbmV0d29ya19zdGF0ZV90IHN0YXRlKTsKK3R5cGVkZWYgdm9pZCAoKiBidGhmX2NsaWVudF9uZXR3b3JrX3N0YXRlX2NhbGxiYWNrKSAoY29uc3QgYnRfYmRhZGRyX3QgKmJkX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aGZfY2xpZW50X25ldHdvcmtfc3RhdGVfdCBzdGF0ZSk7CiAKIC8qKiBDYWxsYmFjayBmb3IgbmV0d29yayByb2FtaW5nIHN0YXR1cyBjaGFuZ2UKICAqLwotdHlwZWRlZiB2b2lkICgqIGJ0aGZfY2xpZW50X25ldHdvcmtfcm9hbWluZ19jYWxsYmFjaykgKGJ0aGZfY2xpZW50X3NlcnZpY2VfdHlwZV90IHR5cGUpOwordHlwZWRlZiB2b2lkICgqIGJ0aGZfY2xpZW50X25ldHdvcmtfcm9hbWluZ19jYWxsYmFjaykgKGNvbnN0IGJ0X2JkYWRkcl90ICpiZF9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aGZfY2xpZW50X3NlcnZpY2VfdHlwZV90IHR5cGUpOwogCiAvKiogQ2FsbGJhY2sgZm9yIHNpZ25hbCBzdHJlbmd0aCBpbmRpY2F0aW9uCiAgKi8KLXR5cGVkZWYgdm9pZCAoKiBidGhmX2NsaWVudF9uZXR3b3JrX3NpZ25hbF9jYWxsYmFjaykgKGludCBzaWduYWxfc3RyZW5ndGgpOwordHlwZWRlZiB2b2lkICgqIGJ0aGZfY2xpZW50X25ldHdvcmtfc2lnbmFsX2NhbGxiYWNrKSAoY29uc3QgYnRfYmRhZGRyX3QgKmJkX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2lnbmFsX3N0cmVuZ3RoKTsKIAogLyoqIENhbGxiYWNrIGZvciBiYXR0ZXJ5IGxldmVsIGluZGljYXRpb24KICAqLwotdHlwZWRlZiB2b2lkICgqIGJ0aGZfY2xpZW50X2JhdHRlcnlfbGV2ZWxfY2FsbGJhY2spIChpbnQgYmF0dGVyeV9sZXZlbCk7Cit0eXBlZGVmIHZvaWQgKCogYnRoZl9jbGllbnRfYmF0dGVyeV9sZXZlbF9jYWxsYmFjaykgKGNvbnN0IGJ0X2JkYWRkcl90ICpiZF9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmF0dGVyeV9sZXZlbCk7CiAKIC8qKiBDYWxsYmFjayBmb3IgY3VycmVudCBvcGVyYXRvciBuYW1lCiAgKi8KLXR5cGVkZWYgdm9pZCAoKiBidGhmX2NsaWVudF9jdXJyZW50X29wZXJhdG9yX2NhbGxiYWNrKSAoY29uc3QgY2hhciAqbmFtZSk7Cit0eXBlZGVmIHZvaWQgKCogYnRoZl9jbGllbnRfY3VycmVudF9vcGVyYXRvcl9jYWxsYmFjaykgKGNvbnN0IGJ0X2JkYWRkcl90ICpiZF9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKIAogLyoqIENhbGxiYWNrIGZvciBjYWxsIGluZGljYXRvcgogICovCi10eXBlZGVmIHZvaWQgKCogYnRoZl9jbGllbnRfY2FsbF9jYWxsYmFjaykgKGJ0aGZfY2xpZW50X2NhbGxfdCBjYWxsKTsKK3R5cGVkZWYgdm9pZCAoKiBidGhmX2NsaWVudF9jYWxsX2NhbGxiYWNrKSAoY29uc3QgYnRfYmRhZGRyX3QgKmJkX2FkZHIsIGJ0aGZfY2xpZW50X2NhbGxfdCBjYWxsKTsKIAogLyoqIENhbGxiYWNrIGZvciBjYWxsc2V0dXAgaW5kaWNhdG9yCiAgKi8KLXR5cGVkZWYgdm9pZCAoKiBidGhmX2NsaWVudF9jYWxsc2V0dXBfY2FsbGJhY2spIChidGhmX2NsaWVudF9jYWxsc2V0dXBfdCBjYWxsc2V0dXApOwordHlwZWRlZiB2b2lkICgqIGJ0aGZfY2xpZW50X2NhbGxzZXR1cF9jYWxsYmFjaykgKGNvbnN0IGJ0X2JkYWRkcl90ICpiZF9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aGZfY2xpZW50X2NhbGxzZXR1cF90IGNhbGxzZXR1cCk7CiAKIC8qKiBDYWxsYmFjayBmb3IgY2FsbGhlbGQgaW5kaWNhdG9yCiAgKi8KLXR5cGVkZWYgdm9pZCAoKiBidGhmX2NsaWVudF9jYWxsaGVsZF9jYWxsYmFjaykgKGJ0aGZfY2xpZW50X2NhbGxoZWxkX3QgY2FsbGhlbGQpOwordHlwZWRlZiB2b2lkICgqIGJ0aGZfY2xpZW50X2NhbGxoZWxkX2NhbGxiYWNrKSAoY29uc3QgYnRfYmRhZGRyX3QgKmJkX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGhmX2NsaWVudF9jYWxsaGVsZF90IGNhbGxoZWxkKTsKIAogLyoqIENhbGxiYWNrIGZvciByZXNwb25zZSBhbmQgaG9sZAogICovCi10eXBlZGVmIHZvaWQgKCogYnRoZl9jbGllbnRfcmVzcF9hbmRfaG9sZF9jYWxsYmFjaykgKGJ0aGZfY2xpZW50X3Jlc3BfYW5kX2hvbGRfdCByZXNwX2FuZF9ob2xkKTsKK3R5cGVkZWYgdm9pZCAoKiBidGhmX2NsaWVudF9yZXNwX2FuZF9ob2xkX2NhbGxiYWNrKSAoY29uc3QgYnRfYmRhZGRyX3QgKmJkX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aGZfY2xpZW50X3Jlc3BfYW5kX2hvbGRfdCByZXNwX2FuZF9ob2xkKTsKIAogLyoqIENhbGxiYWNrIGZvciBDYWxsaW5nIExpbmUgSWRlbnRpZmljYXRpb24gbm90aWZpY2F0aW9uCiAgKiAgV2lsbCBiZSBjYWxsZWQgb25seSB3aGVuIHRoZXJlIGlzIGFuIGluY29taW5nIGNhbGwgYW5kIG51bWJlciBpcyBwcm92aWRlZC4KICAqLwotdHlwZWRlZiB2b2lkICgqIGJ0aGZfY2xpZW50X2NsaXBfY2FsbGJhY2spIChjb25zdCBjaGFyICpudW1iZXIpOwordHlwZWRlZiB2b2lkICgqIGJ0aGZfY2xpZW50X2NsaXBfY2FsbGJhY2spIChjb25zdCBidF9iZGFkZHJfdCAqYmRfYWRkciwgY29uc3QgY2hhciAqbnVtYmVyKTsKIAogLyoqCiAgKiBDYWxsYmFjayBmb3IgQ2FsbCBXYWl0aW5nIG5vdGlmaWNhdGlvbgogICovCi10eXBlZGVmIHZvaWQgKCogYnRoZl9jbGllbnRfY2FsbF93YWl0aW5nX2NhbGxiYWNrKSAoY29uc3QgY2hhciAqbnVtYmVyKTsKK3R5cGVkZWYgdm9pZCAoKiBidGhmX2NsaWVudF9jYWxsX3dhaXRpbmdfY2FsbGJhY2spIChjb25zdCBidF9iZGFkZHJfdCAqYmRfYWRkciwgY29uc3QgY2hhciAqbnVtYmVyKTsKIAogLyoqCiAgKiAgQ2FsbGJhY2sgZm9yIGxpc3RpbmcgY3VycmVudCBjYWxscy4gQ2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lLgogICogIElmIG51bWJlciBpcyB1bmtub3duIE5VTEwgaXMgcGFzc2VkLgogICovCi10eXBlZGVmIHZvaWQgKCpidGhmX2NsaWVudF9jdXJyZW50X2NhbGxzKSAoaW50IGluZGV4LCBidGhmX2NsaWVudF9jYWxsX2RpcmVjdGlvbl90IGRpciwKK3R5cGVkZWYgdm9pZCAoKmJ0aGZfY2xpZW50X2N1cnJlbnRfY2FsbHMpIChjb25zdCBidF9iZGFkZHJfdCAqYmRfYWRkciwgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aGZfY2xpZW50X2NhbGxfZGlyZWN0aW9uX3QgZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aGZfY2xpZW50X2NhbGxfc3RhdGVfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGhmX2NsaWVudF9jYWxsX21wdHlfdHlwZV90IG1wdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbnVtYmVyKTsKIAogLyoqIENhbGxiYWNrIGZvciBhdWRpbyB2b2x1bWUgY2hhbmdlCiAgKi8KLXR5cGVkZWYgdm9pZCAoKmJ0aGZfY2xpZW50X3ZvbHVtZV9jaGFuZ2VfY2FsbGJhY2spIChidGhmX2NsaWVudF92b2x1bWVfdHlwZV90IHR5cGUsIGludCB2b2x1bWUpOwordHlwZWRlZiB2b2lkICgqYnRoZl9jbGllbnRfdm9sdW1lX2NoYW5nZV9jYWxsYmFjaykgKGNvbnN0IGJ0X2JkYWRkcl90ICpiZF9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aGZfY2xpZW50X3ZvbHVtZV90eXBlX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdm9sdW1lKTsKIAogLyoqIENhbGxiYWNrIGZvciBjb21tYW5kIGNvbXBsZXRlIGV2ZW50CiAgKiAgY21lIGlzIHZhbGlkIG9ubHkgZm9yIEJUSEZfQ0xJRU5UX0NNRF9DT01QTEVURV9FUlJPUl9DTUUgdHlwZQogICovCi10eXBlZGVmIHZvaWQgKCpidGhmX2NsaWVudF9jbWRfY29tcGxldGVfY2FsbGJhY2spIChidGhmX2NsaWVudF9jbWRfY29tcGxldGVfdCB0eXBlLCBpbnQgY21lKTsKK3R5cGVkZWYgdm9pZCAoKmJ0aGZfY2xpZW50X2NtZF9jb21wbGV0ZV9jYWxsYmFjaykgKGNvbnN0IGJ0X2JkYWRkcl90ICpiZF9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRoZl9jbGllbnRfY21kX2NvbXBsZXRlX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbWUpOwogCiAvKiogQ2FsbGJhY2sgZm9yIHN1YnNjcmliZXIgaW5mb3JtYXRpb24KICAqLwotdHlwZWRlZiB2b2lkICgqIGJ0aGZfY2xpZW50X3N1YnNjcmliZXJfaW5mb19jYWxsYmFjaykgKGNvbnN0IGNoYXIgKm5hbWUsCit0eXBlZGVmIHZvaWQgKCogYnRoZl9jbGllbnRfc3Vic2NyaWJlcl9pbmZvX2NhbGxiYWNrKSAoY29uc3QgYnRfYmRhZGRyX3QgKmJkX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGhmX2NsaWVudF9zdWJzY3JpYmVyX3NlcnZpY2VfdHlwZV90IHR5cGUpOwogCiAvKiogQ2FsbGJhY2sgZm9yIGluLWJhbmQgcmluZyB0b25lIHNldHRpbmdzCiAgKi8KLXR5cGVkZWYgdm9pZCAoKiBidGhmX2NsaWVudF9pbl9iYW5kX3JpbmdfdG9uZV9jYWxsYmFjaykgKGJ0aGZfY2xpZW50X2luX2JhbmRfcmluZ19zdGF0ZV90IHN0YXRlKTsKK3R5cGVkZWYgdm9pZCAoKiBidGhmX2NsaWVudF9pbl9iYW5kX3JpbmdfdG9uZV9jYWxsYmFjaykgKGNvbnN0IGJ0X2JkYWRkcl90ICpiZF9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRoZl9jbGllbnRfaW5fYmFuZF9yaW5nX3N0YXRlX3Qgc3RhdGUpOwogCiAvKioKICAqIENhbGxiYWNrIGZvciByZXF1ZXN0ZWQgbnVtYmVyIGZyb20gQUcKICAqLwotdHlwZWRlZiB2b2lkICgqIGJ0aGZfY2xpZW50X2xhc3Rfdm9pY2VfdGFnX251bWJlcl9jYWxsYmFjaykgKGNvbnN0IGNoYXIgKm51bWJlcik7Cit0eXBlZGVmIHZvaWQgKCogYnRoZl9jbGllbnRfbGFzdF92b2ljZV90YWdfbnVtYmVyX2NhbGxiYWNrKSAoY29uc3QgYnRfYmRhZGRyX3QgKmJkX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbnVtYmVyKTsKIAogLyoqCiAgKiBDYWxsYmFjayBmb3Igc2VuZGluZyByaW5nIGluZGljYXRpb24gdG8gYXBwCiAgKi8KLXR5cGVkZWYgdm9pZCAoKiBidGhmX2NsaWVudF9yaW5nX2luZGljYXRpb25fY2FsbGJhY2spICh2b2lkKTsKK3R5cGVkZWYgdm9pZCAoKiBidGhmX2NsaWVudF9yaW5nX2luZGljYXRpb25fY2FsbGJhY2spIChjb25zdCBidF9iZGFkZHJfdCAqYmRfYWRkcik7CiAKIC8qKiBCVC1IRiBjYWxsYmFjayBzdHJ1Y3R1cmUuICovCiB0eXBlZGVmIHN0cnVjdCB7CkBAIC0zMDcsNTUgKzMyMyw1OSBAQAogICAgIGJ0X3N0YXR1c190ICgqY29ubmVjdCkoYnRfYmRhZGRyX3QgKmJkX2FkZHIpOwogCiAgICAgLyoqIGRpc2Nvbm5lY3QgZnJvbSBhdWRpbyBnYXRld2F5ICovCi0gICAgYnRfc3RhdHVzX3QgKCpkaXNjb25uZWN0KShidF9iZGFkZHJfdCAqYmRfYWRkcik7CisgICAgYnRfc3RhdHVzX3QgKCpkaXNjb25uZWN0KShjb25zdCBidF9iZGFkZHJfdCAqYmRfYWRkcik7CiAKICAgICAvKiogY3JlYXRlIGFuIGF1ZGlvIGNvbm5lY3Rpb24gKi8KLSAgICBidF9zdGF0dXNfdCAoKmNvbm5lY3RfYXVkaW8pKGJ0X2JkYWRkcl90ICpiZF9hZGRyKTsKKyAgICBidF9zdGF0dXNfdCAoKmNvbm5lY3RfYXVkaW8pKGNvbnN0IGJ0X2JkYWRkcl90ICpiZF9hZGRyKTsKIAogICAgIC8qKiBjbG9zZSB0aGUgYXVkaW8gY29ubmVjdGlvbiAqLwotICAgIGJ0X3N0YXR1c190ICgqZGlzY29ubmVjdF9hdWRpbykoYnRfYmRhZGRyX3QgKmJkX2FkZHIpOworICAgIGJ0X3N0YXR1c190ICgqZGlzY29ubmVjdF9hdWRpbykoY29uc3QgYnRfYmRhZGRyX3QgKmJkX2FkZHIpOwogCiAgICAgLyoqIHN0YXJ0IHZvaWNlIHJlY29nbml0aW9uICovCi0gICAgYnRfc3RhdHVzX3QgKCpzdGFydF92b2ljZV9yZWNvZ25pdGlvbikodm9pZCk7CisgICAgYnRfc3RhdHVzX3QgKCpzdGFydF92b2ljZV9yZWNvZ25pdGlvbikoY29uc3QgYnRfYmRhZGRyX3QgKmJkX2FkZHIpOwogCiAgICAgLyoqIHN0b3Agdm9pY2UgcmVjb2duaXRpb24gKi8KLSAgICBidF9zdGF0dXNfdCAoKnN0b3Bfdm9pY2VfcmVjb2duaXRpb24pKHZvaWQpOworICAgIGJ0X3N0YXR1c190ICgqc3RvcF92b2ljZV9yZWNvZ25pdGlvbikoY29uc3QgYnRfYmRhZGRyX3QgKmJkX2FkZHIpOwogCiAgICAgLyoqIHZvbHVtZSBjb250cm9sICovCi0gICAgYnRfc3RhdHVzX3QgKCp2b2x1bWVfY29udHJvbCkgKGJ0aGZfY2xpZW50X3ZvbHVtZV90eXBlX3QgdHlwZSwgaW50IHZvbHVtZSk7CisgICAgYnRfc3RhdHVzX3QgKCp2b2x1bWVfY29udHJvbCkgKGNvbnN0IGJ0X2JkYWRkcl90ICpiZF9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGhmX2NsaWVudF92b2x1bWVfdHlwZV90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2b2x1bWUpOwogCiAgICAgLyoqIHBsYWNlIGEgY2FsbCB3aXRoIG51bWJlciBhIG51bWJlcgogICAgICAqIGlmIG51bWJlciBpcyBOVUxMIGxhc3QgY2FsbGVkIG51bWJlciBpcyBjYWxsZWQgKGFrYSByZS1kaWFsKSovCi0gICAgYnRfc3RhdHVzX3QgKCpkaWFsKSAoY29uc3QgY2hhciAqbnVtYmVyKTsKKyAgICBidF9zdGF0dXNfdCAoKmRpYWwpIChjb25zdCBidF9iZGFkZHJfdCAqYmRfYWRkciwgY29uc3QgY2hhciAqbnVtYmVyKTsKIAogICAgIC8qKiBwbGFjZSBhIGNhbGwgd2l0aCBudW1iZXIgc3BlY2lmaWVkIGJ5IGxvY2F0aW9uIChzcGVlZCBkaWFsKSAqLwotICAgIGJ0X3N0YXR1c190ICgqZGlhbF9tZW1vcnkpIChpbnQgbG9jYXRpb24pOworICAgIGJ0X3N0YXR1c190ICgqZGlhbF9tZW1vcnkpIChjb25zdCBidF9iZGFkZHJfdCAqYmRfYWRkciwgaW50IGxvY2F0aW9uKTsKIAogICAgIC8qKiBwZXJmb3JtIHNwZWNpZmllZCBjYWxsIHJlbGF0ZWQgYWN0aW9uCiAgICAgICogaWR4IGlzIGxpbWl0ZWQgb25seSBmb3IgZW5oYW5jZWQgY2FsbCBjb250cm9sIHJlbGF0ZWQgYWN0aW9uCiAgICAgICovCi0gICAgYnRfc3RhdHVzX3QgKCpoYW5kbGVfY2FsbF9hY3Rpb24pIChidGhmX2NsaWVudF9jYWxsX2FjdGlvbl90IGFjdGlvbiwgaW50IGlkeCk7CisgICAgYnRfc3RhdHVzX3QgKCpoYW5kbGVfY2FsbF9hY3Rpb24pIChjb25zdCBidF9iZGFkZHJfdCAqYmRfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0aGZfY2xpZW50X2NhbGxfYWN0aW9uX3QgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkeCk7CiAKICAgICAvKiogcXVlcnkgbGlzdCBvZiBjdXJyZW50IGNhbGxzICovCi0gICAgYnRfc3RhdHVzX3QgKCpxdWVyeV9jdXJyZW50X2NhbGxzKSAodm9pZCk7CisgICAgYnRfc3RhdHVzX3QgKCpxdWVyeV9jdXJyZW50X2NhbGxzKSAoY29uc3QgYnRfYmRhZGRyX3QgKmJkX2FkZHIpOwogCiAgICAgLyoqIHF1ZXJ5IG5hbWUgb2YgY3VycmVudCBzZWxlY3RlZCBvcGVyYXRvciAqLwotICAgIGJ0X3N0YXR1c190ICgqcXVlcnlfY3VycmVudF9vcGVyYXRvcl9uYW1lKSAodm9pZCk7CisgICAgYnRfc3RhdHVzX3QgKCpxdWVyeV9jdXJyZW50X29wZXJhdG9yX25hbWUpIChjb25zdCBidF9iZGFkZHJfdCAqYmRfYWRkcik7CiAKICAgICAvKiogUmV0cmlldmUgc3Vic2NyaWJlciBpbmZvcm1hdGlvbiAqLwotICAgIGJ0X3N0YXR1c190ICgqcmV0cmlldmVfc3Vic2NyaWJlcl9pbmZvKSAodm9pZCk7CisgICAgYnRfc3RhdHVzX3QgKCpyZXRyaWV2ZV9zdWJzY3JpYmVyX2luZm8pIChjb25zdCBidF9iZGFkZHJfdCAqYmRfYWRkcik7CiAKICAgICAvKiogU2VuZCBEVE1GIGNvZGUqLwotICAgIGJ0X3N0YXR1c190ICgqc2VuZF9kdG1mKSAoY2hhciBjb2RlKTsKKyAgICBidF9zdGF0dXNfdCAoKnNlbmRfZHRtZikgKGNvbnN0IGJ0X2JkYWRkcl90ICpiZF9hZGRyLCBjaGFyIGNvZGUpOwogCiAgICAgLyoqIFJlcXVlc3QgYSBwaG9uZSBudW1iZXIgZnJvbSBBRyBjb3JyZXNwb25kaW5nIHRvIGxhc3Qgdm9pY2UgdGFnIHJlY29yZGVkICovCi0gICAgYnRfc3RhdHVzX3QgKCpyZXF1ZXN0X2xhc3Rfdm9pY2VfdGFnX251bWJlcikgKHZvaWQpOworICAgIGJ0X3N0YXR1c190ICgqcmVxdWVzdF9sYXN0X3ZvaWNlX3RhZ19udW1iZXIpIChjb25zdCBidF9iZGFkZHJfdCAqYmRfYWRkcik7CiAKICAgICAvKiogQ2xvc2VzIHRoZSBpbnRlcmZhY2UuICovCiAgICAgdm9pZCAoKmNsZWFudXApKHZvaWQpOwogCiAgICAgLyoqIFNlbmQgQVQgQ29tbWFuZC4gKi8KLSAgICBidF9zdGF0dXNfdCAoKnNlbmRfYXRfY21kKSAoaW50IGNtZCwgaW50IHZhbDEsIGludCB2YWwyLCBjb25zdCBjaGFyICphcmcpOworICAgIGJ0X3N0YXR1c190ICgqc2VuZF9hdF9jbWQpIChjb25zdCBidF9iZGFkZHJfdCAqYmRfYWRkciwgaW50IGNtZCwgaW50IHZhbDEsIGludCB2YWwyLCBjb25zdCBjaGFyICphcmcpOwogfSBidGhmX2NsaWVudF9pbnRlcmZhY2VfdDsKIAogX19FTkRfREVDTFMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvYnRfcmMuaCBiL2luY2x1ZGUvaGFyZHdhcmUvYnRfcmMuaAppbmRleCAxZTJjMjkzLi5lZTk5ZDkxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2hhcmR3YXJlL2J0X3JjLmgKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS9idF9yYy5oCkBAIC0xOSwxNyArMTksNjkgQEAKIAogX19CRUdJTl9ERUNMUwogCisvKiBDaGFuZ2UgdGhpcyBtYWNybyB0byB1c2UgbXVsdGlwbGUgUkMgKi8KKyNkZWZpbmUgQlRfUkNfTlVNX0FQUCAxCisKIC8qIE1hY3JvcyAqLwotI2RlZmluZSBCVFJDX01BWF9BVFRSX1NUUl9MRU4gICAgICAgMjU1CisjZGVmaW5lIEJUUkNfTUFYX0FUVFJfU1RSX0xFTiAgICAgICAoMSA8PCAxNikKICNkZWZpbmUgQlRSQ19VSURfU0laRSAgICAgICAgICAgICAgIDgKICNkZWZpbmUgQlRSQ19NQVhfQVBQX1NFVFRJTkdTICAgICAgIDgKICNkZWZpbmUgQlRSQ19NQVhfRk9MREVSX0RFUFRIICAgICAgIDQKICNkZWZpbmUgQlRSQ19NQVhfQVBQX0FUVFJfU0laRSAgICAgIDE2Ci0jZGVmaW5lIEJUUkNfTUFYX0VMRU1fQVRUUl9TSVpFICAgICA3CisjZGVmaW5lIEJUUkNfTUFYX0VMRU1fQVRUUl9TSVpFICAgICA4CisjZGVmaW5lIEJUUkNfRkVBVFVSRV9CSVRfTUFTS19TSVpFIDE2CisKKy8qIE1hY3JvcyBmb3IgdmFsaWQgc2NvcGVzIGluIGdldF9mb2xkZXJfaXRlbXMgKi8KKyNkZWZpbmUgQlRSQ19TQ09QRV9QTEFZRVJfTElTVCAgMHgwMCAvKiBNZWRpYSBQbGF5ZXIgTGlzdCAqLworI2RlZmluZSBCVFJDX1NDT1BFX0ZJTEVfU1lTVEVNICAweDAxIC8qIFZpcnR1YWwgRmlsZSBTeXN0ZW0gKi8KKyNkZWZpbmUgQlRSQ19TQ09QRV9TRUFSQ0ggIDB4MDIgLyogU2VhcmNoICovCisjZGVmaW5lIEJUUkNfU0NPUEVfTk9XX1BMQVlJTkcgICAweDAzIC8qIE5vdyBQbGF5aW5nICovCisKKy8qIE1hY3JvcyBmb3Igc3VwcG9ydGVkIGNoYXJhY3RlciBlbmNvZGluZyAqLworI2RlZmluZSBCVFJDX0NIQVJTRVRfSURfVVRGOCAgMHgwMDZBCisKKy8qIE1hY3JvcyBmb3IgaXRlbSB0eXBlcyAqLworI2RlZmluZSBCVFJDX0lURU1fUExBWUVSICAweDAxIC8qIE1lZGlhIFBsYXllciAqLworI2RlZmluZSBCVFJDX0lURU1fRk9MREVSICAweDAyIC8qIEZvbGRlciAqLworI2RlZmluZSBCVFJDX0lURU1fTUVESUEgICAweDAzIC8qIE1lZGlhIEZpbGUgKi8KKworLyogTWFjcm9zIGZvciBtZWRpYSBhdHRyaWJ1dGUgSURzICovCisjZGVmaW5lIEJUUkNfTUVESUFfQVRUUl9JRF9JTlZBTElEICAgICAgICAgICAgICAgLTEKKyNkZWZpbmUgQlRSQ19NRURJQV9BVFRSX0lEX1RJVExFICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEJUUkNfTUVESUFfQVRUUl9JRF9BUlRJU1QgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBCVFJDX01FRElBX0FUVFJfSURfQUxCVU0gICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgQlRSQ19NRURJQV9BVFRSX0lEX1RSQUNLX05VTSAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEJUUkNfTUVESUFfQVRUUl9JRF9OVU1fVFJBQ0tTICAgICAgICAgICAgMHgwMDAwMDAwNQorI2RlZmluZSBCVFJDX01FRElBX0FUVFJfSURfR0VOUkUgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDYKKyNkZWZpbmUgQlRSQ19NRURJQV9BVFRSX0lEX1BMQVlJTkdfVElNRSAgICAgICAgICAweDAwMDAwMDA3ICAgICAgICAvKiBpbiBtaWxpc2Vjb25kcyAqLworCisvKiBNYWNyb3MgZm9yIGZvbGRlciB0eXBlcyAqLworI2RlZmluZSBCVFJDX0ZPTERFUl9UWVBFX01JWEVEICAgICAgMHgwMAorI2RlZmluZSBCVFJDX0ZPTERFUl9UWVBFX1RJVExFUyAgICAgMHgwMQorI2RlZmluZSBCVFJDX0ZPTERFUl9UWVBFX0FMQlVNUyAgICAgMHgwMgorI2RlZmluZSBCVFJDX0ZPTERFUl9UWVBFX0FSVElTVFMgICAgMHgwMworI2RlZmluZSBCVFJDX0ZPTERFUl9UWVBFX0dFTlJFUyAgICAgMHgwNAorI2RlZmluZSBCVFJDX0ZPTERFUl9UWVBFX1BMQVlMSVNUUyAgMHgwNQorI2RlZmluZSBCVFJDX0ZPTERFUl9UWVBFX1lFQVJTICAgICAgMHgwNgorCisvKiBNYWNyb3MgZm9yIG1lZGlhIHR5cGVzICovCisjZGVmaW5lIEJUUkNfTUVESUFfVFlQRV9BVURJTyAgMHgwMCAvKiBhdWRpbyAqLworI2RlZmluZSBCVFJDX01FRElBX1RZUEVfVklERU8gIDB4MDEgLyogdmlkZW8gKi8KKworLyogTWFjcm9zIGZvciBudW0gYXR0cmlidXRlcyAqLworI2RlZmluZSBCVFJDX05VTV9BVFRSX05PTkUgMHhGRiAvKiBObyBhdHRyaWJ1dGVzIHJlcXVpcmVkICovCisjZGVmaW5lIEJUUkNfTlVNX0FUVFJfQUxMICAwWDAwIC8qIEFsbCBhdHRyaWJ1dGVzIHJlcXVpcmVkICovCisKKyNkZWZpbmUgQlRSQ19IQU5ETEVfTk9ORSAweEZGCiAKIHR5cGVkZWYgdWludDhfdCBidHJjX3VpZF90W0JUUkNfVUlEX1NJWkVdOwogCiB0eXBlZGVmIGVudW0geworICAgIEJUUkNfQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQgPSAwLAorICAgIEJUUkNfQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQKK30gYnRyY19jb25uZWN0aW9uX3N0YXRlX3Q7CisKK3R5cGVkZWYgZW51bSB7CiAgICAgQlRSQ19GRUFUX05PTkUgPSAweDAwLCAgICAvKiBBVlJDUCAxLjAgKi8KICAgICBCVFJDX0ZFQVRfTUVUQURBVEEgPSAweDAxLCAgICAvKiBBVlJDUCAxLjMgKi8KICAgICBCVFJDX0ZFQVRfQUJTT0xVVEVfVk9MVU1FID0gMHgwMiwgICAgLyogU3VwcG9ydHMgVEcgcm9sZSBhbmQgdm9sdW1lIHN5bmMgKi8KQEAgLTUyLDYgKzEwNCwxMSBAQAogICAgIEJUUkNfRVZUX1RSQUNLX1JFQUNIRURfU1RBUlQgPSAweDA0LAogICAgIEJUUkNfRVZUX1BMQVlfUE9TX0NIQU5HRUQgPSAweDA1LAogICAgIEJUUkNfRVZUX0FQUF9TRVRUSU5HU19DSEFOR0VEID0gMHgwOCwKKyAgICBCVFJDX0VWVF9OT1dfUExBWUlOR19DT05URU5UX0NIQU5HRUQgPSAweDA5LAorICAgIEJUUkNfRVZUX0FWQUxfUExBWUVSX0NIQU5HRSA9IDB4MGEsCisgICAgQlRSQ19FVlRfQUREUl9QTEFZRVJfQ0hBTkdFID0gMHgwYiwKKyAgICBCVFJDX0VWVF9VSURTX0NIQU5HRUQgPSAweDBjLAorICAgIEJUUkNfRVZUX1ZPTF9DSEFOR0VEID0gMHgwZCwKIH0gYnRyY19ldmVudF9pZF90OwogCiB0eXBlZGVmIGVudW0gewpAQCAtOTQsMTAgKzE1MSwzMyBAQAogICAgIEJUUkNfU1RTX0JBRF9QQVJBTSAgICAgID0gMHgwMSwgLyogSW52YWxpZCBwYXJhbWV0ZXIgKi8KICAgICBCVFJDX1NUU19OT1RfRk9VTkQgICAgICA9IDB4MDIsIC8qIFNwZWNpZmllZCBwYXJhbWV0ZXIgaXMgd3Jvbmcgb3Igbm90IGZvdW5kICovCiAgICAgQlRSQ19TVFNfSU5URVJOQUxfRVJSICAgPSAweDAzLCAvKiBJbnRlcm5hbCBFcnJvciAqLwotICAgIEJUUkNfU1RTX05PX0VSUk9SICAgICAgID0gMHgwNCAgLyogT3BlcmF0aW9uIFN1Y2Nlc3MgKi8KKyAgICBCVFJDX1NUU19OT19FUlJPUiAgICAgICA9IDB4MDQsIC8qIE9wZXJhdGlvbiBTdWNjZXNzICovCisgICAgQlRSQ19TVFNfVUlEX0NIQU5HRUQgICAgPSAweDA1LCAvKiBVSURzIGNoYW5nZWQgKi8KKyAgICBCVFJDX1NUU19SRVNFUlZFRCAgICAgICA9IDB4MDYsIC8qIFJlc2VydmVkICovCisgICAgQlRSQ19TVFNfSU5WX0RJUk4gICAgICAgPSAweDA3LCAvKiBJbnZhbGlkIGRpcmVjdGlvbiAqLworICAgIEJUUkNfU1RTX0lOVl9ESVJFQ1RPUlkgID0gMHgwOCwgLyogSW52YWxpZCBkaXJlY3RvcnkgKi8KKyAgICBCVFJDX1NUU19JTlZfSVRFTSAgICAgICA9IDB4MDksIC8qIEludmFsaWQgSXRlbSAqLworICAgIEJUUkNfU1RTX0lOVl9TQ09QRSAgICAgID0gMHgwYSwgLyogSW52YWxpZCBzY29wZSAqLworICAgIEJUUkNfU1RTX0lOVl9SQU5HRSAgICAgID0gMHgwYiwgLyogSW52YWxpZCByYW5nZSAqLworICAgIEJUUkNfU1RTX0RJUkVDVE9SWSAgICAgID0gMHgwYywgLyogVUlEIGlzIGEgZGlyZWN0b3J5ICovCisgICAgQlRSQ19TVFNfTUVESUFfSU5fVVNFICAgPSAweDBkLCAvKiBNZWRpYSBpbiB1c2UgKi8KKyAgICBCVFJDX1NUU19QTEFZX0xJU1RfRlVMTCA9IDB4MGUsIC8qIFBsYXlpbmcgbGlzdCBmdWxsICovCisgICAgQlRSQ19TVFNfU1JDSF9OT1RfU1BSVEQgPSAweDBmLCAvKiBTZWFyY2ggbm90IHN1cHBvcnRlZCAqLworICAgIEJUUkNfU1RTX1NSQ0hfSU5fUFJPRyAgID0gMHgxMCwgLyogU2VhcmNoIGluIHByb2dyZXNzICovCisgICAgQlRSQ19TVFNfSU5WX1BMQVlFUiAgICAgPSAweDExLCAvKiBJbnZhbGlkIHBsYXllciAqLworICAgIEJUUkNfU1RTX1BMQVlfTk9UX0JST1cgID0gMHgxMiwgLyogUGxheWVyIG5vdCBicm93c2FibGUgKi8KKyAgICBCVFJDX1NUU19QTEFZX05PVF9BRERSICA9IDB4MTMsIC8qIFBsYXllciBub3QgYWRkcmVzc2VkICovCisgICAgQlRSQ19TVFNfSU5WX1JFU1VMVFMgICAgPSAweDE0LCAvKiBJbnZhbGlkIHJlc3VsdHMgKi8KKyAgICBCVFJDX1NUU19OT19BVkJMX1BMQVkgICA9IDB4MTUsIC8qIE5vIGF2YWlsYWJsZSBwbGF5ZXJzICovCisgICAgQlRSQ19TVFNfQUREUl9QTEFZX0NIR0QgPSAweDE2LCAvKiBBZGRyZXNzZWQgcGxheWVyIGNoYW5nZWQgKi8KIH0gYnRyY19zdGF0dXNfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQxNl90IHBsYXllcl9pZDsKKyAgICB1aW50MTZfdCB1aWRfY291bnRlcjsKK30gYnRyY19hZGRyX3BsYXllcl9jaGFuZ2VkX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKICAgICB1aW50OF90IG51bV9hdHRyOwogICAgIHVpbnQ4X3QgYXR0cl9pZHNbQlRSQ19NQVhfQVBQX1NFVFRJTkdTXTsKICAgICB1aW50OF90IGF0dHJfdmFsdWVzW0JUUkNfTUFYX0FQUF9TRVRUSU5HU107CkBAIC0xMzMsMTIgKzIxMywyNSBAQAogICAgIHVpbnQ4X3QgIGF0dHJfY291bnQ7CiB9IGJ0cmNfZ2V0Zm9sZGVyaXRlbV90OwogCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDE2X3QgdHlwZTsKKyAgICB1aW50MTZfdCB1aWRfY291bnRlcjsKK30gYnRyY191aWRzX2NoYW5nZWRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQxNl90IHR5cGU7Cit9IGJ0cmNfbm93X3BsYXlpbmdfY2hhbmdlZF90OworCiB0eXBlZGVmIHVuaW9uCiB7CiAgICAgYnRyY19wbGF5X3N0YXR1c190IHBsYXlfc3RhdHVzOwogICAgIGJ0cmNfdWlkX3QgdHJhY2s7IC8qIHF1ZXVlIHBvc2l0aW9uIGluIE5vd1BsYXlpbmcgKi8KICAgICB1aW50MzJfdCBzb25nX3BvczsKKyAgICB1aW50MTZfdCB1aWRfY291bnRlcjsKICAgICBidHJjX3BsYXllcl9zZXR0aW5nc190IHBsYXllcl9zZXR0aW5nOworICAgIGJ0cmNfYWRkcl9wbGF5ZXJfY2hhbmdlZF90IGFkZHJfcGxheWVyX2NoYW5nZWQ7CisgICAgYnRyY191aWRzX2NoYW5nZWRfdCB1aWRzX2NoYW5nZWQ7CisgICAgYnRyY19ub3dfcGxheWluZ19jaGFuZ2VkX3Qgbm93X3BsYXlpbmdfY2hhbmdlZDsKIH0gYnRyY19yZWdpc3Rlcl9ub3RpZmljYXRpb25fdDsKIAogdHlwZWRlZiBzdHJ1Y3QgewpAQCAtMTUxLDU1ICsyNDQsMTQxIEBACiAgICAgdWludDhfdCB0ZXh0W0JUUkNfTUFYX0FUVFJfU1RSX0xFTl07CiB9IGJ0cmNfZWxlbWVudF9hdHRyX3ZhbF90OwogCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDE2X3QgIHBsYXllcl9pZDsKKyAgICB1aW50OF90ICAgbWFqb3JfdHlwZTsKKyAgICB1aW50MzJfdCAgc3ViX3R5cGU7CisgICAgdWludDhfdCAgIHBsYXlfc3RhdHVzOworICAgIHVpbnQ4X3QgICBmZWF0dXJlc1tCVFJDX0ZFQVRVUkVfQklUX01BU0tfU0laRV07CisgICAgdWludDE2X3QgIGNoYXJzZXRfaWQ7CisgICAgdWludDhfdCAgIG5hbWVbQlRSQ19NQVhfQVRUUl9TVFJfTEVOXTsKK30gYnRyY19pdGVtX3BsYXllcl90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCAgIHVpZFtCVFJDX1VJRF9TSVpFXTsKKyAgICB1aW50OF90ICAgdHlwZTsKKyAgICB1aW50OF90ICAgcGxheWFibGU7CisgICAgdWludDE2X3QgIGNoYXJzZXRfaWQ7CisgICAgdWludDhfdCAgIG5hbWVbQlRSQ19NQVhfQVRUUl9TVFJfTEVOXTsKK30gYnRyY19pdGVtX2ZvbGRlcl90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCAgdWlkW0JUUkNfVUlEX1NJWkVdOworICAgIHVpbnQ4X3QgIHR5cGU7CisgICAgdWludDE2X3QgY2hhcnNldF9pZDsKKyAgICB1aW50OF90ICBuYW1lW0JUUkNfTUFYX0FUVFJfU1RSX0xFTl07CisgICAgaW50ICAgICAgbnVtX2F0dHJzOworICAgIGJ0cmNfZWxlbWVudF9hdHRyX3ZhbF90KiBwX2F0dHJzOworfSBidHJjX2l0ZW1fbWVkaWFfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgaXRlbV90eXBlOworICAgIHVuaW9uCisgICAgeworICAgICAgICBidHJjX2l0ZW1fcGxheWVyX3QgcGxheWVyOworICAgICAgICBidHJjX2l0ZW1fZm9sZGVyX3QgZm9sZGVyOworICAgICAgICBidHJjX2l0ZW1fbWVkaWFfdCAgbWVkaWE7CisgICAgfTsKK30gYnRyY19mb2xkZXJfaXRlbXNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQxNl90ICBzdHJfbGVuOworICAgIHVpbnQ4X3QgICBwX3N0cltCVFJDX01BWF9BVFRSX1NUUl9MRU5dOworfSBidHJjX2JyX2ZvbGRlcl9uYW1lX3Q7CisKIC8qKiBDYWxsYmFjayBmb3IgdGhlIGNvbnRyb2xsZXIncyBzdXBwb3J0ZWQgZmVhdXRyZXMgKi8KIHR5cGVkZWYgdm9pZCAoKiBidHJjX3JlbW90ZV9mZWF0dXJlc19jYWxsYmFjaykoYnRfYmRhZGRyX3QgKmJkX2FkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHJjX3JlbW90ZV9mZWF0dXJlc190IGZlYXR1cmVzKTsKIAogLyoqIENhbGxiYWNrIGZvciBwbGF5IHN0YXR1cyByZXF1ZXN0ICovCi10eXBlZGVmIHZvaWQgKCogYnRyY19nZXRfcGxheV9zdGF0dXNfY2FsbGJhY2spKCk7Cit0eXBlZGVmIHZvaWQgKCogYnRyY19nZXRfcGxheV9zdGF0dXNfY2FsbGJhY2spKGJ0X2JkYWRkcl90ICpiZF9hZGRyKTsKIAogLyoqIENhbGxiYWNrIGZvciBsaXN0IHBsYXllciBhcHBsaWNhdGlvbiBhdHRyaWJ1dGVzIChTaHVmZmxlLCBSZXBlYXQsLi4uKSAqLwotdHlwZWRlZiB2b2lkICgqIGJ0cmNfbGlzdF9wbGF5ZXJfYXBwX2F0dHJfY2FsbGJhY2spKCk7Cit0eXBlZGVmIHZvaWQgKCogYnRyY19saXN0X3BsYXllcl9hcHBfYXR0cl9jYWxsYmFjaykoYnRfYmRhZGRyX3QgKmJkX2FkZHIpOwogCiAvKiogQ2FsbGJhY2sgZm9yIGxpc3QgcGxheWVyIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZXMgKFNodWZmbGUsIFJlcGVhdCwuLi4pICovCi10eXBlZGVmIHZvaWQgKCogYnRyY19saXN0X3BsYXllcl9hcHBfdmFsdWVzX2NhbGxiYWNrKShidHJjX3BsYXllcl9hdHRyX3QgYXR0cl9pZCk7Cit0eXBlZGVmIHZvaWQgKCogYnRyY19saXN0X3BsYXllcl9hcHBfdmFsdWVzX2NhbGxiYWNrKShidHJjX3BsYXllcl9hdHRyX3QgYXR0cl9pZCwKKyAgICBidF9iZGFkZHJfdCAqYmRfYWRkcik7CiAKIC8qKiBDYWxsYmFjayBmb3IgZ2V0dGluZyB0aGUgY3VycmVudCBwbGF5ZXIgYXBwbGljYXRpb24gc2V0dGluZ3MgdmFsdWUKICoqICBudW1fYXR0cjogc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlIGlkcyBjb250YWluZWQgaW4gcF9hdHRycwogKi8KLXR5cGVkZWYgdm9pZCAoKiBidHJjX2dldF9wbGF5ZXJfYXBwX3ZhbHVlX2NhbGxiYWNrKSAodWludDhfdCBudW1fYXR0ciwgYnRyY19wbGF5ZXJfYXR0cl90ICpwX2F0dHJzKTsKK3R5cGVkZWYgdm9pZCAoKiBidHJjX2dldF9wbGF5ZXJfYXBwX3ZhbHVlX2NhbGxiYWNrKSAodWludDhfdCBudW1fYXR0ciwKKyAgICBidHJjX3BsYXllcl9hdHRyX3QgKnBfYXR0cnMsIGJ0X2JkYWRkcl90ICpiZF9hZGRyKTsKIAogLyoqIENhbGxiYWNrIGZvciBnZXR0aW5nIHRoZSBwbGF5ZXIgYXBwbGljYXRpb24gc2V0dGluZ3MgYXR0cmlidXRlcycgdGV4dAogKiogIG51bV9hdHRyOiBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGUgaWRzIGNvbnRhaW5lZCBpbiBwX2F0dHJzCiAqLwotdHlwZWRlZiB2b2lkICgqIGJ0cmNfZ2V0X3BsYXllcl9hcHBfYXR0cnNfdGV4dF9jYWxsYmFjaykgKHVpbnQ4X3QgbnVtX2F0dHIsIGJ0cmNfcGxheWVyX2F0dHJfdCAqcF9hdHRycyk7Cit0eXBlZGVmIHZvaWQgKCogYnRyY19nZXRfcGxheWVyX2FwcF9hdHRyc190ZXh0X2NhbGxiYWNrKSAodWludDhfdCBudW1fYXR0ciwKKyAgICBidHJjX3BsYXllcl9hdHRyX3QgKnBfYXR0cnMsIGJ0X2JkYWRkcl90ICpiZF9hZGRyKTsKIAogLyoqIENhbGxiYWNrIGZvciBnZXR0aW5nIHRoZSBwbGF5ZXIgYXBwbGljYXRpb24gc2V0dGluZ3MgdmFsdWVzJyB0ZXh0CiAqKiAgbnVtX2F0dHI6IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHZhbHVlIGlkcyBjb250YWluZWQgaW4gcF92YWxzCiAqLwotdHlwZWRlZiB2b2lkICgqIGJ0cmNfZ2V0X3BsYXllcl9hcHBfdmFsdWVzX3RleHRfY2FsbGJhY2spICh1aW50OF90IGF0dHJfaWQsIHVpbnQ4X3QgbnVtX3ZhbCwgdWludDhfdCAqcF92YWxzKTsKK3R5cGVkZWYgdm9pZCAoKiBidHJjX2dldF9wbGF5ZXJfYXBwX3ZhbHVlc190ZXh0X2NhbGxiYWNrKSAodWludDhfdCBhdHRyX2lkLCB1aW50OF90IG51bV92YWwsCisgICAgdWludDhfdCAqcF92YWxzLCBidF9iZGFkZHJfdCAqYmRfYWRkcik7CiAKIC8qKiBDYWxsYmFjayBmb3Igc2V0dGluZyB0aGUgcGxheWVyIGFwcGxpY2F0aW9uIHNldHRpbmdzIHZhbHVlcyAqLwotdHlwZWRlZiB2b2lkICgqIGJ0cmNfc2V0X3BsYXllcl9hcHBfdmFsdWVfY2FsbGJhY2spIChidHJjX3BsYXllcl9zZXR0aW5nc190ICpwX3ZhbHMpOwordHlwZWRlZiB2b2lkICgqIGJ0cmNfc2V0X3BsYXllcl9hcHBfdmFsdWVfY2FsbGJhY2spIChidHJjX3BsYXllcl9zZXR0aW5nc190ICpwX3ZhbHMsCisgICAgYnRfYmRhZGRyX3QgKmJkX2FkZHIpOwogCiAvKiogQ2FsbGJhY2sgdG8gZmV0Y2ggdGhlIGdldCBlbGVtZW50IGF0dHJpYnV0ZXMgb2YgdGhlIGN1cnJlbnQgc29uZwogKiogIG51bV9hdHRyOiBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzIHJlcXVlc3RlZCBpbiBwX2F0dHJzCiAqLwotdHlwZWRlZiB2b2lkICgqIGJ0cmNfZ2V0X2VsZW1lbnRfYXR0cl9jYWxsYmFjaykgKHVpbnQ4X3QgbnVtX2F0dHIsIGJ0cmNfbWVkaWFfYXR0cl90ICpwX2F0dHJzKTsKK3R5cGVkZWYgdm9pZCAoKiBidHJjX2dldF9lbGVtZW50X2F0dHJfY2FsbGJhY2spICh1aW50OF90IG51bV9hdHRyLCBidHJjX21lZGlhX2F0dHJfdCAqcF9hdHRycywKKyAgICBidF9iZGFkZHJfdCAqYmRfYWRkcik7CiAKIC8qKiBDYWxsYmFjayBmb3IgcmVnaXN0ZXIgbm90aWZpY2F0aW9uIChQbGF5IHN0YXRlIGNoYW5nZS90cmFjayBjaGFuZ2UvLi4uKQogKiogIHBhcmFtOiBJcyBvbmx5IHZhbGlkIGlmIGV2ZW50X2lkIGlzIEJUUkNfRVZUX1BMQVlfUE9TX0NIQU5HRUQKICovCi10eXBlZGVmIHZvaWQgKCogYnRyY19yZWdpc3Rlcl9ub3RpZmljYXRpb25fY2FsbGJhY2spIChidHJjX2V2ZW50X2lkX3QgZXZlbnRfaWQsIHVpbnQzMl90IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoKiBidHJjX3JlZ2lzdGVyX25vdGlmaWNhdGlvbl9jYWxsYmFjaykgKGJ0cmNfZXZlbnRfaWRfdCBldmVudF9pZCwgdWludDMyX3QgcGFyYW0sCisgICAgYnRfYmRhZGRyX3QgKmJkX2FkZHIpOwogCiAvKiBBVlJDUCAxLjQgRW5oYW5jZW1lbnRzICovCiAvKiogQ2FsbGJhY2sgZm9yIHZvbHVtZSBjaGFuZ2Ugb24gQ1QKICoqICB2b2x1bWU6IEN1cnJlbnQgdm9sdW1lIHNldHRpbmcgb24gdGhlIENUICgwLTEyNykKICovCi10eXBlZGVmIHZvaWQgKCogYnRyY192b2x1bWVfY2hhbmdlX2NhbGxiYWNrKSAodWludDhfdCB2b2x1bWUsIHVpbnQ4X3QgY3R5cGUpOwordHlwZWRlZiB2b2lkICgqIGJ0cmNfdm9sdW1lX2NoYW5nZV9jYWxsYmFjaykgKHVpbnQ4X3Qgdm9sdW1lLCB1aW50OF90IGN0eXBlLCBidF9iZGFkZHJfdCAqYmRfYWRkcik7CiAKIC8qKiBDYWxsYmFjayBmb3IgcGFzc3Rocm91Z2ggY29tbWFuZHMgKi8KLXR5cGVkZWYgdm9pZCAoKiBidHJjX3Bhc3N0aHJvdWdoX2NtZF9jYWxsYmFjaykgKGludCBpZCwgaW50IGtleV9zdGF0ZSk7Cit0eXBlZGVmIHZvaWQgKCogYnRyY19wYXNzdGhyb3VnaF9jbWRfY2FsbGJhY2spIChpbnQgaWQsIGludCBrZXlfc3RhdGUsIGJ0X2JkYWRkcl90ICpiZF9hZGRyKTsKKworLyoqIENhbGxiYWNrIGZvciBzZXQgYWRkcmVzc2VkIHBsYXllciByZXNwb25zZSBvbiBURyAqKi8KK3R5cGVkZWYgdm9pZCAoKiBidHJjX3NldF9hZGRyZXNzZWRfcGxheWVyX2NhbGxiYWNrKSAodWludDE2X3QgcGxheWVyX2lkLCBidF9iZGFkZHJfdCAqYmRfYWRkcik7CisKKy8qKiBDYWxsYmFjayBmb3Igc2V0IGJyb3dzZWQgcGxheWVyIHJlc3BvbnNlIG9uIFRHICoqLwordHlwZWRlZiB2b2lkICgqIGJ0cmNfc2V0X2Jyb3dzZWRfcGxheWVyX2NhbGxiYWNrKSAodWludDE2X3QgcGxheWVyX2lkLCBidF9iZGFkZHJfdCAqYmRfYWRkcik7CisKKy8qKiBDYWxsYmFjayBmb3IgZ2V0IGZvbGRlciBpdGVtcyBvbiBURworKiogIG51bV9hdHRyOiBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzIHJlcXVlc3RlZCBpbiBwX2F0dHJfaWRzCisqLwordHlwZWRlZiB2b2lkICgqIGJ0cmNfZ2V0X2ZvbGRlcl9pdGVtc19jYWxsYmFjaykgKHVpbnQ4X3Qgc2NvcGUsIHVpbnQzMl90IHN0YXJ0X2l0ZW0sCisgICAgICAgICAgICAgIHVpbnQzMl90IGVuZF9pdGVtLCB1aW50OF90IG51bV9hdHRyLCB1aW50MzJfdCAqcF9hdHRyX2lkcywgYnRfYmRhZGRyX3QgKmJkX2FkZHIpOworCisvKiogQ2FsbGJhY2sgZm9yIGNoYW5naW5nIGJyb3dzZWQgcGF0aCBvbiBURyAqKi8KK3R5cGVkZWYgdm9pZCAoKiBidHJjX2NoYW5nZV9wYXRoX2NhbGxiYWNrKSAodWludDhfdCBkaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgdWludDhfdCogZm9sZGVyX3VpZCwgYnRfYmRhZGRyX3QgKmJkX2FkZHIpOworCisvKiogQ2FsbGJhY2sgdG8gZmV0Y2ggdGhlIGdldCBpdGVtIGF0dHJpYnV0ZXMgb2YgdGhlIG1lZGlhIGl0ZW0KKyoqICBudW1fYXR0cjogc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcyByZXF1ZXN0ZWQgaW4gcF9hdHRycworKi8KK3R5cGVkZWYgdm9pZCAoKiBidHJjX2dldF9pdGVtX2F0dHJfY2FsbGJhY2spICh1aW50OF90IHNjb3BlLCB1aW50OF90KiB1aWQsIHVpbnQxNl90IHVpZF9jb3VudGVyLAorICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX2F0dHIsIGJ0cmNfbWVkaWFfYXR0cl90ICpwX2F0dHJzLCBidF9iZGFkZHJfdCAqYmRfYWRkcik7CisKKy8qKiBDYWxsYmFjayBmb3IgcGxheSByZXF1ZXN0IGZvciB0aGUgbWVkaWEgaXRlbSBpbmRpY2F0ZWQgYnkgYW4gaWRlbnRpZmllciAqLwordHlwZWRlZiB2b2lkICgqIGJ0cmNfcGxheV9pdGVtX2NhbGxiYWNrKSAodWludDhfdCBzY29wZSwKKyAgICAgICAgICAgICAgICB1aW50MTZfdCB1aWRfY291bnRlciwgdWludDhfdCogdWlkLCBidF9iZGFkZHJfdCAqYmRfYWRkcik7CisKKy8qKiBDYWxsYmFjayB0byBmZXRjaCB0b3RhbCBudW1iZXIgb2YgaXRlbXMgZnJvbSBhIGZvbGRlciAqKi8KK3R5cGVkZWYgdm9pZCAoKiBidHJjX2dldF90b3RhbF9udW1fb2ZfaXRlbXNfY2FsbGJhY2spICh1aW50OF90IHNjb3BlLCBidF9iZGFkZHJfdCAqYmRfYWRkcik7CisKKy8qKiBDYWxsYmFjayBmb3IgY29uZHVjdGluZyByZWN1cnNpdmUgc2VhcmNoIG9uIGEgY3VycmVudCBicm93c2VkIHBhdGggZm9yIGEgc3BlY2lmaWVkIHN0cmluZyAqLwordHlwZWRlZiB2b2lkICgqIGJ0cmNfc2VhcmNoX2NhbGxiYWNrKSAodWludDE2X3QgY2hhcnNldF9pZCwKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBzdHJfbGVuLCB1aW50OF90KiBwX3N0ciwgYnRfYmRhZGRyX3QgKmJkX2FkZHIpOworCisvKiogQ2FsbGJhY2sgdG8gYWRkIGEgc3BlY2lmaWVkIG1lZGlhIGl0ZW0gaW5kaWNhdGVkIGJ5IGFuIGlkZW50aWZpZXIgdG8gbm93IHBsYXlpbmcgcXVldWUuICovCit0eXBlZGVmIHZvaWQgKCogYnRyY19hZGRfdG9fbm93X3BsYXlpbmdfY2FsbGJhY2spICh1aW50OF90IHNjb3BlLAorICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHVpZCwgdWludDE2X3QgIHVpZF9jb3VudGVyLCBidF9iZGFkZHJfdCAqYmRfYWRkcik7CiAKIC8qKiBCVC1SQyBUYXJnZXQgY2FsbGJhY2sgc3RydWN0dXJlLiAqLwogdHlwZWRlZiBzdHJ1Y3QgewpAQCAtMjE3LDYgKzM5NiwxNSBAQAogICAgIGJ0cmNfcmVnaXN0ZXJfbm90aWZpY2F0aW9uX2NhbGxiYWNrICAgICAgICAgcmVnaXN0ZXJfbm90aWZpY2F0aW9uX2NiOwogICAgIGJ0cmNfdm9sdW1lX2NoYW5nZV9jYWxsYmFjayAgICAgICAgICAgICAgICAgdm9sdW1lX2NoYW5nZV9jYjsKICAgICBidHJjX3Bhc3N0aHJvdWdoX2NtZF9jYWxsYmFjayAgICAgICAgICAgICAgIHBhc3N0aHJvdWdoX2NtZF9jYjsKKyAgICBidHJjX3NldF9hZGRyZXNzZWRfcGxheWVyX2NhbGxiYWNrICAgICAgICAgIHNldF9hZGRyZXNzZWRfcGxheWVyX2NiOworICAgIGJ0cmNfc2V0X2Jyb3dzZWRfcGxheWVyX2NhbGxiYWNrICAgICAgICAgICAgc2V0X2Jyb3dzZWRfcGxheWVyX2NiOworICAgIGJ0cmNfZ2V0X2ZvbGRlcl9pdGVtc19jYWxsYmFjayAgICAgICAgICAgICAgZ2V0X2ZvbGRlcl9pdGVtc19jYjsKKyAgICBidHJjX2NoYW5nZV9wYXRoX2NhbGxiYWNrICAgICAgICAgICAgICAgICAgIGNoYW5nZV9wYXRoX2NiOworICAgIGJ0cmNfZ2V0X2l0ZW1fYXR0cl9jYWxsYmFjayAgICAgICAgICAgICAgICAgZ2V0X2l0ZW1fYXR0cl9jYjsKKyAgICBidHJjX3BsYXlfaXRlbV9jYWxsYmFjayAgICAgICAgICAgICAgICAgICAgIHBsYXlfaXRlbV9jYjsKKyAgICBidHJjX2dldF90b3RhbF9udW1fb2ZfaXRlbXNfY2FsbGJhY2sgICAgICAgIGdldF90b3RhbF9udW1fb2ZfaXRlbXNfY2I7CisgICAgYnRyY19zZWFyY2hfY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hfY2I7CisgICAgYnRyY19hZGRfdG9fbm93X3BsYXlpbmdfY2FsbGJhY2sgICAgICAgICAgICBhZGRfdG9fbm93X3BsYXlpbmdfY2I7CiB9IGJ0cmNfY2FsbGJhY2tzX3Q7CiAKIC8qKiBSZXByZXNlbnRzIHRoZSBzdGFuZGFyZCBCVC1SQyBBVlJDUCBUYXJnZXQgaW50ZXJmYWNlLiAqLwpAQCAtMjM0LDQwICs0MjIsNDUgQEAKICAgICAqKiAgMi4gU29uZyBkdXJhdGlvbi9sZW5ndGgKICAgICAqKiAgMy4gU29uZyBwb3NpdGlvbgogICAgICovCi0gICAgYnRfc3RhdHVzX3QgKCpnZXRfcGxheV9zdGF0dXNfcnNwKSggYnRyY19wbGF5X3N0YXR1c190IHBsYXlfc3RhdHVzLCB1aW50MzJfdCBzb25nX2xlbiwgdWludDMyX3Qgc29uZ19wb3MpOworICAgIGJ0X3N0YXR1c190ICgqZ2V0X3BsYXlfc3RhdHVzX3JzcCkoIGJ0X2JkYWRkcl90ICpiZF9hZGRyLCBidHJjX3BsYXlfc3RhdHVzX3QgcGxheV9zdGF0dXMsCisgICAgICAgIHVpbnQzMl90IHNvbmdfbGVuLCB1aW50MzJfdCBzb25nX3Bvcyk7CiAKICAgICAvKiogTGlzdHMgdGhlIHN1cHBvcnQgcGxheWVyIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZXMgKFNodWZmbGUvUmVwZWF0Ly4uLikKICAgICAqKiAgbnVtX2F0dHI6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMgY29udGFpbmVkIGluIHRoZSBwb2ludGVyIHBfYXR0cnMKICAgICAqLwotICAgIGJ0X3N0YXR1c190ICgqbGlzdF9wbGF5ZXJfYXBwX2F0dHJfcnNwKSggaW50IG51bV9hdHRyLCBidHJjX3BsYXllcl9hdHRyX3QgKnBfYXR0cnMpOworICAgIGJ0X3N0YXR1c190ICgqbGlzdF9wbGF5ZXJfYXBwX2F0dHJfcnNwKSggYnRfYmRhZGRyX3QgKmJkX2FkZHIsIGludCBudW1fYXR0ciwKKyAgICAgICAgYnRyY19wbGF5ZXJfYXR0cl90ICpwX2F0dHJzKTsKIAogICAgIC8qKiBMaXN0cyB0aGUgc3VwcG9ydCBwbGF5ZXIgYXBwbGljYXRpb24gYXR0cmlidXRlcyAoU2h1ZmZsZSBPZmYvT24vR3JvdXApCiAgICAgKiogIG51bV92YWw6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHZhbHVlcyBjb250YWluZWQgaW4gdGhlIHBvaW50ZXIgcF92YWxzCiAgICAgKi8KLSAgICBidF9zdGF0dXNfdCAoKmxpc3RfcGxheWVyX2FwcF92YWx1ZV9yc3ApKCBpbnQgbnVtX3ZhbCwgdWludDhfdCAqcF92YWxzKTsKKyAgICBidF9zdGF0dXNfdCAoKmxpc3RfcGxheWVyX2FwcF92YWx1ZV9yc3ApKCBidF9iZGFkZHJfdCAqYmRfYWRkciwgaW50IG51bV92YWwsIHVpbnQ4X3QgKnBfdmFscyk7CiAKICAgICAvKiogUmV0dXJucyB0aGUgY3VycmVudCBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgdmFsdWVzIGZvciBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgYXR0cl9pZCAqLwotICAgIGJ0X3N0YXR1c190ICgqZ2V0X3BsYXllcl9hcHBfdmFsdWVfcnNwKSggYnRyY19wbGF5ZXJfc2V0dGluZ3NfdCAqcF92YWxzKTsKKyAgICBidF9zdGF0dXNfdCAoKmdldF9wbGF5ZXJfYXBwX3ZhbHVlX3JzcCkoIGJ0X2JkYWRkcl90ICpiZF9hZGRyLCBidHJjX3BsYXllcl9zZXR0aW5nc190ICpwX3ZhbHMpOwogCiAgICAgLyoqIFJldHVybnMgdGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZXMgdGV4dCAoIlNodWZmbGUiLyJSZXBlYXQiLy4uLikKICAgICAqKiAgbnVtX2F0dHI6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMnIHRleHQgY29udGFpbmVkIGluIHRoZSBwb2ludGVyIHBfYXR0cnMKICAgICAqLwotICAgIGJ0X3N0YXR1c190ICgqZ2V0X3BsYXllcl9hcHBfYXR0cl90ZXh0X3JzcCkoIGludCBudW1fYXR0ciwgYnRyY19wbGF5ZXJfc2V0dGluZ190ZXh0X3QgKnBfYXR0cnMpOworICAgIGJ0X3N0YXR1c190ICgqZ2V0X3BsYXllcl9hcHBfYXR0cl90ZXh0X3JzcCkoIGJ0X2JkYWRkcl90ICpiZF9hZGRyLCBpbnQgbnVtX2F0dHIsCisgICAgICAgIGJ0cmNfcGxheWVyX3NldHRpbmdfdGV4dF90ICpwX2F0dHJzKTsKIAogICAgIC8qKiBSZXR1cm5zIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGVzIHRleHQgKCJTaHVmZmxlIi8iUmVwZWF0Ii8uLi4pCiAgICAgKiogIG51bV9hdHRyOiBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGUgdmFsdWVzJyB0ZXh0IGNvbnRhaW5lZCBpbiB0aGUgcG9pbnRlciBwX3ZhbHMKICAgICAqLwotICAgIGJ0X3N0YXR1c190ICgqZ2V0X3BsYXllcl9hcHBfdmFsdWVfdGV4dF9yc3ApKCBpbnQgbnVtX3ZhbCwgYnRyY19wbGF5ZXJfc2V0dGluZ190ZXh0X3QgKnBfdmFscyk7CisgICAgYnRfc3RhdHVzX3QgKCpnZXRfcGxheWVyX2FwcF92YWx1ZV90ZXh0X3JzcCkoIGJ0X2JkYWRkcl90ICpiZF9hZGRyLCBpbnQgbnVtX3ZhbCwKKyAgICAgICAgYnRyY19wbGF5ZXJfc2V0dGluZ190ZXh0X3QgKnBfdmFscyk7CiAKICAgICAvKiogUmV0dXJucyB0aGUgY3VycmVudCBzb25ncycgZWxlbWVudCBhdHRyaWJ1dGVzIHRleHQgKCJUaXRsZSIvIkFsYnVtIi8iQXJ0aXN0IikKICAgICAqKiAgbnVtX2F0dHI6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMnIHRleHQgY29udGFpbmVkIGluIHRoZSBwb2ludGVyIHBfYXR0cnMKICAgICAqLwotICAgIGJ0X3N0YXR1c190ICgqZ2V0X2VsZW1lbnRfYXR0cl9yc3ApKCB1aW50OF90IG51bV9hdHRyLCBidHJjX2VsZW1lbnRfYXR0cl92YWxfdCAqcF9hdHRycyk7CisgICAgYnRfc3RhdHVzX3QgKCpnZXRfZWxlbWVudF9hdHRyX3JzcCkoIGJ0X2JkYWRkcl90ICpiZF9hZGRyLCB1aW50OF90IG51bV9hdHRyLAorICAgICAgICBidHJjX2VsZW1lbnRfYXR0cl92YWxfdCAqcF9hdHRycyk7CiAKICAgICAvKiogUmVzcG9uc2UgdG8gc2V0IHBsYXllciBhdHRyaWJ1dGUgcmVxdWVzdCAoIlNodWZmbGUiLyJSZXBlYXQiKQogICAgICoqICByc3Bfc3RhdHVzOiBTdGF0dXMgb2Ygc2V0dGluZyB0aGUgcGxheWVyIGF0dHJpYnV0ZXMgZm9yIHRoZSBjdXJyZW50IG1lZGlhIHBsYXllcgogICAgICovCi0gICAgYnRfc3RhdHVzX3QgKCpzZXRfcGxheWVyX2FwcF92YWx1ZV9yc3ApKGJ0cmNfc3RhdHVzX3QgcnNwX3N0YXR1cyk7CisgICAgYnRfc3RhdHVzX3QgKCpzZXRfcGxheWVyX2FwcF92YWx1ZV9yc3ApKGJ0X2JkYWRkcl90ICpiZF9hZGRyLCBidHJjX3N0YXR1c190IHJzcF9zdGF0dXMpOwogCiAgICAgLyogUmVzcG9uc2UgdG8gdGhlIHJlZ2lzdGVyIG5vdGlmaWNhdGlvbiByZXF1ZXN0IChQbGF5IHN0YXRlIGNoYW5nZS90cmFjayBjaGFuZ2UvLi4uKS4KICAgICAqKiBldmVudF9pZDogUmVmZXJzIHRvIHRoZSBldmVudF9pZCB0aGlzIG5vdGlmaWNhdGlvbiBjaGFuZ2UgY29ycmVzcG9uZHMgdG9vCkBAIC0yODcsMTYgKzQ4MCw1MiBAQAogICAgICovCiAgICAgYnRfc3RhdHVzX3QgKCpzZXRfdm9sdW1lKSh1aW50OF90IHZvbHVtZSk7CiAKKyAgICAvKiBTZXQgYWRkcmVzc2VkIHBsYXllciByZXNwb25zZSBmcm9tIFRHIHRvIENUICovCisgICAgYnRfc3RhdHVzX3QgKCpzZXRfYWRkcmVzc2VkX3BsYXllcl9yc3ApKGJ0X2JkYWRkcl90ICpiZF9hZGRyLCBidHJjX3N0YXR1c190IHJzcF9zdGF0dXMpOworCisgICAgLyogU2V0IGJyb3dzZWQgcGxheWVyIHJlc3BvbnNlIGZyb20gVEcgdG8gQ1QgKi8KKyAgICBidF9zdGF0dXNfdCAoKnNldF9icm93c2VkX3BsYXllcl9yc3ApKGJ0X2JkYWRkcl90ICpiZF9hZGRyLCBidHJjX3N0YXR1c190IHJzcF9zdGF0dXMsCisgICAgICAgIHVpbnQzMl90IG51bV9pdGVtcywgdWludDE2X3QgY2hhcnNldF9pZCwgdWludDhfdCBmb2xkZXJfZGVwdGgsCisgICAgICAgIGJ0cmNfYnJfZm9sZGVyX25hbWVfdCAqcF9mb2xkZXJzKTsKKworICAgIC8qIEdldCBmb2xkZXIgaXRlbSBsaXN0IHJlc3BvbnNlIGZyb20gVEcgdG8gQ1QgKi8KKyAgICAgYnRfc3RhdHVzX3QgKCpnZXRfZm9sZGVyX2l0ZW1zX2xpc3RfcnNwKShidF9iZGFkZHJfdCAqYmRfYWRkciwgYnRyY19zdGF0dXNfdCByc3Bfc3RhdHVzLAorICAgICAgICB1aW50MTZfdCB1aWRfY291bnRlciwgdWludDhfdCBudW1faXRlbXMsIGJ0cmNfZm9sZGVyX2l0ZW1zX3QgKnBfaXRlbXMpOworCisgICAgLyogQ2hhbmdlIHBhdGggcmVzcG9uc2UgZnJvbSBURyB0byBDVCAqLworICAgIGJ0X3N0YXR1c190ICgqY2hhbmdlX3BhdGhfcnNwKShidF9iZGFkZHJfdCAqYmRfYWRkciwgYnRyY19zdGF0dXNfdCByc3Bfc3RhdHVzLAorICAgICAgICB1aW50MzJfdCBudW1faXRlbXMpOworCisgICAgLyoqIFJldHVybnMgdGhlIGVsZW1lbnQncyBhdHRyaWJ1dGVzIG51bV9hdHRyOiBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzJyB0ZXh0CisgICAgICogY29udGFpbmVkIGluIHRoZSBwb2ludGVyIHBfYXR0cnMKKyAgICAgKi8KKyAgICBidF9zdGF0dXNfdCAoKmdldF9pdGVtX2F0dHJfcnNwKShidF9iZGFkZHJfdCAqYmRfYWRkciwgYnRyY19zdGF0dXNfdCByc3Bfc3RhdHVzLAorICAgICAgICB1aW50OF90IG51bV9hdHRyLCBidHJjX2VsZW1lbnRfYXR0cl92YWxfdCAqcF9hdHRycyk7CisKKyAgICAvKiBwbGF5IG1lZGlhIGl0ZW0gcmVzcG9uc2UgZnJvbSBURyB0byBDVCAqLworICAgIGJ0X3N0YXR1c190ICgqcGxheV9pdGVtX3JzcCkoYnRfYmRhZGRyX3QgKmJkX2FkZHIsIGJ0cmNfc3RhdHVzX3QgcnNwX3N0YXR1cyk7CisKKyAgICAvKiBnZXQgdG90YWwgbnVtYmVyIG9mIGl0ZW1zIHJlc3BvbnNlIGZyb20gVEcgdG8gQ1QqLworICAgIGJ0X3N0YXR1c190ICgqZ2V0X3RvdGFsX251bV9vZl9pdGVtc19yc3ApKGJ0X2JkYWRkcl90ICpiZF9hZGRyLCBidHJjX3N0YXR1c190IHJzcF9zdGF0dXMsCisgICAgICAgIHVpbnQzMl90IHVpZF9jb3VudGVyLCB1aW50MzJfdCBudW1faXRlbXMpOworCisgICAgLyogU2VhcmNoIFZGUyByZXNwb25zZSBmcm9tIFRHIHRvIENUICovCisgICAgYnRfc3RhdHVzX3QgKCpzZWFyY2hfcnNwKShidF9iZGFkZHJfdCAqYmRfYWRkciwgYnRyY19zdGF0dXNfdCByc3Bfc3RhdHVzLCB1aW50MzJfdCB1aWRfY291bnRlciwKKyAgICAgICAgdWludDMyX3QgbnVtX2l0ZW1zKTsKKworICAgIC8qIGFkZF90b19ub3cgcGxheWluZyBsaXN0IHJlc3BvbnNlIGZyb20gVEcgdG8gQ1QgKi8KKyAgICBidF9zdGF0dXNfdCAoKmFkZF90b19ub3dfcGxheWluZ19yc3ApKGJ0X2JkYWRkcl90ICpiZF9hZGRyLCBidHJjX3N0YXR1c190IHJzcF9zdGF0dXMpOworCiAgICAgLyoqIENsb3NlcyB0aGUgaW50ZXJmYWNlLiAqLwogICAgIHZvaWQgICgqY2xlYW51cCkoIHZvaWQgKTsKIH0gYnRyY19pbnRlcmZhY2VfdDsKIAotCi10eXBlZGVmIHZvaWQgKCogYnRyY19wYXNzdGhyb3VnaF9yc3BfY2FsbGJhY2spIChpbnQgaWQsIGludCBrZXlfc3RhdGUpOwordHlwZWRlZiB2b2lkICgqIGJ0cmNfcGFzc3Rocm91Z2hfcnNwX2NhbGxiYWNrKSAoYnRfYmRhZGRyX3QgKmJkX2FkZHIsIGludCBpZCwgaW50IGtleV9zdGF0ZSk7CiAKIHR5cGVkZWYgdm9pZCAoKiBidHJjX2dyb3VwbmF2aWdhdGlvbl9yc3BfY2FsbGJhY2spIChpbnQgaWQsIGludCBrZXlfc3RhdGUpOwogCi10eXBlZGVmIHZvaWQgKCogYnRyY19jb25uZWN0aW9uX3N0YXRlX2NhbGxiYWNrKSAoYm9vbCBzdGF0ZSwgYnRfYmRhZGRyX3QgKmJkX2FkZHIpOwordHlwZWRlZiB2b2lkICgqIGJ0cmNfY29ubmVjdGlvbl9zdGF0ZV9jYWxsYmFjaykgKAorICAgIGJvb2wgcmNfY29ubmVjdCwgYm9vbCBidF9jb25uZWN0LCBidF9iZGFkZHJfdCAqYmRfYWRkcik7CiAKIHR5cGVkZWYgdm9pZCAoKiBidHJjX2N0cmxfZ2V0cmNmZWF0dXJlc19jYWxsYmFjaykgKGJ0X2JkYWRkcl90ICpiZF9hZGRyLCBpbnQgZmVhdHVyZXMpOwogCkBAIC0zMjUsNiArNTU0LDE2IEBACiB0eXBlZGVmIHZvaWQgKCogYnRyY19jdHJsX3BsYXlfc3RhdHVzX2NoYW5nZWRfY2FsbGJhY2spKGJ0X2JkYWRkcl90ICpiZF9hZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRyY19wbGF5X3N0YXR1c190IHBsYXlfc3RhdHVzKTsKIAordHlwZWRlZiB2b2lkICgqIGJ0cmNfY3RybF9nZXRfZm9sZGVyX2l0ZW1zX2NhbGxiYWNrICkoYnRfYmRhZGRyX3QgKmJkX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHJjX3N0YXR1c190IHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ0cmNfZm9sZGVyX2l0ZW1zX3QgKmZvbGRlcl9pdGVtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY291bnQpOworCit0eXBlZGVmIHZvaWQgKCogYnRyY19jdHJsX2NoYW5nZV9wYXRoX2NhbGxiYWNrKShidF9iZGFkZHJfdCAqYmRfYWRkciwgdWludDhfdCBjb3VudCk7CisKK3R5cGVkZWYgdm9pZCAoKiBidHJjX2N0cmxfc2V0X2Jyb3dzZWRfcGxheWVyX2NhbGxiYWNrICkoCisgICAgYnRfYmRhZGRyX3QgKmJkX2FkZHIsIHVpbnQ4X3QgbnVtX2l0ZW1zLCB1aW50OF90IGRlcHRoKTsKK3R5cGVkZWYgdm9pZCAoKiBidHJjX2N0cmxfc2V0X2FkZHJlc3NlZF9wbGF5ZXJfY2FsbGJhY2spKGJ0X2JkYWRkcl90ICpiZF9hZGRyLCB1aW50OF90IHN0YXR1cyk7CiAvKiogQlQtUkMgQ29udHJvbGxlciBjYWxsYmFjayBzdHJ1Y3R1cmUuICovCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgLyoqIHNldCB0byBzaXplb2YoQnRSY0NhbGxiYWNrcykgKi8KQEAgLTM0MSw2ICs1ODAsMTAgQEAKICAgICBidHJjX2N0cmxfdHJhY2tfY2hhbmdlZF9jYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19jaGFuZ2VkX2NiOwogICAgIGJ0cmNfY3RybF9wbGF5X3Bvc2l0aW9uX2NoYW5nZWRfY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgIHBsYXlfcG9zaXRpb25fY2hhbmdlZF9jYjsKICAgICBidHJjX2N0cmxfcGxheV9zdGF0dXNfY2hhbmdlZF9jYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICBwbGF5X3N0YXR1c19jaGFuZ2VkX2NiOworICAgIGJ0cmNfY3RybF9nZXRfZm9sZGVyX2l0ZW1zX2NhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9mb2xkZXJfaXRlbXNfY2I7CisgICAgYnRyY19jdHJsX2NoYW5nZV9wYXRoX2NhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlX2ZvbGRlcl9wYXRoX2NiOworICAgIGJ0cmNfY3RybF9zZXRfYnJvd3NlZF9wbGF5ZXJfY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgIHNldF9icm93c2VkX3BsYXllcl9jYjsKKyAgICBidHJjX2N0cmxfc2V0X2FkZHJlc3NlZF9wbGF5ZXJfY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICBzZXRfYWRkcmVzc2VkX3BsYXllcl9jYjsKIH0gYnRyY19jdHJsX2NhbGxiYWNrc190OwogCiAvKiogUmVwcmVzZW50cyB0aGUgc3RhbmRhcmQgQlQtUkMgQVZSQ1AgQ29udHJvbGxlciBpbnRlcmZhY2UuICovCkBAIC0zNjUsNiArNjA4LDMxIEBACiAgICAgYnRfc3RhdHVzX3QgKCpzZXRfcGxheWVyX2FwcF9zZXR0aW5nX2NtZCkgKGJ0X2JkYWRkcl90ICpiZF9hZGRyLCB1aW50OF90IG51bV9hdHRyaWIsCiAgICAgICAgICAgICB1aW50OF90KiBhdHRyaWJfaWRzLCB1aW50OF90KiBhdHRyaWJfdmFscyk7CiAKKyAgICAvKiogc2VuZCBjb21tYW5kIHRvIHBsYXkgYSBwYXJ0aWN1bGFyIGl0ZW0gKi8KKyAgICBidF9zdGF0dXNfdCAoKnBsYXlfaXRlbV9jbWQpICgKKyAgICAgICAgYnRfYmRhZGRyX3QgKmJkX2FkZHIsIHVpbnQ4X3Qgc2NvcGUsIHVpbnQ4X3QgKnVpZCwgdWludDE2X3QgdWlkX2NvdW50ZXIpOworCisgICAgLyoqIGdldCB0aGUgcGxheWJhY2sgc3RhdGUgKi8KKyAgICBidF9zdGF0dXNfdCAoKmdldF9wbGF5YmFja19zdGF0ZV9jbWQpIChidF9iZGFkZHJfdCAqYmRfYWRkcik7CisKKyAgICAvKiogZ2V0IHRoZSBub3cgcGxheWluZyBsaXN0ICovCisgICAgYnRfc3RhdHVzX3QgKCpnZXRfbm93X3BsYXlpbmdfbGlzdF9jbWQpIChidF9iZGFkZHJfdCAqYmRfYWRkciwgdWludDhfdCBzdGFydCwgdWludDhfdCBpdGVtcyk7CisKKyAgICAvKiogZ2V0IHRoZSBmb2xkZXIgbGlzdCAqLworICAgIGJ0X3N0YXR1c190ICgqZ2V0X2ZvbGRlcl9saXN0X2NtZCkgKGJ0X2JkYWRkcl90ICpiZF9hZGRyLCB1aW50OF90IHN0YXJ0LCB1aW50OF90IGl0ZW1zKTsKKworICAgIC8qKiBnZXQgdGhlIGZvbGRlciBsaXN0ICovCisgICAgYnRfc3RhdHVzX3QgKCpnZXRfcGxheWVyX2xpc3RfY21kKSAoYnRfYmRhZGRyX3QgKmJkX2FkZHIsIHVpbnQ4X3Qgc3RhcnQsIHVpbnQ4X3QgaXRlbXMpOworCisgICAgLyoqIGdldCB0aGUgZm9sZGVyIGxpc3QgKi8KKyAgICBidF9zdGF0dXNfdCAoKmNoYW5nZV9mb2xkZXJfcGF0aF9jbWQpIChidF9iZGFkZHJfdCAqYmRfYWRkciwgdWludDhfdCBkaXJlY3Rpb24sIHVpbnQ4X3QgKiB1aWQpOworCisgICAgLyoqIHNldCBicm93c2VkIHBsYXllciAqLworICAgIGJ0X3N0YXR1c190ICgqc2V0X2Jyb3dzZWRfcGxheWVyX2NtZCkgKGJ0X2JkYWRkcl90ICpiZF9hZGRyLCB1aW50MTZfdCBwbGF5ZXJfaWQpOworCisgICAgLyoqIHNldCBhZGRyZXNzZWQgcGxheWVyICovCisgICAgYnRfc3RhdHVzX3QgKCpzZXRfYWRkcmVzc2VkX3BsYXllcl9jbWQpIChidF9iZGFkZHJfdCAqYmRfYWRkciwgdWludDE2X3QgcGxheWVyX2lkKTsKKwogICAgIC8qKiBzZW5kIHJzcCB0byBzZXRfYWJzX3ZvbCByZWNlaXZlZCBmcm9tIHRhcmdldCAqLwogICAgIGJ0X3N0YXR1c190ICgqc2V0X3ZvbHVtZV9yc3ApIChidF9iZGFkZHJfdCAqYmRfYWRkciwgdWludDhfdCBhYnNfdm9sLCB1aW50OF90IGxhYmVsKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS9jYW1lcmEyLmggYi9pbmNsdWRlL2hhcmR3YXJlL2NhbWVyYTIuaAppbmRleCAyYjdhZGQwLi41NDdhMWQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2hhcmR3YXJlL2NhbWVyYTIuaAorKysgYi9pbmNsdWRlL2hhcmR3YXJlL2NhbWVyYTIuaApAQCAtMTQ2LDcgKzE0Niw3IEBACiB0eXBlZGVmIHN0cnVjdCBjYW1lcmEyX2pwZWdfYmxvYiB7CiAgICAgdWludDE2X3QganBlZ19ibG9iX2lkOwogICAgIHVpbnQzMl90IGpwZWdfc2l6ZTsKLX07Cit9IGNhbWVyYTJfanBlZ19ibG9iX3Q7CiAKIGVudW0gewogICAgIENBTUVSQTJfSlBFR19CTE9CX0lEID0gMHgwMEZGCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2NhbWVyYTMuaCBiL2luY2x1ZGUvaGFyZHdhcmUvY2FtZXJhMy5oCmluZGV4IGE3ZGYwZWUuLmNlYzJhYjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvY2FtZXJhMy5oCisrKyBiL2luY2x1ZGUvaGFyZHdhcmUvY2FtZXJhMy5oCkBAIC0xNDc5LDYgKzE0NzksMTMgQEAKICAgICAgKiAgICAgIGFuZHJvaWQubGVucy5vcHRpY2FsU3RhYmlsaXphdGlvbk1vZGUgKGlmIGl0IGlzIHN1cHBvcnRlZCkKICAgICAgKiAgICAgIGFuZHJvaWQuc2NhbGVyLmNyb3BSZWdpb24KICAgICAgKiAgICAgIGFuZHJvaWQuc3RhdGlzdGljcy5mYWNlRGV0ZWN0TW9kZSAoaWYgaXQgaXMgc3VwcG9ydGVkKQorICAgICAqICAgNi4gVG8gcmVkdWNlIHRoZSBhbW91bnQgb2YgZGF0YSBwYXNzZWQgYWNyb3NzIHByb2Nlc3MgYm91bmRhcmllcyBhdAorICAgICAqICAgICAgaGlnaCBmcmFtZSByYXRlLCB3aXRoaW4gb25lIGJhdGNoLCBjYW1lcmEgZnJhbWV3b3JrIG9ubHkgcHJvcGFnYXRlcworICAgICAqICAgICAgdGhlIGxhc3Qgc2h1dHRlciBub3RpZnkgYW5kIHRoZSBsYXN0IGNhcHR1cmUgcmVzdWx0cyAoaW5jbHVkaW5nIHBhcnRpYWwKKyAgICAgKiAgICAgIHJlc3VsdHMgYW5kIGZpbmFsIHJlc3VsdCkgdG8gdGhlIGFwcC4gVGhlIHNodXR0ZXIgbm90aWZpZXMgYW5kIGNhcHR1cmUKKyAgICAgKiAgICAgIHJlc3VsdHMgZm9yIHRoZSBvdGhlciByZXF1ZXN0cyBpbiB0aGUgYmF0Y2ggYXJlIGRlcml2ZWQgYnkKKyAgICAgKiAgICAgIHRoZSBjYW1lcmEgZnJhbWV3b3JrLiBBcyBhIHJlc3VsdCwgdGhlIEhBTCBjYW4gcmV0dXJuIGVtcHR5IG1ldGFkYXRhCisgICAgICogICAgICBleGNlcHQgZm9yIHRoZSBsYXN0IHJlc3VsdCBpbiB0aGUgYmF0Y2guCiAgICAgICoKICAgICAgKiBGb3IgbW9yZSBkZXRhaWxzIGFib3V0IGhpZ2ggc3BlZWQgc3RyZWFtIHJlcXVpcmVtZW50cywgc2VlCiAgICAgICogYW5kcm9pZC5jb250cm9sLmF2YWlsYWJsZUhpZ2hTcGVlZFZpZGVvQ29uZmlndXJhdGlvbnMgYW5kIENPTlNUUkFJTkVEX0hJR0hfU1BFRURfVklERU8KQEAgLTE1OTcsNiArMTYwNCwxMyBAQAogICAgICAqICAgdmFsdWUgb2YgdGhpcyBpcyAwLgogICAgICAqICAgRm9yIGFsbCBzdHJlYW1zIHBhc3NlZCB2aWEgY29uZmlndXJlX3N0cmVhbXMoKSwgdGhlIEhBTCBtdXN0IHdyaXRlCiAgICAgICogICBvdmVyIHRoaXMgZmllbGQgd2l0aCBpdHMgdXNhZ2UgZmxhZ3MuCisgICAgICoKKyAgICAgKiAgIEZyb20gQW5kcm9pZCBPLCB0aGUgdXNhZ2UgZmxhZyBmb3IgYW4gb3V0cHV0IHN0cmVhbSBtYXkgYmUgYml0d2lzZQorICAgICAqICAgY29tYmluYXRpb24gb2YgdXNhZ2UgZmxhZ3MgZm9yIG11bHRpcGxlIGNvbnN1bWVycywgZm9yIHRoZSBwdXJwb3NlIG9mCisgICAgICogICBzaGFyaW5nIG9uZSBjYW1lcmEgc3RyZWFtIGJldHdlZW4gdGhvc2UgY29uc3VtZXJzLiBUaGUgSEFMIG11c3QgZmFpbAorICAgICAqICAgY29uZmlndXJlX3N0cmVhbXMgY2FsbCB3aXRoIC1FSU5WQUwgaWYgdGhlIGNvbWJpbmVkIGZsYWdzIGNhbm5vdCBiZQorICAgICAqICAgc3VwcG9ydGVkIGR1ZSB0byBpbWNvbXBhdGlibGUgYnVmZmVyIGZvcm1hdCwgZGF0YVNwYWNlLCBvciBvdGhlciBoYXJkd2FyZQorICAgICAqICAgbGltaXRhdGlvbnMuCiAgICAgICovCiAgICAgdWludDMyX3QgdXNhZ2U7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvY2FtZXJhX2NvbW1vbi5oIGIvaW5jbHVkZS9oYXJkd2FyZS9jYW1lcmFfY29tbW9uLmgKaW5kZXggYzc0ZDdiYi4uN2JhZmE4OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9jYW1lcmFfY29tbW9uLmgKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS9jYW1lcmFfY29tbW9uLmgKQEAgLTE0Myw4ICsxNDMsOCBAQAogI2RlZmluZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMCBIQVJEV0FSRV9ERVZJQ0VfQVBJX1ZFUlNJT04oMSwgMCkgLy8gREVQUkVDQVRFRAogI2RlZmluZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMCBIQVJEV0FSRV9ERVZJQ0VfQVBJX1ZFUlNJT04oMiwgMCkgLy8gTk8gTE9OR0VSIFNVUFBPUlRFRAogI2RlZmluZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMSBIQVJEV0FSRV9ERVZJQ0VfQVBJX1ZFUlNJT04oMiwgMSkgLy8gTk8gTE9OR0VSIFNVUFBPUlRFRAotI2RlZmluZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMCBIQVJEV0FSRV9ERVZJQ0VfQVBJX1ZFUlNJT04oMywgMCkKLSNkZWZpbmUgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzEgSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKDMsIDEpCisjZGVmaW5lIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wIEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTigzLCAwKSAvLyBOTyBMT05HRVIgU1VQUE9SVEVECisjZGVmaW5lIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18xIEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTigzLCAxKSAvLyBOTyBMT05HRVIgU1VQUE9SVEVECiAjZGVmaW5lIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yIEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTigzLCAyKQogI2RlZmluZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMyBIQVJEV0FSRV9ERVZJQ0VfQVBJX1ZFUlNJT04oMywgMykKICNkZWZpbmUgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzQgSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKDMsIDQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2NvbnRleHRfaHViLmggYi9pbmNsdWRlL2hhcmR3YXJlL2NvbnRleHRfaHViLmgKaW5kZXggODI4ZjJkZC4uYWFhNDI3NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9jb250ZXh0X2h1Yi5oCisrKyBiL2luY2x1ZGUvaGFyZHdhcmUvY29udGV4dF9odWIuaApAQCAtNzgsMTcgKzc4LDE3IEBACiAjZGVmaW5lIE5BTk9BUFBfVkVORE9SX0FMTF9BUFBTICAgICAgIDB4MDAwMDAwMDAwMEZGRkZGRlVMTAogCiAjZGVmaW5lIE5BTk9BUFBfVkVORE9SKG5hbWUpIFwKLSAgICAoKCh1aW50NjRfdCluYW1lWzBdIDw8IDU2KSB8IFwKLSAgICAoKHVpbnQ2NF90KW5hbWVbMV0gPDwgNDgpIHwgXAotICAgICgodWludDY0X3QpbmFtZVsyXSA8PCA0MCkgfCBcCi0gICAgKCh1aW50NjRfdCluYW1lWzNdIDw8IDMyKSB8IFwKLSAgICAoKHVpbnQ2NF90KW5hbWVbNF0gPDwgMjQpKQorICAgICgoKHVpbnQ2NF90KShuYW1lKVswXSA8PCA1NikgfCBcCisgICAgKCh1aW50NjRfdCkobmFtZSlbMV0gPDwgNDgpIHwgXAorICAgICgodWludDY0X3QpKG5hbWUpWzJdIDw8IDQwKSB8IFwKKyAgICAoKHVpbnQ2NF90KShuYW1lKVszXSA8PCAzMikgfCBcCisgICAgKCh1aW50NjRfdCkobmFtZSlbNF0gPDwgMjQpKQogCiAvKgogICogZ2VuZXJhdGVzIHRoZSBOQU5PQVBQIElEIGZyb20gdmVuZG9yIGlkIGFuZCBhcHAgc2VxIyBpZAogICovCiAjZGVmaW5lIE5BTk9fQVBQX0lEKHZlbmRvciwgc2VxX2lkKSBcCi0JKCgodWludDY0X3QpdmVuZG9yICYgTkFOT0FQUF9WRU5ET1JTX0FMTCkgfCAoKHVpbnQ2NF90KXNlcV9pZCAmIE5BTk9BUFBfVkVORE9SX0FMTF9BUFBTKSkKKwkoKCh1aW50NjRfdCkodmVuZG9yKSAmIE5BTk9BUFBfVkVORE9SU19BTEwpIHwgKCh1aW50NjRfdCkoc2VxX2lkKSAmIE5BTk9BUFBfVkVORE9SX0FMTF9BUFBTKSkKIAogc3RydWN0IGh1Yl9hcHBfbmFtZV90IHsKICAgICB1aW50NjRfdCBpZDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvZmIuaCBiL2luY2x1ZGUvaGFyZHdhcmUvZmIuaAppbmRleCA5ZGY5NDE2Li42NTcyMGEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2hhcmR3YXJlL2ZiLmgKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS9mYi5oCkBAIC0xNjAsNyArMTYwLDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50IGZyYW1lYnVmZmVyX29wZW4oY29uc3Qgc3RydWN0IGh3X21vZHVsZV90KiBtb2R1bGUsCiAgICAgICAgIHN0cnVjdCBmcmFtZWJ1ZmZlcl9kZXZpY2VfdCoqIGRldmljZSkgewogICAgIHJldHVybiBtb2R1bGUtPm1ldGhvZHMtPm9wZW4obW9kdWxlLAotICAgICAgICAgICAgR1JBTExPQ19IQVJEV0FSRV9GQjAsIChzdHJ1Y3QgaHdfZGV2aWNlX3QqKilkZXZpY2UpOworICAgICAgICAgICAgR1JBTExPQ19IQVJEV0FSRV9GQjAsIFRPX0hXX0RFVklDRV9UX09QRU4oZGV2aWNlKSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGZyYW1lYnVmZmVyX2Nsb3NlKHN0cnVjdCBmcmFtZWJ1ZmZlcl9kZXZpY2VfdCogZGV2aWNlKSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2ZpbmdlcnByaW50LmggYi9pbmNsdWRlL2hhcmR3YXJlL2ZpbmdlcnByaW50LmgKaW5kZXggNjE4Y2E3ZS4uNmUwOGQ2YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9maW5nZXJwcmludC5oCisrKyBiL2luY2x1ZGUvaGFyZHdhcmUvZmluZ2VycHJpbnQuaApAQCAtMTgsMTAgKzE4LDEyIEBACiAjZGVmaW5lIEFORFJPSURfSU5DTFVERV9IQVJEV0FSRV9GSU5HRVJQUklOVF9ICiAKICNpbmNsdWRlIDxoYXJkd2FyZS9od19hdXRoX3Rva2VuLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KIAogI2RlZmluZSBGSU5HRVJQUklOVF9NT0RVTEVfQVBJX1ZFUlNJT05fMV8wIEhBUkRXQVJFX01PRFVMRV9BUElfVkVSU0lPTigxLCAwKQogI2RlZmluZSBGSU5HRVJQUklOVF9NT0RVTEVfQVBJX1ZFUlNJT05fMl8wIEhBUkRXQVJFX01PRFVMRV9BUElfVkVSU0lPTigyLCAwKQogI2RlZmluZSBGSU5HRVJQUklOVF9NT0RVTEVfQVBJX1ZFUlNJT05fMl8xIEhBUkRXQVJFX01PRFVMRV9BUElfVkVSU0lPTigyLCAxKQorI2RlZmluZSBGSU5HRVJQUklOVF9NT0RVTEVfQVBJX1ZFUlNJT05fM18wIEhBUkRXQVJFX01PRFVMRV9BUElfVkVSU0lPTigzLCAwKQogI2RlZmluZSBGSU5HRVJQUklOVF9IQVJEV0FSRV9NT0RVTEVfSUQgImZpbmdlcnByaW50IgogCiB0eXBlZGVmIGVudW0gZmluZ2VycHJpbnRfbXNnX3R5cGUgewpAQCAtNTAsNiArNTIsNyBAQAogICAgIEZJTkdFUlBSSU5UX0VSUk9SX05PX1NQQUNFID0gNCwgLyogTm8gc3BhY2UgYXZhaWxhYmxlIHRvIHN0b3JlIGEgdGVtcGxhdGUgKi8KICAgICBGSU5HRVJQUklOVF9FUlJPUl9DQU5DRUxFRCA9IDUsIC8qIFRoZSBjdXJyZW50IG9wZXJhdGlvbiBjYW4ndCBwcm9jZWVkLiBTZWUgYWJvdmUuICovCiAgICAgRklOR0VSUFJJTlRfRVJST1JfVU5BQkxFX1RPX1JFTU9WRSA9IDYsIC8qIGZpbmdlcnByaW50IHdpdGggZ2l2ZW4gaWQgY2FuJ3QgYmUgcmVtb3ZlZCAqLworICAgIEZJTkdFUlBSSU5UX0VSUk9SX0xPQ0tPVVQgPSA3LCAvKiB0aGUgZmluZ2VycHJpbnQgaGFyZHdhcmUgaXMgaW4gbG9ja291dCBkdWUgdG8gdG9vIG1hbnkgYXR0ZW1wdHMgKi8KICAgICBGSU5HRVJQUklOVF9FUlJPUl9WRU5ET1JfQkFTRSA9IDEwMDAgLyogdmVuZG9yLXNwZWNpZmljIGVycm9yIG1lc3NhZ2VzIHN0YXJ0IGhlcmUgKi8KIH0gZmluZ2VycHJpbnRfZXJyb3JfdDsKIApAQCAtNjgsNiArNzEsOCBAQAogICAgIEZJTkdFUlBSSU5UX0FDUVVJUkVEX0lNQUdFUl9ESVJUWSA9IDMsIC8qIHNlbnNvciBuZWVkcyB0byBiZSBjbGVhbmVkICovCiAgICAgRklOR0VSUFJJTlRfQUNRVUlSRURfVE9PX1NMT1cgPSA0LCAvKiBtb3N0bHkgc3dpcGUtdHlwZSBzZW5zb3JzOyBub3QgZW5vdWdoIGRhdGEgY29sbGVjdGVkICovCiAgICAgRklOR0VSUFJJTlRfQUNRVUlSRURfVE9PX0ZBU1QgPSA1LCAvKiBmb3Igc3dpcGUgYW5kIGFyZWEgc2Vuc29yczsgdGVsbCB1c2VyIHRvIHNsb3cgZG93biovCisgICAgRklOR0VSUFJJTlRfQUNRVUlSRURfREVURUNURUQgPSA2LCAvKiB3aGVuIHRoZSBmaW5nZXIgaXMgZmlyc3QgZGV0ZWN0ZWQuIFVzZWQgdG8gb3B0aW1pemUgd2FrZXVwLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvdWxkIGJlIGZvbGxvd2VkIGJ5IG9uZSBvZiB0aGUgYWJvdmUgbWVzc2FnZXMgKi8KICAgICBGSU5HRVJQUklOVF9BQ1FVSVJFRF9WRU5ET1JfQkFTRSA9IDEwMDAgLyogdmVuZG9yLXNwZWNpZmljIGFjcXVpc2l0aW9uIG1lc3NhZ2VzIHN0YXJ0IGhlcmUgKi8KIH0gZmluZ2VycHJpbnRfYWNxdWlyZWRfaW5mb190OwogCkBAIC04NCwxNCArODksMTMgQEAKICAgICB1aW50NjRfdCBtc2c7IC8qIFZlbmRvciBzcGVjaWZpYyBtZXNzYWdlLiBVc2VkIGZvciB1c2VyIGd1aWRhbmNlICovCiB9IGZpbmdlcnByaW50X2Vucm9sbF90OwogCi10eXBlZGVmIHN0cnVjdCBmaW5nZXJwcmludF9lbnVtZXJhdGVkIHsKK3R5cGVkZWYgc3RydWN0IGZpbmdlcnByaW50X2l0ZXJhdG9yIHsKICAgICBmaW5nZXJwcmludF9maW5nZXJfaWRfdCBmaW5nZXI7CiAgICAgdWludDMyX3QgcmVtYWluaW5nX3RlbXBsYXRlczsKLX0gZmluZ2VycHJpbnRfZW51bWVyYXRlZF90OworfSBmaW5nZXJwcmludF9pdGVyYXRvcl90OwogCi10eXBlZGVmIHN0cnVjdCBmaW5nZXJwcmludF9yZW1vdmVkIHsKLSAgICBmaW5nZXJwcmludF9maW5nZXJfaWRfdCBmaW5nZXI7Ci19IGZpbmdlcnByaW50X3JlbW92ZWRfdDsKK3R5cGVkZWYgZmluZ2VycHJpbnRfaXRlcmF0b3JfdCBmaW5nZXJwcmludF9lbnVtZXJhdGVkX3Q7Cit0eXBlZGVmIGZpbmdlcnByaW50X2l0ZXJhdG9yX3QgZmluZ2VycHJpbnRfcmVtb3ZlZF90OwogCiB0eXBlZGVmIHN0cnVjdCBmaW5nZXJwcmludF9hY3F1aXJlZCB7CiAgICAgZmluZ2VycHJpbnRfYWNxdWlyZWRfaW5mb190IGFjcXVpcmVkX2luZm87IC8qIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbWFnZSAqLwpAQCAtMjA2LDEyICsyMTAsMTMgQEAKICAgICAvKgogICAgICAqIEVudW1lcmF0ZSBhbGwgdGhlIGZpbmdlcnByaW50IHRlbXBsYXRlcyBmb3VuZCBpbiB0aGUgZGlyZWN0b3J5IHNldCBieQogICAgICAqIHNldF9hY3RpdmVfZ3JvdXAoKQotICAgICAqIEZvciBlYWNoIHRlbXBsYXRlIGZvdW5kIG5vdGlmeSgpIHdpbGwgYmUgY2FsbGVkIHdpdGg6CisgICAgICogRm9yIGVhY2ggdGVtcGxhdGUgZm91bmQgYSBub3RpZnkoKSB3aWxsIGJlIGNhbGxlZCB3aXRoOgogICAgICAqIGZpbmdlcnByaW50X21zZy50eXBlID09IEZJTkdFUlBSSU5UX1RFTVBMQVRFX0VOVU1FUkFURUQKICAgICAgKiBmaW5nZXJwcmludF9tc2cuZGF0YS5lbnVtZXJhdGVkLmZpbmdlciBpbmRpY2F0aW5nIGEgdGVtcGxhdGUgaWQKICAgICAgKiBmaW5nZXJwcmludF9tc2cuZGF0YS5lbnVtZXJhdGVkLnJlbWFpbmluZ190ZW1wbGF0ZXMgaW5kaWNhdGluZyBob3cgbWFueSBtb3JlCiAgICAgICogZW51bWVyYXRpb24gbWVzc2FnZXMgdG8gZXhwZWN0LgotICAgICAqCisgICAgICogTm90ZTogSWYgdGhlcmUgYXJlIG5vIGZpbmdlcnByaW50cywgdGhlbiB0aGlzIHNob3VsZCByZXR1cm4gMCBhbmQgdGhlIGZpcnN0IGZpbmdlcnByaW50CisgICAgICogICAgICAgICAgICAgICAgICBlbnVtZXJhdGVkIHNob3VsZCBoYXZlIGZpbmdlcmlkPTAgYW5kIHJlbWFpbmluZz0wCiAgICAgICogRnVuY3Rpb24gcmV0dXJuOiAwIGlmIGVudW1lcmF0ZSByZXF1ZXN0IGlzIGFjY2VwdGVkCiAgICAgICogICAgICAgICAgICAgICAgICBvciBhIG5lZ2F0aXZlIG51bWJlciBpbiBjYXNlIG9mIGVycm9yLCBnZW5lcmFsbHkgZnJvbSB0aGUgZXJybm8uaCBzZXQuCiAgICAgICovCkBAIC0yMjEsOSArMjI2LDE0IEBACiAgICAgICogRmluZ2VycHJpbnQgcmVtb3ZlIHJlcXVlc3Q6CiAgICAgICogRGVsZXRlcyBhIGZpbmdlcnByaW50IHRlbXBsYXRlLgogICAgICAqIFdvcmtzIG9ubHkgd2l0aGluIHRoZSBwYXRoIHNldCBieSBzZXRfYWN0aXZlX2dyb3VwKCkuCi0gICAgICogbm90aWZ5KCkgd2lsbCBiZSBjYWxsZWQgd2l0aCBkZXRhaWxzIG9uIHRoZSB0ZW1wbGF0ZSBkZWxldGVkLgotICAgICAqIGZpbmdlcnByaW50X21zZy50eXBlID09IEZJTkdFUlBSSU5UX1RFTVBMQVRFX1JFTU9WRUQgYW5kCi0gICAgICogZmluZ2VycHJpbnRfbXNnLmRhdGEucmVtb3ZlZC5maW5nZXIgaW5kaWNhdGluZyB0aGUgdGVtcGxhdGUgaWQgcmVtb3ZlZC4KKyAgICAgKiBUaGUgZmlkIHBhcmFtZXRlciBjYW4gYmUgdXNlZCBhcyBhIHdpZGNhcmQ6CisgICAgICogICAqIGZpZCA9PSAwIC0tIGRlbGV0ZSBhbGwgdGhlIHRlbXBsYXRlcyBpbiB0aGUgZ3JvdXAuCisgICAgICogICAqIGZpZCAhPSAwIC0tIGRlbGV0ZSB0aGlzIHNwZWNpZmljIHRlbXBsYXRlIGZyb20gdGhlIGdyb3VwLgorICAgICAqIEZvciBlYWNoIHRlbXBsYXRlIGZvdW5kIGEgbm90aWZ5KCkgd2lsbCBiZSBjYWxsZWQgd2l0aDoKKyAgICAgKiBmaW5nZXJwcmludF9tc2cudHlwZSA9PSBGSU5HRVJQUklOVF9URU1QTEFURV9SRU1PVkVECisgICAgICogZmluZ2VycHJpbnRfbXNnLmRhdGEucmVtb3ZlZC5maW5nZXIgaW5kaWNhdGluZyBhIHRlbXBsYXRlIGlkIGRlbGV0ZWQKKyAgICAgKiBmaW5nZXJwcmludF9tc2cuZGF0YS5yZW1vdmVkLnJlbWFpbmluZ190ZW1wbGF0ZXMgaW5kaWNhdGluZyBob3cgbWFueSBtb3JlCisgICAgICogdGVtcGxhdGVzIHdpbGwgYmUgZGVsZXRlZCBieSB0aGlzIG9wZXJhdGlvbi4KICAgICAgKgogICAgICAqIEZ1bmN0aW9uIHJldHVybjogMCBpZiBmaW5nZXJwcmludCB0ZW1wbGF0ZShzKSBjYW4gYmUgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQKICAgICAgKiAgICAgICAgICAgICAgICAgIG9yIGEgbmVnYXRpdmUgbnVtYmVyIGluIGNhc2Ugb2YgZXJyb3IsIGdlbmVyYWxseSBmcm9tIHRoZSBlcnJuby5oIHNldC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvZnVzZWRfbG9jYXRpb24uaCBiL2luY2x1ZGUvaGFyZHdhcmUvZnVzZWRfbG9jYXRpb24uaAppbmRleCA3MzM2MGExLi41NTBlMTkzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2hhcmR3YXJlL2Z1c2VkX2xvY2F0aW9uLmgKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS9mdXNlZF9sb2NhdGlvbi5oCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgogCisjaW5jbHVkZSAiZ25zcy1iYXNlLmgiCiAKIC8qKgogICogVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2Ugb2YgdGhlIEZ1c2VkIExvY2F0aW9uIFByb3ZpZGVyLgpAQCAtMTAzLDE2ICsxMDQsNiBAQAogI2RlZmluZSBGTFBfU1RBVFVTX0xPQ0FUSU9OX1VOQVZBSUxBQkxFICAgICAgIDEKIAogLyoqCi0gKiBUaGlzIGNvbnN0YW50IGlzIHVzZWQgd2l0aCB0aGUgYmF0Y2hlZCBsb2NhdGlvbnMKLSAqIEFQSXMuIEJhdGNoaW5nIGlzIG1hbmRhdG9yeSB3aGVuIEZMUCBpbXBsZW1lbnRhdGlvbgotICogaXMgc3VwcG9ydGVkLiBJZiB0aGUgZmxhZyBpcyBzZXQsIHRoZSBoYXJkd2FyZSBpbXBsZW1lbnRhdGlvbgotICogd2lsbCB3YWtlIHVwIHRoZSBhcHBsaWNhdGlvbiBwcm9jZXNzb3Igd2hlbiB0aGUgRklGTyBpcyBmdWxsLAotICogSWYgdGhlIGZsYWcgaXMgbm90IHNldCwgdGhlIGhhcmR3YXJlIGltcGxlbWVudGF0aW9uIHdpbGwgZHJvcAotICogdGhlIG9sZGVzdCBkYXRhIHdoZW4gdGhlIEZJRk8gaXMgZnVsbC4KLSAqLwotI2RlZmluZSBGTFBfQkFUQ0hfV0FLRVVQX09OX0ZJRk9fRlVMTCAgICAgICAgMHgwMDAwMDAxCi0KLS8qKgogICogV2hpbGUgYmF0Y2hpbmcsIHRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgbm90IGNhbGwgdGhlCiAgKiBmbHBfbG9jYXRpb25fY2FsbGJhY2sgb24gZXZlcnkgbG9jYXRpb24gZml4LiBIb3dldmVyLAogICogc29tZXRpbWVzIGluIGhpZ2ggcG93ZXIgbW9kZSwgdGhlIHN5c3RlbSBtaWdodCBuZWVkCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2duc3MtYmFzZS5oIGIvaW5jbHVkZS9oYXJkd2FyZS9nbnNzLWJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTYwMjBkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS9nbnNzLWJhc2UuaApAQCAtMCwwICsxLDI3NSBAQAorLy8gVGhpcyBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQgYnkgaGlkbC1nZW4uIERvIG5vdCBlZGl0IG1hbnVhbGx5LgorLy8gU291cmNlOiBhbmRyb2lkLmhhcmR3YXJlLmduc3NAMS4wCisvLyBSb290OiBhbmRyb2lkLmhhcmR3YXJlOmhhcmR3YXJlL2ludGVyZmFjZXMKKworI2lmbmRlZiBISURMX0dFTkVSQVRFRF9BTkRST0lEX0hBUkRXQVJFX0dOU1NfVjFfMF9FWFBPUlRFRF9DT05TVEFOVFNfSF8KKyNkZWZpbmUgSElETF9HRU5FUkFURURfQU5EUk9JRF9IQVJEV0FSRV9HTlNTX1YxXzBfRVhQT1JURURfQ09OU1RBTlRTX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworZW51bSB7CisgICAgR05TU19NQVhfU1ZTX0NPVU5UID0gNjR1LCAvLyA2NAorfTsKKworZW51bSB7CisgICAgR05TU19DT05TVEVMTEFUSU9OX1VOS05PV04gPSAwLAorICAgIEdOU1NfQ09OU1RFTExBVElPTl9HUFMgPSAxLAorICAgIEdOU1NfQ09OU1RFTExBVElPTl9TQkFTID0gMiwKKyAgICBHTlNTX0NPTlNURUxMQVRJT05fR0xPTkFTUyA9IDMsCisgICAgR05TU19DT05TVEVMTEFUSU9OX1FaU1MgPSA0LAorICAgIEdOU1NfQ09OU1RFTExBVElPTl9CRUlET1UgPSA1LAorICAgIEdOU1NfQ09OU1RFTExBVElPTl9HQUxJTEVPID0gNiwKK307CisKK2VudW0geworICAgIEdQU19MT0NBVElPTl9IQVNfTEFUX0xPTkcgPSAxLCAvLyAweDAwMDEKKyAgICBHUFNfTE9DQVRJT05fSEFTX0FMVElUVURFID0gMiwgLy8gMHgwMDAyCisgICAgR1BTX0xPQ0FUSU9OX0hBU19TUEVFRCA9IDQsIC8vIDB4MDAwNAorICAgIEdQU19MT0NBVElPTl9IQVNfQkVBUklORyA9IDgsIC8vIDB4MDAwOAorICAgIEdQU19MT0NBVElPTl9IQVNfSE9SSVpPTlRBTF9BQ0NVUkFDWSA9IDE2LCAvLyAweDAwMTAKKyAgICBHUFNfTE9DQVRJT05fSEFTX1ZFUlRJQ0FMX0FDQ1VSQUNZID0gMzIsIC8vIDB4MDAyMAorICAgIEdQU19MT0NBVElPTl9IQVNfU1BFRURfQUNDVVJBQ1kgPSA2NCwgLy8gMHgwMDQwCisgICAgR1BTX0xPQ0FUSU9OX0hBU19CRUFSSU5HX0FDQ1VSQUNZID0gMTI4LCAvLyAweDAwODAKK307CisKK2VudW0geworICAgIEFQTl9JUF9JTlZBTElEID0gMCwKKyAgICBBUE5fSVBfSVBWNCA9IDEsCisgICAgQVBOX0lQX0lQVjYgPSAyLAorICAgIEFQTl9JUF9JUFY0VjYgPSAzLAorfTsKKworZW51bSB7CisgICAgQUdQU19UWVBFX1NVUEwgPSAxLAorICAgIEFHUFNfVFlQRV9DMksgPSAyLAorfTsKKworZW51bSB7CisgICAgR05TU19SRVFVRVNUX0FHTlNTX0RBVEFfQ09OTiA9IDEsCisgICAgR05TU19SRUxFQVNFX0FHTlNTX0RBVEFfQ09OTiA9IDIsCisgICAgR05TU19BR05TU19EQVRBX0NPTk5FQ1RFRCA9IDMsCisgICAgR05TU19BR05TU19EQVRBX0NPTk5fRE9ORSA9IDQsCisgICAgR05TU19BR05TU19EQVRBX0NPTk5fRkFJTEVEID0gNSwKK307CisKK2VudW0geworICAgIEFHUFNfU0VUSURfVFlQRV9OT05FID0gMCwKKyAgICBBR1BTX1NFVElEX1RZUEVfSU1TSSA9IDEsCisgICAgQUdQU19TRVRJRF9UWVBFX01TSVNETSA9IDIsCit9OworCitlbnVtIHsKKyAgICBBR1BTX1JJTF9ORVRXT1JLX1RZUEVfTU9CSUxFID0gMCwKKyAgICBBR1BTX1JJTF9ORVRXT1JLX1RZUEVfV0lGSSA9IDEsCisgICAgQUdQU19SSUxfTkVUV09SS19UWVBFX01NUyA9IDIsCisgICAgQUdQU19SSUxfTkVUV09SS19UWVBFX1NVUEwgPSAzLAorICAgIEFHUFNfUklMX05FVFdPUktfVFlQRV9EVU4gPSA0LAorICAgIEFHUFNfUklMX05FVFdPUktfVFlQRV9ISVBSSSA9IDUsCisgICAgQUdQU19SSUxfTkVUV09SS19UWVBFX1dJTUFYID0gNiwKK307CisKK2VudW0geworICAgIEFHUFNfUkVGX0xPQ0FUSU9OX1RZUEVfR1NNX0NFTExJRCA9IDEsCisgICAgQUdQU19SRUZfTE9DQVRJT05fVFlQRV9VTVRTX0NFTExJRCA9IDIsCisgICAgQUdQU19SRUZfTE9DQVRJT05fVFlQRV9MVEVfQ0VMTElEID0gNCwKK307CisKK2VudW0geworICAgIEFHUFNfUklMX1JFUVVFU1RfU0VUSURfSU1TSSA9IDF1LCAvLyAoMSA8PCAwTCkKKyAgICBBR1BTX1JJTF9SRVFVRVNUX1NFVElEX01TSVNETiA9IDJ1LCAvLyAoMSA8PCAxTCkKK307CisKK2VudW0geworICAgIEdQU19QT1NJVElPTl9NT0RFX1NUQU5EQUxPTkUgPSAwLAorICAgIEdQU19QT1NJVElPTl9NT0RFX01TX0JBU0VEID0gMSwKKyAgICBHUFNfUE9TSVRJT05fTU9ERV9NU19BU1NJU1RFRCA9IDIsCit9OworCitlbnVtIHsKKyAgICBHUFNfUE9TSVRJT05fUkVDVVJSRU5DRV9QRVJJT0RJQyA9IDB1LCAvLyAwCisgICAgR1BTX1BPU0lUSU9OX1JFQ1VSUkVOQ0VfU0lOR0xFID0gMXUsIC8vIDEKK307CisKK2VudW0geworICAgIEdQU19ERUxFVEVfRVBIRU1FUklTID0gMSwgLy8gMHgwMDAxCisgICAgR1BTX0RFTEVURV9BTE1BTkFDID0gMiwgLy8gMHgwMDAyCisgICAgR1BTX0RFTEVURV9QT1NJVElPTiA9IDQsIC8vIDB4MDAwNAorICAgIEdQU19ERUxFVEVfVElNRSA9IDgsIC8vIDB4MDAwOAorICAgIEdQU19ERUxFVEVfSU9OTyA9IDE2LCAvLyAweDAwMTAKKyAgICBHUFNfREVMRVRFX1VUQyA9IDMyLCAvLyAweDAwMjAKKyAgICBHUFNfREVMRVRFX0hFQUxUSCA9IDY0LCAvLyAweDAwNDAKKyAgICBHUFNfREVMRVRFX1NWRElSID0gMTI4LCAvLyAweDAwODAKKyAgICBHUFNfREVMRVRFX1NWU1RFRVIgPSAyNTYsIC8vIDB4MDEwMAorICAgIEdQU19ERUxFVEVfU0FEQVRBID0gNTEyLCAvLyAweDAyMDAKKyAgICBHUFNfREVMRVRFX1JUSSA9IDEwMjQsIC8vIDB4MDQwMAorICAgIEdQU19ERUxFVEVfQ0VMTERCX0lORk8gPSAzMjc2OCwgLy8gMHg4MDAwCisgICAgR1BTX0RFTEVURV9BTEwgPSA2NTUzNSwgLy8gMHhGRkZGCit9OworCitlbnVtIHsKKyAgICBGTFBfQkFUQ0hfV0FLRVVQX09OX0ZJRk9fRlVMTCA9IDEsIC8vIDB4MDEKK307CisKK2VudW0geworICAgIEdQU19DQVBBQklMSVRZX1NDSEVEVUxJTkcgPSAxdSwgLy8gKDEgPDwgMCkKKyAgICBHUFNfQ0FQQUJJTElUWV9NU0IgPSAydSwgLy8gKDEgPDwgMSkKKyAgICBHUFNfQ0FQQUJJTElUWV9NU0EgPSA0dSwgLy8gKDEgPDwgMikKKyAgICBHUFNfQ0FQQUJJTElUWV9TSU5HTEVfU0hPVCA9IDh1LCAvLyAoMSA8PCAzKQorICAgIEdQU19DQVBBQklMSVRZX09OX0RFTUFORF9USU1FID0gMTZ1LCAvLyAoMSA8PCA0KQorICAgIEdQU19DQVBBQklMSVRZX0dFT0ZFTkNJTkcgPSAzMnUsIC8vICgxIDw8IDUpCisgICAgR1BTX0NBUEFCSUxJVFlfTUVBU1VSRU1FTlRTID0gNjR1LCAvLyAoMSA8PCA2KQorICAgIEdQU19DQVBBQklMSVRZX05BVl9NRVNTQUdFUyA9IDEyOHUsIC8vICgxIDw8IDcpCit9OworCitlbnVtIHsKKyAgICBHUFNfU1RBVFVTX05PTkUgPSAwLAorICAgIEdQU19TVEFUVVNfU0VTU0lPTl9CRUdJTiA9IDEsCisgICAgR1BTX1NUQVRVU19TRVNTSU9OX0VORCA9IDIsCisgICAgR1BTX1NUQVRVU19FTkdJTkVfT04gPSAzLAorICAgIEdQU19TVEFUVVNfRU5HSU5FX09GRiA9IDQsCit9OworCitlbnVtIHsKKyAgICBHTlNTX1NWX0ZMQUdTX05PTkUgPSAwLAorICAgIEdOU1NfU1ZfRkxBR1NfSEFTX0VQSEVNRVJJU19EQVRBID0gMSwgLy8gKDEgPDwgMCkKKyAgICBHTlNTX1NWX0ZMQUdTX0hBU19BTE1BTkFDX0RBVEEgPSAyLCAvLyAoMSA8PCAxKQorICAgIEdOU1NfU1ZfRkxBR1NfVVNFRF9JTl9GSVggPSA0LCAvLyAoMSA8PCAyKQorICAgIEdOU1NfU1ZfRkxBR1NfSEFTX0NBUlJJRVJfRlJFUVVFTkNZID0gOCwgLy8gKDEgPDwgMykKK307CisKK2VudW0geworICAgIEdQU19HRU9GRU5DRV9FTlRFUkVEID0gMSwgLy8gKDEgPDwgMEwpCisgICAgR1BTX0dFT0ZFTkNFX0VYSVRFRCA9IDIsIC8vICgxIDw8IDFMKQorICAgIEdQU19HRU9GRU5DRV9VTkNFUlRBSU4gPSA0LCAvLyAoMSA8PCAyTCkKK307CisKK2VudW0geworICAgIEdQU19HRU9GRU5DRV9VTkFWQUlMQUJMRSA9IDEsIC8vICgxIDw8IDBMKQorICAgIEdQU19HRU9GRU5DRV9BVkFJTEFCTEUgPSAyLCAvLyAoMSA8PCAxTCkKK307CisKK2VudW0geworICAgIEdQU19HRU9GRU5DRV9PUEVSQVRJT05fU1VDQ0VTUyA9IDAsCisgICAgR1BTX0dFT0ZFTkNFX0VSUk9SX1RPT19NQU5ZX0dFT0ZFTkNFUyA9IC0xMDAsIC8vICgtMTAwKQorICAgIEdQU19HRU9GRU5DRV9FUlJPUl9JRF9FWElTVFMgPSAtMTAxLCAvLyAoLTEwMSkKKyAgICBHUFNfR0VPRkVOQ0VfRVJST1JfSURfVU5LTk9XTiA9IC0xMDIsIC8vICgtMTAyKQorICAgIEdQU19HRU9GRU5DRV9FUlJPUl9JTlZBTElEX1RSQU5TSVRJT04gPSAtMTAzLCAvLyAoLTEwMykKKyAgICBHUFNfR0VPRkVOQ0VfRVJST1JfR0VORVJJQyA9IC0xNDksIC8vICgtMTQ5KQorfTsKKworZW51bSB7CisgICAgR1BTX01FQVNVUkVNRU5UX1NVQ0NFU1MgPSAwLAorICAgIEdQU19NRUFTVVJFTUVOVF9FUlJPUl9BTFJFQURZX0lOSVQgPSAtMTAwLCAvLyAoLTEwMCkKKyAgICBHUFNfTUVBU1VSRU1FTlRfRVJST1JfR0VORVJJQyA9IC0xMDEsIC8vICgtMTAxKQorfTsKKworZW51bSB7CisgICAgR05TU19DTE9DS19IQVNfTEVBUF9TRUNPTkQgPSAxLCAvLyAoMSA8PCAwKQorICAgIEdOU1NfQ0xPQ0tfSEFTX1RJTUVfVU5DRVJUQUlOVFkgPSAyLCAvLyAoMSA8PCAxKQorICAgIEdOU1NfQ0xPQ0tfSEFTX0ZVTExfQklBUyA9IDQsIC8vICgxIDw8IDIpCisgICAgR05TU19DTE9DS19IQVNfQklBUyA9IDgsIC8vICgxIDw8IDMpCisgICAgR05TU19DTE9DS19IQVNfQklBU19VTkNFUlRBSU5UWSA9IDE2LCAvLyAoMSA8PCA0KQorICAgIEdOU1NfQ0xPQ0tfSEFTX0RSSUZUID0gMzIsIC8vICgxIDw8IDUpCisgICAgR05TU19DTE9DS19IQVNfRFJJRlRfVU5DRVJUQUlOVFkgPSA2NCwgLy8gKDEgPDwgNikKK307CisKK2VudW0geworICAgIEdOU1NfTUVBU1VSRU1FTlRfSEFTX1NOUiA9IDF1LCAvLyAoMSA8PCAwKQorICAgIEdOU1NfTUVBU1VSRU1FTlRfSEFTX0NBUlJJRVJfRlJFUVVFTkNZID0gNTEydSwgLy8gKDEgPDwgOSkKKyAgICBHTlNTX01FQVNVUkVNRU5UX0hBU19DQVJSSUVSX0NZQ0xFUyA9IDEwMjR1LCAvLyAoMSA8PCAxMCkKKyAgICBHTlNTX01FQVNVUkVNRU5UX0hBU19DQVJSSUVSX1BIQVNFID0gMjA0OHUsIC8vICgxIDw8IDExKQorICAgIEdOU1NfTUVBU1VSRU1FTlRfSEFTX0NBUlJJRVJfUEhBU0VfVU5DRVJUQUlOVFkgPSA0MDk2dSwgLy8gKDEgPDwgMTIpCisgICAgR05TU19NRUFTVVJFTUVOVF9IQVNfQVVUT01BVElDX0dBSU5fQ09OVFJPTCA9IDgxOTJ1LCAvLyAoMSA8PCAxMykKK307CisKK2VudW0geworICAgIEdOU1NfTVVMVElQQVRIX0lORElDQVRPUl9VTktOT1dOID0gMCwKKyAgICBHTlNTX01VTFRJUEFUSF9JTkRJQ0FUT1JfUFJFU0VOVCA9IDEsCisgICAgR05TU19NVUxUSVBBVEhfSU5ESUNBVElPUl9OT1RfUFJFU0VOVCA9IDIsCit9OworCitlbnVtIHsKKyAgICBHTlNTX01FQVNVUkVNRU5UX1NUQVRFX1VOS05PV04gPSAwdSwgLy8gMAorICAgIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfQ09ERV9MT0NLID0gMXUsIC8vICgxIDw8IDApCisgICAgR05TU19NRUFTVVJFTUVOVF9TVEFURV9CSVRfU1lOQyA9IDJ1LCAvLyAoMSA8PCAxKQorICAgIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfU1VCRlJBTUVfU1lOQyA9IDR1LCAvLyAoMSA8PCAyKQorICAgIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfVE9XX0RFQ09ERUQgPSA4dSwgLy8gKDEgPDwgMykKKyAgICBHTlNTX01FQVNVUkVNRU5UX1NUQVRFX01TRUNfQU1CSUdVT1VTID0gMTZ1LCAvLyAoMSA8PCA0KQorICAgIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfU1lNQk9MX1NZTkMgPSAzMnUsIC8vICgxIDw8IDUpCisgICAgR05TU19NRUFTVVJFTUVOVF9TVEFURV9HTE9fU1RSSU5HX1NZTkMgPSA2NHUsIC8vICgxIDw8IDYpCisgICAgR05TU19NRUFTVVJFTUVOVF9TVEFURV9HTE9fVE9EX0RFQ09ERUQgPSAxMjh1LCAvLyAoMSA8PCA3KQorICAgIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfQkRTX0QyX0JJVF9TWU5DID0gMjU2dSwgLy8gKDEgPDwgOCkKKyAgICBHTlNTX01FQVNVUkVNRU5UX1NUQVRFX0JEU19EMl9TVUJGUkFNRV9TWU5DID0gNTEydSwgLy8gKDEgPDwgOSkKKyAgICBHTlNTX01FQVNVUkVNRU5UX1NUQVRFX0dBTF9FMUJDX0NPREVfTE9DSyA9IDEwMjR1LCAvLyAoMSA8PCAxMCkKKyAgICBHTlNTX01FQVNVUkVNRU5UX1NUQVRFX0dBTF9FMUNfMk5EX0NPREVfTE9DSyA9IDIwNDh1LCAvLyAoMSA8PCAxMSkKKyAgICBHTlNTX01FQVNVUkVNRU5UX1NUQVRFX0dBTF9FMUJfUEFHRV9TWU5DID0gNDA5NnUsIC8vICgxIDw8IDEyKQorICAgIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfU0JBU19TWU5DID0gODE5MnUsIC8vICgxIDw8IDEzKQorICAgIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfVE9XX0tOT1dOID0gMTYzODR1LCAvLyAoMSA8PCAxNCkKKyAgICBHTlNTX01FQVNVUkVNRU5UX1NUQVRFX0dMT19UT0RfS05PV04gPSAzMjc2OHUsIC8vICgxIDw8IDE1KQorfTsKKworZW51bSB7CisgICAgR05TU19BRFJfU1RBVEVfVU5LTk9XTiA9IDAsCisgICAgR05TU19BRFJfU1RBVEVfVkFMSUQgPSAxLCAvLyAoMSA8PCAwKQorICAgIEdOU1NfQURSX1NUQVRFX1JFU0VUID0gMiwgLy8gKDEgPDwgMSkKKyAgICBHTlNTX0FEUl9TVEFURV9DWUNMRV9TTElQID0gNCwgLy8gKDEgPDwgMikKK307CisKK2VudW0geworICAgIEdQU19OQVZJR0FUSU9OX01FU1NBR0VfU1VDQ0VTUyA9IDAsCisgICAgR1BTX05BVklHQVRJT05fTUVTU0FHRV9FUlJPUl9BTFJFQURZX0lOSVQgPSAtMTAwLCAvLyAoLTEwMCkKKyAgICBHUFNfTkFWSUdBVElPTl9NRVNTQUdFX0VSUk9SX0dFTkVSSUMgPSAtMTAxLCAvLyAoLTEwMSkKK307CisKK2VudW0geworICAgIEdOU1NfTkFWSUdBVElPTl9NRVNTQUdFX1RZUEVfVU5LTk9XTiA9IDAsCisgICAgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9HTlNTX0wxQ0EgPSAyNTcsIC8vIDB4MDEwMQorICAgIEdOU1NfTkFWSUdBVElPTl9NRVNTQUdFX1RZUEVfR05TU19MMkNOQVYgPSAyNTgsIC8vIDB4MDEwMgorICAgIEdOU1NfTkFWSUdBVElPTl9NRVNTQUdFX1RZUEVfR05TU19MNUNOQVYgPSAyNTksIC8vIDB4MDEwMworICAgIEdOU1NfTkFWSUdBVElPTl9NRVNTQUdFX1RZUEVfR05TU19DTkFWMiA9IDI2MCwgLy8gMHgwMTA0CisgICAgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9HTE9fTDFDQSA9IDc2OSwgLy8gMHgwMzAxCisgICAgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9CRFNfRDEgPSAxMjgxLCAvLyAweDA1MDEKKyAgICBHTlNTX05BVklHQVRJT05fTUVTU0FHRV9UWVBFX0JEU19EMiA9IDEyODIsIC8vIDB4MDUwMgorICAgIEdOU1NfTkFWSUdBVElPTl9NRVNTQUdFX1RZUEVfR0FMX0kgPSAxNTM3LCAvLyAweDA2MDEKKyAgICBHTlNTX05BVklHQVRJT05fTUVTU0FHRV9UWVBFX0dBTF9GID0gMTUzOCwgLy8gMHgwNjAyCit9OworCit0eXBlZGVmIGVudW0geworICAgIE5BVl9NRVNTQUdFX1NUQVRVU19QQVJJVFlfUEFTU0VEID0gMSwgLy8gKDEgPDwgMCkKKyAgICBOQVZfTUVTU0FHRV9TVEFUVVNfUEFSSVRZX1JFQlVJTFQgPSAyLCAvLyAoMSA8PCAxKQorICAgIE5BVl9NRVNTQUdFX1NUQVRVU19VTktOT1dOID0gMCwKK30gbmF2aWdhdGlvbl9tZXNzYWdlX3N0YXR1czsKKworZW51bSB7CisgICAgR1BTX05JX1RZUEVfVk9JQ0UgPSAxLAorICAgIEdQU19OSV9UWVBFX1VNVFNfU1VQTCA9IDIsCisgICAgR1BTX05JX1RZUEVfVU1UU19DVFJMX1BMQU5FID0gMywKK307CisKK2VudW0geworICAgIEdQU19OSV9ORUVEX05PVElGWSA9IDF1LCAvLyAweDAwMDEKKyAgICBHUFNfTklfTkVFRF9WRVJJRlkgPSAydSwgLy8gMHgwMDAyCisgICAgR1BTX05JX1BSSVZBQ1lfT1ZFUlJJREUgPSA0dSwgLy8gMHgwMDA0Cit9OworCitlbnVtIHsKKyAgICBHUFNfTklfUkVTUE9OU0VfQUNDRVBUID0gMSwKKyAgICBHUFNfTklfUkVTUE9OU0VfREVOWSA9IDIsCisgICAgR1BTX05JX1JFU1BPTlNFX05PUkVTUCA9IDMsCit9OworCitlbnVtIHsKKyAgICBHUFNfRU5DX05PTkUgPSAwLAorICAgIEdQU19FTkNfU1VQTF9HU01fREVGQVVMVCA9IDEsCisgICAgR1BTX0VOQ19TVVBMX1VURjggPSAyLAorICAgIEdQU19FTkNfU1VQTF9VQ1MyID0gMywKKyAgICBHUFNfRU5DX1VOS05PV04gPSAtMSwgLy8gKC0xKQorfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmICAvLyBISURMX0dFTkVSQVRFRF9BTkRST0lEX0hBUkRXQVJFX0dOU1NfVjFfMF9FWFBPUlRFRF9DT05TVEFOVFNfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvZ3BzLmggYi9pbmNsdWRlL2hhcmR3YXJlL2dwcy5oCmluZGV4IGFjZjYwMWIuLjRlMTA4YjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvZ3BzLmgKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS9ncHMuaApAQCAtMjYsOCArMjYsNDIgQEAKIAogI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CiAKKyNpbmNsdWRlICJnbnNzLWJhc2UuaCIKKwogX19CRUdJTl9ERUNMUwogCisvKgorICogRW51bXMgZGVmaW5lZCBpbiBISURMIGluIGhhcmR3YXJlL2ludGVyZmFjZXMgYXJlIGF1dG8tZ2VuZXJhdGVkIGFuZCBwcmVzZW50CisgKiBpbiBnbnNzLWJhc2UuaC4KKyAqLworCisvKiBmb3IgY29tcGF0aWJpbGl0eSAqLworCisvKiogTWF4aW11bSBudW1iZXIgb2YgU1ZzIGZvciBncHNfc3Zfc3RhdHVzX2NhbGxiYWNrKCkuICovCisjZGVmaW5lIEdOU1NfTUFYX1NWUyBHTlNTX01BWF9TVlNfQ09VTlQKKy8qKiBNYXhpbXVtIG51bWJlciBvZiBNZWFzdXJlbWVudHMgaW4gZ25zc19tZWFzdXJlbWVudF9jYWxsYmFjaygpLiAqLworI2RlZmluZSBHTlNTX01BWF9NRUFTVVJFTUVOVCBHTlNTX01BWF9TVlNfQ09VTlQKKworI2RlZmluZSBHUFNfUkVRVUVTVF9BR1BTX0RBVEFfQ09OTiBHTlNTX1JFUVVFU1RfQUdOU1NfREFUQV9DT05OCisjZGVmaW5lIEdQU19SRUxFQVNFX0FHUFNfREFUQV9DT05OIEdOU1NfUkVMRUFTRV9BR05TU19EQVRBX0NPTk4KKyNkZWZpbmUgR1BTX0FHUFNfREFUQV9DT05ORUNURUQgR05TU19BR05TU19EQVRBX0NPTk5FQ1RFRAorI2RlZmluZSBHUFNfQUdQU19EQVRBX0NPTk5fRE9ORSBHTlNTX0FHTlNTX0RBVEFfQ09OTl9ET05FCisjZGVmaW5lIEdQU19BR1BTX0RBVEFfQ09OTl9GQUlMRUQgR05TU19BR05TU19EQVRBX0NPTk5fRkFJTEVECisjZGVmaW5lIEFHUFNfUklMX05FVFdPUktfVFlQRV9NT0JJTEVfTU1TIEFHUFNfUklMX05FVFdPUktfVFlQRV9NTVMKKyNkZWZpbmUgQUdQU19SSUxfTkVUV09SS19UWVBFX01PQklMRV9TVVBMIEFHUFNfUklMX05FVFdPUktfVFlQRV9TVVBMCisjZGVmaW5lIEFHUFNfUklMX05FVFdPUktfVFRZUEVfTU9CSUxFX0RVTiBBR1BTX1JJTF9ORVRXT1JLX1RZUEVfRFVOCisjZGVmaW5lIEFHUFNfUklMX05FVFdPUktfVFRZUEVfTU9CSUxFX0hJUFJJIEFHUFNfUklMX05FVFdPUktfVFlQRV9ISVBSSQorI2RlZmluZSBBR1BTX1JJTF9ORVRXT1JLX1RUWVBFX1dJTUFYIEFHUFNfUklMX05FVFdPUktfVFlQRV9XSU1BWAorI2RlZmluZSBHTlNTX01VTFRJUEFUSF9JTkRJQ0FUT1JfTk9UX1BSRVNFTlQgR05TU19NVUxUSVBBVEhfSU5ESUNBVElPUl9OT1RfUFJFU0VOVAorI2RlZmluZSBBR1BTX1NFVElEX1RZUEVfTVNJU0ROIEFHUFNfU0VUSURfVFlQRV9NU0lTRE0KKyNkZWZpbmUgR1BTX01FQVNVUkVNRU5UX09QRVJBVElPTl9TVUNDRVNTIEdQU19NRUFTVVJFTUVOVF9TVUNDRVNTCisjZGVmaW5lIEdQU19OQVZJR0FUSU9OX01FU1NBR0VfT1BFUkFUSU9OX1NVQ0NFU1MgR1BTX05BVklHQVRJT05fTUVTU0FHRV9TVUNDRVNTCisjZGVmaW5lIEdOU1NfTkFWSUdBVElPTl9NRVNTQUdFX1RZUEVfR1BTX0wxQ0EgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9HTlNTX0wxQ0EKKyNkZWZpbmUgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9HUFNfTDJDTkFWIEdOU1NfTkFWSUdBVElPTl9NRVNTQUdFX1RZUEVfR05TU19MMkNOQVYKKyNkZWZpbmUgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9HUFNfTDVDTkFWIEdOU1NfTkFWSUdBVElPTl9NRVNTQUdFX1RZUEVfR05TU19MNUNOQVYKKyNkZWZpbmUgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9HUFNfQ05BVjIgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9HTlNTX0NOQVYyCisjZGVmaW5lIEdQU19MT0NBVElPTl9IQVNfQUNDVVJBQ1kgR1BTX0xPQ0FUSU9OX0hBU19IT1JJWk9OVEFMX0FDQ1VSQUNZCisKIC8qKgogICogVGhlIGlkIG9mIHRoaXMgbW9kdWxlCiAgKi8KQEAgLTM5LDEyNyArNzMsMzQgQEAKIAogLyoqIE1heGltdW0gbnVtYmVyIG9mIFNWcyBmb3IgZ3BzX3N2X3N0YXR1c19jYWxsYmFjaygpLiAqLwogI2RlZmluZSBHUFNfTUFYX1NWUyAzMgotLyoqIE1heGltdW0gbnVtYmVyIG9mIFNWcyBmb3IgZ3BzX3N2X3N0YXR1c19jYWxsYmFjaygpLiAqLwotI2RlZmluZSBHTlNTX01BWF9TVlMgNjQKIAogLyoqIE1heGltdW0gbnVtYmVyIG9mIE1lYXN1cmVtZW50cyBpbiBncHNfbWVhc3VyZW1lbnRfY2FsbGJhY2soKS4gKi8KICNkZWZpbmUgR1BTX01BWF9NRUFTVVJFTUVOVCAgIDMyCiAKLS8qKiBNYXhpbXVtIG51bWJlciBvZiBNZWFzdXJlbWVudHMgaW4gZ25zc19tZWFzdXJlbWVudF9jYWxsYmFjaygpLiAqLwotI2RlZmluZSBHTlNTX01BWF9NRUFTVVJFTUVOVCAgIDY0Ci0KIC8qKiBSZXF1ZXN0ZWQgb3BlcmF0aW9uYWwgbW9kZSBmb3IgR1BTIG9wZXJhdGlvbi4gKi8KIHR5cGVkZWYgdWludDMyX3QgR3BzUG9zaXRpb25Nb2RlOwotLyogSU1QT1JUQU5UOiBOb3RlIHRoYXQgdGhlIGZvbGxvd2luZyB2YWx1ZXMgbXVzdCBtYXRjaAotICogY29uc3RhbnRzIGluIEdwc0xvY2F0aW9uUHJvdmlkZXIuamF2YS4gKi8KLS8qKiBNb2RlIGZvciBydW5uaW5nIEdQUyBzdGFuZGFsb25lIChubyBhc3Npc3RhbmNlKS4gKi8KLSNkZWZpbmUgR1BTX1BPU0lUSU9OX01PREVfU1RBTkRBTE9ORSAgICAwCi0vKiogQUdQUyBNUy1CYXNlZCBtb2RlLiAqLwotI2RlZmluZSBHUFNfUE9TSVRJT05fTU9ERV9NU19CQVNFRCAgICAgIDEKLS8qKgotICogQUdQUyBNUy1Bc3Npc3RlZCBtb2RlLiBUaGlzIG1vZGUgaXMgbm90IG1haW50YWluZWQgYnkgdGhlIHBsYXRmb3JtIGFueW1vcmUuCi0gKiBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byB1c2UgR1BTX1BPU0lUSU9OX01PREVfTVNfQkFTRUQgaW5zdGVhZC4KLSAqLwotI2RlZmluZSBHUFNfUE9TSVRJT05fTU9ERV9NU19BU1NJU1RFRCAgIDIKIAogLyoqIFJlcXVlc3RlZCByZWN1cnJlbmNlIG1vZGUgZm9yIEdQUyBvcGVyYXRpb24uICovCiB0eXBlZGVmIHVpbnQzMl90IEdwc1Bvc2l0aW9uUmVjdXJyZW5jZTsKLS8qIElNUE9SVEFOVDogTm90ZSB0aGF0IHRoZSBmb2xsb3dpbmcgdmFsdWVzIG11c3QgbWF0Y2gKLSAqIGNvbnN0YW50cyBpbiBHcHNMb2NhdGlvblByb3ZpZGVyLmphdmEuICovCi0vKiogUmVjZWl2ZSBHUFMgZml4ZXMgb24gYSByZWN1cnJpbmcgYmFzaXMgYXQgYSBzcGVjaWZpZWQgcGVyaW9kLiAqLwotI2RlZmluZSBHUFNfUE9TSVRJT05fUkVDVVJSRU5DRV9QRVJJT0RJQyAgICAwCi0vKiogUmVxdWVzdCBhIHNpbmdsZSBzaG90IEdQUyBmaXguICovCi0jZGVmaW5lIEdQU19QT1NJVElPTl9SRUNVUlJFTkNFX1NJTkdMRSAgICAgIDEKIAogLyoqIEdQUyBzdGF0dXMgZXZlbnQgdmFsdWVzLiAqLwogdHlwZWRlZiB1aW50MTZfdCBHcHNTdGF0dXNWYWx1ZTsKLS8qIElNUE9SVEFOVDogTm90ZSB0aGF0IHRoZSBmb2xsb3dpbmcgdmFsdWVzIG11c3QgbWF0Y2gKLSAqIGNvbnN0YW50cyBpbiBHcHNMb2NhdGlvblByb3ZpZGVyLmphdmEuICovCi0vKiogR1BTIHN0YXR1cyB1bmtub3duLiAqLwotI2RlZmluZSBHUFNfU1RBVFVTX05PTkUgICAgICAgICAgICAgMAotLyoqIEdQUyBoYXMgYmVndW4gbmF2aWdhdGluZy4gKi8KLSNkZWZpbmUgR1BTX1NUQVRVU19TRVNTSU9OX0JFR0lOICAgIDEKLS8qKiBHUFMgaGFzIHN0b3BwZWQgbmF2aWdhdGluZy4gKi8KLSNkZWZpbmUgR1BTX1NUQVRVU19TRVNTSU9OX0VORCAgICAgIDIKLS8qKiBHUFMgaGFzIHBvd2VyZWQgb24gYnV0IGlzIG5vdCBuYXZpZ2F0aW5nLiAqLwotI2RlZmluZSBHUFNfU1RBVFVTX0VOR0lORV9PTiAgICAgICAgMwotLyoqIEdQUyBpcyBwb3dlcmVkIG9mZi4gKi8KLSNkZWZpbmUgR1BTX1NUQVRVU19FTkdJTkVfT0ZGICAgICAgIDQKIAogLyoqIEZsYWdzIHRvIGluZGljYXRlIHdoaWNoIHZhbHVlcyBhcmUgdmFsaWQgaW4gYSBHcHNMb2NhdGlvbi4gKi8KIHR5cGVkZWYgdWludDE2X3QgR3BzTG9jYXRpb25GbGFnczsKLS8qIElNUE9SVEFOVDogTm90ZSB0aGF0IHRoZSBmb2xsb3dpbmcgdmFsdWVzIG11c3QgbWF0Y2gKLSAqIGNvbnN0YW50cyBpbiBHcHNMb2NhdGlvblByb3ZpZGVyLmphdmEuICovCi0vKiogR3BzTG9jYXRpb24gaGFzIHZhbGlkIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUuICovCi0jZGVmaW5lIEdQU19MT0NBVElPTl9IQVNfTEFUX0xPTkcgICAweDAwMDEKLS8qKiBHcHNMb2NhdGlvbiBoYXMgdmFsaWQgYWx0aXR1ZGUuICovCi0jZGVmaW5lIEdQU19MT0NBVElPTl9IQVNfQUxUSVRVREUgICAweDAwMDIKLS8qKiBHcHNMb2NhdGlvbiBoYXMgdmFsaWQgc3BlZWQuICovCi0jZGVmaW5lIEdQU19MT0NBVElPTl9IQVNfU1BFRUQgICAgICAweDAwMDQKLS8qKiBHcHNMb2NhdGlvbiBoYXMgdmFsaWQgYmVhcmluZy4gKi8KLSNkZWZpbmUgR1BTX0xPQ0FUSU9OX0hBU19CRUFSSU5HICAgIDB4MDAwOAotLyoqIEdwc0xvY2F0aW9uIGhhcyB2YWxpZCBhY2N1cmFjeS4gKi8KLSNkZWZpbmUgR1BTX0xPQ0FUSU9OX0hBU19BQ0NVUkFDWSAgIDB4MDAxMAotCi0vKiogRmxhZ3MgZm9yIHRoZSBncHNfc2V0X2NhcGFiaWxpdGllcyBjYWxsYmFjay4gKi8KLQotLyoqCi0gKiBHUFMgSEFMIHNjaGVkdWxlcyBmaXhlcyBmb3IgR1BTX1BPU0lUSU9OX1JFQ1VSUkVOQ0VfUEVSSU9ESUMgbW9kZS4gSWYgdGhpcyBpcwotICogbm90IHNldCwgdGhlbiB0aGUgZnJhbWV3b3JrIHdpbGwgdXNlIDEwMDBtcyBmb3IgbWluX2ludGVydmFsIGFuZCB3aWxsIHN0YXJ0Ci0gKiBhbmQgY2FsbCBzdGFydCgpIGFuZCBzdG9wKCkgdG8gc2NoZWR1bGUgdGhlIEdQUy4KLSAqLwotI2RlZmluZSBHUFNfQ0FQQUJJTElUWV9TQ0hFRFVMSU5HICAgICAgICgxIDw8IDApCi0vKiogR1BTIHN1cHBvcnRzIE1TLUJhc2VkIEFHUFMgbW9kZSAqLwotI2RlZmluZSBHUFNfQ0FQQUJJTElUWV9NU0IgICAgICAgICAgICAgICgxIDw8IDEpCi0vKiogR1BTIHN1cHBvcnRzIE1TLUFzc2lzdGVkIEFHUFMgbW9kZSAqLwotI2RlZmluZSBHUFNfQ0FQQUJJTElUWV9NU0EgICAgICAgICAgICAgICgxIDw8IDIpCi0vKiogR1BTIHN1cHBvcnRzIHNpbmdsZS1zaG90IGZpeGVzICovCi0jZGVmaW5lIEdQU19DQVBBQklMSVRZX1NJTkdMRV9TSE9UICAgICAgKDEgPDwgMykKLS8qKiBHUFMgc3VwcG9ydHMgb24gZGVtYW5kIHRpbWUgaW5qZWN0aW9uICovCi0jZGVmaW5lIEdQU19DQVBBQklMSVRZX09OX0RFTUFORF9USU1FICAgKDEgPDwgNCkKLS8qKiBHUFMgc3VwcG9ydHMgR2VvZmVuY2luZyAgKi8KLSNkZWZpbmUgR1BTX0NBUEFCSUxJVFlfR0VPRkVOQ0lORyAgICAgICAoMSA8PCA1KQotLyoqIEdQUyBzdXBwb3J0cyBNZWFzdXJlbWVudHMuICovCi0jZGVmaW5lIEdQU19DQVBBQklMSVRZX01FQVNVUkVNRU5UUyAgICAgKDEgPDwgNikKLS8qKiBHUFMgc3VwcG9ydHMgTmF2aWdhdGlvbiBNZXNzYWdlcyAqLwotI2RlZmluZSBHUFNfQ0FQQUJJTElUWV9OQVZfTUVTU0FHRVMgICAgICgxIDw8IDcpCiAKIC8qKgogICogRmxhZ3MgdXNlZCB0byBzcGVjaWZ5IHdoaWNoIGFpZGluZyBkYXRhIHRvIGRlbGV0ZSB3aGVuIGNhbGxpbmcKICAqIGRlbGV0ZV9haWRpbmdfZGF0YSgpLgogICovCiB0eXBlZGVmIHVpbnQxNl90IEdwc0FpZGluZ0RhdGE7Ci0vKiBJTVBPUlRBTlQ6IE5vdGUgdGhhdCB0aGUgZm9sbG93aW5nIHZhbHVlcyBtdXN0IG1hdGNoCi0gKiBjb25zdGFudHMgaW4gR3BzTG9jYXRpb25Qcm92aWRlci5qYXZhLiAqLwotI2RlZmluZSBHUFNfREVMRVRFX0VQSEVNRVJJUyAgICAgICAgMHgwMDAxCi0jZGVmaW5lIEdQU19ERUxFVEVfQUxNQU5BQyAgICAgICAgICAweDAwMDIKLSNkZWZpbmUgR1BTX0RFTEVURV9QT1NJVElPTiAgICAgICAgIDB4MDAwNAotI2RlZmluZSBHUFNfREVMRVRFX1RJTUUgICAgICAgICAgICAgMHgwMDA4Ci0jZGVmaW5lIEdQU19ERUxFVEVfSU9OTyAgICAgICAgICAgICAweDAwMTAKLSNkZWZpbmUgR1BTX0RFTEVURV9VVEMgICAgICAgICAgICAgIDB4MDAyMAotI2RlZmluZSBHUFNfREVMRVRFX0hFQUxUSCAgICAgICAgICAgMHgwMDQwCi0jZGVmaW5lIEdQU19ERUxFVEVfU1ZESVIgICAgICAgICAgICAweDAwODAKLSNkZWZpbmUgR1BTX0RFTEVURV9TVlNURUVSICAgICAgICAgIDB4MDEwMAotI2RlZmluZSBHUFNfREVMRVRFX1NBREFUQSAgICAgICAgICAgMHgwMjAwCi0jZGVmaW5lIEdQU19ERUxFVEVfUlRJICAgICAgICAgICAgICAweDA0MDAKLSNkZWZpbmUgR1BTX0RFTEVURV9DRUxMREJfSU5GTyAgICAgIDB4ODAwMAotI2RlZmluZSBHUFNfREVMRVRFX0FMTCAgICAgICAgICAgICAgMHhGRkZGCiAKIC8qKiBBR1BTIHR5cGUgKi8KIHR5cGVkZWYgdWludDE2X3QgQUdwc1R5cGU7Ci0jZGVmaW5lIEFHUFNfVFlQRV9TVVBMICAgICAgICAgIDEKLSNkZWZpbmUgQUdQU19UWVBFX0MySyAgICAgICAgICAgMgogCiB0eXBlZGVmIHVpbnQxNl90IEFHcHNTZXRJRFR5cGU7Ci0jZGVmaW5lIEFHUFNfU0VUSURfVFlQRV9OT05FICAgIDAKLSNkZWZpbmUgQUdQU19TRVRJRF9UWVBFX0lNU0kgICAgMQotI2RlZmluZSBBR1BTX1NFVElEX1RZUEVfTVNJU0ROICAyCiAKIHR5cGVkZWYgdWludDE2X3QgQXBuSXBUeXBlOwotI2RlZmluZSBBUE5fSVBfSU5WQUxJRCAgICAgICAgICAwCi0jZGVmaW5lIEFQTl9JUF9JUFY0ICAgICAgICAgICAgIDEKLSNkZWZpbmUgQVBOX0lQX0lQVjYgICAgICAgICAgICAgMgotI2RlZmluZSBBUE5fSVBfSVBWNFY2ICAgICAgICAgICAzCiAKIC8qKgogICogU3RyaW5nIGxlbmd0aCBjb25zdGFudHMKQEAgLTE3MSw3MSArMTEyLDMxIEBACiAgKiBHcHNOaVR5cGUgY29uc3RhbnRzCiAgKi8KIHR5cGVkZWYgdWludDMyX3QgR3BzTmlUeXBlOwotI2RlZmluZSBHUFNfTklfVFlQRV9WT0lDRSAgICAgICAgICAgICAgMQotI2RlZmluZSBHUFNfTklfVFlQRV9VTVRTX1NVUEwgICAgICAgICAgMgotI2RlZmluZSBHUFNfTklfVFlQRV9VTVRTX0NUUkxfUExBTkUgICAgMwogCiAvKioKICAqIEdwc05pTm90aWZ5RmxhZ3MgY29uc3RhbnRzCiAgKi8KIHR5cGVkZWYgdWludDMyX3QgR3BzTmlOb3RpZnlGbGFnczsKLS8qKiBOSSByZXF1aXJlcyBub3RpZmljYXRpb24gKi8KLSNkZWZpbmUgR1BTX05JX05FRURfTk9USUZZICAgICAgICAgIDB4MDAwMQotLyoqIE5JIHJlcXVpcmVzIHZlcmlmaWNhdGlvbiAqLwotI2RlZmluZSBHUFNfTklfTkVFRF9WRVJJRlkgICAgICAgICAgMHgwMDAyCi0vKiogTkkgcmVxdWlyZXMgcHJpdmFjeSBvdmVycmlkZSwgbm8gbm90aWZpY2F0aW9uL21pbmltYWwgdHJhY2UgKi8KLSNkZWZpbmUgR1BTX05JX1BSSVZBQ1lfT1ZFUlJJREUgICAgIDB4MDAwNAogCiAvKioKICAqIEdQUyBOSSByZXNwb25zZXMsIHVzZWQgdG8gZGVmaW5lIHRoZSByZXNwb25zZSBpbgogICogTkkgc3RydWN0dXJlcwogICovCiB0eXBlZGVmIGludCBHcHNVc2VyUmVzcG9uc2VUeXBlOwotI2RlZmluZSBHUFNfTklfUkVTUE9OU0VfQUNDRVBUICAgICAgICAgMQotI2RlZmluZSBHUFNfTklfUkVTUE9OU0VfREVOWSAgICAgICAgICAgMgotI2RlZmluZSBHUFNfTklfUkVTUE9OU0VfTk9SRVNQICAgICAgICAgMwogCiAvKioKICAqIE5JIGRhdGEgZW5jb2Rpbmcgc2NoZW1lCiAgKi8KIHR5cGVkZWYgaW50IEdwc05pRW5jb2RpbmdUeXBlOwotI2RlZmluZSBHUFNfRU5DX05PTkUgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBHUFNfRU5DX1NVUExfR1NNX0RFRkFVTFQgICAgICAgMQotI2RlZmluZSBHUFNfRU5DX1NVUExfVVRGOCAgICAgICAgICAgICAgMgotI2RlZmluZSBHUFNfRU5DX1NVUExfVUNTMiAgICAgICAgICAgICAgMwotI2RlZmluZSBHUFNfRU5DX1VOS05PV04gICAgICAgICAgICAgICAgLTEKIAogLyoqIEFHUFMgc3RhdHVzIGV2ZW50IHZhbHVlcy4gKi8KIHR5cGVkZWYgdWludDE2X3QgQUdwc1N0YXR1c1ZhbHVlOwotLyoqIEdQUyByZXF1ZXN0cyBkYXRhIGNvbm5lY3Rpb24gZm9yIEFHUFMuICovCi0jZGVmaW5lIEdQU19SRVFVRVNUX0FHUFNfREFUQV9DT05OICAxCi0vKiogR1BTIHJlbGVhc2VzIHRoZSBBR1BTIGRhdGEgY29ubmVjdGlvbi4gKi8KLSNkZWZpbmUgR1BTX1JFTEVBU0VfQUdQU19EQVRBX0NPTk4gIDIKLS8qKiBBR1BTIGRhdGEgY29ubmVjdGlvbiBpbml0aWF0ZWQgKi8KLSNkZWZpbmUgR1BTX0FHUFNfREFUQV9DT05ORUNURUQgICAgIDMKLS8qKiBBR1BTIGRhdGEgY29ubmVjdGlvbiBjb21wbGV0ZWQgKi8KLSNkZWZpbmUgR1BTX0FHUFNfREFUQV9DT05OX0RPTkUgICAgIDQKLS8qKiBBR1BTIGRhdGEgY29ubmVjdGlvbiBmYWlsZWQgKi8KLSNkZWZpbmUgR1BTX0FHUFNfREFUQV9DT05OX0ZBSUxFRCAgIDUKIAogdHlwZWRlZiB1aW50MTZfdCBBR3BzUmVmTG9jYXRpb25UeXBlOwotI2RlZmluZSBBR1BTX1JFRl9MT0NBVElPTl9UWVBFX0dTTV9DRUxMSUQgICAxCi0jZGVmaW5lIEFHUFNfUkVGX0xPQ0FUSU9OX1RZUEVfVU1UU19DRUxMSUQgIDIKLSNkZWZpbmUgQUdQU19SRUZfTE9DQVRJT05fVFlQRV9NQUMgICAgICAgICAgMwotI2RlZmluZSBBR1BTX1JFRl9MT0NBVElPTl9UWVBFX0xURV9DRUxMSUQgICA0CiAKIC8qIERlcHJlY2F0ZWQsIHRvIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgQW5kcm9pZCByZWxlYXNlLiAqLwogI2RlZmluZSBBR1BTX1JFR19MT0NBVElPTl9UWVBFX01BQyAgICAgICAgICAzCiAKLS8qKiBOZXR3b3JrIHR5cGVzIGZvciB1cGRhdGVfbmV0d29ya19zdGF0ZSAidHlwZSIgcGFyYW1ldGVyICovCi0jZGVmaW5lIEFHUFNfUklMX05FVFdPUktfVFlQRV9NT0JJTEUgICAgICAgIDAKLSNkZWZpbmUgQUdQU19SSUxfTkVUV09SS19UWVBFX1dJRkkgICAgICAgICAgMQotI2RlZmluZSBBR1BTX1JJTF9ORVRXT1JLX1RZUEVfTU9CSUxFX01NUyAgICAyCi0jZGVmaW5lIEFHUFNfUklMX05FVFdPUktfVFlQRV9NT0JJTEVfU1VQTCAgIDMKLSNkZWZpbmUgQUdQU19SSUxfTkVUV09SS19UVFlQRV9NT0JJTEVfRFVOICAgNAotI2RlZmluZSBBR1BTX1JJTF9ORVRXT1JLX1RUWVBFX01PQklMRV9ISVBSSSA1Ci0jZGVmaW5lIEFHUFNfUklMX05FVFdPUktfVFRZUEVfV0lNQVggICAgICAgIDYKLQogLyogVGhlIGZvbGxvd2luZyB0eXBlZGVmIHRvZ2V0aGVyIHdpdGggaXRzIGNvbnN0YW50cyBiZWxvdyBhcmUgZGVwcmVjYXRlZCwgYW5kCiAgKiB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgcmVsZWFzZS4gKi8KIHR5cGVkZWYgdWludDE2X3QgR3BzQ2xvY2tGbGFnczsKQEAgLTI1MSwyMCArMTUyLDYgQEAKICAqIEZsYWdzIHRvIGluZGljYXRlIHdoYXQgZmllbGRzIGluIEduc3NDbG9jayBhcmUgdmFsaWQuCiAgKi8KIHR5cGVkZWYgdWludDE2X3QgR25zc0Nsb2NrRmxhZ3M7Ci0vKiogQSB2YWxpZCAnbGVhcCBzZWNvbmQnIGlzIHN0b3JlZCBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmUuICovCi0jZGVmaW5lIEdOU1NfQ0xPQ0tfSEFTX0xFQVBfU0VDT05EICAgICAgICAgICAgICAgKDE8PDApCi0vKiogQSB2YWxpZCAndGltZSB1bmNlcnRhaW50eScgaXMgc3RvcmVkIGluIHRoZSBkYXRhIHN0cnVjdHVyZS4gKi8KLSNkZWZpbmUgR05TU19DTE9DS19IQVNfVElNRV9VTkNFUlRBSU5UWSAgICAgICAgICAoMTw8MSkKLS8qKiBBIHZhbGlkICdmdWxsIGJpYXMnIGlzIHN0b3JlZCBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmUuICovCi0jZGVmaW5lIEdOU1NfQ0xPQ0tfSEFTX0ZVTExfQklBUyAgICAgICAgICAgICAgICAgKDE8PDIpCi0vKiogQSB2YWxpZCAnYmlhcycgaXMgc3RvcmVkIGluIHRoZSBkYXRhIHN0cnVjdHVyZS4gKi8KLSNkZWZpbmUgR05TU19DTE9DS19IQVNfQklBUyAgICAgICAgICAgICAgICAgICAgICAoMTw8MykKLS8qKiBBIHZhbGlkICdiaWFzIHVuY2VydGFpbnR5JyBpcyBzdG9yZWQgaW4gdGhlIGRhdGEgc3RydWN0dXJlLiAqLwotI2RlZmluZSBHTlNTX0NMT0NLX0hBU19CSUFTX1VOQ0VSVEFJTlRZICAgICAgICAgICgxPDw0KQotLyoqIEEgdmFsaWQgJ2RyaWZ0JyBpcyBzdG9yZWQgaW4gdGhlIGRhdGEgc3RydWN0dXJlLiAqLwotI2RlZmluZSBHTlNTX0NMT0NLX0hBU19EUklGVCAgICAgICAgICAgICAgICAgICAgICgxPDw1KQotLyoqIEEgdmFsaWQgJ2RyaWZ0IHVuY2VydGFpbnR5JyBpcyBzdG9yZWQgaW4gdGhlIGRhdGEgc3RydWN0dXJlLiAqLwotI2RlZmluZSBHTlNTX0NMT0NLX0hBU19EUklGVF9VTkNFUlRBSU5UWSAgICAgICAgICgxPDw2KQogCiAvKiBUaGUgZm9sbG93aW5nIHR5cGVkZWYgdG9nZXRoZXIgd2l0aCBpdHMgY29uc3RhbnRzIGJlbG93IGFyZSBkZXByZWNhdGVkLCBhbmQKICAqIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCByZWxlYXNlLiAqLwpAQCAtMzAwLDE2ICsxODcsNiBAQAogICogRmxhZ3MgdG8gaW5kaWNhdGUgd2hhdCBmaWVsZHMgaW4gR25zc01lYXN1cmVtZW50IGFyZSB2YWxpZC4KICAqLwogdHlwZWRlZiB1aW50MzJfdCBHbnNzTWVhc3VyZW1lbnRGbGFnczsKLS8qKiBBIHZhbGlkICdzbnInIGlzIHN0b3JlZCBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmUuICovCi0jZGVmaW5lIEdOU1NfTUVBU1VSRU1FTlRfSEFTX1NOUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8MCkKLS8qKiBBIHZhbGlkICdjYXJyaWVyIGZyZXF1ZW5jeScgaXMgc3RvcmVkIGluIHRoZSBkYXRhIHN0cnVjdHVyZS4gKi8KLSNkZWZpbmUgR05TU19NRUFTVVJFTUVOVF9IQVNfQ0FSUklFUl9GUkVRVUVOQ1kgICAgICAgICAgICAgICAgICgxPDw5KQotLyoqIEEgdmFsaWQgJ2NhcnJpZXIgY3ljbGVzJyBpcyBzdG9yZWQgaW4gdGhlIGRhdGEgc3RydWN0dXJlLiAqLwotI2RlZmluZSBHTlNTX01FQVNVUkVNRU5UX0hBU19DQVJSSUVSX0NZQ0xFUyAgICAgICAgICAgICAgICAgICAgKDE8PDEwKQotLyoqIEEgdmFsaWQgJ2NhcnJpZXIgcGhhc2UnIGlzIHN0b3JlZCBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmUuICovCi0jZGVmaW5lIEdOU1NfTUVBU1VSRU1FTlRfSEFTX0NBUlJJRVJfUEhBU0UgICAgICAgICAgICAgICAgICAgICAoMTw8MTEpCi0vKiogQSB2YWxpZCAnY2FycmllciBwaGFzZSB1bmNlcnRhaW50eScgaXMgc3RvcmVkIGluIHRoZSBkYXRhIHN0cnVjdHVyZS4gKi8KLSNkZWZpbmUgR05TU19NRUFTVVJFTUVOVF9IQVNfQ0FSUklFUl9QSEFTRV9VTkNFUlRBSU5UWSAgICAgICAgICgxPDwxMikKIAogLyogVGhlIGZvbGxvd2luZyB0eXBlZGVmIHRvZ2V0aGVyIHdpdGggaXRzIGNvbnN0YW50cyBiZWxvdyBhcmUgZGVwcmVjYXRlZCwgYW5kCiAgKiB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgcmVsZWFzZS4gKi8KQEAgLTMzMSwxMiArMjA4LDYgQEAKICAqIGluZGljYXRvci4KICAqLwogdHlwZWRlZiB1aW50OF90IEduc3NNdWx0aXBhdGhJbmRpY2F0b3I7Ci0vKiogVGhlIGluZGljYXRvciBpcyBub3QgYXZhaWxhYmxlIG9yIHVua25vd24uICovCi0jZGVmaW5lIEdOU1NfTVVMVElQQVRIX0lORElDQVRPUl9VTktOT1dOICAgICAgICAgICAgICAgICAwCi0vKiogVGhlIG1lYXN1cmVtZW50IGlzIGluZGljYXRlZCB0byBiZSBhZmZlY3RlZCBieSBtdWx0aXBhdGguICovCi0jZGVmaW5lIEdOU1NfTVVMVElQQVRIX0lORElDQVRPUl9QUkVTRU5UICAgICAgICAgICAgICAgICAxCi0vKiogVGhlIG1lYXN1cmVtZW50IGlzIGluZGljYXRlZCB0byBiZSBub3QgYWZmZWN0ZWQgYnkgbXVsdGlwYXRoLiAqLwotI2RlZmluZSBHTlNTX01VTFRJUEFUSF9JTkRJQ0FUT1JfTk9UX1BSRVNFTlQgICAgICAgICAgICAgMgogCiAvKiBUaGUgZm9sbG93aW5nIHR5cGVkZWYgdG9nZXRoZXIgd2l0aCBpdHMgY29uc3RhbnRzIGJlbG93IGFyZSBkZXByZWNhdGVkLCBhbmQKICAqIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCByZWxlYXNlLiAqLwpAQCAtMzYzLDIxICsyMzQsNiBAQAogICogc2V0IHRvIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfVU5LTk9XTigwKS4KICAqLwogdHlwZWRlZiB1aW50MzJfdCBHbnNzTWVhc3VyZW1lbnRTdGF0ZTsKLSNkZWZpbmUgR05TU19NRUFTVVJFTUVOVF9TVEFURV9VTktOT1dOICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgR05TU19NRUFTVVJFTUVOVF9TVEFURV9DT0RFX0xPQ0sgICAgICAgICAgICAgKDE8PDApCi0jZGVmaW5lIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfQklUX1NZTkMgICAgICAgICAgICAgICgxPDwxKQotI2RlZmluZSBHTlNTX01FQVNVUkVNRU5UX1NUQVRFX1NVQkZSQU1FX1NZTkMgICAgICAgICAoMTw8MikKLSNkZWZpbmUgR05TU19NRUFTVVJFTUVOVF9TVEFURV9UT1dfREVDT0RFRCAgICAgICAgICAgKDE8PDMpCi0jZGVmaW5lIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfTVNFQ19BTUJJR1VPVVMgICAgICAgICgxPDw0KQotI2RlZmluZSBHTlNTX01FQVNVUkVNRU5UX1NUQVRFX1NZTUJPTF9TWU5DICAgICAgICAgICAoMTw8NSkKLSNkZWZpbmUgR05TU19NRUFTVVJFTUVOVF9TVEFURV9HTE9fU1RSSU5HX1NZTkMgICAgICAgKDE8PDYpCi0jZGVmaW5lIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfR0xPX1RPRF9ERUNPREVEICAgICAgICgxPDw3KQotI2RlZmluZSBHTlNTX01FQVNVUkVNRU5UX1NUQVRFX0JEU19EMl9CSVRfU1lOQyAgICAgICAoMTw8OCkKLSNkZWZpbmUgR05TU19NRUFTVVJFTUVOVF9TVEFURV9CRFNfRDJfU1VCRlJBTUVfU1lOQyAgKDE8PDkpCi0jZGVmaW5lIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfR0FMX0UxQkNfQ09ERV9MT0NLICAgICgxPDwxMCkKLSNkZWZpbmUgR05TU19NRUFTVVJFTUVOVF9TVEFURV9HQUxfRTFDXzJORF9DT0RFX0xPQ0sgKDE8PDExKQotI2RlZmluZSBHTlNTX01FQVNVUkVNRU5UX1NUQVRFX0dBTF9FMUJfUEFHRV9TWU5DICAgICAoMTw8MTIpCi0jZGVmaW5lIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfU0JBU19TWU5DICAgICAgICAgICAgICgxPDwxMykKIAogLyogVGhlIGZvbGxvd2luZyB0eXBlZGVmIHRvZ2V0aGVyIHdpdGggaXRzIGNvbnN0YW50cyBiZWxvdyBhcmUgZGVwcmVjYXRlZCwgYW5kCiAgKiB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgcmVsZWFzZS4gKi8KQEAgLTM5MSwxMCArMjQ3LDYgQEAKICAqIEZsYWdzIGluZGljYXRpbmcgdGhlIEFjY3VtdWxhdGVkIERlbHRhIFJhbmdlJ3Mgc3RhdGVzLgogICovCiB0eXBlZGVmIHVpbnQxNl90IEduc3NBY2N1bXVsYXRlZERlbHRhUmFuZ2VTdGF0ZTsKLSNkZWZpbmUgR05TU19BRFJfU1RBVEVfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBHTlNTX0FEUl9TVEFURV9WQUxJRCAgICAgICAgICAgICAgICAgICAgICgxPDwwKQotI2RlZmluZSBHTlNTX0FEUl9TVEFURV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICgxPDwxKQotI2RlZmluZSBHTlNTX0FEUl9TVEFURV9DWUNMRV9TTElQICAgICAgICAgICAgICAgICgxPDwyKQogCiAvKiBUaGUgZm9sbG93aW5nIHR5cGVkZWYgdG9nZXRoZXIgd2l0aCBpdHMgY29uc3RhbnRzIGJlbG93IGFyZSBkZXByZWNhdGVkLCBhbmQKICAqIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCByZWxlYXNlLiAqLwpAQCAtNDE0LDI2ICsyNjYsNiBAQAogICovCiB0eXBlZGVmIGludDE2X3QgR25zc05hdmlnYXRpb25NZXNzYWdlVHlwZTsKIAotI2RlZmluZSBHTlNTX05BVklHQVRJT05fTUVTU0FHRV9UWVBFX1VOS05PV04gICAgICAgMAotLyoqIEdQUyBMMSBDL0EgbWVzc2FnZSBjb250YWluZWQgaW4gdGhlIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIEdOU1NfTkFWSUdBVElPTl9NRVNTQUdFX1RZUEVfR1BTX0wxQ0EgICAgICAweDAxMDEKLS8qKiBHUFMgTDItQ05BViBtZXNzYWdlIGNvbnRhaW5lZCBpbiB0aGUgc3RydWN0dXJlLiAqLwotI2RlZmluZSBHTlNTX05BVklHQVRJT05fTUVTU0FHRV9UWVBFX0dQU19MMkNOQVYgICAgMHgwMTAyCi0vKiogR1BTIEw1LUNOQVYgbWVzc2FnZSBjb250YWluZWQgaW4gdGhlIHN0cnVjdHVyZS4gKi8KLSNkZWZpbmUgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9HUFNfTDVDTkFWICAgIDB4MDEwMwotLyoqIEdQUyBDTkFWLTIgbWVzc2FnZSBjb250YWluZWQgaW4gdGhlIHN0cnVjdHVyZS4gKi8KLSNkZWZpbmUgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9HUFNfQ05BVjIgICAgIDB4MDEwNAotLyoqIEdsb25hc3MgTDEgQ0EgbWVzc2FnZSBjb250YWluZWQgaW4gdGhlIHN0cnVjdHVyZS4gKi8KLSNkZWZpbmUgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9HTE9fTDFDQSAgICAgIDB4MDMwMQotLyoqIEJlaWRvdSBEMSBtZXNzYWdlIGNvbnRhaW5lZCBpbiB0aGUgc3RydWN0dXJlLiAqLwotI2RlZmluZSBHTlNTX05BVklHQVRJT05fTUVTU0FHRV9UWVBFX0JEU19EMSAgICAgICAgMHgwNTAxCi0vKiogQmVpZG91IEQyIG1lc3NhZ2UgY29udGFpbmVkIGluIHRoZSBzdHJ1Y3R1cmUuICovCi0jZGVmaW5lIEdOU1NfTkFWSUdBVElPTl9NRVNTQUdFX1RZUEVfQkRTX0QyICAgICAgICAweDA1MDIKLS8qKiBHYWxpbGVvIEkvTkFWIG1lc3NhZ2UgY29udGFpbmVkIGluIHRoZSBzdHJ1Y3R1cmUuICovCi0jZGVmaW5lIEdOU1NfTkFWSUdBVElPTl9NRVNTQUdFX1RZUEVfR0FMX0kgICAgICAgICAweDA2MDEKLS8qKiBHYWxpbGVvIEYvTkFWIG1lc3NhZ2UgY29udGFpbmVkIGluIHRoZSBzdHJ1Y3R1cmUuICovCi0jZGVmaW5lIEdOU1NfTkFWSUdBVElPTl9NRVNTQUdFX1RZUEVfR0FMX0YgICAgICAgICAweDA2MDIKLQogLyoqCiAgKiBTdGF0dXMgb2YgTmF2aWdhdGlvbiBNZXNzYWdlCiAgKiBXaGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZCBwcm9wZXJseSB3aXRob3V0IGFueSBwYXJpdHkgZXJyb3IgaW4gaXRzIG5hdmlnYXRpb24gd29yZHMsIHRoZQpAQCAtNDQ0LDkgKzI3Niw2IEBACiAgKiBjb3JyZWN0ZWQuCiAgKi8KIHR5cGVkZWYgdWludDE2X3QgTmF2aWdhdGlvbk1lc3NhZ2VTdGF0dXM7Ci0jZGVmaW5lIE5BVl9NRVNTQUdFX1NUQVRVU19VTktOT1dOICAgICAgICAgICAgICAwCi0jZGVmaW5lIE5BVl9NRVNTQUdFX1NUQVRVU19QQVJJVFlfUEFTU0VEICAgKDE8PDApCi0jZGVmaW5lIE5BVl9NRVNTQUdFX1NUQVRVU19QQVJJVFlfUkVCVUlMVCAgKDE8PDEpCiAKIC8qIFRoaXMgY29uc3RhbnQgaXMgZGVwcmVjYXRlZCwgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCByZWxlYXNlLiAqLwogI2RlZmluZSBOQVZfTUVTU0FHRV9TVEFUVVNfVU5LT05XICAgICAgICAgICAgICAwCkBAIC00NTUsMjIgKzI4NCwxMSBAQAogICogRmxhZ3MgdGhhdCBpbmRpY2F0ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2F0ZWxsaXRlCiAgKi8KIHR5cGVkZWYgdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEduc3NTdkZsYWdzOwotI2RlZmluZSBHTlNTX1NWX0ZMQUdTX05PTkUgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBHTlNTX1NWX0ZMQUdTX0hBU19FUEhFTUVSSVNfREFUQSAgICAgICAgKDEgPDwgMCkKLSNkZWZpbmUgR05TU19TVl9GTEFHU19IQVNfQUxNQU5BQ19EQVRBICAgICAgICAgICgxIDw8IDEpCi0jZGVmaW5lIEdOU1NfU1ZfRkxBR1NfVVNFRF9JTl9GSVggICAgICAgICAgICAgICAoMSA8PCAyKQogCiAvKioKICAqIENvbnN0ZWxsYXRpb24gdHlwZSBvZiBHbnNzU3ZJbmZvCiAgKi8KIHR5cGVkZWYgdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgICBHbnNzQ29uc3RlbGxhdGlvblR5cGU7Ci0jZGVmaW5lIEdOU1NfQ09OU1RFTExBVElPTl9VTktOT1dOICAgICAgMAotI2RlZmluZSBHTlNTX0NPTlNURUxMQVRJT05fR1BTICAgICAgICAgIDEKLSNkZWZpbmUgR05TU19DT05TVEVMTEFUSU9OX1NCQVMgICAgICAgICAyCi0jZGVmaW5lIEdOU1NfQ09OU1RFTExBVElPTl9HTE9OQVNTICAgICAgMwotI2RlZmluZSBHTlNTX0NPTlNURUxMQVRJT05fUVpTUyAgICAgICAgIDQKLSNkZWZpbmUgR05TU19DT05TVEVMTEFUSU9OX0JFSURPVSAgICAgICA1Ci0jZGVmaW5lIEdOU1NfQ09OU1RFTExBVElPTl9HQUxJTEVPICAgICAgNgogCiAvKioKICAqIE5hbWUgZm9yIHRoZSBHUFMgWFRSQSBpbnRlcmZhY2UuCkBAIC01MjIsNyArMzQwLDYgQEAKICAqLwogI2RlZmluZSBHTlNTX0NPTkZJR1VSQVRJT05fSU5URVJGQUNFICAgICAiZ25zc19jb25maWd1cmF0aW9uIgogCi0KIC8qKiBSZXByZXNlbnRzIGEgbG9jYXRpb24uICovCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgLyoqIHNldCB0byBzaXplb2YoR3BzTG9jYXRpb24pICovCkBAIC0xMTI2LDkgKzk0Myw2IEBACiAgICAgY29uc3QgR3BzSW50ZXJmYWNlKiAoKmdldF9ncHNfaW50ZXJmYWNlKShzdHJ1Y3QgZ3BzX2RldmljZV90KiBkZXYpOwogfTsKIAotI2RlZmluZSBBR1BTX1JJTF9SRVFVRVNUX1NFVElEX0lNU0kgICAgICgxPDwwTCkKLSNkZWZpbmUgQUdQU19SSUxfUkVRVUVTVF9TRVRJRF9NU0lTRE4gICAoMTw8MUwpCi0KICNkZWZpbmUgQUdQU19SSUxfUkVRVUVTVF9SRUZMT0NfQ0VMTElEICAoMTw8MEwpCiAjZGVmaW5lIEFHUFNfUklMX1JFUVVFU1RfUkVGTE9DX01BQyAgICAgKDE8PDFMKQogCkBAIC0xMjUxLDE5ICsxMDY1LDYgQEAKICAqIHN1YnN5c3RlbSBrbm93cyBhYm91dCB0aGUgR2VvZmVuY2UuCiAgKgogICovCi0jZGVmaW5lIEdQU19HRU9GRU5DRV9FTlRFUkVEICAgICAoMTw8MEwpCi0jZGVmaW5lIEdQU19HRU9GRU5DRV9FWElURUQgICAgICAoMTw8MUwpCi0jZGVmaW5lIEdQU19HRU9GRU5DRV9VTkNFUlRBSU4gICAoMTw8MkwpCi0KLSNkZWZpbmUgR1BTX0dFT0ZFTkNFX1VOQVZBSUxBQkxFICgxPDwwTCkKLSNkZWZpbmUgR1BTX0dFT0ZFTkNFX0FWQUlMQUJMRSAgICgxPDwxTCkKLQotI2RlZmluZSBHUFNfR0VPRkVOQ0VfT1BFUkFUSU9OX1NVQ0NFU1MgICAgICAgICAgIDAKLSNkZWZpbmUgR1BTX0dFT0ZFTkNFX0VSUk9SX1RPT19NQU5ZX0dFT0ZFTkNFUyAtMTAwCi0jZGVmaW5lIEdQU19HRU9GRU5DRV9FUlJPUl9JRF9FWElTVFMgICAgICAgICAgLTEwMQotI2RlZmluZSBHUFNfR0VPRkVOQ0VfRVJST1JfSURfVU5LTk9XTiAgICAgICAgIC0xMDIKLSNkZWZpbmUgR1BTX0dFT0ZFTkNFX0VSUk9SX0lOVkFMSURfVFJBTlNJVElPTiAtMTAzCi0jZGVmaW5lIEdQU19HRU9GRU5DRV9FUlJPUl9HRU5FUklDICAgICAgICAgICAgLTE0OQogCiAvKioKICAqIFRoZSBjYWxsYmFjayBhc3NvY2lhdGVkIHdpdGggdGhlIGdlb2ZlbmNlLgpAQCAtMTk3MiwxMCArMTc3Myw2IEBACiAgICAgZ25zc19tZWFzdXJlbWVudF9jYWxsYmFjayBnbnNzX21lYXN1cmVtZW50X2NhbGxiYWNrOwogfSBHcHNNZWFzdXJlbWVudENhbGxiYWNrczsKIAotI2RlZmluZSBHUFNfTUVBU1VSRU1FTlRfT1BFUkFUSU9OX1NVQ0NFU1MgICAgICAgICAgMAotI2RlZmluZSBHUFNfTUVBU1VSRU1FTlRfRVJST1JfQUxSRUFEWV9JTklUICAgICAgLTEwMAotI2RlZmluZSBHUFNfTUVBU1VSRU1FTlRfRVJST1JfR0VORVJJQyAgICAgICAgICAgLTEwMQotCiAvKioKICAqIEV4dGVuZGVkIGludGVyZmFjZSBmb3IgR1BTIE1lYXN1cmVtZW50cyBzdXBwb3J0LgogICovCkBAIC0yMTQ3LDEwICsxOTQ0LDYgQEAKICAgICBnbnNzX25hdmlnYXRpb25fbWVzc2FnZV9jYWxsYmFjayBnbnNzX25hdmlnYXRpb25fbWVzc2FnZV9jYWxsYmFjazsKIH0gR3BzTmF2aWdhdGlvbk1lc3NhZ2VDYWxsYmFja3M7CiAKLSNkZWZpbmUgR1BTX05BVklHQVRJT05fTUVTU0FHRV9PUEVSQVRJT05fU1VDQ0VTUyAgICAgICAgICAgICAwCi0jZGVmaW5lIEdQU19OQVZJR0FUSU9OX01FU1NBR0VfRVJST1JfQUxSRUFEWV9JTklUICAgICAgICAgLTEwMAotI2RlZmluZSBHUFNfTkFWSUdBVElPTl9NRVNTQUdFX0VSUk9SX0dFTkVSSUMgICAgICAgICAgICAgIC0xMDEKLQogLyoqCiAgKiBFeHRlbmRlZCBpbnRlcmZhY2UgZm9yIEdQUyBuYXZpZ2F0aW9uIG1lc3NhZ2UgcmVwb3J0aW5nIHN1cHBvcnQuCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvZ3JhbGxvYy5oIGIvaW5jbHVkZS9oYXJkd2FyZS9ncmFsbG9jLmgKaW5kZXggNzc5OTE1Yy4uMWIwNmViZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9ncmFsbG9jLmgKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS9ncmFsbG9jLmgKQEAgLTY4LDY5ICs2OCw2OSBAQAogCiBlbnVtIHsKICAgICAvKiBidWZmZXIgaXMgbmV2ZXIgcmVhZCBpbiBzb2Z0d2FyZSAqLwotICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9ORVZFUiAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgICBHUkFMTE9DX1VTQUdFX1NXX1JFQURfTkVWRVIgICAgICAgICA9IDB4MDAwMDAwMDBVLAogICAgIC8qIGJ1ZmZlciBpcyByYXJlbHkgcmVhZCBpbiBzb2Z0d2FyZSAqLwotICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9SQVJFTFkgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgICBHUkFMTE9DX1VTQUdFX1NXX1JFQURfUkFSRUxZICAgICAgICA9IDB4MDAwMDAwMDJVLAogICAgIC8qIGJ1ZmZlciBpcyBvZnRlbiByZWFkIGluIHNvZnR3YXJlICovCi0gICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOICAgICAgICAgPSAweDAwMDAwMDAzLAorICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiAgICAgICAgID0gMHgwMDAwMDAwM1UsCiAgICAgLyogbWFzayBmb3IgdGhlIHNvZnR3YXJlIHJlYWQgdmFsdWVzICovCi0gICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX01BU0sgICAgICAgICAgPSAweDAwMDAwMDBGLAorICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9NQVNLICAgICAgICAgID0gMHgwMDAwMDAwRlUsCiAKICAgICAvKiBidWZmZXIgaXMgbmV2ZXIgd3JpdHRlbiBpbiBzb2Z0d2FyZSAqLwotICAgIEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfTkVWRVIgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgICBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX05FVkVSICAgICAgICA9IDB4MDAwMDAwMDBVLAogICAgIC8qIGJ1ZmZlciBpcyByYXJlbHkgd3JpdHRlbiBpbiBzb2Z0d2FyZSAqLwotICAgIEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfUkFSRUxZICAgICAgID0gMHgwMDAwMDAyMCwKKyAgICBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX1JBUkVMWSAgICAgICA9IDB4MDAwMDAwMjBVLAogICAgIC8qIGJ1ZmZlciBpcyBvZnRlbiB3cml0dGVuIGluIHNvZnR3YXJlICovCi0gICAgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiAgICAgICAgPSAweDAwMDAwMDMwLAorICAgIEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4gICAgICAgID0gMHgwMDAwMDAzMFUsCiAgICAgLyogbWFzayBmb3IgdGhlIHNvZnR3YXJlIHdyaXRlIHZhbHVlcyAqLwotICAgIEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfTUFTSyAgICAgICAgID0gMHgwMDAwMDBGMCwKKyAgICBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX01BU0sgICAgICAgICA9IDB4MDAwMDAwRjBVLAogCiAgICAgLyogYnVmZmVyIHdpbGwgYmUgdXNlZCBhcyBhbiBPcGVuR0wgRVMgdGV4dHVyZSAqLwotICAgIEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSAgICAgICAgICAgID0gMHgwMDAwMDEwMCwKKyAgICBHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUgICAgICAgICAgICA9IDB4MDAwMDAxMDBVLAogICAgIC8qIGJ1ZmZlciB3aWxsIGJlIHVzZWQgYXMgYW4gT3BlbkdMIEVTIHJlbmRlciB0YXJnZXQgKi8KLSAgICBHUkFMTE9DX1VTQUdFX0hXX1JFTkRFUiAgICAgICAgICAgICA9IDB4MDAwMDAyMDAsCisgICAgR1JBTExPQ19VU0FHRV9IV19SRU5ERVIgICAgICAgICAgICAgPSAweDAwMDAwMjAwVSwKICAgICAvKiBidWZmZXIgd2lsbCBiZSB1c2VkIGJ5IHRoZSAyRCBoYXJkd2FyZSBibGl0dGVyICovCi0gICAgR1JBTExPQ19VU0FHRV9IV18yRCAgICAgICAgICAgICAgICAgPSAweDAwMDAwNDAwLAorICAgIEdSQUxMT0NfVVNBR0VfSFdfMkQgICAgICAgICAgICAgICAgID0gMHgwMDAwMDQwMFUsCiAgICAgLyogYnVmZmVyIHdpbGwgYmUgdXNlZCBieSB0aGUgSFdDb21wb3NlciBIQUwgbW9kdWxlICovCi0gICAgR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUiAgICAgICAgICAgPSAweDAwMDAwODAwLAorICAgIEdSQUxMT0NfVVNBR0VfSFdfQ09NUE9TRVIgICAgICAgICAgID0gMHgwMDAwMDgwMFUsCiAgICAgLyogYnVmZmVyIHdpbGwgYmUgdXNlZCB3aXRoIHRoZSBmcmFtZWJ1ZmZlciBkZXZpY2UgKi8KLSAgICBHUkFMTE9DX1VTQUdFX0hXX0ZCICAgICAgICAgICAgICAgICA9IDB4MDAwMDEwMDAsCisgICAgR1JBTExPQ19VU0FHRV9IV19GQiAgICAgICAgICAgICAgICAgPSAweDAwMDAxMDAwVSwKIAogICAgIC8qIGJ1ZmZlciBzaG91bGQgYmUgZGlzcGxheWVkIGZ1bGwtc2NyZWVuIG9uIGFuIGV4dGVybmFsIGRpc3BsYXkgd2hlbgogICAgICAqIHBvc3NpYmxlICovCi0gICAgR1JBTExPQ19VU0FHRV9FWFRFUk5BTF9ESVNQICAgICAgICAgPSAweDAwMDAyMDAwLAorICAgIEdSQUxMT0NfVVNBR0VfRVhURVJOQUxfRElTUCAgICAgICAgID0gMHgwMDAwMjAwMFUsCiAKICAgICAvKiBNdXN0IGhhdmUgYSBoYXJkd2FyZS1wcm90ZWN0ZWQgcGF0aCB0byBleHRlcm5hbCBkaXNwbGF5IHNpbmsgZm9yCiAgICAgICogdGhpcyBidWZmZXIuICBJZiBhIGhhcmR3YXJlLXByb3RlY3RlZCBwYXRoIGlzIG5vdCBhdmFpbGFibGUsIHRoZW4KICAgICAgKiBlaXRoZXIgZG9uJ3QgY29tcG9zaXRlIG9ubHkgdGhpcyBidWZmZXIgKHByZWZlcnJlZCkgdG8gdGhlCiAgICAgICogZXh0ZXJuYWwgc2luaywgb3IgKGxlc3MgZGVzaXJhYmxlKSBkbyBub3Qgcm91dGUgdGhlIGVudGlyZQogICAgICAqIGNvbXBvc2l0aW9uIHRvIHRoZSBleHRlcm5hbCBzaW5rLiAgKi8KLSAgICBHUkFMTE9DX1VTQUdFX1BST1RFQ1RFRCAgICAgICAgICAgICA9IDB4MDAwMDQwMDAsCisgICAgR1JBTExPQ19VU0FHRV9QUk9URUNURUQgICAgICAgICAgICAgPSAweDAwMDA0MDAwVSwKIAogICAgIC8qIGJ1ZmZlciBtYXkgYmUgdXNlZCBhcyBhIGN1cnNvciAqLwotICAgIEdSQUxMT0NfVVNBR0VfQ1VSU09SICAgICAgICAgICAgICAgID0gMHgwMDAwODAwMCwKKyAgICBHUkFMTE9DX1VTQUdFX0NVUlNPUiAgICAgICAgICAgICAgICA9IDB4MDAwMDgwMDBVLAogCiAgICAgLyogYnVmZmVyIHdpbGwgYmUgdXNlZCB3aXRoIHRoZSBIVyB2aWRlbyBlbmNvZGVyICovCi0gICAgR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSICAgICAgPSAweDAwMDEwMDAwLAorICAgIEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUiAgICAgID0gMHgwMDAxMDAwMFUsCiAgICAgLyogYnVmZmVyIHdpbGwgYmUgd3JpdHRlbiBieSB0aGUgSFcgY2FtZXJhIHBpcGVsaW5lICovCi0gICAgR1JBTExPQ19VU0FHRV9IV19DQU1FUkFfV1JJVEUgICAgICAgPSAweDAwMDIwMDAwLAorICAgIEdSQUxMT0NfVVNBR0VfSFdfQ0FNRVJBX1dSSVRFICAgICAgID0gMHgwMDAyMDAwMFUsCiAgICAgLyogYnVmZmVyIHdpbGwgYmUgcmVhZCBieSB0aGUgSFcgY2FtZXJhIHBpcGVsaW5lICovCi0gICAgR1JBTExPQ19VU0FHRV9IV19DQU1FUkFfUkVBRCAgICAgICAgPSAweDAwMDQwMDAwLAorICAgIEdSQUxMT0NfVVNBR0VfSFdfQ0FNRVJBX1JFQUQgICAgICAgID0gMHgwMDA0MDAwMFUsCiAgICAgLyogYnVmZmVyIHdpbGwgYmUgdXNlZCBhcyBwYXJ0IG9mIHplcm8tc2h1dHRlci1sYWcgcXVldWUgKi8KLSAgICBHUkFMTE9DX1VTQUdFX0hXX0NBTUVSQV9aU0wgICAgICAgICA9IDB4MDAwNjAwMDAsCisgICAgR1JBTExPQ19VU0FHRV9IV19DQU1FUkFfWlNMICAgICAgICAgPSAweDAwMDYwMDAwVSwKICAgICAvKiBtYXNrIGZvciB0aGUgY2FtZXJhIGFjY2VzcyB2YWx1ZXMgKi8KLSAgICBHUkFMTE9DX1VTQUdFX0hXX0NBTUVSQV9NQVNLICAgICAgICA9IDB4MDAwNjAwMDAsCisgICAgR1JBTExPQ19VU0FHRV9IV19DQU1FUkFfTUFTSyAgICAgICAgPSAweDAwMDYwMDAwVSwKICAgICAvKiBtYXNrIGZvciB0aGUgc29mdHdhcmUgdXNhZ2UgYml0LW1hc2sgKi8KLSAgICBHUkFMTE9DX1VTQUdFX0hXX01BU0sgICAgICAgICAgICAgICA9IDB4MDAwNzFGMDAsCisgICAgR1JBTExPQ19VU0FHRV9IV19NQVNLICAgICAgICAgICAgICAgPSAweDAwMDcxRjAwVSwKIAogICAgIC8qIGJ1ZmZlciB3aWxsIGJlIHVzZWQgYXMgYSBSZW5kZXJTY3JpcHQgQWxsb2NhdGlvbiAqLwotICAgIEdSQUxMT0NfVVNBR0VfUkVOREVSU0NSSVBUICAgICAgICAgID0gMHgwMDEwMDAwMCwKKyAgICBHUkFMTE9DX1VTQUdFX1JFTkRFUlNDUklQVCAgICAgICAgICA9IDB4MDAxMDAwMDBVLAogCiAgICAgLyogU2V0IGJ5IHRoZSBjb25zdW1lciB0byBpbmRpY2F0ZSB0byB0aGUgcHJvZHVjZXIgdGhhdCB0aGV5IG1heSBhdHRhY2ggYQogICAgICAqIGJ1ZmZlciB0aGF0IHRoZXkgZGlkIG5vdCBkZXRhY2ggZnJvbSB0aGUgQnVmZmVyUXVldWUuIFdpbGwgYmUgZmlsdGVyZWQKICAgICAgKiBvdXQgYnkgR1JBTExPQ19VU0FHRV9BTExPQ19NQVNLLCBzbyBncmFsbG9jIG1vZHVsZXMgd2lsbCBub3QgbmVlZCB0bwogICAgICAqIGhhbmRsZSB0aGlzIGZsYWcuICovCi0gICAgR1JBTExPQ19VU0FHRV9GT1JFSUdOX0JVRkZFUlMgICAgICAgPSAweDAwMjAwMDAwLAorICAgIEdSQUxMT0NfVVNBR0VfRk9SRUlHTl9CVUZGRVJTICAgICAgID0gMHgwMDIwMDAwMFUsCiAKICAgICAvKiBNYXNrIG9mIGFsbCBmbGFncyB3aGljaCBjb3VsZCBiZSBwYXNzZWQgdG8gYSBncmFsbG9jIG1vZHVsZSBmb3IgYnVmZmVyCiAgICAgICogYWxsb2NhdGlvbi4gQW55IGZsYWdzIG5vdCBpbiB0aGlzIG1hc2sgZG8gbm90IG5lZWQgdG8gYmUgaGFuZGxlZCBieQpAQCAtMTM4LDExICsxMzgsMTEgQEAKICAgICBHUkFMTE9DX1VTQUdFX0FMTE9DX01BU0sgICAgICAgICAgICA9IH4oR1JBTExPQ19VU0FHRV9GT1JFSUdOX0JVRkZFUlMpLAogCiAgICAgLyogaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgcHJpdmF0ZSB1c2FnZSBmbGFncyAqLwotICAgIEdSQUxMT0NfVVNBR0VfUFJJVkFURV8wICAgICAgICAgICAgID0gMHgxMDAwMDAwMCwKLSAgICBHUkFMTE9DX1VTQUdFX1BSSVZBVEVfMSAgICAgICAgICAgICA9IDB4MjAwMDAwMDAsCi0gICAgR1JBTExPQ19VU0FHRV9QUklWQVRFXzIgICAgICAgICAgICAgPSAweDQwMDAwMDAwLAotICAgIEdSQUxMT0NfVVNBR0VfUFJJVkFURV8zICAgICAgICAgICAgID0gMHg4MDAwMDAwMCwKLSAgICBHUkFMTE9DX1VTQUdFX1BSSVZBVEVfTUFTSyAgICAgICAgICA9IDB4RjAwMDAwMDAsCisgICAgR1JBTExPQ19VU0FHRV9QUklWQVRFXzAgICAgICAgICAgICAgPSAweDEwMDAwMDAwVSwKKyAgICBHUkFMTE9DX1VTQUdFX1BSSVZBVEVfMSAgICAgICAgICAgICA9IDB4MjAwMDAwMDBVLAorICAgIEdSQUxMT0NfVVNBR0VfUFJJVkFURV8yICAgICAgICAgICAgID0gMHg0MDAwMDAwMFUsCisgICAgR1JBTExPQ19VU0FHRV9QUklWQVRFXzMgICAgICAgICAgICAgPSAweDgwMDAwMDAwVSwKKyAgICBHUkFMTE9DX1VTQUdFX1BSSVZBVEVfTUFTSyAgICAgICAgICA9IDB4RjAwMDAwMDBVLAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzcyLDcgKzM3Miw3IEBACiBzdGF0aWMgaW5saW5lIGludCBncmFsbG9jX29wZW4oY29uc3Qgc3RydWN0IGh3X21vZHVsZV90KiBtb2R1bGUsIAogICAgICAgICBzdHJ1Y3QgYWxsb2NfZGV2aWNlX3QqKiBkZXZpY2UpIHsKICAgICByZXR1cm4gbW9kdWxlLT5tZXRob2RzLT5vcGVuKG1vZHVsZSwgCi0gICAgICAgICAgICBHUkFMTE9DX0hBUkRXQVJFX0dQVTAsIChzdHJ1Y3QgaHdfZGV2aWNlX3QqKilkZXZpY2UpOworICAgICAgICAgICAgR1JBTExPQ19IQVJEV0FSRV9HUFUwLCBUT19IV19ERVZJQ0VfVF9PUEVOKGRldmljZSkpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBncmFsbG9jX2Nsb3NlKHN0cnVjdCBhbGxvY19kZXZpY2VfdCogZGV2aWNlKSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2dyYWxsb2MxLmggYi9pbmNsdWRlL2hhcmR3YXJlL2dyYWxsb2MxLmgKaW5kZXggNThjMGUzMy4uNDg0NTAxMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9ncmFsbG9jMS5oCisrKyBiL2luY2x1ZGUvaGFyZHdhcmUvZ3JhbGxvYzEuaApAQCAtMzYsNyArMzYsMTkgQEAKICAgICAgKiBhbGxvY2F0ZSBtYXkgYmUgTlVMTCwgd2hpY2ggaW5zdHJ1Y3RzIHRoZSBkZXZpY2UgdG8gcmVwb3J0IHdoZXRoZXIgdGhlCiAgICAgICogZ2l2ZW4gYWxsb2NhdGlvbiBpcyBwb3NzaWJsZSBvciBub3QuICovCiAgICAgR1JBTExPQzFfQ0FQQUJJTElUWV9URVNUX0FMTE9DQVRFID0gMSwKLSAgICBHUkFMTE9DMV9MQVNUX0NBUEFCSUxJVFkgPSAxLAorCisgICAgLyogSWYgdGhpcyBjYXBhYmlsaXR5IGlzIHN1cHBvcnRlZCwgdGhlbiB0aGUgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMKKyAgICAgKiBhbGxvY2F0aW5nIGJ1ZmZlcnMgd2l0aCBtb3JlIHRoYW4gb25lIGltYWdlIGxheWVyLiAqLworICAgIEdSQUxMT0MxX0NBUEFCSUxJVFlfTEFZRVJFRF9CVUZGRVJTID0gMiwKKworICAgIC8qIElmIHRoaXMgY2FwYWJpbGl0eSBpcyBzdXBwb3J0ZWQsIHRoZW4gdGhlIGltcGxlbWVudGF0aW9uIGFsd2F5cyBjbG9zZXMKKyAgICAgKiBhbmQgZGVsZXRlcyBhIGJ1ZmZlciBoYW5kbGUgd2hlbmV2ZXIgdGhlIGxhc3QgcmVmZXJlbmNlIGlzIHJlbW92ZWQuCisgICAgICoKKyAgICAgKiBTdXBwb3J0aW5nIHRoaXMgY2FwYWJpbGl0eSBpcyBzdHJvbmdseSByZWNvbW1lbmRlZC4gIEl0IHdpbGwgYmVjb21lCisgICAgICogbWFuZGF0b3J5IGluIGZ1dHVyZSByZWxlYXNlcy4gKi8KKyAgICBHUkFMTE9DMV9DQVBBQklMSVRZX1JFTEVBU0VfSU1QTFlfREVMRVRFID0gMywKKworICAgIEdSQUxMT0MxX0xBU1RfQ0FQQUJJTElUWSA9IDMsCiB9IGdyYWxsb2MxX2NhcGFiaWxpdHlfdDsKIAogdHlwZWRlZiBlbnVtIHsKQEAgLTcxLDcgKzgzLDcgQEAKICAgICBHUkFMTE9DMV9DT05TVU1FUl9VU0FHRV9GT1JFSUdOX0JVRkZFUlMgPSAxVUxMIDw8IDIxLAogCiAgICAgLyogMVVMTCA8PCAyMiAqLwotICAgIC8qIDFVTEwgPDwgMjMgKi8KKyAgICBHUkFMTE9DMV9DT05TVU1FUl9VU0FHRV9HUFVfREFUQV9CVUZGRVIgPSAxVUxMIDw8IDIzLAogICAgIC8qIDFVTEwgPDwgMjQgKi8KICAgICAvKiAxVUxMIDw8IDI1ICovCiAgICAgLyogMVVMTCA8PCAyNiAqLwpAQCAtMTQxLDcgKzE1Myw5IEBACiAgICAgR1JBTExPQzFfRlVOQ1RJT05fTE9DSyA9IDE4LAogICAgIEdSQUxMT0MxX0ZVTkNUSU9OX0xPQ0tfRkxFWCA9IDE5LAogICAgIEdSQUxMT0MxX0ZVTkNUSU9OX1VOTE9DSyA9IDIwLAotICAgIEdSQUxMT0MxX0xBU1RfRlVOQ1RJT04gPSAyMCwKKyAgICBHUkFMTE9DMV9GVU5DVElPTl9TRVRfTEFZRVJfQ09VTlQgPSAyMSwKKyAgICBHUkFMTE9DMV9GVU5DVElPTl9HRVRfTEFZRVJfQ09VTlQgPSAyMiwKKyAgICBHUkFMTE9DMV9MQVNUX0ZVTkNUSU9OID0gMjIsCiB9IGdyYWxsb2MxX2Z1bmN0aW9uX2Rlc2NyaXB0b3JfdDsKIAogdHlwZWRlZiBlbnVtIHsKQEAgLTE4OCw3ICsyMDIsNyBAQAogICAgIC8qIDFVTEwgPDwgMjAgKi8KICAgICAvKiAxVUxMIDw8IDIxICovCiAgICAgR1JBTExPQzFfUFJPRFVDRVJfVVNBR0VfVklERU9fREVDT0RFUiA9IDFVTEwgPDwgMjIsCi0gICAgLyogMVVMTCA8PCAyMyAqLworICAgIEdSQUxMT0MxX1BST0RVQ0VSX1VTQUdFX1NFTlNPUl9ESVJFQ1RfREFUQSA9IDFVTEwgPDwgMjMsCiAgICAgLyogMVVMTCA8PCAyNCAqLwogICAgIC8qIDFVTEwgPDwgMjUgKi8KICAgICAvKiAxVUxMIDw8IDI2ICovCkBAIC0yOTAsNyArMzA0LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50IGdyYWxsb2MxX29wZW4oY29uc3Qgc3RydWN0IGh3X21vZHVsZV90KiBtb2R1bGUsCiAgICAgICAgIGdyYWxsb2MxX2RldmljZV90KiogZGV2aWNlKSB7CiAgICAgcmV0dXJuIG1vZHVsZS0+bWV0aG9kcy0+b3Blbihtb2R1bGUsIEdSQUxMT0NfSEFSRFdBUkVfTU9EVUxFX0lELAotICAgICAgICAgICAgKHN0cnVjdCBod19kZXZpY2VfdCoqKSBkZXZpY2UpOworICAgICAgICAgICAgVE9fSFdfREVWSUNFX1RfT1BFTihkZXZpY2UpKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZ3JhbGxvYzFfY2xvc2UoZ3JhbGxvYzFfZGV2aWNlX3QqIGRldmljZSkgewpAQCAtNDQwLDYgKzQ1NCwzMCBAQAogICAgICAgICBncmFsbG9jMV9kZXZpY2VfdCogZGV2aWNlLCBncmFsbG9jMV9idWZmZXJfZGVzY3JpcHRvcl90IGRlc2NyaXB0b3IsCiAgICAgICAgIGludDMyX3QgLyphbmRyb2lkX3BpeGVsX2Zvcm1hdF90Ki8gZm9ybWF0KTsKIAorLyogc2V0TGF5ZXJDb3VudCguLi4sIGxheWVyQ291bnQpCisgKiBGdW5jdGlvbiBkZXNjcmlwdG9yOiBHUkFMTE9DMV9GVU5DVElPTl9TRVRfTEFZRVJfQ09VTlQKKyAqIE11c3QgYmUgcHJvdmlkZWQgYnkgYWxsIGdyYWxsb2MxIGRldmljZXMgdGhhdCBwcm92aWRlIHRoZQorICogR1JBTExPQzFfQ0FQQUJJTElUWV9MQVlFUkVEX0JVRkZFUlMgY2FwYWJpbGl0eS4KKyAqCisgKiBTZXRzIHRoZSBudW1iZXIgb2YgbGF5ZXJzIGluIHRoZSBidWZmZXIuCisgKgorICogQSBidWZmZXIgd2l0aCBtdWx0aXBsZSBsYXllcnMgbWF5IGJlIHVzZWQgYXMgdGhlIGJhY2tpbmcgc3RvcmUgb2YgYW4gYXJyYXkKKyAqIHRleHR1cmUuIEFsbCBsYXllcnMgb2YgYSBidWZmZXIgc2hhcmUgdGhlIHNhbWUgY2hhcmFjdGVyaXN0aWNzIChlLmcuLAorICogZGltZW5zaW9ucywgZm9ybWF0LCB1c2FnZSkuIERldmljZXMgdGhhdCBkbyBub3Qgc3VwcG9ydAorICogR1JBTExPQzFfQ0FQQUJJTElUWV9MQVlFUkVEX0JVRkZFUlMgbXVzdCBhbGxvY2F0ZSBvbmx5IGJ1ZmZlcnMgd2l0aCBhIHNpbmdsZQorICogbGF5ZXIuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgbGF5ZXJDb3VudCAtIHRoZSBkZXNpcmVkIG51bWJlciBvZiBsYXllcnMsIG11c3QgYmUgbm9uLXplcm8KKyAqCisgKiBSZXR1cm5zIEdSQUxMT0MxX0VSUk9SX05PTkUgb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcgZXJyb3JzOgorICogICBHUkFMTE9DMV9FUlJPUl9CQURfREVTQ1JJUFRPUiAtIHRoZSBidWZmZXIgZGVzY3JpcHRvciBpcyBpbnZhbGlkCisgKiAgIEdSQUxMT0MxX0VSUk9SX0JBRF9WQUxVRSAtIHRoZSBsYXllciBjb3VudCBpcyBpbnZhbGlkCisgKi8KK3R5cGVkZWYgaW50MzJfdCAvKmdyYWxsb2MxX2Vycm9yX3QqLyAoKkdSQUxMT0MxX1BGTl9TRVRfTEFZRVJfQ09VTlQpKAorICAgICAgICBncmFsbG9jMV9kZXZpY2VfdCogZGV2aWNlLCBncmFsbG9jMV9idWZmZXJfZGVzY3JpcHRvcl90IGRlc2NyaXB0b3IsCisgICAgICAgIHVpbnQzMl90IGxheWVyQ291bnQpOworCiAvKiBzZXRQcm9kdWNlclVzYWdlKC4uLiwgdXNhZ2UpCiAgKiBGdW5jdGlvbiBkZXNjcmlwdG9yOiBHUkFMTE9DMV9GVU5DVElPTl9TRVRfUFJPRFVDRVJfVVNBR0UKICAqIE11c3QgYmUgcHJvdmlkZWQgYnkgYWxsIGdyYWxsb2MxIGRldmljZXMKQEAgLTU2NCw2ICs2MDIsMjggQEAKICAgICAgICAgZ3JhbGxvYzFfZGV2aWNlX3QqIGRldmljZSwgYnVmZmVyX2hhbmRsZV90IGRlc2NyaXB0b3IsCiAgICAgICAgIGludDMyX3QqIG91dEZvcm1hdCk7CiAKKy8qIGdldExheWVyQ291bnQoLi4uLCBvdXRMYXllckNvdW50KQorICogRnVuY3Rpb24gZGVzY3JpcHRvcjogR1JBTExPQzFfRlVOQ1RJT05fR0VUX0xBWUVSX0NPVU5UCisgKiBNdXN0IGJlIHByb3ZpZGVkIGJ5IGFsbCBncmFsbG9jMSBkZXZpY2VzIHRoYXQgcHJvdmlkZSB0aGUKKyAqIEdSQUxMT0MxX0NBUEFCSUxJVFlfTEFZRVJFRF9CVUZGRVJTIGNhcGFiaWxpdHkuCisgKgorICogR2V0cyB0aGUgbnVtYmVyIG9mIGxheWVycyBvZiB0aGUgYnVmZmVyLgorICoKKyAqIFNlZSBzZXRMYXllckNvdW50IGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdmFsdWUuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgb3V0TGF5ZXJDb3VudCAtIHRoZSBudW1iZXIgb2YgbGF5ZXJzIGluIHRoZSBpbWFnZSwgbXVzdCBiZSBub24tTlVMTAorICoKKyAqIFJldHVybnMgR1JBTExPQzFfRVJST1JfTk9ORSBvciBvbmUgb2YgdGhlIGZvbGxvd2luZyBlcnJvcnM6CisgKiAgIEdSQUxMT0MxX0VSUk9SX0JBRF9IQU5ETEUgLSB0aGUgYnVmZmVyIGhhbmRsZSBpcyBpbnZhbGlkCisgKiAgIEdSQUxMT0MxX0VSUk9SX1VOU1VQUE9SVEVEIC0gdGhlIGRldmljZSBpcyB1bmFibGUgdG8gcmV0cmlldmUgdGhlCisgKiAgICAgICBsYXllciBjb3VudCBmcm9tIHRoZSBidWZmZXI7IHNlZSBub3RlIFsxXSBpbiB0aGlzIHNlY3Rpb24ncyBoZWFkZXIgZm9yCisgKiAgICAgICBtb3JlIGluZm9ybWF0aW9uCisgKi8KK3R5cGVkZWYgaW50MzJfdCAvKmdyYWxsb2MxX2Vycm9yX3QqLyAoKkdSQUxMT0MxX1BGTl9HRVRfTEFZRVJfQ09VTlQpKAorICAgICAgICBncmFsbG9jMV9kZXZpY2VfdCogZGV2aWNlLCBidWZmZXJfaGFuZGxlX3QgYnVmZmVyLAorICAgICAgICB1aW50MzJfdCogb3V0TGF5ZXJDb3VudCk7CisKIC8qIGdldFByb2R1Y2VyVXNhZ2UoLi4uLCBvdXRVc2FnZSkKICAqIEZ1bmN0aW9uIGRlc2NyaXB0b3I6IEdSQUxMT0MxX0ZVTkNUSU9OX0dFVF9QUk9EVUNFUl9VU0FHRQogICogTXVzdCBiZSBwcm92aWRlZCBieSBhbGwgZ3JhbGxvYzEgZGV2aWNlcwpAQCAtNjk2LDYgKzc1NiwxMiBAQAogICogcmVmZXJyaW5nIHRvIGEgcGFydGljdWxhciBiYWNraW5nIHN0b3JlIGlzIGZyZWVkLCB0aGF0IGJhY2tpbmcgc3RvcmUgc2hvdWxkCiAgKiBhbHNvIGJlIGZyZWVkLgogICoKKyAqIFdoZW4gR1JBTExPQzFfQ0FQQUJJTElUWV9SRUxFQVNFX0lNUExZX0RFTEVURSBpcyBzdXBwb3J0ZWQsCisgKiBuYXRpdmVfaGFuZGxlX2Nsb3NlIGFuZCBuYXRpdmVfaGFuZGxlX2RlbGV0ZSBtdXN0IGFsd2F5cyBiZSBjYWxsZWQgYnkgdGhlCisgKiBpbXBsZW1lbnRhdGlvbiB3aGVuZXZlciB0aGUgbGFzdCByZWZlcmVuY2UgaXMgcmVtb3ZlZC4gIE90aGVyd2lzZSwgYSBjYWxsCisgKiB0byByZWxlYXNlKCkgd2lsbCBiZSBmb2xsb3dlZCBieSBuYXRpdmVfaGFuZGxlX2Nsb3NlIGFuZCBuYXRpdmVfaGFuZGxlX2RlbGV0ZQorICogYnkgdGhlIGNhbGxlciB3aGVuIHRoZSBidWZmZXIgaXMgbm90IGFsbG9jYXRlZCBsb2NhbGx5IHRocm91Z2ggYWxsb2NhdGUoKS4KKyAqCiAgKiBQYXJhbWV0ZXJzOgogICogICBidWZmZXIgLSB0aGUgYnVmZmVyIGZyb20gd2hpY2ggYSByZWZlcmVuY2Ugc2hvdWxkIGJlIHJlbW92ZWQKICAqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2hhcmR3YXJlLmggYi9pbmNsdWRlL2hhcmR3YXJlL2hhcmR3YXJlLmgKaW5kZXggNzRmNTdhYS4uNWJhMzdlOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9oYXJkd2FyZS5oCisrKyBiL2luY2x1ZGUvaGFyZHdhcmUvaGFyZHdhcmUuaApAQCAtMjAsOCArMjAsMTAgQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KIAorI2lmbmRlZiBfSFdfRE9OVF9JTkNMVURFX0NPUkVfCiAjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KICNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KKyNlbmRpZiAvLyBfSFdfRE9OVF9JTkNMVURFX0NPUkVfCiAKIF9fQkVHSU5fREVDTFMKIApAQCAtMjAxLDYgKzIwMywxMiBAQAogCiB9IGh3X2RldmljZV90OwogCisjaWZkZWYgX19jcGx1c3BsdXMKKyNkZWZpbmUgVE9fSFdfREVWSUNFX1RfT1BFTih4KSByZWludGVycHJldF9jYXN0PHN0cnVjdCBod19kZXZpY2VfdCoqPih4KQorI2Vsc2UKKyNkZWZpbmUgVE9fSFdfREVWSUNFX1RfT1BFTih4KSAoc3RydWN0IGh3X2RldmljZV90KiopKHgpCisjZW5kaWYKKwogLyoqCiAgKiBOYW1lIG9mIHRoZSBoYWxfbW9kdWxlX2luZm8KICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS9oZG1pX2NlYy5oIGIvaW5jbHVkZS9oYXJkd2FyZS9oZG1pX2NlYy5oCmluZGV4IGFiNzBmOTIuLmFhMDYzODQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvaGRtaV9jZWMuaAorKysgYi9pbmNsdWRlL2hhcmR3YXJlL2hkbWlfY2VjLmgKQEAgLTQxNyw3ICs0MTcsNyBAQAogc3RhdGljIGlubGluZSBpbnQgaGRtaV9jZWNfb3Blbihjb25zdCBzdHJ1Y3QgaHdfbW9kdWxlX3QqIG1vZHVsZSwKICAgICAgICAgc3RydWN0IGhkbWlfY2VjX2RldmljZSoqIGRldmljZSkgewogICAgIHJldHVybiBtb2R1bGUtPm1ldGhvZHMtPm9wZW4obW9kdWxlLAotICAgICAgICAgICAgSERNSV9DRUNfSEFSRFdBUkVfSU5URVJGQUNFLCAoc3RydWN0IGh3X2RldmljZV90KiopZGV2aWNlKTsKKyAgICAgICAgICAgIEhETUlfQ0VDX0hBUkRXQVJFX0lOVEVSRkFDRSwgVE9fSFdfREVWSUNFX1RfT1BFTihkZXZpY2UpKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgaGRtaV9jZWNfY2xvc2Uoc3RydWN0IGhkbWlfY2VjX2RldmljZSogZGV2aWNlKSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2h3Y29tcG9zZXIuaCBiL2luY2x1ZGUvaGFyZHdhcmUvaHdjb21wb3Nlci5oCmluZGV4IDYxMjE4YmIuLjllYjFhYWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvaHdjb21wb3Nlci5oCisrKyBiL2luY2x1ZGUvaGFyZHdhcmUvaHdjb21wb3Nlci5oCkBAIC00ODEsNiArNDgxLDcgQEAKICAgICBzdHJ1Y3QgaHdfbW9kdWxlX3QgY29tbW9uOwogfSBod2NfbW9kdWxlX3Q7CiAKKyNkZWZpbmUgSFdDX0VSUk9SICgtMSkKIHR5cGVkZWYgc3RydWN0IGh3Y19jb21wb3Nlcl9kZXZpY2VfMSB7CiAgICAgLyoqCiAgICAgICogQ29tbW9uIG1ldGhvZHMgb2YgdGhlIGhhcmR3YXJlIGNvbXBvc2VyIGRldmljZS4gIFRoaXMgKm11c3QqIGJlIHRoZSBmaXJzdCBtZW1iZXIgb2YKQEAgLTcxNCw5ICs3MTUsOSBAQAogICAgICAqICgqZ2V0QWN0aXZlQ29uZmlnKSgpIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjb25maWd1cmF0aW9uIHRoYXQgaXMKICAgICAgKiBjdXJyZW50bHkgYWN0aXZlIG9uIHRoZSBjb25uZWN0ZWQgZGlzcGxheS4gVGhlIGluZGV4IGlzIHJlbGF0aXZlIHRvCiAgICAgICogdGhlIGxpc3Qgb2YgY29uZmlndXJhdGlvbiBoYW5kbGVzIHJldHVybmVkIGJ5IGdldERpc3BsYXlDb25maWdzLiBJZiB0aGVyZQotICAgICAqIGlzIG5vIGFjdGl2ZSBjb25maWd1cmF0aW9uLCAtMSBzaGFsbCBiZSByZXR1cm5lZC4KKyAgICAgKiBpcyBubyBhY3RpdmUgY29uZmlndXJhdGlvbiwgSFdDX0VSUk9SIHNoYWxsIGJlIHJldHVybmVkLgogICAgICAqCi0gICAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBpbmRleCBvbiBzdWNjZXNzIG9yIC0xIG9uIGVycm9yLgorICAgICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5kZXggb24gc3VjY2VzcyBvciBIV0NfRVJST1Igb24gZXJyb3IuCiAgICAgICoKICAgICAgKiBUaGlzIGZpZWxkIGlzIFJFUVVJUkVEIGZvciBIV0NfREVWSUNFX0FQSV9WRVJTSU9OXzFfNCBhbmQgbGF0ZXIuCiAgICAgICogSXQgc2hhbGwgYmUgTlVMTCBmb3IgcHJldmlvdXMgdmVyc2lvbnMuCkBAIC03ODMsNyArNzg0LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50IGh3Y19vcGVuXzEoY29uc3Qgc3RydWN0IGh3X21vZHVsZV90KiBtb2R1bGUsCiAgICAgICAgIGh3Y19jb21wb3Nlcl9kZXZpY2VfMV90KiogZGV2aWNlKSB7CiAgICAgcmV0dXJuIG1vZHVsZS0+bWV0aG9kcy0+b3Blbihtb2R1bGUsCi0gICAgICAgICAgICBIV0NfSEFSRFdBUkVfQ09NUE9TRVIsIChzdHJ1Y3QgaHdfZGV2aWNlX3QqKilkZXZpY2UpOworICAgICAgICAgICAgSFdDX0hBUkRXQVJFX0NPTVBPU0VSLCBUT19IV19ERVZJQ0VfVF9PUEVOKGRldmljZSkpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBod2NfY2xvc2VfMShod2NfY29tcG9zZXJfZGV2aWNlXzFfdCogZGV2aWNlKSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2h3Y29tcG9zZXIyLmggYi9pbmNsdWRlL2hhcmR3YXJlL2h3Y29tcG9zZXIyLmgKaW5kZXggNjk3MzYwMy4uZDVhMGQ2ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9od2NvbXBvc2VyMi5oCisrKyBiL2luY2x1ZGUvaGFyZHdhcmUvaHdjb21wb3NlcjIuaApAQCAtMTcsNiArMTcsOCBAQAogI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0hXQ09NUE9TRVIyX0gKICNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9IV0NPTVBPU0VSMl9ICiAKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKwogI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CiAKICNpbmNsdWRlICJod2NvbXBvc2VyX2RlZnMuaCIKQEAgLTkyLDYgKzk0LDE2IEBACiAgICAgICogdGhlIGNsaWVudC4gVGhpcyB3aWxsIHByZXZlbnQgdGhlIGNsaWVudCBmcm9tIGFwcGx5aW5nIHRoZSBjb2xvcgogICAgICAqIHRyYW5zZm9ybSBkdXJpbmcgaXRzIGNvbXBvc2l0aW9uIHN0ZXAuICovCiAgICAgSFdDMl9DQVBBQklMSVRZX1NLSVBfQ0xJRU5UX0NPTE9SX1RSQU5TRk9STSA9IDIsCisKKyAgICAvKiBTcGVjaWZpZXMgdGhhdCB0aGUgcHJlc2VudCBmZW5jZSBtdXN0IG5vdCBiZSB1c2VkIGFzIGFuIGFjY3VyYXRlCisgICAgICogcmVwcmVzZW50YXRpb24gb2YgdGhlIGFjdHVhbCBwcmVzZW50IHRpbWUgb2YgYSBmcmFtZS4KKyAgICAgKiBUaGlzIGNhcGFiaWxpdHkgbXVzdCBuZXZlciBiZSBzZXQgYnkgSFdDMiBkZXZpY2VzLgorICAgICAqIFRoaXMgY2FwYWJpbGl0eSBtYXkgYmUgc2V0IGZvciBIV0MxIGRldmljZXMgdGhhdCB1c2UgdGhlCisgICAgICogSFdDMk9uMUFkYXB0ZXIgd2hlcmUgZW11bGF0aW9uIG9mIHRoZSBwcmVzZW50IGZlbmNlIHVzaW5nIHRoZSByZXRpcmUKKyAgICAgKiBmZW5jZSBpcyBub3QgZmVhc2libGUuCisgICAgICogSW4gdGhlIGZ1dHVyZSwgQ1RTIHRlc3RzIHdpbGwgcmVxdWlyZSBwcmVzZW50IHRpbWUgdG8gYmUgcmVsaWFibGUuCisgICAgICovCisgICAgSFdDMl9DQVBBQklMSVRZX1BSRVNFTlRfRkVOQ0VfSVNfTk9UX1JFTElBQkxFID0gMywKIH0gaHdjMl9jYXBhYmlsaXR5X3Q7CiAKIC8qIFBvc3NpYmxlIGNvbXBvc2l0aW9uIHR5cGVzIGZvciBhIGdpdmVuIGxheWVyICovCkBAIC0zMzMsNiArMzQ1LDggQEAKICAgICAgICAgY2FzZSBIV0MyX0NBUEFCSUxJVFlfU0lERUJBTkRfU1RSRUFNOiByZXR1cm4gIlNpZGViYW5kU3RyZWFtIjsKICAgICAgICAgY2FzZSBIV0MyX0NBUEFCSUxJVFlfU0tJUF9DTElFTlRfQ09MT1JfVFJBTlNGT1JNOgogICAgICAgICAgICAgICAgIHJldHVybiAiU2tpcENsaWVudENvbG9yVHJhbnNmb3JtIjsKKyAgICAgICAgY2FzZSBIV0MyX0NBUEFCSUxJVFlfUFJFU0VOVF9GRU5DRV9JU19OT1RfUkVMSUFCTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuICJQcmVzZW50RmVuY2VJc05vdFJlbGlhYmxlIjsKICAgICAgICAgZGVmYXVsdDogcmV0dXJuICJVbmtub3duIjsKICAgICB9CiB9CkBAIC0zNjAsNyArMzc0LDcgQEAKIAogc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBnZXREaXNwbGF5UmVxdWVzdE5hbWUoCiAgICAgICAgIGh3YzJfZGlzcGxheV9yZXF1ZXN0X3QgcmVxdWVzdCkgewotICAgIHN3aXRjaCAocmVxdWVzdCkgeworICAgIHN3aXRjaCAoX19CSU9OSUNfQ0FTVChzdGF0aWNfY2FzdCwgaW50LCByZXF1ZXN0KSkgewogICAgICAgICBjYXNlIDA6IHJldHVybiAiTm9uZSI7CiAgICAgICAgIGNhc2UgSFdDMl9ESVNQTEFZX1JFUVVFU1RfRkxJUF9DTElFTlRfVEFSR0VUOiByZXR1cm4gIkZsaXBDbGllbnRUYXJnZXQiOwogICAgICAgICBjYXNlIEhXQzJfRElTUExBWV9SRVFVRVNUX1dSSVRFX0NMSUVOVF9UQVJHRVRfVE9fT1VUUFVUOgpAQCAtNDU5LDcgKzQ3Myw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogZ2V0TGF5ZXJSZXF1ZXN0TmFtZShod2MyX2xheWVyX3JlcXVlc3RfdCByZXF1ZXN0KSB7Ci0gICAgc3dpdGNoIChyZXF1ZXN0KSB7CisgICAgc3dpdGNoIChfX0JJT05JQ19DQVNUKHN0YXRpY19jYXN0LCBpbnQsIHJlcXVlc3QpKSB7CiAgICAgICAgIGNhc2UgMDogcmV0dXJuICJOb25lIjsKICAgICAgICAgY2FzZSBIV0MyX0xBWUVSX1JFUVVFU1RfQ0xFQVJfQ0xJRU5UX1RBUkdFVDogcmV0dXJuICJDbGVhckNsaWVudFRhcmdldCI7CiAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAiVW5rbm93biI7CkBAIC00NzcsNyArNDkxLDcgQEAKIH0KIAogc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBnZXRUcmFuc2Zvcm1OYW1lKGh3Y190cmFuc2Zvcm1fdCB0cmFuc2Zvcm0pIHsKLSAgICBzd2l0Y2ggKHRyYW5zZm9ybSkgeworICAgIHN3aXRjaCAoX19CSU9OSUNfQ0FTVChzdGF0aWNfY2FzdCwgaW50LCB0cmFuc2Zvcm0pKSB7CiAgICAgICAgIGNhc2UgMDogcmV0dXJuICJOb25lIjsKICAgICAgICAgY2FzZSBIV0NfVFJBTlNGT1JNX0ZMSVBfSDogcmV0dXJuICJGbGlwSCI7CiAgICAgICAgIGNhc2UgSFdDX1RSQU5TRk9STV9GTElQX1Y6IHJldHVybiAiRmxpcFYiOwpAQCAtNTQ5LDYgKzU2Myw3IEBACiAgICAgSW52YWxpZCA9IEhXQzJfQ0FQQUJJTElUWV9JTlZBTElELAogICAgIFNpZGViYW5kU3RyZWFtID0gSFdDMl9DQVBBQklMSVRZX1NJREVCQU5EX1NUUkVBTSwKICAgICBTa2lwQ2xpZW50Q29sb3JUcmFuc2Zvcm0gPSBIV0MyX0NBUEFCSUxJVFlfU0tJUF9DTElFTlRfQ09MT1JfVFJBTlNGT1JNLAorICAgIFByZXNlbnRGZW5jZUlzTm90UmVsaWFibGUgPSBIV0MyX0NBUEFCSUxJVFlfUFJFU0VOVF9GRU5DRV9JU19OT1RfUkVMSUFCTEUsCiB9OwogVE9fU1RSSU5HKGh3YzJfY2FwYWJpbGl0eV90LCBDYXBhYmlsaXR5LCBnZXRDYXBhYmlsaXR5TmFtZSkKIApAQCAtNzM4LDcgKzc1Myw3IEBACiBzdGF0aWMgaW5saW5lIGludCBod2MyX29wZW4oY29uc3Qgc3RydWN0IGh3X21vZHVsZV90KiBtb2R1bGUsCiAgICAgICAgIGh3YzJfZGV2aWNlX3QqKiBkZXZpY2UpIHsKICAgICByZXR1cm4gbW9kdWxlLT5tZXRob2RzLT5vcGVuKG1vZHVsZSwgSFdDX0hBUkRXQVJFX0NPTVBPU0VSLAotICAgICAgICAgICAgKHN0cnVjdCBod19kZXZpY2VfdCoqKSBkZXZpY2UpOworICAgICAgICAgICAgVE9fSFdfREVWSUNFX1RfT1BFTihkZXZpY2UpKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgaHdjMl9jbG9zZShod2MyX2RldmljZV90KiBkZXZpY2UpIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvaHdjb21wb3Nlcl9kZWZzLmggYi9pbmNsdWRlL2hhcmR3YXJlL2h3Y29tcG9zZXJfZGVmcy5oCmluZGV4IDE4YjMwYmMuLjFlODFlNmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvaHdjb21wb3Nlcl9kZWZzLmgKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS9od2NvbXBvc2VyX2RlZnMuaApAQCAtMTM2LDkgKzEzNiw5IEBACiAgKi8KIGVudW0gewogICAgIC8qCi0gICAgICogSFdDX1NLSVBfTEFZRVIgaXMgc2V0IGJ5IFN1cmZhY2VGbG5nZXIgdG8gaW5kaWNhdGUgdGhhdCB0aGUgSEFMCisgICAgICogSFdDX1NLSVBfTEFZRVIgaXMgc2V0IGJ5IFN1cmZhY2VGbGluZ2VyIHRvIGluZGljYXRlIHRoYXQgdGhlIEhBTAogICAgICAqIHNoYWxsIG5vdCBjb25zaWRlciB0aGlzIGxheWVyIGZvciBjb21wb3NpdGlvbiBhcyBpdCB3aWxsIGJlIGhhbmRsZWQKLSAgICAgKiBieSBTdXJmYWNlRmxpbmdlciAoanVzdCBhcyBpZiBjb21wb3NpdGlvblR5cGUgd2FzIHNldCB0byBIV0NfT1ZFUkxBWSkuCisgICAgICogYnkgU3VyZmFjZUZsaW5nZXIgKGp1c3QgYXMgaWYgY29tcG9zaXRpb25UeXBlIHdhcyBzZXQgdG8gSFdDX0ZSQU1FQlVGRkVSKS4KICAgICAgKi8KICAgICBIV0NfU0tJUF9MQVlFUiA9IDB4MDAwMDAwMDEsCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUva2V5bWFzdGVyMC5oIGIvaW5jbHVkZS9oYXJkd2FyZS9rZXltYXN0ZXIwLmgKaW5kZXggZjAyMGU1Yi4uNTJhYzY0YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9rZXltYXN0ZXIwLmgKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS9rZXltYXN0ZXIwLmgKQEAgLTEzNCw3ICsxMzQsNyBAQAogICAgICAgICBrZXltYXN0ZXIwX2RldmljZV90KiogZGV2aWNlKQogewogICAgIGludCByYyA9IG1vZHVsZS0+bWV0aG9kcy0+b3Blbihtb2R1bGUsIEtFWVNUT1JFX0tFWU1BU1RFUiwKLSAgICAgICAgICAgIChzdHJ1Y3QgaHdfZGV2aWNlX3QqKikgZGV2aWNlKTsKKyAgICAgICAgICAgIFRPX0hXX0RFVklDRV9UX09QRU4oZGV2aWNlKSk7CiAKICAgICByZXR1cm4gcmM7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2tleW1hc3RlcjEuaCBiL2luY2x1ZGUvaGFyZHdhcmUva2V5bWFzdGVyMS5oCmluZGV4IGFmZDIwMmMuLjk5NjkzODAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvaGFyZHdhcmUva2V5bWFzdGVyMS5oCisrKyBiL2luY2x1ZGUvaGFyZHdhcmUva2V5bWFzdGVyMS5oCkBAIC01MzYsNyArNTM2LDcgQEAKIC8qIENvbnZlbmllbmNlIEFQSSBmb3Igb3BlbmluZyBhbmQgY2xvc2luZyBrZXltYXN0ZXIgZGV2aWNlcyAqLwogCiBzdGF0aWMgaW5saW5lIGludCBrZXltYXN0ZXIxX29wZW4oY29uc3Qgc3RydWN0IGh3X21vZHVsZV90KiBtb2R1bGUsIGtleW1hc3RlcjFfZGV2aWNlX3QqKiBkZXZpY2UpIHsKLSAgICByZXR1cm4gbW9kdWxlLT5tZXRob2RzLT5vcGVuKG1vZHVsZSwgS0VZU1RPUkVfS0VZTUFTVEVSLCAoc3RydWN0IGh3X2RldmljZV90KiopZGV2aWNlKTsKKyAgICByZXR1cm4gbW9kdWxlLT5tZXRob2RzLT5vcGVuKG1vZHVsZSwgS0VZU1RPUkVfS0VZTUFTVEVSLCBUT19IV19ERVZJQ0VfVF9PUEVOKGRldmljZSkpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBrZXltYXN0ZXIxX2Nsb3NlKGtleW1hc3RlcjFfZGV2aWNlX3QqIGRldmljZSkgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS9rZXltYXN0ZXIyLmggYi9pbmNsdWRlL2hhcmR3YXJlL2tleW1hc3RlcjIuaAppbmRleCA1NjVhZDJlLi5mMTk5M2Y4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2hhcmR3YXJlL2tleW1hc3RlcjIuaAorKysgYi9pbmNsdWRlL2hhcmR3YXJlL2tleW1hc3RlcjIuaApAQCAtNDIwLDcgKzQyMCw3IEBACiAvKiBDb252ZW5pZW5jZSBBUEkgZm9yIG9wZW5pbmcgYW5kIGNsb3Npbmcga2V5bWFzdGVyIGRldmljZXMgKi8KIAogc3RhdGljIGlubGluZSBpbnQga2V5bWFzdGVyMl9vcGVuKGNvbnN0IHN0cnVjdCBod19tb2R1bGVfdCogbW9kdWxlLCBrZXltYXN0ZXIyX2RldmljZV90KiogZGV2aWNlKSB7Ci0gICAgcmV0dXJuIG1vZHVsZS0+bWV0aG9kcy0+b3Blbihtb2R1bGUsIEtFWVNUT1JFX0tFWU1BU1RFUiwgKHN0cnVjdCBod19kZXZpY2VfdCoqKWRldmljZSk7CisgICAgcmV0dXJuIG1vZHVsZS0+bWV0aG9kcy0+b3Blbihtb2R1bGUsIEtFWVNUT1JFX0tFWU1BU1RFUiwgVE9fSFdfREVWSUNFX1RfT1BFTihkZXZpY2UpKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQga2V5bWFzdGVyMl9jbG9zZShrZXltYXN0ZXIyX2RldmljZV90KiBkZXZpY2UpIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUva2V5bWFzdGVyX2RlZnMuaCBiL2luY2x1ZGUvaGFyZHdhcmUva2V5bWFzdGVyX2RlZnMuaAppbmRleCAwZjliYzI3Li43ZDFiMzQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2hhcmR3YXJlL2tleW1hc3Rlcl9kZWZzLmgKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS9rZXltYXN0ZXJfZGVmcy5oCkBAIC0xMzUsNiArMTM1LDI2IEBACiAgICAgS01fVEFHX09TX1BBVENITEVWRUwgPSBLTV9VSU5UIHwgNzA2LCAgICAgICAgICAvKiBQYXRjaCBsZXZlbCBvZiBzeXN0ZW0gKGtleW1hc3RlcjIpICovCiAgICAgS01fVEFHX1VOSVFVRV9JRCA9IEtNX0JZVEVTIHwgNzA3LCAgICAgICAgICAgICAvKiBVc2VkIHRvIHByb3ZpZGUgdW5pcXVlIElEIGluIGF0dGVzdGF0aW9uICovCiAgICAgS01fVEFHX0FUVEVTVEFUSU9OX0NIQUxMRU5HRSA9IEtNX0JZVEVTIHwgNzA4LCAvKiBVc2VkIHRvIHByb3ZpZGUgY2hhbGxlbmdlIGluIGF0dGVzdGF0aW9uICovCisgICAgS01fVEFHX0FUVEVTVEFUSU9OX0FQUExJQ0FUSU9OX0lEID0gS01fQllURVMgfCA3MDksIC8qIFVzZWQgdG8gaWRlbnRpZnkgdGhlIHNldCBvZiBwb3NzaWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhcHBsaWNhdGlvbnMgb2Ygd2hpY2ggb25lIGhhcyBpbml0aWF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYSBrZXkgYXR0ZXN0YXRpb24gKi8KKyAgICBLTV9UQUdfQVRURVNUQVRJT05fSURfQlJBTkQgPSBLTV9CWVRFUyB8IDcxMCwgIC8qIFVzZWQgdG8gcHJvdmlkZSB0aGUgZGV2aWNlJ3MgYnJhbmQgbmFtZSB0byBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWQgaW4gYXR0ZXN0YXRpb24gKi8KKyAgICBLTV9UQUdfQVRURVNUQVRJT05fSURfREVWSUNFID0gS01fQllURVMgfCA3MTEsIC8qIFVzZWQgdG8gcHJvdmlkZSB0aGUgZGV2aWNlJ3MgZGV2aWNlIG5hbWUgdG8gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkIGluIGF0dGVzdGF0aW9uICovCisgICAgS01fVEFHX0FUVEVTVEFUSU9OX0lEX1BST0RVQ1QgPSBLTV9CWVRFUyB8IDcxMiwgLyogVXNlZCB0byBwcm92aWRlIHRoZSBkZXZpY2UncyBwcm9kdWN0IG5hbWUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBpbmNsdWRlZCBpbiBhdHRlc3RhdGlvbiAqLworICAgIEtNX1RBR19BVFRFU1RBVElPTl9JRF9TRVJJQUwgPSBLTV9CWVRFUyB8IDcxMywgLyogVXNlZCB0byBwcm92aWRlIHRoZSBkZXZpY2UncyBzZXJpYWwgbnVtYmVyIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBpbmNsdWRlZCBpbiBhdHRlc3RhdGlvbiAqLworICAgIEtNX1RBR19BVFRFU1RBVElPTl9JRF9JTUVJID0gS01fQllURVMgfCA3MTQsICAgLyogVXNlZCB0byBwcm92aWRlIHRoZSBkZXZpY2UncyBJTUVJIHRvIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlZCBpbiBhdHRlc3RhdGlvbiAqLworICAgIEtNX1RBR19BVFRFU1RBVElPTl9JRF9NRUlEID0gS01fQllURVMgfCA3MTUsICAgLyogVXNlZCB0byBwcm92aWRlIHRoZSBkZXZpY2UncyBNRUlEIHRvIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlZCBpbiBhdHRlc3RhdGlvbiAqLworICAgIEtNX1RBR19BVFRFU1RBVElPTl9JRF9NQU5VRkFDVFVSRVIgPSBLTV9CWVRFUyB8IDcxNiwgLyogVXNlZCB0byBwcm92aWRlIHRoZSBkZXZpY2UncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFudWZhY3R1cmVyIG5hbWUgdG8gYmUgaW5jbHVkZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVzdGF0aW9uICovCisgICAgS01fVEFHX0FUVEVTVEFUSU9OX0lEX01PREVMID0gS01fQllURVMgfCA3MTcsICAvKiBVc2VkIHRvIHByb3ZpZGUgdGhlIGRldmljZSdzIG1vZGVsIG5hbWUgdG8gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkIGluIGF0dGVzdGF0aW9uICovCiAKICAgICAvKiBUYWdzIHVzZWQgb25seSB0byBwcm92aWRlIGRhdGEgdG8gb3IgcmVjZWl2ZSBkYXRhIGZyb20gb3BlcmF0aW9ucyAqLwogICAgIEtNX1RBR19BU1NPQ0lBVEVEX0RBVEEgPSBLTV9CWVRFUyB8IDEwMDAsIC8qIFVzZWQgdG8gcHJvdmlkZSBhc3NvY2lhdGVkIGRhdGEgZm9yIEFFQUQgbW9kZXMuICovCkBAIC00MjcsNiArNDQ3LDggQEAKICAgICBLTV9FUlJPUl9LRVlfUkVRVUlSRVNfVVBHUkFERSA9IC02MiwKICAgICBLTV9FUlJPUl9BVFRFU1RBVElPTl9DSEFMTEVOR0VfTUlTU0lORyA9IC02MywKICAgICBLTV9FUlJPUl9LRVlNQVNURVJfTk9UX0NPTkZJR1VSRUQgPSAtNjQsCisgICAgS01fRVJST1JfQVRURVNUQVRJT05fQVBQTElDQVRJT05fSURfTUlTU0lORyA9IC02NSwKKyAgICBLTV9FUlJPUl9DQU5OT1RfQVRURVNUX0lEUyA9IC02NiwKIAogICAgIEtNX0VSUk9SX1VOSU1QTEVNRU5URUQgPSAtMTAwLAogICAgIEtNX0VSUk9SX1ZFUlNJT05fTUlTTUFUQ0ggPSAtMTAxLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS9sb2NhbF90aW1lX2hhbC5oIGIvaW5jbHVkZS9oYXJkd2FyZS9sb2NhbF90aW1lX2hhbC5oCmluZGV4IDk0NmU3OTkuLjFiYmJmMTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvbG9jYWxfdGltZV9oYWwuaAorKysgYi9pbmNsdWRlL2hhcmR3YXJlL2xvY2FsX3RpbWVfaGFsLmgKQEAgLTEwOSw3ICsxMDksNyBAQAogICAgICAgICBzdHJ1Y3QgbG9jYWxfdGltZV9od19kZXZpY2UqKiBkZXZpY2UpCiB7CiAgICAgcmV0dXJuIG1vZHVsZS0+bWV0aG9kcy0+b3Blbihtb2R1bGUsIExPQ0FMX1RJTUVfSEFSRFdBUkVfSU5URVJGQUNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBod19kZXZpY2VfdCoqKWRldmljZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT19IV19ERVZJQ0VfVF9PUEVOKGRldmljZSkpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBsb2NhbF90aW1lX2h3X2RldmljZV9jbG9zZShzdHJ1Y3QgbG9jYWxfdGltZV9od19kZXZpY2UqIGRldmljZSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvbmZjLWJhc2UuaCBiL2luY2x1ZGUvaGFyZHdhcmUvbmZjLWJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjYzYWQyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS9uZmMtYmFzZS5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGJ5IGhpZGwtZ2VuLiBEbyBub3QgZWRpdCBtYW51YWxseS4KKy8vIFNvdXJjZTogYW5kcm9pZC5oYXJkd2FyZS5uZmNAMS4wCisvLyBSb290OiBhbmRyb2lkLmhhcmR3YXJlOmhhcmR3YXJlL2ludGVyZmFjZXMKKworI2lmbmRlZiBISURMX0dFTkVSQVRFRF9BTkRST0lEX0hBUkRXQVJFX05GQ19WMV8wX0VYUE9SVEVEX0NPTlNUQU5UU19IXworI2RlZmluZSBISURMX0dFTkVSQVRFRF9BTkRST0lEX0hBUkRXQVJFX05GQ19WMV8wX0VYUE9SVEVEX0NPTlNUQU5UU19IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2VudW0geworICAgIEhBTF9ORkNfT1BFTl9DUExUX0VWVCA9IDB1LCAvLyAwCisgICAgSEFMX05GQ19DTE9TRV9DUExUX0VWVCA9IDF1LCAvLyAxCisgICAgSEFMX05GQ19QT1NUX0lOSVRfQ1BMVF9FVlQgPSAydSwgLy8gMgorICAgIEhBTF9ORkNfUFJFX0RJU0NPVkVSX0NQTFRfRVZUID0gM3UsIC8vIDMKKyAgICBIQUxfTkZDX1JFUVVFU1RfQ09OVFJPTF9FVlQgPSA0dSwgLy8gNAorICAgIEhBTF9ORkNfUkVMRUFTRV9DT05UUk9MX0VWVCA9IDV1LCAvLyA1CisgICAgSEFMX05GQ19FUlJPUl9FVlQgPSA2dSwgLy8gNgorfTsKKworZW51bSB7CisgICAgSEFMX05GQ19TVEFUVVNfT0sgPSAwdSwgLy8gMAorICAgIEhBTF9ORkNfU1RBVFVTX0ZBSUxFRCA9IDF1LCAvLyAxCisgICAgSEFMX05GQ19TVEFUVVNfRVJSX1RSQU5TUE9SVCA9IDJ1LCAvLyAyCisgICAgSEFMX05GQ19TVEFUVVNfRVJSX0NNRF9USU1FT1VUID0gM3UsIC8vIDMKKyAgICBIQUxfTkZDX1NUQVRVU19SRUZVU0VEID0gNHUsIC8vIDQKK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAgLy8gSElETF9HRU5FUkFURURfQU5EUk9JRF9IQVJEV0FSRV9ORkNfVjFfMF9FWFBPUlRFRF9DT05TVEFOVFNfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvbmZjLmggYi9pbmNsdWRlL2hhcmR3YXJlL25mYy5oCmluZGV4IDU4ZDMzZDkuLmZkZDc5YTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvbmZjLmgKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS9uZmMuaApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCiAjaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KKyNpbmNsdWRlICJuZmMtYmFzZS5oIgogCiBfX0JFR0lOX0RFQ0xTCiAKQEAgLTY5LDM0ICs3MCw5IEBACiAgICAgc3RydWN0IGh3X21vZHVsZV90IGNvbW1vbjsKIH0gbmZjX25jaV9tb2R1bGVfdDsKIAotLyoKLSAqIEhBTCBldmVudHMgdGhhdCBjYW4gYmUgcGFzc2VkIGJhY2sgdG8gdGhlIHN0YWNrCi0gKi8KIHR5cGVkZWYgdWludDhfdCBuZmNfZXZlbnRfdDsKLQotZW51bSB7Ci0gICAgSEFMX05GQ19PUEVOX0NQTFRfRVZUICAgICAgICAgICA9IDB4MDAsCi0gICAgSEFMX05GQ19DTE9TRV9DUExUX0VWVCAgICAgICAgICA9IDB4MDEsCi0gICAgSEFMX05GQ19QT1NUX0lOSVRfQ1BMVF9FVlQgICAgICA9IDB4MDIsCi0gICAgSEFMX05GQ19QUkVfRElTQ09WRVJfQ1BMVF9FVlQgICA9IDB4MDMsCi0gICAgSEFMX05GQ19SRVFVRVNUX0NPTlRST0xfRVZUICAgICA9IDB4MDQsCi0gICAgSEFMX05GQ19SRUxFQVNFX0NPTlRST0xfRVZUICAgICA9IDB4MDUsCi0gICAgSEFMX05GQ19FUlJPUl9FVlQgICAgICAgICAgICAgICA9IDB4MDYKLX07Ci0KLS8qCi0gKiBBbGxvd2VkIHN0YXR1cyByZXR1cm4gdmFsdWVzIGZvciBlYWNoIG9mIHRoZSBIQUwgbWV0aG9kcwotICovCiB0eXBlZGVmIHVpbnQ4X3QgbmZjX3N0YXR1c190OwogCi1lbnVtIHsKLSAgICBIQUxfTkZDX1NUQVRVU19PSyAgICAgICAgICAgICAgID0gMHgwMCwKLSAgICBIQUxfTkZDX1NUQVRVU19GQUlMRUQgICAgICAgICAgID0gMHgwMSwKLSAgICBIQUxfTkZDX1NUQVRVU19FUlJfVFJBTlNQT1JUICAgID0gMHgwMiwKLSAgICBIQUxfTkZDX1NUQVRVU19FUlJfQ01EX1RJTUVPVVQgID0gMHgwMywKLSAgICBIQUxfTkZDX1NUQVRVU19SRUZVU0VEICAgICAgICAgID0gMHgwNAotfTsKLQogLyoKICAqIFRoZSBjYWxsYmFjayBwYXNzZWQgaW4gZnJvbSB0aGUgTkZDIHN0YWNrIHRoYXQgdGhlIEhBTAogICogY2FuIHVzZSB0byBwYXNzIGV2ZW50cyBiYWNrIHRvIHRoZSBzdGFjay4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvbnZyYW0uaCBiL2luY2x1ZGUvaGFyZHdhcmUvbnZyYW0uaAppbmRleCBhMTg2OGI1Li4wNjU0YWZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2hhcmR3YXJlL252cmFtLmgKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS9udnJhbS5oCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CiAKICNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL252cmFtX2RlZnMuaD4KIAogX19CRUdJTl9ERUNMUwogCkBAIC0zMCwzMCArMzEsNyBAQAogCiAvKiBUaGUgdmVyc2lvbiBvZiB0aGlzIG1vZHVsZS4gKi8KICNkZWZpbmUgTlZSQU1fTU9EVUxFX0FQSV9WRVJTSU9OXzBfMSBIQVJEV0FSRV9NT0RVTEVfQVBJX1ZFUlNJT04oMCwgMSkKLSNkZWZpbmUgTlZSQU1fREVWSUNFX0FQSV9WRVJTSU9OXzBfMSBIQVJEV0FSRV9ERVZJQ0VfQVBJX1ZFUlNJT04oMCwgMSkKLQotLyogVmFsdWVzIHJldHVybmVkIGJ5IG52cmFtX2RldmljZSBtZXRob2RzLiAqLwotdHlwZWRlZiB1aW50MzJfdCBudnJhbV9yZXN1bHRfdDsKLQotY29uc3QgbnZyYW1fcmVzdWx0X3QgTlZfUkVTVUxUX1NVQ0NFU1MgPSAwOwotY29uc3QgbnZyYW1fcmVzdWx0X3QgTlZfUkVTVUxUX0lOVEVSTkFMX0VSUk9SID0gMTsKLWNvbnN0IG52cmFtX3Jlc3VsdF90IE5WX1JFU1VMVF9BQ0NFU1NfREVOSUVEID0gMjsKLWNvbnN0IG52cmFtX3Jlc3VsdF90IE5WX1JFU1VMVF9JTlZBTElEX1BBUkFNRVRFUiA9IDM7Ci1jb25zdCBudnJhbV9yZXN1bHRfdCBOVl9SRVNVTFRfU1BBQ0VfRE9FU19OT1RfRVhJU1QgPSA0OwotY29uc3QgbnZyYW1fcmVzdWx0X3QgTlZfUkVTVUxUX1NQQUNFX0FMUkVBRFlfRVhJU1RTID0gNTsKLWNvbnN0IG52cmFtX3Jlc3VsdF90IE5WX1JFU1VMVF9PUEVSQVRJT05fRElTQUJMRUQgPSA2OwotCi0vKiBWYWx1ZXMgZGVzY3JpYmluZyBhdmFpbGFibGUgYWNjZXNzIGNvbnRyb2xzLiAqLwotdHlwZWRlZiB1aW50MzJfdCBudnJhbV9jb250cm9sX3Q7Ci0KLWNvbnN0IG52cmFtX2NvbnRyb2xfdCBOVl9DT05UUk9MX1BFUlNJU1RFTlRfV1JJVEVfTE9DSyA9IDE7Ci1jb25zdCBudnJhbV9jb250cm9sX3QgTlZfQ09OVFJPTF9CT09UX1dSSVRFX0xPQ0sgPSAyOwotY29uc3QgbnZyYW1fY29udHJvbF90IE5WX0NPTlRST0xfQk9PVF9SRUFEX0xPQ0sgPSAzOwotY29uc3QgbnZyYW1fY29udHJvbF90IE5WX0NPTlRST0xfV1JJVEVfQVVUSE9SSVpBVElPTiA9IDQ7Ci1jb25zdCBudnJhbV9jb250cm9sX3QgTlZfQ09OVFJPTF9SRUFEX0FVVEhPUklaQVRJT04gPSA1OwotY29uc3QgbnZyYW1fY29udHJvbF90IE5WX0NPTlRST0xfV1JJVEVfRVhURU5EID0gNjsKLQotY29uc3QgdWludDMyX3QgTlZfVU5MSU1JVEVEX1NQQUNFUyA9IDB4RkZGRkZGRkY7CisjZGVmaW5lIE5WUkFNX0RFVklDRV9BUElfVkVSU0lPTl8xXzEgSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKDEsIDEpCiAKIHN0cnVjdCBudnJhbV9tb2R1bGUgewogICAgIC8qKgpAQCAtOTksNiArNzcsMTcgQEAKICAgICAgICAgY29uc3Qgc3RydWN0IG52cmFtX2RldmljZSogZGV2aWNlLCB1aW50NjRfdCogYXZhaWxhYmxlX3NpemUpOwogCiAgICAgLyoqCisgICAgICogT3V0cHV0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgYWxsb2NhdGVkIGZvciBhIHNpbmdsZQorICAgICAqIHNwYWNlLiBUaGlzIHdpbGwgYWx3YXlzIGJlIGF0IGxlYXN0IDMyLiBJZiBhbiBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdAorICAgICAqIGxpbWl0IHRoZSBtYXhpbXVtIHNpemUgaXQgbWF5IHByb3ZpZGUgdGhlIHRvdGFsIHNpemUuCisgICAgICoKKyAgICAgKiAgIGRldmljZSAtIFRoZSBudnJhbV9kZXZpY2UgaW5zdGFuY2UuCisgICAgICogICBtYXhfc3BhY2Vfc2l6ZSAtIFJlY2VpdmVzIHRoZSBvdXRwdXQuIENhbm5vdCBiZSBOVUxMLgorICAgICAqLworICAgIG52cmFtX3Jlc3VsdF90ICgqZ2V0X21heF9zcGFjZV9zaXplX2luX2J5dGVzKSgKKyAgICAgICAgY29uc3Qgc3RydWN0IG52cmFtX2RldmljZSogZGV2aWNlLCB1aW50NjRfdCogbWF4X3NwYWNlX3NpemUpOworCisgICAgLyoqCiAgICAgICogT3V0cHV0cyB0aGUgbWF4aW11bSB0b3RhbCBudW1iZXIgb2Ygc3BhY2VzIHRoYXQgbWF5IGJlIGFsbG9jYXRlZC4KICAgICAgKiBUaGlzIHdpbGwgYWx3YXlzIGJlIGF0IGxlYXN0IDguIE91dHB1dHMgTlZfVU5MSU1JVEVEX1NQQUNFUyBpZiBhbnkKICAgICAgKiBudW1iZXIgb2Ygc3BhY2VzIGFyZSBzdXBwb3J0ZWQgKGxpbWl0ZWQgb25seSB0byBhdmFpbGFibGUgTlZSQU0KQEAgLTMzNyw3ICszMjYsNyBAQAogc3RhdGljIGlubGluZSBpbnQgbnZyYW1fb3Blbihjb25zdCBzdHJ1Y3QgaHdfbW9kdWxlX3QqIG1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnZyYW1fZGV2aWNlX3QqKiBkZXZpY2UpIHsKICAgICByZXR1cm4gbW9kdWxlLT5tZXRob2RzLT5vcGVuKG1vZHVsZSwgTlZSQU1fSEFSRFdBUkVfREVWSUNFX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBod19kZXZpY2VfdCoqKWRldmljZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT19IV19ERVZJQ0VfVF9PUEVOKGRldmljZSkpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBudnJhbV9jbG9zZShudnJhbV9kZXZpY2VfdCogZGV2aWNlKSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL252cmFtX2RlZnMuaCBiL2luY2x1ZGUvaGFyZHdhcmUvbnZyYW1fZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNTZhM2MKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2hhcmR3YXJlL252cmFtX2RlZnMuaApAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBkYXRhIHR5cGUgZGVmaW5pdGlvbnMgYW5kIGNvbnN0YW50cyB0aGF0IGFyZSB1c2VmdWwgdG8KKyAqIGNvZGUgaW50ZXJhY3Rpbmcgd2l0aCBhbmQgaW1wbGVtZW50aW5nIHRoZSBOVlJBTSBIQUwsIGV2ZW4gdGhvdWdoIGl0IGRvZXNuJ3QKKyAqIHVzZSB0aGUgYWN0dWFsIE5WUkFNIEhBTCBtb2R1bGUgaW50ZXJmYWNlLiBLZWVwaW5nIHRoaXMgaW4gYSBzZXBhcmF0ZSBmaWxlCisgKiBzaW1wbGlmaWVzIGluY2x1c2lvbiBpbiBsb3ctbGV2ZWwgY29kZSB3aGljaCBjYW4ndCBlYXNpbHkgaW5jbHVkZSB0aGUgaGVhdmllcgorICogaGFyZHdhcmUuaCBkdWUgdG8gbGFja2luZyBzdGFuZGFyZCBoZWFkZXJzLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9OVlJBTV9ERUZTX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9OVlJBTV9ERUZTX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmICAvLyBfX2NwbHVzcGx1cworCisvKiBWYWx1ZXMgcmV0dXJuZWQgYnkgbnZyYW1fZGV2aWNlIG1ldGhvZHMuICovCit0eXBlZGVmIHVpbnQzMl90IG52cmFtX3Jlc3VsdF90OworCitjb25zdCBudnJhbV9yZXN1bHRfdCBOVl9SRVNVTFRfU1VDQ0VTUyA9IDA7Citjb25zdCBudnJhbV9yZXN1bHRfdCBOVl9SRVNVTFRfSU5URVJOQUxfRVJST1IgPSAxOworY29uc3QgbnZyYW1fcmVzdWx0X3QgTlZfUkVTVUxUX0FDQ0VTU19ERU5JRUQgPSAyOworY29uc3QgbnZyYW1fcmVzdWx0X3QgTlZfUkVTVUxUX0lOVkFMSURfUEFSQU1FVEVSID0gMzsKK2NvbnN0IG52cmFtX3Jlc3VsdF90IE5WX1JFU1VMVF9TUEFDRV9ET0VTX05PVF9FWElTVCA9IDQ7Citjb25zdCBudnJhbV9yZXN1bHRfdCBOVl9SRVNVTFRfU1BBQ0VfQUxSRUFEWV9FWElTVFMgPSA1OworY29uc3QgbnZyYW1fcmVzdWx0X3QgTlZfUkVTVUxUX09QRVJBVElPTl9ESVNBQkxFRCA9IDY7CisKKy8qIFZhbHVlcyBkZXNjcmliaW5nIGF2YWlsYWJsZSBhY2Nlc3MgY29udHJvbHMuICovCit0eXBlZGVmIHVpbnQzMl90IG52cmFtX2NvbnRyb2xfdDsKKworY29uc3QgbnZyYW1fY29udHJvbF90IE5WX0NPTlRST0xfUEVSU0lTVEVOVF9XUklURV9MT0NLID0gMTsKK2NvbnN0IG52cmFtX2NvbnRyb2xfdCBOVl9DT05UUk9MX0JPT1RfV1JJVEVfTE9DSyA9IDI7Citjb25zdCBudnJhbV9jb250cm9sX3QgTlZfQ09OVFJPTF9CT09UX1JFQURfTE9DSyA9IDM7Citjb25zdCBudnJhbV9jb250cm9sX3QgTlZfQ09OVFJPTF9XUklURV9BVVRIT1JJWkFUSU9OID0gNDsKK2NvbnN0IG52cmFtX2NvbnRyb2xfdCBOVl9DT05UUk9MX1JFQURfQVVUSE9SSVpBVElPTiA9IDU7Citjb25zdCBudnJhbV9jb250cm9sX3QgTlZfQ09OVFJPTF9XUklURV9FWFRFTkQgPSA2OworCitjb25zdCB1aW50MzJfdCBOVl9VTkxJTUlURURfU1BBQ0VTID0gMHhGRkZGRkZGRjsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAvLyBleHRlcm4gIkMiCisjZW5kaWYgIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9OVlJBTV9ERUZTX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvcWVtdV9waXBlLmggYi9pbmNsdWRlL2hhcmR3YXJlL3FlbXVfcGlwZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2FlYzk3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvcWVtdV9waXBlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpZm5kZWYgQU5EUk9JRF9JTkNMVURFX0hBUkRXQVJFX1FFTVVfUElQRV9ICi0jZGVmaW5lIEFORFJPSURfSU5DTFVERV9IQVJEV0FSRV9RRU1VX1BJUEVfSAotCi0jaW5jbHVkZSA8c3lzL2NkZWZzLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4gIC8qIGZvciBwdGhyZWFkX29uY2UoKSAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotI2lmbmRlZiBECi0jICBkZWZpbmUgIEQoLi4uKSAgIGRve313aGlsZSgwKQotI2VuZGlmCi0KLS8qIFRyeSB0byBvcGVuIGEgbmV3IFFlbXUgZmFzdC1waXBlLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3IKLSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBhIG5hbWVkIHNlcnZpY2UgbWFuYWdlZCBieSB0aGUKLSAqIGVtdWxhdG9yLgotICoKLSAqIFRoaXMgZmlsZSBkZXNjcmlwdG9yIGNhbiBiZSB1c2VkIGFzIGEgc3RhbmRhcmQgcGlwZS9zb2NrZXQgZGVzY3JpcHRvci4KLSAqCi0gKiAncGlwZU5hbWUnIGlzIHRoZSBuYW1lIG9mIHRoZSBlbXVsYXRvciBzZXJ2aWNlIHlvdSB3YW50IHRvIGNvbm5lY3QgdG8uCi0gKiBFLmcuICdvcGVuZ2xlcycgb3IgJ2NhbWVyYScuCi0gKgotICogT24gc3VjY2VzcywgcmV0dXJuIGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yCi0gKiBSZXR1cm5zIC0xIG9uIGVycm9yLCBhbmQgZXJybm8gZ2l2ZXMgdGhlIGVycm9yIGNvZGUsIGUuZy46Ci0gKgotICogICAgRUlOVkFMICAtPiB1bmtub3duL3Vuc3VwcG9ydGVkIHBpcGVOYW1lCi0gKiAgICBFTk9TWVMgIC0+IGZhc3QgcGlwZXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIHN5c3RlbS4KLSAqCi0gKiBFTk9TWVMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgZXhjZXB0IGlmIHlvdSdyZSB0cnlpbmcgdG8gcnVuIHdpdGhpbiBhCi0gKiBtaXNjb25maWd1cmVkIGVtdWxhdG9yLgotICoKLSAqIFlvdSBzaG91bGQgYmUgYWJsZSB0byBvcGVuIHNldmVyYWwgcGlwZXMgdG8gdGhlIHNhbWUgcGlwZSBzZXJ2aWNlLAotICogZXhjZXB0IGZvciBhIGZldyBzcGVjaWFsIGNhc2VzIChlLmcuIEdTTSBtb2RlbSksIHdoZXJlIEVCVVNZIHdpbGwgYmUKLSAqIHJldHVybmVkIGlmIG1vcmUgdGhhbiBvbmUgY2xpZW50IHRyaWVzIHRvIGNvbm5lY3QgdG8gaXQuCi0gKi8KLXN0YXRpYyBfX2lubGluZV9fIGludAotcWVtdV9waXBlX29wZW4oY29uc3QgY2hhciogIHBpcGVOYW1lKQotewotICAgIGNoYXIgIGJ1ZmZbMjU2XTsKLSAgICBpbnQgICBidWZmTGVuOwotICAgIGludCAgIGZkLCByZXQ7Ci0KLSAgICBpZiAocGlwZU5hbWUgPT0gTlVMTCB8fCBwaXBlTmFtZVswXSA9PSAnXDAnKSB7Ci0gICAgICAgIGVycm5vID0gRUlOVkFMOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgc25wcmludGYoYnVmZiwgc2l6ZW9mIGJ1ZmYsICJwaXBlOiVzIiwgcGlwZU5hbWUpOwotCi0gICAgZmQgPSBvcGVuKCIvZGV2L3FlbXVfcGlwZSIsIE9fUkRXUik7Ci0gICAgaWYgKGZkIDwgMCAmJiBlcnJubyA9PSBFTk9FTlQpCi0gICAgICAgIGZkID0gb3BlbigiL2Rldi9nb2xkZmlzaF9waXBlIiwgT19SRFdSKTsKLSAgICBpZiAoZmQgPCAwKSB7Ci0gICAgICAgIEQoIiVzOiBDb3VsZCBub3Qgb3BlbiAvZGV2L3FlbXVfcGlwZTogJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIC8vZXJybm8gPSBFTk9TWVM7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBidWZmTGVuID0gc3RybGVuKGJ1ZmYpOwotCi0gICAgcmV0ID0gVEVNUF9GQUlMVVJFX1JFVFJZKHdyaXRlKGZkLCBidWZmLCBidWZmTGVuKzEpKTsKLSAgICBpZiAocmV0ICE9IGJ1ZmZMZW4rMSkgewotICAgICAgICBEKCIlczogQ291bGQgbm90IGNvbm5lY3QgdG8gJXMgcGlwZSBzZXJ2aWNlOiAlcyIsIF9fRlVOQ1RJT05fXywgcGlwZU5hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIGlmIChyZXQgPT0gMCkgewotICAgICAgICAgICAgZXJybm8gPSBFQ09OTlJFU0VUOwotICAgICAgICB9IGVsc2UgaWYgKHJldCA+IDApIHsKLSAgICAgICAgICAgIGVycm5vID0gRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmQ7Ci19Ci0KLSNlbmRpZiAvKiBBTkRST0lEX0lOQ0xVREVfSEFSRFdBUkVfUUVNVURfUElQRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL3FlbXVkLmggYi9pbmNsdWRlL2hhcmR3YXJlL3FlbXVkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMzlmOWMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9xZW11ZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSU5DTFVERV9IQVJEV0FSRV9RRU1VRF9ICi0jZGVmaW5lIEFORFJPSURfSU5DTFVERV9IQVJEV0FSRV9RRU1VRF9ICi0KLSNpbmNsdWRlIDxjdXRpbHMvc29ja2V0cy5oPgotI2luY2x1ZGUgInFlbXVfcGlwZS5oIgotCi0vKiB0aGUgZm9sbG93aW5nIGlzIGhlbHBlciBjb2RlIHRoYXQgaXMgdXNlZCBieSB0aGUgUUVNVS1zcGVjaWZpYwotICogaGFyZHdhcmUgSEFMIG1vZHVsZXMgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgZW11bGF0b3IgcHJvZ3JhbQotICogdGhyb3VnaCB0aGUgJ3FlbXVkJyBtdWx0aXBsZXhpbmcgZGFlbW9uLCBvciB0aHJvdWdoIHRoZSBxZW11ZAotICogcGlwZS4KLSAqCi0gKiBzZWUgdGhlIGRvY3VtZW50YXRpb24gY29tbWVudHMgZm9yIGRldGFpbHMgaW4KLSAqIGRldmVsb3BtZW50L2VtdWxhdG9yL3FlbXVkL3FlbXVkLmMKLSAqCi0gKiBhbGwgZGVmaW5pdGlvbnMgaGVyZSBhcmUgYnVpbHQgaW50byB0aGUgSEFMIG1vZHVsZSB0byBhdm9pZAotICogaGF2aW5nIHRvIHdyaXRlIGEgdGlueSBzaGFyZWQgbGlicmFyeSBmb3IgdGhpcy4KLSAqLwotCi0vKiB3ZSBleHBlY3QgdGhlIEQgbWFjcm8gdG8gYmUgZGVmaW5lZCB0byBhIGZ1bmN0aW9uIG1hY3JvCi0gKiB0aGF0IHNlbmRzIGl0cyBmb3JtYXR0ZWQgc3RyaW5nIGFyZ3VtZW50KHMpIHRvIHRoZSBsb2cuCi0gKiBJZiBub3QsIGlnbm9yZSB0aGUgdHJhY2VzLgotICovCi0jaWZuZGVmIEQKLSMgIGRlZmluZSAgRCguLi4pICAoKHZvaWQpMCkKLSNlbmRpZgotCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQKLXFlbXVkX2ZkX3dyaXRlKGludCAgZmQsIGNvbnN0IHZvaWQqICBidWZmLCBpbnQgIGxlbikKLXsKLSAgICBpbnQgIGxlbjI7Ci0gICAgZG8gewotICAgICAgICBsZW4yID0gd3JpdGUoZmQsIGJ1ZmYsIGxlbik7Ci0gICAgfSB3aGlsZSAobGVuMiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOwotICAgIHJldHVybiBsZW4yOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQKLXFlbXVkX2ZkX3JlYWQoaW50ICBmZCwgdm9pZCogIGJ1ZmYsIGludCAgbGVuKQotewotICAgIGludCAgbGVuMjsKLSAgICBkbyB7Ci0gICAgICAgIGxlbjIgPSByZWFkKGZkLCBidWZmLCBsZW4pOwotICAgIH0gd2hpbGUgKGxlbjIgPCAwICYmIGVycm5vID09IEVJTlRSKTsKLSAgICByZXR1cm4gbGVuMjsKLX0KLQotc3RhdGljIF9faW5saW5lX18gaW50Ci1xZW11ZF9jaGFubmVsX29wZW4oY29uc3QgY2hhciogIG5hbWUpCi17Ci0gICAgaW50ICBmZDsKLSAgICBpbnQgIG5hbWVsZW4gPSBzdHJsZW4obmFtZSk7Ci0gICAgY2hhciBhbnN3ZXJbMl07Ci0gICAgY2hhciBwaXBlX25hbWVbMjU2XTsKLQotICAgIC8qIEZpcnN0LCB0cnkgdG8gY29ubmVjdCB0byB0aGUgcGlwZS4gKi8KLSAgICBzbnByaW50ZihwaXBlX25hbWUsIHNpemVvZihwaXBlX25hbWUpLCAicWVtdWQ6JXMiLCBuYW1lKTsKLSAgICBmZCA9IHFlbXVfcGlwZV9vcGVuKHBpcGVfbmFtZSk7Ci0gICAgaWYgKGZkIDwgMCkgewotICAgICAgICBEKCJRRU1VRCBwaXBlIGlzIG5vdCBhdmFpbGFibGUgZm9yICVzOiAlcyIsIG5hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIC8qIElmIHBpcGUgaXMgbm90IGF2YWlsYWJsZSwgY29ubmVjdCB0byBxZW11ZCBjb250cm9sIHNvY2tldCAqLwotICAgICAgICBmZCA9IHNvY2tldF9sb2NhbF9jbGllbnQoICJxZW11ZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TT0NLRVRfTkFNRVNQQUNFX1JFU0VSVkVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQ0tfU1RSRUFNICk7Ci0gICAgICAgIGlmIChmZCA8IDApIHsKLSAgICAgICAgICAgIEQoIm5vIHFlbXVkIGNvbnRyb2wgc29ja2V0OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBzZW5kIHNlcnZpY2UgbmFtZSB0byBjb25uZWN0ICovCi0gICAgICAgIGlmIChxZW11ZF9mZF93cml0ZShmZCwgbmFtZSwgbmFtZWxlbikgIT0gbmFtZWxlbikgewotICAgICAgICAgICAgRCgiY2FuJ3Qgc2VuZCBzZXJ2aWNlIG5hbWUgdG8gcWVtdWQ6ICVzIiwKLSAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICBjbG9zZShmZCk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiByZWFkIGFuc3dlciBmcm9tIGRhZW1vbiAqLwotICAgICAgICBpZiAocWVtdWRfZmRfcmVhZChmZCwgYW5zd2VyLCAyKSAhPSAyIHx8Ci0gICAgICAgICAgICBhbnN3ZXJbMF0gIT0gJ08nIHx8IGFuc3dlclsxXSAhPSAnSycpIHsKLSAgICAgICAgICAgIEQoImNhbnQnIGNvbm5lY3QgdG8gJXMgc2VydmljZSB0aHJvdWdoIHFlbXVkIiwgbmFtZSk7Ci0gICAgICAgICAgICBjbG9zZShmZCk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZkOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQKLXFlbXVkX2NoYW5uZWxfc2VuZChpbnQgIGZkLCBjb25zdCB2b2lkKiAgbXNnLCBpbnQgIG1zZ2xlbikKLXsKLSAgICBjaGFyICBoZWFkZXJbNV07Ci0KLSAgICBpZiAobXNnbGVuIDwgMCkKLSAgICAgICAgbXNnbGVuID0gc3RybGVuKChjb25zdCBjaGFyKiltc2cpOwotCi0gICAgaWYgKG1zZ2xlbiA9PSAwKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHNucHJpbnRmKGhlYWRlciwgc2l6ZW9mIGhlYWRlciwgIiUwNHgiLCBtc2dsZW4pOwotICAgIGlmIChxZW11ZF9mZF93cml0ZShmZCwgaGVhZGVyLCA0KSAhPSA0KSB7Ci0gICAgICAgIEQoImNhbid0IHdyaXRlIHFlbXVkIGZyYW1lIGhlYWRlcjogJXMiLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaWYgKHFlbXVkX2ZkX3dyaXRlKGZkLCBtc2csIG1zZ2xlbikgIT0gbXNnbGVuKSB7Ci0gICAgICAgIEQoImNhbjR0IHdyaXRlIHFlbXVkIGZyYW1lIHBheWxvYWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gaW50Ci1xZW11ZF9jaGFubmVsX3JlY3YoaW50ICBmZCwgdm9pZCogIG1zZywgaW50ICBtc2dzaXplKQotewotICAgIGNoYXIgIGhlYWRlcls1XTsKLSAgICBpbnQgICBzaXplLCBhdmFpbDsKLQotICAgIGlmIChxZW11ZF9mZF9yZWFkKGZkLCBoZWFkZXIsIDQpICE9IDQpIHsKLSAgICAgICAgRCgiY2FuJ3QgcmVhZCBxZW11ZCBmcmFtZSBoZWFkZXI6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBoZWFkZXJbNF0gPSAwOwotICAgIGlmIChzc2NhbmYoaGVhZGVyLCAiJTA0eCIsICZzaXplKSAhPSAxKSB7Ci0gICAgICAgIEQoIm1hbGZvcm1lZCBxZW11ZCBmcmFtZSBoZWFkZXI6ICclLipzJyIsIDQsIGhlYWRlcik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKHNpemUgPiBtc2dzaXplKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBpZiAocWVtdWRfZmRfcmVhZChmZCwgbXNnLCBzaXplKSAhPSBzaXplKSB7Ci0gICAgICAgIEQoImNhbid0IHJlYWQgcWVtdWQgZnJhbWUgcGF5bG9hZDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHJldHVybiBzaXplOwotfQotCi0jZW5kaWYgLyogQU5EUk9JRF9JTkNMVURFX0hBUkRXQVJFX1FFTVVEX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvcmFkaW8uaCBiL2luY2x1ZGUvaGFyZHdhcmUvcmFkaW8uaAppbmRleCAxNDVkZWI1Li40MTNmNDEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2hhcmR3YXJlL3JhZGlvLmgKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS9yYWRpby5oCkBAIC0yODUsNyArMjg1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByYWRpb19od19kZXZpY2UqKiBkZXZpY2UpCiB7CiAgICAgcmV0dXJuIG1vZHVsZS0+bWV0aG9kcy0+b3Blbihtb2R1bGUsIFJBRElPX0hBUkRXQVJFX0RFVklDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgaHdfZGV2aWNlX3QqKilkZXZpY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE9fSFdfREVWSUNFX1RfT1BFTihkZXZpY2UpKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgcmFkaW9faHdfZGV2aWNlX2Nsb3NlKGNvbnN0IHN0cnVjdCByYWRpb19od19kZXZpY2UqIGRldmljZSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvc2Vuc29ycy1iYXNlLmggYi9pbmNsdWRlL2hhcmR3YXJlL3NlbnNvcnMtYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZjYyMjMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2hhcmR3YXJlL3NlbnNvcnMtYmFzZS5oCkBAIC0wLDAgKzEsMTM3IEBACisvLyBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBieSBoaWRsLWdlbi4gRG8gbm90IGVkaXQgbWFudWFsbHkuCisvLyBTb3VyY2U6IGFuZHJvaWQuaGFyZHdhcmUuc2Vuc29yc0AxLjAKKy8vIFJvb3Q6IGFuZHJvaWQuaGFyZHdhcmU6aGFyZHdhcmUvaW50ZXJmYWNlcworCisjaWZuZGVmIEhJRExfR0VORVJBVEVEX0FORFJPSURfSEFSRFdBUkVfU0VOU09SU19WMV8wX0VYUE9SVEVEX0NPTlNUQU5UU19IXworI2RlZmluZSBISURMX0dFTkVSQVRFRF9BTkRST0lEX0hBUkRXQVJFX1NFTlNPUlNfVjFfMF9FWFBPUlRFRF9DT05TVEFOVFNfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitlbnVtIHsKKyAgICBTRU5TT1JfSEFMX05PUk1BTF9NT0RFID0gMCwKKyAgICBTRU5TT1JfSEFMX0RBVEFfSU5KRUNUSU9OX01PREUgPSAxLAorfTsKKworZW51bSB7CisgICAgU0VOU09SX1RZUEVfTUVUQV9EQVRBID0gMCwKKyAgICBTRU5TT1JfVFlQRV9BQ0NFTEVST01FVEVSID0gMSwKKyAgICBTRU5TT1JfVFlQRV9NQUdORVRJQ19GSUVMRCA9IDIsCisgICAgU0VOU09SX1RZUEVfT1JJRU5UQVRJT04gPSAzLAorICAgIFNFTlNPUl9UWVBFX0dZUk9TQ09QRSA9IDQsCisgICAgU0VOU09SX1RZUEVfTElHSFQgPSA1LAorICAgIFNFTlNPUl9UWVBFX1BSRVNTVVJFID0gNiwKKyAgICBTRU5TT1JfVFlQRV9URU1QRVJBVFVSRSA9IDcsCisgICAgU0VOU09SX1RZUEVfUFJPWElNSVRZID0gOCwKKyAgICBTRU5TT1JfVFlQRV9HUkFWSVRZID0gOSwKKyAgICBTRU5TT1JfVFlQRV9MSU5FQVJfQUNDRUxFUkFUSU9OID0gMTAsCisgICAgU0VOU09SX1RZUEVfUk9UQVRJT05fVkVDVE9SID0gMTEsCisgICAgU0VOU09SX1RZUEVfUkVMQVRJVkVfSFVNSURJVFkgPSAxMiwKKyAgICBTRU5TT1JfVFlQRV9BTUJJRU5UX1RFTVBFUkFUVVJFID0gMTMsCisgICAgU0VOU09SX1RZUEVfTUFHTkVUSUNfRklFTERfVU5DQUxJQlJBVEVEID0gMTQsCisgICAgU0VOU09SX1RZUEVfR0FNRV9ST1RBVElPTl9WRUNUT1IgPSAxNSwKKyAgICBTRU5TT1JfVFlQRV9HWVJPU0NPUEVfVU5DQUxJQlJBVEVEID0gMTYsCisgICAgU0VOU09SX1RZUEVfU0lHTklGSUNBTlRfTU9USU9OID0gMTcsCisgICAgU0VOU09SX1RZUEVfU1RFUF9ERVRFQ1RPUiA9IDE4LAorICAgIFNFTlNPUl9UWVBFX1NURVBfQ09VTlRFUiA9IDE5LAorICAgIFNFTlNPUl9UWVBFX0dFT01BR05FVElDX1JPVEFUSU9OX1ZFQ1RPUiA9IDIwLAorICAgIFNFTlNPUl9UWVBFX0hFQVJUX1JBVEUgPSAyMSwKKyAgICBTRU5TT1JfVFlQRV9USUxUX0RFVEVDVE9SID0gMjIsCisgICAgU0VOU09SX1RZUEVfV0FLRV9HRVNUVVJFID0gMjMsCisgICAgU0VOU09SX1RZUEVfR0xBTkNFX0dFU1RVUkUgPSAyNCwKKyAgICBTRU5TT1JfVFlQRV9QSUNLX1VQX0dFU1RVUkUgPSAyNSwKKyAgICBTRU5TT1JfVFlQRV9XUklTVF9USUxUX0dFU1RVUkUgPSAyNiwKKyAgICBTRU5TT1JfVFlQRV9ERVZJQ0VfT1JJRU5UQVRJT04gPSAyNywKKyAgICBTRU5TT1JfVFlQRV9QT1NFXzZET0YgPSAyOCwKKyAgICBTRU5TT1JfVFlQRV9TVEFUSU9OQVJZX0RFVEVDVCA9IDI5LAorICAgIFNFTlNPUl9UWVBFX01PVElPTl9ERVRFQ1QgPSAzMCwKKyAgICBTRU5TT1JfVFlQRV9IRUFSVF9CRUFUID0gMzEsCisgICAgU0VOU09SX1RZUEVfRFlOQU1JQ19TRU5TT1JfTUVUQSA9IDMyLAorICAgIFNFTlNPUl9UWVBFX0FERElUSU9OQUxfSU5GTyA9IDMzLAorICAgIFNFTlNPUl9UWVBFX0xPV19MQVRFTkNZX09GRkJPRFlfREVURUNUID0gMzQsCisgICAgU0VOU09SX1RZUEVfQUNDRUxFUk9NRVRFUl9VTkNBTElCUkFURUQgPSAzNSwKKyAgICBTRU5TT1JfVFlQRV9ERVZJQ0VfUFJJVkFURV9CQVNFID0gNjU1MzYsIC8vIDB4MTAwMDAKK307CisKK2VudW0geworICAgIFNFTlNPUl9GTEFHX1dBS0VfVVAgPSAxdSwgLy8gMQorICAgIFNFTlNPUl9GTEFHX0NPTlRJTlVPVVNfTU9ERSA9IDB1LCAvLyAwCisgICAgU0VOU09SX0ZMQUdfT05fQ0hBTkdFX01PREUgPSAydSwgLy8gMgorICAgIFNFTlNPUl9GTEFHX09ORV9TSE9UX01PREUgPSA0dSwgLy8gNAorICAgIFNFTlNPUl9GTEFHX1NQRUNJQUxfUkVQT1JUSU5HX01PREUgPSA2dSwgLy8gNgorICAgIFNFTlNPUl9GTEFHX0RBVEFfSU5KRUNUSU9OID0gMTZ1LCAvLyAweDEwCisgICAgU0VOU09SX0ZMQUdfRFlOQU1JQ19TRU5TT1IgPSAzMnUsIC8vIDB4MjAKKyAgICBTRU5TT1JfRkxBR19BRERJVElPTkFMX0lORk8gPSA2NHUsIC8vIDB4NDAKKyAgICBTRU5TT1JfRkxBR19ESVJFQ1RfQ0hBTk5FTF9BU0hNRU0gPSAxMDI0dSwgLy8gMHg0MDAKKyAgICBTRU5TT1JfRkxBR19ESVJFQ1RfQ0hBTk5FTF9HUkFMTE9DID0gMjA0OHUsIC8vIDB4ODAwCisgICAgU0VOU09SX0ZMQUdfTUFTS19SRVBPUlRJTkdfTU9ERSA9IDE0dSwgLy8gMHhFCisgICAgU0VOU09SX0ZMQUdfTUFTS19ESVJFQ1RfUkVQT1JUID0gODk2dSwgLy8gMHgzODAKKyAgICBTRU5TT1JfRkxBR19NQVNLX0RJUkVDVF9DSEFOTkVMID0gMzA3MnUsIC8vIDB4QzAwCit9OworCit0eXBlZGVmIGVudW0geworICAgIFNFTlNPUl9GTEFHX1NISUZUX1JFUE9SVElOR19NT0RFID0gMSwKKyAgICBTRU5TT1JfRkxBR19TSElGVF9EQVRBX0lOSkVDVElPTiA9IDQsCisgICAgU0VOU09SX0ZMQUdfU0hJRlRfRFlOQU1JQ19TRU5TT1IgPSA1LAorICAgIFNFTlNPUl9GTEFHX1NISUZUX0FERElUSU9OQUxfSU5GTyA9IDYsCisgICAgU0VOU09SX0ZMQUdfU0hJRlRfRElSRUNUX1JFUE9SVCA9IDcsCisgICAgU0VOU09SX0ZMQUdfU0hJRlRfRElSRUNUX0NIQU5ORUwgPSAxMCwKK30gc2Vuc29yX2ZsYWdfc2hpZnRfdDsKKworZW51bSB7CisgICAgU0VOU09SX1NUQVRVU19OT19DT05UQUNUID0gLTEsIC8vICgtMSkKKyAgICBTRU5TT1JfU1RBVFVTX1VOUkVMSUFCTEUgPSAwLAorICAgIFNFTlNPUl9TVEFUVVNfQUNDVVJBQ1lfTE9XID0gMSwKKyAgICBTRU5TT1JfU1RBVFVTX0FDQ1VSQUNZX01FRElVTSA9IDIsCisgICAgU0VOU09SX1NUQVRVU19BQ0NVUkFDWV9ISUdIID0gMywKK307CisKK2VudW0geworICAgIE1FVEFfREFUQV9GTFVTSF9DT01QTEVURSA9IDF1LCAvLyAxCit9OworCit0eXBlZGVmIGVudW0geworICAgIEFJTkZPX0JFR0lOID0gMHUsIC8vIDAKKyAgICBBSU5GT19FTkQgPSAxdSwgLy8gMQorICAgIEFJTkZPX1VOVFJBQ0tFRF9ERUxBWSA9IDY1NTM2dSwgLy8gMHgxMDAwMAorICAgIEFJTkZPX0lOVEVSTkFMX1RFTVBFUkFUVVJFID0gNjU1Mzd1LCAvLyA2NTUzNworICAgIEFJTkZPX1ZFQzNfQ0FMSUJSQVRJT04gPSA2NTUzOHUsIC8vIDY1NTM4CisgICAgQUlORk9fU0VOU09SX1BMQUNFTUVOVCA9IDY1NTM5dSwgLy8gNjU1MzkKKyAgICBBSU5GT19TQU1QTElORyA9IDY1NTQwdSwgLy8gNjU1NDAKKyAgICBBSU5GT19DSEFOTkVMX05PSVNFID0gMTMxMDcydSwgLy8gMHgyMDAwMAorICAgIEFJTkZPX0NIQU5ORUxfU0FNUExFUiA9IDEzMTA3M3UsIC8vIDEzMTA3MworICAgIEFJTkZPX0NIQU5ORUxfRklMVEVSID0gMTMxMDc0dSwgLy8gMTMxMDc0CisgICAgQUlORk9fQ0hBTk5FTF9MSU5FQVJfVFJBTlNGT1JNID0gMTMxMDc1dSwgLy8gMTMxMDc1CisgICAgQUlORk9fQ0hBTk5FTF9OT05MSU5FQVJfTUFQID0gMTMxMDc2dSwgLy8gMTMxMDc2CisgICAgQUlORk9fQ0hBTk5FTF9SRVNBTVBMRVIgPSAxMzEwNzd1LCAvLyAxMzEwNzcKKyAgICBBSU5GT19MT0NBTF9HRU9NQUdORVRJQ19GSUVMRCA9IDE5NjYwOHUsIC8vIDB4MzAwMDAKKyAgICBBSU5GT19MT0NBTF9HUkFWSVRZID0gMTk2NjA5dSwgLy8gMTk2NjA5CisgICAgQUlORk9fRE9DS19TVEFURSA9IDE5NjYxMHUsIC8vIDE5NjYxMAorICAgIEFJTkZPX0hJR0hfUEVSRk9STUFOQ0VfTU9ERSA9IDE5NjYxMXUsIC8vIDE5NjYxMQorICAgIEFJTkZPX01BR05FVElDX0ZJRUxEX0NBTElCUkFUSU9OID0gMTk2NjEydSwgLy8gMTk2NjEyCisgICAgQUlORk9fQ1VTVE9NX1NUQVJUID0gMjY4NDM1NDU2dSwgLy8gMHgxMDAwMDAwMAorICAgIEFJTkZPX0RFQlVHR0lOR19TVEFSVCA9IDEwNzM3NDE4MjR1LCAvLyAweDQwMDAwMDAwCit9IGFkZGl0aW9uYWxfaW5mb190eXBlX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgU0VOU09SX0RJUkVDVF9SQVRFX1NUT1AgPSAwLAorICAgIFNFTlNPUl9ESVJFQ1RfUkFURV9OT1JNQUwgPSAxLAorICAgIFNFTlNPUl9ESVJFQ1RfUkFURV9GQVNUID0gMiwKKyAgICBTRU5TT1JfRElSRUNUX1JBVEVfVkVSWV9GQVNUID0gMywKK30gZGlyZWN0X3JhdGVfbGV2ZWxfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBTRU5TT1JfRElSRUNUX01FTV9UWVBFX0FTSE1FTSA9IDEsCisgICAgU0VOU09SX0RJUkVDVF9NRU1fVFlQRV9HUkFMTE9DID0gMiwKK30gZGlyZWN0X21lbV90eXBlX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgU0VOU09SX0RJUkVDVF9GTVRfU0VOU09SU19FVkVOVCA9IDEsCit9IGRpcmVjdF9mb3JtYXRfdDsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmICAvLyBISURMX0dFTkVSQVRFRF9BTkRST0lEX0hBUkRXQVJFX1NFTlNPUlNfVjFfMF9FWFBPUlRFRF9DT05TVEFOVFNfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvc2Vuc29ycy5oIGIvaW5jbHVkZS9oYXJkd2FyZS9zZW5zb3JzLmgKaW5kZXggMWQ3M2MzMS4uZGRlOTk3ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9zZW5zb3JzLmgKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS9zZW5zb3JzLmgKQEAgLTI0LDYgKzI0LDggQEAKICNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CiAKKyNpbmNsdWRlICJzZW5zb3JzLWJhc2UuaCIKKwogX19CRUdJTl9ERUNMUwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC01NCwxNCArNTYsMTUgQEAKICNkZWZpbmUgU0VOU09SU19IQVJEV0FSRV9QT0xMICAgICAgICJwb2xsIgogCiAvKioKLSAqIEhhbmRsZXMgbXVzdCBiZSBoaWdoZXIgdGhhbiBTRU5TT1JTX0hBTkRMRV9CQVNFIGFuZCBtdXN0IGJlIHVuaXF1ZS4KLSAqIEEgSGFuZGxlIGlkZW50aWZpZXMgYSBnaXZlbiBzZW5zb3JzLiBUaGUgaGFuZGxlIGlzIHVzZWQgdG8gYWN0aXZhdGUKLSAqIGFuZC9vciBkZWFjdGl2YXRlIHNlbnNvcnMuCi0gKiBJbiB0aGlzIHZlcnNpb24gb2YgdGhlIEFQSSB0aGVyZSBjYW4gb25seSBiZSAyNTYgaGFuZGxlcy4KKyAqIFNlbnNvciBoYW5kbGUgaXMgZ3JlYXRlciB0aGFuIDAgYW5kIGxlc3MgdGhhbiBJTlQzMl9NQVguCisgKgorICogKioqKiBEZXByZWNhdGVkICoqKioKKyAqIERlZmluZWQgdmFsdWVzIGJlbG93IGFyZSBrZXB0IGZvciBjb2RlIGNvbXBhdGliaWxpdHkuIE5vdGUgc2Vuc29yIGhhbmRsZSBjYW4gYmUgYXMgbGFyZ2UgYXMKKyAqIElOVDMyX01BWC4KICAqLwogI2RlZmluZSBTRU5TT1JTX0hBTkRMRV9CQVNFICAgICAgICAgICAgIDAKLSNkZWZpbmUgU0VOU09SU19IQU5ETEVfQklUUyAgICAgICAgICAgICA4Ci0jZGVmaW5lIFNFTlNPUlNfSEFORExFX0NPVU5UICAgICAgICAgICAgKDE8PFNFTlNPUlNfSEFORExFX0JJVFMpCisjZGVmaW5lIFNFTlNPUlNfSEFORExFX0JJVFMgICAgICAgICAgICAgMzEKKyNkZWZpbmUgU0VOU09SU19IQU5ETEVfQ09VTlQgICAgICAgICAgICAoMXVsbDw8U0VOU09SU19IQU5ETEVfQklUUykKIAogCiAvKgpAQCAtODIsNyArODUsNyBAQAogICovCiBlbnVtIHsKICAgICAvKiBhIHByZXZpb3VzIGZsdXNoIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkICovCi0gICAgTUVUQV9EQVRBX0ZMVVNIX0NPTVBMRVRFID0gMSwKKyAgICAvLyBNRVRBX0RBVEFfRkxVU0hfQ09NUExFVEUgPSAxLAogICAgIE1FVEFfREFUQV9WRVJTSU9OICAgLyogYWx3YXlzIGxhc3QsIGxlYXZlIGF1dG8tYXNzaWduZWQgKi8KIH07CiAKQEAgLTk0LDI3ICs5NywxMSBAQAogI2RlZmluZSBTRU5TT1JfUEVSTUlTU0lPTl9CT0RZX1NFTlNPUlMgImFuZHJvaWQucGVybWlzc2lvbi5CT0RZX1NFTlNPUlMiCiAKIC8qCi0gKiBBdmFpbGFiaWxpdHk6IFNFTlNPUlNfREVWSUNFX0FQSV9WRVJTSU9OXzFfNAotICogU2Vuc29yIEhBTCBtb2RlcyB1c2VkIGluIHNldF9vcGVyYXRpb25fbW9kZSBtZXRob2QKKyAqIHNlbnNvciBmbGFncyBsZWdhY3kgbmFtZXMKKyAqCisgKiBwbGVhc2UgdXNlIFNFTlNPUl9GTEFHXyogZGlyZWN0bHkgZm9yIG5ldyBpbXBsZW1lbnRhdGlvbi4KKyAqIEBzZWUgc2Vuc29yX3QKICAqLwotZW51bSB7Ci0gICAgLyoKLSAgICAgKiBPcGVyYXRpbmcgbW9kZXMgZm9yIHRoZSBIQUwuCi0gICAgICovCi0KLSAgICAvKgotICAgICAqIE5vcm1hbCBtb2RlIG9wZXJhdGlvbi4gVGhpcyBpcyB0aGUgZGVmYXVsdCBzdGF0ZSBvZiBvcGVyYXRpb24uCi0gICAgICogVGhlIEhBTCBzaGFsbCBpbml0aWFsaXplIGludG8gdGhpcyBtb2RlIG9uIGRldmljZSBzdGFydHVwLgotICAgICAqLwotICAgIFNFTlNPUl9IQUxfTk9STUFMX01PREUgICAgICAgID0gMCwKLQotICAgIC8qCi0gICAgICogRGF0YSBJbmplY3Rpb24gbW9kZS4gSW4gdGhpcyBtb2RlLCB0aGUgZGV2aWNlIHNoYWxsIG5vdCBzb3VyY2UgZGF0YSBmcm9tIHRoZQotICAgICAqIHBoeXNpY2FsIHNlbnNvcnMgYXMgaXQgd291bGQgaW4gbm9ybWFsIG1vZGUuIEluc3RlYWQgc2Vuc29yIGRhdGEgaXMKLSAgICAgKiBpbmplY3RlZCBieSB0aGUgc2Vuc29yIHNlcnZpY2UuCi0gICAgICovCi0gICAgU0VOU09SX0hBTF9EQVRBX0lOSkVDVElPTl9NT0RFICAgICAgPSAweDEKLX07CiAKICNkZWZpbmUgU0VOU09SX0ZMQUdfTUFTSyhuYml0LCBzaGlmdCkgICAoKCgxPDwobmJpdCkpLTEpPDwoc2hpZnQpKQogI2RlZmluZSBTRU5TT1JfRkxBR19NQVNLXzEoc2hpZnQpICAgICAgIFNFTlNPUl9GTEFHX01BU0soMSwgc2hpZnQpCkBAIC0xMjIsNzQ2ICsxMDksODIgQEAKIC8qCiAgKiBNYXNrIGFuZCBzaGlmdCBmb3IgcmVwb3J0aW5nIG1vZGUgc2Vuc29yIGZsYWdzIGRlZmluZWQgYWJvdmUuCiAgKi8KLSNkZWZpbmUgUkVQT1JUSU5HX01PREVfU0hJRlQgICAgICAgICAgICAoMSkKKyNkZWZpbmUgUkVQT1JUSU5HX01PREVfU0hJRlQgICAgICAgICAgICBTRU5TT1JfRkxBR19TSElGVF9SRVBPUlRJTkdfTU9ERQogI2RlZmluZSBSRVBPUlRJTkdfTU9ERV9OQklUICAgICAgICAgICAgICgzKQotI2RlZmluZSBSRVBPUlRJTkdfTU9ERV9NQVNLICAgICAgICAgICAgIFNFTlNPUl9GTEFHX01BU0soUkVQT1JUSU5HX01PREVfTkJJVCwgUkVQT1JUSU5HX01PREVfU0hJRlQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHhFCisjZGVmaW5lIFJFUE9SVElOR19NT0RFX01BU0sgICAgICAgICAgICAgU0VOU09SX0ZMQUdfTUFTS19SRVBPUlRJTkdfTU9ERQogCiAvKgogICogTWFzayBhbmQgc2hpZnQgZm9yIGRhdGFfaW5qZWN0aW9uIG1vZGUgc2Vuc29yIGZsYWdzIGRlZmluZWQgYWJvdmUuCiAgKi8KLSNkZWZpbmUgREFUQV9JTkpFQ1RJT05fU0hJRlQgICAgICAgICAgICAoNCkKLSNkZWZpbmUgREFUQV9JTkpFQ1RJT05fTUFTSyAgICAgICAgICAgICBTRU5TT1JfRkxBR19NQVNLXzEoREFUQV9JTkpFQ1RJT05fU0hJRlQpIC8vMHgxMAorI2RlZmluZSBEQVRBX0lOSkVDVElPTl9TSElGVCAgICAgICAgICAgIFNFTlNPUl9GTEFHX1NISUZUX0RBVEFfSU5KRUNUSU9OCisjZGVmaW5lIERBVEFfSU5KRUNUSU9OX01BU0sgICAgICAgICAgICAgU0VOU09SX0ZMQUdfREFUQV9JTkpFQ1RJT04KIAogLyoKICAqIE1hc2sgYW5kIHNoaWZ0IGZvciBkeW5hbWljIHNlbnNvciBmbGFnLgogICovCi0jZGVmaW5lIERZTkFNSUNfU0VOU09SX1NISUZUICAgICAgICAgICAgKDUpCi0jZGVmaW5lIERZTkFNSUNfU0VOU09SX01BU0sgICAgICAgICAgICAgU0VOU09SX0ZMQUdfTUFTS18xKERZTkFNSUNfU0VOU09SX1NISUZUKSAvLzB4MjAKKyNkZWZpbmUgRFlOQU1JQ19TRU5TT1JfU0hJRlQgICAgICAgICAgICBTRU5TT1JfRkxBR19TSElGVF9EWU5BTUlDX1NFTlNPUgorI2RlZmluZSBEWU5BTUlDX1NFTlNPUl9NQVNLICAgICAgICAgICAgIFNFTlNPUl9GTEFHX0RZTkFNSUNfU0VOU09SCiAKIC8qCiAgKiBNYXNrIGFuZCBzaGlmdCBmb3Igc2Vuc29yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gc3VwcG9ydC4KICAqLwotI2RlZmluZSBBRERJVElPTkFMX0lORk9fU0hJRlQgICAgICAgICAgICg2KQotI2RlZmluZSBBRERJVElPTkFMX0lORk9fTUFTSyAgICAgICAgICAgIFNFTlNPUl9GTEFHX01BU0tfMShBRERJVElPTkFMX0lORk9fU0hJRlQpIC8vMHg0MAorI2RlZmluZSBBRERJVElPTkFMX0lORk9fU0hJRlQgICAgICAgICAgIFNFTlNPUl9GTEFHX1NISUZUX0FERElUSU9OQUxfSU5GTworI2RlZmluZSBBRERJVElPTkFMX0lORk9fTUFTSyAgICAgICAgICAgIFNFTlNPUl9GTEFHX0FERElUSU9OQUxfSU5GTwogCiAvKgotICogQXZhaWxhYmlsaXR5OiBTRU5TT1JTX0RFVklDRV9BUElfVkVSU0lPTl8xXzMKLSAqIFNlbnNvciBmbGFncyB1c2VkIGluIHNlbnNvcl90LmZsYWdzLgorICogTGVnYWN5IGFsaWFzIG9mIFNFTlNPUl9UWVBFX01BR05FVElDX0ZJRUxELgorICoKKyAqIFByZXZpb3VzbHksIHRoZSB0eXBlIG9mIGEgc2Vuc29yIG1lYXN1cmluZyBsb2NhbCBtYWduZXRpYyBmaWVsZCBpcyBuYW1lZAorICogU0VOU09SX1RZUEVfR0VPTUFHTkVUSUNfRklFTEQgYW5kIFNFTlNPUl9UWVBFX01BR05FVElDX0ZJRUxEIGlzIGl0cyBhbGlhcy4KKyAqIFNFTlNPUl9UWVBFX01BR05FVElDX0ZJRUxEIGlzIHJlZGVmaW5lZCBhcyBwcmltYXJ5IG5hbWUgdG8gYXZvaWQgY29uZnVzaW9uLgorICogU0VOU09SX1RZUEVfR0VPTUFHTkVUSUNfRklFTEQgaXMgdGhlIGFsaWFzIGFuZCBpcyBkZXByZWNhdGluZy4gTmV3IGltcGxlbWVudGF0aW9uIG11c3Qgbm90IHVzZQorICogU0VOU09SX1RZUEVfR0VPTUFHTkVUSUNfRklFTEQuCiAgKi8KLWVudW0gewotICAgIC8qCi0gICAgICogV2hldGhlciB0aGlzIHNlbnNvciB3YWtlcyB1cCB0aGUgQVAgZnJvbSBzdXNwZW5kIG1vZGUgd2hlbiBkYXRhIGlzIGF2YWlsYWJsZS4gIFdoZW5ldmVyCi0gICAgICogc2Vuc29yIGV2ZW50cyBhcmUgZGVsaXZlcmVkIGZyb20gYSB3YWtlX3VwIHNlbnNvciwgdGhlIGRyaXZlciBuZWVkcyB0byBob2xkIGEgd2FrZV9sb2NrIHRpbGwKLSAgICAgKiB0aGUgZXZlbnRzIGFyZSByZWFkIGJ5IHRoZSBTZW5zb3JTZXJ2aWNlIGkuZSB0aWxsIHNlbnNvcnNfcG9sbF9kZXZpY2VfdC5wb2xsKCkgaXMgY2FsbGVkIHRoZQotICAgICAqIG5leHQgdGltZS4gT25jZSBwb2xsIGlzIGNhbGxlZCBhZ2FpbiBpdCBtZWFucyBldmVudHMgaGF2ZSBiZWVuIHJlYWQgYnkgdGhlIFNlbnNvclNlcnZpY2UsIHRoZQotICAgICAqIGRyaXZlciBjYW4gc2FmZWx5IHJlbGVhc2UgdGhlIHdha2VfbG9jay4gU2Vuc29yU2VydmljZSB3aWxsIGNvbnRpbnVlIHRvIGhvbGQgYSB3YWtlX2xvY2sgdGlsbAotICAgICAqIHRoZSBhcHAgYWN0dWFsbHkgcmVhZHMgdGhlIGV2ZW50cy4KLSAgICAgKi8KLSAgICBTRU5TT1JfRkxBR19XQUtFX1VQID0gMVUgPDwgMCwKLSAgICAvKgotICAgICAqIFJlcG9ydGluZyBtb2RlcyBmb3IgdmFyaW91cyBzZW5zb3JzLiBFYWNoIHNlbnNvciB3aWxsIGhhdmUgZXhhY3RseSBvbmUgb2YgdGhlc2UgbW9kZXMgc2V0LgotICAgICAqIFRoZSBsZWFzdCBzaWduaWZpY2FudCAybmQsIDNyZCBhbmQgNHRoIGJpdHMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGZvdXIgcG9zc2libGUgcmVwb3J0aW5nCi0gICAgICogbW9kZXMuCi0gICAgICovCi0gICAgU0VOU09SX0ZMQUdfQ09OVElOVU9VU19NT0RFICAgICAgICA9IDAsICAgIC8vIDAwMDAKLSAgICBTRU5TT1JfRkxBR19PTl9DSEFOR0VfTU9ERSAgICAgICAgID0gMHgyLCAgLy8gMDAxMAotICAgIFNFTlNPUl9GTEFHX09ORV9TSE9UX01PREUgICAgICAgICAgPSAweDQsICAvLyAwMTAwCi0gICAgU0VOU09SX0ZMQUdfU1BFQ0lBTF9SRVBPUlRJTkdfTU9ERSA9IDB4NiwgIC8vIDAxMTAKLQotICAgIC8qCi0gICAgICogU2V0IHRoaXMgZmxhZyBpZiB0aGUgc2Vuc29yIHN1cHBvcnRzIGRhdGFfaW5qZWN0aW9uIG1vZGUgYW5kIGFsbG93cyBkYXRhIHRvIGJlIGluamVjdGVkCi0gICAgICogZnJvbSB0aGUgU2Vuc29yU2VydmljZS4gV2hlbiBpbiBkYXRhX2luamVjdGlvbiBPTkxZIHNlbnNvcnMgd2l0aCB0aGlzIGZsYWcgc2V0IGFyZSBpbmplY3RlZAotICAgICAqIHNlbnNvciBkYXRhIGFuZCBvbmx5IHNlbnNvcnMgd2l0aCB0aGlzIGZsYWcgc2V0IGFyZSBhY3RpdmF0ZWQuIEVnOiBBY2NlbGVyb21ldGVyIGFuZCBTdGVwCi0gICAgICogQ291bnRlciBzZW5zb3JzIGNhbiBiZSBzZXQgd2l0aCB0aGlzIGZsYWcgYW5kIFNlbnNvclNlcnZpY2Ugd2lsbCBpbmplY3QgYWNjZWxlcm9tZXRlciBkYXRhCi0gICAgICogYW5kIHJlYWQgdGhlIGNvcnJlc3BvbmRpbmcgc3RlcCBjb3VudHMuCi0gICAgICovCi0gICAgU0VOU09SX0ZMQUdfU1VQUE9SVFNfREFUQV9JTkpFQ1RJT04gPSBEQVRBX0lOSkVDVElPTl9NQVNLLCAvLyAxIDAwMDAKLQotICAgIC8qCi0gICAgICogU2V0IHRoaXMgZmxhZyBpZiB0aGUgc2Vuc29yIGlzIGEgZHluYW1pY2FsbHkgY29ubmVjdGVkIHNlbnNvci4gU2VlCi0gICAgICogZHluYW1pY19zZW5zb3JfbWV0YV9ldmVudF90IGFuZCBTRU5TT1JfVFlQRV9EWU5BTUlDX1NFTlNPUl9NRVRBIGZvciBkZXRhaWxzLgotICAgICAqLwotICAgIFNFTlNPUl9GTEFHX0RZTkFNSUNfU0VOU09SID0gRFlOQU1JQ19TRU5TT1JfTUFTSywKLQotICAgIC8qCi0gICAgICogU2V0IHRoaXMgZmxhZyBpZiBzZW5zb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpcyBzdXBwb3J0ZWQuIFNlZSBTRU5TT1JfVFlQRV9BRERJVElPTkFMX0lORk8KLSAgICAgKiBhbmQgYWRkaXRpb25hbF9pbmZvX2V2ZW50X3QgZm9yIGRldGFpbHMuCi0gICAgICovCi0gICAgU0VOU09SX0ZMQUdfQURESVRJT05BTF9JTkZPID0gQURESVRJT05BTF9JTkZPX01BU0sKLX07Ci0KKyNkZWZpbmUgU0VOU09SX1RZUEVfR0VPTUFHTkVUSUNfRklFTEQgICBTRU5TT1JfVFlQRV9NQUdORVRJQ19GSUVMRAogCiAvKgotICogU2Vuc29yIHR5cGUKKyAqIFNlbnNvciBzdHJpbmcgdHlwZXMgZm9yIEFuZHJvaWQgZGVmaW5lZCBzZW5zb3IgdHlwZXMuCiAgKgotICogRWFjaCBzZW5zb3IgaGFzIGEgdHlwZSB3aGljaCBkZWZpbmVzIHdoYXQgdGhpcyBzZW5zb3IgbWVhc3VyZXMgYW5kIGhvdwotICogbWVhc3VyZXMgYXJlIHJlcG9ydGVkLiBTZWUgdGhlIEJhc2Ugc2Vuc29ycyBhbmQgQ29tcG9zaXRlIHNlbnNvcnMgbGlzdHMKLSAqIGZvciBjb21wbGV0ZSBkZXNjcmlwdGlvbnM6Ci0gKiBodHRwOi8vc291cmNlLmFuZHJvaWQuY29tL2RldmljZXMvc2Vuc29ycy9iYXNlX3RyaWdnZXJzLmh0bWwKLSAqIGh0dHA6Ly9zb3VyY2UuYW5kcm9pZC5jb20vZGV2aWNlcy9zZW5zb3JzL2NvbXBvc2l0ZV9zZW5zb3JzLmh0bWwKKyAqIEZvciBBbmRyb2lkIGRlZmluZWQgc2Vuc29yIHR5cGVzLCBzdHJpbmcgdHlwZSB3aWxsIGJlIG92ZXJyaWRlIGluIHNlbnNvciBzZXJ2aWNlIGFuZCB0aHVzIG5vCisgKiBsb25nZXIgbmVlZGVkIHRvIGJlIGFkZGVkIHRvIHNlbnNvcl90IGRhdGEgc3RydWN0dXJlLgogICoKLSAqIERldmljZSBtYW51ZmFjdHVyZXJzIChPRU1zKSBjYW4gZGVmaW5lIHRoZWlyIG93biBzZW5zb3IgdHlwZXMsIGZvcgotICogdGhlaXIgcHJpdmF0ZSB1c2UgYnkgYXBwbGljYXRpb25zIG9yIHNlcnZpY2VzIHByb3ZpZGVkIGJ5IHRoZW0uIFN1Y2gKLSAqIHNlbnNvciB0eXBlcyBhcmUgc3BlY2lmaWMgdG8gYW4gT0VNIGFuZCBjYW4ndCBiZSBleHBvc2VkIGluIHRoZSBTREsuCi0gKiBUaGVzZSB0eXBlcyBtdXN0IHN0YXJ0IGF0IFNFTlNPUl9UWVBFX0RFVklDRV9QUklWQVRFX0JBU0UuCi0gKgotICogQWxsIHNlbnNvcnMgZGVmaW5lZCBvdXRzaWRlIG9mIHRoZSBkZXZpY2UgcHJpdmF0ZSByYW5nZSBtdXN0IGNvcnJlc3BvbmQgdG8KLSAqIGEgdHlwZSBkZWZpbmVkIGluIHRoaXMgZmlsZSwgYW5kIG11c3Qgc2F0aXNmeSB0aGUgY2hhcmFjdGVyaXN0aWNzIGxpc3RlZCBpbgotICogdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBzZW5zb3IgdHlwZS4KLSAqCi0gKiBTdGFydGluZyB3aXRoIHZlcnNpb24gU0VOU09SU19ERVZJQ0VfQVBJX1ZFUlNJT05fMV8yLCBlYWNoIHNlbnNvciBhbHNvCi0gKiBoYXMgYSBzdHJpbmdUeXBlLgotICogIC0gU3RyaW5nVHlwZSBvZiBzZW5zb3JzIGluc2lkZSBvZiB0aGUgZGV2aWNlIHByaXZhdGUgcmFuZ2UgTVVTVCBiZSBwcmVmaXhlZAotICogICAgYnkgdGhlIHNlbnNvciBwcm92aWRlcidzIG9yIE9FTSByZXZlcnNlIGRvbWFpbiBuYW1lLiBJbiBwYXJ0aWN1bGFyLCB0aGV5Ci0gKiAgICBjYW5ub3QgdXNlIHRoZSAiYW5kcm9pZC5zZW5zb3IiIHByZWZpeC4KLSAqICAtIFN0cmluZ1R5cGUgb2Ygc2Vuc29ycyBvdXRzaWRlIG9mIHRoZSBkZXZpY2UgcHJpdmF0ZSByYW5nZSBNVVNUIGNvcnJlc3BvbmQKLSAqICAgIHRvIHRoZSBvbmUgZGVmaW5lZCBpbiB0aGlzIGZpbGUgKHN0YXJ0aW5nIHdpdGggImFuZHJvaWQuc2Vuc29yIikuCi0gKiAgICBGb3IgZXhhbXBsZSwgYWNjZWxlcm9tZXRlcnMgbXVzdCBoYXZlCi0gKiAgICAgIHR5cGU9U0VOU09SX1RZUEVfQUNDRUxFUk9NRVRFUiBhbmQKLSAqICAgICAgc3RyaW5nVHlwZT1TRU5TT1JfU1RSSU5HX1RZUEVfQUNDRUxFUk9NRVRFUgotICoKLSAqIFdoZW4gYW5kcm9pZCBpbnRyb2R1Y2VzIGEgbmV3IHNlbnNvciB0eXBlIHRoYXQgY2FuIHJlcGxhY2UgYW4gT0VNLWRlZmluZWQKLSAqIHNlbnNvciB0eXBlLCB0aGUgT0VNIG11c3QgdXNlIHRoZSBvZmZpY2lhbCBzZW5zb3IgdHlwZSBhbmQgc3RyaW5nVHlwZSBvbgotICogdmVyc2lvbnMgb2YgdGhlIEhBTCB0aGF0IHN1cHBvcnQgdGhpcyBuZXcgb2ZmaWNpYWwgc2Vuc29yIHR5cGUuCi0gKgotICogRXhhbXBsZSAobWFkZSB1cCk6IFN1cHBvc2UgR29vZ2xlJ3MgR2xhc3MgdGVhbSB3YW50cyB0byBzdXJmYWNlIGEgc2Vuc29yCi0gKiBkZXRlY3RpbmcgdGhhdCBHbGFzcyBpcyBvbiBhIGhlYWQuCi0gKiAgLSBTdWNoIGEgc2Vuc29yIGlzIG5vdCBvZmZpY2lhbGx5IHN1cHBvcnRlZCBpbiBhbmRyb2lkIEtpdEthdAotICogIC0gR2xhc3MgZGV2aWNlcyBsYXVuY2hpbmcgb24gS2l0S2F0IGNhbiBpbXBsZW1lbnQgYSBzZW5zb3Igd2l0aAotICogICAgdHlwZSA9IDB4MTAwMDEgYW5kIHN0cmluZ1R5cGUgPSAiY29tLmdvb2dsZS5nbGFzcy5vbmhlYWRkZXRlY3RvciIKLSAqICAtIEluIEwgYW5kcm9pZCByZWxlYXNlLCBpZiBhbmRyb2lkIGRlY2lkZXMgdG8gZGVmaW5lCi0gKiAgICBTRU5TT1JfVFlQRV9PTl9IRUFEX0RFVEVDVE9SIGFuZCBTVFJJTkdfU0VOU09SX1RZUEVfT05fSEVBRF9ERVRFQ1RPUiwKLSAqICAgIHRob3NlIHR5cGVzIHNob3VsZCByZXBsYWNlIHRoZSBHbGFzcy10ZWFtLXNwZWNpZmljIHR5cGVzIGluIGFsbCBmdXR1cmUKLSAqICAgIGxhdW5jaGVzLgotICogIC0gV2hlbiBsYXVuY2hpbmcgR2xhc3Mgb24gdGhlIEwgcmVsZWFzZSwgR29vZ2xlIHNob3VsZCBub3cgdXNlIHRoZSBvZmZpY2lhbAotICogICAgdHlwZSAoU0VOU09SX1RZUEVfT05fSEVBRF9ERVRFQ1RPUikgYW5kIHN0cmluZ1R5cGUuCi0gKiAgLSBUaGlzIHdheSwgYWxsIGFwcGxpY2F0aW9ucyBjYW4gbm93IHVzZSB0aGlzIHNlbnNvci4KKyAqIFRoZXNlIGRlZmluaXRpb25zIGFyZSBnb2luZyB0byBiZSByZW1vdmVkIHNvb24uCiAgKi8KLQotLyoKLSAqIEJhc2UgZm9yIGRldmljZSBtYW51ZmFjdHVyZXJzIHByaXZhdGUgc2Vuc29yIHR5cGVzLgotICogVGhlc2Ugc2Vuc29yIHR5cGVzIGNhbid0IGJlIGV4cG9zZWQgaW4gdGhlIFNESy4KLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9ERVZJQ0VfUFJJVkFURV9CQVNFICAgICAweDEwMDAwCi0KLS8qCi0gKiBTRU5TT1JfVFlQRV9NRVRBX0RBVEEKLSAqIHJlcG9ydGluZy1tb2RlOiBuL2EKLSAqIHdha2UtdXAgc2Vuc29yOiBuL2EKLSAqCi0gKiBOTyBTRU5TT1IgT0YgVEhBVCBUWVBFIE1VU1QgQkUgUkVUVVJORUQgKCpnZXRfc2Vuc29yc19saXN0KSgpCi0gKgotICogU0VOU09SX1RZUEVfTUVUQV9EQVRBIGlzIGEgc3BlY2lhbCB0b2tlbiB1c2VkIHRvIHBvcHVsYXRlIHRoZQotICogc2Vuc29yc19tZXRhX2RhdGFfZXZlbnQgc3RydWN0dXJlLiBJdCBkb2Vzbid0IGNvcnJlc3BvbmQgdG8gYSBwaHlzaWNhbAotICogc2Vuc29yLiBzZW5zb3JzX21ldGFfZGF0YV9ldmVudCBhcmUgc3BlY2lhbCwgdGhleSBleGlzdCBvbmx5IGluc2lkZQotICogdGhlIEhBTCBhbmQgYXJlIGdlbmVyYXRlZCBzcG9udGFuZW91c2x5LCBhcyBvcHBvc2VkIHRvIGJlIHJlbGF0ZWQgdG8KLSAqIGEgcGh5c2ljYWwgc2Vuc29yLgotICoKLSAqICAgc2Vuc29yc19tZXRhX2RhdGFfZXZlbnRfdC52ZXJzaW9uIG11c3QgYmUgTUVUQV9EQVRBX1ZFUlNJT04KLSAqICAgc2Vuc29yc19tZXRhX2RhdGFfZXZlbnRfdC5zZW5zb3IgbXVzdCBiZSAwCi0gKiAgIHNlbnNvcnNfbWV0YV9kYXRhX2V2ZW50X3QudHlwZSBtdXN0IGJlIFNFTlNPUl9UWVBFX01FVEFfREFUQQotICogICBzZW5zb3JzX21ldGFfZGF0YV9ldmVudF90LnJlc2VydmVkIG11c3QgYmUgMAotICogICBzZW5zb3JzX21ldGFfZGF0YV9ldmVudF90LnRpbWVzdGFtcCBtdXN0IGJlIDAKLSAqCi0gKiBUaGUgcGF5bG9hZCBpcyBhIG1ldGFfZGF0YV9ldmVudF90LCB3aGVyZToKLSAqIG1ldGFfZGF0YV9ldmVudF90LndoYXQgY2FuIHRha2UgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0gKgotICogTUVUQV9EQVRBX0ZMVVNIX0NPTVBMRVRFCi0gKiAgIFRoaXMgZXZlbnQgaW5kaWNhdGVzIHRoYXQgYSBwcmV2aW91cyAoKmZsdXNoKSgpIGNhbGwgaGFzIGNvbXBsZXRlZCBmb3IgdGhlIHNlbnNvcgotICogICBoYW5kbGUgc3BlY2lmaWVkIGluIG1ldGFfZGF0YV9ldmVudF90LnNlbnNvci4KLSAqICAgc2VlICgqZmx1c2gpKCkgZm9yIG1vcmUgZGV0YWlscwotICoKLSAqIEFsbCBvdGhlciB2YWx1ZXMgZm9yIG1ldGFfZGF0YV9ldmVudF90LndoYXQgYXJlIHJlc2VydmVkIGFuZAotICogbXVzdCBub3QgYmUgdXNlZC4KLSAqCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfTUVUQV9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgKDApCi0KLS8qCi0gICogV2FrZSB1cCBzZW5zb3JzLgotICAqIEVhY2ggc2Vuc29yIG1heSBoYXZlIGVpdGhlciBvciBib3RoIGEgd2FrZS11cCBhbmQgYSBub24td2FrZSB2YXJpYW50LgotICAqIFdoZW4gcmVnaXN0ZXJlZCBpbiBiYXRjaCBtb2RlLCB3YWtlLXVwIHNlbnNvcnMgd2lsbCB3YWtlIHVwIHRoZSBBUCB3aGVuCi0gICogdGhlaXIgRklGT3MgYXJlIGZ1bGwgb3Igd2hlbiB0aGUgYmF0Y2ggdGltZW91dCBleHBpcmVzLiBBIHNlcGFyYXRlIEZJRk8gaGFzCi0gICogdG8gYmUgbWFpbnRhaW5lZCBmb3Igd2FrZSB1cCBzZW5zb3JzIGFuZCBub24gd2FrZSB1cCBzZW5zb3JzLiBUaGUgbm9uIHdha2UtdXAKLSAgKiBzZW5zb3JzIG5lZWQgdG8gb3ZlcndyaXRlIHRoZWlyIEZJRk9zIHdoZW4gdGhleSBhcmUgZnVsbCB0aWxsIHRoZSBBUCB3YWtlcyB1cAotICAqIGFuZCB0aGUgd2FrZS11cCBzZW5zb3JzIHdpbGwgd2FrZS11cCB0aGUgQVAgd2hlbiB0aGVpciBGSUZPcyBhcmUgZnVsbCBvciB3aGVuCi0gICogdGhlIGJhdGNoIHRpbWVvdXQgZXhwaXJlcyB3aXRob3V0IGxvc2luZyBldmVudHMuIFdha2UtdXAgYW5kIG5vbiB3YWtlLXVwIHZhcmlhbnRzCi0gICogb2YgZWFjaCBzZW5zb3IgY2FuIGJlIGFjdGl2YXRlZCBhdCBkaWZmZXJlbnQgcmF0ZXMgaW5kZXBlbmRlbnRseSBvZiBlYWNoIG90aGVyLgotICAqCi0gICogTm90ZTogUHJveGltaXR5IHNlbnNvciBhbmQgc2lnbmlmaWNhbnQgbW90aW9uIHNlbnNvciB3aGljaCB3ZXJlIGRlZmluZWQgaW4gcHJldmlvdXMKLSAgKiByZWxlYXNlcyBhcmUgYWxzbyB3YWtlLXVwIHNlbnNvcnMgYW5kIHNob3VsZCBiZSB0cmVhdGVkIGFzIHN1Y2guIFdha2UtdXAgb25lLXNob3QKLSAgKiBzZW5zb3JzIGxpa2UgU0lHTklGSUNBTlRfTU9USU9OIGNhbm5vdCBiZSBiYXRjaGVkLCBoZW5jZSB0aGUgdGV4dCBhYm91dCBiYXRjaCBhYm92ZQotICAqIGRvZXNuJ3QgYXBwbHkgdG8gdGhlbS4gU2VlIHRoZSBkZWZpbml0aW9ucyBvZiBTRU5TT1JfVFlQRV9QUk9YSU1JVFkgYW5kCi0gICogU0VOU09SX1RZUEVfU0lHTklGSUNBTlRfTU9USU9OIGZvciBtb3JlIGluZm8uCi0gICoKLSAgKiBTZXQgU0VOU09SX0ZMQUdfV0FLRV9VUCBmbGFnIGZvciBhbGwgd2FrZS11cCBzZW5zb3JzLgotICAqCi0gICogRm9yIGV4YW1wbGUsIEEgZGV2aWNlIGNhbiBoYXZlIHR3byBzZW5zb3JzIGJvdGggb2YgU0VOU09SX1RZUEVfQUNDRUxFUk9NRVRFUiBhbmQKLSAgKiBvbmUgb2YgdGhlbSBjYW4gYmUgYSB3YWtlX3VwIHNlbnNvciAod2l0aCBTRU5TT1JfRkxBR19XQUtFX1VQIGZsYWcgc2V0KSBhbmQgdGhlIG90aGVyCi0gICogY2FuIGJlIGEgcmVndWxhciBub24gd2FrZV91cCBzZW5zb3IuIEJvdGggb2YgdGhlc2Ugc2Vuc29ycyBtdXN0IGJlIGFjdGl2YXRlZC9kZWFjdGl2YXRlZAotICAqIGluZGVwZW5kZW50bHkgb2YgdGhlIG90aGVyLgotICAqLwotCi0vKgotICogU0VOU09SX1RZUEVfQUNDRUxFUk9NRVRFUgotICogcmVwb3J0aW5nLW1vZGU6IGNvbnRpbnVvdXMKLSAqCi0gKiAgQWxsIHZhbHVlcyBhcmUgaW4gU0kgdW5pdHMgKG0vc14yKSBhbmQgbWVhc3VyZSB0aGUgYWNjZWxlcmF0aW9uIG9mIHRoZQotICogIGRldmljZSBtaW51cyB0aGUgZm9yY2Ugb2YgZ3Jhdml0eS4KLSAqCi0gKiAgSW1wbGVtZW50IHRoZSBub24td2FrZS11cCB2ZXJzaW9uIG9mIHRoaXMgc2Vuc29yIGFuZCBpbXBsZW1lbnQgdGhlIHdha2UtdXAKLSAqICB2ZXJzaW9uIGlmIHRoZSBzeXN0ZW0gcG9zc2Vzc2VzIGEgd2FrZSB1cCBmaWZvLgotICovCi0jZGVmaW5lIFNFTlNPUl9UWVBFX0FDQ0VMRVJPTUVURVIgICAgICAgICAgICAgICAgICAgICgxKQotI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfQUNDRUxFUk9NRVRFUiAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IuYWNjZWxlcm9tZXRlciIKLQotLyoKLSAqIFNFTlNPUl9UWVBFX0dFT01BR05FVElDX0ZJRUxECi0gKiByZXBvcnRpbmctbW9kZTogY29udGludW91cwotICoKLSAqICBBbGwgdmFsdWVzIGFyZSBpbiBtaWNyby1UZXNsYSAodVQpIGFuZCBtZWFzdXJlIHRoZSBnZW9tYWduZXRpYwotICogIGZpZWxkIGluIHRoZSBYLCBZIGFuZCBaIGF4aXMuCi0gKgotICogIEltcGxlbWVudCB0aGUgbm9uLXdha2UtdXAgdmVyc2lvbiBvZiB0aGlzIHNlbnNvciBhbmQgaW1wbGVtZW50IHRoZSB3YWtlLXVwCi0gKiAgdmVyc2lvbiBpZiB0aGUgc3lzdGVtIHBvc3Nlc3NlcyBhIHdha2UgdXAgZmlmby4KLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9HRU9NQUdORVRJQ19GSUVMRCAgICAgICAgICAgICAgICAoMikKLSNkZWZpbmUgU0VOU09SX1RZUEVfTUFHTkVUSUNfRklFTEQgIFNFTlNPUl9UWVBFX0dFT01BR05FVElDX0ZJRUxECi0jZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9NQUdORVRJQ19GSUVMRCAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5tYWduZXRpY19maWVsZCIKLQotLyoKLSAqIFNFTlNPUl9UWVBFX09SSUVOVEFUSU9OCi0gKiByZXBvcnRpbmctbW9kZTogY29udGludW91cwotICoKLSAqIEFsbCB2YWx1ZXMgYXJlIGFuZ2xlcyBpbiBkZWdyZWVzLgotICoKLSAqIE9yaWVudGF0aW9uIHNlbnNvcnMgcmV0dXJuIHNlbnNvciBldmVudHMgZm9yIGFsbCAzIGF4ZXMgYXQgYSBjb25zdGFudAotICogcmF0ZSBkZWZpbmVkIGJ5IHNldERlbGF5KCkuCi0gKgotICogSW1wbGVtZW50IHRoZSBub24td2FrZS11cCB2ZXJzaW9uIG9mIHRoaXMgc2Vuc29yIGFuZCBpbXBsZW1lbnQgdGhlIHdha2UtdXAKLSAqIHZlcnNpb24gaWYgdGhlIHN5c3RlbSBwb3NzZXNzZXMgYSB3YWtlIHVwIGZpZm8uCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfT1JJRU5UQVRJT04gICAgICAgICAgICAgICAgICAgICAgKDMpCi0jZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9PUklFTlRBVElPTiAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5vcmllbnRhdGlvbiIKLQotLyoKLSAqIFNFTlNPUl9UWVBFX0dZUk9TQ09QRQotICogcmVwb3J0aW5nLW1vZGU6IGNvbnRpbnVvdXMKLSAqCi0gKiAgQWxsIHZhbHVlcyBhcmUgaW4gcmFkaWFucy9zZWNvbmQgYW5kIG1lYXN1cmUgdGhlIHJhdGUgb2Ygcm90YXRpb24KLSAqICBhcm91bmQgdGhlIFgsIFkgYW5kIFogYXhpcy4KLSAqCi0gKiAgSW1wbGVtZW50IHRoZSBub24td2FrZS11cCB2ZXJzaW9uIG9mIHRoaXMgc2Vuc29yIGFuZCBpbXBsZW1lbnQgdGhlIHdha2UtdXAKLSAqICB2ZXJzaW9uIGlmIHRoZSBzeXN0ZW0gcG9zc2Vzc2VzIGEgd2FrZSB1cCBmaWZvLgotICovCi0jZGVmaW5lIFNFTlNPUl9UWVBFX0dZUk9TQ09QRSAgICAgICAgICAgICAgICAgICAgICAgICg0KQotI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfR1lST1NDT1BFICAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IuZ3lyb3Njb3BlIgotCi0vKgotICogU0VOU09SX1RZUEVfTElHSFQKLSAqIHJlcG9ydGluZy1tb2RlOiBvbi1jaGFuZ2UKLSAqCi0gKiBUaGUgbGlnaHQgc2Vuc29yIHZhbHVlIGlzIHJldHVybmVkIGluIFNJIGx1eCB1bml0cy4KLSAqCi0gKiBCb3RoIHdha2UtdXAgYW5kIG5vbiB3YWtlLXVwIHZlcnNpb25zIGFyZSB1c2VmdWwuCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfTElHSFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDUpCi0jZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9MSUdIVCAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5saWdodCIKLQotLyoKLSAqIFNFTlNPUl9UWVBFX1BSRVNTVVJFCi0gKiByZXBvcnRpbmctbW9kZTogY29udGludW91cwotICoKLSAqIFRoZSBwcmVzc3VyZSBzZW5zb3IgcmV0dXJuIHRoZSBhdGhtb3NwaGVyaWMgcHJlc3N1cmUgaW4gaGVjdG9wYXNjYWwgKGhQYSkKLSAqCi0gKiBJbXBsZW1lbnQgdGhlIG5vbi13YWtlLXVwIHZlcnNpb24gb2YgdGhpcyBzZW5zb3IgYW5kIGltcGxlbWVudCB0aGUgd2FrZS11cAotICogdmVyc2lvbiBpZiB0aGUgc3lzdGVtIHBvc3Nlc3NlcyBhIHdha2UgdXAgZmlmby4KLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9QUkVTU1VSRSAgICAgICAgICAgICAgICAgICAgICAgICAoNikKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX1BSRVNTVVJFICAgICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLnByZXNzdXJlIgotCi0vKiBTRU5TT1JfVFlQRV9URU1QRVJBVFVSRSBpcyBkZXByZWNhdGVkIGluIHRoZSBIQUwgKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfVEVNUEVSQVRVUkUgICAgICAgICAgICAgICAgICAgICAgKDcpCi0jZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9URU1QRVJBVFVSRSAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci50ZW1wZXJhdHVyZSIKLQotLyoKLSAqIFNFTlNPUl9UWVBFX1BST1hJTUlUWQotICogcmVwb3J0aW5nLW1vZGU6IG9uLWNoYW5nZQotICoKLSAqIFRoZSBwcm94aW1pdHkgc2Vuc29yIHdoaWNoIHR1cm5zIHRoZSBzY3JlZW4gb2ZmIGFuZCBiYWNrIG9uIGR1cmluZyBjYWxscyBpcyB0aGUKLSAqIHdha2UtdXAgcHJveGltaXR5IHNlbnNvci4gSW1wbGVtZW50IHdha2UtdXAgcHJveGltaXR5IHNlbnNvciBiZWZvcmUgaW1wbGVtZW50aW5nCi0gKiBhIG5vbiB3YWtlLXVwIHByb3hpbWl0eSBzZW5zb3IuIEZvciB0aGUgd2FrZS11cCBwcm94aW1pdHkgc2Vuc29yIHNldCB0aGUgZmxhZwotICogU0VOU09SX0ZMQUdfV0FLRV9VUC4KLSAqIFRoZSB2YWx1ZSBjb3JyZXNwb25kcyB0byB0aGUgZGlzdGFuY2UgdG8gdGhlIG5lYXJlc3Qgb2JqZWN0IGluIGNlbnRpbWV0ZXJzLgotICovCi0jZGVmaW5lIFNFTlNPUl9UWVBFX1BST1hJTUlUWSAgICAgICAgICAgICAgICAgICAgICAgICg4KQotI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfUFJPWElNSVRZICAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IucHJveGltaXR5IgotCi0vKgotICogU0VOU09SX1RZUEVfR1JBVklUWQotICogcmVwb3J0aW5nLW1vZGU6IGNvbnRpbnVvdXMKLSAqCi0gKiBBIGdyYXZpdHkgb3V0cHV0IGluZGljYXRlcyB0aGUgZGlyZWN0aW9uIG9mIGFuZCBtYWduaXR1ZGUgb2YgZ3Jhdml0eSBpbgotICogdGhlIGRldmljZXMncyBjb29yZGluYXRlcy4KLSAqCi0gKiBJbXBsZW1lbnQgdGhlIG5vbi13YWtlLXVwIHZlcnNpb24gb2YgdGhpcyBzZW5zb3IgYW5kIGltcGxlbWVudCB0aGUgd2FrZS11cAotICogdmVyc2lvbiBpZiB0aGUgc3lzdGVtIHBvc3Nlc3NlcyBhIHdha2UgdXAgZmlmby4KLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9HUkFWSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAoOSkKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0dSQVZJVFkgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLmdyYXZpdHkiCi0KLS8qCi0gKiBTRU5TT1JfVFlQRV9MSU5FQVJfQUNDRUxFUkFUSU9OCi0gKiByZXBvcnRpbmctbW9kZTogY29udGludW91cwotICoKLSAqIEluZGljYXRlcyB0aGUgbGluZWFyIGFjY2VsZXJhdGlvbiBvZiB0aGUgZGV2aWNlIGluIGRldmljZSBjb29yZGluYXRlcywKLSAqIG5vdCBpbmNsdWRpbmcgZ3Jhdml0eS4KLSAqCi0gKiBJbXBsZW1lbnQgdGhlIG5vbi13YWtlLXVwIHZlcnNpb24gb2YgdGhpcyBzZW5zb3IgYW5kIGltcGxlbWVudCB0aGUgd2FrZS11cAotICogdmVyc2lvbiBpZiB0aGUgc3lzdGVtIHBvc3Nlc3NlcyBhIHdha2UgdXAgZmlmby4KLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9MSU5FQVJfQUNDRUxFUkFUSU9OICAgICAgICAgICAgICgxMCkKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0xJTkVBUl9BQ0NFTEVSQVRJT04gICAgICAiYW5kcm9pZC5zZW5zb3IubGluZWFyX2FjY2VsZXJhdGlvbiIKLQotCi0vKgotICogU0VOU09SX1RZUEVfUk9UQVRJT05fVkVDVE9SCi0gKiByZXBvcnRpbmctbW9kZTogY29udGludW91cwotICoKLSAqIFRoZSByb3RhdGlvbiB2ZWN0b3Igc3ltYm9saXplcyB0aGUgb3JpZW50YXRpb24gb2YgdGhlIGRldmljZSByZWxhdGl2ZSB0byB0aGUKLSAqIEVhc3QtTm9ydGgtVXAgY29vcmRpbmF0ZXMgZnJhbWUuCi0gKgotICogSW1wbGVtZW50IHRoZSBub24td2FrZS11cCB2ZXJzaW9uIG9mIHRoaXMgc2Vuc29yIGFuZCBpbXBsZW1lbnQgdGhlIHdha2UtdXAKLSAqIHZlcnNpb24gaWYgdGhlIHN5c3RlbSBwb3NzZXNzZXMgYSB3YWtlIHVwIGZpZm8uCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfUk9UQVRJT05fVkVDVE9SICAgICAgICAgICAgICAgICAoMTEpCi0jZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9ST1RBVElPTl9WRUNUT1IgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLnJvdGF0aW9uX3ZlY3RvciIKLQotLyoKLSAqIFNFTlNPUl9UWVBFX1JFTEFUSVZFX0hVTUlESVRZCi0gKiByZXBvcnRpbmctbW9kZTogb24tY2hhbmdlCi0gKgotICogQSByZWxhdGl2ZSBodW1pZGl0eSBzZW5zb3IgbWVhc3VyZXMgcmVsYXRpdmUgYW1iaWVudCBhaXIgaHVtaWRpdHkgYW5kCi0gKiByZXR1cm5zIGEgdmFsdWUgaW4gcGVyY2VudC4KLSAqCi0gKiBCb3RoIHdha2UtdXAgYW5kIG5vbiB3YWtlLXVwIHZlcnNpb25zIGFyZSB1c2VmdWwuCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfUkVMQVRJVkVfSFVNSURJVFkgICAgICAgICAgICAgICAoMTIpCi0jZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9SRUxBVElWRV9IVU1JRElUWSAgICAgICAgImFuZHJvaWQuc2Vuc29yLnJlbGF0aXZlX2h1bWlkaXR5IgotCi0vKgotICogU0VOU09SX1RZUEVfQU1CSUVOVF9URU1QRVJBVFVSRQotICogcmVwb3J0aW5nLW1vZGU6IG9uLWNoYW5nZQotICoKLSAqIFRoZSBhbWJpZW50IChyb29tKSB0ZW1wZXJhdHVyZSBpbiBkZWdyZWUgQ2Vsc2l1cy4KLSAqCi0gKiBCb3RoIHdha2UtdXAgYW5kIG5vbiB3YWtlLXVwIHZlcnNpb25zIGFyZSB1c2VmdWwuCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfQU1CSUVOVF9URU1QRVJBVFVSRSAgICAgICAgICAgICAoMTMpCi0jZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9BTUJJRU5UX1RFTVBFUkFUVVJFICAgICAgImFuZHJvaWQuc2Vuc29yLmFtYmllbnRfdGVtcGVyYXR1cmUiCi0KLS8qCi0gKiBTRU5TT1JfVFlQRV9NQUdORVRJQ19GSUVMRF9VTkNBTElCUkFURUQKLSAqIHJlcG9ydGluZy1tb2RlOiBjb250aW51b3VzCi0gKgotICogIFNpbWlsYXIgdG8gU0VOU09SX1RZUEVfTUFHTkVUSUNfRklFTEQsIGJ1dCB0aGUgaGFyZCBpcm9uIGNhbGlicmF0aW9uIGlzCi0gKiAgcmVwb3J0ZWQgc2VwYXJhdGVseSBpbnN0ZWFkIG9mIGJlaW5nIGluY2x1ZGVkIGluIHRoZSBtZWFzdXJlbWVudC4KLSAqCi0gKiAgSW1wbGVtZW50IHRoZSBub24td2FrZS11cCB2ZXJzaW9uIG9mIHRoaXMgc2Vuc29yIGFuZCBpbXBsZW1lbnQgdGhlIHdha2UtdXAKLSAqICB2ZXJzaW9uIGlmIHRoZSBzeXN0ZW0gcG9zc2Vzc2VzIGEgd2FrZSB1cCBmaWZvLgotICovCi0jZGVmaW5lIFNFTlNPUl9UWVBFX01BR05FVElDX0ZJRUxEX1VOQ0FMSUJSQVRFRCAgICAgKDE0KQotI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfTUFHTkVUSUNfRklFTERfVU5DQUxJQlJBVEVEICJhbmRyb2lkLnNlbnNvci5tYWduZXRpY19maWVsZF91bmNhbGlicmF0ZWQiCi0KLS8qCi0gKiBTRU5TT1JfVFlQRV9HQU1FX1JPVEFUSU9OX1ZFQ1RPUgotICogcmVwb3J0aW5nLW1vZGU6IGNvbnRpbnVvdXMKLSAqCi0gKiAgU2ltaWxhciB0byBTRU5TT1JfVFlQRV9ST1RBVElPTl9WRUNUT1IsIGJ1dCBub3QgdXNpbmcgdGhlIGdlb21hZ25ldGljCi0gKiAgZmllbGQuCi0gKgotICogIEltcGxlbWVudCB0aGUgbm9uLXdha2UtdXAgdmVyc2lvbiBvZiB0aGlzIHNlbnNvciBhbmQgaW1wbGVtZW50IHRoZSB3YWtlLXVwCi0gKiAgdmVyc2lvbiBpZiB0aGUgc3lzdGVtIHBvc3Nlc3NlcyBhIHdha2UgdXAgZmlmby4KLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9HQU1FX1JPVEFUSU9OX1ZFQ1RPUiAgICAgICAgICAgICgxNSkKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0dBTUVfUk9UQVRJT05fVkVDVE9SICAgICAiYW5kcm9pZC5zZW5zb3IuZ2FtZV9yb3RhdGlvbl92ZWN0b3IiCi0KLS8qCi0gKiBTRU5TT1JfVFlQRV9HWVJPU0NPUEVfVU5DQUxJQlJBVEVECi0gKiByZXBvcnRpbmctbW9kZTogY29udGludW91cwotICoKLSAqICBBbGwgdmFsdWVzIGFyZSBpbiByYWRpYW5zL3NlY29uZCBhbmQgbWVhc3VyZSB0aGUgcmF0ZSBvZiByb3RhdGlvbgotICogIGFyb3VuZCB0aGUgWCwgWSBhbmQgWiBheGlzLgotICoKLSAqICBJbXBsZW1lbnQgdGhlIG5vbi13YWtlLXVwIHZlcnNpb24gb2YgdGhpcyBzZW5zb3IgYW5kIGltcGxlbWVudCB0aGUgd2FrZS11cAotICogIHZlcnNpb24gaWYgdGhlIHN5c3RlbSBwb3NzZXNzZXMgYSB3YWtlIHVwIGZpZm8uCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfR1lST1NDT1BFX1VOQ0FMSUJSQVRFRCAgICAgICAgICAoMTYpCi0jZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9HWVJPU0NPUEVfVU5DQUxJQlJBVEVEICAgImFuZHJvaWQuc2Vuc29yLmd5cm9zY29wZV91bmNhbGlicmF0ZWQiCi0KLS8qCi0gKiBTRU5TT1JfVFlQRV9TSUdOSUZJQ0FOVF9NT1RJT04KLSAqIHJlcG9ydGluZy1tb2RlOiBvbmUtc2hvdAotICoKLSAqIEEgc2Vuc29yIG9mIHRoaXMgdHlwZSB0cmlnZ2VycyBhbiBldmVudCBlYWNoIHRpbWUgc2lnbmlmaWNhbnQgbW90aW9uCi0gKiBpcyBkZXRlY3RlZCBhbmQgYXV0b21hdGljYWxseSBkaXNhYmxlcyBpdHNlbGYuCi0gKiBGb3IgU2lnbmlmaWNhbnQgTW90aW9uIHNlbnNvciB0byBiZSB1c2VmdWwsIGl0IG11c3QgYmUgZGVmaW5lZCBhcyBhCi0gKiB3YWtlLXVwIHNlbnNvci4gKHNldCBTRU5TT1JfRkxBR19XQUtFX1VQKS4gSW1wbGVtZW50IHRoZSB3YWtlLXVwIHNpZ25pZmljYW50IG1vdGlvbgotICogc2Vuc29yLiBBIG5vbiB3YWtlLXVwIHZlcnNpb24gaXMgbm90IHVzZWZ1bC4KLSAqIFRoZSBvbmx5IGFsbG93ZWQgdmFsdWUgdG8gcmV0dXJuIGlzIDEuMC4KLSAqLwotCi0jZGVmaW5lIFNFTlNPUl9UWVBFX1NJR05JRklDQU5UX01PVElPTiAgICAgICAgICAgICAgKDE3KQotI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfU0lHTklGSUNBTlRfTU9USU9OICAgICAgICJhbmRyb2lkLnNlbnNvci5zaWduaWZpY2FudF9tb3Rpb24iCi0KLS8qCi0gKiBTRU5TT1JfVFlQRV9TVEVQX0RFVEVDVE9SCi0gKiByZXBvcnRpbmctbW9kZTogc3BlY2lhbAotICoKLSAqIEEgc2Vuc29yIG9mIHRoaXMgdHlwZSB0cmlnZ2VycyBhbiBldmVudCBlYWNoIHRpbWUgYSBzdGVwIGlzIHRha2VuCi0gKiBieSB0aGUgdXNlci4gVGhlIG9ubHkgYWxsb3dlZCB2YWx1ZSB0byByZXR1cm4gaXMgMS4wIGFuZCBhbiBldmVudAotICogaXMgZ2VuZXJhdGVkIGZvciBlYWNoIHN0ZXAuCi0gKgotICogQm90aCB3YWtlLXVwIGFuZCBub24gd2FrZS11cCB2ZXJzaW9ucyBhcmUgdXNlZnVsLgotICovCi0KLSNkZWZpbmUgU0VOU09SX1RZUEVfU1RFUF9ERVRFQ1RPUiAgICAgICAgICAgICAgICAgICAoMTgpCi0jZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9TVEVQX0RFVEVDVE9SICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLnN0ZXBfZGV0ZWN0b3IiCi0KLQotLyoKLSAqIFNFTlNPUl9UWVBFX1NURVBfQ09VTlRFUgotICogcmVwb3J0aW5nLW1vZGU6IG9uLWNoYW5nZQotICoKLSAqIEEgc2Vuc29yIG9mIHRoaXMgdHlwZSByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3RlcHMgdGFrZW4gYnkgdGhlIHVzZXIgc2luY2UKLSAqIHRoZSBsYXN0IHJlYm9vdCB3aGlsZSBhY3RpdmF0ZWQuIFRoZSB2YWx1ZSBpcyByZXR1cm5lZCBhcyBhIHVpbnQ2NF90IGFuZCBpcwotICogcmVzZXQgdG8gemVybyBvbmx5IG9uIGEgc3lzdGVtIC8gYW5kcm9pZCByZWJvb3QuCi0gKgotICogSW1wbGVtZW50IHRoZSBub24td2FrZS11cCB2ZXJzaW9uIG9mIHRoaXMgc2Vuc29yIGFuZCBpbXBsZW1lbnQgdGhlIHdha2UtdXAKLSAqIHZlcnNpb24gaWYgdGhlIHN5c3RlbSBwb3NzZXNzZXMgYSB3YWtlIHVwIGZpZm8uCi0gKi8KLQotI2RlZmluZSBTRU5TT1JfVFlQRV9TVEVQX0NPVU5URVIgICAgICAgICAgICAgICAgICAgICgxOSkKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX1NURVBfQ09VTlRFUiAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3Iuc3RlcF9jb3VudGVyIgotCi0vKgotICogU0VOU09SX1RZUEVfR0VPTUFHTkVUSUNfUk9UQVRJT05fVkVDVE9SCi0gKiByZXBvcnRpbmctbW9kZTogY29udGludW91cwotICoKLSAqICBTaW1pbGFyIHRvIFNFTlNPUl9UWVBFX1JPVEFUSU9OX1ZFQ1RPUiwgYnV0IHVzaW5nIGEgbWFnbmV0b21ldGVyIGluc3RlYWQKLSAqICBvZiB1c2luZyBhIGd5cm9zY29wZS4KLSAqCi0gKiBJbXBsZW1lbnQgdGhlIG5vbi13YWtlLXVwIHZlcnNpb24gb2YgdGhpcyBzZW5zb3IgYW5kIGltcGxlbWVudCB0aGUgd2FrZS11cAotICogdmVyc2lvbiBpZiB0aGUgc3lzdGVtIHBvc3Nlc3NlcyBhIHdha2UgdXAgZmlmby4KLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9HRU9NQUdORVRJQ19ST1RBVElPTl9WRUNUT1IgICAgICgyMCkKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0dFT01BR05FVElDX1JPVEFUSU9OX1ZFQ1RPUiAiYW5kcm9pZC5zZW5zb3IuZ2VvbWFnbmV0aWNfcm90YXRpb25fdmVjdG9yIgotCi0vKgotICogU0VOU09SX1RZUEVfSEVBUlRfUkFURQotICogcmVwb3J0aW5nLW1vZGU6IG9uLWNoYW5nZQotICoKLSAqICBBIHNlbnNvciBvZiB0aGlzIHR5cGUgcmV0dXJucyB0aGUgY3VycmVudCBoZWFydCByYXRlLgotICogIFRoZSBldmVudHMgY29udGFpbiB0aGUgY3VycmVudCBoZWFydCByYXRlIGluIGJlYXRzIHBlciBtaW51dGUgKEJQTSkgYW5kIHRoZQotICogIHN0YXR1cyBvZiB0aGUgc2Vuc29yIGR1cmluZyB0aGUgbWVhc3VyZW1lbnQuIFNlZSBoZWFydF9yYXRlX2V2ZW50X3QgZm9yIG1vcmUKLSAqICBkZXRhaWxzLgotICoKLSAqICBCZWNhdXNlIHRoaXMgc2Vuc29yIGlzIG9uLWNoYW5nZSwgZXZlbnRzIG11c3QgYmUgZ2VuZXJhdGVkIHdoZW4gYW5kIG9ubHkKLSAqICB3aGVuIGhlYXJ0X3JhdGUuYnBtIG9yIGhlYXJ0X3JhdGUuc3RhdHVzIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdAotICogIGV2ZW50LiBJbiBwYXJ0aWN1bGFyLCB1cG9uIHRoZSBmaXJzdCBhY3RpdmF0aW9uLCB1bmxlc3MgdGhlIGRldmljZSBpcyBrbm93bgotICogIHRvIG5vdCBiZSBvbiB0aGUgYm9keSwgdGhlIHN0YXR1cyBmaWVsZCBvZiB0aGUgZmlyc3QgZXZlbnQgbXVzdCBiZSBzZXQgdG8KLSAqICBTRU5TT1JfU1RBVFVTX1VOUkVMSUFCTEUuIFRoZSBldmVudCBzaG91bGQgYmUgZ2VuZXJhdGVkIG5vIGZhc3RlciB0aGFuIGV2ZXJ5Ci0gKiAgcGVyaW9kX25zIHBhc3NlZCB0byBzZXREZWxheSgpIG9yIHRvIGJhdGNoKCkuCi0gKiAgU2VlIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBvbi1jaGFuZ2UgcmVwb3J0aW5nIG1vZGUgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKgotICogIHNlbnNvcl90LnJlcXVpcmVkUGVybWlzc2lvbiBtdXN0IGJlIHNldCB0byBTRU5TT1JfUEVSTUlTU0lPTl9CT0RZX1NFTlNPUlMuCi0gKgotICogIEJvdGggd2FrZS11cCBhbmQgbm9uIHdha2UtdXAgdmVyc2lvbnMgYXJlIHVzZWZ1bC4KLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9IRUFSVF9SQVRFICAgICAgICAgICAgICAgICAgICAgICgyMSkKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0hFQVJUX1JBVEUgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IuaGVhcnRfcmF0ZSIKLQotLyoKLSAqIFNFTlNPUl9UWVBFX1dBS0VfVVBfVElMVF9ERVRFQ1RPUgotICogcmVwb3J0aW5nLW1vZGU6IHNwZWNpYWwgKHNldERlbGF5IGhhcyBubyBpbXBhY3QpCi0gKgotICogQSBzZW5zb3Igb2YgdGhpcyB0eXBlIGdlbmVyYXRlcyBhbiBldmVudCBlYWNoIHRpbWUgYSB0aWx0IGV2ZW50IGlzIGRldGVjdGVkLiBBIHRpbHQgZXZlbnQKLSAqIHNob3VsZCBiZSBnZW5lcmF0ZWQgaWYgdGhlIGRpcmVjdGlvbiBvZiB0aGUgMi1zZWNvbmRzIHdpbmRvdyBhdmVyYWdlIGdyYXZpdHkgY2hhbmdlZCBieSBhdCBsZWFzdAotICogMzUgZGVncmVlcyBzaW5jZSB0aGUgYWN0aXZhdGlvbiBvciB0aGUgbGFzdCB0cmlnZ2VyIG9mIHRoZSBzZW5zb3IuCi0gKiAgICAgcmVmZXJlbmNlX2VzdGltYXRlZF9ncmF2aXR5ID0gYXZlcmFnZSBvZiBhY2NlbGVyb21ldGVyIG1lYXN1cmVtZW50cyBvdmVyIHRoZSBmaXJzdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIHNlY29uZCBhZnRlciBhY3RpdmF0aW9uIG9yIHRoZSBlc3RpbWF0ZWQgZ3Jhdml0eSBhdCB0aGUgbGFzdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyLgotICogICAgIGN1cnJlbnRfZXN0aW1hdGVkX2dyYXZpdHkgPSBhdmVyYWdlIG9mIGFjY2VsZXJvbWV0ZXIgbWVhc3VyZW1lbnRzIG92ZXIgdGhlIGxhc3QgMiBzZWNvbmRzLgotICogICAgIHRyaWdnZXIgd2hlbiBhbmdsZSAocmVmZXJlbmNlX2VzdGltYXRlZF9ncmF2aXR5LCBjdXJyZW50X2VzdGltYXRlZF9ncmF2aXR5KSA+IDM1IGRlZ3JlZXMKLSAqCi0gKiBMYXJnZSBhY2NlbGVyYXRpb25zIHdpdGhvdXQgYSBjaGFuZ2UgaW4gcGhvbmUgb3JpZW50YXRpb24gc2hvdWxkIG5vdCB0cmlnZ2VyIGEgdGlsdCBldmVudC4KLSAqIEZvciBleGFtcGxlLCBhIHNoYXJwIHR1cm4gb3Igc3Ryb25nIGFjY2VsZXJhdGlvbiB3aGlsZSBkcml2aW5nIGEgY2FyIHNob3VsZCBub3QgdHJpZ2dlciBhIHRpbHQKLSAqIGV2ZW50LCBldmVuIHRob3VnaCB0aGUgYW5nbGUgb2YgdGhlIGF2ZXJhZ2UgYWNjZWxlcmF0aW9uIG1pZ2h0IHZhcnkgYnkgbW9yZSB0aGFuIDM1IGRlZ3JlZXMuCi0gKgotICogVHlwaWNhbGx5LCB0aGlzIHNlbnNvciBpcyBpbXBsZW1lbnRlZCB3aXRoIHRoZSBoZWxwIG9mIG9ubHkgYW4gYWNjZWxlcm9tZXRlci4gT3RoZXIgc2Vuc29ycyBjYW4KLSAqIGJlIHVzZWQgYXMgd2VsbCBpZiB0aGV5IGRvIG5vdCBpbmNyZWFzZSB0aGUgcG93ZXIgY29uc3VtcHRpb24gc2lnbmlmaWNhbnRseS4gVGhpcyBpcyBhIGxvdyBwb3dlcgotICogc2Vuc29yIHRoYXQgc2hvdWxkIGFsbG93IHRoZSBBUCB0byBnbyBpbnRvIHN1c3BlbmQgbW9kZS4gRG8gbm90IGVtdWxhdGUgdGhpcyBzZW5zb3IgaW4gdGhlIEhBTC4KLSAqIExpa2Ugb3RoZXIgd2FrZSB1cCBzZW5zb3JzLCB0aGUgZHJpdmVyIGlzIGV4cGVjdGVkIHRvIGEgaG9sZCBhIHdha2VfbG9jayB3aXRoIGEgdGltZW91dCBvZiAyMDAgbXMKLSAqIHdoaWxlIHJlcG9ydGluZyB0aGlzIGV2ZW50LiBUaGUgb25seSBhbGxvd2VkIHJldHVybiB2YWx1ZSBpcyAxLjAuCi0gKgotICogSW1wbGVtZW50IG9ubHkgdGhlIHdha2UtdXAgdmVyc2lvbiBvZiB0aGlzIHNlbnNvci4KLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9USUxUX0RFVEVDVE9SICAgICAgICAgICAgICAgICAgICAgICgyMikKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX1RJTFRfREVURUNUT1IgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IudGlsdF9kZXRlY3RvciIKLQotLyoKLSAqIFNFTlNPUl9UWVBFX1dBS0VfR0VTVFVSRQotICogcmVwb3J0aW5nLW1vZGU6IG9uZS1zaG90Ci0gKgotICogQSBzZW5zb3IgZW5hYmxpbmcgd2FraW5nIHVwIHRoZSBkZXZpY2UgYmFzZWQgb24gYSBkZXZpY2Ugc3BlY2lmaWMgbW90aW9uLgotICoKLSAqIFdoZW4gdGhpcyBzZW5zb3IgdHJpZ2dlcnMsIHRoZSBkZXZpY2UgYmVoYXZlcyBhcyBpZiB0aGUgcG93ZXIgYnV0dG9uIHdhcwotICogcHJlc3NlZCwgdHVybmluZyB0aGUgc2NyZWVuIG9uLiBUaGlzIGJlaGF2aW9yICh0dXJuaW5nIG9uIHRoZSBzY3JlZW4gd2hlbgotICogdGhpcyBzZW5zb3IgdHJpZ2dlcnMpIG1pZ2h0IGJlIGRlYWN0aXZhdGVkIGJ5IHRoZSB1c2VyIGluIHRoZSBkZXZpY2UKLSAqIHNldHRpbmdzLiBDaGFuZ2VzIGluIHNldHRpbmdzIGRvIG5vdCBpbXBhY3QgdGhlIGJlaGF2aW9yIG9mIHRoZSBzZW5zb3I6Ci0gKiBvbmx5IHdoZXRoZXIgdGhlIGZyYW1ld29yayB0dXJucyB0aGUgc2NyZWVuIG9uIHdoZW4gaXQgdHJpZ2dlcnMuCi0gKgotICogVGhlIGFjdHVhbCBnZXN0dXJlIHRvIGJlIGRldGVjdGVkIGlzIG5vdCBzcGVjaWZpZWQsIGFuZCBjYW4gYmUgY2hvc2VuIGJ5Ci0gKiB0aGUgbWFudWZhY3R1cmVyIG9mIHRoZSBkZXZpY2UuCi0gKiBUaGlzIHNlbnNvciBtdXN0IGJlIGxvdyBwb3dlciwgYXMgaXQgaXMgbGlrZWx5IHRvIGJlIGFjdGl2YXRlZCAyNC83LgotICogVGhlIG9ubHkgYWxsb3dlZCB2YWx1ZSB0byByZXR1cm4gaXMgMS4wLgotICoKLSAqIEltcGxlbWVudCBvbmx5IHRoZSB3YWtlLXVwIHZlcnNpb24gb2YgdGhpcyBzZW5zb3IuCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfV0FLRV9HRVNUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyMykKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX1dBS0VfR0VTVFVSRSAgICAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci53YWtlX2dlc3R1cmUiCi0KLS8qCi0gKiBTRU5TT1JfVFlQRV9HTEFOQ0VfR0VTVFVSRQotICogcmVwb3J0aW5nLW1vZGU6IG9uZS1zaG90Ci0gKgotICogQSBzZW5zb3IgZW5hYmxpbmcgYnJpZWZseSB0dXJuaW5nIHRoZSBzY3JlZW4gb24gdG8gZW5hYmxlIHRoZSB1c2VyIHRvCi0gKiBnbGFuY2UgY29udGVudCBvbiBzY3JlZW4gYmFzZWQgb24gYSBzcGVjaWZpYyBtb3Rpb24uICBUaGUgZGV2aWNlIHNob3VsZAotICogdHVybiB0aGUgc2NyZWVuIG9mZiBhZnRlciBhIGZldyBtb21lbnRzLgotICoKLSAqIFdoZW4gdGhpcyBzZW5zb3IgdHJpZ2dlcnMsIHRoZSBkZXZpY2UgdHVybnMgdGhlIHNjcmVlbiBvbiBtb21lbnRhcmlseQotICogdG8gYWxsb3cgdGhlIHVzZXIgdG8gZ2xhbmNlIG5vdGlmaWNhdGlvbnMgb3Igb3RoZXIgY29udGVudCB3aGlsZSB0aGUKLSAqIGRldmljZSByZW1haW5zIGxvY2tlZCBpbiBhIG5vbi1pbnRlcmFjdGl2ZSBzdGF0ZSAoZG96aW5nKS4gVGhpcyBiZWhhdmlvcgotICogKGJyaWVmbHkgdHVybmluZyBvbiB0aGUgc2NyZWVuIHdoZW4gdGhpcyBzZW5zb3IgdHJpZ2dlcnMpIG1pZ2h0IGJlIGRlYWN0aXZhdGVkCi0gKiBieSB0aGUgdXNlciBpbiB0aGUgZGV2aWNlIHNldHRpbmdzLiBDaGFuZ2VzIGluIHNldHRpbmdzIGRvIG5vdCBpbXBhY3QgdGhlCi0gKiBiZWhhdmlvciBvZiB0aGUgc2Vuc29yOiBvbmx5IHdoZXRoZXIgdGhlIGZyYW1ld29yayBicmllZmx5IHR1cm5zIHRoZSBzY3JlZW4gb24KLSAqIHdoZW4gaXQgdHJpZ2dlcnMuCi0gKgotICogVGhlIGFjdHVhbCBnZXN0dXJlIHRvIGJlIGRldGVjdGVkIGlzIG5vdCBzcGVjaWZpZWQsIGFuZCBjYW4gYmUgY2hvc2VuIGJ5Ci0gKiB0aGUgbWFudWZhY3R1cmVyIG9mIHRoZSBkZXZpY2UuCi0gKiBUaGlzIHNlbnNvciBtdXN0IGJlIGxvdyBwb3dlciwgYXMgaXQgaXMgbGlrZWx5IHRvIGJlIGFjdGl2YXRlZCAyNC83LgotICogVGhlIG9ubHkgYWxsb3dlZCB2YWx1ZSB0byByZXR1cm4gaXMgMS4wLgotICoKLSAqIEltcGxlbWVudCBvbmx5IHRoZSB3YWtlLXVwIHZlcnNpb24gb2YgdGhpcyBzZW5zb3IuCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfR0xBTkNFX0dFU1RVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyNCkKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0dMQU5DRV9HRVNUVVJFICAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5nbGFuY2VfZ2VzdHVyZSIKLQotLyoqCi0gKiBTRU5TT1JfVFlQRV9QSUNLX1VQX0dFU1RVUkUKLSAqIHJlcG9ydGluZy1tb2RlOiBvbmUtc2hvdAotICoKLSAqIEEgc2Vuc29yIG9mIHRoaXMgdHlwZSB0cmlnZ2VycyB3aGVuIHRoZSBkZXZpY2UgaXMgcGlja2VkIHVwIHJlZ2FyZGxlc3Mgb2Ygd2hlcmV2ZXIgaXMgd2FzCi0gKiBiZWZvcmUgKGRlc2ssIHBvY2tldCwgYmFnKS4gVGhlIG9ubHkgYWxsb3dlZCByZXR1cm4gdmFsdWUgaXMgMS4wLgotICogVGhpcyBzZW5zb3IgZGUtYWN0aXZhdGVzIGl0c2VsZiBpbW1lZGlhdGVseSBhZnRlciBpdCB0cmlnZ2Vycy4KLSAqCi0gKiBJbXBsZW1lbnQgb25seSB0aGUgd2FrZS11cCB2ZXJzaW9uIG9mIHRoaXMgc2Vuc29yLgotICovCi0jZGVmaW5lIFNFTlNPUl9UWVBFX1BJQ0tfVVBfR0VTVFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMjUpCi0jZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9QSUNLX1VQX0dFU1RVUkUgICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IucGlja191cF9nZXN0dXJlIgotCi0vKgotICogU0VOU09SX1RZUEVfV1JJU1RfVElMVF9HRVNUVVJFCi0gKiB0cmlnZ2VyLW1vZGU6IHNwZWNpYWwKLSAqIHdha2UtdXAgc2Vuc29yOiB5ZXMKLSAqCi0gKiBBIHNlbnNvciBvZiB0aGlzIHR5cGUgdHJpZ2dlcnMgYW4gZXZlbnQgZWFjaCB0aW1lIGEgdGlsdCBvZiB0aGUgd3Jpc3Qtd29ybgotICogZGV2aWNlIGlzIGRldGVjdGVkLgotICoKLSAqIFRoaXMgc2Vuc29yIG11c3QgYmUgbG93IHBvd2VyLCBhcyBpdCBpcyBsaWtlbHkgdG8gYmUgYWN0aXZhdGVkIDI0LzcuCi0gKiBUaGUgb25seSBhbGxvd2VkIHZhbHVlIHRvIHJldHVybiBpcyAxLjAuCi0gKgotICogSW1wbGVtZW50IG9ubHkgdGhlIHdha2UtdXAgdmVyc2lvbiBvZiB0aGlzIHNlbnNvci4KLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9XUklTVF9USUxUX0dFU1RVUkUgICAgICAgICAgICAgICAgICAgICAgICAgKDI2KQotI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfV1JJU1RfVElMVF9HRVNUVVJFICAgICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLndyaXN0X3RpbHRfZ2VzdHVyZSIKLQotLyoKLSAqIFNFTlNPUl9UWVBFX0RFVklDRV9PUklFTlRBVElPTgotICogcmVwb3J0aW5nLW1vZGU6IG9uLWNoYW5nZQotICoKLSAqIFRoZSBjdXJyZW50IG9yaWVudGF0aW9uIG9mIHRoZSBkZXZpY2UuIFRoZSB2YWx1ZSBzaG91bGQgYmUgcmVwb3J0ZWQgaW4gdGhlCi0gKiBmaXJzdCBlbGVtZW50IG9mIHRoZSAnZGF0YScgbWVtYmVyIHZhcmlhYmxlIGluIHNlbnNvcnNfZXZlbnRfdC4gVGhlIG9ubHkKLSAqIHZhbHVlcyB0aGF0IGNhbiBiZSByZXBvcnRlZCBhcmUgKHBsZWFzZSByZWZlciB0byBBbmRyb2lkIFNlbnNvciBDb29yZGluYXRlCi0gKiBTeXN0ZW0gdG8gdW5kZXJzdGFuZCB0aGUgWCBhbmQgWSBheGlzIGRpcmVjdGlvbiB3aXRoIHJlc3BlY3QgdG8gZGVmYXVsdAotICogb3JpZW50YXRpb24pOgotICogIC0gMDogZGV2aWNlIGlzIGluIGRlZmF1bHQgb3JpZW50YXRpb24gKFkgYXhpcyBpcyB2ZXJ0aWNhbCBhbmQgcG9pbnRzIHVwKQotICogIC0gMTogZGV2aWNlIGlzIHJvdGF0ZWQgOTAgZGVncmVlcyBjb3VudGVyLWNsb2Nrd2lzZSBmcm9tIGRlZmF1bHQKLSAqICAgICAgIG9yaWVudGF0aW9uIChYIGF4aXMgaXMgdmVydGljYWwgYW5kIHBvaW50cyB1cCkKLSAqICAtIDI6IGRldmljZSBpcyByb3RhdGVkIDE4MCBkZWdyZWVzIGZyb20gZGVmYXVsdCBvcmllbnRhdGlvbiAoWSBheGlzIGlzCi0gKiAgICAgICB2ZXJ0aWNhbCBhbmQgcG9pbnRzIGRvd24pCi0gKiAgLSAzOiBkZXZpY2UgaXMgcm90YXRlZCA5MCBkZWdyZWVzIGNsb2Nrd2lzZSBmcm9tIGRlZmF1bHQgb3JpZW50YXRpb24gKFggYXhpcwotICogICAgICAgaXMgdmVydGljYWwgYW5kIHBvaW50cyBkb3duKQotICoKLSAqIE1vdmluZyB0aGUgZGV2aWNlIHRvIGFuIG9yaWVudGF0aW9uIHdoZXJlIHRoZSBaIGF4aXMgaXMgdmVydGljYWwgKGVpdGhlciB1cAotICogb3IgZG93bikgc2hvdWxkIG5vdCBjYXVzZSBhIG5ldyBldmVudCB0byBiZSByZXBvcnRlZC4KLSAqCi0gKiBUbyBpbXByb3ZlIHRoZSB1c2VyIGV4cGVyaWVuY2Ugb2YgdGhpcyBzZW5zb3IsIGl0IGlzIHJlY29tbWVuZGVkIHRvIGltcGxlbWVudAotICogc29tZSBwaHlzaWNhbCAoaS5lLiwgcm90YXRpb24gYW5nbGUpIGFuZCB0ZW1wb3JhbCAoaS5lLiwgZGVsYXkpIGh5c3RlcmVzaXMuCi0gKiBJbiBvdGhlciB3b3JkcywgbWlub3Igb3IgdHJhbnNpZW50IHJvdGF0aW9ucyBzaG91bGQgbm90IGNhdXNlIGEgbmV3IGV2ZW50IHRvCi0gKiBiZSByZXBvcnRlZC4KLSAqCi0gKiBUaGlzIHNlbnNvciBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCB3aXRoIHRoZSBoZWxwIG9mIGFuIGFjY2VsZXJvbWV0ZXIuCi0gKiBUaGlzIGlzIGEgbG93IHBvd2VyIHNlbnNvciB0aGF0IHNob3VsZCByZWR1Y2UgdGhlIG51bWJlciBvZiBpbnRlcnJ1cHRzIG9mIHRoZQotICogQVAuIERvIG5vdCBlbXVsYXRlIHRoaXMgc2Vuc29yIGluIHRoZSBIQUwuCi0gKgotICogQm90aCB3YWtlLXVwIGFuZCBub24gd2FrZS11cCB2ZXJzaW9ucyBhcmUgdXNlZnVsLgotICovCi0jZGVmaW5lIFNFTlNPUl9UWVBFX0RFVklDRV9PUklFTlRBVElPTiAgICAgICAgICAgICAgICAgKDI3KQotI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfREVWSUNFX09SSUVOVEFUSU9OICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5kZXZpY2Vfb3JpZW50YXRpb24iCi0KLS8qCi0gKiBTRU5TT1JfVFlQRV9QT1NFXzZET0YKLSAqIHRyaWdnZXItbW9kZTogY29udGludW91cwotICoKLSAqIEEgc2Vuc29yIG9mIHRoaXMgdHlwZSByZXR1cm5zIHRoZSBwb3NlIG9mIHRoZSBkZXZpY2UuCi0gKiBQb3NlIG9mIHRoZSBkZXZpY2UgaXMgZGVmaW5lZCBhcyB0aGUgb3JpZW50YXRpb24gb2YgdGhlIGRldmljZSBmcm9tIGEKLSAqIEVhcnRoIENlbnRlcmVkIEVhcnRoIEZpeGVkIGZyYW1lIGFuZCB0aGUgdHJhbnNsYXRpb24gZnJvbSBhbiBhcmJpdHJhcnkKLSAqIHBvaW50IGF0IHN1YnNjcmlwdGlvbi4KLSAqCi0gKiBUaGlzIHNlbnNvciBjYW4gYmUgaGlnaCBwb3dlci4gSXQgY2FuIHVzZSBhbnkgYW5kIGFsbCBvZiB0aGUgZm9sbG93aW5nCi0gKiAgICAgICAgICAgLiBBY2NlbGVyb21ldGVyCi0gKiAgICAgICAgICAgLiBHeXJvc2NvcGUKLSAqICAgICAgICAgICAuIENhbWVyYQotICogICAgICAgICAgIC4gRGVwdGggQ2FtZXJhCi0gKgotICovCi0jZGVmaW5lIFNFTlNPUl9UWVBFX1BPU0VfNkRPRiAgICAgICAgICAgICAgICAgICAgICAgICAoMjgpCi0jZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9QT1NFXzZET0YgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IucG9zZV82ZG9mIgotCi0vKgotICogU0VOU09SX1RZUEVfU1RBVElPTkFSWV9ERVRFQ1QKLSAqIHRyaWdnZXIgbW9kZTogb25lIHNob3QKLSAqCi0gKiBBIHNlbnNvciBvZiB0aGlzIHR5cGUgcmV0dXJucyBhbiBldmVudCBpZiB0aGUgZGV2aWNlIGlzIHN0aWxsL3N0YXRpb25hcnkgZm9yCi0gKiBhIHdoaWxlLiBUaGUgcGVyaW9kIG9mIHRpbWUgdG8gbW9uaXRvciBmb3Igc3RhdGluYXJpdHkgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbgotICogNSBzZWNvbmRzLCBhbmQgbGVzcyB0aGFuIDEwIHNlY29uZHMuCi0gKgotICogU3RhdGlvbmFyaXR5IGhlcmUgcmVmZXJzIHRvIGFic29sdXRlIHN0YXRpb25hcml0eS4gZWc6IGRldmljZSBvbiBkZXNrLgotICoKLSAqIFRoZSBvbmx5IGFsbG93ZWQgdmFsdWUgdG8gcmV0dXJuIGlzIDEuMC4KLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9TVEFUSU9OQVJZX0RFVEVDVCAgICAgICAgICAgICAgICAgICAoMjkpCisjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9BQ0NFTEVST01FVEVSICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5hY2NlbGVyb21ldGVyIgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfTUFHTkVUSUNfRklFTEQgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IubWFnbmV0aWNfZmllbGQiCisjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9PUklFTlRBVElPTiAgICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5vcmllbnRhdGlvbiIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0dZUk9TQ09QRSAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLmd5cm9zY29wZSIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0xJR0hUICAgICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLmxpZ2h0IgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfUFJFU1NVUkUgICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IucHJlc3N1cmUiCisjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9URU1QRVJBVFVSRSAgICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci50ZW1wZXJhdHVyZSIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX1BST1hJTUlUWSAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLnByb3hpbWl0eSIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0dSQVZJVFkgICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLmdyYXZpdHkiCisjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9MSU5FQVJfQUNDRUxFUkFUSU9OICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5saW5lYXJfYWNjZWxlcmF0aW9uIgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfUk9UQVRJT05fVkVDVE9SICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3Iucm90YXRpb25fdmVjdG9yIgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfUkVMQVRJVkVfSFVNSURJVFkgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IucmVsYXRpdmVfaHVtaWRpdHkiCisjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9BTUJJRU5UX1RFTVBFUkFUVVJFICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5hbWJpZW50X3RlbXBlcmF0dXJlIgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfTUFHTkVUSUNfRklFTERfVU5DQUxJQlJBVEVEICAiYW5kcm9pZC5zZW5zb3IubWFnbmV0aWNfZmllbGRfdW5jYWxpYnJhdGVkIgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfR0FNRV9ST1RBVElPTl9WRUNUT1IgICAgICAgICAiYW5kcm9pZC5zZW5zb3IuZ2FtZV9yb3RhdGlvbl92ZWN0b3IiCisjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9HWVJPU0NPUEVfVU5DQUxJQlJBVEVEICAgICAgICJhbmRyb2lkLnNlbnNvci5neXJvc2NvcGVfdW5jYWxpYnJhdGVkIgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfU0lHTklGSUNBTlRfTU9USU9OICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3Iuc2lnbmlmaWNhbnRfbW90aW9uIgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfU1RFUF9ERVRFQ1RPUiAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3Iuc3RlcF9kZXRlY3RvciIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX1NURVBfQ09VTlRFUiAgICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLnN0ZXBfY291bnRlciIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0dFT01BR05FVElDX1JPVEFUSU9OX1ZFQ1RPUiAgImFuZHJvaWQuc2Vuc29yLmdlb21hZ25ldGljX3JvdGF0aW9uX3ZlY3RvciIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0hFQVJUX1JBVEUgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLmhlYXJ0X3JhdGUiCisjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9USUxUX0RFVEVDVE9SICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci50aWx0X2RldGVjdG9yIgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfV0FLRV9HRVNUVVJFICAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3Iud2FrZV9nZXN0dXJlIgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfR0xBTkNFX0dFU1RVUkUgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IuZ2xhbmNlX2dlc3R1cmUiCisjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9QSUNLX1VQX0dFU1RVUkUgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5waWNrX3VwX2dlc3R1cmUiCisjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9XUklTVF9USUxUX0dFU1RVUkUgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci53cmlzdF90aWx0X2dlc3R1cmUiCisjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9ERVZJQ0VfT1JJRU5UQVRJT04gICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5kZXZpY2Vfb3JpZW50YXRpb24iCisjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9QT1NFXzZET0YgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5wb3NlXzZkb2YiCiAjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9TVEFUSU9OQVJZX0RFVEVDVCAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5zdGF0aW9uYXJ5X2RldGVjdCIKLQotLyoKLSAqIFNFTlNPUl9UWVBFX01PVElPTl9ERVRFQ1QKLSAqIHRyaWdnZXIgbW9kZTogb25lIHNob3QKLSAqCi0gKiBBIHNlbnNvciBvZiB0aGlzIHR5cGUgcmV0dXJucyBhbiBldmVudCBpZiB0aGUgZGV2aWNlIGlzIG5vdCBzdGlsbCBmb3IKLSAqIGEgd2hpbGUuIFRoZSBwZXJpb2Qgb2YgdGltZSB0byBtb25pdG9yIGZvciBzdGF0aW5hcml0eSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuCi0gKiA1IHNlY29uZHMsIGFuZCBsZXNzIHRoYW4gMTAgc2Vjb25kcy4KLSAqCi0gKiBNb3Rpb24gaGVyZSByZWZlcnMgdG8gYW55IG1lY2hhbmlzbSBpbiB3aGljaCB0aGUgZGV2aWNlIGlzIGNhdXNlcyB0byBiZQotICogbW92ZWQgaW4gaXRzIGluZXJ0aWFsIGZyYW1lLiBlZzogUGlja2luIHVwIHRoZSBkZXZpY2UgYW5kIHdhbGtpbmcgd2l0aCBpdAotICogdG8gYSBuZWFyYnkgcm9vbSBtYXkgdHJpZ2dlciBtb3Rpb24gd2hlcmV3YXMga2VlcGluZyB0aGUgZGV2aWNlIG9uIGEgdGFibGUKLSAqIG9uIGEgc21vb3RoIHRyYWluIG1vdmluZyBhdCBjb25zdGFudCB2ZWxvY2l0eSBtYXkgbm90IHRyaWdnZXIgbW90aW9uLgotICoKLSAqIFRoZSBvbmx5IGFsbG93ZWQgdmFsdWUgdG8gcmV0dXJuIGlzIDEuMC4KLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9NT1RJT05fREVURUNUICAgICAgICAgICAgICAgICAgICAgICAoMzApCiAjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9NT1RJT05fREVURUNUICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5tb3Rpb25fZGV0ZWN0IgotCi0vKgotICogU0VOU09SX1RZUEVfSEVBUlRfQkVBVAotICogdHJpZ2dlciBtb2RlOiBjb250aW51b3VzCi0gKgotICogQSBzZW5zb3Igb2YgdGhpcyB0eXBlIHJldHVybnMgYW4gZXZlbnQgZXZlcnl0aW1lIGEgaGVhciBiZWF0IHBlYWsgaXMKLSAqIGRldGVjdGVkLgotICoKLSAqIFBlYWsgaGVyZSBpZGVhbGx5IGNvcnJlc3BvbmRzIHRvIHRoZSBwb3NpdGl2ZSBwZWFrIGluIHRoZSBRUlMgY29tcGxleCBvZgotICogYW5kIEVDRyBzaWduYWwuCi0gKgotICogVGhlIHNlbnNvciBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgb3B0aW1pemVkIGZvciBsYXRlbmN5LiBBcyBhIGd1aWRlLCBhCi0gKiBsYXRlbmN5IG9mIHVwIHRvIDEwIHNlY29uZHMgaXMgYWNjZXB0YWJsZS4gSG93ZXZlciB0aGUgdGltZXN0YW1wIGF0dGFjaGVkCi0gKiB0byB0aGUgZXZlbnQgc2hvdWxkIGJlIGFjY3VyYXRlIGFuZCBzaG91bGQgY29ycmVzcG9uZCB0byB0aGUgdGltZSB0aGUgcGVhawotICogb2NjdXJlZC4KLSAqCi0gKiBUaGUgc2Vuc29yIGV2ZW50IGNvbnRhaW5zIGEgcGFyYW1ldGVyIGZvciB0aGUgY29uZmlkZW5jZSBpbiB0aGUgZGV0ZWN0aW9uCi0gKiBvZiB0aGUgcGVhayB3aGVyZSAwLjAgcmVwcmVzZW50IG5vIGluZm9ybWF0aW9uIGF0IGFsbCwgYW5kIDEuMCByZXByZXNlbnRzCi0gKiBjZXJ0YWludHkuCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfSEVBUlRfQkVBVCAgICAgICAgICAgICAgICAgICAgICAgICAgKDMxKQogI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfSEVBUlRfQkVBVCAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IuaGVhcnRfYmVhdCIKLQotLyoqCi0gKiBTRU5TT1JfVFlQRV9EWU5BTUlDX1NFTlNPUl9NRVRBCi0gKiB0cmlnZ2VyLW1vZGU6IHNwZWNpYWwKLSAqCi0gKiBBIHNlbnNvciBldmVudCBvZiB0aGlzIHR5cGUgaXMgcmVjZWl2ZWQgd2hlbiBhIGR5bmFtaWMgc2Vuc29yIGlzIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbSB0aGUKLSAqIHN5c3RlbS4gQXQgbW9zdCBvbmUgc2Vuc29yIG9mIHRoaXMgdHlwZSBjYW4gYmUgcHJlc2VudCBpbiBvbmUgc2Vuc29yIEhBTCBpbXBsZW1lbnRhdGlvbiBhbmQKLSAqIHByZXNlbmNlIG9mIGEgc2Vuc29yIG9mIHRoaXMgdHlwZSBpbiBzZW5zb3IgSEFMIGltcGxlbWVudGF0aW9uIGluZGljYXRlcyB0aGF0IHRoaXMgc2Vuc29yIEhBTAotICogc3VwcG9ydHMgZHluYW1pYyBzZW5zb3IgZmVhdHVyZS4gT3BlcmF0aW9ucywgc3VjaCBhcyBiYXRjaCwgYWN0aXZhdGUgYW5kIHNldERlbGF5LCB0byB0aGlzCi0gKiBzcGVjaWFsIHB1cnBvc2Ugc2Vuc29yIHNob3VsZCBiZSB0cmVhdGVkIGFzIG5vLW9wIGFuZCByZXR1cm4gc3VjY2Vzc2Z1bC4KLSAqCi0gKiBBIGR5bmFtaWMgc2Vuc29yIGNvbm5lY3Rpb24gaW5kaWNhdGVzIGNvbm5lY3Rpb24gb2YgYSBwaHlzaWNhbCBkZXZpY2Ugb3IgaW5zdGFudGlhdGlvbiBvZiBhCi0gKiB2aXJ0dWFsIHNlbnNvciBiYWNrZWQgYnkgYWxnb3JpdGhtOyBhbmQgYSBkeW5hbWljIHNlbnNvciBkaXNjb25uZWN0aW9uIGluZGljYXRlcyB0aGUgdGhlCi0gKiBvcHBvc2l0ZS4gQSBzZW5zb3IgZXZlbnQgb2YgU0VOU09SX1RZUEVfRFlOQU1JQ19TRU5TT1JfTUVUQSB0eXBlIHNob3VsZCBiZSBkZWxpdmVyZWQgcmVnYXJkbGVzcwotICogb2YgdGhlIGFjdGl2YXRpb24gc3RhdHVzIG9mIHRoZSBzZW5zb3IgaW4gdGhlIGV2ZW50IG9mIGR5bmFtaWMgc2Vuc29yIGNvbm5lY3Rpb24gYW5kCi0gKiBkaXNjb25uZWN0aW9uLiBJbiB0aGUgc2Vuc29yIGV2ZW50LCBiZXNpZGVzIHRoZSBjb21tb24gZGF0YSBlbnRyaWVzLCAiZHluYW1pY19zZW5zb3JfbWV0YSIsIHdoaWNoCi0gKiBpbmNsdWRlcyBmaWVsZHMgZm9yIGNvbm5lY3Rpb24gc3RhdHVzLCBoYW5kbGUgb2YgdGhlIHNlbnNvciBpbnZvbHZlZCwgcG9pbnRlciB0byBzZW5zb3JfdAotICogc3RydWN0dXJlIGFuZCBhIHV1aWQgZmllbGQsIHNob3VsZCBiZSBwb3B1bGF0ZWQuCi0gKgotICogQXQgYSBkeW5hbWljIHNlbnNvciBjb25uZWN0aW9uIGV2ZW50LCBmaWVsZHMgb2Ygc2Vuc29yX3Qgc3RydWN0dXJlIHJlZmVyZW5jZWQgYnkgYSBwb2ludGVyIGluCi0gKiBkeW5hbWljX3NlbnNvcl9tZXRhIHNob3VsZCBiZSBmaWxsZWQgYXMgaWYgaXQgd2FzIHJlZ3VsYXIgc2Vuc29ycy4gU2Vuc29yIEhBTCBpcyByZXNwb25zaWJsZSBmb3IKLSAqIHJlY292ZXJ5IG9mIG1lbW9yeSBpZiB0aGUgY29ycmVzcG9uZGluZyBkYXRhIGlzIGR5bmFtaWNpYWxseSBhbGxvY2F0ZWQuIEhvd2V2ZXIsIHRoZSB0aGUgcG9pbnRlcgotICogbXVzdCBiZSB2YWxpZCB1bnRpbCB0aGUgZmlyc3QgYWN0aXZhdGUgY2FsbCB0byB0aGUgc2Vuc29yIHJlcG9ydGVkIGluIHRoaXMgY29ubmVjdGlvbiBldmVudC4gQXQgYQotICogZHluYW1pYyBzZW5zb3IgZGlzY29ubmVjdGlvbiwgdGhlIHNlbnNvcl90IHBvaW50ZXIgc2hvdWxkIGJlIE5VTEwuCi0gKgotICogVGhlIHNlbnNvciBoYW5kbGUgYXNzaWduZWQgdG8gZHluYW1pYyBzZW5zb3JzIHNob3VsZCBuZXZlciBiZSB0aGUgc2FtZSBhcyB0aGF0IG9mIGFueSByZWd1bGFyCi0gKiBzdGF0aWMgc2Vuc29ycywgYW5kIHNob3VsZCBiZSB1bmlxdWUgdW50aWwgbmV4dCBib290LiBJbiBhbm90aGVyIHdvcmQsIGlmIGEgaGFuZGxlIGggaXMgdXNlZCBmb3IKLSAqIGEgZHluYW1pYyBzZW5zb3IgQSwgdGhhdCBzYW1lIG51bWJlciBjYW5ub3QgYmUgdXNlZCBmb3IgdGhlIHNhbWUgZHluYW1pYyBzZW5zb3IgQSBvciBhbm90aGVyCi0gKiBkeW5hbWljIHNlbnNvciBCIGV2ZW4gYWZ0ZXIgZGlzY29ubmVjdGlvbiBvZiBBIHVudGlsIHJlYm9vdC4KLSAqCi0gKiBUaGUgVVVJRCBmaWVsZCB3aWxsIGJlIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHRoZSBzZW5zb3IgaW4gYWRkaXRpb24gdG8gbmFtZSwgdmVuZG9yIGFuZCB2ZXJzaW9uCi0gKiBhbmQgdHlwZS4gRm9yIHBoeXNpY2FsIHNlbnNvcnMgb2YgdGhlIHNhbWUgbW9kZWwsIGFsbCBzZW5zb3JzIHdpbGwgaGF2ZSB0aGUgc2FtZSB2YWx1ZXMgaW4KLSAqIHNlbnNvcl90LCBidXQgdGhlIFVVSUQgc2hvdWxkIGJlIHVuaXF1ZSBhbmQgcGVyc2lzdGVudCBmb3IgZWFjaCBpbmRpdmlkdWFsIHVuaXQuIEFuIGFsbCB6ZXJvIFVVSUQKLSAqIGluZGljYXRlcyBpdCBpcyBub3QgcG9zc2libGUgdG8gZGlmZmVyZW50aWF0ZSBpbmRpdmlkdWFsIHNlbnNvciB1bml0LgotICoKLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9EWU5BTUlDX1NFTlNPUl9NRVRBICAgICAgICAgICAgICAgICAgICAgICAgICgzMikKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0RZTkFNSUNfU0VOU09SX01FVEEgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IuZHluYW1pY19zZW5zb3JfbWV0YSIKLQotLyoqCi0gKiBTRU5TT1JfVFlQRV9BRERJVElPTkFMX0lORk8KLSAqIHJlcG9ydGluZy1tb2RlOiBOL0EKLSAqCi0gKiBUaGlzIHNlbnNvciB0eXBlIGlzIGZvciBkZWxpdmVyaW5nIGFkZGl0aW9uYWwgc2Vuc29yIGluZm9ybWF0aW9uIGFzaWRlIGZyb20gc2Vuc29yIGV2ZW50IGRhdGEuCi0gKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIG1heSBpbmNsdWRlIHNlbnNvciBmcm9udC1lbmQgZ3JvdXAgZGVsYXksIGludGVybmFsIGNhbGlicmF0aW9uIHBhcmFtZXRlcnMsCi0gKiBub2lzZSBsZXZlbCBtZXRyaWNzLCBkZXZpY2UgaW50ZXJuYWwgdGVtcGVyYXR1cmUsIGV0Yy4KLSAqCi0gKiBUaGlzIHR5cGUgd2lsbCBuZXZlciBiaW5kIHRvIGEgc2Vuc29yLiBJbiBvdGhlciB3b3Jkcywgbm8gc2Vuc29yIGluIHRoZSBzZW5zb3IgbGlzdCBzaG91bGQgYmUgb2YKLSAqIHRoZSB0eXBlIFNFTlNPUl9UWVBFX0FERElUSU9OQUxfSU5GTy4gSWYgYSBzZW5zb3IgSEFMIHN1cHBvcnRzIHNlbnNvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiBmZWF0dXJlLCBpdCByZXBvcnRzIHNlbnNvcl9ldmVudF90IHdpdGggInNlbnNvciIgZmllbGQgc2V0IHRvIGhhbmRsZSBvZiB0aGUgcmVwb3J0aW5nIHNlbnNvciBhbmQKLSAqICJ0eXBlIiBmaWVsZCBzZXQgdG8gU0VOU09SX1RZUEVfQURESVRJT05BTF9JTkZPLiBEZWxpdmVyeSBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGV2ZW50cyBpcwotICogdHJpZ2dlcmVkIHVuZGVyIHR3byBjb25kaXRpb25zOiBhbiBlbmFibGUgYWN0aXZhdGUoKSBjYWxsIG9yIGEgZmx1c2goKSBjYWxsIHRvIHRoZSBjb3JyZXNwb25kaW5nCi0gKiBzZW5zb3IuCi0gKgotICogQSBzaW5nbGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZXBvcnQgY29uc2lzdHMgb2YgbXVsdGlwbGUgZnJhbWVzLiBTZXF1ZW5jZXMgb2YgdGhlc2UgZnJhbWVzIGFyZQotICogb3JkZXJlZCB1c2luZyB0aW1lc3RhbXBzLCB3aGljaCBtZWFucyB0aGUgdGltZXN0YW1wcyBvZiBzZXF1ZW50aWFsIGZyYW1lcyBoYXZlIHRvIGJlIGF0IGxlYXN0IDEKLSAqIG5hbm9zZWNvbmQgYXBhcnQgZnJvbSBlYWNoIG90aGVyLiBFYWNoIGZyYW1lIGlzIGEgc2Vuc29yX2V2ZW50X3QgZGVsaXZlcmVkIHRocm91Z2ggdGhlIEhBTAotICogaW50ZXJmYWNlLCB3aXRoIHJlbGF0ZWQgZGF0YSBzdG9yZWQgaW4gdGhlICJhZGRpdGlvbmFsX2luZm8iIGZpZWxkLCB3aGljaCBpcyBvZiB0eXBlCi0gKiBhZGRpdGlvbmFsX2luZm9fZXZlbnRfdC4gIFRoZSAidHlwZSIgZmllbGQgb2YgYWRkaXRpb25hbF9pbmZvX2V2ZW50X3QgZGVub3RlcyB0aGUgbmF0dXJlIG9mIHRoZQotICogcGF5bG9hZCBkYXRhIChzZWUgYWRkaXRpb25hbF9pbmZvX3R5cGVfdCkuICBUaGUgInNlcmlhbCIgZmllbGQgaXMgdXNlZCB0byBrZWVwIHRoZSBzZXF1ZW5jZSBvZgotICogcGF5bG9hZCBkYXRhIHRoYXQgc3BhbnMgbXVsdGlwbGUgZnJhbWVzLiBUaGUgZmlyc3QgZnJhbWUgb2YgdGhlIGVudGlyZSByZXBvcnQgaXMgYWx3YXlzIG9mIHR5cGUKLSAqIEFJTkZPX0JFR0lOLCBhbmQgdGhlIGxhc3QgZnJhbWUgaXMgYWx3YXlzIEFJTkZPX0VORC4KLSAqCi0gKiBBbGwgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmcmFtZXMgaGF2ZSB0byBiZSBkZWxpdmVyZWQgYWZ0ZXIgZmx1c2ggY29tcGxldGUgZXZlbnQgaWYgZmx1c2goKSB3YXMKLSAqIHRyaWdnZXJpbmcgdGhlIHJlcG9ydC4KLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9BRERJVElPTkFMX0lORk8gICAgICAgICAgICAgICAgICAgICAgICgzMykKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0FERElUSU9OQUxfSU5GTyAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IuYWRkaXRpb25hbF9pbmZvIgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfRFlOQU1JQ19TRU5TT1JfTUVUQSAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IuZHluYW1pY19zZW5zb3JfbWV0YSIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0FERElUSU9OQUxfSU5GTyAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLmFkZGl0aW9uYWxfaW5mbyIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0xPV19MQVRFTkNZX09GRkJPRFlfREVURUNUICAgImFuZHJvaWQuc2Vuc29yLmxvd19sYXRlbmN5X29mZmJvZHlfZGV0ZWN0IgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfQUNDRUxFUk9NRVRFUl9VTkNBTElCUkFURUQgICAiYW5kcm9pZC5zZW5zb3IuYWNjZWxlcm9tZXRlcl91bmNhbGlicmF0ZWQiCiAKIC8qKgogICogVmFsdWVzIHJldHVybmVkIGJ5IHRoZSBhY2NlbGVyb21ldGVyIGluIHZhcmlvdXMgbG9jYXRpb25zIGluIHRoZSB1bml2ZXJzZS4KQEAgLTg3NiwxNiArMTk5LDYgQEAKIC8qKiBNaW5pbXVtIG1hZ25ldGljIGZpZWxkIG9uIEVhcnRoJ3Mgc3VyZmFjZSAqLwogI2RlZmluZSBNQUdORVRJQ19GSUVMRF9FQVJUSF9NSU4gICAgKDMwLjBmKQogCi0vKioKLSAqIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgc3RhdHVzIGZpZWxkIG9mIHNlbnNvciBldmVudHMuCi0gKi8KLSNkZWZpbmUgU0VOU09SX1NUQVRVU19OT19DT05UQUNUICAgICAgICAtMQotI2RlZmluZSBTRU5TT1JfU1RBVFVTX1VOUkVMSUFCTEUgICAgICAgIDAKLSNkZWZpbmUgU0VOU09SX1NUQVRVU19BQ0NVUkFDWV9MT1cgICAgICAxCi0jZGVmaW5lIFNFTlNPUl9TVEFUVVNfQUNDVVJBQ1lfTUVESVVNICAgMgotI2RlZmluZSBTRU5TT1JfU1RBVFVTX0FDQ1VSQUNZX0hJR0ggICAgIDMKLQotCiBzdHJ1Y3Qgc2Vuc29yX3Q7CiAKIC8qKgpAQCAtOTEwLDcgKzIyMyw3IEBACiB9IHNlbnNvcnNfdmVjX3Q7CiAKIC8qKgotICogdW5jYWxpYnJhdGVkIGd5cm9zY29wZSBhbmQgbWFnbmV0b21ldGVyIGV2ZW50IGRhdGEKKyAqIHVuY2FsaWJyYXRlZCBhY2NlbGVyb21ldGVyLCBneXJvc2NvcGUgYW5kIG1hZ25ldG9tZXRlciBldmVudCBkYXRhCiAgKi8KIHR5cGVkZWYgc3RydWN0IHsKICAgdW5pb24gewpAQCAtOTc3LDc1ICsyOTAsNiBAQAogICAgIH07CiB9IGFkZGl0aW9uYWxfaW5mb19ldmVudF90OwogCi10eXBlZGVmIGVudW0gYWRkaXRpb25hbF9pbmZvX3R5cGUgewotICAgIC8vCi0gICAgQUlORk9fQkVHSU4gPSAweDAsICAgICAgICAgICAgICAgICAgICAgIC8vIE1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmcmFtZXMKLSAgICBBSU5GT19FTkQgICA9IDB4MSwgICAgICAgICAgICAgICAgICAgICAgLy8gTWFya3MgdGhlIGVuZCBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZyYW1lcwotICAgIC8vIEJhc2ljIGluZm9ybWF0aW9uCi0gICAgQUlORk9fVU5UUkFDS0VEX0RFTEFZID0gIDB4MTAwMDAsICAgICAgIC8vIEVzdGltYXRpb24gb2YgdGhlIGRlbGF5IHRoYXQgaXMgbm90IHRyYWNrZWQgYnkgc2Vuc29yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRpbWVzdGFtcHMuIFRoaXMgaW5jbHVkZXMgZGVsYXkgaW50cm9kdWNlZCBieQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZW5zb3IgZnJvbnQtZW5kIGZpbHRlcmluZywgZGF0YSB0cmFuc3BvcnQsIGV0Yy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxvYXRbMl06IGRlbGF5IGluIHNlY29uZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBlc3RpbWF0ZWQgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLSAgICBBSU5GT19JTlRFUk5BTF9URU1QRVJBVFVSRSwgICAgICAgICAgICAgLy8gZmxvYXQ6IENlbHNpdXMgdGVtcGVyYXR1cmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi0gICAgQUlORk9fVkVDM19DQUxJQlJBVElPTiwgICAgICAgICAgICAgICAgIC8vIEZpcnN0IHRocmVlIHJvd3Mgb2YgYSBob21vZ2VuZW91cyBtYXRyaXgsIHdoaWNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcHJlc2VudHMgY2FsaWJyYXRpb24gdG8gYSB0aHJlZS1lbGVtZW50IHZlY3RvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByYXcgc2Vuc29yIHJlYWRpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsb2F0WzEyXTogM3g0IG1hdHJpeCBpbiByb3cgbWFqb3Igb3JkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLSAgICBBSU5GT19TRU5TT1JfUExBQ0VNRU5ULCAgICAgICAgICAgICAgICAgLy8gTG9jYXRpb24gYW5kIG9yaWVudGF0aW9uIG9mIHNlbnNvciBlbGVtZW50IGluIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXZpY2UgZnJhbWU6IG9yaWdpbiBpcyB0aGUgZ2VvbWV0cmljIGNlbnRlciBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9iaWxlIGRldmljZSBzY3JlZW4gc3VyZmFjZTsgdGhlIGF4aXMgZGVmaW5pdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZXNwb25kcyB0byBBbmRyb2lkIHNlbnNvciBkZWZpbml0aW9ucy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxvYXRbMTJdOiAzeDQgbWF0cml4IGluIHJvdyBtYWpvciBvcmRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwotICAgIEFJTkZPX1NBTVBMSU5HLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmbG9hdFsyXTogcmF3IHNhbXBsZSBwZXJpb2QgaW4gc2Vjb25kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBzYW1wbGluZyBwZXJpb2QKLQotICAgIC8vIFNhbXBsaW5nIGNoYW5uZWwgbW9kZWxpbmcgaW5mb3JtYXRpb24KLSAgICBBSU5GT19DSEFOTkVMX05PSVNFID0gMHgyMDAwMCwgICAgICAgICAgLy8gaW50MzJfdDogbm9pc2UgdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmbG9hdFtuXTogcGFyYW1ldGVycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwotICAgIEFJTkZPX0NIQU5ORUxfU0FNUExFUiwgICAgICAgICAgICAgICAgICAvLyBmbG9hdFszXTogc2FtcGxlIHBlcmlvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHNhbXBsZSBwZXJpb2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICBxdWFudGl6YXRpb24gdW5pdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwotICAgIEFJTkZPX0NIQU5ORUxfRklMVEVSLCAgICAgICAgICAgICAgICAgICAvLyBSZXByZXNlbnRzIGEgZmlsdGVyOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIFxzdW1faiBhX2ogeVtuLWpdID09IFxzdW1faSBiX2kgeFtuLWldCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludDMyX3RbM106IG51bWJlciBvZiBmZWVkZm9yd2FyZCBjb2VmZmljaWVudHMsIE0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIG51bWJlciBvZiBmZWVkYmFjayBjb2VmZmljaWVudHMsIE4sIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgIEZJUiBmaWx0ZXIsIE49MS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgYml0IG1hc2sgdGhhdCByZXByZXNlbnRzIHdoaWNoIGVsZW1lbnQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICB3aGljaCB0aGUgZmlsdGVyIGlzIGFwcGxpZWQsIGJpdCAwID09IDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICBtZWFucyB0aGlzIGZpbHRlciBhcHBsaWVzIHRvIHZlY3RvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgIGVsZW1lbnQgMC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxvYXRbTStOXTogZmlsdGVyIGNvZWZmaWNpZW50cyAoYjAsIGIxLCAuLi4sIEJNLTEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICB0aGVuIChhMCwgYTEsIC4uLiwgYU4tMSksIGEwIGlzIGFsd2F5cyAxLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBNdWx0aXBsZSBmcmFtZXMgbWF5IGJlIG5lZWRlZCBmb3IgaGlnaGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIG51bWJlciBvZiB0YXBzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwotICAgIEFJTkZPX0NIQU5ORUxfTElORUFSX1RSQU5TRk9STSwgICAgICAgICAvLyBpbnQzMl90WzJdOiBzaXplIGluIChyb3csIGNvbHVtbikgLi4uIDFzdCBmcmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmbG9hdFtuXTogbWF0cml4IGVsZW1lbnQgdmFsdWVzIGluIHJvdyBtYWpvciBvcmRlci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLSAgICBBSU5GT19DSEFOTkVMX05PTkxJTkVBUl9NQVAsICAgICAgICAgICAgLy8gaW50MzJfdFsyXTogZXh0cmFwb2xhdGUgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGludGVycG9sYXRlIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmbG9hdFtuXTogbWFwcGluZyBrZXkgcG9pbnRzIGluIHBhaXJzLCAoaW4sIG91dCkuLi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgIChtYXkgYmUgdXNlZCB0byBtb2RlbCBzYXR1cmF0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwotICAgIEFJTkZPX0NIQU5ORUxfUkVTQU1QTEVSLCAgICAgICAgICAgICAgICAvLyBpbnQzMl90OiAgcmVzYW1wbGUgbWV0aG9kICgwLXRoIG9yZGVyLCAxc3Qgb3JkZXIuLi4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsb2F0WzFdOiByZXNhbXBsZSByYXRpbyAodXBzYW1wbGluZyBpZiA8IDEuMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgIGRvd25zYW1wbGluZyBpZiA+IDEuMCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi0KLSAgICAvLyBDdXN0b20gaW5mb3JtYXRpb24KLSAgICBBSU5GT19DVVNUT01fU1RBUlQgPSAgICAweDEwMDAwMDAwLCAgICAgLy8KLSAgICAvLyBEZWJ1Z2dpbmcKLSAgICBBSU5GT19ERUJVR0dJTkdfU1RBUlQgPSAweDQwMDAwMDAwLCAgICAgLy8KLX0gYWRkaXRpb25hbF9pbmZvX3R5cGVfdDsKLQogLyoqCiAgKiBVbmlvbiBvZiB0aGUgdmFyaW91cyB0eXBlcyBvZiBzZW5zb3IgZGF0YQogICogdGhhdCBjYW4gYmUgcmV0dXJuZWQuCkBAIC0xMTAzLDYgKzM0Nyw5IEBACiAgICAgICAgICAgICAvKiB1bmNhbGlicmF0ZWQgbWFnbmV0b21ldGVyIHZhbHVlcyBhcmUgaW4gbWljcm8tVGVzbGFzICovCiAgICAgICAgICAgICB1bmNhbGlicmF0ZWRfZXZlbnRfdCB1bmNhbGlicmF0ZWRfbWFnbmV0aWM7CiAKKyAgICAgICAgICAgIC8qIHVuY2FsaWJyYXRlZCBhY2NlbGVyb21ldGVyIHZhbHVlcyBhcmUgaW4gIG1ldGVyIHBlciBzZWNvbmQgcGVyIHNlY29uZCAobS9zXjIpICovCisgICAgICAgICAgICB1bmNhbGlicmF0ZWRfZXZlbnRfdCB1bmNhbGlicmF0ZWRfYWNjZWxlcm9tZXRlcjsKKwogICAgICAgICAgICAgLyogaGVhcnQgcmF0ZSBkYXRhIGNvbnRhaW5pbmcgdmFsdWUgaW4gYnBtIGFuZCBzdGF0dXMgKi8KICAgICAgICAgICAgIGhlYXJ0X3JhdGVfZXZlbnRfdCBoZWFydF9yYXRlOwogCkBAIC0xMTUxLDcgKzM5OCw3IEBACiAKICAgICAvKioKICAgICAgKiBFbnVtZXJhdGUgYWxsIGF2YWlsYWJsZSBzZW5zb3JzLiBUaGUgbGlzdCBpcyByZXR1cm5lZCBpbiAibGlzdCIuCi0gICAgICogQHJldHVybiBudW1iZXIgb2Ygc2Vuc29ycyBpbiB0aGUgbGlzdAorICAgICAqIHJldHVybiBudW1iZXIgb2Ygc2Vuc29ycyBpbiB0aGUgbGlzdAogICAgICAqLwogICAgIGludCAoKmdldF9zZW5zb3JzX2xpc3QpKHN0cnVjdCBzZW5zb3JzX21vZHVsZV90KiBtb2R1bGUsCiAgICAgICAgICAgICBzdHJ1Y3Qgc2Vuc29yX3QgY29uc3QqKiBsaXN0KTsKQEAgLTExNjIsNyArNDA5LDcgQEAKICAgICAgKiAgMCAtIE5vcm1hbCBvcGVyYXRpb24uIERlZmF1bHQgc3RhdGUgb2YgdGhlIG1vZHVsZS4KICAgICAgKiAgMSAtIExvb3BiYWNrIG1vZGUuIERhdGEgaXMgaW5qZWN0ZWQgZm9yIHRoZSBzdXBwb3J0ZWQKICAgICAgKiAgICAgIHNlbnNvcnMgYnkgdGhlIHNlbnNvciBzZXJ2aWNlIGluIHRoaXMgbW9kZS4KLSAgICAgKiBAcmV0dXJuIDAgb24gc3VjY2VzcworICAgICAqIHJldHVybiAwIG9uIHN1Y2Nlc3MKICAgICAgKiAgICAgICAgIC1FSU5WQUwgaWYgcmVxdWVzdGVkIG1vZGUgaXMgbm90IHN1cHBvcnRlZAogICAgICAqICAgICAgICAgLUVQRVJNIGlmIG9wZXJhdGlvbiBpcyBub3QgYWxsb3dlZAogICAgICAqLwpAQCAtMTIyNSwxMyArNDcyLDE0IEBACiAgICAgICovCiAgICAgdWludDMyX3QgICAgICAgIGZpZm9NYXhFdmVudENvdW50OwogCi0gICAgLyogdHlwZSBvZiB0aGlzIHNlbnNvciBhcyBhIHN0cmluZy4gU2V0IHRvIGNvcnJlc3BvbmRpbmcKLSAgICAgKiBTRU5TT1JfU1RSSU5HX1RZUEVfKi4KLSAgICAgKiBXaGVuIGRlZmluaW5nIGFuIE9FTSBzcGVjaWZpYyBzZW5zb3Igb3Igc2Vuc29yIG1hbnVmYWN0dXJlciBzcGVjaWZpYwotICAgICAqIHNlbnNvciwgdXNlIHlvdXIgcmVzZXJ2ZSBkb21haW4gbmFtZSBhcyBhIHByZWZpeC4KLSAgICAgKiBleDogY29tLmdvb2dsZS5nbGFzcy5vbmhlYWRkZXRlY3RvcgotICAgICAqIEZvciBzZW5zb3JzIG9mIGtub3duIHR5cGUsIHRoZSBhbmRyb2lkIGZyYW1ld29yayBtaWdodCBvdmVyd3JpdGUgdGhpcwotICAgICAqIHN0cmluZyBhdXRvbWF0aWNhbGx5LgorICAgIC8qIHR5cGUgb2YgdGhpcyBzZW5zb3IgYXMgYSBzdHJpbmcuCisgICAgICoKKyAgICAgKiBJZiB0eXBlIGlzIE9FTSBzcGVjaWZpYyBvciBzZW5zb3IgbWFudWZhY3R1cmVyIHNwZWNpZmljIHR5cGUKKyAgICAgKiAoPj1TRU5TT1JfVFlQRV9ERVZJQ0VfUFJJVkFURV9CQVNFKSwgdGhpcyBzdHJpbmcgbXVzdCBiZSBkZWZpbmVkIHdpdGggcmVzZXJ2ZWQgZG9tYWluIG9mCisgICAgICogdmVuZG9yL09FTSBhcyBhIHByZWZpeCwgZS5nLiBjb20uZ29vZ2xlLmdsYXNzLm9uaGVhZGRldGVjdG9yCisgICAgICoKKyAgICAgKiBGb3Igc2Vuc29ycyBvZiBBbmRyb2lkIGRlZmluZWQgdHlwZXMsIEFuZHJvaWQgZnJhbWV3b3JrIHdpbGwgb3ZlcnJpZGUgdGhpcyB2YWx1ZS4gSXQgaXMgb2sgdG8KKyAgICAgKiBsZWF2ZSBpdCBwb2ludGluZyB0byBhbiBlbXB0eSBzdHJpbmcuCiAgICAgICovCiAgICAgY29uc3QgY2hhciogICAgc3RyaW5nVHlwZTsKIApAQCAtMTI3Nyw2ICs1MjUsMjMgQEAKICAgICB2b2lkKiAgICAgICAgICAgcmVzZXJ2ZWRbMl07CiB9OwogCisvKioKKyAqIFNoYXJlZCBtZW1vcnkgaW5mb3JtYXRpb24gZm9yIGEgZGlyZWN0IGNoYW5uZWwKKyAqLworc3RydWN0IHNlbnNvcnNfZGlyZWN0X21lbV90IHsKKyAgICBpbnQgdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbnVtIFNFTlNPUl9ESVJFQ1RfTUVNXy4uLgorICAgIGludCBmb3JtYXQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVudW0gU0VOU09SX0RJUkVDVF9GTVRfLi4uCisgICAgc2l6ZV90IHNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2l6ZSBvZiB0aGUgbWVtb3J5IHJlZ2lvbiwgaW4gYnl0ZXMKKyAgICBjb25zdCBzdHJ1Y3QgbmF0aXZlX2hhbmRsZSAqaGFuZGxlOyAvLyBzaGFyZWQgbWVtb3J5IGhhbmRsZSwgd2hpY2ggaXMgaW50ZXJwcmV0ZWQgZGlmZmVyZW50bHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXBlbmRpbmcgb24gdHlwZQorfTsKKworLyoqCisgKiBEaXJlY3QgY2hhbm5lbCByZXBvcnQgY29uZmlndXJhdGlvbgorICovCitzdHJ1Y3Qgc2Vuc29yc19kaXJlY3RfY2ZnX3QgeworICAgIGludCByYXRlX2xldmVsOyAgICAgICAgICAgICAvLyBlbnVtIFNFTlNPUl9ESVJFQ1RfUkFURV8uLi4KK307CiAKIC8qCiAgKiBzZW5zb3JzX3BvbGxfZGV2aWNlX3QgaXMgdXNlZCB3aXRoIFNFTlNPUlNfREVWSUNFX0FQSV9WRVJTSU9OXzBfMQpAQCAtMTMwOCwxMSArNTczLDE2IEBACiAgICAgICAgIHN0cnVjdCB7CiAgICAgICAgICAgICBzdHJ1Y3QgaHdfZGV2aWNlX3QgY29tbW9uOwogCi0gICAgICAgICAgICAvKiBBY3RpdmF0ZS9kZS1hY3RpdmF0ZSBvbmUgc2Vuc29yLiBSZXR1cm4gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZQorICAgICAgICAgICAgLyogQWN0aXZhdGUvZGUtYWN0aXZhdGUgb25lIHNlbnNvci4KICAgICAgICAgICAgICAqCiAgICAgICAgICAgICAgKiBzZW5zb3JfaGFuZGxlIGlzIHRoZSBoYW5kbGUgb2YgdGhlIHNlbnNvciB0byBjaGFuZ2UuCiAgICAgICAgICAgICAgKiBlbmFibGVkIHNldCB0byAxIHRvIGVuYWJsZSwgb3IgMCB0byBkaXNhYmxlIHRoZSBzZW5zb3IuCiAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogQWZ0ZXIgc2Vuc29yIGRlLWFjdGl2YXRpb24sIGV4aXN0aW5nIHNlbnNvciBldmVudHMgdGhhdCBoYXZlIG5vdAorICAgICAgICAgICAgICogYmVlbiBwaWNrZWQgdXAgYnkgcG9sbCgpIHNob3VsZCBiZSBhYmFuZG9uZWQgaW1tZWRpYXRlbHkgc28gdGhhdAorICAgICAgICAgICAgICogc3Vic2VxdWVudCBhY3RpdmF0aW9uIHdpbGwgbm90IGdldCBzdGFsZSBzZW5zb3IgZXZlbnRzIChldmVudHMKKyAgICAgICAgICAgICAqIHRoYXQgaXMgZ2VuZXJhdGVkIHByaW9yIHRvIHRoZSBsYXR0ZXIgYWN0aXZhdGlvbikuCisgICAgICAgICAgICAgKgogICAgICAgICAgICAgICogUmV0dXJuIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gY29kZSBvdGhlcndpc2UuCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGludCAoKmFjdGl2YXRlKShzdHJ1Y3Qgc2Vuc29yc19wb2xsX2RldmljZV90ICpkZXYsCkBAIC0xMzI4LDcgKzU5OCwxMyBAQAogICAgICAgICAgICAgICAgICAgICBpbnQgc2Vuc29yX2hhbmRsZSwgaW50NjRfdCBzYW1wbGluZ19wZXJpb2RfbnMpOwogCiAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2Ygc2Vuc29yIGRhdGEuCisgICAgICAgICAgICAgKiBXcml0ZSBhbiBhcnJheSBvZiBzZW5zb3JfZXZlbnRfdCB0byBkYXRhLiBUaGUgc2l6ZSBvZiB0aGUKKyAgICAgICAgICAgICAqIGF2YWlsYWJsZSBidWZmZXIgaXMgc3BlY2lmaWVkIGJ5IGNvdW50LiBSZXR1cm5zIG51bWJlciBvZgorICAgICAgICAgICAgICogdmFsaWQgc2Vuc29yX2V2ZW50X3QuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmxvY2sgaWYgdGhlcmUgaXMgbm8gc2Vuc29yIGV2ZW50CisgICAgICAgICAgICAgKiBhdmFpbGFibGUgd2hlbiBiZWluZyBjYWxsZWQuIFRodXMsIHJldHVybiB2YWx1ZSBzaG91bGQgYWx3YXlzIGJlCisgICAgICAgICAgICAgKiBwb3NpdGl2ZS4KICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgaW50ICgqcG9sbCkoc3RydWN0IHNlbnNvcnNfcG9sbF9kZXZpY2VfdCAqZGV2LAogICAgICAgICAgICAgICAgICAgICBzZW5zb3JzX2V2ZW50X3QqIGRhdGEsIGludCBjb3VudCk7CkBAIC0xMzY3LDEzICs2NDMsNjcgQEAKICAgICAvKgogICAgICAqIEluamVjdCBhIHNpbmdsZSBzZW5zb3Igc2FtcGxlIHRvIGJlIHRvIHRoaXMgZGV2aWNlLgogICAgICAqIGRhdGEgcG9pbnRzIHRvIHRoZSBzZW5zb3IgZXZlbnQgdG8gYmUgaW5qZWN0ZWQKLSAgICAgKiBAcmV0dXJuIDAgb24gc3VjY2VzcworICAgICAqIHJldHVybiAwIG9uIHN1Y2Nlc3MKICAgICAgKiAgICAgICAgIC1FUEVSTSBpZiBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQKICAgICAgKiAgICAgICAgIC1FSU5WQUwgaWYgc2Vuc29yIGV2ZW50IGNhbm5vdCBiZSBpbmplY3RlZAogICAgICAqLwogICAgIGludCAoKmluamVjdF9zZW5zb3JfZGF0YSkoc3RydWN0IHNlbnNvcnNfcG9sbF9kZXZpY2VfMSAqZGV2LCBjb25zdCBzZW5zb3JzX2V2ZW50X3QgKmRhdGEpOwogCi0gICAgdm9pZCAoKnJlc2VydmVkX3Byb2NzWzddKSh2b2lkKTsKKyAgICAvKgorICAgICAqIFJlZ2lzdGVyL3VucmVnaXN0ZXIgZGlyZWN0IHJlcG9ydCBjaGFubmVsLgorICAgICAqCisgICAgICogQSBIQUwgZGVjbGFyZXMgc3VwcG9ydCBmb3IgZGlyZWN0IHJlcG9ydCBieSBzZXR0aW5nIG5vbi1OVUxMIHZhbHVlcyBmb3IgYm90aAorICAgICAqIHJlZ2lzdGVyX2RpcmVjdF9jaGFubmVsIGFuZCBjb25maWdfZGlyZWN0X3JlcG9ydC4KKyAgICAgKgorICAgICAqIFRoaXMgZnVuY3Rpb24gaGFzIHR3byBvcGVyYXRpb24gbW9kZXM6CisgICAgICoKKyAgICAgKiBSZWdpc3RlcjogbWVtICE9IE5VTEwsIHJlZ2lzdGVyIGEgY2hhbm5lbCB1c2luZyBzdXBwbGllZCBzaGFyZWQgbWVtb3J5IGluZm9ybWF0aW9uLiBCeSB0aGUKKyAgICAgKiB0aW1lIHRoaXMgZnVuY3Rpb24gcmV0dXJucywgc2Vuc29ycyBtdXN0IGZpbmlzaCBpbml0aWFsaXppbmcgc2hhcmVkIG1lbW9yeSBjb250ZW50CisgICAgICogKGZvcm1hdCBkZXBlbmRlbnQsIHNlZSBTRU5TT1JfRElSRUNUX0ZNVF8qKS4KKyAgICAgKiAgICAgIFBhcmFtZXRlcnM6CisgICAgICogICAgICAgICAgbWVtICAgICAgICAgICAgIHBvaW50cyB0byBhIHZhbGlkIHN0cnVjdCBzZW5zb3JzX2RpcmVjdF9tZW1fdC4KKyAgICAgKiAgICAgICAgICBjaGFubmVsX2hhbmRsZSAgaXMgaWdub3JlZC4KKyAgICAgKiAgICAgIFJldHVybiB2YWx1ZToKKyAgICAgKiAgICAgICAgICBBIGhhbmRsZSBvZiBjaGFubmVsICg+MCwgPElOVDMyX01BWCkgd2hlbiBzdWNjZXNzLCB3aGljaCBsYXRlciBjYW4gYmUgcmVmZXJyZWQgaW4KKyAgICAgKiAgICAgICAgICB1bnJlZ2lzdGVyIG9yIGNvbmZpZ19kaXJlY3RfcmVwb3J0IGNhbGwsIG9yIGVycm9yIGNvZGUgKDwwKSB3aGVuIGZhaWxlZAorICAgICAqIFVucmVnaXN0ZXI6IG1lbSA9PSBOVUxMLCB1bnJlZ2lzdGVyIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIGNoYW5uZWwuCisgICAgICogICAgICBQYXJhbWV0ZXJzOgorICAgICAqICAgICAgICAgIG1lbSAgICAgICAgICAgICBzZXQgdG8gTlVMTAorICAgICAqICAgICAgICAgIGNoYW5uZWxfaGFuZGxlICBjb250YWlucyBoYW5kbGUgb2YgY2hhbm5lbCB0byBiZSB1bnJlZ2lzdGVyZWQKKyAgICAgKiAgICAgIFJldHVybiB2YWx1ZToKKyAgICAgKiAgICAgICAgICAwLCBldmVuIGlmIHRoZSBjaGFubmVsX2hhbmRsZSBpcyBpbnZhbGlkLCBpbiB3aGljaCBjYXNlIGl0IHdpbGwgYmUgYSBuby1vcC4KKyAgICAgKi8KKyAgICBpbnQgKCpyZWdpc3Rlcl9kaXJlY3RfY2hhbm5lbCkoc3RydWN0IHNlbnNvcnNfcG9sbF9kZXZpY2VfMSAqZGV2LAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IHNlbnNvcnNfZGlyZWN0X21lbV90KiBtZW0sIGludCBjaGFubmVsX2hhbmRsZSk7CisKKyAgICAvKgorICAgICAqIENvbmZpZ3VyZSBkaXJlY3Qgc2Vuc29yIGV2ZW50IHJlcG9ydCBpbiBkaXJlY3QgY2hhbm5lbC4KKyAgICAgKgorICAgICAqIFN0YXJ0LCBtb2RpZnkgcmF0ZSBvciBzdG9wIGRpcmVjdCByZXBvcnQgb2YgYSBzZW5zb3IgaW4gYSBjZXJ0YWluIGRpcmVjdCBjaGFubmVsLiBBIHNwZWNpYWwKKyAgICAgKiBjYXNlIGlzIHNldHRpbmcgc2Vuc29yIGhhbmRsZSAtMSB0byBzdG9wIG1lYW5zIHRvIHN0b3AgYWxsIGFjdGl2ZSBzZW5zb3IgcmVwb3J0IG9uIHRoZQorICAgICAqIGNoYW5uZWwgc3BlY2lmaWVkLgorICAgICAqCisgICAgICogQSBIQUwgZGVjbGFyZXMgc3VwcG9ydCBmb3IgZGlyZWN0IHJlcG9ydCBieSBzZXR0aW5nIG5vbi1OVUxMIHZhbHVlcyBmb3IgYm90aAorICAgICAqIHJlZ2lzdGVyX2RpcmVjdF9jaGFubmVsIGFuZCBjb25maWdfZGlyZWN0X3JlcG9ydC4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogICAgICBzZW5zb3JfaGFuZGxlICAgc2Vuc29yIHRvIGJlIGNvbmZpZ3VyZWQuIFRoZSBzZW5zb3IgaGFzIHRvIHN1cHBvcnQgZGlyZWN0IHJlcG9ydAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG1vZGUgYnkgc2V0dGluZyBmbGFncyBvZiBzZW5zb3JfdC4gQWxzbywgZGlyZWN0IHJlcG9ydCBtb2RlIGlzIG9ubHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIGZvciBjb250aW51b3VzIHJlcG9ydGluZyBtb2RlIHNlbnNvcnMuCisgICAgICogICAgICBjaGFubmVsX2hhbmRsZSAgY2hhbm5lbCBoYW5kbGUgdG8gYmUgY29uZmlndXJlZC4KKyAgICAgKiAgICAgIGNvbmZpZyAgICAgICAgICBkaXJlY3QgcmVwb3J0IHBhcmFtZXRlcnMsIHNlZSBzZW5zb3JfZGlyZWN0X2NmZ190LgorICAgICAqIFJldHVybiB2YWx1ZToKKyAgICAgKiAgICAgIC0gd2hlbiBzZW5zb3IgaXMgc3RhcnRlZCBvciBzZW5zb3IgcmF0ZSBsZXZlbCBpcyBjaGFuZ2VkOiByZXR1cm4gcG9zaXRpdmUgaWRlbnRpZmllciBvZgorICAgICAqICAgICAgICBzZW5zb3IgaW4gc3BlY2lmaWVkIGNoYW5uZWwgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIHJldHVybiBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAqICAgICAgLSB3aGVuIHNlbnNvciBpcyBzdG9wcGVkOiByZXR1cm4gMCBmb3Igc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIGZvciBmYWlsdXJlLgorICAgICAqLworICAgIGludCAoKmNvbmZpZ19kaXJlY3RfcmVwb3J0KShzdHJ1Y3Qgc2Vuc29yc19wb2xsX2RldmljZV8xICpkZXYsCisgICAgICAgICAgICBpbnQgc2Vuc29yX2hhbmRsZSwgaW50IGNoYW5uZWxfaGFuZGxlLCBjb25zdCBzdHJ1Y3Qgc2Vuc29yc19kaXJlY3RfY2ZnX3QgKmNvbmZpZyk7CisKKyAgICAvKgorICAgICAqIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLCBtdXN0IGJlIHplcm8uCisgICAgICovCisgICAgdm9pZCAoKnJlc2VydmVkX3Byb2NzWzVdKSh2b2lkKTsKIAogfSBzZW5zb3JzX3BvbGxfZGV2aWNlXzFfdDsKIApAQCAtMTM4Myw3ICs3MTMsNyBAQAogc3RhdGljIGlubGluZSBpbnQgc2Vuc29yc19vcGVuKGNvbnN0IHN0cnVjdCBod19tb2R1bGVfdCogbW9kdWxlLAogICAgICAgICBzdHJ1Y3Qgc2Vuc29yc19wb2xsX2RldmljZV90KiogZGV2aWNlKSB7CiAgICAgcmV0dXJuIG1vZHVsZS0+bWV0aG9kcy0+b3Blbihtb2R1bGUsCi0gICAgICAgICAgICBTRU5TT1JTX0hBUkRXQVJFX1BPTEwsIChzdHJ1Y3QgaHdfZGV2aWNlX3QqKilkZXZpY2UpOworICAgICAgICAgICAgU0VOU09SU19IQVJEV0FSRV9QT0xMLCBUT19IV19ERVZJQ0VfVF9PUEVOKGRldmljZSkpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBzZW5zb3JzX2Nsb3NlKHN0cnVjdCBzZW5zb3JzX3BvbGxfZGV2aWNlX3QqIGRldmljZSkgewpAQCAtMTM5Myw3ICs3MjMsNyBAQAogc3RhdGljIGlubGluZSBpbnQgc2Vuc29yc19vcGVuXzEoY29uc3Qgc3RydWN0IGh3X21vZHVsZV90KiBtb2R1bGUsCiAgICAgICAgIHNlbnNvcnNfcG9sbF9kZXZpY2VfMV90KiogZGV2aWNlKSB7CiAgICAgcmV0dXJuIG1vZHVsZS0+bWV0aG9kcy0+b3Blbihtb2R1bGUsCi0gICAgICAgICAgICBTRU5TT1JTX0hBUkRXQVJFX1BPTEwsIChzdHJ1Y3QgaHdfZGV2aWNlX3QqKilkZXZpY2UpOworICAgICAgICAgICAgU0VOU09SU19IQVJEV0FSRV9QT0xMLCBUT19IV19ERVZJQ0VfVF9PUEVOKGRldmljZSkpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBzZW5zb3JzX2Nsb3NlXzEoc2Vuc29yc19wb2xsX2RldmljZV8xX3QqIGRldmljZSkgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS9zb3VuZF90cmlnZ2VyLmggYi9pbmNsdWRlL2hhcmR3YXJlL3NvdW5kX3RyaWdnZXIuaAppbmRleCBlMWFiYmM5Li5kNzgyOGFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2hhcmR3YXJlL3NvdW5kX3RyaWdnZXIuaAorKysgYi9pbmNsdWRlL2hhcmR3YXJlL3NvdW5kX3RyaWdnZXIuaApAQCAtMTI0LDcgKzEyNCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9od19kZXZpY2UqKiBkZXZpY2UpCiB7CiAgICAgcmV0dXJuIG1vZHVsZS0+bWV0aG9kcy0+b3Blbihtb2R1bGUsIFNPVU5EX1RSSUdHRVJfSEFSRFdBUkVfSU5URVJGQUNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBod19kZXZpY2VfdCoqKWRldmljZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT19IV19ERVZJQ0VfVF9PUEVOKGRldmljZSkpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBzb3VuZF90cmlnZ2VyX2h3X2RldmljZV9jbG9zZShzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9od19kZXZpY2UqIGRldmljZSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvdmVoaWNsZS5oIGIvaW5jbHVkZS9oYXJkd2FyZS92ZWhpY2xlLmgKaW5kZXggYTU5MGZiZC4uOGIyOGU3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS92ZWhpY2xlLmgKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS92ZWhpY2xlLmgKQEAgLTgzLDcgKzgzLDYgQEAKIAogLyoqCiAgKiBJbnZhbGlkIHByb3BlcnR5IHZhbHVlIHVzZWQgZm9yIGFyZ3VtZW50IHdoZXJlIGludmFsaWQgcHJvcGVydHkgZ2l2ZXMgZGlmZmVyZW50IHJlc3VsdC4KLSAqIEByYW5nZV9zdGFydAogICovCiAjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfSU5WQUxJRCAoMHgwKQogCkBAIC0xMjIsNyArMTIxLDcgQEAKICAqIEBkYXRhX21lbWJlciBpbmZvX21vZGVsX3llYXIKICAqIEB1bml0IFZFSElDTEVfVU5JVF9UWVBFX1lFQVIKICAqLwotI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0lORk9fTU9ERUxfWUVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMTAzKQorI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0lORk9fTU9ERUxfWUVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDEwMykKIAogLyoqCiAgKiBGdWVsIGNhcGFjaXR5IG9mIHRoZSB2ZWhpY2xlCkBAIC0yNTMsNyArMjUyLDcgQEAKIAogCiAKLSAvLz09PT0gSFZBQyBQcm9wZXJ0aWVzID09PT0KKy8vPT09PSBIVkFDIFByb3BlcnRpZXMgPT09PQogCiAvKioKICAqIEZhbiBzcGVlZCBzZXR0aW5nCkBAIC0yNjEsOCArMjYwLDcgQEAKICAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCiAgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQogICogQGRhdGFfbWVtYmVyIGh2YWMuZmFuX3NwZWVkCi0gKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORQotICogQGRhdGFfZW51bSBUT0RPCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1pPTkUKICAqIEBhbGxvd19vdXRfb2ZfcmFuZ2VfdmFsdWUgOiBPRkYKICAqLwogI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0hWQUNfRkFOX1NQRUVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDUwMCkKQEAgLTI3Myw4ICsyNzEsOCBAQAogICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKICAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCiAgKiBAZGF0YV9tZW1iZXIgaHZhYy5mYW5fZGlyZWN0aW9uCi0gKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORQotICogQGRhdGFfZW51bSBUT0RPCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1pPTkUKKyAqIEBkYXRhX2VudW0gdmVoaWNsZV9odmFjX2Zhbl9kaXJlY3Rpb24KICAqIEBhbGxvd19vdXRfb2ZfcmFuZ2VfdmFsdWUgOiBPRkYKICAqLwogI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0hWQUNfRkFOX0RJUkVDVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDUwMSkKQEAgLTI5Myw5ICsyOTEsOSBAQAogLyoqCiAgKiBIVkFDIGN1cnJlbnQgdGVtcGVyYXR1cmUuCiAgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfRkxPQVQKLSAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFfFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9DT05USU5VT1VTCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQogICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKLSAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1pPTkUKICAqIEBkYXRhX21lbWJlciBodmFjLnRlbXBlcmF0dXJlX2N1cnJlbnQKICAqLwogI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0hWQUNfVEVNUEVSQVRVUkVfQ1VSUkVOVCAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDUwMikKQEAgLTMwMyw5ICszMDEsOSBAQAogLyoqCiAgKiBIVkFDLCB0YXJnZXQgdGVtcGVyYXR1cmUgc2V0LgogICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0ZMT0FUCi0gKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRXxWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfQ09OVElOVU9VUworICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKICAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCi0gKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9aT05FCiAgKiBAZGF0YV9tZW1iZXIgaHZhYy50ZW1wZXJhdHVyZV9zZXQKICAqIEBhbGxvd19vdXRfb2ZfcmFuZ2VfdmFsdWUgOiBNSU4gLyBNQVggLyBPRkYKICAqLwpAQCAtMzE2LDcgKzMxNCw3IEBACiAgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfQk9PTEVBTgogICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKICAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCi0gKiBAem9uZV90eXBlIFZFSElDTEVfV0lORE9XCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1dJTkRPVwogICogQGRhdGFfbWVtYmVyIGh2YWMuZGVmcm9zdF9vbgogICovCiAjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfSFZBQ19ERUZST1NURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwNTA0KQpAQCAtMzI3LDcgKzMyNSw3IEBACiAgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQogICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKICAqIEBjb25maWdfZmxhZ3MgU3VwcG9ydGVkIHpvbmVzCi0gKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9aT05FCiAgKiBAZGF0YV9tZW1iZXIgaHZhYy5hY19vbgogICovCiAjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfSFZBQ19BQ19PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwNTA1KQpAQCAtMzM3LDcgKzMzNSw3IEBACiAgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfQk9PTEVBTgogICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKICAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCi0gKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9aT05FCiAgKiBAZGF0YV9tZW1iZXIgaHZhYy5tYXhfYWNfb24KICAqLwogI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0hWQUNfTUFYX0FDX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDUwNikKQEAgLTM0Nyw3ICszNDUsNyBAQAogICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0JPT0xFQU4KICAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCiAgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQotICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfWk9ORQogICogQGRhdGFfbWVtYmVyIGh2YWMubWF4X2RlZnJvc3Rfb24KICAqLwogI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0hWQUNfTUFYX0RFRlJPU1RfT04gICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDUwNykKQEAgLTM1Nyw3ICszNTUsNyBAQAogICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0JPT0xFQU4KICAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCiAgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQotICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfWk9ORQogICogQGRhdGFfbWVtYmVyIGh2YWMubWF4X3JlY2lyY19vbgogICovCiAjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfSFZBQ19SRUNJUkNfT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwNTA4KQpAQCAtMzY3LDEyICszNjUsOTQgQEAKICAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9CT09MRUFOCiAgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQogICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKLSAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1pPTkUKICAqIEBkYXRhX21lbWJlciBodmFjLmR1YWxfb24KICAqLwogI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0hWQUNfRFVBTF9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDUwOSkKIAogLyoqCisgKiBPbi9vZmYgYXV0b21hdGljIG1vZGUKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9CT09MRUFOCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfWk9ORQorICogQGRhdGFfbWVtYmVyIGh2YWMuYXV0b19vbgorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfSFZBQ19BVVRPX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwNTBBKQorCisvKioKKyAqIFNlYXQgdGVtcGVyYXR1cmUKKyAqCisgKiBOZWdhdGl2ZSB2YWx1ZXMgaW5kaWNhdGUgY29vbGluZy4KKyAqIDAgaW5kaWNhdGVzIG9mZi4KKyAqIFBvc2l0aXZlIHZhbHVlcyBpbmRpY2F0ZSBoZWF0aW5nLgorICoKKyAqIFNvbWUgdmVoaWNsZXMgbWF5IGhhdmUgbXVsdGlwbGUgbGV2ZWxzIG9mIGhlYXRpbmcgYW5kIGNvb2xpbmcuIFRoZSBtaW4vbWF4CisgKiByYW5nZSBkZWZpbmVzIHRoZSBhbGxvd2FibGUgcmFuZ2UgYW5kIG51bWJlciBvZiBzdGVwcyBpbiBlYWNoIGRpcmVjdGlvbi4KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9TRUFUCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0hWQUNfU0VBVF9URU1QRVJBVFVSRSAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDUwQikKKworLyoqCisgKiBTaWRlIE1pcnJvciBIZWF0CisgKgorICogSW5jcmVhc2UgdmFsdWVzIGRlbm90ZSBoaWdoZXIgaGVhdGluZyBsZXZlbHMgZm9yIHNpZGUgbWlycm9ycy4KKyAqIDAgaW5kaWNhdGVzIGhlYXRpbmcgaXMgdHVybmVkIG9mZi4KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9IVkFDX1NJREVfTUlSUk9SX0hFQVQgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDA1MEMpCisKKy8qKgorICogU3RlZXJpbmcgV2hlZWwgVGVtcGVyYXR1cmUKKyAqCisgKiBTZXRzIHRoZSB0ZW1wZXJhdHVyZSBmb3IgdGhlIHN0ZWVyaW5nIHdoZWVsCisgKiBQb3NpdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgaGVhdGluZy4KKyAqIE5lZ2F0aXZlIHZhbHVlIGluZGljYXRlcyBjb29saW5nLgorICogMCBpbmRpY2F0ZXMgdGVtcHJlYXR1cmUgY29udHJvbCBpcyBvZmYuCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfSFZBQ19TVEVFUklOR19XSEVFTF9URU1QICAgICAgICAgICAgICAgICAgICgweDAwMDAwNTBEKQorCisvKioKKyAqIFRlbXBlcmF0dXJlIHVuaXRzCisgKgorICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRlbXBlcmF0dXJlIGlzIGluIENlbHNpdXMsIEZhaHJlbmhlaXQsIG9yIGEgZGlmZmVyZW50IHVuaXQuCisgKiBUaGlzIHBhcmFtZXRlciBhZmZlY3RzIGFsbCBIVkFDIHRlbXBlcmF0dXJlcyBpbiB0aGUgc3lzdGVtLgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFECisgKiBAZGF0YV9lbnVtIHZlaGljbGVfdW5pdF90eXBlCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0hWQUNfVEVNUEVSQVRVUkVfVU5JVFMgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDUwRSkKKworLyoqCisgKiBBY3R1YWwgZmFuIHNwZWVkCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRAorICogQGRhdGFfbWVtYmVyIGh2YWMuZmFuX3NwZWVkCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1pPTkUKKyAqIEBhbGxvd19vdXRfb2ZfcmFuZ2VfdmFsdWUgOiBPRkYKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0hWQUNfQUNUVUFMX0ZBTl9TUEVFRF9SUE0gICAgICAgICAgICAgICAgICAoMHgwMDAwMDUwRikKKworCisvKioKICAqIFJlcHJlc2VudHMgcG93ZXIgc3RhdGUgZm9yIEhWQUMuIFNvbWUgSFZBQyBwcm9wZXJ0aWVzIHdpbGwgcmVxdWlyZSBtYXRjaGluZyBwb3dlciB0byBiZSB0dXJuZWQgb24KICAqIHRvIGdldCBvdXQgb2YgT0ZGIHN0YXRlLiBGb3Igbm9uLXpvbmVkIEhWQUMgcHJvcGVydGllcywgVkVISUNMRV9BTExfWk9ORSBjb3JyZXNwb25kcyB0bwogICogZ2xvYmFsIHBvd2VyIHN0YXRlLgpAQCAtMzgzLDEyICs0NjMsMzEgQEAKICAqIEBjb25maWdfc3RyaW5nIGxpc3Qgb2YgSFZBQyBwcm9wZXJ0aWVzIHdob3NlIHBvd2VyIGlzIGNvbnRyb2xsZWQgYnkgdGhpcyBwcm9wZXJ0eS4gRm9ybWF0IGlzCiAgKiAgICAgICAgICAgICAgICBoZXhhLWRlY2ltYWwgbnVtYmVyICgweC4uLikgc2VwYXJhdGVkIGJ5IGNvbW1hIGxpa2UgIjB4NTAwLDB4NTAzIi4gQWxsIHpvbmVzCiAgKiAgICAgICAgICAgICAgICBkZWZpbmVkIGluIHRoZXNlIGFmZmVjdGVkIHByb3BlcnRpZXMgc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiB0aGUgcHJvcGVydHkuCi0gKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9aT05FCiAgKiBAZGF0YV9tZW1iZXIgaHZhYy5wb3dlcl9vbgogICovCiAjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfSFZBQ19QT1dFUl9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwNTEwKQogCiAvKioKKyAqIEZhbiBQb3NpdGlvbnMgQXZhaWxhYmxlCisgKgorICogVGhpcyBpcyBhIGJpdCBtYXNrIG9mIGZhbiBwb3NpdGlvbnMgYXZhaWxhYmxlIGZvciB0aGUgem9uZS4gIEVhY2ggZW50cnkgaW4KKyAqIHZlaGljbGVfaHZhY19mYW5fZGlyZWN0aW9uIGlzIHNlbGVjdGVkIGJ5IGJpdCBwb3NpdGlvbi4gIEZvciBpbnN0YW5jZSwgaWYKKyAqIG9ubHkgdGhlIEZBTl9ESVJFQ1RJT05fRkFDRSAoMHgxKSBhbmQgRkFOX0RJUkVDVElPTl9ERUZST1NUICgweDQpIGFyZSBhdmFpbGFibGUsCisgKiB0aGVuIHRoaXMgdmFsdWUgc2hhbGwgYmUgc2V0IHRvIDB4MTIuCisgKgorICogMHgxMiA9ICgxIDw8IDEpIHwgKDEgPDwgNCkKKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfU1RBVElDCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1pPTkUKKyAqIEBhbGxvd19vdXRfb2ZfcmFuZ2VfdmFsdWUgOiBPRkYKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0hWQUNfRkFOX0RJUkVDVElPTl9BVkFJTEFCTEUgICAgICAgICAgICAgICAoMHgwMDAwMDUxMSkKKworLyoqCiAgKiBPdXRzaWRlIHRlbXBlcmF0dXJlCiAgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfRkxPQVQKICAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFfFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9DT05USU5VT1VTCkBAIC0zOTYsOCArNDk1LDcgQEAKICAqIEBkYXRhX21lbWJlciBvdXRzaWRlX3RlbXBlcmF0dXJlCiAgKiBAdW5pdCBWRUhJQ0xFX1VOSVRfVFlQRV9DRUxDSVVTCiAgKi8KLQotI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0VOVl9PVVRTSURFX1RFTVBFUkFUVVJFICAgICAgICAgICAgICAgICAgICgweDAwMDAwNzAzKQorI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0VOVl9PVVRTSURFX1RFTVBFUkFUVVJFICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDcwMykKIAogCiAvKioKQEAgLTQwOCw3ICs1MDYsNyBAQAogICogQGRhdGFfbWVtYmVyIGNhYmluX3RlbXBlcmF0dXJlCiAgKiBAdW5pdCBWRUhJQ0xFX1VOSVRfVFlQRV9DRUxDSVVTCiAgKi8KLSNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9FTlZfQ0FCSU5fVEVNUEVSQVRVUkUgICAgICAgICAgICAgICAgICAoMHgwMDAwMDcwNCkKKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9FTlZfQ0FCSU5fVEVNUEVSQVRVUkUgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDA3MDQpCiAKIAogLyoKQEAgLTQzNCw3ICs1MzIsNyBAQAogICogQGNvbmZpZ19mbGFncyBOdW1iZXIgb2YgcHJlc2V0cyBzdXBwb3J0ZWQKICAqIEBkYXRhX21lbWJlciBpbnQzMl9hcnJheQogICovCi0jZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfUkFESU9fUFJFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDA4MDEpCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfUkFESU9fUFJFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwODAxKQogCiAvKioKICAqIENvbnN0YW50cyByZWxldmFudCB0byByYWRpby4KQEAgLTQ5Miw3ICs1OTAsMTMgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICBWRUhJQ0xFX0FVRElPX0VYVF9GT0NVU19DQVJfUEVSTUFORU5UIHdoZW4gY2FyIHNpZGUgaXMgcGxheWluZyBzb21ldGhpbmcKICAqICAgICAgICAgICAgICAgICAgICAgICBwZXJtYW5lbnQuCiAgKiAgICAgICAgICAgICAgICAgICBMT1NTX1RSQU5TSUVOVDogYWx3YXlzIHNob3VsZCBiZSBWRUhJQ0xFX0FVRElPX0VYVF9GT0NVU19DQVJfVFJBTlNJRU5UCi0gKiAgIGludDMyX2FycmF5WzNdOiBzaG91bGQgYmUgemVyby4KKyAqICAgaW50MzJfYXJyYXlbM106IGNvbnRleHQgcmVxdWVzdGVkIGJ5IGFuZHJvaWQgc2lkZSB3aGVuIHJlc3BvbmRpbmcgdG8gZm9jdXMgcmVxdWVzdC4KKyAqICAgICAgICAgICAgICAgICAgIFdoZW4gY2FyIHNpZGUgaXMgdGFraW5nIGZvY3VzIGF3YXksIHRoaXMgc2hvdWxkIGJlIHplcm8uCisgKgorICogQSBmb2N1cyByZXNwb25zZSBzaG91bGQgYmUgc2VudCBwZXIgZWFjaCBmb2N1cyByZXF1ZXN0IGV2ZW4gaWYgdGhlcmUgaXMgbm8gY2hhbmdlIGluCisgKiBmb2N1cyBzdGF0ZS4gVGhpcyBjYW4gaGFwcGVuIGluIGNhc2UgbGlrZSBmb2N1cyByZXF1ZXN0IG9ubHkgaW52b2x2aW5nIGNvbnRleHQgY2hhbmdlCisgKiB3aGVyZSBhbmRyb2lkIHNpZGUgc3RpbGwgbmVlZHMgbWF0Y2hpbmcgZm9jdXMgcmVzcG9uc2UgdG8gY29uZmlybSB0aGF0IGF1ZGlvIG1vZHVsZQorICogaGFzIG1hZGUgbmVjZXNzYXJ5IGNoYW5nZXMuCiAgKgogICogSWYgY2FyIGRvZXMgbm90IHN1cHBvcnQgVkVISUNMRV9QUk9QRVJUWV9BVURJT19GT0NVUywgZm9jdXMgaXMgYXNzdW1lZCB0byBiZSBncmFudGVkIGFsd2F5cy4KICAqCkBAIC01MDEsNyArNjA1LDcgQEAKICAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCiAgKiBAZGF0YV9tZW1iZXIgaW50MzJfYXJyYXkKICAqLwotI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0FVRElPX0ZPQ1VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwOTAwKQorI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0FVRElPX0ZPQ1VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDkwMCkKIAogZW51bSB2ZWhpY2xlX2F1ZGlvX2ZvY3VzX3JlcXVlc3QgewogICAgIFZFSElDTEVfQVVESU9fRk9DVVNfUkVRVUVTVF9HQUlOID0gMHgxLApAQCAtNjM4LDEzICs3NDIsMjMgQEAKICAgICBWRUhJQ0xFX0FVRElPX0NPTlRFWFRfU1lTVEVNX1NPVU5EX0ZMQUcgICAgICAgICAgICAgICA9IDB4NDAwLAogICAgIC8qKiBSYWRpbyBpcyBwbGF5ZWQgKi8KICAgICBWRUhJQ0xFX0FVRElPX0NPTlRFWFRfUkFESU9fRkxBRyAgICAgICAgICAgICAgICAgICAgICA9IDB4ODAwLAorICAgIC8qKiBFeHQgc291cmNlIGlzIHBsYXllZC4gVGhpcyBpcyBmb3IgdGFnZ2luZyBnZW5lcmljIGV4dCBzb3VyY2VzLiAqLworICAgIFZFSElDTEVfQVVESU9fQ09OVEVYVF9FWFRfU09VUkNFX0ZMQUcgICAgICAgICAgICAgICAgID0gMHgxMDAwLAogfTsKIAogLyoqCiAgKiBQcm9wZXJ0eSB0byBjb250cm9sIGF1ZGlvIHZvbHVtZSBvZiBlYWNoIGF1ZGlvIGNvbnRleHQuCiAgKgorICogdmVoaWNsZV9wcm9wX2NvbmZpZ190CisgKiAgIGNvbmZpZ19hcnJheVswXSA6IGJpdCBmbGFncyBvZiBhbGwgc3VwcG9ydGVkIGF1ZGlvIGNvbnRleHRzLiBJZiB0aGlzIGlzIDAsCisgKiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHZvbHVtZSBpcyBjb250cm9sbGVkIHBlciBwaHlzaWNhbCBzdHJlYW0KKyAqICAgY29uZmlnX2FycmF5WzFdIDogZmxhZ3MgZGVmaW5lZCBpbiB2ZWhpY2xlX2F1ZGlvX3ZvbHVtZV9jYXBhYmlsaXR5X2ZsYWcgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50IGF1ZGlvIG1vZHVsZSdzIGNhcGFiaWxpdHkuCisgKgogICogRGF0YSB0eXBlIGxvb2tzIGxpa2U6Ci0gKiAgIGludDMyX2FycmF5WzBdIDogc3RyZWFtIGNvbnRleHQgYXMgZGVmaW5lZCBpbiB2ZWhpY2xlX2F1ZGlvX2NvbnRleHRfZmxhZy4KKyAqICAgaW50MzJfYXJyYXlbMF0gOiBzdHJlYW0gY29udGV4dCBhcyBkZWZpbmVkIGluIHZlaGljbGVfYXVkaW9fY29udGV4dF9mbGFnLiBJZiBvbmx5IHBoeXNpY2FsCisgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGlzIHN1cHBvcnRlZCAoY29uZmlnX2FycmF5WzBdID09IDApLCB0aGlzIHdpbGwgcmVwcmVzZW50IHBoeXNpY2FsCisgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIG51bWJlci4KICAqICAgaW50MzJfYXJyYXlbMV0gOiB2b2x1bWUgbGV2ZWwsIHZhbGlkIHJhbmdlIGlzIDAgdG8gaW50MzJfbWF4X3ZhbHVlIGRlZmluZWQgaW4gY29uZmlnLgogICogICAgICAgICAgICAgICAgICAgIDAgd2lsbCBiZSBtdXRlIHN0YXRlLiBpbnQzMl9taW5fdmFsdWUgaW4gY29uZmlnIHNob3VsZCBiZSBhbHdheXMgMC4KICAqICAgaW50MzJfYXJyYXlbMl0gOiBPbmUgb2YgdmVoaWNsZV9hdWRpb192b2x1bWVfc3RhdGUuCkBAIC02NTgsNyArNzcyLDM0IEBACiAgKiBAY29uZmlnX2ZsYWdzIGFsbCBhdWRpbyBjb250ZXh0cyBzdXBwb3J0ZWQuCiAgKiBAZGF0YV9tZW1iZXIgaW50MzJfYXJyYXkKICAqLwotI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0FVRElPX1ZPTFVNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwOTAxKQorI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0FVRElPX1ZPTFVNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDkwMSkKKworCisvKioKKyAqIGZsYWdzIHRvIHJlcHJlc2VudCBjYXBhYmlsaXR5IG9mIGF1ZGlvIHZvbHVtZSBwcm9wZXJ0eS4KKyAqIHVzZWQgaW4gY29uZmlnX2FycmF5WzFdIG9mIHZlaGljbGVfcHJvcF9jb25maWdfdC4KKyAqLworZW51bSB2ZWhpY2xlX2F1ZGlvX3ZvbHVtZV9jYXBhYmlsaXR5X2ZsYWcgeworICAgIC8qKgorICAgICAqIEV4dGVybmFsIGF1ZGlvIG1vZHVsZSBvciB2ZWhpY2xlIGhhbCBoYXMgcGVyc2lzdGVudCBzdG9yYWdlCisgICAgICogdG8ga2VlcCB0aGUgdm9sdW1lIGxldmVsLiBUaGlzIHNob3VsZCBiZSBzZXQgb25seSB3aGVuIHBlciBjb250ZXh0CisgICAgICogdm9sdW1lIGxldmVsIGlzIHN1cHByb3RlZC4gV2hlbiB0aGlzIGlzIHNldCwgYXVkaW8gdm9sdW1lIGxldmVsIHBlcgorICAgICAqIGVhY2ggY29udGV4dCB3aWxsIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBwcm9wZXJ0eSB3aGVuIHN5c3RlbiBzdGFydHMgdXAuCisgICAgICogQW5kIGV4dGVybmFsIGF1ZGlvIG1vZHVsZSBpcyBhbHNvIGV4cGVjdGVkIHRvIGFkanVzdCB2b2x1bWUgYXV0b21hdGljYWxseQorICAgICAqIHdoZW5ldmVyIHRoZXJlIGlzIGFuIGF1ZGlvIGNvbnRleHQgY2hhbmdlLgorICAgICAqIFdoZW4gdGhpcyBmbGFnIGlzIG5vdCBzZXQsIGFuZHJvaWQgc2lkZSB3aWxsIGFzc3VtZSB0aGF0IHRoZXJlIGlzIG5vCisgICAgICogcGVyc2lzdGVudCBzdG9yYWdlIGFuZCBzdG9yZWQgdmFsdWUgaW4gYW5kcm9pZCBzaWRlIHdpbGwgYmUgdXNlZCB0bworICAgICAqIGluaXRpYWxpemUgdGhlIHZvbHVtZSBsZXZlbC4gQW5kIGFuZHJvaWQgc2lkZSB3aWxsIHNldCB2b2x1bWUgbGV2ZWwKKyAgICAgKiBvZiBlYWNoIHBoeXNpY2FsIHN0cmVhbXMgd2hlbmV2ZXIgdGhlcmUgaXMgYW4gYXVkaW8gY29udGV4dCBjaGFuZ2UuCisgICAgICovCisgICAgVkVISUNMRV9BVURJT19WT0xVTUVfQ0FQQUJJTElUWV9QRVJTSVNURU5UX1NUT1JBR0UgPSAweDEsCisgICAgLyoqCisgICAgICogV2hlbiB0aGlzIGZsYWcgaXMgc2V0LCB0aGUgSC9XIGNhbiBzdXBwb3J0IG9ubHkgc2luZ2xlIG1hc3RlciB2b2x1bWUgZm9yIGFsbCBzdHJlYW1zLgorICAgICAqIFRoZXJlIGlzIG5vIHdheSB0byBzZXQgdm9sdW1lIGxldmVsIGRpZmZlcmVudGx5IHBlciBlYWNoIHN0cmVhbSBvciBjb250ZXh0LgorICAgICAqLworICAgIFZFSElDTEVfQVVESU9fVk9MVU1FX0NBUEFCSUxJVFlfTUFTVEVSX1ZPTFVNRV9PTkxZID0gMHgyLAorfTsKKwogCiAvKioKICAqIGVudW0gdG8gcmVwcmVzZW50IGF1ZGlvIHZvbHVtZSBzdGF0ZS4KQEAgLTY4Myw4ICs4MjQsMTggQEAKIAogLyoqCiAgKiBQcm9wZXJ0eSBmb3IgaGFuZGxpbmcgdm9sdW1lIGxpbWl0IHNldCBieSB1c2VyLiBUaGlzIGxpbWl0cyBtYXhpbXVtIHZvbHVtZSB0aGF0IGNhbiBiZSBzZXQKLSAqIHBlciBlYWNoIGNvbnRleHQuCi0gKiAgIGludDMyX2FycmF5WzBdIDogc3RyZWFtIGNvbnRleHQgYXMgZGVmaW5lZCBpbiB2ZWhpY2xlX2F1ZGlvX2NvbnRleHRfZmxhZy4KKyAqIHBlciBlYWNoIGNvbnRleHQgb3IgcGh5c2ljYWwgc3RyZWFtLgorICoKKyAqIHZlaGljbGVfcHJvcF9jb25maWdfdAorICogICBjb25maWdfYXJyYXlbMF0gOiBiaXQgZmxhZ3Mgb2YgYWxsIHN1cHBvcnRlZCBhdWRpbyBjb250ZXh0cy4gSWYgdGhpcyBpcyAwLAorICogICAgICAgICAgICAgICAgICAgICBhdWRpbyB2b2x1bWUgaXMgY29udHJvbGxlZCBwZXIgcGh5c2ljYWwgc3RyZWFtCisgKiAgIGNvbmZpZ19hcnJheVsxXSA6IGZsYWdzIGRlZmluZWQgaW4gdmVoaWNsZV9hdWRpb192b2x1bWVfY2FwYWJpbGl0eV9mbGFnIHRvCisgKiAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudCBhdWRpbyBtb2R1bGUncyBjYXBhYmlsaXR5LgorICoKKyAqIERhdGEgdHlwZSBsb29rcyBsaWtlOgorICogICBpbnQzMl9hcnJheVswXSA6IHN0cmVhbSBjb250ZXh0IGFzIGRlZmluZWQgaW4gdmVoaWNsZV9hdWRpb19jb250ZXh0X2ZsYWcuIElmIG9ubHkgcGh5c2ljYWwKKyAqICAgICAgICAgICAgICAgICAgICBzdHJlYW0gaXMgc3VwcG9ydGVkIChjb25maWdfYXJyYXlbMF0gPT0gMCksIHRoaXMgd2lsbCByZXByZXNlbnQgcGh5c2ljYWwKKyAqICAgICAgICAgICAgICAgICAgICBzdHJlYW0gbnVtYmVyLgogICogICBpbnQzMl9hcnJheVsxXSA6IG1heGltdW0gdm9sdW1lIHNldCB0byB0aGUgc3RyZWFtLiBJZiB0aGVyZSBpcyBubyByZXN0cmljdGlvbiwgdGhpcyB2YWx1ZQogICogICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgIGJpZ2dlciB0aGFuIFZFSElDTEVfUFJPUEVSVFlfQVVESU9fVk9MVU1FJ3MgbWF4IHZhbHVlLgogICoKQEAgLTY5OCw3ICs4NDksNyBAQAogICogQGNvbmZpZ19mbGFncyBhbGwgYXVkaW8gY29udGV4dHMgc3VwcG9ydGVkLgogICogQGRhdGFfbWVtYmVyIGludDMyX2FycmF5CiAgKi8KLSNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9BVURJT19WT0xVTUVfTElNSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDkwMikKKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9BVURJT19WT0xVTUVfTElNSVQgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDA5MDIpCiAKIC8qKgogICogSW5kZXggaW4gaW50MzJfYXJyYXkgZm9yIFZFSElDTEVfUFJPUEVSVFlfQVVESU9fVk9MVU1FX0xJTUlUIHByb3BlcnR5LgpAQCAtNzI3LDcgKzg3OCw3IEBACiAgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEUKICAqIEBkYXRhX21lbWJlciBpbnQzMl9hcnJheQogICovCi0jZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfQVVESU9fUk9VVElOR19QT0xJQ1kgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDA5MDMpCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfQVVESU9fUk9VVElOR19QT0xJQ1kgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwOTAzKQogCiAvKioKICAqIEluZGV4IGluIGludDMyX2FycmF5IGZvciBWRUhJQ0xFX1BST1BFUlRZX0FVRElPX1JPVVRJTkdfUE9MSUNZIHByb3BlcnR5LgpAQCAtNzUwLDcgKzkwMSw3IEBACiAqICAgICAgICAgICAgICAgdGhpcy4KICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCiAqLwotI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0FVRElPX0hXX1ZBUklBTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwOTA0KQorI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0FVRElPX0hXX1ZBUklBTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDkwNCkKIAogLyoqCiAgKiBGbGFnIHRvIGJlIHVzZWQgaW4gdmVoaWNsZV9wcm9wX2NvbmZpZy5jb25maWdfZmxhZ3MgZm9yIFZFSElDTEVfUFJPUEVSVFlfQVVESU9fSFdfVkFSSUFOVC4KQEAgLTc2Niw2ICs5MTcsNzAgQEAKICAgICBWRUhJQ0xFX0FVRElPX0hXX1ZBUklBTlRfRkxBR19JTlRFUk5BTF9SQURJT19GTEFHID0gMHgxLAogfTsKIAorLyoqIGF1ZGlvIHJvdXRpbmcgZm9yIEFNL0ZNLiBUaGlzIHNob3VsZCBiZSBhbHNvIGJlIHRoZSB2YWx1ZSB3aGVuIHRoZXJlIGlzIG9ubHkgb25lCisgICAgcmFkaW8gbW9kdWxlIGluIHRoZSBzeXN0ZW0uICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfQVVESU9fRVhUX1JPVVRJTkdfU09VUkNFX1JBRElPX0FNX0ZNICJSQURJT19BTV9GTSIKKy8qKiBTaG91bGQgYmUgYWRkZWQgb25seSB3aGVuIHRoZXJlIGlzIGEgc2VwYXJhdGUgcmFkaW8gbW9kdWxlIHdpdGggSEQgY2FwYWJpbGl0eS4gKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9BVURJT19FWFRfUk9VVElOR19TT1VSQ0VfUkFESU9fQU1fRk1fSEQgIlJBRElPX0FNX0ZNX0hEIgorLyoqIEZvciBkaWdpYWwgYXVkaW8gYnJvYWRjYXN0aW5nIHR5cGUgb2YgcmFkaW8gKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9BVURJT19FWFRfUk9VVElOR19TT1VSQ0VfUkFESU9fREFCICJSQURJT19EQUIiCisvKiogRm9yIHNhdGVsbGl0ZSB0eXBlIG9mIHJhZGlvICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfQVVESU9fRVhUX1JPVVRJTkdfU09VUkNFX1JBRElPX1NBVEVMTElURSAiUkFESU9fU0FURUxMSVRFIgorLyoqIEZvciBDRCBvciBEVkQgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9BVURJT19FWFRfUk9VVElOR19TT1VSQ0VfQ0RfRFZEICJDRF9EVkQiCisvKiogRm9yIDFzdCBhdXhpbGlhcnkgaW5wdXQgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9BVURJT19FWFRfUk9VVElOR19TT1VSQ0VfQVVYX0lOMCAiQVVYX0lOMCIKKy8qKiBGb3IgMm5kIGF1eGlsaWFyeSBpbnB1dCAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0FVRElPX0VYVF9ST1VUSU5HX1NPVVJDRV9BVVhfSU4xICJBVVhfSU4xIgorLyoqIEZvciBuYXZpZ2F0aW9uIGd1aWRhbmNlIGZyb20gb3V0c2lkZSBhbmRyb2lkICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfQVVESU9fRVhUX1JPVVRJTkdfU09VUkNFX0VYVF9OQVZfR1VJREFOQ0UgIkVYVF9OQVZfR1VJREFOQ0UiCisvKiogRm9yIHZvaWNlIGNvbW1hbmQgZnJvbSBvdXRzaWRlIGFuZHJvaWQgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9BVURJT19FWFRfUk9VVElOR19TT1VSQ0VfRVhUX1ZPSUNFX0NPTU1BTkQgIkVYVF9WT0lDRV9DT01NQU5EIgorLyoqIEZvciB2b2ljZSBjYWxsIGZyb20gb3V0c2lkZSBhbmRyb2lkICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfQVVESU9fRVhUX1JPVVRJTkdfU09VUkNFX0VYVF9WT0lDRV9DQUxMICJFWFRfVk9JQ0VfQ0FMTCIKKy8qKiBGb3Igc2FmZXR5IGFsZXJ0IGZyb20gb3V0c2lkZSBhbmRyb2lkICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfQVVESU9fRVhUX1JPVVRJTkdfU09VUkNFX0VYVF9TQUZFVFlfQUxFUlQgIkVYVF9TQUZFVFlfQUxFUlQiCisKKy8qKgorKiBQcm9wZXJ0eSB0byBwYXNzIGhpbnQgb24gZXh0ZXJuYWwgYXVkaW8gcm91dGluZy4gV2hlbiBhbmRyb2lkIHNpZGUgcmVxdWVzdCBmb2N1cworKiB3aXRoIFZFSElDTEVfQVVESU9fRVhUX0ZPQ1VTX0NBUl9QTEFZX09OTFlfRkxBRyBmbGFnLCB0aGlzIHByb3BlcnR5IHdpbGwgYmUgc2V0CisqIGJlZm9yZSBzZXR0aW5nIEFVRElPX0ZPQ1VTIHByb3BlcnR5IGFzIGEgaGludCBmb3IgZXh0ZXJuYWwgYXVkaW8gc291cmNlIHJvdXRpbmcuCisqIE5vdGUgdGhhdCBzZXR0aW5nIHRoaXMgcHJvcGVydHkgYWxvbmUgc2hvdWxkIG5vdCB0cmlnZ2VyIGFueSBjaGFuZ2UuCisqIEF1ZGlvIHJvdXRpbmcgc2hvdWxkIGJlIGNoYW5nZWQgb25seSB3aGVuIEFVRElPX0ZPQ1VTIHByb3BlcnR5IGlzIHNldC4gTm90ZSB0aGF0CisqIHRoaXMgcHJvcGVydHkgYWxsb3dzIHBhc3NpbmcgY3VzdG9tIHZhbHVlIGFzIGxvbmcgYXMgaXQgaXMgZGVmaW5lZCBpbiBjb25maWdfc3RyaW5nLgorKiBUaGlzIGFsbG93cyBzdXBwb3J0aW5nIG5vbi1zdGFuZGFyZCByb3V0aW5nIG9wdGlvbnMgdGhyb3VnaCB0aGlzIHByb3BlcnR5LgorKiBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2Ugc2VwYXJhdGUgbmFtZSBzcGFjZSBmb3IgY3VzdG9tIHByb3BlcnR5IHRvIHByZXZlbnQgY29uZmxpY3QgaW4gZnV0dXJlCisqIGFuZHJvaWQgcmVsZWFzZXMuCisqIEVuYWJsaW5nIGVhY2ggZXh0ZXJuYWwgcm91dGluZyBvcHRpb24gaXMgZG9uZSBieSBlbmFibGluZyBlYWNoIGJpdCBmbGFnIGZvciB0aGUgcm91dGluZy4KKyogVGhpcyBwcm9wZXJ0eSBjYW4gc3VwcG9ydCB1cCB0byAxMjggZXh0ZXJuYWwgcm91dGluZ3MuCisqIFRvIGdpdmUgZnVsbCBmbGV4aWJpbGl0eSwgdGhlcmUgaXMgbm8gc3RhbmRhcmQgZGVmaW5pdGlvbiBmb3IgZWFjaCBiaXQgZmxhZyBhbmQKKyogYXNzaWduaW5nIGVhY2ggYmlnIGZsYWcgdG8gc3BlY2lmaWMgcm91dGluZyB0eXBlIGlzIGRlY2lkZWQgYnkgY29uZmlnX3N0cmluZy4KKyogY29uZmlnX3N0cmluZyBoYXMgZm9ybWF0IG9mIGVhY2ggZW50cnkgc2VwYXJhdGVkIGJ5ICcsJworKiBhbmQgZWFjaCBlbnRyeSBoYXMgZm9ybWF0IG9mIGJpdEZsYWdQb3NpdG9uOnR5cGVTdHJpbmdbOnBoeXNpY2FsU3RyZWFtTnVtYmVyXS4KKyogIGJpdEZsYWdQb3NpdGlvbjogcmVwcmVzZW50cyB3aGljaCBiaWcgZmxhZyB3aWxsIGJlIHNldCB0byBlbmFibGUgdGhpcyByb3V0aW5nLiAwIG1lYW5zCisqICAgIExTQiBpbiBpbnQzMl9hcnJheVswXS4gMzEgd2lsbCBiZSBNU0IgaW4gaW50MzJfYXJyYXlbMF0uIDEyNyB3aWxsIE1TQiBpbiBpbnQzMl9hcnJheVszXS4KKyogIHR5cGVTdHJpbmc6IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBleHRlcm5hbCByb3V0aW5nLiBTb21lIHR5cGVzIGFyZSBhbHJlYWR5IGRlZmluZWQKKyogICAgaW4gVkVISUNMRV9QUk9QRVJUWV9BVURJT19FWFRfUk9VVElOR19TT1VSQ0VfKiBhbmQgdXNlIHRoZW0gZmlyc3QgYmVmb3JlIGFkZGluZyBzb21ldGhpbmcKKyogICAgY3VzdG9tLiBBcHBsaWNhdGlvbnMgd2lsbCBmaW5kIGVhY2ggcm91dGluZyB1c2luZyB0aGlzIHN0cmluZy4KKyogIHBoeXNpY2FsU3RyZWFtTnVtYmVyOiBUaGlzIHBhcnQgaXMgb3B0aW9uYWwgYW5kIHJlcHJlc2VudHMgcGh5c2ljYWwgc3RyZWFtIHRvIGFuZHJvaWQKKyogICAgd2hpY2ggd2lsbCBiZSBkaXNhYmxlZCB3aGVuIHRoaXMgcm91dGluZyBpcyBlbmFibGVkLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGlzIHJvdXRpbmcKKyogICAgc2hvdWxkIG5vdCBhZmZlY3QgcGh5c2ljYWwgc3RyZWFtcyB0byBhbmRyb2lkLgorKiBBcyBhbiBleGFtcGxlLCBsZXQncyBhc3N1bWUgYSBzeXN0ZW0gd2l0aCB0d28gcGh5c2ljYWwgc3RyZWFtcywgMCBmb3IgbWVkaWEgYW5kIDEgZm9yCisqIG5hdiBndWlkYW5jZS4gQW5kIGxldCdzIGFzc3VtZSBleHRlcm5hbCByb3V0aW5nIG9wdGlvbiBvZiBhbSBmbSByYWRpbywgZXh0ZXJuYWwgbmF2aWdhdGlvbgorKiBndWlkYW5jZSwgc2F0ZWxsaXRlIHJhZGlvLCBhbmQgb25lIGN1c3RvbS4gTGV0J3MgYXNzdW1lIHRoYXQgcmFkaW8gYW5kIHNhdGVsbGl0ZSByZXBsYWNlcworKiBwaHlzaWNhbCBzdHJlYW0gMCBhbmQgZXh0ZXJuYWwgbmF2aWdhdGlvbiByZXBsYWNlcyBwaHlzaWNhbCBzdHJlYW0gMS4gQW5kIGJpdCBmbGFnIHdpbGwgYmUKKyogYXNzaWduZWQgaW4gdGhlIG9yZGVyIGxpc3RlZCBhYm92ZS4gVGhpcyBjb25maWd1cmF0aW9uIHdpbGwgbG9vayBsaWtlIHRoaXMgaW4gY29uZmlnX3N0cmluZzoKKyogICIwOlJBRElPX0FNX0ZNOjAsMTpFWFRfTkFWX0dVSURBTkNFOjEsMjpSQURJT19TQVRFTExJVEU6MCwzOmNvbS50ZXN0LlNPTUVUSElOR19DVVNUT00iCisqIFdoZW4gYW5kcm9pZCByZXF1ZXN0cyBSQURJT19BTV9GTSwgaW50MzJfYXJyYXlbMF0gd2lsbCBiZSBzZXQgdG8gMHgxLgorKiBXaGVuIGFuZHJvaWQgcmVxdWVzdHMgUkFESU9fU0FURUxMSVRFICsgRVhUX05BVl9HVUlEQU5DRSwgaW50MzJfYXJyYXlbMF0gd2lsbCBiZSBzZXQgdG8gMHgyfDB4NC4KKyoKKyogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX0lOVDMyX1ZFQzQKKyogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1dSSVRFfFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQorKiBAY29uZmlnX3N0cmluZyBMaXN0IG9mIGFsbCBhdmFpYWJsZSBleHRlcm5hbCBzb3VyY2UgaW4gdGhlIHN5c3RlbS4KKyogQGRhdGFfbWVtYmVyIGludDMyX2FycmF5CisqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0FVRElPX0VYVF9ST1VUSU5HX0hJTlQgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDkwNSkKIAogLyoqCiAgKiBQcm9wZXJ0eSB0byBjb250cm9sIHBvd2VyIHN0YXRlIG9mIGFwcGxpY2F0aW9uIHByb2Nlc3Nvci4KQEAgLTc4OCw3ICsxMDAzLDcgQEAKICAqIEBjb25maWdfZmxhZ3MgQWRkaXRpb25hbCBpbmZvIG9uIHBvd2VyIHN0YXRlLiBTaG91bGQgdXNlIHZlaGljbGVfYXBfcG93ZXJfc3RhdGVfY29uZmlnX2ZsYWcuCiAgKiBAZGF0YV9tZW1iZXIgaW50MzJfYXJyYXkKICAqLwotI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0FQX1BPV0VSX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQTAwKQorI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0FQX1BPV0VSX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEEwMCkKIAogZW51bSB2ZWhpY2xlX2FwX3Bvd2VyX3N0YXRlX2NvbmZpZ19mbGFnIHsKICAgICAvKioKQEAgLTg5NSw3ICsxMTEwLDcgQEAKICAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEfFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQogICogQGRhdGFfbWVtYmVyIGludDMyCiAgKi8KLSNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9ESVNQTEFZX0JSSUdIVE5FU1MgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEEwMSkKKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9ESVNQTEFZX0JSSUdIVE5FU1MgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBBMDEpCiAKIAogLyoqCkBAIC05OTksNyArMTIxNCw3IEBACiAgKiBAY29uZmlnX2FycmF5IDA6dmVoaWNsZV9pbnN0dW1lbnRfY2x1c3Rlcl90eXBlIDE6aHcgdHlwZQogICogQGRhdGFfbWVtYmVyIGludDMyX2FycmF5CiAgKi8KLSNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9JTlNUUlVNRU5UX0NMVVNURVJfSU5GTyAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQTIwKQorI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0lOU1RSVU1FTlRfQ0xVU1RFUl9JTkZPICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEEyMCkKIAogLyoqCiAgKiBSZXByZXNlbnRzIGluc3RydW1lbnQgY2x1c3RlciB0eXBlIGF2YWlsYWJsZSBpbiBzeXN0ZW0KQEAgLTEwMTksNiArMTIzNCw2MjQgQEAKIH07CiAKIC8qKgorICogQ3VycmVudCBkYXRlIGFuZCB0aW1lLCBlbmNvZGVkIGFzIFVuaXggdGltZS4KKyAqIFRoaXMgdmFsdWUgZGVub3RlcyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2UgMS8xLzE5NzAuCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX0lOVDY0CisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX1NFVAorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKKyAqIEBkYXRhX21lbWJlciBpbnQ2NF92YWx1ZQorICogQHVuaXQgVkVISUNMRV9VTklUX1RZUEVfU0VDUworICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfVU5JWF9USU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQTMwKQorCisvKioKKyAqIEN1cnJlbnQgdGltZSBvbmx5LgorICogU29tZSB2ZWhpY2xlcyBtYXkgbm90IGtlZXAgdHJhY2sgb2YgZGF0ZS4gIFRoaXMgcHJvcGVydHkgb25seSBhZmZlY3RzIHRoZSBjdXJyZW50IHRpbWUsIGluCisgKiBzZWNvbmRzIGR1cmluZyB0aGUgZGF5LiAgVGh1cywgdGhlIG1heCB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaXMgODYsNDAwICgyNCAqIDYwICogNjApCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX1NFVAorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICogQHVuaXQgVkVISUNMRV9VTklUX1RZUEVfU0VDUworICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfQ1VSUkVOVF9USU1FX0lOX1NFQ09ORFMgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQTMxKQorCisKKy8vPT09PSBDYXIgQ2FiaW4gUHJvcGVydGllcyA9PT09CisvKioKKyAqIE1vc3QgQ2FyIENhYmluIHByb3BlcnRpZXMgaGF2ZSBib3RoIGEgTU9WRSBhbmQgUE9TSVRJT04gcGFyYW1ldGVyIGFzc29jaWF0ZWQgd2l0aCB0aGVtLgorICoKKyAqIFRoZSBNT1ZFIHBhcmFtZXRlciB3aWxsIHN0YXJ0IG1vdmluZyB0aGUgZGV2aWNlIGluIHRoZSBpbmRpY2F0ZWQgZGlyZWN0aW9uLiAgVGhlIG1hZ25pdHVkZQorICogaW5kaWNhdGVzIHRoZSByZWxhdGl2ZSBzcGVlZC4gIEZvciBpbnN0YW5jZSwgc2V0dGluZyB0aGUgV0lORE9XX01PVkUgcGFyYW1ldGVyIHRvICsxIHdpbGwgcm9sbAorICogdGhlIHdpbmRvdyB1cC4gIFNldHRpbmcgaXQgdG8gKzIgKGlmIGF2YWlsYWJsZSkgd2lsbCByb2xsIGl0IHVwIGZhc3Rlci4KKyAqCisgKiBUaGUgUE9TSVRJT04gcGFyYW1ldGVyIHdpbGwgbW92ZSB0aGUgZGV2aWNlIHRvIHRoZSBkZXNpcmVkIHBvc2l0aW9uLiAgRm9yIGluc3RhbmNlLCBpZiB0aGUKKyAqIFdJTkRPV19QT1MgaGFzIGEgcmFuZ2Ugb2YgMC0xMDAsIHRoZW4gc2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byA1MCB3aWxsIG9wZW4gdGhlIHdpbmRvdyBoYWxmd2F5LgorICogRGVwZW5kaW5nIHVwb24gdGhlIGluaXRpYWwgcG9zaXRpb24sIHRoZSB3aW5kb3cgbWF5IG1vdmUgdXAgb3IgZG93biB0byB0aGUgNTAlIHZhbHVlLgorICoKKyAqIE9FTXMgbWF5IGNob29zZSB0byBpbXBsZW1lbnQgb25lIG9yIGJvdGggb2YgdGhlIE1PVkUvUE9TSVRJT04gcGFyYW1ldGVycyBkZXBlbmRpbmcgdXBvbiB0aGUKKyAqIGNhcGFiaWxpdHkgb2YgdGhlIGhhcmR3YXJlLgorICovCisKKy8vIERvb3JzCisvKioKKyAqIERvb3IgcG9zaXRpb24KKyAqCisgKiBUaGlzIGlzIGFuIGludGVnZXIgaW4gY2FzZSBhIGRvb3IgbWF5IGJlIHNldCB0byBhIHBhcnRpY3VsYXIgcG9zaXRpb24uICBNYXgKKyAqIHZhbHVlIGluZGljYXRlcyBmdWxseSBvcGVuLCBtaW4gdmFsdWUgKDApIGluZGljYXRlcyBmdWxseSBjbG9zZWQuCisgKgorICogU29tZSB2ZWhpY2xlcyAobWluaXZhbnMpIGNhbiBvcGVuIHRoZSBkb29yIGVsZWN0cm9uaWNhbGx5LiAgSGVuY2UsIHRoZSBhYmlsaXR5CisgKiB0byB3cml0ZSB0aGlzIHByb3BlcnR5LgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEfFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfRE9PUgorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9ET09SX1BPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCMDApCisKKy8qKgorICogRG9vciBtb3ZlCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEV8VkVISUNMRV9QUk9QX0FDQ0VTU19XUklURQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9ET09SCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0RPT1JfTU9WRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEIwMSkKKworCisvKioKKyAqIERvb3IgbG9jaworICoKKyAqICd0cnVlJyBpbmRpY2F0ZXMgZG9vciBpcyBsb2NrZWQKKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfQk9PTEVBTgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX0RPT1IKKyAqIEBkYXRhX21lbWJlciBib29sZWFuX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9ET09SX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCMDIpCisKKy8vIE1pcnJvcnMKKy8qKgorICogTWlycm9yIFogUG9zaXRpb24KKyAqCisgKiBQb3NpdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgdGlsdCB1cHdhcmRzLCBuZWdhdGl2ZSB2YWx1ZSBpcyBkb3dud2FyZHMKKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9NSVJST1IKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfTUlSUk9SX1pfUE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQjQwKQorCisvKioKKyAqIE1pcnJvciBaIE1vdmUKKyAqCisgKiBQb3NpdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgdGlsdCB1cHdhcmRzLCBuZWdhdGl2ZSB2YWx1ZSBpcyBkb3dud2FyZHMKKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURXxWRUhJQ0xFX1BST1BfQUNDRVNTX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX01JUlJPUgorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9NSVJST1JfWl9NT1ZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCNDEpCisKKy8qKgorICogTWlycm9yIFkgUG9zaXRpb24KKyAqCisgKiBQb3NpdGl2ZSB2YWx1ZSBpbmRpY2F0ZSB0aWx0IHJpZ2h0LCBuZWdhdGl2ZSB2YWx1ZSBpcyBsZWZ0CisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfTUlSUk9SCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX01JUlJPUl9ZX1BPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEI0MikKKworLyoqCisgKiBNaXJyb3IgWSBNb3ZlCisgKgorICogUG9zaXRpdmUgdmFsdWUgaW5kaWNhdGUgdGlsdCByaWdodCwgbmVnYXRpdmUgdmFsdWUgaXMgbGVmdAorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFfFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfTUlSUk9SCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX01JUlJPUl9ZX01PVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEI0MykKKworLyoqCisgKiBNaXJyb3IgTG9jaworICoKKyAqIFRydWUgaW5kaWNhdGVzIG1pcnJvciBwb3NpdGlvbnMgYXJlIGxvY2tlZCBhbmQgbm90IGNoYW5nZWFibGUKKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfQk9PTEVBTgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCisgKiBAZGF0YV9tZW1iZXIgYm9vbGVhbl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfTUlSUk9SX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQjQ0KQorCisvKioKKyAqIE1pcnJvciBGb2xkCisgKgorICogVHJ1ZSBpbmRpY2F0ZXMgbWlycm9ycyBhcmUgZm9sZGVkCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX0JPT0xFQU4KKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQorICogQGRhdGFfbWVtYmVyIGJvb2xlYW5fdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX01JUlJPUl9GT0xEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEI0NSkKKworLy8gU2VhdHMKKy8qKgorICogU2VhdCBtZW1vcnkgc2VsZWN0CisgKgorICogVGhpcyBwYXJhbWV0ZXIgc2VsZWN0cyB0aGUgbWVtb3J5IHByZXNldCB0byB1c2UgdG8gc2VsZWN0IHRoZSBzZWF0IHBvc2l0aW9uLgorICogVGhlIG1pblZhbHVlIGlzIGFsd2F5cyAwLCBhbmQgdGhlIG1heFZhbHVlIGRldGVybWluZXMgdGhlIG51bWJlciBvZiBzZWF0CisgKiBwb3NpdGlvbnMgYXZhaWxhYmxlLgorICoKKyAqIEZvciBpbnN0YW5jZSwgaWYgdGhlIGRyaXZlcidzIHNlYXQgaGFzIDMgbWVtb3J5IHByZXNldHMsIHRoZSBtYXhWYWx1ZSB3aWxsIGJlIDMuCisgKiBXaGVuIHRoZSB1c2VyIHdhbnRzIHRvIHNlbGVjdCBhIHByZXNldCwgdGhlIGRlc2lyZWQgcHJlc2V0IG51bWJlciAoMSwgMiwgb3IgMykKKyAqIGlzIHNldC4KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX01FTU9SWV9TRUxFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCODApCisKKy8qKgorICogU2VhdCBtZW1vcnkgc2V0CisgKgorICogVGhpcyBzZXR0aW5nIGFsbG93cyB0aGUgdXNlciB0byBzYXZlIHRoZSBjdXJyZW50IHNlYXQgcG9zaXRpb24gc2V0dGluZ3MgaW50bworICogdGhlIHNlbGVjdGVkIHByZXNldCBzbG90LiAgVGhlIG1heFZhbHVlIGZvciBlYWNoIHNlYXQgcG9zaXRpb24gc2hhbGwgbWF0Y2gKKyAqIHRoZSBtYXhWYWx1ZSBmb3IgVkVISUNMRV9QUk9QRVJUWV9TRUFUX01FTU9SWV9TRUxFQ1QuCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1NFQVQKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfU0VBVF9NRU1PUllfU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQjgxKQorCisvKioKKyAqIFNlYXRiZWx0IGJ1Y2tsZWQKKyAqCisgKiBUcnVlIGluZGljYXRlcyBiZWx0IGlzIGJ1Y2tsZWQuCisgKgorICogV3JpdGUgYWNjZXNzIGluZGljYXRlcyBhdXRvbWF0aWMgc2VhdCBidWNrbGluZyBjYXBhYmlsaXRpZXMuICBUaGVyZSBhcmUgbm8ga25vd24gY2FycyBhdCB0aGlzCisgKiB0aW1lLCBidXQgeW91IG5ldmVyIGtub3cuLi4KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfQk9PTEVBTgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEfFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGJvb2xlYW5fdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX1NFQVRfQkVMVF9CVUNLTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEI4MikKKworLyoqCisgKiBTZWF0YmVsdCBoZWlnaHQgcG9zaXRpb24KKyAqCisgKiBBZGp1c3RzIHRoZSBzaG91bGRlciBiZWx0IGFuY2hvciBwb2ludC4KKyAqIE1heCB2YWx1ZSBpbmRpY2F0ZXMgaGlnaGVzdCBwb3NpdGlvbgorICogTWluIHZhbHVlIGluZGljYXRlcyBsb3dlc3QgcG9zaXRpb24KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9TRUFUCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX1NFQVRfQkVMVF9IRUlHSFRfUE9TICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEI4MykKKworLyoqCisgKiBTZWF0YmVsdCBoZWlnaHQgbW92ZQorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFfFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX0JFTFRfSEVJR0hUX01PVkUgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCODQpCisKKy8qKgorICogU2VhdCBmb3JlL2FmdCBwb3NpdGlvbgorICoKKyAqIFNldHMgdGhlIHNlYXQgcG9zaXRpb24gZm9yd2FyZCAoY2xvc2VyIHRvIHN0ZWVyaW5nIHdoZWVsKSBhbmQgYmFja3dhcmRzLgorICogTWF4IHZhbHVlIGluZGljYXRlcyBjbG9zZXN0IHRvIHdoZWVsLCBtaW4gdmFsdWUgaW5kaWNhdGVzIG1vc3QgcmVhcndhcmQKKyAqIHBvc2l0aW9uLgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1NFQVQKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfU0VBVF9GT1JFX0FGVF9QT1MgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQjg1KQorCisvKioKKyAqIFNlYXQgZm9yZS9hZnQgbW92ZQorICoKKyAqIE1vdmVzIHRoZSBzZWF0IHBvc2l0aW9uIGZvcndhcmQgYW5kIGFmdC4KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURXxWRUhJQ0xFX1BST1BfQUNDRVNTX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1NFQVQKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfU0VBVF9GT1JFX0FGVF9NT1ZFICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQjg2KQorCisvKioKKyAqIFNlYXQgYmFja3Jlc3QgYW5nbGUgMSBwb3NpdGlvbgorICoKKyAqIEJhY2tyZXN0IGFuZ2xlIDEgaXMgdGhlIGFjdHVhdG9yIGNsb3Nlc3QgdG8gdGhlIGJvdHRvbSBvZiB0aGUgc2VhdC4KKyAqIE1heCB2YWx1ZSBpbmRpY2F0ZXMgYW5nbGluZyBmb3J3YXJkIHRvd2FyZHMgdGhlIHN0ZWVyaW5nIHdoZWVsLgorICogTWluIHZhbHVlIGluZGljYXRlcyBmdWxsIHJlY2xpbmUuCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX0JBQ0tSRVNUX0FOR0xFXzFfUE9TICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCODcpCisKKy8qKgorICogU2VhdCBiYWNrcmVzdCBhbmdsZSAxIG1vdmUKKyAqCisgKiBNb3ZlcyB0aGUgYmFja3Jlc3QgZm9yd2FyZCBvciByZWNsaW5lLgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFfFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX0JBQ0tSRVNUX0FOR0xFXzFfTU9WRSAgICAgICAgICAgICAgICAgKDB4MDAwMDBCODgpCisKKy8qKgorICogU2VhdCBiYWNrcmVzdCBhbmdsZSAyIHBvc2l0aW9uCisgKgorICogQmFja3Jlc3QgYW5nbGUgMiBpcyB0aGUgbmV4dCBhY3R1YXRvciB1cCBmcm9tIHRoZSBib3R0b20gb2YgdGhlIHNlYXQuCisgKiBNYXggdmFsdWUgaW5kaWNhdGVzIGFuZ2xpbmcgZm9yd2FyZCB0b3dhcmRzIHRoZSBzdGVlcmluZyB3aGVlbC4KKyAqIE1pbiB2YWx1ZSBpbmRpY2F0ZXMgZnVsbCByZWNsaW5lLgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1NFQVQKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfU0VBVF9CQUNLUkVTVF9BTkdMRV8yX1BPUyAgICAgICAgICAgICAgICAgICgweDAwMDAwQjg5KQorCisvKioKKyAqIFNlYXQgYmFja3Jlc3QgYW5nbGUgMiBtb3ZlCisgKgorICogTW92ZXMgdGhlIGJhY2tyZXN0IGZvcndhcmQgb3IgcmVjbGluZS4KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURXxWRUhJQ0xFX1BST1BfQUNDRVNTX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1NFQVQKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfU0VBVF9CQUNLUkVTVF9BTkdMRV8yX01PVkUgICAgICAgICAgICAgICAgICgweDAwMDAwQjhBKQorCisvKioKKyAqIFNlYXQgaGVpZ2h0IHBvc2l0aW9uCisgKgorICogU2V0cyB0aGUgc2VhdCBoZWlnaHQuCisgKiBNYXggdmFsdWUgaW5kaWNhdGVzIGhpZ2hlc3QgcG9zaXRpb24uCisgKiBNaW4gdmFsdWUgaW5kaWNhdGVzIGxvd2VzdCBwb3NpdGlvbi4KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9TRUFUCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX1NFQVRfSEVJR0hUX1BPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEI4QikKKworLyoqCisgKiBTZWF0IGhlaWdodCBtb3ZlCisgKgorICogTW92ZXMgdGhlIHNlYXQgaGVpZ2h0LgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFfFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX0hFSUdIVF9NT1ZFICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCOEMpCisKKy8qKgorICogU2VhdCBkZXB0aCBwb3NpdGlvbgorICoKKyAqIFNldHMgdGhlIHNlYXQgZGVwdGgsIGRpc3RhbmNlIGZyb20gYmFjayByZXN0IHRvIGZyb250IGVkZ2Ugb2Ygc2VhdC4KKyAqIE1heCB2YWx1ZSBpbmRpY2F0ZXMgbG9uZ2VzdCBkZXB0aCBwb3NpdGlvbi4KKyAqIE1pbiB2YWx1ZSBpbmRpY2F0ZXMgc2hvcnRlc3QgcG9zaXRpb24uCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX0RFUFRIX1BPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCOEQpCisKKy8qKgorICogU2VhdCBkZXB0aCBtb3ZlCisgKgorICogQWRqdXN0cyB0aGUgc2VhdCBkZXB0aC4KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURXxWRUhJQ0xFX1BST1BfQUNDRVNTX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1NFQVQKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfU0VBVF9ERVBUSF9NT1ZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQjhFKQorCisvKioKKyAqIFNlYXQgdGlsdCBwb3NpdGlvbgorICoKKyAqIFNldHMgdGhlIHNlYXQgdGlsdC4KKyAqIE1heCB2YWx1ZSBpbmRpY2F0ZXMgZnJvbnQgZWRnZSBvZiBzZWF0IGhpZ2hlciB0aGFuIGJhY2sgZWRnZS4KKyAqIE1pbiB2YWx1ZSBpbmRpY2F0ZXMgZnJvbnQgZWRnZSBvZiBzZWF0IGxvd2VyIHRoYW4gYmFjayBlZGdlLgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1NFQVQKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfU0VBVF9USUxUX1BPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQjhGKQorCisvKioKKyAqIFNlYXQgdGlsdCBtb3ZlCisgKgorICogVGlsdHMgdGhlIHNlYXQuCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEV8VkVISUNMRV9QUk9QX0FDQ0VTU19XUklURQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9TRUFUCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX1NFQVRfVElMVF9NT1ZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEI5MCkKKworLyoqCisgKiBMdW1iZXIgZm9yZS9hZnQgcG9zaXRpb24KKyAqCisgKiBQdXNoZXMgdGhlIGx1bWJhciBzdXBwb3J0IGZvcndhcmQgYW5kIGJhY2t3YXJkcworICogTWF4IHZhbHVlIGluZGljYXRlcyBtb3N0IGZvcndhcmQgcG9zaXRpb24uCisgKiBNaW4gdmFsdWUgaW5kaWNhdGVzIG1vc3QgcmVhcndhcmQgcG9zaXRpb24uCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX0xVTUJBUl9GT1JFX0FGVF9QT1MgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCOTEpCisKKy8qKgorICogTHVtYmFyIGZvcmUvYWZ0IG1vdmUKKyAqCisgKiBBZGp1c3RzIHRoZSBsdW1iYXIgc3VwcG9ydC4KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURXxWRUhJQ0xFX1BST1BfQUNDRVNTX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1NFQVQKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfU0VBVF9MVU1CQVJfRk9SRV9BRlRfTU9WRSAgICAgICAgICAgICAgICAgICgweDAwMDAwQjkyKQorCisvKioKKyAqIEx1bWJhciBzaWRlIHN1cHBvcnQgcG9zaXRpb24KKyAqCisgKiBTZXRzIHRoZSBhbW91bnQgb2YgbGF0ZXJhbCBsdW1iYXIgc3VwcG9ydC4KKyAqIE1heCB2YWx1ZSBpbmRpY2F0ZXMgd2lkZXN0IGx1bWJhciBzZXR0aW5nIChpLmUuIGxlYXN0IHN1cHBvcnQpCisgKiBNaW4gdmFsdWUgaW5kaWNhdGVzIHRoaW5uZXN0IGx1bWJhciBzZXR0aW5nLgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1NFQVQKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfU0VBVF9MVU1CQVJfU0lERV9TVVBQT1JUX1BPUyAgICAgICAgICAgICAgICgweDAwMDAwQjkzKQorCisvKioKKyAqIEx1bWJhciBzaWRlIHN1cHBvcnQgbW92ZQorICoKKyAqIEFkanVzdHMgdGhlIGFtb3VudCBvZiBsYXRlcmFsIGx1bWJhciBzdXBwb3J0LgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFfFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX0xVTUJBUl9TSURFX1NVUFBPUlRfTU9WRSAgICAgICAgICAgICAgKDB4MDAwMDBCOTQpCisKKy8qKgorICogSGVhZHJlc3QgaGVpZ2h0IHBvc2l0aW9uCisgKgorICogU2V0cyB0aGUgaGVhZHJlc3QgaGVpZ2h0LgorICogTWF4IHZhbHVlIGluZGljYXRlcyB0YWxsZXN0IHNldHRpbmcuCisgKiBNaW4gdmFsdWUgaW5kaWNhdGVzIHNob3J0ZXN0IHNldHRpbmcuCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX0hFQURSRVNUX0hFSUdIVF9QT1MgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCOTUpCisKKy8qKgorICogSGVhZHJlc3QgaGVpZ2h0IG1vdmUKKyAqCisgKiBNb3ZlcyB0aGUgaGVhZHJlc3QgdXAgYW5kIGRvd24uCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEV8VkVISUNMRV9QUk9QX0FDQ0VTU19XUklURQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9TRUFUCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX1NFQVRfSEVBRFJFU1RfSEVJR0hUX01PVkUgICAgICAgICAgICAgICAgICAoMHgwMDAwMEI5NikKKworLyoqCisgKiBIZWFkcmVzdCBhbmdsZSBwb3NpdGlvbgorICoKKyAqIFNldHMgdGhlIGFuZ2xlIG9mIHRoZSBoZWFkcmVzdC4KKyAqIE1heCB2YWx1ZSBpbmRpY2F0ZXMgbW9zdCB1cHJpZ2h0IGFuZ2xlLgorICogTWluIHZhbHVlIGluZGljYXRlcyBzaGFsbG93ZXN0IGhlYWRyZXN0IGFuZ2xlLgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1NFQVQKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfU0VBVF9IRUFEUkVTVF9BTkdMRV9QT1MgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQjk3KQorCisvKioKKyAqIEhlYWRyZXN0IGFuZ2xlIG1vdmUKKyAqCisgKiBBZGp1c3RzIHRoZSBhbmdsZSBvZiB0aGUgaGVhZHJlc3QKKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURXxWRUhJQ0xFX1BST1BfQUNDRVNTX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1NFQVQKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfU0VBVF9IRUFEUkVTVF9BTkdMRV9NT1ZFICAgICAgICAgICAgICAgICAgICgweDAwMDAwQjk4KQorCisvKioKKyAqIEhlYWRyZXN0IGZvcmUvYWZ0IHBvc2l0aW9uCisgKgorICogQWRqdXN0cyB0aGUgaGVhZHJlc3QgZm9yd2FyZHMgYW5kIGJhY2t3YXJkcy4KKyAqIE1heCB2YWx1ZSBpbmRpY2F0ZXMgcG9zaXRpb24gY2xvc2VzdCB0byBmcm9udCBvZiBjYXIuCisgKiBNaW4gdmFsdWUgaW5kaWNhdGVzIHBvc2l0aW9uIGNsb3Nlc3QgdG8gcmVhciBvZiBjYXIuCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX0hFQURSRVNUX0ZPUkVfQUZUX1BPUyAgICAgICAgICAgICAgICAgKDB4MDAwMDBCOTkpCisKKy8qKgorICogSGVhZHJlc3QgZm9yZS9hZnQgbW92ZQorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFfFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX0hFQURSRVNUX0ZPUkVfQUZUX01PVkUgICAgICAgICAgICAgICAgKDB4MDAwMDBCOUEpCisKKworLy8gV2luZG93cworLyoqCisgKiBXaW5kb3cgUG9zaXRpb24KKyAqCisgKiBNYXggPSB3aW5kb3cgdXAgLyBjbG9zZWQKKyAqIE1pbiA9IHdpbmRvdyBkb3duIC8gb3BlbgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX1dJTkRPV19QT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEJDMCkKKworLyoqCisgKiBXaW5kb3cgTW92ZQorICoKKyAqIE1heCA9IHdpbmRvdyB1cCAvIGNsb3NlZAorICogTWluID0gd2luZG93IGRvd24gLyBvcGVuCisgKiBNYWduaXR1ZGUgZGVub3RlcyByZWxhdGl2ZSBzcGVlZC4gIEkuZS4gKzIgaXMgZmFzdGVyIHRoYW4gKzEgaW4gcmFpc2luZyB0aGUgd2luZG93LgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFfFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEUKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfV0lORE9XX01PVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQkMxKQorCisvKioKKyAqIFdpbmRvdyBWZW50IFBvc2l0aW9uCisgKgorICogVGhpcyBmZWF0dXJlIGlzIHVzZWQgdG8gY29udHJvbCB0aGUgdmVudCBmZWF0dXJlIG9uIGEgc3Vucm9vZi4KKyAqCisgKiBNYXggPSB2ZW50IG9wZW4KKyAqIE1pbiA9IHZlbnQgY2xvc2VkCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfV0lORE9XX1ZFTlRfUE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQkMyKQorCisvKioKKyAqIFdpbmRvdyBWZW50IE1vdmUKKyAqCisgKiBUaGlzIGZlYXR1cmUgaXMgdXNlZCB0byBjb250cm9sIHRoZSB2ZW50IGZlYXR1cmUgb24gYSBzdW5yb29mLgorICoKKyAqIE1heCA9IHZlbnQgb3BlbgorICogTWluID0gdmVudCBjbG9zZWQKKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURXxWRUhJQ0xFX1BST1BfQUNDRVNTX1dSSVRFCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX1dJTkRPV19WRU5UX01PVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEJDMykKKworLyoqCisgKiBXaW5kb3cgTG9jaworICoKKyAqIFRydWUgaW5kaWNhdGVzIHdpbmRvd3MgYXJlIGxvY2tlZCBhbmQgY2FuJ3QgYmUgbW92ZWQuCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX0JPT0xFQU4KKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQorICogQGRhdGFfbWVtYmVyIGJvb2xlYW5fdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX1dJTkRPV19MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEJDNCkKKworCisKKy8qKgogICogIEgvVyBzcGVjaWZpYywgbm9uLXN0YW5kYXJkIHByb3BlcnR5IGNhbiBiZSBhZGRlZCBhcyBuZWNlc3NhcnkuIFN1Y2ggcHJvcGVydHkgc2hvdWxkIHVzZQogICogIHByb3BlcnR5IG51bWJlciBpbiByYW5nZSBvZiBbVkVISUNMRV9QUk9QRVJUWV9DVVNUT01fU1RBUlQsIFZFSElDTEVfUFJPUEVSVFlfQ1VTVE9NX0VORF0uCiAgKiAgRGVmaW5pdGlvbiBvZiBwcm9wZXJ0eSBpbiB0aGlzIHJhbmdlIGlzIGNvbXBsZXRlbHkgdXAgdG8gZWFjaCBIQUwgaW1wbGVtZW50YXRpb24uCkBAIC0xMDI3LDIwICsxODYwLDIwIEBACiAgKiAgaW5jbHVkZSBjb25maWdfc3RyaW5nIG9mICJjb20uWFlaLnNvbWVfZnVydGhlcl9kZXRhaWxzIi4KICAqICBAcmFuZ2Vfc3RhcnQKICAqLwotI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0NVU1RPTV9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgKDB4NzAwMDAwMDApCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfQ1VTVE9NX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDcwMDAwMDAwKQogLyoqIEByYW5nZV9lbmQgKi8KLSNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9DVVNUT01fRU5EICAgICAgICAgICAgICAgICAgICAgICAgICgweDczZmZmZmZmKQorI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0NVU1RPTV9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg3M2ZmZmZmZikKIAogLyoqCiAgKiBQcm9wZXJ0eSByYW5nZSBhbGxvY2F0ZWQgZm9yIHN5c3RlbSdzIGludGVybmFsIHVzYWdlIGxpa2UgdGVzdGluZy4gSEFMIHNob3VsZCBuZXZlciBkZWNsYXJlCiAgKiBwcm9wZXJ0eSBpbiB0aGlzIHJhbmdlLgogICogQHJhbmdlX3N0YXJ0CiAgKi8KLSNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9JTlRFUk5BTF9TVEFSVCAgICAgICAgICAgICAgICAgICAgICgweDc0MDAwMDAwKQorI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0lOVEVSTkFMX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg3NDAwMDAwMCkKIC8qKgogICogQHJhbmdlX2VuZAogICovCi0jZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfSU5URVJOQUxfRU5EICAgICAgICAgICAgICAgICAgICAgICAoMHg3NGZmZmZmZikKKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9JTlRFUk5BTF9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NzRmZmZmZmYpCiAKIC8qKgogICogVmFsdWUgdHlwZXMgZm9yIHZhcmlvdXMgcHJvcGVydGllcy4KQEAgLTEwODYsMTIgKzE5MTksMTQgQEAKICAgICBWRUhJQ0xFX1VOSVRfVFlQRV9NRVRFUiAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDIxLAogICAgIFZFSElDTEVfVU5JVF9UWVBFX0tJTE9NRVRFUiAgICAgICAgICAgICA9IDB4MDAwMDAwMjMsCiAgICAgLy8gdGVtcGVyYXR1cmUKLSAgICBWRUhJQ0xFX1VOSVRfVFlQRV9DRUxDSVVTICAgICAgICAgICAgICAgPSAweDAwMDAwMDMwLAorICAgIFZFSElDTEVfVU5JVF9UWVBFX0NFTFNJVVMgICAgICAgICAgICAgICA9IDB4MDAwMDAwMzAsCisgICAgVkVISUNMRV9VTklUX1RZUEVfRkFIUkVOSEVJVCAgICAgICAgICAgID0gMHgwMDAwMDAzMSwKKyAgICBWRUhJQ0xFX1VOSVRfVFlQRV9LRUxWSU4gICAgICAgICAgICAgICAgPSAweDAwMDAwMDMyLAogICAgIC8vIHZvbHVtZQogICAgIFZFSElDTEVfVU5JVF9UWVBFX01JTExJTElURVIgICAgICAgICAgICA9IDB4MDAwMDAwNDAsCiAgICAgLy8gdGltZQogICAgIFZFSElDTEVfVU5JVF9UWVBFX05BTk9fU0VDUyAgICAgICAgICAgICA9IDB4MDAwMDAwNTAsCi0gICAgVkVISUNMRV9VTk9UX1RZUEVfU0VDUyAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDA1MywKKyAgICBWRUhJQ0xFX1VOSVRfVFlQRV9TRUNTICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDUzLAogICAgIFZFSElDTEVfVU5JVF9UWVBFX1lFQVIgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwNTksCiB9OwogCkBAIC0xMTA1LDggKzE5NDAsMTIgQEAKICAgICAgKi8KICAgICBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfU1RBVElDICAgICAgICAgPSAweDAwLAogICAgIC8qKgotICAgICAqIFByb3BlcnR5IG9mIHRoaXMgdHlwZSB3aWxsIGJlIHJlcG9ydGVkIHdoZW4gdGhlcmUgaXMgYSBjaGFuZ2UuIGdldCBzaG91bGQgcmV0dXJuIHRoZQotICAgICAqIGN1cnJlbnQgdmFsdWUuCisgICAgICogUHJvcGVydHkgb2YgdGhpcyB0eXBlIHdpbGwgYmUgcmVwb3J0ZWQgd2hlbiB0aGVyZSBpcyBhIGNoYW5nZS4KKyAgICAgKiBnZXQgY2FsbCBzaG91bGQgcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlLgorICAgICAqIFNldCBvcGVyYXRpb24gZm9yIHRoaXMgcHJvcGVydHkgaXMgYXNzdW1lZCB0byBiZSBhc3luY2hyb25vdXMuIFdoZW4gdGhlIHByb3BlcnR5IGlzIHJlYWQKKyAgICAgKiAoZ2V0KSBhZnRlciBzZXQsIGl0IG1heSBzdGlsbCByZXR1cm4gb2xkIHZhbHVlIHVudGlsIHVuZGVybHlpbmcgSC9XIGJhY2tpbmcgdGhpcyBwcm9wZXJ0eQorICAgICAqIGhhcyBhY3R1YWxseSBjaGFuZ2VkIHRoZSBzdGF0ZS4gT25jZSBzdGF0ZSBpcyBjaGFuZ2VkLCB0aGUgcHJvcGVydHkgd2lsbCBkaXNwYXRjaCBjaGFuZ2VkCisgICAgICogdmFsdWUgYXMgZXZlbnQuCiAgICAgICovCiAgICAgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRSAgICAgID0gMHgwMSwKICAgICAvKioKQEAgLTExMTQsNiArMTk1MywxOCBAQAogICAgICAqIHRoZSBkYXRhLgogICAgICAqLwogICAgIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9DT05USU5VT1VTICAgICA9IDB4MDIsCisgICAgLyoqCisgICAgICogUHJvcGVydHkgb2YgdGhpcyB0eXBlIG1heSBiZSBwb2xsZWQgdG8gZ2V0IHRoZSBjdXJyZW50IHZhbHVlLgorICAgICAqLworICAgIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9QT0xMICAgICAgICAgICA9IDB4MDMsCisgICAgLyoqCisgICAgICogVGhpcyBpcyBmb3IgcHJvcGVydHkgd2hlcmUgY2hhbmdlIGV2ZW50IHNob3VsZCBiZSBzZW50IG9ubHkgd2hlbiB0aGUgdmFsdWUgaXMKKyAgICAgKiBzZXQgZnJvbSBleHRlcm5hbCBjb21wb25lbnQuIE5vcm1hbCB2YWx1ZSBjaGFuZ2Ugd2lsbCBub3QgdHJpZ2dlciBldmVudC4KKyAgICAgKiBGb3IgZXhhbXBsZSwgY2xvY2sgcHJvcGVydHkgY2FuIHNlbmQgY2hhbmdlIGV2ZW50IG9ubHkgd2hlbiBpdCBpcyBzZXQsIG91dHNpZGUgYW5kcm9pZCwKKyAgICAgKiBmb3IgY2FzZSBsaWtlIHVzZXIgc2V0dGluZyB0aW1lIG9yIHRpbWUgZ2V0dGluZyB1cGRhdGUuIFRoZXJlIGlzIG5vIG5lZWQgdG8gc2VuZCBpdAorICAgICAqIHBlciBldmVyeSB2YWx1ZSBjaGFuZ2UuCisgICAgICovCisgICAgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX1NFVCAgICAgICAgID0gMHgwNCwKIH07CiAKIC8qKgpAQCAtMTIzOCwxNyArMjA4OSwxNSBAQAogICogVmFyaW91cyBTZWF0cyBpbiB0aGUgY2FyLgogICovCiBlbnVtIHZlaGljbGVfc2VhdCB7Ci0gICAgVkVISUNMRV9TRUFUX0RSSVZFUl9MSEQgICAgICAgICAgICAgPSAweDAwMDEsCi0gICAgVkVISUNMRV9TRUFUX0RSSVZFUl9SSEQgICAgICAgICAgICAgPSAweDAwMDIsCi0gICAgVkVISUNMRV9TRUFUX1JPV18xX1BBU1NFTkdFUl9MRUZUICAgPSAweDAwMTAsCi0gICAgVkVISUNMRV9TRUFUX1JPV18xX1BBU1NFTkdFUl9DRU5URVIgPSAweDAwMjAsCi0gICAgVkVISUNMRV9TRUFUX1JPV18xX1BBU1NFTkdFUl9SSUdIVCAgPSAweDAwNDAsCi0gICAgVkVISUNMRV9TRUFUX1JPV18yX1BBU1NFTkdFUl9MRUZUICAgPSAweDAxMDAsCi0gICAgVkVISUNMRV9TRUFUX1JPV18yX1BBU1NFTkdFUl9DRU5URVIgPSAweDAyMDAsCi0gICAgVkVISUNMRV9TRUFUX1JPV18yX1BBU1NFTkdFUl9SSUdIVCAgPSAweDA0MDAsCi0gICAgVkVISUNMRV9TRUFUX1JPV18zX1BBU1NFTkdFUl9MRUZUICAgPSAweDEwMDAsCi0gICAgVkVISUNMRV9TRUFUX1JPV18zX1BBU1NFTkdFUl9DRU5URVIgPSAweDIwMDAsCi0gICAgVkVISUNMRV9TRUFUX1JPV18zX1BBU1NFTkdFUl9SSUdIVCAgPSAweDQwMDAKKyAgICBWRUhJQ0xFX1NFQVRfUk9XXzFfTEVGVCAgID0gMHgwMDAxLAorICAgIFZFSElDTEVfU0VBVF9ST1dfMV9DRU5URVIgPSAweDAwMDIsCisgICAgVkVISUNMRV9TRUFUX1JPV18xX1JJR0hUICA9IDB4MDAwNCwKKyAgICBWRUhJQ0xFX1NFQVRfUk9XXzJfTEVGVCAgID0gMHgwMDEwLAorICAgIFZFSElDTEVfU0VBVF9ST1dfMl9DRU5URVIgPSAweDAwMjAsCisgICAgVkVISUNMRV9TRUFUX1JPV18yX1JJR0hUICA9IDB4MDA0MCwKKyAgICBWRUhJQ0xFX1NFQVRfUk9XXzNfTEVGVCAgID0gMHgwMTAwLAorICAgIFZFSElDTEVfU0VBVF9ST1dfM19DRU5URVIgPSAweDAyMDAsCisgICAgVkVISUNMRV9TRUFUX1JPV18zX1JJR0hUICA9IDB4MDQwMAogfTsKIAogLyoqCkBAIC0xMjgyLDYgKzIxMzEsNyBAQAogICAgIFZFSElDTEVfTUlSUk9SX0RSSVZFUl9SSUdIVCAgPSAweDAwMDAwMDAyLAogICAgIFZFSElDTEVfTUlSUk9SX0RSSVZFUl9DRU5URVIgPSAweDAwMDAwMDA0LAogfTsKKwogZW51bSB2ZWhpY2xlX3R1cm5fc2lnbmFsIHsKICAgICBWRUhJQ0xFX1NJR05BTF9OT05FICAgICAgICAgPSAweDAwLAogICAgIFZFSElDTEVfU0lHTkFMX1JJR0hUICAgICAgICA9IDB4MDEsCkBAIC0xMjg5LDYgKzIxMzksMTUgQEAKICAgICBWRUhJQ0xFX1NJR05BTF9FTUVSR0VOQ1kgICAgPSAweDA0CiB9OwogCitlbnVtIHZlaGljbGVfem9uZV90eXBlIHsKKyAgICBWRUhJQ0xFX1pPTkVfVFlQRV9OT05FICAgICAgPSAweDAwLAorICAgIFZFSElDTEVfWk9ORV9UWVBFX1pPTkUgICAgPSAweDAxLAorICAgIFZFSElDTEVfWk9ORV9UWVBFX1NFQVQgICAgICA9IDB4MDIsCisgICAgVkVISUNMRV9aT05FX1RZUEVfRE9PUiAgICAgID0gMHgwNCwKKyAgICBWRUhJQ0xFX1pPTkVfVFlQRV9XSU5ET1cgICAgPSAweDEwLAorICAgIFZFSElDTEVfWk9ORV9UWVBFX01JUlJPUiAgICA9IDB4MjAsCit9OworCiAvKgogICogQm9vbGVhbiB0eXBlLgogICovCkBAIC0xNDY4LDYgKzIzMjcsNyBAQAogICAgICAgICB2ZWhpY2xlX2Jvb2xlYW5fdCBtYXhfZGVmcm9zdF9vbjsKICAgICAgICAgdmVoaWNsZV9ib29sZWFuX3QgcmVjaXJjX29uOwogICAgICAgICB2ZWhpY2xlX2Jvb2xlYW5fdCBkdWFsX29uOworICAgICAgICB2ZWhpY2xlX2Jvb2xlYW5fdCBhdXRvX29uOwogICAgICAgICB2ZWhpY2xlX2Jvb2xlYW5fdCBwb3dlcl9vbjsKIAogICAgICAgICBmbG9hdCB0ZW1wZXJhdHVyZV9jdXJyZW50OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS92ZWhpY2xlX2NhbWVyYS5oIGIvaW5jbHVkZS9oYXJkd2FyZS92ZWhpY2xlX2NhbWVyYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDc1YWVlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvdmVoaWNsZV9jYW1lcmEuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1ZFSElDTEVfQ0FNRVJBX0lOVEVSRkFDRV9ICi0jZGVmaW5lIEFORFJPSURfVkVISUNMRV9DQU1FUkFfSU5URVJGQUNFX0gKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL2NkZWZzLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgotCi1fX0JFR0lOX0RFQ0xTCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBWRUhJQ0xFX0NBTUVSQV9IRUFERVJfVkVSU0lPTiAgICAgICAgICAxCi0jZGVmaW5lIFZFSElDTEVfQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8xXzAgIEhBUkRXQVJFX01PRFVMRV9BUElfVkVSU0lPTigxLCAwKQotI2RlZmluZSBWRUhJQ0xFX0NBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wICBIQVJEV0FSRV9ERVZJQ0VfQVBJX1ZFUlNJT05fMigxLCAwLCBWRUhJQ0xFX0NBTUVSQV9IRUFERVJfVkVSU0lPTikKLQotLyoqCi0gKiBWZWhpY2xlIENhbWVyYSB0byBwcm92aWRlIGludGVyZmFjZXMgZm9yIGNvbnRyb2xsaW5nIGNhbWVyYXMKLSAqLwotCi0vKioKLSAqIFRoZSBpZCBvZiB0aGlzIG1vZHVsZQotICovCi0jZGVmaW5lIFZFSElDTEVfQ0FNRVJBX0hBUkRXQVJFX01PRFVMRV9JRCAgInZlaGljbGVfY2FtZXJhIgotCi0vKioKLSAqICBOYW1lIG9mIHRoZSB2ZWhpY2xlIGRldmljZSB0byBvcGVuLiAgRXh0ZW5kIHRoaXMgbGlzdCBhcwotICogIG1vcmUgY2FtZXJhcyBhcmUgYWRkZWQuICBFYWNoIGNhbWVyYSBkZWZpbmVkIGluIHZlaGljbGVfY2FtZXJhX3R5cGVfdAotICogIHNoYWxsIGhhdmUgYSBzdHJpbmcgZGVmaW5lZCBmb3IgaXQuCi0gKi8KLSNkZWZpbmUgVkVISUNMRV9DQU1FUkFfUlZDX0RFVklDRSAgICAgICAidmVoaWNsZV9jYW1lcmFfcnZjX2RldmljZSIKLQotLyoqCi0gKiBFYWNoIGNhbWVyYSBvbiB0aGUgY2FyIHNoYWxsIGJlIGVudW1lcmF0ZWQKLSAqLwotdHlwZWRlZiBlbnVtIHsKLSAgICBWRUhJQ0xFX0NBTUVSQV9SVkMgPSAxLAotfSB2ZWhpY2xlX2NhbWVyYV90eXBlX3Q7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGNhbWVyYSBkZXZpY2UKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVpbnQzMl90IG92ZXJsYXlfb247Ci0gICAgdWludDMyX3QgY2FtZXJhX29uOwotfSB2ZWhpY2xlX2NhbWVyYV9zdGF0ZV90OwotCi0vKioKLSAqIEJpdG1hc2sgb2YgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IGEgY2FtZXJhIG1vZHVsZQotICovCi1lbnVtIHsKLSAgICBWRUhJQ0xFX0NBTUVSQV9DT05GSUdfRkxBR19BTkRST0lEX09WRVJMQVlfU1VQUE9SVCAgICAgID0gMHgxLAotICAgIFZFSElDTEVfQ0FNRVJBX0NPTkZJR19GTEFHX0NBTUVSQV9DUk9QX1NVUFBPUlQgICAgICAgICAgPSAweDIsCi0gICAgVkVISUNMRV9DQU1FUkFfQ09ORklHX0ZMQUdfQ0FNRVJBX1BPU0lUSU9OSU5HX1NVUFBPUlQgICA9IDB4NAotfSB2ZWhpY2xlX2NhbWVyYV9jb25maWdfZmxhZzsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVpbnQzMl90IGNhcGFiaWxpdGVzX2ZsYWdzOwotICAgIHVpbnQzMl90IGNhbWVyYV93aWR0aDsKLSAgICB1aW50MzJfdCBjYW1lcmFfaGVpZ2h0OwotICAgIHVpbnQzMl90IGRpc3BsYXlfd2lkdGg7Ci0gICAgdWludDMyX3QgZGlzcGxheV9oZWlnaHQ7Ci19IHZlaGljbGVfY2FtZXJhX2NhcF90OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEV2ZXJ5IGhhcmR3YXJlIG1vZHVsZSBtdXN0IGhhdmUgYSBkYXRhIHN0cnVjdHVyZSBuYW1lZCBIQUxfTU9EVUxFX0lORk9fU1lNCi0gKiBhbmQgdGhlIGZpZWxkcyBvZiB0aGlzIGRhdGEgc3RydWN0dXJlIG11c3QgYmVnaW4gd2l0aCBod19tb2R1bGVfdAotICogZm9sbG93ZWQgYnkgbW9kdWxlIHNwZWNpZmljIGluZm9ybWF0aW9uLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgc3RydWN0IGh3X21vZHVsZV90IGNvbW1vbjsKLSAgICAvKioKLSAgICAgKiBRdWVyaWVzIHRoZSBIVyBmb3IgdGhlIGNhbWVyYXMgaW5zdGFsbGVkIG9uIHRoZSB2ZWhpY2xlCi0gICAgICogQHBhcmFtIG51bV9jYW1lcmFzIC0gbnVtYmVyIG9mIGNhbWVyYSBkZXZpY2VzIGF2YWlsYWJsZS4gIElmCi0gICAgICogICAgICAgICAgICAgICAgICAgIDAgaXMgcmV0dXJuZWQsIGFuIGVycm9yIGhhcyBvY2N1cnJlZCBhbmQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgdGhlIHJldHVybiBwb2ludGVyIHNoYWxsIGJlIE5VTEwuCi0gICAgICogQHJldHVybiBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHZlaGljbGVfY2FtZXJhX3R5cGVfdCB0bwotICAgICAqICAgICAgICAgZGVub3RlIHdoaWNoIGNhbWVyYXMgYXJlIGluc3RhbGxlZC4gIFRoaXMgcG9pbnRlciBpcwotICAgICAqICAgICAgICAgb25seSB2YWxpZCB3aGlsZSB0aGUgdmVoaWNsZSBoYWwgaXMgbG9hZGVkLiAgSWYgdGhlCi0gICAgICogICAgICAgICBwb2ludGVyIGlzIE5VTEwsIHRoZW4gYW4gZXJyb3IgaGFzIG9jY3VycmVkIGFuZAotICAgICAqICAgICAgICAgbnVtX2NhbWVyYXMgc2hhbGwgYmUgMC4KLSAgICAgKi8KLSAgICBjb25zdCB1aW50MzJfdCAqICgqZ2V0X2NhbWVyYV9kZXZpY2VfbGlzdCkodWludDMyX3QgKm51bV9jYW1lcmFzKTsKLX0gdmVoaWNsZV9jYW1lcmFfbW9kdWxlX3Q7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgdmVoaWNsZV9jYW1lcmFfZGV2aWNlX3QgewotICAgIHN0cnVjdCBod19kZXZpY2VfdCBjb21tb247Ci0KLSAgICBjb25zdCB1aW50MzJfdCBjYW1lcmFfdHlwZTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGlzIGNhbWVyYS4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIC0gZGV2aWNlIGhhbmRsZQotICAgICAqIEBwYXJhbSBjYXAgLSBwb2ludGVyIHRvIGNhcGFiaWxpdGllcyBmbGFncyBiZWluZyByZXR1cm5lZAotICAgICAqIEByZXR1cm4gMCBvbiBzdWNjZXNzCi0gICAgICogICAgICAgICAgLUVQRVJNIGlmIGRldmljZSBpcyBpbnZhbGlkIG9yIG5vdCBpbml0aWFsaXplZAotICAgICAqLwotICAgIGludCAoKmdldF9jYXBhYmlsaXRpZXMpKHN0cnVjdCB2ZWhpY2xlX2NhbWVyYV9kZXZpY2VfdCAqZGV2aWNlLCB2ZWhpY2xlX2NhbWVyYV9jYXBfdCAqY2FwKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGN1cnJlbnQgY2FtZXJhIGNyb3Agc2V0dGluZ3MuCi0gICAgICogQHBhcmFtIGRldmljZSAtIGRldmljZSBoYW5kbGUKLSAgICAgKiBAcGFyYW0gcmVjdCAtIGN1cnJlbnQgY2FtZXJhIGNyb3Agc2V0dGluZ3MKLSAgICAgKiBAcmV0dXJuIDAgb24gc3VjY2VzcwotICAgICAqICAgICAgICAgIC1FUEVSTSBpZiBkZXZpY2UgaXMgbm90IGluaXRpYWxpemVkCi0gICAgICogICAgICAgICAgLWVycm5vIG9uIGVycm9yCi0gICAgICovCi0gICAgaW50ICgqZ2V0X2NhbWVyYV9jcm9wKShzdHJ1Y3QgdmVoaWNsZV9jYW1lcmFfZGV2aWNlX3QgKmRldmljZSwgYW5kcm9pZF9uYXRpdmVfcmVjdF90ICpyZWN0KTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNhbWVyYSBjcm9wLgotICAgICAqIEBwYXJhbSBkZXZpY2UgLSBkZXZpY2UgaGFuZGxlCi0gICAgICogQHBhcmFtIHJlY3QgLSBhcmVhIG9mIGNhbWVyYSBpbnB1dCB0byBjcm9wLiAgTXVzdCBmaXQgd2l0aGluCi0gICAgICogICAgICAgICAgICAgY2FtZXJhIHdpZHRoIGFuZCBoZWlnaHQgZnJvbSBjYW1lcmEgY2FwYWJpbGl0aWVzLgotICAgICAqIEByZXR1cm4gMCBvbiBzdWNjZXNzCi0gICAgICogICAgICAgICAgLUVQRVJNIGlmIGRldmljZSBpcyBub3QgaW5pdGlhbGl6ZWQKLSAgICAgKiAgICAgICAgICAtZXJybm8gb24gZXJyb3IKLSAgICAgKi8KLSAgICBpbnQgKCpzZXRfY2FtZXJhX2Nyb3ApKHN0cnVjdCB2ZWhpY2xlX2NhbWVyYV9kZXZpY2VfdCAqZGV2aWNlLCBjb25zdCBhbmRyb2lkX25hdGl2ZV9yZWN0X3QgKnJlY3QpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyBwb3NpdGlvbiBvZiB0aGUgY2FtZXJhIG9uIHRoZSBkaXNwbGF5LgotICAgICAqIEBwYXJhbSBkZXZpY2UgLSBkZXZpY2UgaGFuZGxlCi0gICAgICogQHBhcmFtIHJlY3QgLSBhcmVhIG9mIGRpc3BsYXkgdGhlIGNhbWVyYSB3aWxsIGFwcGVhciB3aGVuIG9uCi0gICAgICogQHJldHVybiAwIG9uIHN1Y2Nlc3MKLSAgICAgKiAgICAgICAgICAtRVBFUk0gaWYgZGV2aWNlIGlzIG5vdCBpbml0aWFsaXplZAotICAgICAqICAgICAgICAgIC1lcnJubyBvbiBlcnJvcgotICAgICAqLwotICAgIGludCAoKmdldF9jYW1lcmFfcG9zaXRpb24pKHN0cnVjdCB2ZWhpY2xlX2NhbWVyYV9kZXZpY2VfdCAqZGV2aWNlLCBhbmRyb2lkX25hdGl2ZV9yZWN0X3QgKnJlY3QpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyBwb3NpdGlvbiBvZiB0aGUgY2FtZXJhIG9uIHRoZSBkaXNwbGF5LgotICAgICAqIEBwYXJhbSBkZXZpY2UgLSBkZXZpY2UgaGFuZGxlCi0gICAgICogQHBhcmFtIHJlY3QgLSBhcmVhIG9mIGRpc3BsYXkgdGhlIGNhbWVyYSB3aWxsIGFwcGVhciB3aGVuIG9uLgotICAgICAqICAgICAgICAgICAgIE11c3QgZml0IHdpdGhpbiBkaXNwbGF5IHdpZHRoIGFuZCBoZWlnaHQgZnJvbQotICAgICAqICAgICAgICAgICAgIGNhbWVyYSBjYXBhYmlsaXRpZXMuCi0gICAgICogQHJldHVybiAwIG9uIHN1Y2Nlc3MKLSAgICAgKiAgICAgICAgICAtRVBFUk0gaWYgZGV2aWNlIGlzIG5vdCBpbml0aWFsaXplZAotICAgICAqICAgICAgICAgIC1lcnJubyBvbiBlcnJvcgotICAgICAqLwotICAgIGludCAoKnNldF9jYW1lcmFfcG9zaXRpb24pKHN0cnVjdCB2ZWhpY2xlX2NhbWVyYV9kZXZpY2VfdCAqZGV2aWNlLCBjb25zdCBhbmRyb2lkX25hdGl2ZV9yZWN0X3QgKnJlY3QpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY3VycmVudCBjYW1lcmEgc3RhdGUuCi0gICAgICogQHBhcmFtIGRldmljZSAtIGRldmljZSBoYW5kbGUKLSAgICAgKiBAcGFyYW0gc3RhdGUgLSBsYXN0IHNldHRpbmcgZm9yIHRoZSBjYW1lcmEKLSAgICAgKiBAcmV0dXJuIDAgb24gc3VjY2VzcwotICAgICAqICAgICAgICAgIC1FUEVSTSBpZiBkZXZpY2UgaXMgbm90IGluaXRpYWxpemVkCi0gICAgICovCi0gICAgaW50ICgqZ2V0X2NhbWVyYV9zdGF0ZSkoc3RydWN0IHZlaGljbGVfY2FtZXJhX2RldmljZV90ICpkZXZpY2UsIHZlaGljbGVfY2FtZXJhX3N0YXRlX3QgKnN0YXRlKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNhbWVyYSBzdGF0ZS4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIC0gZGV2aWNlIGhhbmRsZQotICAgICAqIEBwYXJhbSBzdGF0ZSAtIGRlc2lyZWQgc2V0dGluZyBmb3IgdGhlIGNhbWVyYQotICAgICAqIEByZXR1cm4gMCBvbiBzdWNjZXNzCi0gICAgICogICAgICAgICAgLUVQRVJNIGlmIGRldmljZSBpcyBub3QgaW5pdGlhbGl6ZWQKLSAgICAgKiAgICAgICAgICAtZXJybm8gb24gZXJyb3IKLSAgICAgKi8KLSAgICBpbnQgKCpzZXRfY2FtZXJhX3N0YXRlKShzdHJ1Y3QgdmVoaWNsZV9jYW1lcmFfZGV2aWNlX3QgKmRldmljZSwgY29uc3QgdmVoaWNsZV9jYW1lcmFfc3RhdGVfdCAqc3RhdGUpOwotfSB2ZWhpY2xlX2NhbWVyYV9kZXZpY2VfdDsKLQotX19FTkRfREVDTFMKLQotI2VuZGlmICAvLyBBTkRST0lEX1ZFSElDTEVfQ0FNRVJBX0lOVEVSRkFDRV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL3ZpYnJhdG9yLmggYi9pbmNsdWRlL2hhcmR3YXJlL3ZpYnJhdG9yLmgKaW5kZXggMjAwYWRmMC4uMzYxMDg1ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS92aWJyYXRvci5oCisrKyBiL2luY2x1ZGUvaGFyZHdhcmUvdmlicmF0b3IuaApAQCAtNjUsNyArNjUsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCB2aWJyYXRvcl9vcGVuKGNvbnN0IHN0cnVjdCBod19tb2R1bGVfdCogbW9kdWxlLCB2aWJyYXRvcl9kZXZpY2VfdCoqIGRldmljZSkKIHsKLSAgICByZXR1cm4gbW9kdWxlLT5tZXRob2RzLT5vcGVuKG1vZHVsZSwgVklCUkFUT1JfREVWSUNFX0lEX01BSU4sIChzdHJ1Y3QgaHdfZGV2aWNlX3QqKilkZXZpY2UpOworICAgIHJldHVybiBtb2R1bGUtPm1ldGhvZHMtPm9wZW4obW9kdWxlLCBWSUJSQVRPUl9ERVZJQ0VfSURfTUFJTiwgVE9fSFdfREVWSUNFX1RfT1BFTihkZXZpY2UpKTsKIH0KIAogX19FTkRfREVDTFMKZGlmZiAtLWdpdCBhL21vZHVsZXMvQW5kcm9pZC5tayBiL21vZHVsZXMvQW5kcm9pZC5tawppbmRleCAzYmQwOTQzLi40NjIwODFkIDEwMDY0NAotLS0gYS9tb2R1bGVzL0FuZHJvaWQubWsKKysrIGIvbW9kdWxlcy9BbmRyb2lkLm1rCkBAIC0xLDQgKzEsMTQgQEAKLWhhcmR3YXJlX21vZHVsZXMgOj0gZ3JhbGxvYyBod2NvbXBvc2VyIGF1ZGlvIG5mYyBuZmMtbmNpIGxvY2FsX3RpbWUgXAotCXBvd2VyIHVzYmF1ZGlvIGF1ZGlvX3JlbW90ZV9zdWJtaXggY2FtZXJhIHVzYmNhbWVyYSBjb25zdW1lcmlyIHNlbnNvcnMgdmlicmF0b3IgXAotCXR2X2lucHV0IGZpbmdlcnByaW50IGlucHV0IHZlaGljbGUgdGhlcm1hbCB2cgoraGFyZHdhcmVfbW9kdWxlcyA6PSBcCisgICAgYXVkaW9fcmVtb3RlX3N1Ym1peCBcCisgICAgY2FtZXJhIFwKKyAgICBncmFsbG9jIFwKKyAgICBod2NvbXBvc2VyIFwKKyAgICBpbnB1dCBcCisgICAgcmFkaW8gXAorICAgIHNlbnNvcnMgXAorICAgIHRoZXJtYWwgXAorICAgIHVzYmF1ZGlvIFwKKyAgICB1c2JjYW1lcmEgXAorICAgIHZlaGljbGUgXAorICAgIHZyCiBpbmNsdWRlICQoY2FsbCBhbGwtbmFtZWQtc3ViZGlyLW1ha2VmaWxlcywkKGhhcmR3YXJlX21vZHVsZXMpKQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9SRUFETUUuYW5kcm9pZCBiL21vZHVsZXMvUkVBRE1FLmFuZHJvaWQKaW5kZXggNTdhYmI3Mi4uN2ZmYzBmNCAxMDA2NDQKLS0tIGEvbW9kdWxlcy9SRUFETUUuYW5kcm9pZAorKysgYi9tb2R1bGVzL1JFQURNRS5hbmRyb2lkCkBAIC00LDEzICs0LDEzIEBACiBsaWJoYXJkd2FyZS5zbyBldmVudHVhbGx5IHNob3VsZCBjb250YWluICpqdXN0KiB0aGUgSEFMIGh1YgogKGhhcmR3YXJlLmMpLCBldmVyeXRoaW5nIGluIGl0IHNob3VsZCBiZSByZXdyaXR0ZW4gYXMgbW9kdWxlcy4KIAotTW9kdWxlcyBhcmUgLnNvIGluIC9zeXN0ZW0vbGlicy9ody8gYW5kIGhhdmUgYSB3ZWxsIGRlZmluZWQgbmFtaW5nCitNb2R1bGVzIGFyZSAuc28gaW4gL3ZlbmRvci9saWIvaHcvIGFuZCBoYXZlIGEgd2VsbCBkZWZpbmVkIG5hbWluZwogY29udmVudGlvbjoKIAotICAgIC9zeXN0ZW0vbGlicy9ody88Kl9IQVJEV0FSRV9NT0RVTEVfSUQ+Ljxyby5wcm9kdWN0LmJvYXJkPi5zbwotICAgIC9zeXN0ZW0vbGlicy9ody88Kl9IQVJEV0FSRV9NT0RVTEVfSUQ+Ljxyby5ib2FyZC5wbGF0Zm9ybT4uc28KLSAgICAvc3lzdGVtL2xpYnMvaHcvPCpfSEFSRFdBUkVfTU9EVUxFX0lEPi48cm8uYXJjaD4uc28KLSAgICAvc3lzdGVtL2xpYnMvaHcvPCpfSEFSRFdBUkVfTU9EVUxFX0lEPi5kZWZhdWx0LnNvCisgICAgL3ZlbmRvci9saWIvaHcvPCpfSEFSRFdBUkVfTU9EVUxFX0lEPi48cm8ucHJvZHVjdC5ib2FyZD4uc28KKyAgICAvdmVuZG9yL2xpYi9ody88Kl9IQVJEV0FSRV9NT0RVTEVfSUQ+Ljxyby5ib2FyZC5wbGF0Zm9ybT4uc28KKyAgICAvdmVuZG9yL2xpYi9ody88Kl9IQVJEV0FSRV9NT0RVTEVfSUQ+Ljxyby5hcmNoPi5zbworICAgIC92ZW5kb3IvbGliL2h3LzwqX0hBUkRXQVJFX01PRFVMRV9JRD4uZGVmYXVsdC5zbwogCiBUaGV5IGFsc28gaGF2ZSBhIHdlbGwgZGVmaW5lZCBpbnRlcmZhY2Ugd2hpY2ggbGl2ZXMgaW4gaW5jbHVkZS9oYXJkd2FyZS8uCiAKZGlmZiAtLWdpdCBhL21vZHVsZXMvYXVkaW8vQW5kcm9pZC5icCBiL21vZHVsZXMvYXVkaW8vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGRhZWFkCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9hdWRpby9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNjAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBUaGUgZGVmYXVsdCBhdWRpbyBIQUwgbW9kdWxlLCB3aGljaCBpcyBhIHN0dWIsIHRoYXQgaXMgbG9hZGVkIGlmIG5vIG90aGVyCisvLyBkZXZpY2Ugc3BlY2lmaWMgbW9kdWxlcyBhcmUgcHJlc2VudC4gVGhlIGV4YWN0IGxvYWQgb3JkZXIgY2FuIGJlIHNlZW4gaW4KKy8vIGxpYmhhcmR3YXJlL2hhcmR3YXJlLmMKKy8vCisvLyBUaGUgZm9ybWF0IG9mIHRoZSBuYW1lIGlzIGF1ZGlvLjx0eXBlPi48aGFyZHdhcmUvZXRjPi5zbyB3aGVyZSB0aGUgb25seQorLy8gcmVxdWlyZWQgdHlwZSBpcyAncHJpbWFyeScuIE90aGVyIHBvc3NpYmlsaXRlcyBhcmUgJ2EyZHAnLCAndXNiJywgZXRjLgorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJhdWRpby5wcmltYXJ5LmRlZmF1bHQiLAorICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImh3IiwKKyAgICBwcm9wcmlldGFyeTogdHJ1ZSwKKyAgICBzcmNzOiBbImF1ZGlvX2h3LmMiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICBdLAorICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIiwgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciJdLAorfQorCisvLyBUaGUgc3R1YiBhdWRpbyBIQUwgbW9kdWxlLCBpZGVudGljYWwgdG8gdGhlIGRlZmF1bHQgYXVkaW8gaGFsLCBidXQgd2l0aAorLy8gZGlmZmVyZW50IG5hbWUgdG8gYmUgbG9hZGVkIGNvbmN1cnJlbnRseSB3aXRoIG90aGVyIGF1ZGlvIEhBTHMgaWYgbmVjZXNzYXJ5LgorLy8gVGhpcyBjYW4gYWxzbyBiZSB1c2VkIGFzIHNrZWxldG9uIGZvciBuZXcgaW1wbGVtZW50YXRpb25zCisvLworLy8gVGhlIGZvcm1hdCBvZiB0aGUgbmFtZSBpcyBhdWRpby48dHlwZT4uPGhhcmR3YXJlL2V0Yz4uc28gd2hlcmUgdGhlIG9ubHkKKy8vIHJlcXVpcmVkIHR5cGUgaXMgJ3ByaW1hcnknLiBPdGhlciBwb3NzaWJpbGl0ZXMgYXJlICdhMmRwJywgJ3VzYicsIGV0Yy4KK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAiYXVkaW8uc3R1Yi5kZWZhdWx0IiwKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJodyIsCisgICAgcHJvcHJpZXRhcnk6IHRydWUsCisgICAgc3JjczogWyJhdWRpb19ody5jIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciIsICItV25vLXVudXNlZC1wYXJhbWV0ZXIiXSwKK30KKworLy8gVGhlIHN0dWIgYXVkaW8gcG9saWN5IEhBTCBtb2R1bGUgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIHNrZWxldG9uIGZvcgorLy8gbmV3IGltcGxlbWVudGF0aW9ucy4KK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAiYXVkaW9fcG9saWN5LnN0dWIiLAorICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImh3IiwKKyAgICBwcm9wcmlldGFyeTogdHJ1ZSwKKyAgICBzcmNzOiBbImF1ZGlvX3BvbGljeS5jIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciIsICItV25vLXVudXNlZC1wYXJhbWV0ZXIiXSwKK30KZGlmZiAtLWdpdCBhL21vZHVsZXMvYXVkaW8vQW5kcm9pZC5tayBiL21vZHVsZXMvYXVkaW8vQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY0YjhmNS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2F1ZGlvL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLSMgVGhlIGRlZmF1bHQgYXVkaW8gSEFMIG1vZHVsZSwgd2hpY2ggaXMgYSBzdHViLCB0aGF0IGlzIGxvYWRlZCBpZiBubyBvdGhlcgotIyBkZXZpY2Ugc3BlY2lmaWMgbW9kdWxlcyBhcmUgcHJlc2VudC4gVGhlIGV4YWN0IGxvYWQgb3JkZXIgY2FuIGJlIHNlZW4gaW4KLSMgbGliaGFyZHdhcmUvaGFyZHdhcmUuYwotIwotIyBUaGUgZm9ybWF0IG9mIHRoZSBuYW1lIGlzIGF1ZGlvLjx0eXBlPi48aGFyZHdhcmUvZXRjPi5zbyB3aGVyZSB0aGUgb25seQotIyByZXF1aXJlZCB0eXBlIGlzICdwcmltYXJ5Jy4gT3RoZXIgcG9zc2liaWxpdGVzIGFyZSAnYTJkcCcsICd1c2InLCBldGMuCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IGF1ZGlvLnByaW1hcnkuZGVmYXVsdAotTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gaHcKLUxPQ0FMX1NSQ19GSUxFUyA6PSBhdWRpb19ody5jCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmxvZyBsaWJjdXRpbHMKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi1MT0NBTF9DRkxBR1MgOj0gLVduby11bnVzZWQtcGFyYW1ldGVyCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotIyBUaGUgc3R1YiBhdWRpbyBIQUwgbW9kdWxlLCBpZGVudGljYWwgdG8gdGhlIGRlZmF1bHQgYXVkaW8gaGFsLCBidXQgd2l0aAotIyBkaWZmZXJlbnQgbmFtZSB0byBiZSBsb2FkZWQgY29uY3VycmVudGx5IHdpdGggb3RoZXIgYXVkaW8gSEFMcyBpZiBuZWNlc3NhcnkuCi0jIFRoaXMgY2FuIGFsc28gYmUgdXNlZCBhcyBza2VsZXRvbiBmb3IgbmV3IGltcGxlbWVudGF0aW9ucwotIwotIyBUaGUgZm9ybWF0IG9mIHRoZSBuYW1lIGlzIGF1ZGlvLjx0eXBlPi48aGFyZHdhcmUvZXRjPi5zbyB3aGVyZSB0aGUgb25seQotIyByZXF1aXJlZCB0eXBlIGlzICdwcmltYXJ5Jy4gT3RoZXIgcG9zc2liaWxpdGVzIGFyZSAnYTJkcCcsICd1c2InLCBldGMuCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IGF1ZGlvLnN0dWIuZGVmYXVsdAotTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gaHcKLUxPQ0FMX1NSQ19GSUxFUyA6PSBhdWRpb19ody5jCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmxvZyBsaWJjdXRpbHMKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi1MT0NBTF9DRkxBR1MgOj0gLVduby11bnVzZWQtcGFyYW1ldGVyCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotIyBUaGUgc3R1YiBhdWRpbyBwb2xpY3kgSEFMIG1vZHVsZSB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgc2tlbGV0b24gZm9yCi0jIG5ldyBpbXBsZW1lbnRhdGlvbnMuCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IGF1ZGlvX3BvbGljeS5zdHViCi1MT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBodwotTE9DQUxfU1JDX0ZJTEVTIDo9IGF1ZGlvX3BvbGljeS5jCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmxvZyBsaWJjdXRpbHMKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi1MT0NBTF9DRkxBR1MgOj0gLVduby11bnVzZWQtcGFyYW1ldGVyCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21vZHVsZXMvYXVkaW8vYXVkaW9faHcuYyBiL21vZHVsZXMvYXVkaW8vYXVkaW9faHcuYwppbmRleCA2OGIwZDNhLi40M2QxM2E5IDEwMDY0NAotLS0gYS9tb2R1bGVzL2F1ZGlvL2F1ZGlvX2h3LmMKKysrIGIvbW9kdWxlcy9hdWRpby9hdWRpb19ody5jCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KIAotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKICNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgpAQCAtMTE5LDcgKzExOSw3IEBACiBzdGF0aWMgc3NpemVfdCBvdXRfd3JpdGUoc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbSwgY29uc3Qgdm9pZCogYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBieXRlcykKIHsKLSAgICBBTE9HVigib3V0X3dyaXRlOiBieXRlczogJWQiLCBieXRlcyk7CisgICAgQUxPR1YoIm91dF93cml0ZTogYnl0ZXM6ICV6dSIsIGJ5dGVzKTsKIAogICAgIC8qIFhYWDogZmFrZSB0aW1pbmcgZm9yIGF1ZGlvIG91dHB1dCAqLwogICAgIHN0cnVjdCBzdHViX3N0cmVhbV9vdXQgKm91dCA9IChzdHJ1Y3Qgc3R1Yl9zdHJlYW1fb3V0ICopc3RyZWFtOwpAQCAtMjQyLDcgKzI0Miw3IEBACiBzdGF0aWMgc3NpemVfdCBpbl9yZWFkKHN0cnVjdCBhdWRpb19zdHJlYW1faW4gKnN0cmVhbSwgdm9pZCogYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnl0ZXMpCiB7Ci0gICAgQUxPR1YoImluX3JlYWQ6IGJ5dGVzICVkIiwgYnl0ZXMpOworICAgIEFMT0dWKCJpbl9yZWFkOiBieXRlcyAlenUiLCBieXRlcyk7CiAKICAgICAvKiBYWFg6IGZha2UgdGltaW5nIGZvciBhdWRpbyBpbnB1dCAqLwogICAgIHN0cnVjdCBzdHViX3N0cmVhbV9pbiAqaW4gPSAoc3RydWN0IHN0dWJfc3RyZWFtX2luICopc3RyZWFtOwpAQCAtMjk3LDExICsyOTcsOSBAQAogewogICAgIEFMT0dWKCJhZGV2X29wZW5fb3V0cHV0X3N0cmVhbS4uLiIpOwogCi0gICAgc3RydWN0IHN0dWJfYXVkaW9fZGV2aWNlICpsYWRldiA9IChzdHJ1Y3Qgc3R1Yl9hdWRpb19kZXZpY2UgKilkZXY7Ci0gICAgc3RydWN0IHN0dWJfc3RyZWFtX291dCAqb3V0OwotICAgIGludCByZXQ7Ci0KLSAgICBvdXQgPSAoc3RydWN0IHN0dWJfc3RyZWFtX291dCAqKWNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHN0dWJfc3RyZWFtX291dCkpOworICAgICpzdHJlYW1fb3V0ID0gTlVMTDsKKyAgICBzdHJ1Y3Qgc3R1Yl9zdHJlYW1fb3V0ICpvdXQgPQorICAgICAgICAgICAgKHN0cnVjdCBzdHViX3N0cmVhbV9vdXQgKiljYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBzdHViX3N0cmVhbV9vdXQpKTsKICAgICBpZiAoIW91dCkKICAgICAgICAgcmV0dXJuIC1FTk9NRU07CiAKQEAgLTMyNSwxMSArMzIzLDYgQEAKIAogICAgICpzdHJlYW1fb3V0ID0gJm91dC0+c3RyZWFtOwogICAgIHJldHVybiAwOwotCi1lcnJfb3BlbjoKLSAgICBmcmVlKG91dCk7Ci0gICAgKnN0cmVhbV9vdXQgPSBOVUxMOwotICAgIHJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIGFkZXZfY2xvc2Vfb3V0cHV0X3N0cmVhbShzdHJ1Y3QgYXVkaW9faHdfZGV2aWNlICpkZXYsCkBAIC00MjQsMTEgKzQxNyw4IEBACiB7CiAgICAgQUxPR1YoImFkZXZfb3Blbl9pbnB1dF9zdHJlYW0uLi4iKTsKIAotICAgIHN0cnVjdCBzdHViX2F1ZGlvX2RldmljZSAqbGFkZXYgPSAoc3RydWN0IHN0dWJfYXVkaW9fZGV2aWNlICopZGV2OwotICAgIHN0cnVjdCBzdHViX3N0cmVhbV9pbiAqaW47Ci0gICAgaW50IHJldDsKLQotICAgIGluID0gKHN0cnVjdCBzdHViX3N0cmVhbV9pbiAqKWNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHN0dWJfc3RyZWFtX2luKSk7CisgICAgKnN0cmVhbV9pbiA9IE5VTEw7CisgICAgc3RydWN0IHN0dWJfc3RyZWFtX2luICppbiA9IChzdHJ1Y3Qgc3R1Yl9zdHJlYW1faW4gKiljYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBzdHViX3N0cmVhbV9pbikpOwogICAgIGlmICghaW4pCiAgICAgICAgIHJldHVybiAtRU5PTUVNOwogCkBAIC00NTAsMTEgKzQ0MCw2IEBACiAKICAgICAqc3RyZWFtX2luID0gJmluLT5zdHJlYW07CiAgICAgcmV0dXJuIDA7Ci0KLWVycl9vcGVuOgotICAgIGZyZWUoaW4pOwotICAgICpzdHJlYW1faW4gPSBOVUxMOwotICAgIHJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIGFkZXZfY2xvc2VfaW5wdXRfc3RyZWFtKHN0cnVjdCBhdWRpb19od19kZXZpY2UgKmRldiwKQEAgLTQ4Myw3ICs0NjgsNiBAQAogICAgIEFMT0dWKCJhZGV2X29wZW46ICVzIiwgbmFtZSk7CiAKICAgICBzdHJ1Y3Qgc3R1Yl9hdWRpb19kZXZpY2UgKmFkZXY7Ci0gICAgaW50IHJldDsKIAogICAgIGlmIChzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfSU5URVJGQUNFKSAhPSAwKQogICAgICAgICByZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL21vZHVsZXMvYXVkaW8vYXVkaW9fcG9saWN5LmMgYi9tb2R1bGVzL2F1ZGlvL2F1ZGlvX3BvbGljeS5jCmluZGV4IDkzMzU2NTQuLjRmOWNkNWEgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvYXVkaW8vYXVkaW9fcG9saWN5LmMKKysrIGIvbW9kdWxlcy9hdWRpby9hdWRpb19wb2xpY3kuYwpAQCAtMjQxLDkgKzI0MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb2xpY3kgKiphcCkKIHsKLSAgICBzdHJ1Y3QgZGVmYXVsdF9hcF9kZXZpY2UgKmRldjsKICAgICBzdHJ1Y3QgZGVmYXVsdF9hdWRpb19wb2xpY3kgKmRhcDsKLSAgICBpbnQgcmV0OwogCiAgICAgKmFwID0gTlVMTDsKIApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9hdWRpb19yZW1vdGVfc3VibWl4L0FuZHJvaWQubWsgYi9tb2R1bGVzL2F1ZGlvX3JlbW90ZV9zdWJtaXgvQW5kcm9pZC5tawppbmRleCA5MGRhMzk2Li5jOWU4NTFmIDEwMDY0NAotLS0gYS9tb2R1bGVzL2F1ZGlvX3JlbW90ZV9zdWJtaXgvQW5kcm9pZC5taworKysgYi9tb2R1bGVzL2F1ZGlvX3JlbW90ZV9zdWJtaXgvQW5kcm9pZC5tawpAQCAtMTgsMTEgKzE4LDEzIEBACiAKIExPQ0FMX01PRFVMRSA6PSBhdWRpby5yX3N1Ym1peC5kZWZhdWx0CiBMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBodworTE9DQUxfUFJPUFJJRVRBUllfTU9EVUxFIDo9IHRydWUKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCiAJYXVkaW9faHcuY3BwCiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKIAlmcmFtZXdvcmtzL2F2L2luY2x1ZGUvIFwKLQlmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlLworCWZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvIFwKKwkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmxvZyBsaWJjdXRpbHMgbGlidXRpbHMgbGlibmJhaW8KIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGlibWVkaWFfaGVscGVyCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbApkaWZmIC0tZ2l0IGEvbW9kdWxlcy92aWJyYXRvci9BbmRyb2lkLm1rIGIvbW9kdWxlcy9jYW1lcmEvM18wL0FuZHJvaWQubWsKc2ltaWxhcml0eSBpbmRleCA2NiUKcmVuYW1lIGZyb20gbW9kdWxlcy92aWJyYXRvci9BbmRyb2lkLm1rCnJlbmFtZSB0byBtb2R1bGVzL2NhbWVyYS8zXzAvQW5kcm9pZC5tawppbmRleCBiNmI0ODBjLi5hZTY4ZWQ1IDEwMDY0NAotLS0gYS9tb2R1bGVzL3ZpYnJhdG9yL0FuZHJvaWQubWsKKysrIGIvbW9kdWxlcy9jYW1lcmEvM18wL0FuZHJvaWQubWsKQEAgLTE2LDE1ICsxNiwzMCBAQAogCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAotTE9DQUxfTU9EVUxFIDo9IHZpYnJhdG9yLmRlZmF1bHQKLQotIyBIQUwgbW9kdWxlIGltcGxlbWVudGF0aW9uIHN0b3JlZCBpbgotIyBody88VklCUkFUT1JfSEFSRFdBUkVfTU9EVUxFX0lEPi5kZWZhdWx0LnNvCitMT0NBTF9NT0RVTEUgOj0gY2FtZXJhLmRlZmF1bHQKIExPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IGh3Ci1MT0NBTF9DX0lOQ0xVREVTIDo9IGhhcmR3YXJlL2xpYmhhcmR3YXJlCi1MT0NBTF9TUkNfRklMRVMgOj0gdmlicmF0b3IuYwotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJsb2cKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisJc3lzdGVtL2NvcmUvaW5jbHVkZSBcCisJc3lzdGVtL21lZGlhL2NhbWVyYS9pbmNsdWRlIFwKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKwlDYW1lcmFIQUwuY3BwIFwKKwlDYW1lcmEuY3BwIFwKKwlFeGFtcGxlQ2FtZXJhLmNwcCBcCisJTWV0YWRhdGEuY3BwIFwKKwlTdHJlYW0uY3BwIFwKKwlWZW5kb3JUYWdzLmNwcCBcCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYmNhbWVyYV9tZXRhZGF0YSBcCisJbGliY3V0aWxzIFwKKwlsaWJsb2cgXAorCWxpYnN5bmMgXAorCWxpYnV0aWxzIFwKKworTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEgLWZ2aXNpYmlsaXR5PWhpZGRlbgorCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KZGlmZiAtLWdpdCBhL21vZHVsZXMvY2FtZXJhL0NhbWVyYS5jcHAgYi9tb2R1bGVzL2NhbWVyYS8zXzAvQ2FtZXJhLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbW9kdWxlcy9jYW1lcmEvQ2FtZXJhLmNwcApyZW5hbWUgdG8gbW9kdWxlcy9jYW1lcmEvM18wL0NhbWVyYS5jcHAKZGlmZiAtLWdpdCBhL21vZHVsZXMvY2FtZXJhL0NhbWVyYS5oIGIvbW9kdWxlcy9jYW1lcmEvM18wL0NhbWVyYS5oCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIG1vZHVsZXMvY2FtZXJhL0NhbWVyYS5oCnJlbmFtZSB0byBtb2R1bGVzL2NhbWVyYS8zXzAvQ2FtZXJhLmgKaW5kZXggMGNlYWYyNS4uMDcyZGUzNSAxMDA2NDQKLS0tIGEvbW9kdWxlcy9jYW1lcmEvQ2FtZXJhLmgKKysrIGIvbW9kdWxlcy9jYW1lcmEvM18wL0NhbWVyYS5oCkBAIC0zNCw3ICszNCw3IEBACiAgICAgcHVibGljOgogICAgICAgICAvLyBpZCBpcyB1c2VkIHRvIGRpc3Rpbmd1aXNoIGNhbWVyYXMuIDAgPD0gaWQgPCBOVU1fQ0FNRVJBUy4KICAgICAgICAgLy8gbW9kdWxlIGlzIGEgaGFuZGxlIHRvIHRoZSBIQUwgbW9kdWxlLCB1c2VkIHdoZW4gdGhlIGRldmljZSBpcyBvcGVuZWQuCi0gICAgICAgIENhbWVyYShpbnQgaWQpOworICAgICAgICBleHBsaWNpdCBDYW1lcmEoaW50IGlkKTsKICAgICAgICAgdmlydHVhbCB+Q2FtZXJhKCk7CiAKICAgICAgICAgLy8gQ29tbW9uIENhbWVyYSBEZXZpY2UgT3BlcmF0aW9ucyAoc2VlIDxoYXJkd2FyZS9jYW1lcmFfY29tbW9uLmg+KQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9jYW1lcmEvQ2FtZXJhSEFMLmNwcCBiL21vZHVsZXMvY2FtZXJhLzNfMC9DYW1lcmFIQUwuY3BwCnNpbWlsYXJpdHkgaW5kZXggODQlCnJlbmFtZSBmcm9tIG1vZHVsZXMvY2FtZXJhL0NhbWVyYUhBTC5jcHAKcmVuYW1lIHRvIG1vZHVsZXMvY2FtZXJhLzNfMC9DYW1lcmFIQUwuY3BwCmluZGV4IDYyZWU2ZDQuLmUzOTVjZTUgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvY2FtZXJhL0NhbWVyYUhBTC5jcHAKKysrIGIvbW9kdWxlcy9jYW1lcmEvM18wL0NhbWVyYUhBTC5jcHAKQEAgLTE2NSwyOSArMTY1LDI5IEBACiB9CiAKIHN0YXRpYyBod19tb2R1bGVfbWV0aG9kc190IGdDYW1lcmFNb2R1bGVNZXRob2RzID0gewotICAgIG9wZW4gOiBvcGVuX2RldgorICAgIC5vcGVuID0gb3Blbl9kZXYKIH07CiAKIGNhbWVyYV9tb2R1bGVfdCBIQUxfTU9EVUxFX0lORk9fU1lNIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKSA9IHsKLSAgICBjb21tb24gOiB7Ci0gICAgICAgIHRhZyAgICAgICAgICAgICAgICA6IEhBUkRXQVJFX01PRFVMRV9UQUcsCi0gICAgICAgIG1vZHVsZV9hcGlfdmVyc2lvbiA6IENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl8yLAotICAgICAgICBoYWxfYXBpX3ZlcnNpb24gICAgOiBIQVJEV0FSRV9IQUxfQVBJX1ZFUlNJT04sCi0gICAgICAgIGlkICAgICAgICAgICAgICAgICA6IENBTUVSQV9IQVJEV0FSRV9NT0RVTEVfSUQsCi0gICAgICAgIG5hbWUgICAgICAgICAgICAgICA6ICJEZWZhdWx0IENhbWVyYSBIQUwiLAotICAgICAgICBhdXRob3IgICAgICAgICAgICAgOiAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIsCi0gICAgICAgIG1ldGhvZHMgICAgICAgICAgICA6ICZnQ2FtZXJhTW9kdWxlTWV0aG9kcywKLSAgICAgICAgZHNvICAgICAgICAgICAgICAgIDogTlVMTCwKLSAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgIDogezB9LAorICAgIC5jb21tb24gPSB7CisgICAgICAgIC50YWcgICAgICAgICAgICAgICAgPSBIQVJEV0FSRV9NT0RVTEVfVEFHLAorICAgICAgICAubW9kdWxlX2FwaV92ZXJzaW9uID0gQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzIsCisgICAgICAgIC5oYWxfYXBpX3ZlcnNpb24gICAgPSBIQVJEV0FSRV9IQUxfQVBJX1ZFUlNJT04sCisgICAgICAgIC5pZCAgICAgICAgICAgICAgICAgPSBDQU1FUkFfSEFSRFdBUkVfTU9EVUxFX0lELAorICAgICAgICAubmFtZSAgICAgICAgICAgICAgID0gIkRlZmF1bHQgQ2FtZXJhIEhBTCIsCisgICAgICAgIC5hdXRob3IgICAgICAgICAgICAgPSAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIsCisgICAgICAgIC5tZXRob2RzICAgICAgICAgICAgPSAmZ0NhbWVyYU1vZHVsZU1ldGhvZHMsCisgICAgICAgIC5kc28gICAgICAgICAgICAgICAgPSBOVUxMLAorICAgICAgICAucmVzZXJ2ZWQgICAgICAgICAgID0gezB9LAogICAgIH0sCi0gICAgZ2V0X251bWJlcl9vZl9jYW1lcmFzIDogZ2V0X251bWJlcl9vZl9jYW1lcmFzLAotICAgIGdldF9jYW1lcmFfaW5mbyAgICAgICA6IGdldF9jYW1lcmFfaW5mbywKLSAgICBzZXRfY2FsbGJhY2tzICAgICAgICAgOiBzZXRfY2FsbGJhY2tzLAotICAgIGdldF92ZW5kb3JfdGFnX29wcyAgICA6IGdldF92ZW5kb3JfdGFnX29wcywKLSAgICBvcGVuX2xlZ2FjeSAgICAgICAgICAgOiBOVUxMLAotICAgIHNldF90b3JjaF9tb2RlICAgICAgICA6IE5VTEwsCi0gICAgaW5pdCAgICAgICAgICAgICAgICAgIDogTlVMTCwKLSAgICByZXNlcnZlZCAgICAgICAgICAgICAgOiB7MH0sCisgICAgLmdldF9udW1iZXJfb2ZfY2FtZXJhcyA9IGdldF9udW1iZXJfb2ZfY2FtZXJhcywKKyAgICAuZ2V0X2NhbWVyYV9pbmZvICAgICAgID0gZ2V0X2NhbWVyYV9pbmZvLAorICAgIC5zZXRfY2FsbGJhY2tzICAgICAgICAgPSBzZXRfY2FsbGJhY2tzLAorICAgIC5nZXRfdmVuZG9yX3RhZ19vcHMgICAgPSBnZXRfdmVuZG9yX3RhZ19vcHMsCisgICAgLm9wZW5fbGVnYWN5ICAgICAgICAgICA9IE5VTEwsCisgICAgLnNldF90b3JjaF9tb2RlICAgICAgICA9IE5VTEwsCisgICAgLmluaXQgICAgICAgICAgICAgICAgICA9IE5VTEwsCisgICAgLnJlc2VydmVkICAgICAgICAgICAgICA9IHswfSwKIH07CiB9IC8vIGV4dGVybiAiQyIKIApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9jYW1lcmEvQ2FtZXJhSEFMLmggYi9tb2R1bGVzL2NhbWVyYS8zXzAvQ2FtZXJhSEFMLmgKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gbW9kdWxlcy9jYW1lcmEvQ2FtZXJhSEFMLmgKcmVuYW1lIHRvIG1vZHVsZXMvY2FtZXJhLzNfMC9DYW1lcmFIQUwuaAppbmRleCAwMGM3NGU1Li43NGE3MGE2IDEwMDY0NAotLS0gYS9tb2R1bGVzL2NhbWVyYS9DYW1lcmFIQUwuaAorKysgYi9tb2R1bGVzL2NhbWVyYS8zXzAvQ2FtZXJhSEFMLmgKQEAgLTI5LDcgKzI5LDcgQEAKIC8vIGNhbWVyYSBkZXZpY2UuCiBjbGFzcyBDYW1lcmFIQUwgewogICAgIHB1YmxpYzoKLSAgICAgICAgQ2FtZXJhSEFMKGludCBudW1fY2FtZXJhcyk7CisgICAgICAgIGV4cGxpY2l0IENhbWVyYUhBTChpbnQgbnVtX2NhbWVyYXMpOwogICAgICAgICB+Q2FtZXJhSEFMKCk7CiAKICAgICAgICAgLy8gQ2FtZXJhIE1vZHVsZSBJbnRlcmZhY2UgKHNlZSA8aGFyZHdhcmUvY2FtZXJhX2NvbW1vbi5oPikKZGlmZiAtLWdpdCBhL21vZHVsZXMvY2FtZXJhL0V4YW1wbGVDYW1lcmEuY3BwIGIvbW9kdWxlcy9jYW1lcmEvM18wL0V4YW1wbGVDYW1lcmEuY3BwCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIG1vZHVsZXMvY2FtZXJhL0V4YW1wbGVDYW1lcmEuY3BwCnJlbmFtZSB0byBtb2R1bGVzL2NhbWVyYS8zXzAvRXhhbXBsZUNhbWVyYS5jcHAKaW5kZXggZDg3MzMyMS4uZDA2MGQzNSAxMDA2NDQKLS0tIGEvbW9kdWxlcy9jYW1lcmEvRXhhbXBsZUNhbWVyYS5jcHAKKysrIGIvbW9kdWxlcy9jYW1lcmEvM18wL0V4YW1wbGVDYW1lcmEuY3BwCkBAIC0yNiw3ICsyNiw3IEBACiAKICNpbmNsdWRlICJFeGFtcGxlQ2FtZXJhLmgiCiAKLSNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKGFbMF0pKQorI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKIAogbmFtZXNwYWNlIGRlZmF1bHRfY2FtZXJhX2hhbCB7CiAKQEAgLTI2NCw3ICsyNjQsOCBAQAogICAgIHJldHVybiBzZXRUZW1wbGF0ZShDQU1FUkEzX1RFTVBMQVRFX1pFUk9fU0hVVFRFUl9MQUcsIG0uZ2V0KCkpOwogfQogCi1ib29sIEV4YW1wbGVDYW1lcmE6OmlzVmFsaWRDYXB0dXJlU2V0dGluZ3MoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QqIHNldHRpbmdzKQorYm9vbCBFeGFtcGxlQ2FtZXJhOjppc1ZhbGlkQ2FwdHVyZVNldHRpbmdzKAorICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCogLypzZXR0aW5ncyovKQogewogICAgIC8vIFRPRE86IHJlamVjdCBzZXR0aW5ncyB0aGF0IGNhbm5vdCBiZSBjYXB0dXJlZAogICAgIHJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9jYW1lcmEvRXhhbXBsZUNhbWVyYS5oIGIvbW9kdWxlcy9jYW1lcmEvM18wL0V4YW1wbGVDYW1lcmEuaApzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBtb2R1bGVzL2NhbWVyYS9FeGFtcGxlQ2FtZXJhLmgKcmVuYW1lIHRvIG1vZHVsZXMvY2FtZXJhLzNfMC9FeGFtcGxlQ2FtZXJhLmgKaW5kZXggNDVjNGE5NC4uNDRlYWM3NiAxMDA2NDQKLS0tIGEvbW9kdWxlcy9jYW1lcmEvRXhhbXBsZUNhbWVyYS5oCisrKyBiL21vZHVsZXMvY2FtZXJhLzNfMC9FeGFtcGxlQ2FtZXJhLmgKQEAgLTI3LDcgKzI3LDcgQEAKIC8vIG1ldGFkYXRhIGFuZCBsb2dpYyBhYm91dCB0aGF0IGRldmljZS4KIGNsYXNzIEV4YW1wbGVDYW1lcmEgOiBwdWJsaWMgQ2FtZXJhIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIEV4YW1wbGVDYW1lcmEoaW50IGlkKTsKKyAgICAgICAgZXhwbGljaXQgRXhhbXBsZUNhbWVyYShpbnQgaWQpOwogICAgICAgICB+RXhhbXBsZUNhbWVyYSgpOwogCiAgICAgcHJpdmF0ZToKZGlmZiAtLWdpdCBhL21vZHVsZXMvY2FtZXJhL01ldGFkYXRhLmNwcCBiL21vZHVsZXMvY2FtZXJhLzNfMC9NZXRhZGF0YS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1vZHVsZXMvY2FtZXJhL01ldGFkYXRhLmNwcApyZW5hbWUgdG8gbW9kdWxlcy9jYW1lcmEvM18wL01ldGFkYXRhLmNwcApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9jYW1lcmEvTWV0YWRhdGEuaCBiL21vZHVsZXMvY2FtZXJhLzNfMC9NZXRhZGF0YS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtb2R1bGVzL2NhbWVyYS9NZXRhZGF0YS5oCnJlbmFtZSB0byBtb2R1bGVzL2NhbWVyYS8zXzAvTWV0YWRhdGEuaApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9jYW1lcmEvU3RyZWFtLmNwcCBiL21vZHVsZXMvY2FtZXJhLzNfMC9TdHJlYW0uY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtb2R1bGVzL2NhbWVyYS9TdHJlYW0uY3BwCnJlbmFtZSB0byBtb2R1bGVzL2NhbWVyYS8zXzAvU3RyZWFtLmNwcApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9jYW1lcmEvU3RyZWFtLmggYi9tb2R1bGVzL2NhbWVyYS8zXzAvU3RyZWFtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1vZHVsZXMvY2FtZXJhL1N0cmVhbS5oCnJlbmFtZSB0byBtb2R1bGVzL2NhbWVyYS8zXzAvU3RyZWFtLmgKZGlmZiAtLWdpdCBhL21vZHVsZXMvY2FtZXJhL1ZlbmRvclRhZ3MuY3BwIGIvbW9kdWxlcy9jYW1lcmEvM18wL1ZlbmRvclRhZ3MuY3BwCnNpbWlsYXJpdHkgaW5kZXggOTElCnJlbmFtZSBmcm9tIG1vZHVsZXMvY2FtZXJhL1ZlbmRvclRhZ3MuY3BwCnJlbmFtZSB0byBtb2R1bGVzL2NhbWVyYS8zXzAvVmVuZG9yVGFncy5jcHAKaW5kZXggMmM1NDY0OC4uNDhjMWE0NiAxMDA2NDQKLS0tIGEvbW9kdWxlcy9jYW1lcmEvVmVuZG9yVGFncy5jcHAKKysrIGIvbW9kdWxlcy9jYW1lcmEvM18wL1ZlbmRvclRhZ3MuY3BwCkBAIC0xMzYsMTIgKzEzNiwxMyBAQAogewogfQogCi1pbnQgVmVuZG9yVGFnczo6Z2V0VGFnQ291bnQoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogb3BzKQoraW50IFZlbmRvclRhZ3M6OmdldFRhZ0NvdW50KGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIC8qb3BzKi8pCiB7CiAgICAgcmV0dXJuIG1UYWdDb3VudDsKIH0KIAotdm9pZCBWZW5kb3JUYWdzOjpnZXRBbGxUYWdzKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIG9wcywgdWludDMyX3QqIHRhZ19hcnJheSkKK3ZvaWQgVmVuZG9yVGFnczo6Z2V0QWxsVGFncyhjb25zdCB2ZW5kb3JfdGFnX29wc190KiAvKm9wcyovLAorICAgICAgICB1aW50MzJfdCogdGFnX2FycmF5KQogewogICAgIGlmICh0YWdfYXJyYXkgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiJXM6IE5VTEwgdGFnX2FycmF5IiwgX19mdW5jX18pOwpAQCAtMTU2LDcgKzE1Nyw4IEBACiAgICAgfQogfQogCi1jb25zdCBjaGFyKiBWZW5kb3JUYWdzOjpnZXRTZWN0aW9uTmFtZShjb25zdCB2ZW5kb3JfdGFnX29wc190KiBvcHMsIHVpbnQzMl90IHRhZykKK2NvbnN0IGNoYXIqIFZlbmRvclRhZ3M6OmdldFNlY3Rpb25OYW1lKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIC8qb3BzKi8sCisgICAgICAgIHVpbnQzMl90IHRhZykKIHsKICAgICBjb25zdCBTZWN0aW9uKiBzZWN0aW9uID0gZ2V0U2VjdGlvbih0YWcpOwogCkBAIC0xNjYsNyArMTY4LDggQEAKICAgICByZXR1cm4gc2VjdGlvbi0+bmFtZTsKIH0KIAotY29uc3QgY2hhciogVmVuZG9yVGFnczo6Z2V0VGFnTmFtZShjb25zdCB2ZW5kb3JfdGFnX29wc190KiBvcHMsIHVpbnQzMl90IHRhZykKK2NvbnN0IGNoYXIqIFZlbmRvclRhZ3M6OmdldFRhZ05hbWUoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogLypvcHMqLywKKyAgICAgICAgdWludDMyX3QgdGFnKQogewogICAgIGNvbnN0IEVudHJ5KiBlbnRyeSA9IGdldEVudHJ5KHRhZyk7CiAKQEAgLTE3Niw3ICsxNzksNyBAQAogICAgIHJldHVybiBlbnRyeS0+bmFtZTsKIH0KIAotaW50IFZlbmRvclRhZ3M6OmdldFRhZ1R5cGUoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogb3BzLCB1aW50MzJfdCB0YWcpCitpbnQgVmVuZG9yVGFnczo6Z2V0VGFnVHlwZShjb25zdCB2ZW5kb3JfdGFnX29wc190KiAvKm9wcyovLCB1aW50MzJfdCB0YWcpCiB7CiAgICAgY29uc3QgRW50cnkqIGVudHJ5ID0gZ2V0RW50cnkodGFnKTsKIApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9jYW1lcmEvVmVuZG9yVGFncy5oIGIvbW9kdWxlcy9jYW1lcmEvM18wL1ZlbmRvclRhZ3MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbW9kdWxlcy9jYW1lcmEvVmVuZG9yVGFncy5oCnJlbmFtZSB0byBtb2R1bGVzL2NhbWVyYS8zXzAvVmVuZG9yVGFncy5oCmRpZmYgLS1naXQgYS9tb2R1bGVzL2NhbWVyYS9BbmRyb2lkLm1rIGIvbW9kdWxlcy9jYW1lcmEvQW5kcm9pZC5tawppbmRleCBhZTY4ZWQ1Li43MTM4OGFhIDEwMDY0NAotLS0gYS9tb2R1bGVzL2NhbWVyYS9BbmRyb2lkLm1rCisrKyBiL21vZHVsZXMvY2FtZXJhL0FuZHJvaWQubWsKQEAgLTEsNCArMSw0IEBACi0jIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xMiwzNCArMTIsNCBAQAogIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gY2FtZXJhLmRlZmF1bHQKLUxPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IGh3Ci0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotCXN5c3RlbS9jb3JlL2luY2x1ZGUgXAotCXN5c3RlbS9tZWRpYS9jYW1lcmEvaW5jbHVkZSBcCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0JQ2FtZXJhSEFMLmNwcCBcCi0JQ2FtZXJhLmNwcCBcCi0JRXhhbXBsZUNhbWVyYS5jcHAgXAotCU1ldGFkYXRhLmNwcCBcCi0JU3RyZWFtLmNwcCBcCi0JVmVuZG9yVGFncy5jcHAgXAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjYW1lcmFfbWV0YWRhdGEgXAotCWxpYmN1dGlscyBcCi0JbGlibG9nIFwKLQlsaWJzeW5jIFwKLQlsaWJ1dGlscyBcCi0KLUxPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2V4dHJhIC1mdmlzaWJpbGl0eT1oaWRkZW4KLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQoraW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9tb2R1bGVzL2NvbnN1bWVyaXIvQW5kcm9pZC5icCBiL21vZHVsZXMvY29uc3VtZXJpci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMzk0OTIKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL2NvbnN1bWVyaXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJjb25zdW1lcmlyLmRlZmF1bHQiLAorICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImh3IiwKKyAgICBwcm9wcmlldGFyeTogdHJ1ZSwKKyAgICBzcmNzOiBbImNvbnN1bWVyaXIuYyJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tb2R1bGVzL2NvbnN1bWVyaXIvQW5kcm9pZC5tayBiL21vZHVsZXMvY29uc3VtZXJpci9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODgxNTcyLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvY29uc3VtZXJpci9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IGNvbnN1bWVyaXIuZGVmYXVsdAotTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gaHcKLUxPQ0FMX1NSQ19GSUxFUyA6PSBjb25zdW1lcmlyLmMKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlibG9nIGxpYmN1dGlscwotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9jb25zdW1lcmlyL2NvbnN1bWVyaXIuYyBiL21vZHVsZXMvY29uc3VtZXJpci9jb25zdW1lcmlyLmMKaW5kZXggZjNlYWMwYi4uMmFmNmI4OSAxMDA2NDQKLS0tIGEvbW9kdWxlcy9jb25zdW1lcmlyL2NvbnN1bWVyaXIuYworKysgYi9tb2R1bGVzL2NvbnN1bWVyaXIvY29uc3VtZXJpci5jCkBAIC0xOCwxMSArMTgsMTEgQEAKICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPG1hbGxvYy5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9jb25zdW1lcmlyLmg+CiAKLSNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKGFbMF0pKQorI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKIAogc3RhdGljIGNvbnN0IGNvbnN1bWVyaXJfZnJlcV9yYW5nZV90IGNvbnN1bWVyaXJfZnJlcXNbXSA9IHsKICAgICB7Lm1pbiA9IDMwMDAwLCAubWF4ID0gMzAwMDB9LApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9maW5nZXJwcmludC9BbmRyb2lkLmJwIGIvbW9kdWxlcy9maW5nZXJwcmludC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNzQ5ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL2ZpbmdlcnByaW50L0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAiZmluZ2VycHJpbnQuZGVmYXVsdCIsCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiaHciLAorICAgIHByb3ByaWV0YXJ5OiB0cnVlLAorICAgIHNyY3M6IFsiZmluZ2VycHJpbnQuYyJdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmxvZyJdLAorfQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9maW5nZXJwcmludC9BbmRyb2lkLm1rIGIvbW9kdWxlcy9maW5nZXJwcmludC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGMwYTgzLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZmluZ2VycHJpbnQvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBmaW5nZXJwcmludC5kZWZhdWx0Ci1MT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBodwotTE9DQUxfU1JDX0ZJTEVTIDo9IGZpbmdlcnByaW50LmMKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlibG9nCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tb2R1bGVzL2dyYWxsb2MvQW5kcm9pZC5tayBiL21vZHVsZXMvZ3JhbGxvYy9BbmRyb2lkLm1rCmluZGV4IDA5MmU4NTEuLmZmNTgwOGQgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvZ3JhbGxvYy9BbmRyb2lkLm1rCisrKyBiL21vZHVsZXMvZ3JhbGxvYy9BbmRyb2lkLm1rCkBAIC0yMCw2ICsyMCw3IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gaHcKK0xPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSA6PSB0cnVlCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmxvZyBsaWJjdXRpbHMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9IAlcCkBAIC0yNyw2ICsyOCw4IEBACiAJZnJhbWVidWZmZXIuY3BwIFwKIAltYXBwZXIuY3BwCiAKK0xPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gbGliaGFyZHdhcmVfaGVhZGVycworCiBMT0NBTF9NT0RVTEUgOj0gZ3JhbGxvYy5kZWZhdWx0CiBMT0NBTF9DRkxBR1M6PSAtRExPR19UQUc9XCJncmFsbG9jXCIgLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycwogaWZlcSAoJChUQVJHRVRfVVNFX1BBTl9ESVNQTEFZKSx0cnVlKQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9ncmFsbG9jL2dyLmggYi9tb2R1bGVzL2dyYWxsb2MvZ3IuaAppbmRleCA3MzJiNmJjLi5hYzdlOTY3IDEwMDY0NAotLS0gYS9tb2R1bGVzL2dyYWxsb2MvZ3IuaAorKysgYi9tb2R1bGVzL2dyYWxsb2MvZ3IuaApAQCAtNDgsNyArNDgsNyBAQAogICAgIGNsYXNzIEF1dG9sb2NrIHsKICAgICAgICAgTG9ja2VyJiBsb2NrZXI7CiAgICAgcHVibGljOgotICAgICAgICBpbmxpbmUgQXV0b2xvY2soTG9ja2VyJiBsb2NrZXIpIDogbG9ja2VyKGxvY2tlcikgeyAgbG9ja2VyLmxvY2soKTsgfQorICAgICAgICBpbmxpbmUgZXhwbGljaXQgQXV0b2xvY2soTG9ja2VyJiBsb2NrZXIpIDogbG9ja2VyKGxvY2tlcikgeyAgbG9ja2VyLmxvY2soKTsgfQogICAgICAgICBpbmxpbmUgfkF1dG9sb2NrKCkgeyBsb2NrZXIudW5sb2NrKCk7IH0KICAgICB9OwogICAgIGlubGluZSBMb2NrZXIoKSAgICAgICAgeyBwdGhyZWFkX211dGV4X2luaXQoJm11dGV4LCAwKTsgfQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9ncmFsbG9jL2dyYWxsb2MuY3BwIGIvbW9kdWxlcy9ncmFsbG9jL2dyYWxsb2MuY3BwCmluZGV4IGU5NTU5ZTkuLjg0MTMzZmQgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvZ3JhbGxvYy9ncmFsbG9jLmNwcAorKysgYi9tb2R1bGVzL2dyYWxsb2MvZ3JhbGxvYy5jcHAKQEAgLTIxMCw2ICsyMTAsOSBAQAogCiAgICAgaW50IGJ5dGVzUGVyUGl4ZWwgPSAwOwogICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBX0ZQMTY6CisgICAgICAgICAgICBieXRlc1BlclBpeGVsID0gODsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OgogICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCWF84ODg4OgogICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQkdSQV84ODg4OgpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9od2NvbXBvc2VyL0FuZHJvaWQubWsgYi9tb2R1bGVzL2h3Y29tcG9zZXIvQW5kcm9pZC5tawppbmRleCAzNWMwZmFlLi5kYTBmNmRiIDEwMDY0NAotLS0gYS9tb2R1bGVzL2h3Y29tcG9zZXIvQW5kcm9pZC5taworKysgYi9tb2R1bGVzL2h3Y29tcG9zZXIvQW5kcm9pZC5tawpAQCAtMjAsNiArMjAsNyBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IGh3CitMT0NBTF9QUk9QUklFVEFSWV9NT0RVTEUgOj0gdHJ1ZQogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJsb2cgbGliRUdMCiBMT0NBTF9TUkNfRklMRVMgOj0gaHdjb21wb3Nlci5jcHAKIExPQ0FMX01PRFVMRSA6PSBod2NvbXBvc2VyLmRlZmF1bHQKZGlmZiAtLWdpdCBhL21vZHVsZXMvaHdjb21wb3Nlci9od2NvbXBvc2VyLmNwcCBiL21vZHVsZXMvaHdjb21wb3Nlci9od2NvbXBvc2VyLmNwcAppbmRleCA5ZDFhYTM0Li43YjJlMjc4IDEwMDY0NAotLS0gYS9tb2R1bGVzL2h3Y29tcG9zZXIvaHdjb21wb3Nlci5jcHAKKysrIGIvbW9kdWxlcy9od2NvbXBvc2VyL2h3Y29tcG9zZXIuY3BwCkBAIC0zOCwxOCArMzgsMTggQEAKICAgICAgICAgc3RydWN0IGh3X2RldmljZV90KiogZGV2aWNlKTsKIAogc3RhdGljIHN0cnVjdCBod19tb2R1bGVfbWV0aG9kc190IGh3Y19tb2R1bGVfbWV0aG9kcyA9IHsKLSAgICBvcGVuOiBod2NfZGV2aWNlX29wZW4KKyAgICAub3BlbiA9IGh3Y19kZXZpY2Vfb3BlbgogfTsKIAogaHdjX21vZHVsZV90IEhBTF9NT0RVTEVfSU5GT19TWU0gPSB7Ci0gICAgY29tbW9uOiB7Ci0gICAgICAgIHRhZzogSEFSRFdBUkVfTU9EVUxFX1RBRywKLSAgICAgICAgdmVyc2lvbl9tYWpvcjogMSwKLSAgICAgICAgdmVyc2lvbl9taW5vcjogMCwKLSAgICAgICAgaWQ6IEhXQ19IQVJEV0FSRV9NT0RVTEVfSUQsCi0gICAgICAgIG5hbWU6ICJTYW1wbGUgaHdjb21wb3NlciBtb2R1bGUiLAotICAgICAgICBhdXRob3I6ICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IiwKLSAgICAgICAgbWV0aG9kczogJmh3Y19tb2R1bGVfbWV0aG9kcywKKyAgICAuY29tbW9uID0geworICAgICAgICAudGFnID0gSEFSRFdBUkVfTU9EVUxFX1RBRywKKyAgICAgICAgLnZlcnNpb25fbWFqb3IgPSAxLAorICAgICAgICAudmVyc2lvbl9taW5vciA9IDAsCisgICAgICAgIC5pZCA9IEhXQ19IQVJEV0FSRV9NT0RVTEVfSUQsCisgICAgICAgIC5uYW1lID0gIlNhbXBsZSBod2NvbXBvc2VyIG1vZHVsZSIsCisgICAgICAgIC5hdXRob3IgPSAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIsCisgICAgICAgIC5tZXRob2RzID0gJmh3Y19tb2R1bGVfbWV0aG9kcywKICAgICB9CiB9OwogCkBAIC02OCw4ICs2OCw4IEBACiAgICAgICAgICAgICBsLT5kaXNwbGF5RnJhbWUuYm90dG9tKTsKIH0KIAotc3RhdGljIGludCBod2NfcHJlcGFyZShod2NfY29tcG9zZXJfZGV2aWNlXzFfdCAqZGV2LAotICAgICAgICBzaXplX3QgbnVtRGlzcGxheXMsIGh3Y19kaXNwbGF5X2NvbnRlbnRzXzFfdCoqIGRpc3BsYXlzKSB7CitzdGF0aWMgaW50IGh3Y19wcmVwYXJlKGh3Y19jb21wb3Nlcl9kZXZpY2VfMV90ICogLypkZXYqLywKKyAgICAgICAgc2l6ZV90IC8qbnVtRGlzcGxheXMqLywgaHdjX2Rpc3BsYXlfY29udGVudHNfMV90KiogZGlzcGxheXMpIHsKICAgICBpZiAoZGlzcGxheXMgJiYgKGRpc3BsYXlzWzBdLT5mbGFncyAmIEhXQ19HRU9NRVRSWV9DSEFOR0VEKSkgewogICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGRpc3BsYXlzWzBdLT5udW1Id0xheWVycyA7IGkrKykgewogICAgICAgICAgICAgLy9kdW1wX2xheWVyKCZsaXN0LT5od0xheWVyc1tpXSk7CkBAIC03OSwxNiArNzksMTYgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBod2Nfc2V0KGh3Y19jb21wb3Nlcl9kZXZpY2VfMV90ICpkZXYsCi0gICAgICAgIHNpemVfdCBudW1EaXNwbGF5cywgaHdjX2Rpc3BsYXlfY29udGVudHNfMV90KiogZGlzcGxheXMpCitzdGF0aWMgaW50IGh3Y19zZXQoaHdjX2NvbXBvc2VyX2RldmljZV8xX3QgKiAvKmRldiovLAorICAgICAgICBzaXplX3QgLypudW1EaXNwbGF5cyovLCBod2NfZGlzcGxheV9jb250ZW50c18xX3QqKiBkaXNwbGF5cykKIHsKICAgICAvL2ZvciAoc2l6ZV90IGk9MCA7IGk8bGlzdC0+bnVtSHdMYXllcnMgOyBpKyspIHsKICAgICAvLyAgICBkdW1wX2xheWVyKCZsaXN0LT5od0xheWVyc1tpXSk7CiAgICAgLy99CiAKLSAgICBFR0xCb29sZWFuIHN1Y2VzcyA9IGVnbFN3YXBCdWZmZXJzKChFR0xEaXNwbGF5KWRpc3BsYXlzWzBdLT5kcHksCisgICAgRUdMQm9vbGVhbiBzdWNjZXNzID0gZWdsU3dhcEJ1ZmZlcnMoKEVHTERpc3BsYXkpZGlzcGxheXNbMF0tPmRweSwKICAgICAgICAgICAgIChFR0xTdXJmYWNlKWRpc3BsYXlzWzBdLT5zdXIpOwotICAgIGlmICghc3VjZXNzKSB7CisgICAgaWYgKCFzdWNjZXNzKSB7CiAgICAgICAgIHJldHVybiBIV0NfRUdMX0VSUk9SOwogICAgIH0KICAgICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL21vZHVsZXMvaW5wdXQvZXZkZXYvQW5kcm9pZC5tayBiL21vZHVsZXMvaW5wdXQvZXZkZXYvQW5kcm9pZC5tawppbmRleCA5YTVkMDkyLi5iZTRkYjZiIDEwMDY0NAotLS0gYS9tb2R1bGVzL2lucHV0L2V2ZGV2L0FuZHJvaWQubWsKKysrIGIvbW9kdWxlcy9pbnB1dC9ldmRldi9BbmRyb2lkLm1rCkBAIC00NSw2ICs0NSw3IEBACiAKIExPQ0FMX01PRFVMRSA6PSBpbnB1dC5ldmRldi5kZWZhdWx0CiBMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBodworTE9DQUxfUFJPUFJJRVRBUllfTU9EVUxFIDo9IHRydWUKIAogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKICAgICBFdmRldk1vZHVsZS5jcHAKZGlmZiAtLWdpdCBhL21vZHVsZXMvaW5wdXQvZXZkZXYvSW5wdXRIdWIuY3BwIGIvbW9kdWxlcy9pbnB1dC9ldmRldi9JbnB1dEh1Yi5jcHAKaW5kZXggMzg5OTU1ZC4uZTJjNjVmYSAxMDA2NDQKLS0tIGEvbW9kdWxlcy9pbnB1dC9ldmRldi9JbnB1dEh1Yi5jcHAKKysrIGIvbW9kdWxlcy9pbnB1dC9ldmRldi9JbnB1dEh1Yi5jcHAKQEAgLTYxMCw3ICs2MTAsNyBAQAogICAgICAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICAgICAgIHNzaXplX3QgcmVhZFNpemUgPSBURU1QX0ZBSUxVUkVfUkVUUlkocmVhZChpbnB1dEZkLCBpZXZzLCBzaXplb2YoaWV2cykpKTsKICAgICAgICAgICAgICAgICBpZiAocmVhZFNpemUgPT0gMCB8fCAocmVhZFNpemUgPCAwICYmIGVycm5vID09IEVOT0RFVikpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImNvdWxkIG5vdCBnZXQgZXZlbnQsIHJlbW92ZWQ/IChmZDogJWQsIHNpemU6ICVkIGVycm5vOiAlZCkiLAorICAgICAgICAgICAgICAgICAgICBBTE9HVygiY291bGQgbm90IGdldCBldmVudCwgcmVtb3ZlZD8gKGZkOiAlZCwgc2l6ZTogJXpkIGVycm5vOiAlZCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RmQsIHJlYWRTaXplLCBlcnJubyk7CiAKICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZERldmljZUZkcy5wdXNoX2JhY2soaW5wdXRGZCk7CkBAIC02MjEsNyArNjIxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlYWRTaXplICUgc2l6ZW9mKGlucHV0X2V2ZW50KSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjb3VsZCBub3QgZ2V0IGV2ZW50LiB3cm9uZyBzaXplPSVkIiwgcmVhZFNpemUpOworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiY291bGQgbm90IGdldCBldmVudC4gd3Jvbmcgc2l6ZT0lemQiLCByZWFkU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCA9IHN0YXRpY19jYXN0PHNpemVfdD4ocmVhZFNpemUpIC8gc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudCk7CkBAIC03MDIsNyArNzAyLDcgQEAKICAgICAgICAgICAgIGlmIChldmVudC0+bWFzayAmIElOX0NSRUFURSkgewogICAgICAgICAgICAgICAgIGF1dG8gZGV2aWNlTm9kZSA9IG9wZW5Ob2RlKHBhdGgpOwogICAgICAgICAgICAgICAgIGlmIChkZXZpY2VOb2RlID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBvcGVuIGRldmljZSBub2RlICVzLiBlcnI9JWQiLCBwYXRoLmNfc3RyKCksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjb3VsZCBub3Qgb3BlbiBkZXZpY2Ugbm9kZSAlcy4gZXJyPSV6ZCIsIHBhdGguY19zdHIoKSwgcmVzKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBtSW5wdXRDYWxsYmFjay0+b25EZXZpY2VBZGRlZChkZXZpY2VOb2RlKTsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9tb2R1bGVzL2xvY2FsX3RpbWUvQW5kcm9pZC5icCBiL21vZHVsZXMvbG9jYWxfdGltZS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0M2FmYTUKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL2xvY2FsX3RpbWUvQW5kcm9pZC5icApAQCAtMCwwICsxLDMzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gVGhlIGRlZmF1bHQgbG9jYWwgdGltZSBIQUwgbW9kdWxlLiAgVGhlIGRlZmF1bHQgbW9kdWxlIHNpbXBseSB1c2VzIHRoZQorLy8gc3lzdGVtJ3MgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMpIGFuZCBkb2VzIG5vdCBzdXBwb3J0IEhXIHNsZXdpbmcuCisvLyBEZXZpY2VzIHdoaWNoIHVzZSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaG91bGQgdGFrZSBjYXJlIHRvIGVuc3VyZSB0aGF0CisvLyB0aGUgb3NjaWxsYXRvciBiYWNraW5nIHRoZSBDTE9DS19NT05PVE9OSUMgaW1wbGVtZW50YXRpb24gaXMgcGhhc2UgbG9ja2VkIHRvCisvLyB0aGUgYXVkaW8gYW5kIHZpZGVvIG91dHB1dCBoYXJkd2FyZS4gIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBsb2FkZWQKKy8vIGlmIG5vIG90aGVyIGRldmljZSBzcGVjaWZpYyBtb2R1bGVzIGFyZSBwcmVzZW50LiBUaGUgZXhhY3QgbG9hZCBvcmRlciBjYW4gYmUKKy8vIHNlZW4gaW4gbGliaGFyZHdhcmUvaGFyZHdhcmUuYworLy8KKy8vIFRoZSBmb3JtYXQgb2YgdGhlIG5hbWUgaXMgbG9jYWxfdGltZS48aGFyZHdhcmU+LnNvCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxvY2FsX3RpbWUuZGVmYXVsdCIsCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiaHciLAorICAgIHByb3ByaWV0YXJ5OiB0cnVlLAorICAgIHNyY3M6IFsibG9jYWxfdGltZV9ody5jIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tb2R1bGVzL2xvY2FsX3RpbWUvQW5kcm9pZC5tayBiL21vZHVsZXMvbG9jYWxfdGltZS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTg4NWFhLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbG9jYWxfdGltZS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi0jIFRoZSBkZWZhdWx0IGxvY2FsIHRpbWUgSEFMIG1vZHVsZS4gIFRoZSBkZWZhdWx0IG1vZHVsZSBzaW1wbHkgdXNlcyB0aGUKLSMgc3lzdGVtJ3MgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMpIGFuZCBkb2VzIG5vdCBzdXBwb3J0IEhXIHNsZXdpbmcuCi0jIERldmljZXMgd2hpY2ggdXNlIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNob3VsZCB0YWtlIGNhcmUgdG8gZW5zdXJlIHRoYXQKLSMgdGhlIG9zY2lsbGF0b3IgYmFja2luZyB0aGUgQ0xPQ0tfTU9OT1RPTklDIGltcGxlbWVudGF0aW9uIGlzIHBoYXNlIGxvY2tlZCB0bwotIyB0aGUgYXVkaW8gYW5kIHZpZGVvIG91dHB1dCBoYXJkd2FyZS4gIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBsb2FkZWQKLSMgaWYgbm8gb3RoZXIgZGV2aWNlIHNwZWNpZmljIG1vZHVsZXMgYXJlIHByZXNlbnQuIFRoZSBleGFjdCBsb2FkIG9yZGVyIGNhbiBiZQotIyBzZWVuIGluIGxpYmhhcmR3YXJlL2hhcmR3YXJlLmMKLSMKLSMgVGhlIGZvcm1hdCBvZiB0aGUgbmFtZSBpcyBsb2NhbF90aW1lLjxoYXJkd2FyZT4uc28KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gbG9jYWxfdGltZS5kZWZhdWx0Ci1MT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBodwotTE9DQUxfU1JDX0ZJTEVTIDo9IGxvY2FsX3RpbWVfaHcuYwotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJsb2cgbGliY3V0aWxzCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tb2R1bGVzL2xvY2FsX3RpbWUvbG9jYWxfdGltZV9ody5jIGIvbW9kdWxlcy9sb2NhbF90aW1lL2xvY2FsX3RpbWVfaHcuYwppbmRleCBhYzU5N2Y0Li44OTljMzhhIDEwMDY0NAotLS0gYS9tb2R1bGVzL2xvY2FsX3RpbWUvbG9jYWxfdGltZV9ody5jCisrKyBiL21vZHVsZXMvbG9jYWxfdGltZS9sb2NhbF90aW1lX2h3LmMKQEAgLTI4LDYgKzI4LDkgQEAKICNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2xvY2FsX3RpbWVfaGFsLmg+CiAKKy8vIFdlIG9ubHkgc3VwcG9ydCBnY2MgYW5kIGNsYW5nLCBib3RoIG9mIHdoaWNoIHN1cHBvcnQgdGhpcyBhdHRyaWJ1dGUuCisjZGVmaW5lIFVOVVNFRF9BUkdVTUVOVCBfX2F0dHJpYnV0ZSgodW51c2VkKSkKKwogc3RydWN0IHN0dWJfbG9jYWxfdGltZV9kZXZpY2UgewogICAgIHN0cnVjdCBsb2NhbF90aW1lX2h3X2RldmljZSBkZXZpY2U7CiB9OwpAQCAtNTEsNyArNTQsOCBAQAogICAgIHJldHVybiAoaW50NjRfdClub3c7CiB9CiAKLXN0YXRpYyB1aW50NjRfdCBsdGRldl9nZXRfbG9jYWxfZnJlcShzdHJ1Y3QgbG9jYWxfdGltZV9od19kZXZpY2UqIGRldikKK3N0YXRpYyB1aW50NjRfdCBsdGRldl9nZXRfbG9jYWxfZnJlcSgKKyAgICAgICAgc3RydWN0IGxvY2FsX3RpbWVfaHdfZGV2aWNlKiBkZXYgVU5VU0VEX0FSR1VNRU5UKQogewogICAgIC8vIEZvciBiZXR0ZXIgb3Igd29yc2UsIGxpbnV4IGNsb2NrX2dldHRpbWUgcm91dGluZXMgbm9ybWFsaXplIGFsbCBjbG9jawogICAgIC8vIGZyZXF1ZW5jaWVzIHRvIDFHSHoKZGlmZiAtLWdpdCBhL21vZHVsZXMvbmZjLW5jaS9BbmRyb2lkLmJwIGIvbW9kdWxlcy9uZmMtbmNpL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBkMmEyOAotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvbmZjLW5jaS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogIm5mY19uY2kuZGVmYXVsdCIsCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiaHciLAorICAgIHByb3ByaWV0YXJ5OiB0cnVlLAorICAgIHNyY3M6IFsibmZjX25jaV9leGFtcGxlLmMiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21vZHVsZXMvbmZjLW5jaS9BbmRyb2lkLm1rIGIvbW9kdWxlcy9uZmMtbmNpL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZjY3OWEuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9uZmMtbmNpL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gbmZjX25jaS5kZWZhdWx0Ci1MT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBodwotTE9DQUxfU1JDX0ZJTEVTIDo9IG5mY19uY2lfZXhhbXBsZS5jCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmxvZyBsaWJjdXRpbHMKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21vZHVsZXMvbmZjLW5jaS9uZmNfbmNpX2V4YW1wbGUuYyBiL21vZHVsZXMvbmZjLW5jaS9uZmNfbmNpX2V4YW1wbGUuYwppbmRleCA3NThjMmI3Li5lYTVlYjQ3IDEwMDY0NAotLS0gYS9tb2R1bGVzL25mYy1uY2kvbmZjX25jaV9leGFtcGxlLmMKKysrIGIvbW9kdWxlcy9uZmMtbmNpL25mY19uY2lfZXhhbXBsZS5jCkBAIC0yMyw0NCArMjMsNjEgQEAKIAogCiAvKgorICogV2Ugd2FudCB0byBzaWxlbmNlIHRoZSAidW51c2VkIGFyZ3VtZW50IiB0aGF0IGdjYyBhbmQgY2xhbmcgZ2l2ZS4KKyAqIE90aGVyIGNvbXBpbGVycyBnZW5lcmF0aW5nIHRoaXMgd2FybmluZyB3aWxsIG5lZWQgdG8gcHJvdmlkZSB0aGVpcgorICogY3VzdG9tIGF0dHJpYnV0ZSB0byBzaWxlbmNlIHRoaXMuCisgKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fY2xhbmdfXykKKyNkZWZpbmUgVU5VU0VEX0FSR1VNRU5UIF9fYXR0cmlidXRlKCh1bnVzZWQpKQorI2Vsc2UKKyNkZWZpbmUgVU5VU0VEX0FSR1VNRU5UCisjZW5kaWYKKworLyoKICAqIE5DSSBIQUwgbWV0aG9kIGltcGxlbWVudGF0aW9ucy4gVGhlc2UgbXVzdCBiZSBvdmVycmlkZW4KICAqLwotc3RhdGljIGludCBoYWxfb3Blbihjb25zdCBzdHJ1Y3QgbmZjX25jaV9kZXZpY2UgKmRldiwKLSAgICAgICAgbmZjX3N0YWNrX2NhbGxiYWNrX3QgKnBfY2JhY2ssIG5mY19zdGFja19kYXRhX2NhbGxiYWNrX3QgKnBfZGF0YV9jYmFjaykgeworc3RhdGljIGludCBoYWxfb3Blbihjb25zdCBzdHJ1Y3QgbmZjX25jaV9kZXZpY2UgKmRldiBVTlVTRURfQVJHVU1FTlQsCisgICAgICAgIG5mY19zdGFja19jYWxsYmFja190ICpwX2NiYWNrIFVOVVNFRF9BUkdVTUVOVCwKKyAgICAgICAgbmZjX3N0YWNrX2RhdGFfY2FsbGJhY2tfdCAqcF9kYXRhX2NiYWNrIFVOVVNFRF9BUkdVTUVOVCkgewogICAgIEFMT0dFKCJORkMtTkNJIEhBTDogJXMiLCBfX0ZVTkNUSU9OX18pOwogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGhhbF93cml0ZShjb25zdCBzdHJ1Y3QgbmZjX25jaV9kZXZpY2UgKmRldiwKLSAgICAgICAgdWludDE2X3QgZGF0YV9sZW4sIGNvbnN0IHVpbnQ4X3QgKnBfZGF0YSkgeworc3RhdGljIGludCBoYWxfd3JpdGUoY29uc3Qgc3RydWN0IG5mY19uY2lfZGV2aWNlICpkZXYgVU5VU0VEX0FSR1VNRU5ULAorICAgICAgICB1aW50MTZfdCBkYXRhX2xlbiBVTlVTRURfQVJHVU1FTlQsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBfZGF0YSBVTlVTRURfQVJHVU1FTlQpIHsKICAgICBBTE9HRSgiTkZDLU5DSSBIQUw6ICVzIiwgX19GVU5DVElPTl9fKTsKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBoYWxfY29yZV9pbml0aWFsaXplZChjb25zdCBzdHJ1Y3QgbmZjX25jaV9kZXZpY2UgKmRldiwKLSAgICAgICAgdWludDhfdCogcF9jb3JlX2luaXRfcnNwX3BhcmFtcykgeworc3RhdGljIGludCBoYWxfY29yZV9pbml0aWFsaXplZCgKKyAgICAgICAgY29uc3Qgc3RydWN0IG5mY19uY2lfZGV2aWNlICpkZXYgVU5VU0VEX0FSR1VNRU5ULAorICAgICAgICB1aW50OF90KiBwX2NvcmVfaW5pdF9yc3BfcGFyYW1zIFVOVVNFRF9BUkdVTUVOVCkgewogICAgIEFMT0dFKCJORkMtTkNJIEhBTDogJXMiLCBfX0ZVTkNUSU9OX18pOwogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGhhbF9wcmVfZGlzY292ZXIoY29uc3Qgc3RydWN0IG5mY19uY2lfZGV2aWNlICpkZXYpIHsKK3N0YXRpYyBpbnQgaGFsX3ByZV9kaXNjb3ZlcigKKyAgICAgICAgY29uc3Qgc3RydWN0IG5mY19uY2lfZGV2aWNlICpkZXYgVU5VU0VEX0FSR1VNRU5UKSB7CiAgICAgQUxPR0UoIk5GQy1OQ0kgSEFMOiAlcyIsIF9fRlVOQ1RJT05fXyk7CiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaGFsX2Nsb3NlKGNvbnN0IHN0cnVjdCBuZmNfbmNpX2RldmljZSAqZGV2KSB7CitzdGF0aWMgaW50IGhhbF9jbG9zZShjb25zdCBzdHJ1Y3QgbmZjX25jaV9kZXZpY2UgKmRldiBVTlVTRURfQVJHVU1FTlQpIHsKICAgICBBTE9HRSgiTkZDLU5DSSBIQUw6ICVzIiwgX19GVU5DVElPTl9fKTsKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBoYWxfY29udHJvbF9ncmFudGVkIChjb25zdCBzdHJ1Y3QgbmZjX25jaV9kZXZpY2UgKnBfZGV2KQorc3RhdGljIGludCBoYWxfY29udHJvbF9ncmFudGVkICgKKyAgICAgICAgY29uc3Qgc3RydWN0IG5mY19uY2lfZGV2aWNlICpwX2RldiBVTlVTRURfQVJHVU1FTlQpCiB7CiAgICAgQUxPR0UoIk5GQy1OQ0kgSEFMOiAlcyIsIF9fRlVOQ1RJT05fXyk7CiAgICAgcmV0dXJuIDA7CiB9CiAKIAotc3RhdGljIGludCBoYWxfcG93ZXJfY3ljbGUgKGNvbnN0IHN0cnVjdCBuZmNfbmNpX2RldmljZSAqcF9kZXYpCitzdGF0aWMgaW50IGhhbF9wb3dlcl9jeWNsZSAoCisgICAgICAgIGNvbnN0IHN0cnVjdCBuZmNfbmNpX2RldmljZSAqcF9kZXYgVU5VU0VEX0FSR1VNRU5UKQogewogICAgIEFMT0dFKCJORkMtTkNJIEhBTDogJXMiLCBfX0ZVTkNUSU9OX18pOwogICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9uZmMvQW5kcm9pZC5icCBiL21vZHVsZXMvbmZjL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBkYzJjMQotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvbmZjL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibmZjLmRlZmF1bHQiLAorICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImh3IiwKKyAgICBwcm9wcmlldGFyeTogdHJ1ZSwKKyAgICBzcmNzOiBbIm5mY19wbjU0NF9leGFtcGxlLmMiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9uZmMvQW5kcm9pZC5tayBiL21vZHVsZXMvbmZjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YjIzOWMuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9uZmMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBuZmMuZGVmYXVsdAotTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gaHcKLUxPQ0FMX1NSQ19GSUxFUyA6PSBuZmNfcG41NDRfZXhhbXBsZS5jCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmxvZyBsaWJjdXRpbHMKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21vZHVsZXMvcG93ZXIvQW5kcm9pZC5icCBiL21vZHVsZXMvcG93ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGM3NGNlCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9wb3dlci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogInBvd2VyLmRlZmF1bHQiLAorICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImh3IiwKKyAgICBwcm9wcmlldGFyeTogdHJ1ZSwKKyAgICBzcmNzOiBbInBvd2VyLmMiXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJsb2ciXSwKK30KZGlmZiAtLWdpdCBhL21vZHVsZXMvcG93ZXIvQW5kcm9pZC5tayBiL21vZHVsZXMvcG93ZXIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg2OGRlZC4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL3Bvd2VyL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gcG93ZXIuZGVmYXVsdAotTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gaHcKLUxPQ0FMX1NSQ19GSUxFUyA6PSBwb3dlci5jCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmxvZwotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9wb3dlci9wb3dlci5jIGIvbW9kdWxlcy9wb3dlci9wb3dlci5jCmluZGV4IDdjYWNjMDkuLjE1ZDdiYTIgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvcG93ZXIvcG93ZXIuYworKysgYi9tb2R1bGVzL3Bvd2VyL3Bvd2VyLmMKQEAgLTI1LDE2ICsyNSwyMSBAQAogI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvcG93ZXIuaD4KIAotc3RhdGljIHZvaWQgcG93ZXJfaW5pdChzdHJ1Y3QgcG93ZXJfbW9kdWxlICptb2R1bGUpCisvLyBXZSBvbmx5IHN1cHBvcnQgY2xhbmcgYW5kIGcrKy4KKyNkZWZpbmUgVU5VU0VEX0FSR1VNRU5UIF9fYXR0cmlidXRlKCh1bnVzZWQpKQorCitzdGF0aWMgdm9pZCBwb3dlcl9pbml0KHN0cnVjdCBwb3dlcl9tb2R1bGUgKm1vZHVsZSBVTlVTRURfQVJHVU1FTlQpCiB7CiB9CiAKLXN0YXRpYyB2b2lkIHBvd2VyX3NldF9pbnRlcmFjdGl2ZShzdHJ1Y3QgcG93ZXJfbW9kdWxlICptb2R1bGUsIGludCBvbikKK3N0YXRpYyB2b2lkIHBvd2VyX3NldF9pbnRlcmFjdGl2ZShzdHJ1Y3QgcG93ZXJfbW9kdWxlICptb2R1bGUgVU5VU0VEX0FSR1VNRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvbiBVTlVTRURfQVJHVU1FTlQpCiB7CiB9CiAKLXN0YXRpYyB2b2lkIHBvd2VyX2hpbnQoc3RydWN0IHBvd2VyX21vZHVsZSAqbW9kdWxlLCBwb3dlcl9oaW50X3QgaGludCwKLSAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworc3RhdGljIHZvaWQgcG93ZXJfaGludChzdHJ1Y3QgcG93ZXJfbW9kdWxlICptb2R1bGUgVU5VU0VEX0FSR1VNRU5ULAorICAgICAgICAgICAgICAgICAgICAgICBwb3dlcl9oaW50X3QgaGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSBVTlVTRURfQVJHVU1FTlQpIHsKICAgICBzd2l0Y2ggKGhpbnQpIHsKICAgICBkZWZhdWx0OgogICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL21vZHVsZXMvcmFkaW8vQW5kcm9pZC5tayBiL21vZHVsZXMvcmFkaW8vQW5kcm9pZC5tawppbmRleCAyMjE0MjRmLi42ZjExMTY5IDEwMDY0NAotLS0gYS9tb2R1bGVzL3JhZGlvL0FuZHJvaWQubWsKKysrIGIvbW9kdWxlcy9yYWRpby9BbmRyb2lkLm1rCkBAIC0yMSw2ICsyMSw3IEBACiAKIExPQ0FMX01PRFVMRSA6PSByYWRpby5mbS5kZWZhdWx0CiBMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBodworTE9DQUxfUFJPUFJJRVRBUllfTU9EVUxFIDo9IHRydWUKIExPQ0FMX1NSQ19GSUxFUyA6PSByYWRpb19ody5jCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmxvZyBsaWJjdXRpbHMgbGlicmFkaW9fbWV0YWRhdGEKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCmRpZmYgLS1naXQgYS9tb2R1bGVzL3JhZGlvL3JhZGlvX2hhbF90b29sLmMgYi9tb2R1bGVzL3JhZGlvL3JhZGlvX2hhbF90b29sLmMKaW5kZXggMDVkODcyZS4uNmM0MDczOSAxMDA2NDQKLS0tIGEvbW9kdWxlcy9yYWRpby9yYWRpb19oYWxfdG9vbC5jCisrKyBiL21vZHVsZXMvcmFkaW8vcmFkaW9faGFsX3Rvb2wuYwpAQCAtMTMxLDcgKzEzMSw3IEBACiAgICAgICAgIHJhZGlvX21ldGFkYXRhX2tleV90IGtleTsKICAgICAgICAgcmFkaW9fbWV0YWRhdGFfdHlwZV90IHR5cGU7CiAgICAgICAgIHZvaWQgKnZhbHVlOwotICAgICAgICB1aW50MzJfdCBzaXplOworICAgICAgICBzaXplX3Qgc2l6ZTsKIAogICAgICAgICByYWRpb19tZXRhZGF0YV9nZXRfYXRfaW5kZXgoaW5mby5tZXRhZGF0YSwgaSwgJmtleSwgJnR5cGUsICZ2YWx1ZSwgJnNpemUpOwogCmRpZmYgLS1naXQgYS9tb2R1bGVzL3JhZGlvL3JhZGlvX2h3LmMgYi9tb2R1bGVzL3JhZGlvL3JhZGlvX2h3LmMKaW5kZXggZmJmOGM5NC4uNDAxMDUwNyAxMDA2NDQKLS0tIGEvbW9kdWxlcy9yYWRpby9yYWRpb19ody5jCisrKyBiL21vZHVsZXMvcmFkaW8vcmFkaW9faHcuYwpAQCAtNDcsNyArNDcsNyBAQAogICAgIC5iYW5kcyA9IHsKICAgICAgICAgewogICAgICAgICAgICAgLnR5cGUgPSBSQURJT19CQU5EX0ZNLAotICAgICAgICAgICAgLmFudGVubmFfY29ubmVjdGVkID0gZmFsc2UsCisgICAgICAgICAgICAuYW50ZW5uYV9jb25uZWN0ZWQgPSB0cnVlLAogICAgICAgICAgICAgLmxvd2VyX2xpbWl0ID0gODc5MDAsCiAgICAgICAgICAgICAudXBwZXJfbGltaXQgPSAxMDc5MDAsCiAgICAgICAgICAgICAubnVtX3NwYWNpbmdzID0gMSwKQEAgLTE4OSw3ICsxODksNyBAQAogZXhpdDoKICAgICBjbG9zZShmZCk7CiAgICAgZnJlZShkYXRhKTsKLSAgICBBTE9HRV9JRihyZXQgIT0gMCwgIiVzIGVycm9yICVkIiwgX19mdW5jX18sIHJldCk7CisgICAgQUxPR0VfSUYocmV0ICE9IDAsICIlcyBlcnJvciAlZCIsIF9fZnVuY19fLCAoaW50KXJldCk7CiAgICAgcmV0dXJuIChpbnQpcmV0OwogfQogCkBAIC0yMDksNiArMjA5LDcgQEAKICAgICAqbWV0YWRhdGEgPSBOVUxMOwogCiAgICAgcmV0ID0gcmFkaW9fbWV0YWRhdGFfYWxsb2NhdGUobWV0YWRhdGEsIHR1bmVyLT5wcm9ncmFtLmNoYW5uZWwsIDApOworCiAgICAgaWYgKHJldCAhPSAwKQogICAgICAgICByZXR1cm4gcmV0OwogCkBAIC0yMjAsMTQgKzIyMSwxNCBAQAogICAgICAgICBpZiAocmV0ICE9IDApCiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIHJldCA9IGFkZF9iaXRtYXBfbWV0YWRhdGEobWV0YWRhdGEsIFJBRElPX01FVEFEQVRBX0tFWV9JQ09OLCBCSVRNQVBfRklMRV9QQVRIKTsKLSAgICAgICAgaWYgKHJldCAhPSAwKQorICAgICAgICBpZiAocmV0ICE9IDAgJiYgcmV0ICE9IC1FUElQRSkKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgcmV0ID0gcmFkaW9fbWV0YWRhdGFfYWRkX2Nsb2NrKG1ldGFkYXRhLCBSQURJT19NRVRBREFUQV9LRVlfQ0xPQ0ssICZod19jbG9jayk7CiAgICAgICAgIGlmIChyZXQgIT0gMCkKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9IGVsc2UgewogICAgICAgICByZXQgPSBhZGRfYml0bWFwX21ldGFkYXRhKG1ldGFkYXRhLCBSQURJT19NRVRBREFUQV9LRVlfQVJULCBCSVRNQVBfRklMRV9QQVRIKTsKLSAgICAgICAgaWYgKHJldCAhPSAwKQorICAgICAgICBpZiAocmV0ICE9IDAgJiYgcmV0ICE9IC1FUElQRSkKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAKQEAgLTM1NSw2ICszNTYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgdHVuZXItPnByb2dyYW0uc3RlcmVvID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgIHR1bmVyLT5wcm9ncmFtLnN0ZXJlbyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBwcmVwYXJlX21ldGFkYXRhKHR1bmVyLCAmdHVuZXItPnByb2dyYW0ubWV0YWRhdGEsIHR1bmVyLT5wcm9ncmFtLnR1bmVkKTsKIAogICAgICAgICAgICAgICAgICAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfVFVORUQ7CiAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmluZm8gPSB0dW5lci0+cHJvZ3JhbTsKQEAgLTM4MSw2ICszODMsNyBAQAogICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICB0dW5lci0+cHJvZ3JhbS5zdGVyZW8gPSB0dW5lci0+Y29uZmlnLmFtLnN0ZXJlbzsKICAgICAgICAgICAgICAgICAgICAgdHVuZXItPnByb2dyYW0uc2lnbmFsX3N0cmVuZ3RoID0gNTA7CisgICAgICAgICAgICAgICAgICAgIHByZXBhcmVfbWV0YWRhdGEodHVuZXIsICZ0dW5lci0+cHJvZ3JhbS5tZXRhZGF0YSwgdHVuZXItPnByb2dyYW0udHVuZWQpOwogCiAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnR5cGUgPSBSQURJT19FVkVOVF9UVU5FRDsKICAgICAgICAgICAgICAgICAgICAgZXZlbnQuaW5mbyA9IHR1bmVyLT5wcm9ncmFtOwpAQCAtMzkzLDEyICszOTYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR1bmVyLT5jb25maWcuc3BhY2luZ3NbMF0gKiA1KSkgJSAyOwogCiAgICAgICAgICAgICAgICAgICAgIGlmICh0dW5lci0+cHJvZ3JhbS50dW5lZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGFyZV9tZXRhZGF0YSh0dW5lciwgJnR1bmVyLT5wcm9ncmFtLm1ldGFkYXRhLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfY29tbWFuZF9sKHR1bmVyLCBDTURfQU5OT1VOQ0VNRU5UUywgMTAwMCwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHVuZXItPnByb2dyYW0ubWV0YWRhdGEgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWRpb19tZXRhZGF0YV9kZWFsbG9jYXRlKHR1bmVyLT5wcm9ncmFtLm1ldGFkYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR1bmVyLT5wcm9ncmFtLm1ldGFkYXRhID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB0dW5lci0+cHJvZ3JhbS5zaWduYWxfc3RyZW5ndGggPSAxMDA7CiAgICAgICAgICAgICAgICAgICAgIGlmICh0dW5lci0+Y29uZmlnLnR5cGUgPT0gUkFESU9fQkFORF9GTSkKQEAgLTQwNyw2ICs0MDUsOCBAQAogICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICB0dW5lci0+cHJvZ3JhbS5zdGVyZW8gPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1bmVyLT5wcm9ncmFtLnR1bmVkID8gdHVuZXItPmNvbmZpZy5hbS5zdGVyZW8gOiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcHJlcGFyZV9tZXRhZGF0YSh0dW5lciwgJnR1bmVyLT5wcm9ncmFtLm1ldGFkYXRhLCB0dW5lci0+cHJvZ3JhbS50dW5lZCk7CisKICAgICAgICAgICAgICAgICAgICAgZXZlbnQudHlwZSA9IFJBRElPX0VWRU5UX1RVTkVEOwogICAgICAgICAgICAgICAgICAgICBldmVudC5pbmZvID0gdHVuZXItPnByb2dyYW07CiAgICAgICAgICAgICAgICAgICAgIHNlbmRfbWV0YV9kYXRhID0gdHJ1ZTsKQEAgLTQxOCw3ICs0MTgsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQudHlwZSA9IFJBRElPX0VWRU5UX01FVEFEQVRBOwogICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQubWV0YWRhdGEgPSBtZXRhZGF0YTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZW5kX21ldGFfZGF0YSA9IHRydWU7CiAgICAgICAgICAgICAgICAgfSBicmVhazsKIAogICAgICAgICAgICAgICAgIGNhc2UgQ01EX0NBTkNFTDogewpAQCAtNTAyLDYgKzUwMSwxMCBAQAogICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQorICAgIGlmIChjb25maWctPmxvd2VyX2xpbWl0ID4gY29uZmlnLT51cHBlcl9saW1pdCkgeworICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHNlbmRfY29tbWFuZF9sKHN0dWJfdHVuZXIsIENNRF9DQU5DRUwsIDAsIE5VTEwpOwogICAgIHNlbmRfY29tbWFuZF9sKHN0dWJfdHVuZXIsIENNRF9DT05GSUcsIDUwMCwgKHZvaWQgKiljb25maWcpOwogCkBAIC02MTQsNyArNjE3LDEyIEBACiAgICAgbWV0YWRhdGEgPSBpbmZvLT5tZXRhZGF0YTsKICAgICAqaW5mbyA9IHN0dWJfdHVuZXItPnByb2dyYW07CiAgICAgaW5mby0+bWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICBpZiAobWV0YWRhdGEgIT0gTlVMTCAmJiBzdHViX3R1bmVyLT5wcm9ncmFtLm1ldGFkYXRhICE9IE5VTEwpCisgICAgaWYgKG1ldGFkYXRhID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzIG1ldGFkYXRhIGlzIGEgbnVsbHB0ciIsIF9fZnVuY19fKTsKKyAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKyAgICBpZiAoc3R1Yl90dW5lci0+cHJvZ3JhbS5tZXRhZGF0YSAhPSBOVUxMKQogICAgICAgICByYWRpb19tZXRhZGF0YV9hZGRfbWV0YWRhdGEoJmluZm8tPm1ldGFkYXRhLCBzdHViX3R1bmVyLT5wcm9ncmFtLm1ldGFkYXRhKTsKIAogZXhpdDoKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9BbmRyb2lkLmJwIGIvbW9kdWxlcy9zZW5zb3JzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQxNTA2NQotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTUgQEAKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibXVsdGloYWwiLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJtdWx0aWhhbC5jcHAiLAorICAgICAgICAiU2Vuc29yRXZlbnRRdWV1ZS5jcHAiCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJkbCIKKyAgICBdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAorfQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL0FuZHJvaWQubWsgYi9tb2R1bGVzL3NlbnNvcnMvQW5kcm9pZC5tawppbmRleCA1MzRlNmU5Li5jYTI3N2U2IDEwMDY0NAotLS0gYS9tb2R1bGVzL3NlbnNvcnMvQW5kcm9pZC5taworKysgYi9tb2R1bGVzL3NlbnNvcnMvQW5kcm9pZC5tawpAQCAtMjMsNiArMjMsNyBAQAogTE9DQUxfTU9EVUxFIDo9IHNlbnNvcnMuJChUQVJHRVRfREVWSUNFKQogCiBMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBodworTE9DQUxfUFJPUFJJRVRBUllfTU9EVUxFIDo9IHRydWUKIAogTE9DQUxfQ0ZMQUdTIDo9IC1ETE9HX1RBRz1cIk11bHRpSGFsXCIKIApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL1NlbnNvckV2ZW50UXVldWUuaCBiL21vZHVsZXMvc2Vuc29ycy9TZW5zb3JFdmVudFF1ZXVlLmgKaW5kZXggMTFlMWY0MS4uOTc3OGU5MyAxMDA2NDQKLS0tIGEvbW9kdWxlcy9zZW5zb3JzL1NlbnNvckV2ZW50UXVldWUuaAorKysgYi9tb2R1bGVzL3NlbnNvcnMvU2Vuc29yRXZlbnRRdWV1ZS5oCkBAIC0zOCw3ICszOCw3IEBACiAgICAgcHRocmVhZF9jb25kX3QgbVNwYWNlQXZhaWxhYmxlQ29uZGl0aW9uOwogCiBwdWJsaWM6Ci0gICAgU2Vuc29yRXZlbnRRdWV1ZShpbnQgY2FwYWNpdHkpOworICAgIGV4cGxpY2l0IFNlbnNvckV2ZW50UXVldWUoaW50IGNhcGFjaXR5KTsKICAgICB+U2Vuc29yRXZlbnRRdWV1ZSgpOwogCiAgICAgLy8gUmV0dXJucyBsZW5ndGggb2YgcmVnaW9uLCBiZXR3ZWVuIHplcm8gYW5kIG1pbihjYXBhY2l0eSwgcmVxdWVzdGVkTGVuZ3RoKS4gSWYgdGhlcmUgaXMgYW55CmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvQW5kcm9pZC5tayBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MDg1MDgKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvQW5kcm9pZC5tawpAQCAtMCwwICsxLDEyNiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorQ09NTU9OX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yIC1XZXh0cmEKKworZHluYW1pY19zZW5zb3Jfc3JjIDo9IFwKKyAgICBCYXNlRHluYW1pY1NlbnNvckRhZW1vbi5jcHAgXAorICAgIEJhc2VTZW5zb3JPYmplY3QuY3BwIFwKKyAgICBDb25uZWN0aW9uRGV0ZWN0b3IuY3BwIFwKKyAgICBEdW1teUR5bmFtaWNBY2NlbERhZW1vbi5jcHAgXAorICAgIER5bmFtaWNTZW5zb3JNYW5hZ2VyLmNwcCBcCisgICAgSGlkUmF3RGV2aWNlLmNwcCBcCisgICAgSGlkUmF3U2Vuc29yLmNwcCBcCisgICAgSGlkUmF3U2Vuc29yRGFlbW9uLmNwcCBcCisgICAgSGlkUmF3U2Vuc29yRGV2aWNlLmNwcCBcCisgICAgUmluZ0J1ZmZlci5jcHAKKworZHluYW1pY19zZW5zb3Jfc2hhcmVkX2xpYiA6PSBcCisgICAgbGliYmFzZSBcCisgICAgbGliY3V0aWxzIFwKKyAgICBsaWJoaWRwYXJzZXIgXAorICAgIGxpYmxvZyBcCisgICAgbGlidXRpbHMKKyMKKyMgVGhlcmUgYXJlIHR3byB3YXlzIHRvIHV0aWxpemUgdGhlIGR5bmFtaWMgc2Vuc29yIG1vZHVsZToKKyMgICAxLiBVc2UgYXMgYW4gZXh0ZW5zaW9uIGluIGFuIGV4aXN0aW5nIGhhbDogZGVjbGFyZSBkZXBlbmRlbmN5IG9uIGxpYmR5bmFtaWNfc2Vuc29yX2V4dCBzaGFyZWQKKyMgICAgICBsaWJyYXJ5IGluIGV4aXN0aW5nIHNlbnNvciBoYWwuCisjICAgMi4gVXNlIGFzIGEgc3RhbmRhbG9uZSBzZW5zb3IgSEFMIGFuZCBjb25maWd1cmUgbXVsdGloYWwgdG8gY29tYmluZSBpdCB3aXRoIHNlbnNvciBoYWwgdGhhdAorIyAgICAgIGhvc3RzIG90aGVyIHNlbnNvcnM6IGFkZCBkZXBlbmRlbmN5IG9uIHNlbnNvcnMuZHluYW1pY19zZW5zb3JfaGFsIGluIGRldmljZSBsZXZlbCBtYWtlZmlsZSBhbmQKKyMgICAgICB3cml0ZSBtdWx0aWhhbCBjb25maWd1cmF0aW9uIGZpbGUgYWNjb3JkaW5nbHkuCisjCisjIFBsZWFzZSB0YWtlIG9ubHkgb25lIG9mIHRoZXNlIHR3byBvcHRpb25zIHRvIGF2b2lkIGNvbmZsaWN0IG92ZXIgaGFyZHdhcmUgcmVzb3VyY2UuCisjCisjCisjIE9wdGlvbiAxOiBzZW5zb3IgZXh0ZW5zaW9uIG1vZHVsZQorIworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gbGliZHluYW1pY19zZW5zb3JfZXh0CitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorIyBpbnRlbmRlZCB0byBiZSBpbnRlZ3JhdGVkIGludG8gaGFsLCB0aHVzIHByb3ByaWV0YXJ5CitMT0NBTF9QUk9QUklFVEFSWV9NT0RVTEUgOj0gdHJ1ZQorCitMT0NBTF9DRkxBR1MgKz0gJChDT01NT05fQ0ZMQUdTKSAtRExPR19UQUc9XCJEeW5hbWljU2Vuc29yRXh0XCIKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoZHluYW1pY19zZW5zb3Jfc3JjKQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9ICQoZHluYW1pY19zZW5zb3Jfc2hhcmVkX2xpYikKKworTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTIDo9ICQoTE9DQUxfUEFUSCkKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCisjCisjIE9wdGlvbiAyOiBpbmRlcGVuZGVudCBzZW5zb3IgaGFsCisjCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBzZW5zb3JzLmR5bmFtaWNfc2Vuc29yX2hhbAorTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gaHcKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisjIGhhbCBtb2R1bGUsIHRodXMgcHJvcHJpZXRhcnkKK0xPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSA6PSB0cnVlCisKK0xPQ0FMX0NGTEFHUyArPSAkKENPTU1PTl9DRkxBR1MpIC1ETE9HX1RBRz1cIkR5bmFtaWNTZW5zb3JIYWxcIgorCitMT0NBTF9TUkNfRklMRVMgOj0gJChkeW5hbWljX3NlbnNvcl9zcmMpIHNlbnNvcnMuY3BwCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gJChkeW5hbWljX3NlbnNvcl9zaGFyZWRfbGliKQorCitMT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gJChMT0NBTF9QQVRIKQorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKKyMKKyMgSG9zdCB0ZXN0IGZvciBIaWRSYXdTZW5zb3IuIFRlc3Qgd2l0aCBkdW1teSB0ZXN0IEhJRCBkZXNjcmlwdG9ycy4KKyMKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGhpZHJhd3NlbnNvcl9ob3N0X3Rlc3QKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX0NGTEFHUyArPSAkKENPTU1PTl9DRkxBR1MpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgSGlkUmF3U2Vuc29yLmNwcCBcCisgICAgQmFzZVNlbnNvck9iamVjdC5jcHAgXAorICAgIEhpZFV0aWxzL3Rlc3QvVGVzdEhpZERlc2NyaXB0b3IuY3BwIFwKKyAgICB0ZXN0L0hpZFJhd1NlbnNvclRlc3QuY3BwCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliaGlkcGFyc2VyX2hvc3QKKworTE9DQUxfQ19JTkNMVURFUyArPSAkKExPQ0FMX1BBVEgpL3Rlc3QgJChMT0NBTF9QQVRIKS9IaWRVdGlscy90ZXN0CitpbmNsdWRlICQoQlVJTERfSE9TVF9FWEVDVVRBQkxFKQorCisjCisjIEhvc3QgdGVzdCBmb3IgSGlkUmF3RGV2aWNlIGFuZCBIaWRSYXdTZW5zb3IuIFRlc3Qgd2l0aCBoaWRyYXcKKyMgZGV2aWNlIG5vZGUuCisjCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBoaWRyYXdkZXZpY2VfaG9zdF90ZXN0CitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9DRkxBR1MgKz0gJChDT01NT05fQ0ZMQUdTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIEhpZFJhd0RldmljZS5jcHAgXAorICAgIEhpZFJhd1NlbnNvci5jcHAgXAorICAgIEJhc2VTZW5zb3JPYmplY3QuY3BwIFwKKyAgICB0ZXN0L0hpZFJhd0RldmljZVRlc3QuY3BwCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliaGlkcGFyc2VyX2hvc3QKKworTE9DQUxfQ19JTkNMVURFUyArPSAkKExPQ0FMX1BBVEgpL3Rlc3QgJChMT0NBTF9QQVRIKS9IaWRVdGlscy90ZXN0CitpbmNsdWRlICQoQlVJTERfSE9TVF9FWEVDVVRBQkxFKQorCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvSGlkVXRpbHMvQW5kcm9pZC5tawpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0Jhc2VEeW5hbWljU2Vuc29yRGFlbW9uLmNwcCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9CYXNlRHluYW1pY1NlbnNvckRhZW1vbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U5ZjIxNwotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9CYXNlRHluYW1pY1NlbnNvckRhZW1vbi5jcHAKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJCYXNlRHluYW1pY1NlbnNvckRhZW1vbi5oIgorI2luY2x1ZGUgIkR5bmFtaWNTZW5zb3JNYW5hZ2VyLmgiCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBTZW5zb3JIYWxFeHQgeworCitib29sIEJhc2VEeW5hbWljU2Vuc29yRGFlbW9uOjpvbkNvbm5lY3Rpb25DaGFuZ2UoY29uc3Qgc3RkOjpzdHJpbmcgJmRldmljZUtleSwgYm9vbCBjb25uZWN0ZWQpIHsKKyAgICBib29sIHJldCA9IGZhbHNlOworICAgIGF1dG8gaSA9IG1EZXZpY2VLZXlTZW5zb3JNYXAuZmluZChkZXZpY2VLZXkpOworICAgIGlmIChjb25uZWN0ZWQpIHsKKyAgICAgICAgaWYgKGkgPT0gbURldmljZUtleVNlbnNvck1hcC5lbmQoKSkgeworICAgICAgICAgICAgQUxPR1YoImRldmljZSAlcyBpcyBjb25uZWN0ZWQiLCBkZXZpY2VLZXkuY19zdHIoKSk7CisgICAgICAgICAgICAvLyBnZXQgc2Vuc29ycyBmcm9tIGltcGxlbWVudGF0aW9uCisgICAgICAgICAgICBCYXNlU2Vuc29yVmVjdG9yIHNlbnNvcnMgPSBjcmVhdGVTZW5zb3IoZGV2aWNlS2V5KTsKKyAgICAgICAgICAgIGlmIChzZW5zb3JzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgibm8gdmFsaWQgc2Vuc29yIGlzIGRlZmluZWQgaW4gZGV2aWNlICVzLCBpZ25vcmUiLCBkZXZpY2VLZXkuY19zdHIoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dWKCJkaXNjb3ZlcmVkICV6dSBzZW5zb3JzIGZyb20gZGV2aWNlIiwgc2Vuc29ycy5zaXplKCkpOworICAgICAgICAgICAgICAgIC8vIGJ1aWxkIGludGVybmFsIHRhYmxlIGZpcnN0CisgICAgICAgICAgICAgICAgYXV0byByZXN1bHQgPSBtRGV2aWNlS2V5U2Vuc29yTWFwLmVtcGxhY2UoZGV2aWNlS2V5LCBzdGQ6Om1vdmUoc2Vuc29ycykpOworICAgICAgICAgICAgICAgIC8vIHRoZW4gcmVnaXN0ZXIgc2Vuc29yIHRvIGR5bmFtaWMgc2Vuc29yIG1hbmFnZXIsIHJlc3VsdC5maXJzdCBpcyB0aGUgaXRlcmF0b3IKKyAgICAgICAgICAgICAgICAvLyBvZiBrZXktdmFsdWUgcGFpcjsgcmVzdWx0LmZpcnN0LT5zZWNvbmQgaXMgdGhlIHZhbHVlLCB3aGljaCBpcyBzLgorICAgICAgICAgICAgICAgIGZvciAoYXV0byAmaSA6IHJlc3VsdC5maXJzdC0+c2Vjb25kKSB7CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnJlZ2lzdGVyU2Vuc29yKGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiZGV2aWNlICVzIGlzIHJlZ2lzdGVyZWQiLCBkZXZpY2VLZXkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dEKCJkZXZpY2UgJXMgYWxyZWFkeSBhZGRlZCBhbmQgaXMgY29ubmVjdGVkIGFnYWluLCBpZ25vcmUiLCBkZXZpY2VLZXkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiZGV2aWNlICVzIGlzIGRpc2Nvbm5lY3RlZCIsIGRldmljZUtleS5jX3N0cigpKTsKKyAgICAgICAgaWYgKGkgIT0gbURldmljZUtleVNlbnNvck1hcC5lbmQoKSkgeworICAgICAgICAgICAgQmFzZVNlbnNvclZlY3RvciBzZW5zb3JzID0gaS0+c2Vjb25kOworICAgICAgICAgICAgZm9yIChhdXRvICZzZW5zb3IgOiBzZW5zb3JzKSB7CisgICAgICAgICAgICAgICAgbU1hbmFnZXIudW5yZWdpc3RlclNlbnNvcihzZW5zb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbURldmljZUtleVNlbnNvck1hcC5lcmFzZShpKTsKKyAgICAgICAgICAgIC8vIG5vdGlmeSBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgcmVtb3ZlU2Vuc29yKGRldmljZUtleSk7CisgICAgICAgICAgICBBTE9HVigiZGV2aWNlICVzIGlzIHVucmVnaXN0ZXJlZCIsIGRldmljZUtleS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigiZGV2aWNlIG5vdCBmb3VuZCBpbiByZWdpc3RyeSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KK30gLy8gbmFtZXNwYWNlIFNlbnNvckhhbEV4dAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvQmFzZUR5bmFtaWNTZW5zb3JEYWVtb24uaCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9CYXNlRHluYW1pY1NlbnNvckRhZW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZWM5NjUKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvQmFzZUR5bmFtaWNTZW5zb3JEYWVtb24uaApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFTlNPUkhBTF9FWFRfQkFTRV9EWU5BTUlDX1NFTlNPUl9EQUVNT05fSAorI2RlZmluZSBBTkRST0lEX1NFTlNPUkhBTF9FWFRfQkFTRV9EWU5BTUlDX1NFTlNPUl9EQUVNT05fSAorCisjaW5jbHVkZSAiQmFzZVNlbnNvck9iamVjdC5oIgorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgU2Vuc29ySGFsRXh0IHsKKworY2xhc3MgRHluYW1pY1NlbnNvck1hbmFnZXI7CisKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8c3A8QmFzZVNlbnNvck9iamVjdD4+IEJhc2VTZW5zb3JWZWN0b3I7CisKK2NsYXNzIEJhc2VEeW5hbWljU2Vuc29yRGFlbW9uIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIEJhc2VEeW5hbWljU2Vuc29yRGFlbW9uKER5bmFtaWNTZW5zb3JNYW5hZ2VyJiBtYW5hZ2VyKSA6IG1NYW5hZ2VyKG1hbmFnZXIpIHt9CisgICAgdmlydHVhbCB+QmFzZUR5bmFtaWNTZW5zb3JEYWVtb24oKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIGJvb2wgb25Db25uZWN0aW9uQ2hhbmdlKGNvbnN0IHN0ZDo6c3RyaW5nICZkZXZpY2VLZXksIGJvb2wgY29ubmVjdGVkKTsKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIEJhc2VTZW5zb3JWZWN0b3IgY3JlYXRlU2Vuc29yKGNvbnN0IHN0ZDo6c3RyaW5nICZkZXZpY2VLZXkpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlU2Vuc29yKGNvbnN0IHN0ZDo6c3RyaW5nICYvKmRldmljZUtleSovKSB7fTsKKworICAgIER5bmFtaWNTZW5zb3JNYW5hZ2VyICZtTWFuYWdlcjsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIEJhc2VTZW5zb3JWZWN0b3I+IG1EZXZpY2VLZXlTZW5zb3JNYXA7Cit9OworCit9IC8vIG5hbWVzcGFjZSBTZW5zb3JIYWxFeHQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfU0VOU09SSEFMX0VYVF9CQVNFX0RZTkFNSUNfU0VOU09SX0RBRU1PTl9ICisKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9CYXNlU2Vuc29yT2JqZWN0LmNwcCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9CYXNlU2Vuc29yT2JqZWN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWM3NmIyCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0Jhc2VTZW5zb3JPYmplY3QuY3BwCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQmFzZVNlbnNvck9iamVjdC5oIgorI2luY2x1ZGUgIlNlbnNvckV2ZW50Q2FsbGJhY2suaCIKKyNpbmNsdWRlICJVdGlscy5oIgorCisjaW5jbHVkZSA8Y3N0cmluZz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFNlbnNvckhhbEV4dCB7CisKK0Jhc2VTZW5zb3JPYmplY3Q6OkJhc2VTZW5zb3JPYmplY3QoKSA6IG1DYWxsYmFjayhudWxscHRyKSB7Cit9CisKK2Jvb2wgQmFzZVNlbnNvck9iamVjdDo6c2V0RXZlbnRDYWxsYmFjayhTZW5zb3JFdmVudENhbGxiYWNrKiBjYWxsYmFjaykgeworICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEJhc2VTZW5zb3JPYmplY3Q6OmdldFV1aWQodWludDhfdCogdXVpZCkgY29uc3QgeworICAgIC8vIGRlZmF1bHQgdXVpZCBkZW5vdGluZyB1dWlkIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHNlbnNvci4KKyAgICBtZW1zZXQodXVpZCwgMCwgMTYpOworfQorCitpbnQgQmFzZVNlbnNvck9iamVjdDo6Zmx1c2goKSB7CisgICAgc3RhdGljIGNvbnN0IHNlbnNvcnNfZXZlbnRfdCBldmVudCA9IHsKKyAgICAgICAgLnR5cGUgPSBTRU5TT1JfVFlQRV9NRVRBX0RBVEEsCisgICAgICAgIC50aW1lc3RhbXAgPSBUSU1FU1RBTVBfQVVUT19GSUxMICAvLyB0aW1lc3RhbXAgd2lsbCBiZSBmaWxsZWQgYXQgZGlzcGF0Y2hlcgorICAgIH07CisgICAgZ2VuZXJhdGVFdmVudChldmVudCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgQmFzZVNlbnNvck9iamVjdDo6Z2VuZXJhdGVFdmVudChjb25zdCBzZW5zb3JzX2V2ZW50X3QgJmUpIHsKKyAgICBpZiAobUNhbGxiYWNrKSB7CisgICAgICAgIG1DYWxsYmFjay0+c3VibWl0RXZlbnQoU1BfVEhJUywgZSk7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBTZW5zb3JIYWxFeHQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0Jhc2VTZW5zb3JPYmplY3QuaCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9CYXNlU2Vuc29yT2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkMWE1ZAotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9CYXNlU2Vuc29yT2JqZWN0LmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRU5TT1JIQUxfQkFTRV9TRU5TT1JfT0JKRUNUX0gKKyNkZWZpbmUgQU5EUk9JRF9TRU5TT1JIQUxfQkFTRV9TRU5TT1JfT0JKRUNUX0gKKworI2luY2x1ZGUgIlV0aWxzLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKworc3RydWN0IHNlbnNvcl90Oworc3RydWN0IHNlbnNvcnNfZXZlbnRfdDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFNlbnNvckhhbEV4dCB7CisKK2NsYXNzIFNlbnNvckV2ZW50Q2FsbGJhY2s7CisKK2NsYXNzIEJhc2VTZW5zb3JPYmplY3QgOiB2aXJ0dWFsIHB1YmxpYyBSRUZfQkFTRShCYXNlU2Vuc29yT2JqZWN0KSB7CitwdWJsaWM6CisgICAgQmFzZVNlbnNvck9iamVjdCgpOworICAgIHZpcnR1YWwgfkJhc2VTZW5zb3JPYmplY3QoKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBhbHdheXMgY2FsbGVkIGJ5IER5bmFtaWNTZW5zb3JNYW5hZ2VyLCBjYWxsYmFjayBtdXN0IHBvaW50IHRvCisgICAgLy8gdmFsaWQgb2JqZWN0IHRocm91Z2hvdXQgbGlmZSBjeWNsZSBvZiBCYXNlU2Vuc29yT2JqZWN0CisgICAgYm9vbCBzZXRFdmVudENhbGxiYWNrKFNlbnNvckV2ZW50Q2FsbGJhY2sqIGNhbGxiYWNrKTsKKworICAgIC8vIHZpcnR1YWwgZnVuY3Rpb25zIHRvIGdldCBzZW5zb3IgaW5mb3JtYXRpb24gYW5kIG9wZXJhdGUgc2Vuc29yCisgICAgdmlydHVhbCBjb25zdCBzZW5zb3JfdCogZ2V0U2Vuc29yKCkgY29uc3QgPSAwOworCisgICAgLy8gZ2V0IHV1aWQgb2Ygc2Vuc29yLCBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNldCBpdCB0byBhbGwgemVybywgbWVhbnMgZG9lcyBub3QgaGF2ZSBhIHV1aWQuCisgICAgdmlydHVhbCB2b2lkIGdldFV1aWQodWludDhfdCogdXVpZCkgY29uc3Q7CisKKyAgICAvLyBlbmFibGUgc2Vuc29yCisgICAgdmlydHVhbCBpbnQgZW5hYmxlKGJvb2wgZW5hYmxlKSA9IDA7CisKKyAgICAvLyBzZXQgc2FtcGxlIHBlcmlvZCBhbmQgYmF0Y2hpbmcgcGVyaW9kIG9mIHNlbnNvci4KKyAgICAvLyBib3RoIHNhbXBsZSBwZXJpb2QgYW5kIGJhdGNoIHBlcmlvZCBhcmUgaW4gbmFuby1zZWNvbmRzLgorICAgIHZpcnR1YWwgaW50IGJhdGNoKGludDY0X3Qgc2FtcGxlUGVyaW9kLCBpbnQ2NF90IGJhdGNoUGVyaW9kKSA9IDA7CisKKyAgICAvLyBmbHVzaCBzZW5zb3IsIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gd2lsbCBzZW5kIGEgZmx1c2ggY29tcGxldGUgZXZlbnQgYmFjay4KKyAgICB2aXJ0dWFsIGludCBmbHVzaCgpOworCitwcm90ZWN0ZWQ6CisgICAgLy8gdXRpbGl0eSBmdW5jdGlvbiBmb3Igc3ViLWNsYXNzCisgICAgdm9pZCBnZW5lcmF0ZUV2ZW50KGNvbnN0IHNlbnNvcnNfZXZlbnRfdCAmZSk7Citwcml2YXRlOgorICAgIFNlbnNvckV2ZW50Q2FsbGJhY2sqIG1DYWxsYmFjazsKK307CisKK30gLy8gbmFtZXNwYWNlIFNlbnNvckhhbEV4dAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9TRU5TT1JIQUxfQkFTRV9TRU5TT1JfT0JKRUNUX0gKKwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0Nvbm5lY3Rpb25EZXRlY3Rvci5jcHAgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvQ29ubmVjdGlvbkRldGVjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2E2ZjI3Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0Nvbm5lY3Rpb25EZXRlY3Rvci5jcHAKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQ29ubmVjdGlvbkRldGVjdG9yLmgiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHN5cy9pbm90aWZ5Lmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjaW5jbHVkZSA8c3N0cmVhbT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFNlbnNvckhhbEV4dCB7CisKKy8vIFNvY2tldENvbm5lY3Rpb25EZXRlY3RvciBmdW5jdGlvbnMKK1NvY2tldENvbm5lY3Rpb25EZXRlY3Rvcjo6U29ja2V0Q29ubmVjdGlvbkRldGVjdG9yKEJhc2VEeW5hbWljU2Vuc29yRGFlbW9uICpkLCBpbnQgcG9ydCkKKyAgICAgICAgOiBDb25uZWN0aW9uRGV0ZWN0b3IoZCksIFRocmVhZChmYWxzZSAvKmNhbkNhbGxKYXZhKi8pIHsKKyAgICAvLyBpbml0aWFsaXplIHNvY2tldCB0aGF0IGFjY2VwdCBjb25uZWN0aW9uIHRvIGxvY2FsaG9zdDpwb3J0CisgICAgbUxpc3RlbkZkID0gOjpzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOworICAgIGlmIChtTGlzdGVuRmQgPCAwKSB7CisgICAgICAgIEFMT0dFKCJDYW5ub3Qgb3BlbiBzb2NrZXQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzZXJ2ZXJBZGRyZXNzID0geworICAgICAgICAuc2luX2ZhbWlseSA9IEFGX0lORVQsCisgICAgICAgIC5zaW5fcG9ydCA9IGh0b25zKHBvcnQpLAorICAgICAgICAuc2luX2FkZHIgPSB7CisgICAgICAgICAgICAuc19hZGRyID0gaHRvbmwoSU5BRERSX0xPT1BCQUNLKQorICAgICAgICB9CisgICAgfTsKKworICAgIDo6YmluZChtTGlzdGVuRmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzZXJ2ZXJBZGRyZXNzLCBzaXplb2Yoc2VydmVyQWRkcmVzcykpOworICAgIGlmICg6Omxpc3RlbihtTGlzdGVuRmQsIDApICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJDYW5ub3QgbGlzdGVuIHRvIHBvcnQgJWQiLCBwb3J0KTsKKyAgICAgICAgbUxpc3RlbkZkID0gLTE7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gczsKKyAgICBzIDw8ICJzb2NrZXQ6IiA8PCBwb3J0OworICAgIG1EZXZpY2UgPSBzLnN0cigpOworCisgICAgcnVuKCJkZGFkX3NvY2tldCIpOworfQorCitTb2NrZXRDb25uZWN0aW9uRGV0ZWN0b3I6On5Tb2NrZXRDb25uZWN0aW9uRGV0ZWN0b3IoKSB7CisgICAgaWYgKG1MaXN0ZW5GZCA+PSAwKSB7CisgICAgICAgIHJlcXVlc3RFeGl0QW5kV2FpdCgpOworICAgIH0KK30KKworaW50IFNvY2tldENvbm5lY3Rpb25EZXRlY3Rvcjo6d2FpdEZvckNvbm5lY3Rpb24oKSB7CisgICAgcmV0dXJuIDo6YWNjZXB0KG1MaXN0ZW5GZCwgbnVsbHB0ciwgbnVsbHB0cik7Cit9CisKK3ZvaWQgU29ja2V0Q29ubmVjdGlvbkRldGVjdG9yOjp3YWl0Rm9yRGlzY29ubmVjdGlvbihpbnQgY29ubkZkKSB7CisgICAgY2hhciBidWZmZXJbMTZdOworICAgIHdoaWxlICg6OnJlYWQoY29ubkZkLCBidWZmZXIsIHNpemVvZihidWZmZXIpKSA+IDApIHsKKyAgICAgICAgLy8gZGlzY2FyZCBkYXRhIGJ1dCByZXNwb25zZSBzb21ldGhpbmcgdG8gZGVub3RlIHRocmVhZCBhbGl2ZQorICAgICAgICA6OndyaXRlKGNvbm5GZCwgIi4iLCAxKTsKKyAgICB9CisgICAgLy8gcmVhZCBmYWlsdXJlIG1lYW5zIGRpc2Nvbm5lY3Rpb24KKyAgICA6OmNsb3NlKGNvbm5GZCk7Cit9CisKK2Jvb2wgU29ja2V0Q29ubmVjdGlvbkRldGVjdG9yOjp0aHJlYWRMb29wKCkgeworICAgIHdoaWxlICghVGhyZWFkOjpleGl0UGVuZGluZygpKSB7CisgICAgICAgIC8vIGJsb2NrIHdhaXRpbmcgZm9yIGNvbm5lY3Rpb24KKyAgICAgICAgaW50IGNvbm5GZCA9IHdhaXRGb3JDb25uZWN0aW9uKCk7CisKKyAgICAgICAgaWYgKGNvbm5GZCA8IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoIlJlY2VpdmVkIGNvbm5lY3Rpb24sIHJlZ2lzdGVyIGR5bmFtaWMgYWNjZWwgc2Vuc29yIik7CisgICAgICAgIG1EYWVtb24tPm9uQ29ubmVjdGlvbkNoYW5nZShtRGV2aWNlLCB0cnVlKTsKKworICAgICAgICB3YWl0Rm9yRGlzY29ubmVjdGlvbihjb25uRmQpOworICAgICAgICBBTE9HVigiQ29ubmVjdGlvbiBicmVhaywgdW5yZWdpc3RlciBkeW5hbWljIGFjY2VsIHNlbnNvciIpOworICAgICAgICBtRGFlbW9uLT5vbkNvbm5lY3Rpb25DaGFuZ2UobURldmljZSwgZmFsc2UpOworICAgIH0KKyAgICBtRGFlbW9uLT5vbkNvbm5lY3Rpb25DaGFuZ2UobURldmljZSwgZmFsc2UpOworICAgIEFMT0dEKCJTb2NrZXRDb25uZWN0aW9uRGV0ZWN0b3IgdGhyZWFkIGV4aXRlZCIpOworICAgIHJldHVybiBmYWxzZTsKK30KKworLy8gRmlsZUNvbm5lY3Rpb25EZXRlY3RvciBmdW5jdGlvbnMKK0ZpbGVDb25uZWN0aW9uRGV0ZWN0b3I6OkZpbGVDb25uZWN0aW9uRGV0ZWN0b3IgKAorICAgICAgICBCYXNlRHluYW1pY1NlbnNvckRhZW1vbiAqZCwgY29uc3Qgc3RkOjpzdHJpbmcgJnBhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nICZyZWdleCkKKyAgICAgICAgICAgIDogQ29ubmVjdGlvbkRldGVjdG9yKGQpLCBUaHJlYWQoZmFsc2UgLypjYWxsQ2FsbEphdmEqLyksIG1QYXRoKHBhdGgpLCBtUmVnZXgocmVnZXgpIHsKKyAgICBtSW5vdGlmeUZkID0gOjppbm90aWZ5X2luaXQxKElOX05PTkJMT0NLKTsKKyAgICBpZiAobUlub3RpZnlGZCA8IDApIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBpbml0IGlub3RpZnkiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCB3ZCA9IDo6aW5vdGlmeV9hZGRfd2F0Y2gobUlub3RpZnlGZCwgcGF0aC5jX3N0cigpLCBJTl9DUkVBVEUgfCBJTl9ERUxFVEUgfCBJTl9NT1ZFRF9GUk9NKTsKKyAgICBpZiAod2QgPCAwKSB7CisgICAgICAgIDo6Y2xvc2UobUlub3RpZnlGZCk7CisgICAgICAgIG1Jbm90aWZ5RmQgPSAtMTsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBzZXR1cCB3YXRjaCBvbiBkaXIgJXMiLCBwYXRoLmNfc3RyKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbVBvbGxGZC5mZCA9IHdkOworICAgIG1Qb2xsRmQuZXZlbnRzID0gUE9MTElOOworCisgICAgcnVuKCJkZGFkX2ZpbGUiKTsKK30KKworRmlsZUNvbm5lY3Rpb25EZXRlY3Rvcjo6fkZpbGVDb25uZWN0aW9uRGV0ZWN0b3IoKSB7CisgICAgaWYgKG1Jbm90aWZ5RmQpIHsKKyAgICAgICAgcmVxdWVzdEV4aXRBbmRXYWl0KCk7CisgICAgICAgIDo6Y2xvc2UobUlub3RpZnlGZCk7CisgICAgfQorfQorCitib29sIEZpbGVDb25uZWN0aW9uRGV0ZWN0b3I6Om1hdGNoZXMoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjpyZWdleF9tYXRjaChuYW1lLCBtUmVnZXgpOworfQorCitzdGQ6OnN0cmluZyBGaWxlQ29ubmVjdGlvbkRldGVjdG9yOjpnZXRGdWxsTmFtZShjb25zdCBzdGQ6OnN0cmluZyBuYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIG1QYXRoICsgbmFtZTsKK30KKwordm9pZCBGaWxlQ29ubmVjdGlvbkRldGVjdG9yOjpwcm9jZXNzRXhpc3RpbmdGaWxlcygpIGNvbnN0IHsKKyAgICBhdXRvIGRpcnAgPSA6Om9wZW5kaXIobVBhdGguY19zdHIoKSk7CisgICAgc3RydWN0IGRpcmVudCAqZHA7CisgICAgd2hpbGUgKChkcCA9IDo6cmVhZGRpcihkaXJwKSkgIT0gTlVMTCkgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lKGRwLT5kX25hbWUpOworICAgICAgICBpZiAobWF0Y2hlcyhuYW1lKSkgeworICAgICAgICAgICAgbURhZW1vbi0+b25Db25uZWN0aW9uQ2hhbmdlKGdldEZ1bGxOYW1lKG5hbWUpLCB0cnVlIC8qY29ubmVjdGVkKi8pOworICAgICAgICB9CisgICAgfQorICAgIDo6Y2xvc2VkaXIoZGlycCk7Cit9CisKK2Jvb2wgRmlsZUNvbm5lY3Rpb25EZXRlY3Rvcjo6dGhyZWFkTG9vcCgpIHsKKyAgICBzdHJ1Y3QgeworICAgICAgICBzdHJ1Y3QgaW5vdGlmeV9ldmVudCBlOworICAgICAgICB1aW50OF90IHBhZGRpbmdbTkFNRV9NQVggKyAxXTsKKyAgICB9IGV2OworCisgICAgcHJvY2Vzc0V4aXN0aW5nRmlsZXMoKTsKKworICAgIHdoaWxlICghVGhyZWFkOjpleGl0UGVuZGluZygpKSB7CisgICAgICAgIGludCBwb2xsTnVtID0gOjpwb2xsKCZtUG9sbEZkLCAxLCAtMSk7CisgICAgICAgIGlmIChwb2xsTnVtID09IC0xKSB7CisgICAgICAgICAgIGlmIChlcnJubyA9PSBFSU5UUikKKyAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBBTE9HRSgiaW5vdGlmeSBwb2xsIGVycm9yOiAlcyIsIDo6c3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwb2xsTnVtID4gMCkgeworICAgICAgICAgICAgaWYgKCEgKG1Qb2xsRmQucmV2ZW50cyAmIFBPTExJTikpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogSW5vdGlmeSBldmVudHMgYXJlIGF2YWlsYWJsZSAqLworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAvKiBSZWFkIHNvbWUgZXZlbnRzLiAqLworICAgICAgICAgICAgICAgIHNzaXplX3QgbGVuID0gOjpyZWFkKG1Jbm90aWZ5RmQsICZldiwgc2l6ZW9mIGV2KTsKKyAgICAgICAgICAgICAgICBpZiAobGVuID09IC0xICYmIGVycm5vICE9IEVBR0FJTikgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgicmVhZCBlcnJvcjogJXMiLCA6OnN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RFeGl0KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIElmIHRoZSBub25ibG9ja2luZyByZWFkKCkgZm91bmQgbm8gZXZlbnRzIHRvIHJlYWQsIHRoZW4KKyAgICAgICAgICAgICAgICAgICBpdCByZXR1cm5zIC0xIHdpdGggZXJybm8gc2V0IHRvIEVBR0FJTi4gSW4gdGhhdCBjYXNlLAorICAgICAgICAgICAgICAgICAgIHdlIGV4aXQgdGhlIGxvb3AuICovCisgICAgICAgICAgICAgICAgaWYgKGxlbiA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChldi5lLmxlbiAmJiAhKGV2LmUubWFzayAmIElOX0lTRElSKSkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lKGV2LmUubmFtZSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJkZXZpY2UgJXMgc3RhdGUgY2hhbmdlZCIsIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXYuZS5tYXNrICYgSU5fQ1JFQVRFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURhZW1vbi0+b25Db25uZWN0aW9uQ2hhbmdlKGdldEZ1bGxOYW1lKG5hbWUpLCB0cnVlIC8qIGNvbm5lY3RlZCovKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2LmUubWFzayAmIElOX0RFTEVURSB8fCBldi5lLm1hc2sgJiBJTl9NT1ZFRF9GUk9NKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURhZW1vbi0+b25Db25uZWN0aW9uQ2hhbmdlKGdldEZ1bGxOYW1lKG5hbWUpLCBmYWxzZSAvKiBjb25uZWN0ZWQqLyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HRCgiRmlsZUNvbm5lY3Rpb25EZXRlY3Rpb24gdGhyZWFkIGV4aXRlZCIpOworICAgIHJldHVybiBmYWxzZTsKK30KK30gLy8gbmFtZXNwYWNlIFNlbnNvckhhbEV4dAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0Nvbm5lY3Rpb25EZXRlY3Rvci5oIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0Nvbm5lY3Rpb25EZXRlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMmQ4MzIKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvQ29ubmVjdGlvbkRldGVjdG9yLmgKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRU5TT1JIQUxfRVhUX0NPTk5FQ1RJT05fREVURUNUT1JfSAorI2RlZmluZSBBTkRST0lEX1NFTlNPUkhBTF9FWFRfQ09OTkVDVElPTl9ERVRFQ1RPUl9ICisKKyNpbmNsdWRlICJCYXNlRHluYW1pY1NlbnNvckRhZW1vbi5oIgorI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgorCisjaW5jbHVkZSA8cmVnZXg+CisKKyNpbmNsdWRlIDxwb2xsLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBTZW5zb3JIYWxFeHQgeworCisvLyBBYnN0cmFjdGlvbiBvZiBjb25uZWN0aW9uIGRldGVjdG9yOiBhbiBlbnRpdHkgdGhhdCBjYWxscworLy8gQmFzZUR5bmFtaWNTZW5zb3JEYWVtb246Om9uQ29ubmVjdGlvbkNoYW5nZSgpIHdoZW4gbmVjZXNzYXJ5LgorY2xhc3MgQ29ubmVjdGlvbkRldGVjdG9yIDogdmlydHVhbCBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisgICAgQ29ubmVjdGlvbkRldGVjdG9yKEJhc2VEeW5hbWljU2Vuc29yRGFlbW9uICpkKSA6IG1EYWVtb24oZCkgeyB9CisgICAgdmlydHVhbCB+Q29ubmVjdGlvbkRldGVjdG9yKCkgPSBkZWZhdWx0OworcHJvdGVjdGVkOgorICAgIEJhc2VEeW5hbWljU2Vuc29yRGFlbW9uKiBtRGFlbW9uOworfTsKKworLy8gT3BlbiBhIHNvY2tldCB0aGF0IGxpc3RlbiB0byBsb2NhbGhvc3Q6cG9ydCBhbmQgbm90aWZ5IHNlbnNvciBkYWVtb24gb2YgY29ubmVjdGlvbiBhbmQKKy8vIGRpc2Nvbm5lY3Rpb24gZXZlbnQgd2hlbiBzb2NrZXQgaXMgY29ubmVjdGVkIG9yIGRpc2Nvbm5lY3RlZCwgcmVzcGVjdGl2ZWx5LiBPbmx5IG9uZSBjb25jdXJyZW50CisvLyBjbGllbnQgaXMgYWNjZXB0ZWQuCitjbGFzcyBTb2NrZXRDb25uZWN0aW9uRGV0ZWN0b3IgOiBwdWJsaWMgQ29ubmVjdGlvbkRldGVjdG9yLCBwdWJsaWMgVGhyZWFkIHsKK3B1YmxpYzoKKyAgICBTb2NrZXRDb25uZWN0aW9uRGV0ZWN0b3IoQmFzZUR5bmFtaWNTZW5zb3JEYWVtb24gKmQsIGludCBwb3J0KTsKKyAgICB2aXJ0dWFsIH5Tb2NrZXRDb25uZWN0aW9uRGV0ZWN0b3IoKTsKK3ByaXZhdGU6CisgICAgLy8gaW1wbGVtZW50IHZpcnR1YWwgb2YgVGhyZWFkCisgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKTsKKyAgICBpbnQgd2FpdEZvckNvbm5lY3Rpb24oKTsKKyAgICBzdGF0aWMgdm9pZCB3YWl0Rm9yRGlzY29ubmVjdGlvbihpbnQgY29ubkZkKTsKKworICAgIGludCBtTGlzdGVuRmQ7CisgICAgc3RkOjpzdHJpbmcgbURldmljZTsKK307CisKKy8vIERldGVjdCBmaWxlIGNoYW5nZSB1bmRlciBwYXRoIGFuZCBub3RpZnkgc2Vuc29yIGRhZW1vbiBvZiBjb25uZWN0aW9uIGFuZCBkaXNjb25uZWN0aW9uIGV2ZW50IHdoZW4KKy8vIGZpbGUgaXMgY3JlYXRlZCBpbiBvciByZW1vdmVkIGZyb20gdGhlIGRpcmVjdG9yeSwgcmVzcGVjdGl2ZWx5LgorY2xhc3MgRmlsZUNvbm5lY3Rpb25EZXRlY3RvciA6IHB1YmxpYyBDb25uZWN0aW9uRGV0ZWN0b3IsIHB1YmxpYyBUaHJlYWQgeworcHVibGljOgorICAgIEZpbGVDb25uZWN0aW9uRGV0ZWN0b3IoCisgICAgICAgICAgICBCYXNlRHluYW1pY1NlbnNvckRhZW1vbiAqZCwgY29uc3Qgc3RkOjpzdHJpbmcgJnBhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nICZyZWdleCk7CisgICAgdmlydHVhbCB+RmlsZUNvbm5lY3Rpb25EZXRlY3RvcigpOworcHJpdmF0ZToKKyAgICAvLyBpbXBsZW1lbnQgdmlydHVhbCBvZiBUaHJlYWQKKyAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpOworCisgICAgYm9vbCBtYXRjaGVzKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSBjb25zdDsKKyAgICB2b2lkIHByb2Nlc3NFeGlzdGluZ0ZpbGVzKCkgY29uc3Q7CisgICAgc3RkOjpzdHJpbmcgZ2V0RnVsbE5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgbmFtZSkgY29uc3Q7CisKKyAgICBzdGQ6OnN0cmluZyBtUGF0aDsKKyAgICBzdGQ6OnJlZ2V4IG1SZWdleDsKKyAgICBpbnQgbUlub3RpZnlGZDsKKyAgICBzdHJ1Y3QgcG9sbGZkIG1Qb2xsRmQ7Cit9OworCit9IC8vIG5hbWVzcGFjZSBTZW5zb3JIYWxFeHQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfU0VOU09SSEFMX0VYVF9EWU5BTUlDX1NFTlNPUl9EQUVNT05fSApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0R1bW15RHluYW1pY0FjY2VsRGFlbW9uLmNwcCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9EdW1teUR5bmFtaWNBY2NlbERhZW1vbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFhNDdlOAotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9EdW1teUR5bmFtaWNBY2NlbERhZW1vbi5jcHAKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQmFzZVNlbnNvck9iamVjdC5oIgorI2luY2x1ZGUgIkNvbm5lY3Rpb25EZXRlY3Rvci5oIgorI2luY2x1ZGUgIkR1bW15RHluYW1pY0FjY2VsRGFlbW9uLmgiCisjaW5jbHVkZSAiRHluYW1pY1NlbnNvck1hbmFnZXIuaCIKKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3lzdGVtQ2xvY2suaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFsZ29yaXRobT4gICAgICAgICAgICAvL3N0ZDo6bWF4CisKKyNkZWZpbmUgU1lTUFJPUF9QUkVGSVggICAgICAgICAgICAgICAgICAiZHluYW1pY19zZW5zb3IuZHVtbXkiCisjZGVmaW5lIEZJTEVfTkFNRV9CQVNFICAgICAgICAgICAgICAgICAgImR1bW15X2FjY2VsX2ZpbGUiCisjZGVmaW5lIEZJTEVfTkFNRV9SRUdFWCAgICAgICAgICAgICAgICAgKCJeIiBGSUxFX05BTUVfQkFTRSAiWzAtOV0kIikKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFNlbnNvckhhbEV4dCB7CisKK0R1bW15RHluYW1pY0FjY2VsRGFlbW9uOjpEdW1teUR5bmFtaWNBY2NlbERhZW1vbihEeW5hbWljU2Vuc29yTWFuYWdlciYgbWFuYWdlcikKKyAgICAgICAgOiBCYXNlRHluYW1pY1NlbnNvckRhZW1vbihtYW5hZ2VyKSB7CisgICAgY2hhciBwcm9wZXJ0eVtQUk9QRVJUWV9WQUxVRV9NQVgrMV07CisKKyAgICBwcm9wZXJ0eV9nZXQoU1lTUFJPUF9QUkVGSVggIi5maWxlIiwgcHJvcGVydHksICIiKTsKKyAgICBpZiAoc3RyY21wKHByb3BlcnR5LCAiIikgIT0gMCkgeworICAgICAgICBtRmlsZURldGVjdG9yID0gbmV3IEZpbGVDb25uZWN0aW9uRGV0ZWN0b3IoCisgICAgICAgICAgICAgICAgdGhpcywgc3RkOjpzdHJpbmcocHJvcGVydHkpLCBzdGQ6OnN0cmluZyhGSUxFX05BTUVfUkVHRVgpKTsKKyAgICB9CisKKyAgICBwcm9wZXJ0eV9nZXQoU1lTUFJPUF9QUkVGSVggIi5zb2NrZXQiLCBwcm9wZXJ0eSwgIiIpOworICAgIGlmIChzdHJjbXAocHJvcGVydHksICIiKSAhPSAwKSB7CisgICAgICAgIG1Tb2NrZXREZXRlY3RvciA9IG5ldyBTb2NrZXRDb25uZWN0aW9uRGV0ZWN0b3IodGhpcywgYXRvaShwcm9wZXJ0eSkpOworICAgIH0KK30KKworQmFzZVNlbnNvclZlY3RvciBEdW1teUR5bmFtaWNBY2NlbERhZW1vbjo6Y3JlYXRlU2Vuc29yKGNvbnN0IHN0ZDo6c3RyaW5nICZkZXZpY2VLZXkpIHsKKyAgICBCYXNlU2Vuc29yVmVjdG9yIHJldDsKKyAgICBpZiAoZGV2aWNlS2V5LmNvbXBhcmUoMCwgMSwgIi8iKSA9PSAwKSB7CisgICAgICAgIC8vIGZpbGUgZGV0ZWN0b3IgcmVzdWx0LCBkZXZpY2VLZXkgaXMgZmlsZSBhYnNvbHV0ZSBwYXRoCisgICAgICAgIGNvbnN0IHNpemVfdCBsZW4gPSA6OnN0cmxlbihGSUxFX05BTUVfQkFTRSkgKyAxOyAvLyArMSBmb3IgbnVtYmVyCisgICAgICAgIGlmIChkZXZpY2VLZXkubGVuZ3RoKCkgPCBsZW4pIHsKKyAgICAgICAgICAgIEFMT0dFKCJpbGxlZ2FsIGZpbGUgZGV2aWNlIGtleSAlcyIsIGRldmljZUtleS5jX3N0cigpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpemVfdCBzdGFydCA9IGRldmljZUtleS5sZW5ndGgoKSAtIGxlbjsKKyAgICAgICAgICAgIHJldC5lbXBsYWNlX2JhY2sobmV3IER1bW15U2Vuc29yKGRldmljZUtleS5zdWJzdHIoc3RhcnQpKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGRldmljZUtleS5jb21wYXJlKDAsIDo6c3RybGVuKCJzb2NrZXQ6IiksICJzb2NrZXQ6IikgPT0gMCkgeworICAgICAgICByZXQuZW1wbGFjZV9iYWNrKG5ldyBEdW1teVNlbnNvcihkZXZpY2VLZXkpKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyB1bmtub3duIGRldmljZUtleQorICAgICAgICBBTE9HRSgidW5rbm93biBkZXZpY2VLZXk6ICVzIiwgZGV2aWNlS2V5LmNfc3RyKCkpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitEdW1teUR5bmFtaWNBY2NlbERhZW1vbjo6RHVtbXlTZW5zb3I6OkR1bW15U2Vuc29yKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKQorICAgICAgICA6IFRocmVhZChmYWxzZSAvKmNhbkNhbGxKYXZhKi8pLCBtUnVuU3RhdGUoZmFsc2UpIHsKKyAgICBtU2Vuc29yTmFtZSA9ICJEdW1teSBBY2NlbCAtICIgKyBuYW1lOworICAgIC8vIGZha2Ugc2Vuc29yIGluZm9ybWF0aW9uIGZvciBkdW1teSBzZW5zb3IKKyAgICBtU2Vuc29yID0gKHN0cnVjdCBzZW5zb3JfdCkgeworICAgICAgICBtU2Vuc29yTmFtZS5jX3N0cigpLAorICAgICAgICAiRGVtb1NlbnNlLCBJbmMuIiwKKyAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZlcnNpb24KKyAgICAgICAgLTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSwgZHVtbXkgbnVtYmVyIGhlcmUKKyAgICAgICAgU0VOU09SX1RZUEVfQUNDRUxFUk9NRVRFUiwKKyAgICAgICAgOS44ICogOC4wZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heFJhbmdlCisgICAgICAgIDkuOCAqIDguMGYgLyAzMjc2OC4wZiwgICAgICAgICAgICAgICAgICAgICAvLyByZXNvbHV0aW9uCisgICAgICAgIDAuNWYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3dlcgorICAgICAgICAoaW50MzJfdCkoMS4wRTZmIC8gNTApLCAgICAgICAgICAgICAgICAgICAgLy8gbWluRGVsYXkKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpZm9SZXNlcnZlZEV2ZW50Q291bnQKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpZm9NYXhFdmVudENvdW50CisgICAgICAgIFNFTlNPUl9TVFJJTkdfVFlQRV9BQ0NFTEVST01FVEVSLAorICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZWRQZXJtaXNzaW9uCisgICAgICAgIChsb25nKSgxLjBFNmYgLyA1MCksICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhEZWxheQorICAgICAgICBTRU5TT1JfRkxBR19DT05USU5VT1VTX01PREUsCisgICAgICAgIHsgTlVMTCwgTlVMTCB9CisgICAgfTsKKyAgICBtUnVuTG9jay5sb2NrKCk7CisgICAgcnVuKCJEdW1teVNlbnNvciIpOworfQorCitEdW1teUR5bmFtaWNBY2NlbERhZW1vbjo6RHVtbXlTZW5zb3I6On5EdW1teVNlbnNvcigpIHsKKyAgICByZXF1ZXN0RXhpdEFuZFdhaXQoKTsKKyAgICAvLyB1bmxvY2sgbVJ1bkxvY2sgc28gdGhyZWFkIGNhbiBiZSB1bmJsb2NrZWQKKyAgICBtUnVuTG9jay51bmxvY2soKTsKK30KKworY29uc3Qgc2Vuc29yX3QqIER1bW15RHluYW1pY0FjY2VsRGFlbW9uOjpEdW1teVNlbnNvcjo6Z2V0U2Vuc29yKCkgY29uc3QgeworICAgIHJldHVybiAmbVNlbnNvcjsKK30KKwordm9pZCBEdW1teUR5bmFtaWNBY2NlbERhZW1vbjo6RHVtbXlTZW5zb3I6OmdldFV1aWQodWludDhfdCogdXVpZCkgY29uc3QgeworICAgIC8vIGF0IG1heGltdW0sIHRoZXJlIHdpbGwgYmUgYWx3YXlzIG9uZSBpbnN0YW5jZSwgc28gd2UgY2FuIGhhcmRjb2RlCisgICAgc2l6ZV90IGhhc2ggPSBzdGQ6Omhhc2g8c3RkOjpzdHJpbmc+KCkobVNlbnNvck5hbWUpOworICAgIG1lbXNldCh1dWlkLCAneCcsIDE2KTsKKyAgICBtZW1jcHkodXVpZCwgJmhhc2gsIHNpemVvZihoYXNoKSk7Cit9CisKK2ludCBEdW1teUR5bmFtaWNBY2NlbERhZW1vbjo6RHVtbXlTZW5zb3I6OmVuYWJsZShib29sIGVuYWJsZSkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsayhtTG9jayk7CisgICAgaWYgKG1SdW5TdGF0ZSAhPSBlbmFibGUpIHsKKyAgICAgICAgaWYgKGVuYWJsZSkgeworICAgICAgICAgICAgbVJ1bkxvY2sudW5sb2NrKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUnVuTG9jay5sb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgbVJ1blN0YXRlID0gZW5hYmxlOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IER1bW15RHluYW1pY0FjY2VsRGFlbW9uOjpEdW1teVNlbnNvcjo6YmF0Y2goaW50NjRfdCAvKnNhbXBsZVBlcmlvZCovLCBpbnQ2NF90IC8qYmF0Y2hQZXJpb2QqLykgeworICAgIC8vIER1bW15IHNlbnNvciBkb2VzIG5vdCBzdXBwb3J0IGNoYW5naW5nIHJhdGUgYW5kIGJhdGNoaW5nLiBCdXQgcmV0dXJuIHN1Y2Nlc3NmdWwgYW55d2F5LgorICAgIHJldHVybiAwOworfQorCit2b2lkIER1bW15RHluYW1pY0FjY2VsRGFlbW9uOjpEdW1teVNlbnNvcjo6d2FpdFVudGlsTmV4dFNhbXBsZSgpIHsKKyAgICAvLyBibG9jayB3aGVuIGRpc2FibGVkIChtUnVuTG9jayBsb2NrZWQpCisgICAgbVJ1bkxvY2subG9jaygpOworICAgIG1SdW5Mb2NrLnVubG9jaygpOworCisgICAgaWYgKCFUaHJlYWQ6OmV4aXRQZW5kaW5nKCkpIHsKKyAgICAgICAgLy8gc2xlZXAgMjAgbXMgKDUwSHopCisgICAgICAgIHVzbGVlcCgyMDAwMCk7CisgICAgfQorfQorCitib29sIER1bW15RHluYW1pY0FjY2VsRGFlbW9uOjpEdW1teVNlbnNvcjo6dGhyZWFkTG9vcCgpIHsKKyAgICAvLyBkZXNpZ25hdGVkIGludGlhbGl6YXRpb24gd2lsbCBsZWF2ZSB0aGUgdW5zcGVjaWZpZWQgZmllbGRzIHplcm9lZAorICAgIHNlbnNvcnNfZXZlbnRfdCBldmVudCA9IHsKKyAgICAgICAgLnZlcnNpb24gPSBzaXplb2YoZXZlbnQpLAorICAgICAgICAuc2Vuc29yID0gLTEsCisgICAgICAgIC50eXBlID0gU0VOU09SX1RZUEVfQUNDRUxFUk9NRVRFUiwKKyAgICB9OworCisgICAgaW50NjRfdCBzdGFydFRpbWVOcyA9IGVsYXBzZWRSZWFsdGltZU5hbm8oKTsKKworICAgIEFMT0dJKCJEeW5hbWljIER1bW15IEFjY2VsIHN0YXJ0ZWQgZm9yIHNlbnNvciAlcyIsIG1TZW5zb3JOYW1lLmNfc3RyKCkpOworICAgIHdoaWxlICghVGhyZWFkOjpleGl0UGVuZGluZygpKSB7CisgICAgICAgIHdhaXRVbnRpbE5leHRTYW1wbGUoKTsKKworICAgICAgICBpZiAoVGhyZWFkOjpleGl0UGVuZGluZygpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpbnQ2NF90IG5vd1RpbWVOcyA9IGVsYXBzZWRSZWFsdGltZU5hbm8oKTsKKyAgICAgICAgZmxvYXQgdCA9IChub3dUaW1lTnMgLSBzdGFydFRpbWVOcykgLyAxZTlmOworCisgICAgICAgIGV2ZW50LmRhdGFbMF0gPSAyICogOjpzaW4oMyAqIE1fUEkgKiB0KTsKKyAgICAgICAgZXZlbnQuZGF0YVsxXSA9IDMgKiA6OmNvcygzICogTV9QSSAqIHQpOworICAgICAgICBldmVudC5kYXRhWzJdID0gMS41ICogOjpzaW4oNiAqIE1fUEkgKiB0KTsKKyAgICAgICAgZXZlbnQudGltZXN0YW1wID0gbm93VGltZU5zOworICAgICAgICBnZW5lcmF0ZUV2ZW50KGV2ZW50KTsKKyAgICB9CisKKyAgICBBTE9HSSgiRHluYW1pYyBEdW1teSBBY2NlbCB0aHJlYWQgZW5kZWQgZm9yIHNlbnNvciAlcyIsIG1TZW5zb3JOYW1lLmNfc3RyKCkpOworICAgIHJldHVybiBmYWxzZTsKK30KKworfSAvLyBuYW1lc3BhY2UgU2Vuc29ySGFsRXh0Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9EdW1teUR5bmFtaWNBY2NlbERhZW1vbi5oIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0R1bW15RHluYW1pY0FjY2VsRGFlbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVhNTczMAotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9EdW1teUR5bmFtaWNBY2NlbERhZW1vbi5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VOU09SSEFMX0VYVF9EVU1NWV9EWU5BTUlDX0FDQ0VMX0RBRU1PTl9ICisjZGVmaW5lIEFORFJPSURfU0VOU09SSEFMX0VYVF9EVU1NWV9EWU5BTUlDX0FDQ0VMX0RBRU1PTl9ICisKKyNpbmNsdWRlICJCYXNlRHluYW1pY1NlbnNvckRhZW1vbi5oIgorI2luY2x1ZGUgIkJhc2VTZW5zb3JPYmplY3QuaCIKKworI2luY2x1ZGUgPGhhcmR3YXJlL3NlbnNvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgU2Vuc29ySGFsRXh0IHsKKworY2xhc3MgQ29ubmVjdGlvbkRldGVjdG9yOworCisvKioKKyAqIFRoaXMgZGFlbW9uIHNpbXVsYXRlcyBkeW5hbWljIHNlbnNvciBjb25uZWN0aW9uIHdpdGhvdXQgdGhlIG5lZWQgb2YgYWN0dWFsbHkgY29ubmVjdCBwZXJpcGhlcmFsCisgKiB0byBBbmRyb2lkLiBJdCBpcyBmb3IgZGVidWdnaW5nIGFuZCB0ZXN0aW5nLiBJdCBjYW4gaGFuZGxlIG9uZSBjb25jdXJyZW50IGNvbm5lY3Rpb25zIGF0IG1heGltdW0uCisgKi8KK2NsYXNzIER1bW15RHluYW1pY0FjY2VsRGFlbW9uIDogcHVibGljIEJhc2VEeW5hbWljU2Vuc29yRGFlbW9uIHsKK3B1YmxpYzoKKyAgICBEdW1teUR5bmFtaWNBY2NlbERhZW1vbihEeW5hbWljU2Vuc29yTWFuYWdlciYgbWFuYWdlcik7CisgICAgdmlydHVhbCB+RHVtbXlEeW5hbWljQWNjZWxEYWVtb24oKSA9IGRlZmF1bHQ7Citwcml2YXRlOgorICAgIGNsYXNzIER1bW15U2Vuc29yIDogcHVibGljIEJhc2VTZW5zb3JPYmplY3QsIHB1YmxpYyBUaHJlYWQgeworICAgIHB1YmxpYzoKKyAgICAgICAgRHVtbXlTZW5zb3IoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpOworICAgICAgICB+RHVtbXlTZW5zb3IoKTsKKyAgICAgICAgdmlydHVhbCBjb25zdCBzZW5zb3JfdCogZ2V0U2Vuc29yKCkgY29uc3Q7CisgICAgICAgIHZpcnR1YWwgdm9pZCBnZXRVdWlkKHVpbnQ4X3QqIHV1aWQpIGNvbnN0OworICAgICAgICB2aXJ0dWFsIGludCBlbmFibGUoYm9vbCBlbmFibGUpOworICAgICAgICB2aXJ0dWFsIGludCBiYXRjaChuc2Vjc190IHNhbXBsZV9wZXJpb2QsIG5zZWNzX3QgYmF0Y2hfcGVyaW9kKTsKKyAgICBwcml2YXRlOgorICAgICAgICAvLyBpbXBsZW1lbnQgVGhyZWFkIGZ1bmN0aW9uCisgICAgICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCkgb3ZlcnJpZGU7CisKKyAgICAgICAgdm9pZCB3YWl0VW50aWxOZXh0U2FtcGxlKCk7CisKKyAgICAgICAgc2Vuc29yX3QgbVNlbnNvcjsKKyAgICAgICAgc3RkOjpzdHJpbmcgbVNlbnNvck5hbWU7CisKKyAgICAgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICAgICAgc3RkOjptdXRleCBtUnVuTG9jazsKKyAgICAgICAgYm9vbCBtUnVuU3RhdGU7CisgICAgfTsKKyAgICAvLyBpbXBsZW1lbnQgQmFzZUR5bmFtaWNTZW5zb3JEYWVtb24gZnVuY3Rpb24KKyAgICB2aXJ0dWFsIEJhc2VTZW5zb3JWZWN0b3IgY3JlYXRlU2Vuc29yKGNvbnN0IHN0ZDo6c3RyaW5nICZkZXZpY2VLZXkpIG92ZXJyaWRlOworCisgICAgc3A8Q29ubmVjdGlvbkRldGVjdG9yPiBtRmlsZURldGVjdG9yOworICAgIHNwPENvbm5lY3Rpb25EZXRlY3Rvcj4gbVNvY2tldERldGVjdG9yOworfTsKK30gLy8gbmFtZXNwYWNlIFNlbnNvckhhbEV4dAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9TRU5TT1JIQUxfRVhUX0RZTkFNSUNfU0VOU09SX0RBRU1PTl9ICisKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9EeW5hbWljU2Vuc29yTWFuYWdlci5jcHAgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvRHluYW1pY1NlbnNvck1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MzQwNTIKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvRHluYW1pY1NlbnNvck1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsMjg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkJhc2VEeW5hbWljU2Vuc29yRGFlbW9uLmgiCisjaW5jbHVkZSAiQmFzZVNlbnNvck9iamVjdC5oIgorI2luY2x1ZGUgIkR1bW15RHluYW1pY0FjY2VsRGFlbW9uLmgiCisjaW5jbHVkZSAiSGlkUmF3U2Vuc29yRGFlbW9uLmgiCisjaW5jbHVkZSAiRHluYW1pY1NlbnNvck1hbmFnZXIuaCIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N5c3RlbUNsb2NrLmg+CisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgU2Vuc29ySGFsRXh0IHsKKworRHluYW1pY1NlbnNvck1hbmFnZXIqIER5bmFtaWNTZW5zb3JNYW5hZ2VyOjpjcmVhdGVJbnN0YW5jZSgKKyAgICAgICAgaW50IGhhbmRsZUJhc2UsIGludCBoYW5kbGVDb3VudCwgU2Vuc29yRXZlbnRDYWxsYmFjayAqY2FsbGJhY2spIHsKKyAgICBhdXRvIG0gPSBuZXcgRHluYW1pY1NlbnNvck1hbmFnZXIoaGFuZGxlQmFzZSwgaGFuZGxlQmFzZSArIGhhbmRsZUNvdW50IC0gMSwgY2FsbGJhY2spOworICAgIG0tPm1EYWVtb25WZWN0b3IucHVzaF9iYWNrKG5ldyBEdW1teUR5bmFtaWNBY2NlbERhZW1vbigqbSkpOworICAgIG0tPm1EYWVtb25WZWN0b3IucHVzaF9iYWNrKG5ldyBIaWRSYXdTZW5zb3JEYWVtb24oKm0pKTsKKyAgICByZXR1cm4gbTsKK30KKworRHluYW1pY1NlbnNvck1hbmFnZXI6OkR5bmFtaWNTZW5zb3JNYW5hZ2VyKAorICAgICAgICBpbnQgaGFuZGxlQmFzZSwgaW50IGhhbmRsZU1heCwgU2Vuc29yRXZlbnRDYWxsYmFjayogY2FsbGJhY2spIDoKKyAgICAgICAgbUhhbmRsZVJhbmdlKGhhbmRsZUJhc2UsIGhhbmRsZU1heCksCisgICAgICAgIG1DYWxsYmFjayhjYWxsYmFjayksCisgICAgICAgIG1GaWZvKGNhbGxiYWNrID8gMCA6IGtGaWZvU2l6ZSksCisgICAgICAgIG1OZXh0SGFuZGxlKGhhbmRsZUJhc2UrMSkgeworICAgIGFzc2VydChoYW5kbGVCYXNlID4gMCAmJiBoYW5kbGVNYXggPiBoYW5kbGVCYXNlICsgMSk7IC8vIGhhbmRsZUJhc2UgaXMgcmVzZXJ2ZWQKKworICAgIG1NZXRhU2Vuc29yID0gKGNvbnN0IHNlbnNvcl90KSB7CisgICAgICAgICJEeW5hbWljIFNlbnNvciBNYW5hZ2VyIiwKKyAgICAgICAgIkdvb2dsZSIsCisgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmVyc2lvbgorICAgICAgICBoYW5kbGVCYXNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZQorICAgICAgICBTRU5TT1JfVFlQRV9EWU5BTUlDX1NFTlNPUl9NRVRBLAorICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heFJhbmdlCisgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzb2x1dGlvbgorICAgICAgICAxZS02ZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvd2VyLCB2ZXJ5IHNtYWxsIG51bWJlciBpbnN0ZWFkIG9mIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBhdm9pZCBzaWd1bGFyaXR5IGluIGFwcAorICAgICAgICAoaW50MzJfdCkoMTAwMCksICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1pbkRlbGF5CisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlmb1Jlc2VydmVkRXZlbnRDb3VudAorICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpZm9NYXhFdmVudENvdW50CisgICAgICAgIFNFTlNPUl9TVFJJTkdfVFlQRV9EWU5BTUlDX1NFTlNPUl9NRVRBLAorICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmVkUGVybWlzc2lvbgorICAgICAgICAobG9uZykoMTAwMCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heERlbGF5CisgICAgICAgIFNFTlNPUl9GTEFHX1NQRUNJQUxfUkVQT1JUSU5HX01PREUgfCBTRU5TT1JfRkxBR19XQUtFX1VQLAorICAgICAgICB7IE5VTEwsIE5VTEwgfQorICAgIH07Cit9CisKK0R5bmFtaWNTZW5zb3JNYW5hZ2VyOjp+RHluYW1pY1NlbnNvck1hbmFnZXIoKSB7CisgICAgLy8gZnJlZSBhbGwgZGFlbW9ucyBmaXJzdAorICAgIG1EYWVtb25WZWN0b3IuY2xlYXIoKTsKK30KKworYm9vbCBEeW5hbWljU2Vuc29yTWFuYWdlcjo6b3ducyhpbnQgaGFuZGxlKSBjb25zdCB7CisgICAgcmV0dXJuIGhhbmRsZSA+PSBtSGFuZGxlUmFuZ2UuZmlyc3QgJiYgaGFuZGxlIDwgbUhhbmRsZVJhbmdlLnNlY29uZDsKK30KKworaW50IER5bmFtaWNTZW5zb3JNYW5hZ2VyOjphY3RpdmF0ZShpbnQgaGFuZGxlLCBib29sIGVuYWJsZSkgeworICAgIGlmIChoYW5kbGUgPT0gbUhhbmRsZVJhbmdlLmZpcnN0KSB7CisgICAgICAgIC8vIGlnbm9yZWQKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gaW4gY2FzZSB0aGVyZSBpcyBhIHBlbmRpbmcgcmVwb3J0LCBub3cgaXQgaXMgdGltZSB0byByZW1vdmUgaXQgYXMgaXQgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeS4KKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsayhtTG9jayk7CisgICAgICAgIG1QZW5kaW5nUmVwb3J0LmVyYXNlKGhhbmRsZSk7CisgICAgfQorCisgICAgcmV0dXJuIG9wZXJhdGVTZW5zb3IoaGFuZGxlLAorICAgICAgICAgICAgWyZlbmFibGVdIChzcDxCYXNlU2Vuc29yT2JqZWN0PiBzKS0+aW50IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcy0+ZW5hYmxlKGVuYWJsZSk7CisgICAgICAgICAgICB9KTsKK30KKworaW50IER5bmFtaWNTZW5zb3JNYW5hZ2VyOjpiYXRjaChpbnQgaGFuZGxlLCBuc2Vjc190IHNhbXBsZV9wZXJpb2QsIG5zZWNzX3QgYmF0Y2hfcGVyaW9kKSB7CisgICAgaWYgKGhhbmRsZSA9PSBtSGFuZGxlUmFuZ2UuZmlyc3QpIHsKKyAgICAgICAgLy8gaWdub3JlZAorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIG9wZXJhdGVTZW5zb3IoaGFuZGxlLAorICAgICAgICAgICAgWyZzYW1wbGVfcGVyaW9kLCAmYmF0Y2hfcGVyaW9kXSAoc3A8QmFzZVNlbnNvck9iamVjdD4gcyktPmludCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHMtPmJhdGNoKHNhbXBsZV9wZXJpb2QsIGJhdGNoX3BlcmlvZCk7CisgICAgICAgICAgICB9KTsKK30KKworaW50IER5bmFtaWNTZW5zb3JNYW5hZ2VyOjpzZXREZWxheShpbnQgaGFuZGxlLCBuc2Vjc190IHNhbXBsZV9wZXJpb2QpIHsKKyAgICByZXR1cm4gYmF0Y2goaGFuZGxlLCBzYW1wbGVfcGVyaW9kLCAwKTsKK30KKworaW50IER5bmFtaWNTZW5zb3JNYW5hZ2VyOjpmbHVzaChpbnQgaGFuZGxlKSB7CisgICAgaWYgKGhhbmRsZSA9PSBtSGFuZGxlUmFuZ2UuZmlyc3QpIHsKKyAgICAgICAgLy8gc3VibWl0IGEgZmx1c2ggY29tcGxldGUgaGVyZQorICAgICAgICBzdGF0aWMgY29uc3Qgc2Vuc29yc19ldmVudF90IGV2ZW50ID0geworICAgICAgICAgICAgLnR5cGUgPSBTRU5TT1JfVFlQRV9NRVRBX0RBVEEsCisgICAgICAgICAgICAuc2Vuc29yID0gbUhhbmRsZVJhbmdlLmZpcnN0LAorICAgICAgICAgICAgLnRpbWVzdGFtcCA9IFRJTUVTVEFNUF9BVVRPX0ZJTEwsICAvLyB0aW1lc3RhbXAgd2lsbCBiZSBmaWxsZWQgYXQgZGlzcGF0Y2hlcgorICAgICAgICB9OworICAgICAgICBzdWJtaXRFdmVudChudWxscHRyLCBldmVudCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gb3BlcmF0ZVNlbnNvcihoYW5kbGUsIFtdIChzcDxCYXNlU2Vuc29yT2JqZWN0PiBzKS0+aW50IHtyZXR1cm4gcy0+Zmx1c2goKTt9KTsKK30KKworaW50IER5bmFtaWNTZW5zb3JNYW5hZ2VyOjpwb2xsKHNlbnNvcnNfZXZlbnRfdCAqIGRhdGEsIGludCBjb3VudCkgeworICAgIGFzc2VydChtQ2FsbGJhY2sgPT0gbnVsbHB0cik7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxrKG1GaWZvTG9jayk7CisgICAgcmV0dXJuIG1GaWZvLnJlYWQoZGF0YSwgY291bnQpOworfQorCitib29sIER5bmFtaWNTZW5zb3JNYW5hZ2VyOjpyZWdpc3RlclNlbnNvcihzcDxCYXNlU2Vuc29yT2JqZWN0PiBzZW5zb3IpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbGsobUxvY2spOworICAgIGlmIChtUmV2ZXJzZU1hcC5maW5kKHNlbnNvci5nZXQoKSkgIT0gbVJldmVyc2VNYXAuZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoInRyeWluZyB0byBhZGQgdGhlIHNhbWUgc2Vuc29yIHR3aWNlLCBpZ25vcmUiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpbnQgaGFuZGxlID0gZ2V0TmV4dEF2YWlsYWJsZUhhbmRsZSgpOworICAgIGlmIChoYW5kbGUgPCAwKSB7CisgICAgICAgIEFMT0dFKCJSdW5uaW5nIG91dCBvZiBoYW5kbGUsIHF1aXQuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyB0aGVzZSBlbXBsYWNlIHdpbGwgYWx3YXlzIGJlIHN1Y2Nlc3NmdWwKKyAgICBtTWFwLmVtcGxhY2UoaGFuZGxlLCBzZW5zb3IpOworICAgIG1SZXZlcnNlTWFwLmVtcGxhY2Uoc2Vuc29yLmdldCgpLCBoYW5kbGUpOworICAgIHNlbnNvci0+c2V0RXZlbnRDYWxsYmFjayh0aGlzKTsKKworICAgIGF1dG8gZW50cnkgPSBtUGVuZGluZ1JlcG9ydC5lbXBsYWNlKAorICAgICAgICAgICAgc3RkOjpwaWVjZXdpc2VfY29uc3RydWN0LAorICAgICAgICAgICAgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKGhhbmRsZSksCisgICAgICAgICAgICBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoaGFuZGxlLCBzZW5zb3IpKTsKKyAgICBpZiAoZW50cnkuc2Vjb25kKSB7CisgICAgICAgIHN1Ym1pdEV2ZW50KG51bGxwdHIsIGVudHJ5LmZpcnN0LT5zZWNvbmQuZ2VuZXJhdGVDb25uZWN0aW9uRXZlbnQobUhhbmRsZVJhbmdlLmZpcnN0KSk7CisgICAgfQorICAgIHJldHVybiBlbnRyeS5zZWNvbmQ7Cit9CisKK3ZvaWQgRHluYW1pY1NlbnNvck1hbmFnZXI6OnVucmVnaXN0ZXJTZW5zb3Ioc3A8QmFzZVNlbnNvck9iamVjdD4gc2Vuc29yKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxrKG1Mb2NrKTsKKyAgICBhdXRvIGkgPSBtUmV2ZXJzZU1hcC5maW5kKHNlbnNvci5nZXQoKSk7CisgICAgaWYgKGkgPT0gbVJldmVyc2VNYXAuZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoImNhbm5vdCByZW1vdmUgYSBub24tZXhpc3Qgc2Vuc29yIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50IGhhbmRsZSA9IGktPnNlY29uZDsKKyAgICBtUmV2ZXJzZU1hcC5lcmFzZShpKTsKKyAgICBtTWFwLmVyYXNlKGhhbmRsZSk7CisKKyAgICAvLyB3aWxsIG5vdCBjbGVhbiB1cCBtUGVuZGluZ1JlcG9ydCBoZXJlLCBpdCB3aWxsIGJlIGNsZWFuZWQgdXAgd2hlbiBhdCBmaXJzdCBhY3RpdmF0ZSBjYWxsLgorICAgIC8vIHNlbnNvcnNlcnZpY2UgaXMgZ3VyYW50ZWVkIHRvIGNhbGwgYWN0aXZhdGUgdXBvbiBhcnJpdmFsIG9mIGR5bmFtaWMgc2Vuc29yIG1ldGEgY29ubmVjdGlvbgorICAgIC8vIGV2ZW50LgorCisgICAgLy8gc2VuZCBkaXNjb25uZWN0aW9uIGV2ZW50CisgICAgc2Vuc29yc19ldmVudF90IGV2ZW50OworICAgIENvbm5lY3Rpb25SZXBvcnQ6OmZpbGxEaXNjb25uZWN0aW9uRXZlbnQoJmV2ZW50LCBtSGFuZGxlUmFuZ2UuZmlyc3QsIGhhbmRsZSk7CisgICAgc3VibWl0RXZlbnQobnVsbHB0ciwgZXZlbnQpOworfQorCitpbnQgRHluYW1pY1NlbnNvck1hbmFnZXI6OnN1Ym1pdEV2ZW50KHNwPEJhc2VTZW5zb3JPYmplY3Q+IHNvdXJjZSwgY29uc3Qgc2Vuc29yc19ldmVudF90ICZlKSB7CisgICAgaW50IGhhbmRsZTsKKyAgICBpZiAoc291cmNlID09IG51bGxwdHIpIHsKKyAgICAgICAgaGFuZGxlID0gbUhhbmRsZVJhbmdlLmZpcnN0OworICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsayhtTG9jayk7CisgICAgICAgIGF1dG8gaSA9IG1SZXZlcnNlTWFwLmZpbmQoc291cmNlLmdldCgpKTsKKyAgICAgICAgaWYgKGkgPT0gbVJldmVyc2VNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJjYW5ub3Qgc3VibWl0IGV2ZW50IGZvciBzZW5zb3IgdGhhdCBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZCIpOworICAgICAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGhhbmRsZSA9IGktPnNlY29uZDsKKyAgICB9CisKKyAgICAvLyBtYWtpbmcgYSBjb3B5IG9mIGV2ZW50cywgcHJlcGFyZSBmb3IgZWRpdGluZworICAgIHNlbnNvcnNfZXZlbnRfdCBldmVudCA9IGU7CisgICAgZXZlbnQudmVyc2lvbiA9IHNpemVvZihldmVudCk7CisKKyAgICAvLyBzcGVjaWFsIGNhc2Ugb2YgZmx1c2ggY29tcGxldGUKKyAgICBpZiAoZXZlbnQudHlwZSA9PSBTRU5TT1JfVFlQRV9NRVRBX0RBVEEpIHsKKyAgICAgICAgZXZlbnQuc2Vuc29yID0gMDsKKyAgICAgICAgZXZlbnQubWV0YV9kYXRhLnNlbnNvciA9IGhhbmRsZTsKKyAgICB9IGVsc2UgeworICAgICAgICBldmVudC5zZW5zb3IgPSBoYW5kbGU7CisgICAgfQorCisgICAgLy8gc2V0IHRpbWVzdGFtcCBpZiBpdCBpcyBkZWZhdWx0IHZhbHVlCisgICAgaWYgKGV2ZW50LnRpbWVzdGFtcCA9PSBUSU1FU1RBTVBfQVVUT19GSUxMKSB7CisgICAgICAgIGV2ZW50LnRpbWVzdGFtcCA9IGVsYXBzZWRSZWFsdGltZU5hbm8oKTsKKyAgICB9CisKKyAgICBpZiAobUNhbGxiYWNrKSB7CisgICAgICAgIC8vIGV4dGVudGlvbiBtb2RlLCBjYWxsaW5nIGNhbGxiYWNrIGRpcmVjdGx5CisgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgcmV0ID0gbUNhbGxiYWNrLT5zdWJtaXRFdmVudChudWxscHRyLCBldmVudCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiRHluYW1pY1NlbnNvck1hbmFnZXIgY2FsbGJhY2sgZmFpbGVkLCByZXQ6ICVkIiwgcmV0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHN0YW5kYWxvbmUgbW9kZSwgYWRkIGV2ZW50IHRvIGludGVybmFsIGJ1ZmZlciBmb3IgcG9sbCgpIHRvIHBpY2sgdXAKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxrKG1GaWZvTG9jayk7CisgICAgICAgIGlmIChtRmlmby53cml0ZSgmZXZlbnQsIDEpIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIkR5bmFtaWNTZW5zb3JNYW5hZ2VyIGZpZm8gZnVsbCIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgRHluYW1pY1NlbnNvck1hbmFnZXI6OmdldE5leHRBdmFpbGFibGVIYW5kbGUoKSB7CisgICAgaWYgKG1OZXh0SGFuZGxlID09IG1IYW5kbGVSYW5nZS5zZWNvbmQpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gbU5leHRIYW5kbGUrKzsKK30KKworY29uc3Qgc2Vuc29yX3QmIER5bmFtaWNTZW5zb3JNYW5hZ2VyOjpnZXREeW5hbWljTWV0YVNlbnNvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbU1ldGFTZW5zb3I7Cit9CisKK0R5bmFtaWNTZW5zb3JNYW5hZ2VyOjpDb25uZWN0aW9uUmVwb3J0OjpDb25uZWN0aW9uUmVwb3J0KAorICAgICAgICBpbnQgaGFuZGxlLCBzcDxCYXNlU2Vuc29yT2JqZWN0PiBzZW5zb3IpIDoKKyAgICAgICAgbVNlbnNvcigqKHNlbnNvci0+Z2V0U2Vuc29yKCkpKSwKKyAgICAgICAgbU5hbWUobVNlbnNvci5uYW1lKSwKKyAgICAgICAgbVZlbmRvcihtU2Vuc29yLnZlbmRvciksCisgICAgICAgIG1QZXJtaXNzaW9uKG1TZW5zb3IucmVxdWlyZWRQZXJtaXNzaW9uKSwKKyAgICAgICAgbVN0cmluZ1R5cGUobVNlbnNvci5zdHJpbmdUeXBlKSwKKyAgICAgICAgbUdlbmVyYXRlZChmYWxzZSkgeworICAgIG1TZW5zb3IubmFtZSA9IG1OYW1lLmNfc3RyKCk7CisgICAgbVNlbnNvci52ZW5kb3IgPSBtVmVuZG9yLmNfc3RyKCk7CisgICAgbVNlbnNvci5yZXF1aXJlZFBlcm1pc3Npb24gPSBtUGVybWlzc2lvbi5jX3N0cigpOworICAgIG1TZW5zb3Iuc3RyaW5nVHlwZSA9IG1TdHJpbmdUeXBlLmNfc3RyKCk7CisgICAgbVNlbnNvci5oYW5kbGUgPSBoYW5kbGU7CisgICAgbWVtc2V0KCZtRXZlbnQsIDAsIHNpemVvZihtRXZlbnQpKTsKKyAgICBtRXZlbnQudmVyc2lvbiA9IHNpemVvZihtRXZlbnQpOworICAgIHNlbnNvci0+Z2V0VXVpZChtVXVpZCk7CisgICAgQUxPR1YoIkNvbm5lY3Rpb24gcmVwb3J0IGluaXQ6IG5hbWUgPSAlcywgaGFuZGxlID0gJWQiLCBtU2Vuc29yLm5hbWUsIG1TZW5zb3IuaGFuZGxlKTsKK30KKworRHluYW1pY1NlbnNvck1hbmFnZXI6OkNvbm5lY3Rpb25SZXBvcnQ6On5Db25uZWN0aW9uUmVwb3J0KCkgeworICAgIEFMT0dWKCJDb25uZWN0aW9uIHJlcG9ydCBkdG9yOiBuYW1lID0gJXMsIGhhbmRsZSA9ICVkIiwgbVNlbnNvci5uYW1lLCBtU2Vuc29yLmhhbmRsZSk7Cit9CisKK2NvbnN0IHNlbnNvcnNfZXZlbnRfdCYgRHluYW1pY1NlbnNvck1hbmFnZXI6OkNvbm5lY3Rpb25SZXBvcnQ6OgorICAgICAgICBnZW5lcmF0ZUNvbm5lY3Rpb25FdmVudChpbnQgbWV0YUhhbmRsZSkgeworICAgIGlmICghbUdlbmVyYXRlZCkgeworICAgICAgICBtRXZlbnQuc2Vuc29yID0gbWV0YUhhbmRsZTsKKyAgICAgICAgbUV2ZW50LnR5cGUgPSBTRU5TT1JfVFlQRV9EWU5BTUlDX1NFTlNPUl9NRVRBOworICAgICAgICBtRXZlbnQudGltZXN0YW1wID0gZWxhcHNlZFJlYWx0aW1lTmFubygpOworICAgICAgICBtRXZlbnQuZHluYW1pY19zZW5zb3JfbWV0YSA9CisgICAgICAgICAgICAgICAgKGR5bmFtaWNfc2Vuc29yX21ldGFfZXZlbnRfdCkge3RydWUsIG1TZW5zb3IuaGFuZGxlLCAmbVNlbnNvciwgezB9fTsKKyAgICAgICAgbWVtY3B5KCZtRXZlbnQuZHluYW1pY19zZW5zb3JfbWV0YS51dWlkLCAmbVV1aWQsIHNpemVvZihtRXZlbnQuZHluYW1pY19zZW5zb3JfbWV0YS51dWlkKSk7CisgICAgICAgIG1HZW5lcmF0ZWQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gbUV2ZW50OworfQorCit2b2lkIER5bmFtaWNTZW5zb3JNYW5hZ2VyOjpDb25uZWN0aW9uUmVwb3J0OjoKKyAgICAgICAgZmlsbERpc2Nvbm5lY3Rpb25FdmVudChzZW5zb3JzX2V2ZW50X3QqIGV2ZW50LCBpbnQgbWV0YUhhbmRsZSwgaW50IGhhbmRsZSkgeworICAgIG1lbXNldChldmVudCwgMCwgc2l6ZW9mKHNlbnNvcnNfZXZlbnRfdCkpOworICAgIGV2ZW50LT52ZXJzaW9uID0gc2l6ZW9mKHNlbnNvcnNfZXZlbnRfdCk7CisgICAgZXZlbnQtPnNlbnNvciA9IG1ldGFIYW5kbGU7CisgICAgZXZlbnQtPnR5cGUgPSBTRU5TT1JfVFlQRV9EWU5BTUlDX1NFTlNPUl9NRVRBOworICAgIGV2ZW50LT50aW1lc3RhbXAgPSBlbGFwc2VkUmVhbHRpbWVOYW5vKCk7CisgICAgZXZlbnQtPmR5bmFtaWNfc2Vuc29yX21ldGEuY29ubmVjdGVkID0gZmFsc2U7CisgICAgZXZlbnQtPmR5bmFtaWNfc2Vuc29yX21ldGEuaGFuZGxlID0gaGFuZGxlOworfQorCit9IC8vIG5hbWVzcGFjZSBTZW5zb3JIYWxFeHQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9EeW5hbWljU2Vuc29yTWFuYWdlci5oIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0R5bmFtaWNTZW5zb3JNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZmMzlkYQotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9EeW5hbWljU2Vuc29yTWFuYWdlci5oCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFTlNPUkhBTF9FWFRfRFlOQU1JQ19TRU5TT1JfTUFOQUdFUl9ICisjZGVmaW5lIEFORFJPSURfU0VOU09SSEFMX0VYVF9EWU5BTUlDX1NFTlNPUl9NQU5BR0VSX0gKKworI2luY2x1ZGUgIlNlbnNvckV2ZW50Q2FsbGJhY2suaCIKKyNpbmNsdWRlICJSaW5nQnVmZmVyLmgiCisjaW5jbHVkZSA8aGFyZHdhcmUvc2Vuc29ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFNlbnNvckhhbEV4dCB7CisKK2NsYXNzIEJhc2VEeW5hbWljU2Vuc29yRGFlbW9uOworCitjbGFzcyBEeW5hbWljU2Vuc29yTWFuYWdlciA6IHB1YmxpYyBTZW5zb3JFdmVudENhbGxiYWNrIHsKK3B1YmxpYzoKKyAgICAvLyBoYW5kbGVCYXNlIGlzIHJlc2VydmVkIGZvciB0aGUgZHluYW1pYyBzZW5zb3IgbWV0YSBzZW5zb3IuCisgICAgLy8gaGFuZGxlTWF4IG11c3QgYmUgZ3JlYXRlciB0aGFuIGhhbmRsZUJhc2UgKyAxLgorICAgIC8vIFRoaXMgY2xhc3MgaGFzIHR3byBvcGVyYXRpb24gbW9kZSBkZXBlbmRpbmcgb24gY2FsbGJhY2s6IDEpIGV4dGVuc2lvbiwgMikgc3RhbmQtYWxvbmUuCisgICAgLy8gSW4gZXh0ZW5zaW9uIG1vZGUsIGNhbGxiYWNrIG11c3Qgbm90IGJlIG51bGxwdHIuIFNlbnNvciBldmVudCBnZW5lcmF0ZWQgd2lsbCBiZSBzdWJtaXR0ZWQgdG8KKyAgICAvLyBidWZmZXIgb2YgcHJpbWFyeSBzZW5zb3IgSEFMIGltcGxlbWVudGF0aW9uLiBJbiBzdGFuZC1hbG9uZSBtb2RlLCBjYWxsYmFjayBtdXN0IGJlIG51bGxwdHIuCisgICAgLy8gR2VuZXJhdGVkIHNlbnNvciBldmVudHMgd2lsbCBiZSBhZGRlZCBpbnRvIGludGVybmFsIGJ1ZmZlciB3YWl0aW5nIGZvciBwb2xsKCkgZnVuY3Rpb24gdG8KKyAgICAvLyBwaWNrIHVwLgorICAgIC8vCisgICAgc3RhdGljIER5bmFtaWNTZW5zb3JNYW5hZ2VyKiBjcmVhdGVJbnN0YW5jZSgKKyAgICAgICAgICAgIGludCBoYW5kbGVCYXNlLCBpbnQgaGFuZGxlQ291bnQsIFNlbnNvckV2ZW50Q2FsbGJhY2sgKmNhbGxiYWNrKTsKKyAgICB2aXJ0dWFsIH5EeW5hbWljU2Vuc29yTWFuYWdlcigpOworCisgICAgLy8gY2FsbHMgdG8gYWRkIG9yIHJlbW92ZSBzZW5zb3IsIGNhbGxlZCBmcm9tIHNlbnNvciBkYWVtb24KKyAgICBib29sIHJlZ2lzdGVyU2Vuc29yKHNwPEJhc2VTZW5zb3JPYmplY3Q+IHNlbnNvcik7CisgICAgdm9pZCB1bnJlZ2lzdGVyU2Vuc29yKHNwPEJhc2VTZW5zb3JPYmplY3Q+IHNlbnNvcik7CisKKyAgICAvLyBEZXRlcm1pbmUgaWYgYSBzZW5zb3IgaGFuZGxlIGlzIGluIHRoZSByYW5nZSBkZWZpbmVkIGluIGNvbnN0cnVjdG9yLgorICAgIC8vIEl0IGRvZXMgbm90IHRlc3QgaWYgc2Vuc29yIGhhbmRsZSBpcyB2YWxpZC4KKyAgICBib29sIG93bnMoaW50IGhhbmRsZSkgY29uc3Q7CisKKyAgICAvLyBoYW5kbGVzIHNlbnNvciBoYWwgcmVxdWVzdHMuCisgICAgaW50IGFjdGl2YXRlKGludCBoYW5kbGUsIGJvb2wgZW5hYmxlKTsKKyAgICBpbnQgYmF0Y2goaW50IGhhbmRsZSwgbnNlY3NfdCBzYW1wbGVfcGVyaW9kLCBuc2Vjc190IGJhdGNoX3BlcmlvZCk7CisgICAgaW50IHNldERlbGF5KGludCBoYW5kbGUsIG5zZWNzX3Qgc2FtcGxlX3BlcmlvZCk7CisgICAgaW50IGZsdXNoKGludCBoYW5kbGUpOworICAgIGludCBwb2xsKHNlbnNvcnNfZXZlbnRfdCAqIGRhdGEsIGludCBjb3VudCk7CisKKyAgICAvLyBTZW5zb3JFdmVudENhbGxiYWNrCisgICAgdmlydHVhbCBpbnQgc3VibWl0RXZlbnQoc3A8QmFzZVNlbnNvck9iamVjdD4sIGNvbnN0IHNlbnNvcnNfZXZlbnRfdCAmZSkgb3ZlcnJpZGU7CisKKyAgICAvLyBnZXQgbWV0YSBzZW5zb3Igc3RydWN0CisgICAgY29uc3Qgc2Vuc29yX3QmIGdldER5bmFtaWNNZXRhU2Vuc29yKCkgY29uc3Q7Citwcm90ZWN0ZWQ6CisgICAgRHluYW1pY1NlbnNvck1hbmFnZXIoaW50IGhhbmRsZUJhc2UsIGludCBoYW5kbGVNYXgsIFNlbnNvckV2ZW50Q2FsbGJhY2sqIGNhbGxiYWNrKTsKK3ByaXZhdGU6CisgICAgLy8gYSBoZWxwZXIgY2xhc3MgdXNlZCBmb3IgZ2VuZXJhdGUgY29ubmVjdGlvbiBhbmQgZGlzY29ubmVjdGlvbiByZXBvcnQKKyAgICBjbGFzcyBDb25uZWN0aW9uUmVwb3J0IHsKKyAgICBwdWJsaWM6CisgICAgICAgIENvbm5lY3Rpb25SZXBvcnQoKSB7fQorICAgICAgICBDb25uZWN0aW9uUmVwb3J0KGludCBoYW5kbGUsIHNwPEJhc2VTZW5zb3JPYmplY3Q+IHNlbnNvcik7CisgICAgICAgIH5Db25uZWN0aW9uUmVwb3J0KCk7CisgICAgICAgIGNvbnN0IHNlbnNvcnNfZXZlbnRfdCYgZ2VuZXJhdGVDb25uZWN0aW9uRXZlbnQoaW50IG1ldGFIYW5kbGUpOworICAgICAgICBzdGF0aWMgdm9pZCBmaWxsRGlzY29ubmVjdGlvbkV2ZW50KHNlbnNvcnNfZXZlbnRfdCogZXZlbnQsIGludCBtZXRhSGFuZGxlLCBpbnQgaGFuZGxlKTsKKyAgICBwcml2YXRlOgorICAgICAgICBzZW5zb3JfdCBtU2Vuc29yOworICAgICAgICBzdGQ6OnN0cmluZyBtTmFtZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgbVZlbmRvcjsKKyAgICAgICAgc3RkOjpzdHJpbmcgbVBlcm1pc3Npb247CisgICAgICAgIHN0ZDo6c3RyaW5nIG1TdHJpbmdUeXBlOworICAgICAgICBzZW5zb3JzX2V2ZW50X3QgbUV2ZW50OworICAgICAgICB1aW50OF90IG1VdWlkWzE2XTsKKyAgICAgICAgYm9vbCBtR2VuZXJhdGVkOworICAgICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDb25uZWN0aW9uUmVwb3J0KTsKKyAgICB9OworCisgICAgLy8gcmV0dXJucyBuZXh0IGF2YWlsYWJsZSBoYW5kbGUgdG8gdXNlIHVwb24gYSBuZXcgc2Vuc29yIGNvbm5lY3Rpb24sIG9yIC0xIGlmIHdlIHJ1biBvdXQuCisgICAgaW50IGdldE5leHRBdmFpbGFibGVIYW5kbGUoKTsKKworICAgIC8vIFRGOiAgaW50IGZvbyhzcDxCYXNlU2Vuc29yT2JqZWN0PiBvYmopOworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBURj4KKyAgICBpbnQgb3BlcmF0ZVNlbnNvcihpbnQgaGFuZGxlLCBURiBmKSBjb25zdCB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsayhtTG9jayk7CisgICAgICAgIGNvbnN0IGF1dG8gaSA9IG1NYXAuZmluZChoYW5kbGUpOworICAgICAgICBpZiAoaSA9PSBtTWFwLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHNwPEJhc2VTZW5zb3JPYmplY3Q+IHMgPSBpLT5zZWNvbmQucHJvbW90ZSgpOworICAgICAgICBpZiAocyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBzZW5zb3Igb2JqZWN0IGlzIGFscmVhZHkgZ29uZQorICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZihzKTsKKyAgICB9CisKKyAgICAvLyBhdmFpbGFibGUgc2Vuc29yIGhhbmRsZSBzcGFjZQorICAgIGNvbnN0IHN0ZDo6cGFpcjxpbnQsIGludD4gbUhhbmRsZVJhbmdlOworICAgIHNlbnNvcl90IG1NZXRhU2Vuc29yOworCisgICAgLy8gaW1tdXRhYmxlIHBvaW50ZXIgdG8gZXZlbnQgY2FsbGJhY2ssIHVzZWQgaW4gZXh0ZW50aW9uIG1vZGUuCisgICAgU2Vuc29yRXZlbnRDYWxsYmFjayAqIGNvbnN0IG1DYWxsYmFjazsKKworICAgIC8vIFJpbmdCdWZmZXIgdXNlZCBpbiBzdGFuZGFsb25lIG1vZGUKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrRmlmb1NpemUgPSA0MDk2OyAvLzRLIGV2ZW50cworICAgIG11dGFibGUgc3RkOjptdXRleCBtRmlmb0xvY2s7CisgICAgUmluZ0J1ZmZlciBtRmlmbzsKKworICAgIC8vIG1hcHBpbmcgYmV0d2VlbiBoYW5kbGUgYW5kIFNlbnNvck9iamVjdHMKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgaW50IG1OZXh0SGFuZGxlOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIHdwPEJhc2VTZW5zb3JPYmplY3Q+PiBtTWFwOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx2b2lkICosIGludD4gbVJldmVyc2VNYXA7CisgICAgbXV0YWJsZSBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBDb25uZWN0aW9uUmVwb3J0PiBtUGVuZGluZ1JlcG9ydDsKKworICAgIC8vIGRhZW1vbnMKKyAgICBzdGQ6OnZlY3RvcjxzcDxCYXNlRHluYW1pY1NlbnNvckRhZW1vbj4+IG1EYWVtb25WZWN0b3I7Cit9OworCit9IC8vIG5hbWVzcGFjZSBTZW5zb3JIYWxFeHQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfU0VOU09SSEFMX0VYVF9EWU5BTUlDX1NFTlNPUl9NQU5BR0VSX0gKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWREZXZpY2UuaCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWREZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDgzNTkzCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZERldmljZS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VOU09SSEFMX0VYVF9ISURfREVWSUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9TRU5TT1JIQUxfRVhUX0hJRF9ERVZJQ0VfSAorI2luY2x1ZGUgIlV0aWxzLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgU2Vuc29ySGFsRXh0IHsKKworY2xhc3MgSGlkRGV2aWNlIDogdmlydHVhbCBwdWJsaWMgUkVGX0JBU0UoSGlkRGV2aWNlKSB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+SGlkRGV2aWNlKCkgPSBkZWZhdWx0OworCisgICAgc3RydWN0IEhpZERldmljZUluZm8geworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICBzdGQ6OnN0cmluZyBwaHlzaWNhbFBhdGg7CisgICAgICAgIHN0ZDo6c3RyaW5nIGJ1c1R5cGU7CisgICAgICAgIHVpbnQxNl90IHZlbmRvcklkOworICAgICAgICB1aW50MTZfdCBwcm9kdWN0SWQ7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRlc2NyaXB0b3I7CisgICAgfTsKKworICAgIHZpcnR1YWwgY29uc3QgSGlkRGV2aWNlSW5mbyYgZ2V0RGV2aWNlSW5mbygpID0gMDsKKworICAgIC8vIGdldCBmZWF0dXJlIGZyb20gZGV2aWNlCisgICAgdmlydHVhbCBib29sIGdldEZlYXR1cmUodWludDhfdCBpZCwgc3RkOjp2ZWN0b3I8dWludDhfdD4gKm91dCkgPSAwOworCisgICAgLy8gd3JpdGUgZmVhdHVyZSB0byBkZXZpY2UKKyAgICB2aXJ0dWFsIGJvb2wgc2V0RmVhdHVyZSh1aW50OF90IGlkLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmaW4pID0gMDsKKworICAgIC8vIHNlbmQgcmVwb3J0IHRvIGRlZmF1bHQgb3V0cHV0IGVuZHBvaW50CisgICAgdmlydHVhbCBib29sIHNlbmRSZXBvcnQodWludDhfdCBpZCwgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmRhdGEpID0gMDsKKworICAgIC8vIHJlY2VpdmUgZnJvbSBkZWZhdWx0IGlucHV0IGVuZHBvaW50CisgICAgdmlydHVhbCBib29sIHJlY2VpdmVSZXBvcnQodWludDhfdCAqaWQsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpkYXRhKSA9IDA7Cit9OworCit9IC8vIG5hbWVzcGFjZSBTZW5zb3JIYWxFeHQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNlbmRpZiAvLyBBTkRST0lEX1NFTlNPUkhBTF9FWFRfSElEX0RFVklDRV9ICmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkUmF3RGV2aWNlLmNwcCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRSYXdEZXZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ODg0ODMKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkUmF3RGV2aWNlLmNwcApAQCAtMCwwICsxLDMzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiSGlkUmF3RGV2aWNlLmgiCisjaW5jbHVkZSAiSGlkTG9nLmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWRyYXcuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWRkZXYuaD4gIC8vIEhJRF9TVFJJTkdfU0laRQorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8c2V0PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgU2Vuc29ySGFsRXh0IHsKKwordXNpbmcgSGlkVXRpbDo6SGlkSXRlbTsKKworSGlkUmF3RGV2aWNlOjpIaWRSYXdEZXZpY2UoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZkZXZOYW1lLCBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8dW5zaWduZWQgaW50PiAmdXNhZ2VTZXQpCisgICAgICAgIDogbURldkZkKC0xKSwgbU11bHRpSWREZXZpY2UoZmFsc2UpLCBtVmFsaWQoZmFsc2UpIHsKKyAgICAvLyBvcGVuIGRldmljZQorICAgIG1EZXZGZCA9IDo6b3BlbihkZXZOYW1lLmNfc3RyKCksIE9fUkRXUik7IC8vIHJlYWQgd3JpdGU/CisgICAgaWYgKG1EZXZGZCA8IDApIHsKKyAgICAgICAgTE9HX0UgPDwgIkVycm9yIGluIG9wZW4gZGV2aWNlIG5vZGU6ICIgPDwgZXJybm8gPDwgIiAoIiA8PCA6OnN0cmVycm9yKGVycm5vKSA8PCAiKSIKKyAgICAgICAgICAgICAgPDwgTE9HX0VOREw7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBnZXQgZGV2aWNlIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgaGlkIGRlc2NyaXB0b3IKKyAgICBpZiAoIXBvcHVsYXRlRGV2aWNlSW5mbygpKSB7CisgICAgICAgIExPR19FIDw8ICJFcnJvciBvYnRhaW5pbmcgSGlkUmF3IGRldmljZSBpbmZvcm1hdGlvbiIgPDwgTE9HX0VOREw7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIWdlbmVyYXRlRGlnZXN0KHVzYWdlU2V0KSkgeworICAgICAgICBMT0dfRSA8PCAiQ2Fubm90IHBhcnNlIGhpZCBkZXNjcmlwdG9yIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGRpZ2VzdCBlcnJvciBjaGVja2luZworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1bnNpZ25lZCBpbnQ+IHJlcG9ydElkU2V0OworICAgIGZvciAoYXV0byBjb25zdCAmZGlnZXN0IDogbURpZ2VzdFZlY3RvcikgeworICAgICAgICBmb3IgKGF1dG8gY29uc3QgJnBhY2tldCA6IGRpZ2VzdC5wYWNrZXRzKSB7CisgICAgICAgICAgICBpZiAobVJlcG9ydFR5cGVJZE1hcC5lbXBsYWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIocGFja2V0LnR5cGUsIHBhY2tldC5pZCksICZwYWNrZXQpLnNlY29uZCA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgIExPR19FIDw8ICJTYW1lIHR5cGUgLSByZXBvcnQgaWQgcGFpciAoIiA8PCBwYWNrZXQudHlwZSA8PCAiLCAiIDw8IHBhY2tldC5pZCA8PCAiKSIKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiaXMgdXNlZCBieSBtb3JlIHRoYW4gb25lIHVzYWdlIGNvbGxlY3Rpb24iIDw8IExPR19FTkRMOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcG9ydElkU2V0Lmluc2VydChwYWNrZXQuaWQpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtUmVwb3J0VHlwZUlkTWFwLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChyZXBvcnRJZFNldC5zaXplKCkgPiAxKSB7CisgICAgICAgIGlmIChyZXBvcnRJZFNldC5maW5kKDApICE9IHJlcG9ydElkU2V0LmVuZCgpKSB7CisgICAgICAgICAgICBMT0dfRSA8PCAiRGVmYXVsdCByZXBvcnQgaWQgMCBpcyBub3QgZXhwZWN0ZWQgd2hlbiBtb3JlIHRoYW4gb25lIHJlcG9ydCBpZCBpcyBmb3VuZC4iCisgICAgICAgICAgICAgICAgICA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtTXVsdGlJZERldmljZSA9IHRydWU7CisgICAgfSBlbHNlIHsgLy8gcmVwb3J0SWRTZXQuc2l6ZSgpID09IDEKKyAgICAgICAgbU11bHRpSWREZXZpY2UgPSAhKHJlcG9ydElkU2V0LmZpbmQoMCkgIT0gcmVwb3J0SWRTZXQuZW5kKCkpOworICAgIH0KKyAgICBtVmFsaWQgPSB0cnVlOworfQorCitIaWRSYXdEZXZpY2U6On5IaWRSYXdEZXZpY2UoKSB7CisgICAgaWYgKG1EZXZGZCA+IDApIHsKKyAgICAgICAgOjpjbG9zZShtRGV2RmQpOworICAgICAgICBtRGV2RmQgPSAtMTsKKyAgICB9Cit9CisKK2Jvb2wgSGlkUmF3RGV2aWNlOjpwb3B1bGF0ZURldmljZUluZm8oKSB7CisgICAgSGlkRGV2aWNlSW5mbyBpbmZvOworICAgIGNoYXIgYnVmZmVyW0hJRF9TVFJJTkdfU0laRSArIDFdOworCisgICAgaWYgKG1EZXZGZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIG5hbWUKKyAgICBpZiAoaW9jdGwobURldkZkLCBISURJT0NHUkFXTkFNRShzaXplb2YoYnVmZmVyKSAtIDEpLCBidWZmZXIpIDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGJ1ZmZlcltzaXplb2YoYnVmZmVyKSAtIDFdID0gJ1wwJzsKKyAgICBpbmZvLm5hbWUgPSBidWZmZXI7CisKKyAgICAvLyBwaHlzaWNhbCBwYXRoCisgICAgaWYgKGlvY3RsKG1EZXZGZCwgSElESU9DR1JBV1BIWVMoc2l6ZW9mKGJ1ZmZlcikgLSAxKSwgYnVmZmVyKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBidWZmZXJbc2l6ZW9mKGJ1ZmZlcikgLSAxXSA9ICdcMCc7CisgICAgaW5mby5waHlzaWNhbFBhdGggPSBidWZmZXI7CisKKyAgICAvLyByYXcgZGV2aWNlIGluZm8KKyAgICBoaWRyYXdfZGV2aW5mbyBkZXZJbmZvOworICAgIGlmIChpb2N0bChtRGV2RmQsIEhJRElPQ0dSQVdJTkZPLCAmZGV2SW5mbykgPCAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGRldkluZm8uYnVzdHlwZSkgeworICAgIGNhc2UgQlVTX1VTQjoKKyAgICAgICAgaW5mby5idXNUeXBlID0gIlVTQiI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQlVTX0hJTDoKKyAgICAgICAgaW5mby5idXNUeXBlID0gIkhJTCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQlVTX0JMVUVUT09USDoKKyAgICAgICAgaW5mby5idXNUeXBlID0gIkJsdWV0b290aCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQlVTX1ZJUlRVQUw6CisgICAgICAgIGluZm8uYnVzVHlwZSA9ICJWaXJ0dWFsIjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaW5mby5idXNUeXBlID0gIk90aGVyIjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaW5mby52ZW5kb3JJZCA9IGRldkluZm8udmVuZG9yOworICAgIGluZm8ucHJvZHVjdElkID0gZGV2SW5mby52ZW5kb3I7CisKKyAgICB1aW50MzJfdCBkZXNjcmlwdG9yU2l6ZTsKKyAgICAvKiBHZXQgUmVwb3J0IERlc2NyaXB0b3IgU2l6ZSAqLworICAgIGlmIChpb2N0bChtRGV2RmQsIEhJRElPQ0dSREVTQ1NJWkUsICZkZXNjcmlwdG9yU2l6ZSkgPCAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdHJ1Y3QgaGlkcmF3X3JlcG9ydF9kZXNjcmlwdG9yIHJlcG9ydERlc2NyaXB0b3I7CisgICAgbWVtc2V0KCZyZXBvcnREZXNjcmlwdG9yLCAwLCBzaXplb2YocmVwb3J0RGVzY3JpcHRvcikpOworICAgIGluZm8uZGVzY3JpcHRvci5yZXNpemUoZGVzY3JpcHRvclNpemUpOworICAgIHJlcG9ydERlc2NyaXB0b3Iuc2l6ZSA9IGRlc2NyaXB0b3JTaXplOworICAgIGlmIChpb2N0bChtRGV2RmQsIEhJRElPQ0dSREVTQywgJnJlcG9ydERlc2NyaXB0b3IpIDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHN0ZDo6Y29weShyZXBvcnREZXNjcmlwdG9yLnZhbHVlLCByZXBvcnREZXNjcmlwdG9yLnZhbHVlICsgZGVzY3JpcHRvclNpemUsCisgICAgICAgICAgICAgIGluZm8uZGVzY3JpcHRvci5iZWdpbigpKTsKKyAgICBtRGV2aWNlSW5mbyA9IGluZm87CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSGlkUmF3RGV2aWNlOjpnZW5lcmF0ZURpZ2VzdChjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8dW5zaWduZWQgaW50PiAmdXNhZ2UpIHsKKyAgICBpZiAobURldmljZUluZm8uZGVzY3JpcHRvci5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxIaWRJdGVtPiB0b2tlbnMgPSBIaWRJdGVtOjp0b2tlbml6ZShtRGV2aWNlSW5mby5kZXNjcmlwdG9yKTsKKyAgICBIaWRQYXJzZXIgcGFyc2VyOworICAgIGlmICghcGFyc2VyLnBhcnNlKHRva2VucykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHBhcnNlci5maWx0ZXJUcmVlKCk7CisgICAgbURpZ2VzdFZlY3RvciA9IHBhcnNlci5nZW5lcmF0ZURpZ2VzdCh1c2FnZSk7CisKKyAgICByZXR1cm4gbURpZ2VzdFZlY3Rvci5zaXplKCkgPiAwOworfQorCitib29sIEhpZFJhd0RldmljZTo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gbVZhbGlkOworfQorCitib29sIEhpZFJhd0RldmljZTo6Z2V0RmVhdHVyZSh1aW50OF90IGlkLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqb3V0KSB7CisgICAgaWYgKG1EZXZGZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChvdXQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgSGlkUGFyc2VyOjpSZXBvcnRQYWNrZXQgKnBhY2tldCA9IGdldFJlcG9ydFBhY2tldChIaWRQYXJzZXI6OlJFUE9SVF9UWVBFX0ZFQVRVUkUsIGlkKTsKKyAgICBpZiAocGFja2V0ID09IG51bGxwdHIpIHsKKyAgICAgICAgTE9HX0UgPDwgIkhpZFJhd0RldmljZTo6Z2V0RmVhdHVyZTogdW5rbm93biBmZWF0dXJlICIgPDwgaWQgPDwgTE9HX0VOREw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzaXplX3Qgc2l6ZSA9IHBhY2tldC0+Z2V0Qnl0ZVNpemUoKSArIDE7IC8vIHJlcG9ydCBpZCBzaXplCisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbChtSW9CdWZmZXJMb2NrKTsKKyAgICBpZiAobUlvQnVmZmVyLnNpemUoKSA8IHNpemUpIHsKKyAgICAgICAgbUlvQnVmZmVyLnJlc2l6ZShzaXplKTsKKyAgICB9CisgICAgbUlvQnVmZmVyWzBdID0gaWQ7CisgICAgaW50IHJlcyA9IDo6aW9jdGwobURldkZkLCBISURJT0NHRkVBVFVSRShzaXplKSwgbUlvQnVmZmVyLmRhdGEoKSk7CisgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgTE9HX0UgPDwgIkhpZFJhd0RldmljZTo6Z2V0RmVhdHVyZTogZmVhdHVyZSAiIDw8IHN0YXRpY19jYXN0PGludD4oaWQpCisgICAgICAgICAgICAgIDw8ICIgaW9jdGwgcmV0dXJucyAiIDw8IHJlcyA8PCAiICgiIDw8IDo6c3RyZXJyb3IocmVzKSA8PCAiKSIgPDwgTE9HX0VOREw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXMpICE9IHNpemUpIHsKKyAgICAgICAgTE9HX0UgPDwgIkhpZFJhd0RldmljZTo6Z2V0RmVhdHVyZTogZ2V0IGZlYXR1cmUgIiA8PCBzdGF0aWNfY2FzdDxpbnQ+KGlkKQorICAgICAgICAgICAgICA8PCAiIHJldHVybmVkICIgPDwgcmVzIDw8ICIgYnl0ZXMsIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkICIgPDwgc2l6ZSA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobUlvQnVmZmVyLmZyb250KCkgIT0gaWQpIHsKKyAgICAgICAgTE9HX0UgPDwgIkhpZFJhd0RldmljZTo6Z2V0RmVhdHVyZTogZ2V0IGZlYXR1cmUgIiA8PCBzdGF0aWNfY2FzdDxpbnQ+KGlkKQorICAgICAgICAgICAgICA8PCAiIHJlc3VsdCBoYXMgaGVhZGVyICIgPDwgbUlvQnVmZmVyLmZyb250KCkgPDwgTE9HX0VOREw7CisgICAgfQorICAgIG91dC0+cmVzaXplKHNpemUgLSAxKTsKKyAgICBzdGQ6OmNvcHkobUlvQnVmZmVyLmJlZ2luKCkgKyAxLCBtSW9CdWZmZXIuYmVnaW4oKSArIHNpemUsIG91dC0+YmVnaW4oKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSGlkUmF3RGV2aWNlOjpzZXRGZWF0dXJlKHVpbnQ4X3QgaWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZpbikgeworICAgIGlmIChtRGV2RmQgPCAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBIaWRQYXJzZXI6OlJlcG9ydFBhY2tldCAqcGFja2V0ID0gZ2V0UmVwb3J0UGFja2V0KEhpZFBhcnNlcjo6UkVQT1JUX1RZUEVfRkVBVFVSRSwgaWQpOworICAgIGlmIChwYWNrZXQgPT0gbnVsbHB0cikgeworICAgICAgICBMT0dfRSA8PCAiSGlkUmF3RGV2aWNlOjpzZXRGZWF0dXJlOiBVbmtub3duIGZlYXR1cmUgIiA8PCBpZCA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNpemVfdCBzaXplID0gcGFja2V0LT5nZXRCeXRlU2l6ZSgpOworICAgIGlmIChzaXplICE9IGluLnNpemUoKSkgeworICAgICAgICBMT0dfRSA8PCAiSGlkUmF3RGV2aWNlOjpzZXRGZWF0dXJlOiBzZXQgZmVhdHVyZSAiIDw8IGlkIDw8ICIgc2l6ZSBtaXNtYXRjaCwgbmVlZCAiCisgICAgICAgICAgICAgIDw8IHNpemUgPDwgIiBieXRlcywgaGF2ZSAiIDw8IGluLnNpemUoKSA8PCAiIGJ5dGVzIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgICsrc2l6ZTsgLy8gcmVwb3J0IGlkIGJ5dGUKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbChtSW9CdWZmZXJMb2NrKTsKKyAgICBpZiAobUlvQnVmZmVyLnNpemUoKSA8IHNpemUpIHsKKyAgICAgICAgbUlvQnVmZmVyLnJlc2l6ZShzaXplKTsKKyAgICB9CisgICAgbUlvQnVmZmVyWzBdID0gaWQ7CisgICAgc3RkOjpjb3B5KGluLmJlZ2luKCksIGluLmVuZCgpLCAmbUlvQnVmZmVyWzFdKTsKKyAgICBpbnQgcmVzID0gOjppb2N0bChtRGV2RmQsIEhJRElPQ1NGRUFUVVJFKHNpemUpLCBtSW9CdWZmZXIuZGF0YSgpKTsKKyAgICBpZiAocmVzIDwgMCkgeworICAgICAgICBMT0dfRSA8PCAiSGlkUmF3RGV2aWNlOjpzZXRGZWF0dXJlOiBmZWF0dXJlICIgPDwgaWQgPDwgIiBpb2N0bCByZXR1cm5zICIgPDwgcmVzCisgICAgICAgICAgICAgIDw8ICIgKCIgPDwgOjpzdHJlcnJvcihyZXMpIDw8ICIpIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBIaWRSYXdEZXZpY2U6OnNlbmRSZXBvcnQodWludDhfdCBpZCwgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmRhdGEpIHsKKyAgICBpZiAobURldkZkIDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgSGlkUGFyc2VyOjpSZXBvcnRQYWNrZXQgKnBhY2tldCA9IGdldFJlcG9ydFBhY2tldChIaWRQYXJzZXI6OlJFUE9SVF9UWVBFX09VVFBVVCwgaWQpOworICAgIGlmIChwYWNrZXQgPT0gbnVsbHB0cikgeworICAgICAgICBMT0dfRSA8PCAiSGlkUmF3RGV2aWNlOjpzZW5kUmVwb3J0OiB1bmtub3duIG91dHB1dCAiIDw8IGlkIDw8IExPR19FTkRMOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc2l6ZV90IHNpemUgPSBwYWNrZXQtPmdldEJ5dGVTaXplKCk7CisgICAgaWYgKHNpemUgIT0gZGF0YS5zaXplKCkpIHsKKyAgICAgICAgTE9HX0UgPDwgIkhpZFJhd0RldmljZTo6c2VuZFJlcG9ydDogc2VuZCByZXBvcnQgIiA8PCBpZCA8PCAiIHNpemUgbWlzbWF0Y2gsIG5lZWQgIgorICAgICAgICAgICAgICA8PCBzaXplIDw8ICIgYnl0ZXMsIGhhdmUgIiA8PCBkYXRhLnNpemUoKSA8PCAiIGJ5dGVzIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpbnQgcmVzOworICAgIGlmIChtTXVsdGlJZERldmljZSkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbChtSW9CdWZmZXJMb2NrKTsKKyAgICAgICAgKytzaXplOworICAgICAgICBpZiAobUlvQnVmZmVyLnNpemUoKSA8IHNpemUpIHsKKyAgICAgICAgICAgIG1Jb0J1ZmZlci5yZXNpemUoc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgbUlvQnVmZmVyWzBdID0gaWQ7CisgICAgICAgIHN0ZDo6Y29weShtSW9CdWZmZXIuYmVnaW4oKSArIDEsIG1Jb0J1ZmZlci5lbmQoKSwgZGF0YS5iZWdpbigpKTsKKyAgICAgICAgcmVzID0gOjp3cml0ZShtRGV2RmQsIG1Jb0J1ZmZlci5kYXRhKCksIHNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlcyA9IDo6d3JpdGUobURldkZkLCBkYXRhLmRhdGEoKSwgc2l6ZSk7CisgICAgfQorICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgIExPR19FIDw8ICJIaWRSYXdEZXZpY2U6OnNlbmRSZXBvcnQ6IG91dHB1dCAiIDw8IGlkIDw8ICIgd3JpdGUgcmV0dXJucyAiIDw8IHJlcworICAgICAgICAgICAgICA8PCAiICgiIDw8IDo6c3RyZXJyb3IocmVzKSA8PCAiKSIgPDwgTE9HX0VOREw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSGlkUmF3RGV2aWNlOjpyZWNlaXZlUmVwb3J0KHVpbnQ4X3QgKmlkLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqZGF0YSkgeworICAgIGlmIChtRGV2RmQgPCAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1aW50OF90IGJ1ZmZlclsyNTZdOworICAgIGludCByZXMgPSA6OnJlYWQobURldkZkLCBidWZmZXIsIDI1Nik7CisgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgTE9HX0UgPDwgIkhpZFJhd0RldmljZTo6cmVjZWl2ZVJlcG9ydDogcmVhZCByZXR1cm5zICIgPDwgcmVzCisgICAgICAgICAgICAgIDw8ICIgKCIgPDwgOjpzdHJlcnJvcihyZXMpIDw8ICIpIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChtTXVsdGlJZERldmljZSkgeworICAgICAgICBpZiAoIShyZXMgPiAxKSkgeworICAgICAgICAgICAgTE9HX0UgPDwgInJlYWQgaGlkcmF3IHJldHVybnMgZGF0YSB0b28gc2hvcnQsIGxlbjogIiA8PCByZXMgPDwgTE9HX0VOREw7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZGF0YS0+cmVzaXplKHN0YXRpY19jYXN0PHNpemVfdD4ocmVzIC0gMSkpOworICAgICAgICBzdGQ6OmNvcHkoYnVmZmVyICsgMSwgYnVmZmVyICsgcmVzLCBkYXRhLT5iZWdpbigpKTsKKyAgICAgICAgKmlkID0gYnVmZmVyWzBdOworICAgIH0gZWxzZSB7CisgICAgICAgIGRhdGEtPnJlc2l6ZShzdGF0aWNfY2FzdDxzaXplX3Q+KHJlcykpOworICAgICAgICBzdGQ6OmNvcHkoYnVmZmVyLCBidWZmZXIgKyByZXMsIGRhdGEtPmJlZ2luKCkpOworICAgICAgICAqaWQgPSAwOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgSGlkUGFyc2VyOjpSZXBvcnRQYWNrZXQgKkhpZFJhd0RldmljZTo6Z2V0UmVwb3J0UGFja2V0KHVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgaWQpIHsKKyAgICBhdXRvIGkgPSBtUmVwb3J0VHlwZUlkTWFwLmZpbmQoc3RkOjptYWtlX3BhaXIodHlwZSwgaWQpKTsKKyAgICByZXR1cm4gKGkgPT0gbVJlcG9ydFR5cGVJZE1hcC5lbmQoKSkgPyBudWxscHRyIDogaS0+c2Vjb25kOworfQorCit9IC8vIG5hbWVzcGFjZSBTZW5zb3JIYWxFeHQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRSYXdEZXZpY2UuaCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRSYXdEZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDdkZmZmCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFJhd0RldmljZS5oCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBBTkRST0lEX1NFTlNPUkhBTF9FWFRfSElEUkFXX0RFVklDRV9ICisjZGVmaW5lIEFORFJPSURfU0VOU09SSEFMX0VYVF9ISURSQVdfREVWSUNFX0gKKworI2luY2x1ZGUgIkhpZERldmljZS5oIgorCisjaW5jbHVkZSA8SGlkUGFyc2VyLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBTZW5zb3JIYWxFeHQgeworCit1c2luZyBIaWRVdGlsOjpIaWRQYXJzZXI7Cit1c2luZyBIaWRVdGlsOjpIaWRSZXBvcnQ7CisKK2NsYXNzIEhpZFJhd0RldmljZSA6IHB1YmxpYyBIaWREZXZpY2UgeworICAgIGZyaWVuZCBjbGFzcyBIaWRSYXdEZXZpY2VUZXN0OworcHVibGljOgorICAgIEhpZFJhd0RldmljZShjb25zdCBzdGQ6OnN0cmluZyAmZGV2TmFtZSwgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PHVuc2lnbmVkIGludD4gJnVzYWdlU2V0KTsKKyAgICB2aXJ0dWFsIH5IaWRSYXdEZXZpY2UoKTsKKworICAgIC8vIHRlc3QgaWYgdGhlIGRldmljZSBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkKKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIC8vIGltcGxlbWVudCBIaWREZXZpY2UgcHVyZSB2aXJ0dWFscworICAgIHZpcnR1YWwgSGlkRGV2aWNlSW5mbyYgZ2V0RGV2aWNlSW5mbygpIG92ZXJyaWRlIHsgcmV0dXJuIG1EZXZpY2VJbmZvOyB9CisgICAgdmlydHVhbCBib29sIGdldEZlYXR1cmUodWludDhfdCBpZCwgc3RkOjp2ZWN0b3I8dWludDhfdD4gKm91dCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBib29sIHNldEZlYXR1cmUodWludDhfdCBpZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmluKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wgc2VuZFJlcG9ydCh1aW50OF90IGlkLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmZGF0YSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBib29sIHJlY2VpdmVSZXBvcnQodWludDhfdCAqaWQsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpkYXRhKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIGJvb2wgcG9wdWxhdGVEZXZpY2VJbmZvKCk7CisgICAgc2l6ZV90IGdldFJlcG9ydFNpemUoaW50IHR5cGUsIHVpbnQ4X3QgaWQpOworICAgIGJvb2wgZ2VuZXJhdGVEaWdlc3QoY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PHVpbnQzMl90PiAmdXNhZ2UpOworICAgIHNpemVfdCBjYWxjdWxhdGVSZXBvcnRCaXRTaXplKGNvbnN0IHN0ZDo6dmVjdG9yPEhpZFJlcG9ydD4gJnJlcG9ydEl0ZW1zKTsKKyAgICBjb25zdCBIaWRQYXJzZXI6OlJlcG9ydFBhY2tldCAqZ2V0UmVwb3J0UGFja2V0KHVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgaWQpOworCisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8dW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQ+IFJlcG9ydFR5cGVJZFBhaXI7CisgICAgc3RydWN0IFVuc2lnbmVkSW50UGFpckhhc2ggeworICAgICAgICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBSZXBvcnRUeXBlSWRQYWlyJiB2KSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6Omhhc2g8dW5zaWduZWQgaW50PiBoYXNoOworICAgICAgICAgICAgcmV0dXJuIGhhc2godi5maXJzdCkgXiBoYXNoKHYuc2Vjb25kKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8UmVwb3J0VHlwZUlkUGFpciwgY29uc3QgSGlkUGFyc2VyOjpSZXBvcnRQYWNrZXQgKiwgVW5zaWduZWRJbnRQYWlySGFzaD4KKyAgICAgICAgICAgIG1SZXBvcnRUeXBlSWRNYXA7CisKKyAgICBIaWRQYXJzZXI6OkRpZ2VzdFZlY3RvciBtRGlnZXN0VmVjdG9yOworcHJpdmF0ZToKKyAgICBzdGQ6Om11dGV4IG1Jb0J1ZmZlckxvY2s7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbUlvQnVmZmVyOworCisgICAgaW50IG1EZXZGZDsKKyAgICBIaWREZXZpY2VJbmZvIG1EZXZpY2VJbmZvOworICAgIGJvb2wgbU11bHRpSWREZXZpY2U7CisgICAgaW50IG1WYWxpZDsKKworICAgIEhpZFJhd0RldmljZShjb25zdCBIaWRSYXdEZXZpY2UgJikgPSBkZWxldGU7CisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSGlkUmF3RGV2aWNlICYpID0gZGVsZXRlOworfTsKKworfSAvLyBuYW1lc3BhY2UgU2Vuc29ySGFsRXh0Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1NFTlNPUkhBTF9FWFRfSElEUkFXX0RFVklDRV9ICisKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRSYXdTZW5zb3IuY3BwIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFJhd1NlbnNvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY0ZDdhNgotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRSYXdTZW5zb3IuY3BwCkBAIC0wLDAgKzEsMTA0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiSGlkUmF3U2Vuc29yLmgiCisjaW5jbHVkZSAiSGlkU2Vuc29yRGVmLmgiCisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlICJIaWRMb2cuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjZmxvYXQ+CisjaW5jbHVkZSA8Y29kZWN2dD4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBTZW5zb3JIYWxFeHQgeworCituYW1lc3BhY2UgeworY29uc3Qgc3RkOjpzdHJpbmcgQ1VTVE9NX1RZUEVfUFJFRklYKCJjb20uZ29vZ2xlLmhhcmR3YXJlLnNlbnNvci5oaWRfZHluYW1pYy4iKTsKK30KKworSGlkUmF3U2Vuc29yOjpIaWRSYXdTZW5zb3IoCisgICAgICAgIFNQKEhpZERldmljZSkgZGV2aWNlLCB1aW50MzJfdCB1c2FnZSwgY29uc3Qgc3RkOjp2ZWN0b3I8SGlkUGFyc2VyOjpSZXBvcnRQYWNrZXQ+ICZwYWNrZXRzKQorICAgICAgICA6IG1SZXBvcnRpbmdTdGF0ZUlkKC0xKSwgbVBvd2VyU3RhdGVJZCgtMSksIG1SZXBvcnRJbnRlcnZhbElkKC0xKSwgbUlucHV0UmVwb3J0SWQoLTEpLAorICAgICAgICBtRW5hYmxlZChmYWxzZSksIG1TYW1wbGluZ1BlcmlvZCgxMDAwbGwqMTAwMCoxMDAwKSwgbUJhdGNoaW5nUGVyaW9kKDApLAorICAgICAgICBtRGV2aWNlKGRldmljZSksIG1WYWxpZChmYWxzZSkgeworICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1lbXNldCgmbVNlbnNvciwgMCwgc2l6ZW9mKG1TZW5zb3IpKTsKKworICAgIGNvbnN0IEhpZERldmljZTo6SGlkRGV2aWNlSW5mbyAmaW5mbyA9ICBkZXZpY2UtPmdldERldmljZUluZm8oKTsKKyAgICBpbml0RmVhdHVyZVZhbHVlRnJvbUhpZERldmljZUluZm8oJm1GZWF0dXJlSW5mbywgaW5mbyk7CisKKyAgICBpZiAoIXBvcHVsYXRlRmVhdHVyZVZhbHVlRnJvbUZlYXR1cmVSZXBvcnQoJm1GZWF0dXJlSW5mbywgcGFja2V0cykpIHsKKyAgICAgICAgTE9HX0UgPDwgInBvcHVsYXRlIGZlYXR1cmUgZnJvbSBmZWF0dXJlIHJlcG9ydCBmYWlsZWQiIDw8IExPR19FTkRMOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFmaW5kU2Vuc29yQ29udHJvbFVzYWdlKHBhY2tldHMpKSB7CisgICAgICAgIExPR19FIDw8ICJmaW5kaW5nIHNlbnNvciBjb250cm9sIHVzYWdlIGZhaWxlZCIgPDwgTE9HX0VOREw7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBidWlsZCB0cmFuc2xhdGlvbiB0YWJsZQorICAgIGJvb2wgdHJhbnNsYXRpb25UYWJsZVZhbGlkID0gZmFsc2U7CisgICAgc3dpdGNoICh1c2FnZSkgeworICAgICAgICB1c2luZyBuYW1lc3BhY2UgSGlkOjpTZW5zb3I6OlNlbnNvclR5cGVVc2FnZTsKKyAgICAgICAgdXNpbmcgbmFtZXNwYWNlIEhpZDo6U2Vuc29yOjpSZXBvcnRVc2FnZTsKKyAgICAgICAgY2FzZSBBQ0NFTEVST01FVEVSXzNEOgorICAgICAgICAgICAgLy8gSGlkIHVuaXQgZGVmYXVsdCBnCisgICAgICAgICAgICAvLyBBbmRyb2lkIHVuaXQgbS9zXjIKKyAgICAgICAgICAgIC8vIDFnID0gOS44MSBtL3NeMgorICAgICAgICAgICAgbUZlYXR1cmVJbmZvLnR5cGVTdHJpbmcgPSBTRU5TT1JfU1RSSU5HX1RZUEVfQUNDRUxFUk9NRVRFUjsKKyAgICAgICAgICAgIG1GZWF0dXJlSW5mby50eXBlID0gU0VOU09SX1RZUEVfQUNDRUxFUk9NRVRFUjsKKyAgICAgICAgICAgIG1GZWF0dXJlSW5mby5pc1dha2VVcCA9IGZhbHNlOworCisgICAgICAgICAgICB0cmFuc2xhdGlvblRhYmxlVmFsaWQgPSBwcm9jZXNzVHJpQXhpc1VzYWdlKHBhY2tldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDQ0VMRVJBVElPTl9YX0FYSVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDQ0VMRVJBVElPTl9ZX0FYSVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDQ0VMRVJBVElPTl9aX0FYSVMsIDkuODEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1lST01FVEVSXzNEOgorICAgICAgICAgICAgLy8gSGlkIHVuaXQgZGVmYXVsdCBkZWdyZWUvcworICAgICAgICAgICAgLy8gQW5kcm9pZCB1bml0IHJhZC9zCisgICAgICAgICAgICAvLyAxIGRlZ3JlZS9zID0gcGkvMTgwIHJhZC9zCisgICAgICAgICAgICBtRmVhdHVyZUluZm8udHlwZVN0cmluZyA9IFNFTlNPUl9TVFJJTkdfVFlQRV9HWVJPU0NPUEU7CisgICAgICAgICAgICBtRmVhdHVyZUluZm8udHlwZSA9IFNFTlNPUl9UWVBFX0dZUk9TQ09QRTsKKyAgICAgICAgICAgIG1GZWF0dXJlSW5mby5pc1dha2VVcCA9IGZhbHNlOworCisgICAgICAgICAgICB0cmFuc2xhdGlvblRhYmxlVmFsaWQgPSBwcm9jZXNzVHJpQXhpc1VzYWdlKHBhY2tldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOR1VMQVJfVkVMT0NJVFlfWF9BWElTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTkdVTEFSX1ZFTE9DSVRZX1lfQVhJUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5HVUxBUl9WRUxPQ0lUWV9aX0FYSVMsIE1fUEkvMTgwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENPTVBBU1NfM0Q6IHsKKyAgICAgICAgICAgIC8vIEhpZCB1bml0IGRlZmF1bHQgbUdhdXNzCisgICAgICAgICAgICAvLyBBbmRyb2lkIHVuaXQgdVQKKyAgICAgICAgICAgIC8vIDF1VCAgPSAwLjEgbkdhdXNzCisgICAgICAgICAgICBtRmVhdHVyZUluZm8udHlwZVN0cmluZyA9IFNFTlNPUl9TVFJJTkdfVFlQRV9NQUdORVRJQ19GSUVMRDsKKyAgICAgICAgICAgIG1GZWF0dXJlSW5mby50eXBlID0gU0VOU09SX1RZUEVfTUFHTkVUSUNfRklFTEQ7CisKKyAgICAgICAgICAgIGlmICghcHJvY2Vzc1RyaUF4aXNVc2FnZShwYWNrZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BR05FVElDX0ZMVVhfWF9BWElTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BR05FVElDX0ZMVVhfWV9BWElTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BR05FVElDX0ZMVVhfWl9BWElTLCAwLjEpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCBIaWRQYXJzZXI6OlJlcG9ydEl0ZW0gKnBSZXBvcnRBY2N1cmFjeSA9IGZpbmQocGFja2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BR05FVE9NRVRFUl9BQ0NVUkFDWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpZFBhcnNlcjo6UkVQT1JUX1RZUEVfSU5QVVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRSZXBvcnRJZCk7CisKKyAgICAgICAgICAgIGlmIChwUmVwb3J0QWNjdXJhY3kgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIExPR19FIDw8ICJDYW5ub3QgZmluZCBhY2N1cmFjeSBmaWVsZCBpbiB1c2FnZSAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjpoZXggPDwgdXNhZ2UgPDwgc3RkOjpkZWMgPDwgTE9HX0VOREw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXBSZXBvcnRBY2N1cmFjeS0+aXNCeXRlQWxpZ25lZCgpKSB7CisgICAgICAgICAgICAgICAgTE9HX0UgPDwgIkFjY3VyYWN5IGZpZWxkIG11c3QgYWxpZ24gdG8gYnl0ZSIgPDwgTE9HX0VOREw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocFJlcG9ydEFjY3VyYWN5LT5taW5SYXcgIT0gMCB8fCBwUmVwb3J0QWNjdXJhY3ktPm1heFJhdyAhPSAyKSB7CisgICAgICAgICAgICAgICAgTE9HX0UgPDwgIkFjY3VyYWN5IGZpZWxkIHZhbHVlIHJhbmdlIG11c3QgYmUgWzAsIDJdIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFJlcG9ydFRyYW5zbGF0ZVJlY29yZCBhY2N1cmFjeVJlY29yZCA9IHsKKyAgICAgICAgICAgICAgICAudHlwZSA9IFRZUEVfQUNDVVJBQ1ksCisgICAgICAgICAgICAgICAgLm1heFZhbHVlID0gMiwKKyAgICAgICAgICAgICAgICAubWluVmFsdWUgPSAwLAorICAgICAgICAgICAgICAgIC5ieXRlT2Zmc2V0ID0gcFJlcG9ydEFjY3VyYWN5LT5iaXRPZmZzZXQgLyA4LAorICAgICAgICAgICAgICAgIC5ieXRlU2l6ZSA9IHBSZXBvcnRBY2N1cmFjeS0+Yml0U2l6ZSAvIDgsCisgICAgICAgICAgICAgICAgLmEgPSAxLAorICAgICAgICAgICAgICAgIC5iID0gMX07CisgICAgICAgICAgICBtVHJhbnNsYXRlVGFibGUucHVzaF9iYWNrKGFjY3VyYWN5UmVjb3JkKTsKKyAgICAgICAgICAgIHRyYW5zbGF0aW9uVGFibGVWYWxpZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIERFVklDRV9PUklFTlRBVElPTjoKKyAgICAgICAgICAgIHRyYW5zbGF0aW9uVGFibGVWYWxpZCA9IHByb2Nlc3NRdWF0ZXJuaW9uVXNhZ2UocGFja2V0cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDVVNUT006IHsKKyAgICAgICAgICAgIGlmICghbUZlYXR1cmVJbmZvLmlzQW5kcm9pZEN1c3RvbSkgeworICAgICAgICAgICAgICAgIExPR19FIDw8ICJJbnZhbGlkIGFuZHJvaWQgY3VzdG9tIHNlbnNvciIgPDwgTE9HX0VOREw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCBIaWRQYXJzZXI6OlJlcG9ydFBhY2tldCAqcFBhY2tldCA9IG51bGxwdHI7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCB1c2FnZXNbXSA9IHsKKyAgICAgICAgICAgICAgICBDVVNUT01fVkFMVUVfMSwgQ1VTVE9NX1ZBTFVFXzIsIENVU1RPTV9WQUxVRV8zLAorICAgICAgICAgICAgICAgIENVU1RPTV9WQUxVRV80LCBDVVNUT01fVkFMVUVfNSwgQ1VTVE9NX1ZBTFVFXzYKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnBhY2tldCA6IHBhY2tldHMpIHsKKyAgICAgICAgICAgICAgICBpZiAocGFja2V0LnR5cGUgPT0gSGlkUGFyc2VyOjpSRVBPUlRfVFlQRV9JTlBVVCAmJiBzdGQ6OmFueV9vZigKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldC5yZXBvcnRzLmJlZ2luKCksIHBhY2tldC5yZXBvcnRzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgWyZ1c2FnZXNdIChjb25zdCBIaWRQYXJzZXI6OlJlcG9ydEl0ZW0gJmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpmaW5kKHN0ZDo6YmVnaW4odXNhZ2VzKSwgc3RkOjplbmQodXNhZ2VzKSwgZC51c2FnZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IHN0ZDo6ZW5kKHVzYWdlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9KSkgeworICAgICAgICAgICAgICAgICAgICBwUGFja2V0ID0gJnBhY2tldDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocFBhY2tldCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgTE9HX0UgPDwgIkNhbm5vdCBmaW5kIENVU1RPTV9WQUxVRV9YIGluIGN1c3RvbSBzZW5zb3IiIDw8IExPR19FTkRMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkb3VibGUgcmFuZ2UgPSAwOworICAgICAgICAgICAgZG91YmxlIHJlc29sdXRpb24gPSAxOworCisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmRpZ2VzdCA6IHBQYWNrZXQtPnJlcG9ydHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlnZXN0Lm1pblJhdyA+PSBkaWdlc3QubWF4UmF3KSB7CisgICAgICAgICAgICAgICAgICAgIExPR19FIDw8ICJDdXN0b21lIHVzYWdlICIgPDwgZGlnZXN0LnVzYWdlIDw8ICIsIG1pbiBtdXN0IDwgbWF4IiA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghZGlnZXN0LmlzQnl0ZUFsaWduZWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGRpZ2VzdC5iaXRTaXplICE9IDggJiYgZGlnZXN0LmJpdFNpemUgIT0gMTYgJiYgZGlnZXN0LmJpdFNpemUgIT0gMzIpKSB7CisgICAgICAgICAgICAgICAgICAgIExPR19FIDw8ICJDdXN0b21lIHVzYWdlICIgPDwgc3RkOjpoZXggPDwgZGlnZXN0LnVzYWdlIDw8IHN0ZDo6aGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGVhY2ggaW5wdXQgbXVzdCBiZSA4LzE2LzMyIGJpdHMgYW5kIG11c3QgYWxpZ24gdG8gYnl0ZSBib3VuZGFyeSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgTE9HX0VOREw7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBSZXBvcnRUcmFuc2xhdGVSZWNvcmQgcmVjb3JkID0geworICAgICAgICAgICAgICAgICAgICAubWluVmFsdWUgPSBkaWdlc3QubWluUmF3LAorICAgICAgICAgICAgICAgICAgICAubWF4VmFsdWUgPSBkaWdlc3QubWF4UmF3LAorICAgICAgICAgICAgICAgICAgICAuYnl0ZU9mZnNldCA9IGRpZ2VzdC5iaXRPZmZzZXQgLyA4LAorICAgICAgICAgICAgICAgICAgICAuYnl0ZVNpemUgPSBkaWdlc3QuYml0U2l6ZSAvIDgsCisgICAgICAgICAgICAgICAgICAgIC5hID0gZGlnZXN0LmEsCisgICAgICAgICAgICAgICAgICAgIC5iID0gZGlnZXN0LmIsCisgICAgICAgICAgICAgICAgICAgIC50eXBlID0gVFlQRV9GTE9BVAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgLy8ga2VlcCB0cmFjayBvZiByYW5nZSBhbmQgcmVzb2x1dGlvbgorICAgICAgICAgICAgICAgIHJhbmdlID0gc3RkOjptYXgoc3RkOjptYXgoc3RkOjphYnMoKGRpZ2VzdC5tYXhSYXcgKyBkaWdlc3QuYikgKiBkaWdlc3QuYSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmFicygoZGlnZXN0Lm1pblJhdyArIGRpZ2VzdC5iKSAqIGRpZ2VzdC5hKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSk7CisgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiA9IHN0ZDo6bWluKGRpZ2VzdC5hLCByZXNvbHV0aW9uKTsKKworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGlnZXN0LmNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1UcmFuc2xhdGVUYWJsZS5zaXplKCkgPT0gMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR19JIDw8ICJDdXN0b20gdXNhZ2UgaGFzIG1vcmUgdGhhbiAxNiBpbnB1dHMsIGlnbm9yZSB0aGUgcmVzdCIgPDwgTE9HX0VOREw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZWNvcmQuaW5kZXggPSBtVHJhbnNsYXRlVGFibGUuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBtVHJhbnNsYXRlVGFibGUucHVzaF9iYWNrKHJlY29yZCk7CisgICAgICAgICAgICAgICAgICAgIHJlY29yZC5ieXRlT2Zmc2V0ICs9IGRpZ2VzdC5iaXRTaXplIC8gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1UcmFuc2xhdGVUYWJsZS5zaXplKCkgPT0gMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUZlYXR1cmVJbmZvLm1heFJhbmdlID0gcmFuZ2U7CisgICAgICAgICAgICBtRmVhdHVyZUluZm8ucmVzb2x1dGlvbiA9IHJlc29sdXRpb247CisgICAgICAgICAgICBtSW5wdXRSZXBvcnRJZCA9IHBQYWNrZXQtPmlkOworICAgICAgICAgICAgdHJhbnNsYXRpb25UYWJsZVZhbGlkID0gIW1UcmFuc2xhdGVUYWJsZS5lbXB0eSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19JIDw8ICJ1bnN1cHBvcnRlZCBzZW5zb3IgdXNhZ2UgIiA8PCB1c2FnZSA8PCBMT0dfRU5ETDsKKyAgICB9CisKKyAgICBib29sIHNlbnNvclZhbGlkID0gdmFsaWRhdGVGZWF0dXJlVmFsdWVBbmRCdWlsZFNlbnNvcigpOworICAgIG1WYWxpZCA9IHRyYW5zbGF0aW9uVGFibGVWYWxpZCAmJiBzZW5zb3JWYWxpZDsKKyAgICBMT0dfViA8PCAiSGlkUmF3U2Vuc29yIGluaXQsIHRyYW5zbGF0aW9uVGFibGVWYWxpZDogIiA8PCB0cmFuc2xhdGlvblRhYmxlVmFsaWQKKyAgICAgICAgICA8PCAiLCBzZW5zb3JWYWxpZDogIiA8PCBzZW5zb3JWYWxpZCA8PCBMT0dfRU5ETDsKK30KKworYm9vbCBIaWRSYXdTZW5zb3I6OnByb2Nlc3NRdWF0ZXJuaW9uVXNhZ2UoY29uc3Qgc3RkOjp2ZWN0b3I8SGlkUGFyc2VyOjpSZXBvcnRQYWNrZXQ+ICZwYWNrZXRzKSB7CisgICAgY29uc3QgSGlkUGFyc2VyOjpSZXBvcnRJdGVtICpwUmVwb3J0UXVhdGVybmlvbgorICAgICAgICAgICAgPSBmaW5kKHBhY2tldHMsCisgICAgICAgICAgICAgICAgICAgSGlkOjpTZW5zb3I6OlJlcG9ydFVzYWdlOjpPUklFTlRBVElPTl9RVUFURVJOSU9OLAorICAgICAgICAgICAgICAgICAgIEhpZFBhcnNlcjo6UkVQT1JUX1RZUEVfSU5QVVQpOworCisgICAgaWYgKHBSZXBvcnRRdWF0ZXJuaW9uID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IEhpZFBhcnNlcjo6UmVwb3J0SXRlbSAmcXVhdCA9ICpwUmVwb3J0UXVhdGVybmlvbjsKKyAgICBpZiAoKHF1YXQuYml0U2l6ZSAhPSAxNiAmJiBxdWF0LmJpdFNpemUgIT0gMzIpIHx8ICFxdWF0LmlzQnl0ZUFsaWduZWQoKSkgeworICAgICAgICBMT0dfRSA8PCAiUXVhdGVybmlvbiB1c2FnZSBpbnB1dCBtdXN0IGJlIDE2IG9yIDMyIGJpdHMgYW5kIGFsaWduZWQgYXQgYnl0ZSBib3VuZGFyeSIgPDwgTE9HX0VOREw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBkb3VibGUgbWluLCBtYXg7CisgICAgcXVhdC5kZWNvZGUocXVhdC5tYXNrKHF1YXQubWluUmF3KSwgJm1pbik7CisgICAgcXVhdC5kZWNvZGUocXVhdC5tYXNrKHF1YXQubWF4UmF3KSwgJm1heCk7CisgICAgaWYgKHF1YXQuY291bnQgIT0gNCB8fCBtaW4gPiAtMSB8fCBtYXggPCAxKSB7CisgICAgICAgIExPR19FIDw8ICJRdWF0ZXJuaW9uIHVzYWdlIG5lZWQgNCBpbnB1dHMgd2l0aCByYW5nZSBbLTEsIDFdIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChxdWF0Lm1pblJhdyA+IHF1YXQubWF4UmF3KSB7CisgICAgICAgIExPR19FIDw8ICJRdWF0ZXJuaW9uIHVzYWdlIG1pbiBtdXN0IDw9IG1heCIgPDwgTE9HX0VOREw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBSZXBvcnRUcmFuc2xhdGVSZWNvcmQgcmVjb3JkID0geworICAgICAgICAubWluVmFsdWUgPSBxdWF0Lm1pblJhdywKKyAgICAgICAgLm1heFZhbHVlID0gcXVhdC5tYXhSYXcsCisgICAgICAgIC5ieXRlT2Zmc2V0ID0gcXVhdC5iaXRPZmZzZXQgLyA4LAorICAgICAgICAuYnl0ZVNpemUgPSBxdWF0LmJpdFNpemUgLyA4LAorICAgICAgICAuYiA9IHF1YXQuYiwKKyAgICAgICAgLnR5cGUgPSBUWVBFX0ZMT0FULAorICAgIH07CisKKyAgICAvLyBBbmRyb2lkIFggWSBaIG1hcHMgdG8gSElEIFggLVogWQorICAgIC8vIEFuZHJvaWQgb3JkZXIgeHl6dywgSElEIG9yZGVyIHd4eXoKKyAgICAvLyBYCisgICAgcmVjb3JkLmluZGV4ID0gMDsKKyAgICByZWNvcmQuYSA9IHF1YXQuYTsKKyAgICByZWNvcmQuYnl0ZU9mZnNldCA9IChxdWF0LmJpdE9mZnNldCArIHF1YXQuYml0U2l6ZSkgLyA4OworICAgIG1UcmFuc2xhdGVUYWJsZS5wdXNoX2JhY2socmVjb3JkKTsKKyAgICAvLyBZCisgICAgcmVjb3JkLmluZGV4ID0gMTsKKyAgICByZWNvcmQuYSA9IC1xdWF0LmE7CisgICAgcmVjb3JkLmJ5dGVPZmZzZXQgPSAocXVhdC5iaXRPZmZzZXQgKyAzICogcXVhdC5iaXRTaXplKSAvIDg7CisgICAgbVRyYW5zbGF0ZVRhYmxlLnB1c2hfYmFjayhyZWNvcmQpOworICAgIC8vIFoKKyAgICByZWNvcmQuaW5kZXggPSAyOworICAgIHJlY29yZC5hID0gcXVhdC5hOworICAgIHJlY29yZC5ieXRlT2Zmc2V0ID0gKHF1YXQuYml0T2Zmc2V0ICsgMiAqIHF1YXQuYml0U2l6ZSkgLyA4OworICAgIG1UcmFuc2xhdGVUYWJsZS5wdXNoX2JhY2socmVjb3JkKTsKKyAgICAvLyBXCisgICAgcmVjb3JkLmluZGV4ID0gMzsKKyAgICByZWNvcmQuYSA9IHF1YXQuYTsKKyAgICByZWNvcmQuYnl0ZU9mZnNldCA9IHF1YXQuYml0T2Zmc2V0IC8gODsKKyAgICBtVHJhbnNsYXRlVGFibGUucHVzaF9iYWNrKHJlY29yZCk7CisKKyAgICBtRmVhdHVyZUluZm8udHlwZVN0cmluZyA9IFNFTlNPUl9TVFJJTkdfVFlQRV9ST1RBVElPTl9WRUNUT1I7CisgICAgbUZlYXR1cmVJbmZvLnR5cGUgPSBTRU5TT1JfVFlQRV9ST1RBVElPTl9WRUNUT1I7CisgICAgbUZlYXR1cmVJbmZvLm1heFJhbmdlID0gMTsKKyAgICBtRmVhdHVyZUluZm8ucmVzb2x1dGlvbiA9IHF1YXQuYTsKKyAgICBtRmVhdHVyZUluZm8ucmVwb3J0TW9kZUZsYWcgPSBTRU5TT1JfRkxBR19DT05USU5VT1VTX01PREU7CisKKyAgICBtSW5wdXRSZXBvcnRJZCA9IHF1YXQuaWQ7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBIaWRSYXdTZW5zb3I6OnByb2Nlc3NUcmlBeGlzVXNhZ2UoY29uc3Qgc3RkOjp2ZWN0b3I8SGlkUGFyc2VyOjpSZXBvcnRQYWNrZXQ+ICZwYWNrZXRzLAorICAgICAgICB1aW50MzJfdCB1c2FnZVgsIHVpbnQzMl90IHVzYWdlWSwgdWludDMyX3QgdXNhZ2VaLCBkb3VibGUgZGVmYXVsdFNjYWxpbmcpIHsKKyAgICBjb25zdCBIaWRQYXJzZXI6OlJlcG9ydEl0ZW0gKnBSZXBvcnRYID0gZmluZChwYWNrZXRzLCB1c2FnZVgsIEhpZFBhcnNlcjo6UkVQT1JUX1RZUEVfSU5QVVQpOworICAgIGNvbnN0IEhpZFBhcnNlcjo6UmVwb3J0SXRlbSAqcFJlcG9ydFkgPSBmaW5kKHBhY2tldHMsIHVzYWdlWSwgSGlkUGFyc2VyOjpSRVBPUlRfVFlQRV9JTlBVVCk7CisgICAgY29uc3QgSGlkUGFyc2VyOjpSZXBvcnRJdGVtICpwUmVwb3J0WiA9IGZpbmQocGFja2V0cywgdXNhZ2VaLCBIaWRQYXJzZXI6OlJFUE9SVF9UWVBFX0lOUFVUKTsKKworICAgIGlmIChwUmVwb3J0WCA9PSBudWxscHRyIHx8IHBSZXBvcnRZID09IG51bGxwdHJ8fCBwUmVwb3J0WiA9PSBudWxscHRyKSB7CisgICAgICAgIExPR19FIDw8ICJUaHJlZSBheGlzIHNlbnNvciBkb2VzIG5vdCBmaW5kIGFsbCAzIGF4aXMiIDw8IExPR19FTkRMOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgSGlkUGFyc2VyOjpSZXBvcnRJdGVtICZyZXBvcnRYID0gKnBSZXBvcnRYOworICAgIGNvbnN0IEhpZFBhcnNlcjo6UmVwb3J0SXRlbSAmcmVwb3J0WSA9ICpwUmVwb3J0WTsKKyAgICBjb25zdCBIaWRQYXJzZXI6OlJlcG9ydEl0ZW0gJnJlcG9ydFogPSAqcFJlcG9ydFo7CisgICAgaWYgKHJlcG9ydFguaWQgIT0gcmVwb3J0WS5pZCB8fCByZXBvcnRZLmlkICE9IHJlcG9ydFouaWQpIHsKKyAgICAgICAgTE9HX0UgPDwgIkFsbCAzIGF4aXMgc2hvdWxkIGJlIGluIHRoZSBzYW1lIHJlcG9ydCIgPDwgTE9HX0VOREw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHJlcG9ydFgubWluUmF3ID49IHJlcG9ydFgubWF4UmF3CisgICAgICAgICAgICB8fCByZXBvcnRYLm1pblJhdyAhPSByZXBvcnRZLm1pblJhdworICAgICAgICAgICAgfHwgcmVwb3J0WC5tYXhSYXcgIT0gcmVwb3J0WS5tYXhSYXcKKyAgICAgICAgICAgIHx8IHJlcG9ydFkubWluUmF3ICE9IHJlcG9ydFoubWluUmF3CisgICAgICAgICAgICB8fCByZXBvcnRZLm1heFJhdyAhPSByZXBvcnRaLm1heFJhdykgeworICAgICAgICBMT0dfRSA8PCAiQWxsIDMgYXhpcyBzaG91bGQgaGF2ZSBzYW1lIG1pbiBhbmQgbWF4IHZhbHVlIGFuZCBtaW4gbXVzdCA8IG1heCIgPDwgTE9HX0VOREw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHJlcG9ydFguYSAhPSByZXBvcnRZLmEgfHwgcmVwb3J0WS5hICE9IHJlcG9ydFkuYSkgeworICAgICAgICBMT0dfRSA8PCAiQWxsIDMgYXhpcyBzaG91bGQgaGF2ZSBzYW1lIHJlc29sdXRpb24iIDw8IExPR19FTkRMOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChyZXBvcnRYLmNvdW50ICE9IDEgfHwgcmVwb3J0WS5jb3VudCAhPSAxIHx8IHJlcG9ydFouY291bnQgIT0gMQorICAgICAgICAgICAgfHwgKHJlcG9ydFguYml0U2l6ZSAhPSAxNiAmJiByZXBvcnRYLmJpdFNpemUgIT0gMzIpCisgICAgICAgICAgICB8fCByZXBvcnRYLmJpdFNpemUgIT0gcmVwb3J0WS5iaXRTaXplIHx8IHJlcG9ydFkuYml0U2l6ZSAhPSByZXBvcnRaLmJpdFNpemUKKyAgICAgICAgICAgIHx8ICFyZXBvcnRYLmlzQnl0ZUFsaWduZWQoKQorICAgICAgICAgICAgfHwgIXJlcG9ydFkuaXNCeXRlQWxpZ25lZCgpCisgICAgICAgICAgICB8fCAhcmVwb3J0Wi5pc0J5dGVBbGlnbmVkKCkgKSB7CisgICAgICAgIExPR19FIDw8ICJBbGwgMyBheGlzIHNob3VsZCBoYXZlIGNvdW50ID09IDEsIHNhbWUgc2l6ZSA9PSAxNiBvciAzMiAiCisgICAgICAgICAgICAgICJhbmQgYWxpZ24gYXQgYnl0ZSBib3VuZGFyeSIgPDwgTE9HX0VOREw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAocmVwb3J0WC51bml0ICE9IDAgfHwgcmVwb3J0WS51bml0ICE9IDAgfHwgcmVwb3J0Wi51bml0ICE9IDApIHsKKyAgICAgICAgTE9HX0UgPDwgIlNwZWNpZmllZCB1bml0IGZvciB1c2FnZSBpcyBub3Qgc3VwcG9ydGVkIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChyZXBvcnRYLmEgIT0gcmVwb3J0WS5hIHx8IHJlcG9ydFkuYSAhPSByZXBvcnRaLmEKKyAgICAgICAgfHwgcmVwb3J0WC5iICE9IHJlcG9ydFkuYiB8fCByZXBvcnRZLmIgIT0gcmVwb3J0Wi5iKSB7CisgICAgICAgIExPR19XIDw8ICJTY2FsaW5nIGZvciAzIGF4aXMgYXJlIGRpZmZlcmVudC4gSXQgaXMgcmVjb21tZW5kZWQgdG8ga2VlcCB0aGVtIHRoZSBzYW1lIiA8PCBMT0dfRU5ETDsKKyAgICB9CisKKyAgICAvLyBzZXQgZmVhdHVyZXMKKyAgICBtRmVhdHVyZUluZm8ubWF4UmFuZ2UgPSBzdGQ6Om1heCgKKyAgICAgICAgc3RkOjphYnMoKHJlcG9ydFgubWF4UmF3ICsgcmVwb3J0WC5iKSAqIHJlcG9ydFguYSksCisgICAgICAgIHN0ZDo6YWJzKChyZXBvcnRYLm1pblJhdyArIHJlcG9ydFguYikgKiByZXBvcnRYLmEpKTsKKyAgICBtRmVhdHVyZUluZm8ucmVzb2x1dGlvbiA9IHJlcG9ydFguYSAqIGRlZmF1bHRTY2FsaW5nOworICAgIG1GZWF0dXJlSW5mby5yZXBvcnRNb2RlRmxhZyA9IFNFTlNPUl9GTEFHX0NPTlRJTlVPVVNfTU9ERTsKKworICAgIFJlcG9ydFRyYW5zbGF0ZVJlY29yZCByZWNvcmQgPSB7CisgICAgICAgIC5taW5WYWx1ZSA9IHJlcG9ydFgubWluUmF3LAorICAgICAgICAubWF4VmFsdWUgPSByZXBvcnRYLm1heFJhdywKKyAgICAgICAgLmJ5dGVTaXplID0gcmVwb3J0WC5iaXRTaXplIC8gOCwKKyAgICAgICAgLnR5cGUgPSBUWVBFX0ZMT0FUCisgICAgfTsKKworICAgIC8vIFJlb3JkZXIgYW5kIHN3YXAgYXhpcworICAgIC8vCisgICAgLy8gSElEIGNsYXNzIGRldmljZXMgYXJlIGVuY291cmFnZWQsIHdoZXJlIHBvc3NpYmxlLCB0byB1c2UgYSByaWdodC1oYW5kZWQKKyAgICAvLyBjb29yZGluYXRlIHN5c3RlbS4gSWYgYSB1c2VyIGlzIGZhY2luZyBhIGRldmljZSwgcmVwb3J0IHZhbHVlcyBzaG91bGQgaW5jcmVhc2UgYXMKKyAgICAvLyBjb250cm9scyBhcmUgbW92ZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0IChYKSwgZnJvbSBmYXIgdG8gbmVhciAoWSkgYW5kIGZyb20gaGlnaCB0bworICAgIC8vIGxvdyAoWikuCisgICAgLy8KKworICAgIC8vIEFuZHJvaWQgWCBheGlzID0gSGlkIFggYXhpcworICAgIHJlY29yZC5pbmRleCA9IDA7CisgICAgcmVjb3JkLmEgPSByZXBvcnRYLmEgKiBkZWZhdWx0U2NhbGluZzsKKyAgICByZWNvcmQuYiA9IHJlcG9ydFguYjsKKyAgICByZWNvcmQuYnl0ZU9mZnNldCA9IHJlcG9ydFguYml0T2Zmc2V0IC8gODsKKyAgICBtVHJhbnNsYXRlVGFibGUucHVzaF9iYWNrKHJlY29yZCk7CisKKyAgICAvLyBBbmRyb2lkIFkgYXhpcyA9IC0gSGlkIFogYXhpcworICAgIHJlY29yZC5pbmRleCA9IDE7CisgICAgcmVjb3JkLmEgPSAtcmVwb3J0Wi5hICogZGVmYXVsdFNjYWxpbmc7CisgICAgcmVjb3JkLmIgPSByZXBvcnRaLmI7CisgICAgcmVjb3JkLmJ5dGVPZmZzZXQgPSByZXBvcnRaLmJpdE9mZnNldCAvIDg7CisgICAgbVRyYW5zbGF0ZVRhYmxlLnB1c2hfYmFjayhyZWNvcmQpOworCisgICAgLy8gQW5kcm9pZCBaIGF4aXMgPSBIaWQgWSBheGlzCisgICAgcmVjb3JkLmluZGV4ID0gMjsKKyAgICByZWNvcmQuYSA9IHJlcG9ydFkuYSAqIGRlZmF1bHRTY2FsaW5nOworICAgIHJlY29yZC5iID0gcmVwb3J0WS5iOworICAgIHJlY29yZC5ieXRlT2Zmc2V0ID0gcmVwb3J0WS5iaXRPZmZzZXQgLyA4OworICAgIG1UcmFuc2xhdGVUYWJsZS5wdXNoX2JhY2socmVjb3JkKTsKKworICAgIG1JbnB1dFJlcG9ydElkID0gcmVwb3J0WC5pZDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgSGlkUGFyc2VyOjpSZXBvcnRJdGVtICpIaWRSYXdTZW5zb3I6OmZpbmQoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEhpZFBhcnNlcjo6UmVwb3J0UGFja2V0PiAmcGFja2V0cywKKyAgICAgICAgdW5zaWduZWQgaW50IHVzYWdlLCBpbnQgdHlwZSwgaW50IGlkKSB7CisgICAgZm9yIChjb25zdCBhdXRvICZwYWNrZXQgOiBwYWNrZXRzKSB7CisgICAgICAgIGlmIChwYWNrZXQudHlwZSAhPSB0eXBlKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBhdXRvIGkgPSBzdGQ6OmZpbmRfaWYoCisgICAgICAgICAgICAgICAgcGFja2V0LnJlcG9ydHMuYmVnaW4oKSwgcGFja2V0LnJlcG9ydHMuZW5kKCksCisgICAgICAgICAgICAgICAgW3VzYWdlLCBpZF0oY29uc3QgSGlkUGFyc2VyOjpSZXBvcnRJdGVtICZwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwLnVzYWdlID09IHVzYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGlkID09IC0xIHx8IHAuaWQgPT0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihpZCkpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoaSAhPSBwYWNrZXQucmVwb3J0cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuICYoKmkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfTsKKwordm9pZCBIaWRSYXdTZW5zb3I6OmluaXRGZWF0dXJlVmFsdWVGcm9tSGlkRGV2aWNlSW5mbygKKyAgICAgICAgRmVhdHVyZVZhbHVlICpmZWF0dXJlVmFsdWUsIGNvbnN0IEhpZERldmljZTo6SGlkRGV2aWNlSW5mbyAmaW5mbykgeworICAgIGZlYXR1cmVWYWx1ZS0+bmFtZSA9IGluZm8ubmFtZTsKKworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzczsKKyAgICBzcyA8PCBpbmZvLmJ1c1R5cGUgPDwgIiAiCisgICAgICAgPDwgc3RkOjpoZXggPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KDQpIDw8IGluZm8udmVuZG9ySWQKKyAgICAgICA8PCAiOiIgPDwgc3RkOjpzZXR3KDQpIDw8IGluZm8ucHJvZHVjdElkOworICAgIGZlYXR1cmVWYWx1ZS0+dmVuZG9yID0gc3Muc3RyKCk7CisKKyAgICBmZWF0dXJlVmFsdWUtPnBlcm1pc3Npb24gPSAiIjsKKyAgICBmZWF0dXJlVmFsdWUtPnR5cGVTdHJpbmcgPSAiIjsKKyAgICBmZWF0dXJlVmFsdWUtPnR5cGUgPSAtMTsgLy8gaW52YWxpZCB0eXBlCisgICAgZmVhdHVyZVZhbHVlLT52ZXJzaW9uID0gMTsKKworICAgIGZlYXR1cmVWYWx1ZS0+bWF4UmFuZ2UgPSAtMS5mOworICAgIGZlYXR1cmVWYWx1ZS0+cmVzb2x1dGlvbiA9IEZMVF9NQVg7CisgICAgZmVhdHVyZVZhbHVlLT5wb3dlciA9IDEuZjsgLy8gZGVmYXVsdCB2YWx1ZSwgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIHNvdXJjZSB5ZXQKKworICAgIGZlYXR1cmVWYWx1ZS0+bWluRGVsYXkgPSAwOworICAgIGZlYXR1cmVWYWx1ZS0+bWF4RGVsYXkgPSAwOworCisgICAgZmVhdHVyZVZhbHVlLT5maWZvU2l6ZSA9IDA7CisgICAgZmVhdHVyZVZhbHVlLT5maWZvTWF4U2l6ZSA9IDA7CisKKyAgICBmZWF0dXJlVmFsdWUtPnJlcG9ydE1vZGVGbGFnID0gU0VOU09SX0ZMQUdfU1BFQ0lBTF9SRVBPUlRJTkdfTU9ERTsKKyAgICBmZWF0dXJlVmFsdWUtPmlzV2FrZVVwID0gZmFsc2U7CisgICAgbWVtc2V0KGZlYXR1cmVWYWx1ZS0+dXVpZCwgMCwgc2l6ZW9mKGZlYXR1cmVWYWx1ZS0+dXVpZCkpOworICAgIGZlYXR1cmVWYWx1ZS0+aXNBbmRyb2lkQ3VzdG9tID0gZmFsc2U7Cit9CisKK2Jvb2wgSGlkUmF3U2Vuc29yOjpwb3B1bGF0ZUZlYXR1cmVWYWx1ZUZyb21GZWF0dXJlUmVwb3J0KAorICAgICAgICBGZWF0dXJlVmFsdWUgKmZlYXR1cmVWYWx1ZSwgY29uc3Qgc3RkOjp2ZWN0b3I8SGlkUGFyc2VyOjpSZXBvcnRQYWNrZXQ+ICZwYWNrZXRzKSB7CisgICAgU1AoSGlkRGV2aWNlKSBkZXZpY2UgPSBQUk9NT1RFKG1EZXZpY2UpOworICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmZmVyOworICAgIGZvciAoY29uc3QgYXV0byAmcGFja2V0IDogcGFja2V0cykgeworICAgICAgICBpZiAocGFja2V0LnR5cGUgIT0gSGlkUGFyc2VyOjpSRVBPUlRfVFlQRV9GRUFUVVJFKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZGV2aWNlLT5nZXRGZWF0dXJlKHBhY2tldC5pZCwgJmJ1ZmZlcikpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzdHJpbmcgc3RyOworICAgICAgICB1c2luZyBuYW1lc3BhY2UgSGlkOjpTZW5zb3I6OlByb3BlcnR5VXNhZ2U7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmIHIgOiBwYWNrZXQucmVwb3J0cykgeworICAgICAgICAgICAgc3dpdGNoIChyLnVzYWdlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBGUklFTkRMWV9OQU1FOgorICAgICAgICAgICAgICAgICAgICBpZiAoIXIuaXNCeXRlQWxpZ25lZCgpIHx8IHIuYml0U2l6ZSAhPSAxNiB8fCByLmNvdW50IDwgMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52YWxpZCBmcmllbmRseSBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZGVjb2RlU3RyaW5nKHIsIGJ1ZmZlciwgJnN0cikgJiYgIXN0ci5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlVmFsdWUtPm5hbWUgPSBzdHI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTRU5TT1JfTUFOVUZBQ1RVUkVSOgorICAgICAgICAgICAgICAgICAgICBpZiAoIXIuaXNCeXRlQWxpZ25lZCgpIHx8IHIuYml0U2l6ZSAhPSAxNiB8fCByLmNvdW50IDwgMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52YWxpZCBtYW51ZmFjdHVyZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWNvZGVTdHJpbmcociwgYnVmZmVyLCAmc3RyKSAmJiAhc3RyLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVWYWx1ZS0+dmVuZG9yID0gc3RyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUEVSU0lTVEVOVF9VTklRVUVfSUQ6CisgICAgICAgICAgICAgICAgICAgIGlmICghci5pc0J5dGVBbGlnbmVkKCkgfHwgci5iaXRTaXplICE9IDE2IHx8IHIuY291bnQgPCAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZhbGlkIHVuaXF1ZSBpZCBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWNvZGVTdHJpbmcociwgYnVmZmVyLCAmc3RyKSAmJiAhc3RyLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVWYWx1ZS0+dW5pcXVlSWQgPSBzdHI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTRU5TT1JfREVTQ1JJUFRJT046CisgICAgICAgICAgICAgICAgICAgIGlmICghci5pc0J5dGVBbGlnbmVkKCkgfHwgci5iaXRTaXplICE9IDE2IHx8IHIuY291bnQgPCAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHIuYml0T2Zmc2V0IC8gOCArIHIuY291bnQgKiAyKSA+IGJ1ZmZlci5zaXplKCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZhbGlkIGRlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZGVjb2RlU3RyaW5nKHIsIGJ1ZmZlciwgJnN0cikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1GZWF0dXJlSW5mby5pc0FuZHJvaWRDdXN0b20gPSBkZXRlY3RBbmRyb2lkQ3VzdG9tU2Vuc29yKHN0cik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90IGNhcmUgYWJvdXQgb3RoZXJzCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEhpZFJhd1NlbnNvcjo6dmFsaWRhdGVGZWF0dXJlVmFsdWVBbmRCdWlsZFNlbnNvcigpIHsKKyAgICBpZiAobUZlYXR1cmVJbmZvLm5hbWUuZW1wdHkoKSB8fCBtRmVhdHVyZUluZm8udmVuZG9yLmVtcHR5KCkgfHwgbUZlYXR1cmVJbmZvLnR5cGVTdHJpbmcuZW1wdHkoKQorICAgICAgICAgICAgfHwgbUZlYXR1cmVJbmZvLnR5cGUgPD0gMCB8fCBtRmVhdHVyZUluZm8ubWF4UmFuZ2UgPD0gMAorICAgICAgICAgICAgfHwgbUZlYXR1cmVJbmZvLnJlc29sdXRpb24gPD0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3dpdGNoIChtRmVhdHVyZUluZm8ucmVwb3J0TW9kZUZsYWcpIHsKKyAgICAgICAgY2FzZSBTRU5TT1JfRkxBR19DT05USU5VT1VTX01PREU6CisgICAgICAgIGNhc2UgU0VOU09SX0ZMQUdfT05fQ0hBTkdFX01PREU6CisgICAgICAgICAgICBpZiAobUZlYXR1cmVJbmZvLm1pbkRlbGF5IDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtRmVhdHVyZUluZm8ubWF4RGVsYXkgIT0gMCAmJiBtRmVhdHVyZUluZm8ubWF4RGVsYXkgPCBtRmVhdHVyZUluZm8ubWluRGVsYXkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTRU5TT1JfRkxBR19PTkVfU0hPVF9NT0RFOgorICAgICAgICAgICAgaWYgKG1GZWF0dXJlSW5mby5taW5EZWxheSAhPSAtMSAmJiBtRmVhdHVyZUluZm8ubWF4RGVsYXkgIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNFTlNPUl9GTEFHX1NQRUNJQUxfUkVQT1JUSU5HX01PREU6CisgICAgICAgICAgICBpZiAobUZlYXR1cmVJbmZvLm1pbkRlbGF5ICE9IC0xICYmIG1GZWF0dXJlSW5mby5tYXhEZWxheSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAobUZlYXR1cmVJbmZvLmZpZm9NYXhTaXplIDwgbUZlYXR1cmVJbmZvLmZpZm9TaXplKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBpbml0aWFsaXplIHV1aWQgZmllbGQsIHVzZSBuYW1lLCB2ZW5kb3IgYW5kIHVuaXF1ZUlkCisgICAgaWYgKG1GZWF0dXJlSW5mby5uYW1lLnNpemUoKSA+PSA0CisgICAgICAgICAgICAmJiBtRmVhdHVyZUluZm8udmVuZG9yLnNpemUoKSA+PSA0CisgICAgICAgICAgICAmJiBtRmVhdHVyZUluZm8udHlwZVN0cmluZy5zaXplKCkgPj0gNAorICAgICAgICAgICAgJiYgbUZlYXR1cmVJbmZvLnVuaXF1ZUlkLnNpemUoKSA+PSA0KSB7CisgICAgICAgIHVpbnQzMl90IHRtcFs0XSwgaDsKKyAgICAgICAgc3RkOjpoYXNoPHN0ZDo6c3RyaW5nPiBzdHJpbmdIYXNoOworICAgICAgICBoID0gc3RyaW5nSGFzaChtRmVhdHVyZUluZm8udW5pcXVlSWQpOworICAgICAgICB0bXBbMF0gPSBzdHJpbmdIYXNoKG1GZWF0dXJlSW5mby5uYW1lKSBeIGg7CisgICAgICAgIHRtcFsxXSA9IHN0cmluZ0hhc2gobUZlYXR1cmVJbmZvLnZlbmRvcikgXiBoOworICAgICAgICB0bXBbMl0gPSBzdHJpbmdIYXNoKG1GZWF0dXJlSW5mby50eXBlU3RyaW5nKSBeIGg7CisgICAgICAgIHRtcFszXSA9IHRtcFswXSBeIHRtcFsxXSBeIHRtcFsyXTsKKyAgICAgICAgbWVtY3B5KG1GZWF0dXJlSW5mby51dWlkLCB0bXAsIHNpemVvZihtRmVhdHVyZUluZm8udXVpZCkpOworICAgIH0KKworICAgIG1TZW5zb3IgPSAoc2Vuc29yX3QpIHsKKyAgICAgICAgbUZlYXR1cmVJbmZvLm5hbWUuY19zdHIoKSwgICAgICAgICAgICAgICAgIC8vIG5hbWUKKyAgICAgICAgbUZlYXR1cmVJbmZvLnZlbmRvci5jX3N0cigpLCAgICAgICAgICAgICAgIC8vIHZlbmRvcgorICAgICAgICBtRmVhdHVyZUluZm8udmVyc2lvbiwgICAgICAgICAgICAgICAgICAgICAgLy8gdmVyc2lvbgorICAgICAgICAtMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlLCBkdW1teSBudW1iZXIgaGVyZQorICAgICAgICBtRmVhdHVyZUluZm8udHlwZSwKKyAgICAgICAgbUZlYXR1cmVJbmZvLm1heFJhbmdlLCAgICAgICAgICAgICAgICAgICAgIC8vIG1heFJhbmdlCisgICAgICAgIG1GZWF0dXJlSW5mby5yZXNvbHV0aW9uLCAgICAgICAgICAgICAgICAgICAvLyByZXNvbHV0aW9uCisgICAgICAgIG1GZWF0dXJlSW5mby5wb3dlciwgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3dlcgorICAgICAgICBtRmVhdHVyZUluZm8ubWluRGVsYXksICAgICAgICAgICAgICAgICAgICAgLy8gbWluRGVsYXkKKyAgICAgICAgKHVpbnQzMl90KW1GZWF0dXJlSW5mby5maWZvU2l6ZSwgICAgICAgICAgIC8vIGZpZm9SZXNlcnZlZEV2ZW50Q291bnQKKyAgICAgICAgKHVpbnQzMl90KW1GZWF0dXJlSW5mby5maWZvTWF4U2l6ZSwgICAgICAgIC8vIGZpZm9NYXhFdmVudENvdW50CisgICAgICAgIG1GZWF0dXJlSW5mby50eXBlU3RyaW5nLmNfc3RyKCksICAgICAgICAgICAvLyB0eXBlIHN0cmluZworICAgICAgICBtRmVhdHVyZUluZm8ucGVybWlzc2lvbi5jX3N0cigpLCAgICAgICAgICAgLy8gcmVxdWlyZWRQZXJtaXNzaW9uCisgICAgICAgIChsb25nKW1GZWF0dXJlSW5mby5tYXhEZWxheSwgICAgICAgICAgICAgICAvLyBtYXhEZWxheQorICAgICAgICBtRmVhdHVyZUluZm8ucmVwb3J0TW9kZUZsYWcgfCAobUZlYXR1cmVJbmZvLmlzV2FrZVVwID8gMSA6IDApLAorICAgICAgICB7IE5VTEwsIE5VTEwgfQorICAgIH07CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSGlkUmF3U2Vuc29yOjpkZWNvZGVTdHJpbmcoCisgICAgICAgIGNvbnN0IEhpZFBhcnNlcjo6UmVwb3J0SXRlbSAmcmVwb3J0LCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmYnVmZmVyLCBzdGQ6OnN0cmluZyAqZCkgeworICAgIGlmICghcmVwb3J0LmlzQnl0ZUFsaWduZWQoKSB8fCByZXBvcnQuYml0U2l6ZSAhPSAxNiB8fCByZXBvcnQuY291bnQgPCAxKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzaXplX3Qgb2Zmc2V0ID0gcmVwb3J0LmJpdE9mZnNldCAvIDg7CisgICAgaWYgKG9mZnNldCArIHJlcG9ydC5jb3VudCAqIDIgPiBidWZmZXIuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gZGF0YShyZXBvcnQuY291bnQpOworICAgIGF1dG8gaSA9IGRhdGEuYmVnaW4oKTsKKyAgICBhdXRvIGogPSBidWZmZXIuYmVnaW4oKSArIG9mZnNldDsKKyAgICBmb3IgKCA7IGkgIT0gZGF0YS5lbmQoKTsgKytpLCBqICs9IHNpemVvZih1aW50MTZfdCkpIHsKKyAgICAgICAgLy8gaGlkIHNwZWNpZmllZCBsaXR0bGUgZW5kaWFuCisgICAgICAgICppID0gKmogKyAoKihqICsgMSkgPDwgOCk7CisgICAgfQorICAgIHN0ZDo6d3N0cmluZyB3c3RyKGRhdGEuYmVnaW4oKSwgZGF0YS5lbmQoKSk7CisKKyAgICBzdGQ6OndzdHJpbmdfY29udmVydDxzdGQ6OmNvZGVjdnRfdXRmODx3Y2hhcl90Piwgd2NoYXJfdD4gY29udmVydGVyOworICAgICpkID0gY29udmVydGVyLnRvX2J5dGVzKHdzdHIpOworICAgIHJldHVybiB0cnVlOworfQorCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3BsaXQoY29uc3Qgc3RkOjpzdHJpbmcgJnRleHQsIGNoYXIgc2VwKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHRva2VuczsKKyAgICBzaXplX3Qgc3RhcnQgPSAwLCBlbmQgPSAwOworICAgIHdoaWxlICgoZW5kID0gdGV4dC5maW5kKHNlcCwgc3RhcnQpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBpZiAoZW5kICE9IHN0YXJ0KSB7CisgICAgICAgICAgICB0b2tlbnMucHVzaF9iYWNrKHRleHQuc3Vic3RyKHN0YXJ0LCBlbmQgLSBzdGFydCkpOworICAgICAgICB9CisgICAgICAgIHN0YXJ0ID0gZW5kICsgMTsKKyAgICB9CisgICAgaWYgKGVuZCAhPSBzdGFydCkgeworICAgICAgICB0b2tlbnMucHVzaF9iYWNrKHRleHQuc3Vic3RyKHN0YXJ0KSk7CisgICAgfQorICAgIHJldHVybiB0b2tlbnM7Cit9CisKK2Jvb2wgSGlkUmF3U2Vuc29yOjpkZXRlY3RBbmRyb2lkQ3VzdG9tU2Vuc29yKGNvbnN0IHN0ZDo6c3RyaW5nICZkZXNjcmlwdGlvbikgeworICAgIHNpemVfdCBudWxsUG9zaXRpb24gPSBkZXNjcmlwdGlvbi5maW5kKCdcMCcpOworICAgIGlmIChudWxsUG9zaXRpb24gPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjb25zdCBzdGQ6OnN0cmluZyBwcmVmaXgoIiNBTkRST0lEIyIpOworICAgIGlmIChkZXNjcmlwdGlvbi5maW5kKHByZWZpeCwgbnVsbFBvc2l0aW9uICsgMSkgIT0gbnVsbFBvc2l0aW9uICsgMSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgc3RyKGRlc2NyaXB0aW9uLmNfc3RyKCkgKyBudWxsUG9zaXRpb24gKyAxICsgcHJlZml4LnNpemUoKSk7CisKKyAgICAvLyBGb3JtYXQgZm9yIHByZWRlZmluZWQgc2Vuc29yIHR5cGVzOgorICAgIC8vICNBTkRST0lEI25uLFtDfFh8VHxTXSxbQnwwXSxbV3xOXQorICAgIC8vIEZvcm1hdCBmb3IgdmVuZG9yIHR5cGUgc2Vuc29yCisgICAgLy8gI0FORFJPSUQjeHh4Lnl5eS56enosW0N8WHxUfFNdLFtCfDBdLFtXfE5dCisgICAgLy8KKyAgICAvLyBDOiBjb250aW51b3VzCisgICAgLy8gWDogb24tY2hhbmdlCisgICAgLy8gVDogb25lLXNob3QKKyAgICAvLyBTOiBzcGVjaWFsIHRyaWdnZXIKKyAgICAvLworICAgIC8vIEI6IGJvZHkgcGVybWlzc2lvbgorICAgIC8vIDA6IG5vIHBlcm1pc3Npb24gcmVxdWlyZWQKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc2VnbWVudHM7CisgICAgc2l6ZV90IHN0YXJ0ID0gMCwgZW5kID0gMDsKKyAgICB3aGlsZSAoKGVuZCA9IHN0ci5maW5kKCcsJywgc3RhcnQpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBpZiAoZW5kICE9IHN0YXJ0KSB7CisgICAgICAgICAgICBzZWdtZW50cy5wdXNoX2JhY2soc3RyLnN1YnN0cihzdGFydCwgZW5kIC0gc3RhcnQpKTsKKyAgICAgICAgfQorICAgICAgICBzdGFydCA9IGVuZCArIDE7CisgICAgfQorICAgIGlmIChlbmQgIT0gc3RhcnQpIHsKKyAgICAgICAgc2VnbWVudHMucHVzaF9iYWNrKHN0ci5zdWJzdHIoc3RhcnQpKTsKKyAgICB9CisKKyAgICBpZiAoc2VnbWVudHMuc2l6ZSgpIDwgNCkgeworICAgICAgICBMT0dfRSA8PCAiTm90IGVub3VnaCBzZWdtZW50cyBpbiBhbmRyb2lkIGN1c3RvbSBkZXNjcmlwdGlvbiIgPDwgTE9HX0VOREw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyB0eXBlCisgICAgYm9vbCB0eXBlUGFyc2VkID0gZmFsc2U7CisgICAgaWYgKCFzZWdtZW50c1swXS5lbXB0eSgpKSB7CisgICAgICAgIGlmICg6OmlzZGlnaXQoc2VnbWVudHNbMF1bMF0pKSB7CisgICAgICAgICAgICBpbnQgdHlwZSA9IDo6YXRvaShzZWdtZW50c1swXS5jX3N0cigpKTsKKyAgICAgICAgICAgIC8vIGFsbCBzdXBwb3J0ZWQgdHlwZXMgaGVyZQorICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTRU5TT1JfVFlQRV9IRUFSVF9SQVRFOgorICAgICAgICAgICAgICAgICAgICBtRmVhdHVyZUluZm8udHlwZSA9IFNFTlNPUl9UWVBFX0hFQVJUX1JBVEU7CisgICAgICAgICAgICAgICAgICAgIG1GZWF0dXJlSW5mby50eXBlU3RyaW5nID0gU0VOU09SX1NUUklOR19UWVBFX0hFQVJUX1JBVEU7CisgICAgICAgICAgICAgICAgICAgIHR5cGVQYXJzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNFTlNPUl9UWVBFX0FNQklFTlRfVEVNUEVSQVRVUkU6CisgICAgICAgICAgICAgICAgICAgIG1GZWF0dXJlSW5mby50eXBlID0gU0VOU09SX1RZUEVfQU1CSUVOVF9URU1QRVJBVFVSRTsKKyAgICAgICAgICAgICAgICAgICAgbUZlYXR1cmVJbmZvLnR5cGVTdHJpbmcgPSBTRU5TT1JfU1RSSU5HX1RZUEVfQU1CSUVOVF9URU1QRVJBVFVSRTsKKyAgICAgICAgICAgICAgICAgICAgdHlwZVBhcnNlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgY2FzZSBTRU5TT1JfVFlQRV9MSUdIVDoKKyAgICAgICAgICAgICAgICAgICAgbUZlYXR1cmVJbmZvLnR5cGUgPSBTRU5TT1JfVFlQRV9MSUdIVDsKKyAgICAgICAgICAgICAgICAgICAgbUZlYXR1cmVJbmZvLnR5cGVTdHJpbmcgPSBTRU5TT1JfU1RSSU5HX1RZUEVfTElHSFQ7CisgICAgICAgICAgICAgICAgICAgIHR5cGVQYXJzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNFTlNPUl9UWVBFX1BSRVNTVVJFOgorICAgICAgICAgICAgICAgICAgICBtRmVhdHVyZUluZm8udHlwZSA9IFNFTlNPUl9UWVBFX1BSRVNTVVJFOworICAgICAgICAgICAgICAgICAgICBtRmVhdHVyZUluZm8udHlwZVN0cmluZyA9IFNFTlNPUl9TVFJJTkdfVFlQRV9QUkVTU1VSRTsKKyAgICAgICAgICAgICAgICAgICAgdHlwZVBhcnNlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIExPR19XIDw8ICJBbmRyb2lkIHR5cGUgIiA8PCB0eXBlIDw8ICIgaGFzIG5vdCBiZWVuIHN1cHBvcnRlZCB5ZXQiIDw8IExPR19FTkRMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGFzc3VtZSBhIHh4eC55eXkuenp6IGZvcm1hdAorICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHM7CisgICAgICAgICAgICBib29sIGxhc3RJc0RvdCA9IHRydWU7CisgICAgICAgICAgICBmb3IgKGF1dG8gYyA6IHNlZ21lbnRzWzBdKSB7CisgICAgICAgICAgICAgICAgaWYgKDo6aXNhbHBoYShjKSkgeworICAgICAgICAgICAgICAgICAgICBzIDw8IHN0YXRpY19jYXN0PGNoYXI+KGMpOworICAgICAgICAgICAgICAgICAgICBsYXN0SXNEb3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFsYXN0SXNEb3QgJiYgYyA9PSAnLicpIHsKKyAgICAgICAgICAgICAgICAgICAgcyA8PCBzdGF0aWNfY2FzdDxjaGFyPihjKTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdElzRG90ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocy5zdHIoKSA9PSBzZWdtZW50c1swXSkgeworICAgICAgICAgICAgICAgIG1GZWF0dXJlSW5mby50eXBlID0gU0VOU09SX1RZUEVfREVWSUNFX1BSSVZBVEVfQkFTRTsKKyAgICAgICAgICAgICAgICBtRmVhdHVyZUluZm8udHlwZVN0cmluZyA9IENVU1RPTV9UWVBFX1BSRUZJWCArIHMuc3RyKCk7CisgICAgICAgICAgICAgICAgdHlwZVBhcnNlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyByZXBvcnRpbmcgdHlwZQorICAgIGJvb2wgcmVwb3J0aW5nTW9kZVBhcnNlZCA9IGZhbHNlOworICAgIGlmIChzZWdtZW50c1sxXS5zaXplKCkgPT0gMSkgeworICAgICAgICBzd2l0Y2ggKHNlZ21lbnRzWzFdWzBdKSB7CisgICAgICAgICAgICBjYXNlICdDJzoKKyAgICAgICAgICAgICAgICBtRmVhdHVyZUluZm8ucmVwb3J0TW9kZUZsYWcgPSBTRU5TT1JfRkxBR19DT05USU5VT1VTX01PREU7CisgICAgICAgICAgICAgICAgcmVwb3J0aW5nTW9kZVBhcnNlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdYJzoKKyAgICAgICAgICAgICAgICBtRmVhdHVyZUluZm8ucmVwb3J0TW9kZUZsYWcgPSBTRU5TT1JfRkxBR19PTl9DSEFOR0VfTU9ERTsKKyAgICAgICAgICAgICAgICByZXBvcnRpbmdNb2RlUGFyc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1QnOgorICAgICAgICAgICAgICAgIG1GZWF0dXJlSW5mby5yZXBvcnRNb2RlRmxhZyA9IFNFTlNPUl9GTEFHX09ORV9TSE9UX01PREU7CisgICAgICAgICAgICAgICAgcmVwb3J0aW5nTW9kZVBhcnNlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdTJzoKKyAgICAgICAgICAgICAgICBtRmVhdHVyZUluZm8ucmVwb3J0TW9kZUZsYWcgPSBTRU5TT1JfRkxBR19TUEVDSUFMX1JFUE9SVElOR19NT0RFOworICAgICAgICAgICAgICAgIHJlcG9ydGluZ01vZGVQYXJzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dfRSA8PCAiVW5kZWZpbmVkIHJlcG9ydGluZyBtb2RlIGRlc2lnbmF0aW9uICIgPDwgc2VnbWVudHNbMV0gPDwgTE9HX0VOREw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBwZXJtaXNzaW9uIHBhcnNlZAorICAgIGJvb2wgcGVybWlzc2lvblBhcnNlZCA9IGZhbHNlOworICAgIGlmIChzZWdtZW50c1syXS5zaXplKCkgPT0gMSkgeworICAgICAgICBzd2l0Y2ggKHNlZ21lbnRzWzJdWzBdKSB7CisgICAgICAgICAgICBjYXNlICdCJzoKKyAgICAgICAgICAgICAgICBtRmVhdHVyZUluZm8ucGVybWlzc2lvbiA9IFNFTlNPUl9QRVJNSVNTSU9OX0JPRFlfU0VOU09SUzsKKyAgICAgICAgICAgICAgICBwZXJtaXNzaW9uUGFyc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJzAnOgorICAgICAgICAgICAgICAgIG1GZWF0dXJlSW5mby5wZXJtaXNzaW9uID0gIiI7CisgICAgICAgICAgICAgICAgcGVybWlzc2lvblBhcnNlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR19FIDw8ICJVbmRlZmluZWQgcGVybWlzc2lvbiBkZXNpZ25hdGlvbiAiIDw8IHNlZ21lbnRzWzJdIDw8IExPR19FTkRMOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gd2FrZSB1cAorICAgIGJvb2wgd2FrZVVwUGFyc2VkID0gZmFsc2U7CisgICAgaWYgKHNlZ21lbnRzWzNdLnNpemUoKSA9PSAxKSB7CisgICAgICAgIHN3aXRjaCAoc2VnbWVudHNbM11bMF0pIHsKKyAgICAgICAgICAgIGNhc2UgJ1cnOgorICAgICAgICAgICAgICAgIG1GZWF0dXJlSW5mby5pc1dha2VVcCA9IHRydWU7CisgICAgICAgICAgICAgICAgd2FrZVVwUGFyc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ04nOgorICAgICAgICAgICAgICAgIG1GZWF0dXJlSW5mby5pc1dha2VVcCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHdha2VVcFBhcnNlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR19FIDw8ICJVbmRlZmluZWQgd2FrZSB1cCBkZXNpZ25hdGlvbiAiIDw8IHNlZ21lbnRzWzNdIDw8IExPR19FTkRMOworICAgICAgICB9CisgICAgfQorCisgICAgaW50IHJldCA9IHR5cGVQYXJzZWQgJiYgcmVwb3J0aW5nTW9kZVBhcnNlZCAmJiBwZXJtaXNzaW9uUGFyc2VkICYmIHdha2VVcFBhcnNlZDsKKyAgICBpZiAoIXJldCkgeworICAgICAgICBMT0dfRCA8PCAiZGV0ZWN0QW5kcm9pZEN1c3RvbVNlbnNvciB0eXBlUGFyc2VkOiAiIDw8IHR5cGVQYXJzZWQKKyAgICAgICAgICAgICAgPDwgIiByZXBvcnRpbmdNb2RlUGFyc2VkOiAiICA8PCByZXBvcnRpbmdNb2RlUGFyc2VkCisgICAgICAgICAgICAgIDw8ICIgcGVybWlzc2lvblBhcnNlZDogIiA8PCBwZXJtaXNzaW9uUGFyc2VkCisgICAgICAgICAgICAgIDw8ICIgd2FrZVVwUGFyc2VkOiAiIDw8IHdha2VVcFBhcnNlZCA8PCBMT0dfRU5ETDsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYm9vbCBIaWRSYXdTZW5zb3I6OmZpbmRTZW5zb3JDb250cm9sVXNhZ2UoY29uc3Qgc3RkOjp2ZWN0b3I8SGlkUGFyc2VyOjpSZXBvcnRQYWNrZXQ+ICZwYWNrZXRzKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIEhpZDo6U2Vuc29yOjpQcm9wZXJ0eVVzYWdlOworICAgIHVzaW5nIG5hbWVzcGFjZSBIaWQ6OlNlbnNvcjo6UmF3TWluTWF4OworCisgICAgLy9SRVBPUlRJTkdfU1RBVEUKKyAgICBjb25zdCBIaWRQYXJzZXI6OlJlcG9ydEl0ZW0gKnJlcG9ydGluZ1N0YXRlCisgICAgICAgICAgICA9IGZpbmQocGFja2V0cywgUkVQT1JUSU5HX1NUQVRFLCBIaWRQYXJzZXI6OlJFUE9SVF9UWVBFX0ZFQVRVUkUpOworCisgICAgaWYgKHJlcG9ydGluZ1N0YXRlID09IG51bGxwdHIKKyAgICAgICAgICAgIHx8ICFyZXBvcnRpbmdTdGF0ZS0+aXNCeXRlQWxpZ25lZCgpCisgICAgICAgICAgICB8fCByZXBvcnRpbmdTdGF0ZS0+Yml0U2l6ZSAhPSA4CisgICAgICAgICAgICB8fCByZXBvcnRpbmdTdGF0ZS0+bWluUmF3ICE9IFJFUE9SVElOR19TVEFURV9NSU4KKyAgICAgICAgICAgIHx8IHJlcG9ydGluZ1N0YXRlLT5tYXhSYXcgIT0gUkVQT1JUSU5HX1NUQVRFX01BWCkgeworICAgICAgICBMT0dfVyA8PCAiQ2Fubm90IGZpbmQgdmFsaWQgcmVwb3J0aW5nIHN0YXRlIGZlYXR1cmUiIDw8IExPR19FTkRMOworICAgIH0gZWxzZSB7CisgICAgICAgIG1SZXBvcnRpbmdTdGF0ZUlkID0gcmVwb3J0aW5nU3RhdGUtPmlkOworICAgICAgICBtUmVwb3J0aW5nU3RhdGVPZmZzZXQgPSByZXBvcnRpbmdTdGF0ZS0+Yml0T2Zmc2V0IC8gODsKKyAgICB9CisKKyAgICAvL1BPV0VSX1NUQVRFCisgICAgY29uc3QgSGlkUGFyc2VyOjpSZXBvcnRJdGVtICpwb3dlclN0YXRlCisgICAgICAgICAgICA9IGZpbmQocGFja2V0cywgUE9XRVJfU1RBVEUsIEhpZFBhcnNlcjo6UkVQT1JUX1RZUEVfRkVBVFVSRSk7CisgICAgaWYgKHBvd2VyU3RhdGUgPT0gbnVsbHB0cgorICAgICAgICAgICAgfHwgIXBvd2VyU3RhdGUtPmlzQnl0ZUFsaWduZWQoKQorICAgICAgICAgICAgfHwgcG93ZXJTdGF0ZS0+Yml0U2l6ZSAhPSA4CisgICAgICAgICAgICB8fCBwb3dlclN0YXRlLT5taW5SYXcgIT0gUE9XRVJfU1RBVEVfTUlOCisgICAgICAgICAgICB8fCBwb3dlclN0YXRlLT5tYXhSYXcgIT0gUE9XRVJfU1RBVEVfTUFYKSB7CisgICAgICAgIExPR19XIDw8ICJDYW5ub3QgZmluZCB2YWxpZCBwb3dlciBzdGF0ZSBmZWF0dXJlIiA8PCBMT0dfRU5ETDsKKyAgICB9IGVsc2UgeworICAgICAgICBtUG93ZXJTdGF0ZUlkID0gcG93ZXJTdGF0ZS0+aWQ7CisgICAgICAgIG1Qb3dlclN0YXRlT2Zmc2V0ID0gcG93ZXJTdGF0ZS0+Yml0T2Zmc2V0IC8gODsKKyAgICB9CisKKyAgICAvL1JFUE9SVF9JTlRFUlZBTAorICAgIGNvbnN0IEhpZFBhcnNlcjo6UmVwb3J0SXRlbSAqcmVwb3J0SW50ZXJ2YWwKKyAgICAgICAgICAgID0gZmluZChwYWNrZXRzLCBSRVBPUlRfSU5URVJWQUwsIEhpZFBhcnNlcjo6UkVQT1JUX1RZUEVfRkVBVFVSRSk7CisgICAgaWYgKHJlcG9ydEludGVydmFsID09IG51bGxwdHIKKyAgICAgICAgICAgIHx8ICFyZXBvcnRJbnRlcnZhbC0+aXNCeXRlQWxpZ25lZCgpCisgICAgICAgICAgICB8fCByZXBvcnRJbnRlcnZhbC0+bWluUmF3IDwgMAorICAgICAgICAgICAgfHwgKHJlcG9ydEludGVydmFsLT5iaXRTaXplICE9IDE2ICYmIHJlcG9ydEludGVydmFsLT5iaXRTaXplICE9IDMyKSkgeworICAgICAgICBMT0dfVyA8PCAiQ2Fubm90IGZpbmQgdmFsaWQgcmVwb3J0IGludGVydmFsIGZlYXR1cmUiIDw8IExPR19FTkRMOworICAgIH0gZWxzZSB7CisgICAgICAgIG1SZXBvcnRJbnRlcnZhbElkID0gcmVwb3J0SW50ZXJ2YWwtPmlkOworICAgICAgICBtUmVwb3J0SW50ZXJ2YWxPZmZzZXQgPSByZXBvcnRJbnRlcnZhbC0+Yml0T2Zmc2V0IC8gODsKKyAgICAgICAgbVJlcG9ydEludGVydmFsU2l6ZSA9IHJlcG9ydEludGVydmFsLT5iaXRTaXplIC8gODsKKworICAgICAgICBtRmVhdHVyZUluZm8ubWluRGVsYXkgPSBzdGQ6Om1heChzdGF0aWNfY2FzdDxpbnQ2NF90PigxKSwgcmVwb3J0SW50ZXJ2YWwtPm1pblJhdykgKiAxMDAwOworICAgICAgICBtRmVhdHVyZUluZm8ubWF4RGVsYXkgPSBzdGQ6Om1pbihzdGF0aWNfY2FzdDxpbnQ2NF90PigxMDAwMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydEludGVydmFsLT5tYXhSYXcpICogMTAwMDsgLy8gbWF4aW11bSAxMDAwIHNlY29uZAorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gKG1Qb3dlclN0YXRlSWQgPj0gMCB8fCBtUmVwb3J0aW5nU3RhdGVJZCA+PSAwKSAmJiBtUmVwb3J0SW50ZXJ2YWxJZCA+PSAwOworfQorCitjb25zdCBzZW5zb3JfdCogSGlkUmF3U2Vuc29yOjpnZXRTZW5zb3IoKSBjb25zdCB7CisgICAgcmV0dXJuICZtU2Vuc29yOworfQorCit2b2lkIEhpZFJhd1NlbnNvcjo6Z2V0VXVpZCh1aW50OF90KiB1dWlkKSBjb25zdCB7CisgICAgbWVtY3B5KHV1aWQsIG1GZWF0dXJlSW5mby51dWlkLCBzaXplb2YobUZlYXR1cmVJbmZvLnV1aWQpKTsKK30KKworaW50IEhpZFJhd1NlbnNvcjo6ZW5hYmxlKGJvb2wgZW5hYmxlKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIEhpZDo6U2Vuc29yOjpTdGF0ZVZhbHVlOworICAgIFNQKEhpZERldmljZSkgZGV2aWNlID0gUFJPTU9URShtRGV2aWNlKTsKKworICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBpZiAoZW5hYmxlID09IG1FbmFibGVkKSB7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWZmZXI7CisgICAgYm9vbCBzZXRQb3dlck9rID0gdHJ1ZTsKKyAgICBpZiAobVBvd2VyU3RhdGVJZCA+PSAwKSB7CisgICAgICAgIHNldFBvd2VyT2sgPSBmYWxzZTsKKyAgICAgICAgdWludDhfdCBpZCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KG1Qb3dlclN0YXRlSWQpOworICAgICAgICBpZiAoZGV2aWNlLT5nZXRGZWF0dXJlKGlkLCAmYnVmZmVyKQorICAgICAgICAgICAgICAgICYmIGJ1ZmZlci5zaXplKCkgPiBtUG93ZXJTdGF0ZU9mZnNldCkgeworICAgICAgICAgICAgYnVmZmVyW21Qb3dlclN0YXRlT2Zmc2V0XSA9IGVuYWJsZSA/IFBPV0VSX1NUQVRFX0ZVTExfUE9XRVIgOiBQT1dFUl9TVEFURV9QT1dFUl9PRkY7CisgICAgICAgICAgICBzZXRQb3dlck9rID0gZGV2aWNlLT5zZXRGZWF0dXJlKGlkLCBidWZmZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HX0UgPDwgImVuYWJsZTogY2hhbmdpbmcgUE9XRVIgU1RBVEUgZmFpbGVkIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgc2V0UmVwb3J0aW5nT2sgPSB0cnVlOworICAgIGlmIChtUmVwb3J0aW5nU3RhdGVJZCA+PSAwKSB7CisgICAgICAgIHNldFJlcG9ydGluZ09rID0gZmFsc2U7CisgICAgICAgIHVpbnQ4X3QgaWQgPSBzdGF0aWNfY2FzdDx1aW50OF90PihtUmVwb3J0aW5nU3RhdGVJZCk7CisgICAgICAgIGlmIChkZXZpY2UtPmdldEZlYXR1cmUoaWQsICZidWZmZXIpCisgICAgICAgICAgICAgICAgJiYgYnVmZmVyLnNpemUoKSA+IG1SZXBvcnRpbmdTdGF0ZU9mZnNldCkgeworICAgICAgICAgICAgYnVmZmVyW21SZXBvcnRpbmdTdGF0ZU9mZnNldF0KKyAgICAgICAgICAgICAgICAgICAgPSBlbmFibGUgPyBSRVBPUlRJTkdfU1RBVEVfQUxMX0VWRU5UIDogUkVQT1JUSU5HX1NUQVRFX05PX0VWRU5UOworICAgICAgICAgICAgc2V0UmVwb3J0aW5nT2sgPSBkZXZpY2UtPnNldEZlYXR1cmUoaWQsIGJ1ZmZlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dfRSA8PCAiZW5hYmxlOiBjaGFuZ2luZyBSRVBPUlRJTkcgU1RBVEUgZmFpbGVkIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzZXRQb3dlck9rICYmIHNldFJlcG9ydGluZ09rKSB7CisgICAgICAgIG1FbmFibGVkID0gZW5hYmxlOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KK30KKworaW50IEhpZFJhd1NlbnNvcjo6YmF0Y2goaW50NjRfdCBzYW1wbGluZ1BlcmlvZCwgaW50NjRfdCBiYXRjaGluZ1BlcmlvZCkgeworICAgIFNQKEhpZERldmljZSkgZGV2aWNlID0gUFJPTU9URShtRGV2aWNlKTsKKyAgICBpZiAoZGV2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgaWYgKHNhbXBsaW5nUGVyaW9kIDwgMCB8fCBiYXRjaGluZ1BlcmlvZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBib29sIG5lZWRSZWZyZXNoID0gbVNhbXBsaW5nUGVyaW9kICE9IHNhbXBsaW5nUGVyaW9kIHx8IG1CYXRjaGluZ1BlcmlvZCAhPSBiYXRjaGluZ1BlcmlvZDsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWZmZXI7CisKKyAgICBib29sIG9rID0gdHJ1ZTsKKyAgICBpZiAobmVlZFJlZnJlc2ggJiYgbVJlcG9ydEludGVydmFsSWQgPj0gMCkgeworICAgICAgICBvayA9IGZhbHNlOworICAgICAgICB1aW50OF90IGlkID0gc3RhdGljX2Nhc3Q8dWludDhfdD4obVJlcG9ydEludGVydmFsSWQpOworICAgICAgICBpZiAoZGV2aWNlLT5nZXRGZWF0dXJlKGlkLCAmYnVmZmVyKQorICAgICAgICAgICAgICAgICYmIGJ1ZmZlci5zaXplKCkgPj0gbVJlcG9ydEludGVydmFsT2Zmc2V0ICsgbVJlcG9ydEludGVydmFsU2l6ZSkgeworICAgICAgICAgICAgaW50NjRfdCBwZXJpb2RNcyA9IHNhbXBsaW5nUGVyaW9kIC8gMTAwMDAwMDsgLy9ucyAtPiBtcworICAgICAgICAgICAgc3dpdGNoIChtUmVwb3J0SW50ZXJ2YWxTaXplKSB7CisgICAgICAgICAgICAgICAgY2FzZSBzaXplb2YodWludDE2X3QpOgorICAgICAgICAgICAgICAgICAgICBwZXJpb2RNcyA9IHN0ZDo6bWluKHBlcmlvZE1zLCBzdGF0aWNfY2FzdDxpbnQ2NF90PihVSU5UMTZfTUFYKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclttUmVwb3J0SW50ZXJ2YWxPZmZzZXRdID0gcGVyaW9kTXMgJiAweEZGOworICAgICAgICAgICAgICAgICAgICBidWZmZXJbbVJlcG9ydEludGVydmFsT2Zmc2V0ICsgMV0gPSAocGVyaW9kTXMgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgICAgIGNhc2Ugc2l6ZW9mKHVpbnQzMl90KToKKyAgICAgICAgICAgICAgICAgICAgcGVyaW9kTXMgPSBzdGQ6Om1pbihwZXJpb2RNcywgc3RhdGljX2Nhc3Q8aW50NjRfdD4oVUlOVDMyX01BWCkpOworICAgICAgICAgICAgICAgICAgICBidWZmZXJbbVJlcG9ydEludGVydmFsT2Zmc2V0XSA9IHBlcmlvZE1zICYgMHhGRjsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyW21SZXBvcnRJbnRlcnZhbE9mZnNldCArIDFdID0gKHBlcmlvZE1zID4+IDgpICYgMHhGRjsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyW21SZXBvcnRJbnRlcnZhbE9mZnNldCArIDJdID0gKHBlcmlvZE1zID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclttUmVwb3J0SW50ZXJ2YWxPZmZzZXQgKyAzXSA9IChwZXJpb2RNcyA+PiAyNCkgJiAweEZGOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2sgPSBkZXZpY2UtPnNldEZlYXR1cmUoaWQsIGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob2spIHsKKyAgICAgICAgbVNhbXBsaW5nUGVyaW9kID0gc2FtcGxpbmdQZXJpb2Q7CisgICAgICAgIG1CYXRjaGluZ1BlcmlvZCA9IGJhdGNoaW5nUGVyaW9kOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KK30KKwordm9pZCBIaWRSYXdTZW5zb3I6OmhhbmRsZUlucHV0KHVpbnQ4X3QgaWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZtZXNzYWdlKSB7CisgICAgaWYgKGlkICE9IG1JbnB1dFJlcG9ydElkIHx8IG1FbmFibGVkID09IGZhbHNlKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2Vuc29yc19ldmVudF90IGV2ZW50ID0geworICAgICAgICAudmVyc2lvbiA9IHNpemVvZihldmVudCksCisgICAgICAgIC5zZW5zb3IgPSAtMSwKKyAgICAgICAgLnR5cGUgPSBtU2Vuc29yLnR5cGUKKyAgICB9OworICAgIGJvb2wgdmFsaWQgPSB0cnVlOworICAgIGZvciAoY29uc3QgYXV0byAmcmVjIDogbVRyYW5zbGF0ZVRhYmxlKSB7CisgICAgICAgIGludDY0X3QgdiA9IChtZXNzYWdlW3JlYy5ieXRlT2Zmc2V0ICsgcmVjLmJ5dGVTaXplIC0gMV0gJiAweDgwKSA/IC0xIDogMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXRpY19jYXN0PGludD4ocmVjLmJ5dGVTaXplKSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgICAgICB2ID0gKHYgPDwgOCkgfCBtZXNzYWdlW3JlYy5ieXRlT2Zmc2V0ICsgaV07IC8vIEhJRCBpcyBsaXR0bGUgZW5kaWFuCisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKHJlYy50eXBlKSB7CisgICAgICAgICAgICBjYXNlIFRZUEVfRkxPQVQ6CisgICAgICAgICAgICAgICAgaWYgKHYgPiByZWMubWF4VmFsdWUgfHwgdiA8IHJlYy5taW5WYWx1ZSkgeworICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBldmVudC5kYXRhW3JlYy5pbmRleF0gPSByZWMuYSAqICh2ICsgcmVjLmIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUWVBFX0lOVDY0OgorICAgICAgICAgICAgICAgIGlmICh2ID4gcmVjLm1heFZhbHVlIHx8IHYgPCByZWMubWluVmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXZlbnQudTY0LmRhdGFbcmVjLmluZGV4XSA9IHYgKyByZWMuYjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9BQ0NVUkFDWToKKyAgICAgICAgICAgICAgICBldmVudC5tYWduZXRpYy5zdGF0dXMgPSAodiAmIDB4RkYpICsgcmVjLmI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCF2YWxpZCkgeworICAgICAgICBMT0dfViA8PCAiUmFuZ2UgZXJyb3Igb2JzZXJ2ZWQgaW4gZGVjb2RpbmcsIGRpc2NhcmQiIDw8IExPR19FTkRMOworICAgIH0KKyAgICBldmVudC50aW1lc3RhbXAgPSAtMTsKKyAgICBnZW5lcmF0ZUV2ZW50KGV2ZW50KTsKK30KKworc3RkOjpzdHJpbmcgSGlkUmF3U2Vuc29yOjpkdW1wKCkgY29uc3QgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzczsKKyAgICBzcyA8PCAiRmVhdHVyZSBWYWx1ZXMgIiA8PCBMT0dfRU5ETAorICAgICAgICAgIDw8ICIgIG5hbWU6ICIgPDwgbUZlYXR1cmVJbmZvLm5hbWUgPDwgTE9HX0VOREwKKyAgICAgICAgICA8PCAiICB2ZW5kb3I6ICIgPDwgbUZlYXR1cmVJbmZvLnZlbmRvciA8PCBMT0dfRU5ETAorICAgICAgICAgIDw8ICIgIHBlcm1pc3Npb246ICIgPDwgbUZlYXR1cmVJbmZvLnBlcm1pc3Npb24gPDwgTE9HX0VOREwKKyAgICAgICAgICA8PCAiICB0eXBlU3RyaW5nOiAiIDw8IG1GZWF0dXJlSW5mby50eXBlU3RyaW5nIDw8IExPR19FTkRMCisgICAgICAgICAgPDwgIiAgdHlwZTogIiA8PCBtRmVhdHVyZUluZm8udHlwZSA8PCBMT0dfRU5ETAorICAgICAgICAgIDw8ICIgIG1heFJhbmdlOiAiIDw8IG1GZWF0dXJlSW5mby5tYXhSYW5nZSA8PCBMT0dfRU5ETAorICAgICAgICAgIDw8ICIgIHJlc29sdXRpb246ICIgPDwgbUZlYXR1cmVJbmZvLnJlc29sdXRpb24gPDwgTE9HX0VOREwKKyAgICAgICAgICA8PCAiICBwb3dlcjogIiA8PCBtRmVhdHVyZUluZm8ucG93ZXIgPDwgTE9HX0VOREwKKyAgICAgICAgICA8PCAiICBtaW5EZWxheTogIiA8PCBtRmVhdHVyZUluZm8ubWluRGVsYXkgPDwgTE9HX0VOREwKKyAgICAgICAgICA8PCAiICBtYXhEZWxheTogIiA8PCBtRmVhdHVyZUluZm8ubWF4RGVsYXkgPDwgTE9HX0VOREwKKyAgICAgICAgICA8PCAiICBmaWZvU2l6ZTogIiA8PCBtRmVhdHVyZUluZm8uZmlmb1NpemUgPDwgTE9HX0VOREwKKyAgICAgICAgICA8PCAiICBmaWZvTWF4U2l6ZTogIiA8PCBtRmVhdHVyZUluZm8uZmlmb01heFNpemUgPDwgTE9HX0VOREwKKyAgICAgICAgICA8PCAiICByZXBvcnRNb2RlRmxhZzogIiA8PCBtRmVhdHVyZUluZm8ucmVwb3J0TW9kZUZsYWcgPDwgTE9HX0VOREwKKyAgICAgICAgICA8PCAiICBpc1dha2VVcDogIiA8PCAobUZlYXR1cmVJbmZvLmlzV2FrZVVwID8gInRydWUiIDogImZhbHNlIikgPDwgTE9HX0VOREwKKyAgICAgICAgICA8PCAiICB1bmlxdWVJZDogIiA8PCBtRmVhdHVyZUluZm8udW5pcXVlSWQgPDwgTE9HX0VOREwKKyAgICAgICAgICA8PCAiICB1dWlkOiAiOworCisgICAgc3MgPDwgc3RkOjpoZXggPDwgc3RkOjpzZXRmaWxsKCcwJyk7CisgICAgZm9yIChhdXRvIGQgOiBtRmVhdHVyZUluZm8udXVpZCkgeworICAgICAgICAgIHNzIDw8IHN0ZDo6c2V0dygyKSA8PCBzdGF0aWNfY2FzdDxpbnQ+KGQpIDw8ICIgIjsKKyAgICB9CisgICAgc3MgPDwgc3RkOjpkZWMgPDwgc3RkOjpzZXRmaWxsKCcgJykgPDwgTE9HX0VOREw7CisKKyAgICBzcyA8PCAiSW5wdXQgcmVwb3J0IGlkOiAiIDw8IG1JbnB1dFJlcG9ydElkIDw8IExPR19FTkRMOworICAgIGZvciAoY29uc3QgYXV0byAmdCA6IG1UcmFuc2xhdGVUYWJsZSkgeworICAgICAgICBzcyA8PCAiICB0eXBlLCBpbmRleDogIiA8PCB0LnR5cGUgPDwgIiwgIiA8PCB0LmluZGV4CisgICAgICAgICAgICAgIDw8ICI7IG1pbixtYXg6ICIgPDwgdC5taW5WYWx1ZSA8PCAiLCAiIDw8IHQubWF4VmFsdWUKKyAgICAgICAgICAgICAgPDwgIjsgYnl0ZS1vZmZzZXQsc2l6ZTogIiA8PCB0LmJ5dGVPZmZzZXQgPDwgIiwgIiA8PCB0LmJ5dGVTaXplCisgICAgICAgICAgICAgIDw8ICI7IHNjYWxpbmcsYmlhczogIiA8PCB0LmEgPDwgIiwgIiA8PCB0LmIgPDwgTE9HX0VOREw7CisgICAgfQorCisgICAgc3MgPDwgIkNvbnRyb2wgZmVhdHVyZXM6ICIgPDwgTE9HX0VOREw7CisgICAgc3MgPDwgIiAgUG93ZXIgc3RhdGUgIjsKKyAgICBpZiAobVBvd2VyU3RhdGVJZCA+PSAwKSB7CisgICAgICAgIHNzIDw8ICJmb3VuZCwgaWQ6ICIgPDwgbVBvd2VyU3RhdGVJZAorICAgICAgICAgICAgICA8PCAiIG9mZnNldDogIiA8PCBtUG93ZXJTdGF0ZU9mZnNldCA8PCBMT0dfRU5ETDsKKyAgICB9IGVsc2UgeworICAgICAgICBzcyA8PCAibm90IGZvdW5kIiA8PCBMT0dfRU5ETDsKKyAgICB9CisKKyAgICBzcyA8PCAiICBSZXBvcnRpbmcgc3RhdGUgIjsKKyAgICBpZiAobVJlcG9ydGluZ1N0YXRlSWQgPj0gMCkgeworICAgICAgICBzcyA8PCAiZm91bmQsIGlkOiAiIDw8IG1SZXBvcnRpbmdTdGF0ZUlkCisgICAgICAgICAgICAgIDw8ICIgb2Zmc2V0OiAiIDw8IG1SZXBvcnRpbmdTdGF0ZU9mZnNldCA8PCBMT0dfRU5ETDsKKyAgICB9IGVsc2UgeworICAgICAgICBzcyA8PCAibm90IGZvdW5kIiA8PCBMT0dfRU5ETDsKKyAgICB9CisKKyAgICBzcyA8PCAiICBSZXBvcnQgaW50ZXJ2YWwgIjsKKyAgICBpZiAobVJlcG9ydEludGVydmFsSWQgPj0gMCkgeworICAgICAgICBzcyA8PCAiZm91bmQsIGlkOiAiIDw8IG1SZXBvcnRJbnRlcnZhbElkCisgICAgICAgICAgICAgIDw8ICIgb2Zmc2V0OiAiIDw8IG1SZXBvcnRJbnRlcnZhbE9mZnNldAorICAgICAgICAgICAgICA8PCAiIHNpemU6ICIgPDwgbVJlcG9ydEludGVydmFsU2l6ZSA8PCBMT0dfRU5ETDsKKyAgICB9IGVsc2UgeworICAgICAgICBzcyA8PCAibm90IGZvdW5kIiA8PCBMT0dfRU5ETDsKKyAgICB9CisgICAgcmV0dXJuIHNzLnN0cigpOworfQorCit9IC8vIG5hbWVzcGFjZSBTZW5zb3JIYWxFeHQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRSYXdTZW5zb3IuaCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRSYXdTZW5zb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGQzMmI2Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFJhd1NlbnNvci5oCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgQU5EUk9JRF9TRU5TT1JIQUxfRVhUX0hJRFJBV19TRU5TT1JfSAorI2RlZmluZSBBTkRST0lEX1NFTlNPUkhBTF9FWFRfSElEUkFXX1NFTlNPUl9ICisKKyNpbmNsdWRlICJCYXNlU2Vuc29yT2JqZWN0LmgiCisjaW5jbHVkZSAiSGlkRGV2aWNlLmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKworI2luY2x1ZGUgPEhpZFBhcnNlci5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL3NlbnNvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFNlbnNvckhhbEV4dCB7CisKK3VzaW5nIEhpZFV0aWw6OkhpZFBhcnNlcjsKK3VzaW5nIFJlcG9ydFBhY2tldCA9IEhpZFBhcnNlcjo6UmVwb3J0UGFja2V0OwordXNpbmcgUmVwb3J0SXRlbSA9IEhpZFBhcnNlcjo6UmVwb3J0SXRlbTsKKworY2xhc3MgSGlkUmF3U2Vuc29yIDogcHVibGljIEJhc2VTZW5zb3JPYmplY3QgeworICAgIGZyaWVuZCBjbGFzcyBIaWRSYXdTZW5zb3JUZXN0OworICAgIGZyaWVuZCBjbGFzcyBIaWRSYXdEZXZpY2VUZXN0OworcHVibGljOgorICAgIEhpZFJhd1NlbnNvcihTUChIaWREZXZpY2UpIGRldmljZSwgdWludDMyX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEhpZFBhcnNlcjo6UmVwb3J0UGFja2V0PiAmcmVwb3J0KTsKKworICAgIC8vIGltcGxlbWVudHMgQmFzZVNlbnNvck9iamVjdAorICAgIHZpcnR1YWwgY29uc3Qgc2Vuc29yX3QqIGdldFNlbnNvcigpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBnZXRVdWlkKHVpbnQ4X3QqIHV1aWQpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGVuYWJsZShib29sIGVuYWJsZSk7CisgICAgdmlydHVhbCBpbnQgYmF0Y2goaW50NjRfdCBzYW1wbGVQZXJpb2QsIGludDY0X3QgYmF0Y2hQZXJpb2QpOyAvLyB1bml0IG5hbm8tc2Vjb25kcworCisgICAgLy8gaGFuZGxlIGlucHV0IHJlcG9ydCByZWNlaXZlZAorICAgIHZvaWQgaGFuZGxlSW5wdXQodWludDhfdCBpZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm1lc3NhZ2UpOworCisgICAgLy8gaW5kaWNhdGUgaWYgdGhlIEhpZFJhd1NlbnNvciBpcyBhIHZhbGlkIG9uZQorICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1WYWxpZDsgfTsKKworcHJpdmF0ZToKKworICAgIC8vIHN0cnVjdHVyZSB1c2VkIGZvciBob2xkaW5nIGRlc2NyaXB0b3IgcGFyc2UgcmVzdWx0IGZvciBlYWNoIHJlcG9ydCBmaWVsZAorICAgIGVudW0geworICAgICAgICBUWVBFX0ZMT0FULAorICAgICAgICBUWVBFX0lOVDY0LAorICAgICAgICBUWVBFX0FDQ1VSQUNZCisgICAgfTsKKyAgICBzdHJ1Y3QgUmVwb3J0VHJhbnNsYXRlUmVjb3JkIHsKKyAgICAgICAgaW50IHR5cGU7CisgICAgICAgIGludCBpbmRleDsKKyAgICAgICAgaW50NjRfdCBtYXhWYWx1ZTsKKyAgICAgICAgaW50NjRfdCBtaW5WYWx1ZTsKKyAgICAgICAgc2l6ZV90IGJ5dGVPZmZzZXQ7CisgICAgICAgIHNpemVfdCBieXRlU2l6ZTsKKyAgICAgICAgZG91YmxlIGE7CisgICAgICAgIGludDY0X3QgYjsKKyAgICB9OworCisgICAgLy8gc2Vuc29yIHJlbGF0ZWQgaW5mb3JtYXRpb24gcGFyc2VkIGZyb20gSElEIGRlc2NyaXB0b3IKKyAgICBzdHJ1Y3QgRmVhdHVyZVZhbHVlIHsKKyAgICAgICAgLy8gaW5mb3JtYXRpb24gbmVlZGVkIHRvIGZ1cm5pc2ggc2Vuc29yX3Qgc3RydWN0dXJlIChzZWUgaGFyZHdhcmUvc2Vuc29ycy5oKQorICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICBzdGQ6OnN0cmluZyB2ZW5kb3I7CisgICAgICAgIHN0ZDo6c3RyaW5nIHBlcm1pc3Npb247CisgICAgICAgIHN0ZDo6c3RyaW5nIHR5cGVTdHJpbmc7CisgICAgICAgIGludDMyX3QgdHlwZTsKKyAgICAgICAgaW50IHZlcnNpb247CisgICAgICAgIGZsb2F0IG1heFJhbmdlOworICAgICAgICBmbG9hdCByZXNvbHV0aW9uOworICAgICAgICBmbG9hdCBwb3dlcjsKKyAgICAgICAgaW50MzJfdCBtaW5EZWxheTsKKyAgICAgICAgaW50NjRfdCBtYXhEZWxheTsKKyAgICAgICAgc2l6ZV90IGZpZm9TaXplOworICAgICAgICBzaXplX3QgZmlmb01heFNpemU7CisgICAgICAgIHVpbnQzMl90IHJlcG9ydE1vZGVGbGFnOworICAgICAgICBib29sIGlzV2FrZVVwOworCisgICAgICAgIC8vIGR5bmFtaWMgc2Vuc29yIHNwZWNpZmljCisgICAgICAgIHN0ZDo6c3RyaW5nIHVuaXF1ZUlkOworICAgICAgICB1aW50OF90IHV1aWRbMTZdOworCisgICAgICAgIC8vIGlmIHRoZSBkZXZpY2UgaXMgY3VzdG9tIHNlbnNvciBISUQgZGV2aWNlIHRoYXQgZnVybmlzaGVkIGFuZHJvaWQgc3BlY2lmaWMgZGVzY3JpcHRvcnMKKyAgICAgICAgYm9vbCBpc0FuZHJvaWRDdXN0b207CisgICAgfTsKKworICAgIC8vIGhlbHBlciBmdW5jdGlvbiB0byBmaW5kIHRoZSBmaXJzdCByZXBvcnQgaXRlbSB3aXRoIHNwZWNpZmllZCB1c2FnZSwgdHlwZSBhbmQgaWQuCisgICAgLy8gaWYgcGFyYW1ldGVyIGlkIGlzIG9taXR0ZWQsIHRoaXMgZnVuY3Rpb24gbG9va3MgZm9yIHVzYWdlIHdpdGggYWxsIGlkcy4KKyAgICAvLyByZXR1cm4gbnVsbHB0ciBpZiBub3RoaW5nIGlzIGZvdW5kLgorICAgIHN0YXRpYyBjb25zdCBIaWRQYXJzZXI6OlJlcG9ydEl0ZW0qIGZpbmQKKyAgICAgICAgICAgIChjb25zdCBzdGQ6OnZlY3RvcjxIaWRQYXJzZXI6OlJlcG9ydFBhY2tldD4gJnBhY2tldHMsCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdXNhZ2UsIGludCB0eXBlLCBpbnQgaWQgPSAtMSk7CisKKyAgICAvLyBoZWxwZXIgZnVuY3Rpb24gdG8gZGVjb2RlIHN0ZDo6c3RyaW5nIGZyb20gSElEIGZlYXR1cmUgcmVwb3J0IGJ1ZmZlci4KKyAgICBzdGF0aWMgYm9vbCBkZWNvZGVTdHJpbmcoCisgICAgICAgICAgICBjb25zdCBIaWRQYXJzZXI6OlJlcG9ydEl0ZW0gJnJlcG9ydCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZidWZmZXIsIHN0ZDo6c3RyaW5nICpkKTsKKworICAgIC8vIGluaXRpYWxpemUgZGVmYXVsdCBmZWF0dXJlIHZhbHVlcyBkZWZhdWx0IGJhc2VkIG9uIGhpZCBkZXZpY2UgaW5mbworICAgIHN0YXRpYyB2b2lkIGluaXRGZWF0dXJlVmFsdWVGcm9tSGlkRGV2aWNlSW5mbygKKyAgICAgICAgICAgIEZlYXR1cmVWYWx1ZSAqZmVhdHVyZVZhbHVlLCBjb25zdCBIaWREZXZpY2U6OkhpZERldmljZUluZm8gJmluZm8pOworCisgICAgLy8gcG9wdWxhdGVzIGZlYXR1cmUgdmFsdWVzIGZyb20gZGVzY3JpcGl0b3JzIGFuZCBoaWQgZmVhdHVyZSByZXBvcnRzCisgICAgYm9vbCBwb3B1bGF0ZUZlYXR1cmVWYWx1ZUZyb21GZWF0dXJlUmVwb3J0KAorICAgICAgICAgICAgRmVhdHVyZVZhbHVlICpmZWF0dXJlVmFsdWUsIGNvbnN0IHN0ZDo6dmVjdG9yPEhpZFBhcnNlcjo6UmVwb3J0UGFja2V0PiAmcGFja2V0cyk7CisKKyAgICAvLyB2YWxpZGF0ZSBmZWF0dXJlIHZhbHVlcyBhbmQgY29uc3RydWN0IHNlbnNvcl90IHN0cnVjdHVyZSBpZiB2YWx1ZXMgYXJlIG9rLgorICAgIGJvb2wgdmFsaWRhdGVGZWF0dXJlVmFsdWVBbmRCdWlsZFNlbnNvcigpOworCisgICAgLy8gaGVscGVyIGZ1bmN0aW9uIHRvIGZpbmQgc2Vuc29yIGNvbnRyb2wgZmVhdHVyZSB1c2FnZSBmcm9tIHBhY2tldHMKKyAgICBib29sIGZpbmRTZW5zb3JDb250cm9sVXNhZ2UoY29uc3Qgc3RkOjp2ZWN0b3I8SGlkUGFyc2VyOjpSZXBvcnRQYWNrZXQ+ICZwYWNrZXRzKTsKKworICAgIC8vIHRyeSB0byBwYXJzZSBzZW5zb3IgZGVzY3JpcHRpb24gZmVhdHVyZSB2YWx1ZSB0byBzZWUgaWYgaXQgbWF0Y2hlcworICAgIC8vIGFuZHJvaWQgc3BlY2lmaWVkIGN1c3RvbSBzZW5zb3IgZGVmaW5pdGlvbi4KKyAgICBib29sIGRldGVjdEFuZHJvaWRDdXN0b21TZW5zb3IoY29uc3Qgc3RkOjpzdHJpbmcgJmRlc2NyaXB0aW9uKTsKKworICAgIC8vIHByb2Nlc3MgSElEIHNlbnNvciBzcGVjIGRlZmluZWQgdGhyZWUgYXhpcyBzZW5zb3JzIHVzYWdlczogYWNjZWwsIGd5cm8sIG1hZy4KKyAgICBib29sIHByb2Nlc3NUcmlBeGlzVXNhZ2UoY29uc3Qgc3RkOjp2ZWN0b3I8SGlkUGFyc2VyOjpSZXBvcnRQYWNrZXQ+ICZwYWNrZXRzLAorICAgICAgICAgICAgdWludDMyX3QgdXNhZ2VYLCB1aW50MzJfdCB1c2FnZVksIHVpbnQzMl90IHVzYWdlWiwgZG91YmxlIGRlZmF1bHRTY2FsaW5nID0gMSk7CisKKyAgICAvLyBwcm9jZXNzIEhJRCBzbmVzb3Igc3BlYyBkZWZpbmVkIG9yaWVudGF0aW9uKHF1YXRlcm5pb24pIHNlbnNvciB1c2FnZXMuCisgICAgYm9vbCBwcm9jZXNzUXVhdGVybmlvblVzYWdlKGNvbnN0IHN0ZDo6dmVjdG9yPEhpZFBhcnNlcjo6UmVwb3J0UGFja2V0PiAmcGFja2V0cyk7CisKKyAgICAvLyBkdW1wIGRhdGEgZm9yIHRlc3QvZGVidWcgcHVycG9zZQorICAgIHN0ZDo6c3RyaW5nIGR1bXAoKSBjb25zdDsKKworICAgIC8vIEZlYXR1cmVzIGZvciBjb250cm9sIHNlbnNvcgorICAgIGludCBtUmVwb3J0aW5nU3RhdGVJZDsKKyAgICB1bnNpZ25lZCBpbnQgbVJlcG9ydGluZ1N0YXRlT2Zmc2V0OworCisgICAgaW50IG1Qb3dlclN0YXRlSWQ7CisgICAgdW5zaWduZWQgaW50IG1Qb3dlclN0YXRlT2Zmc2V0OworCisgICAgaW50IG1SZXBvcnRJbnRlcnZhbElkOworICAgIHVuc2lnbmVkIGludCBtUmVwb3J0SW50ZXJ2YWxPZmZzZXQ7CisgICAgdW5zaWduZWQgaW50IG1SZXBvcnRJbnRlcnZhbFNpemU7CisKKyAgICAvLyBJbnB1dCByZXBvcnQgdHJhbnNsYXRlIHRhYmxlCisgICAgc3RkOjp2ZWN0b3I8UmVwb3J0VHJhbnNsYXRlUmVjb3JkPiBtVHJhbnNsYXRlVGFibGU7CisgICAgdW5zaWduZWQgbUlucHV0UmVwb3J0SWQ7CisKKyAgICBGZWF0dXJlVmFsdWUgbUZlYXR1cmVJbmZvOworICAgIHNlbnNvcl90IG1TZW5zb3I7CisKKyAgICAvLyBydW50aW1lIHN0YXRlcyB2YXJpYWJsZQorICAgIGJvb2wgbUVuYWJsZWQ7CisgICAgaW50NjRfdCBtU2FtcGxpbmdQZXJpb2Q7ICAgIC8vIG5zCisgICAgaW50NjRfdCBtQmF0Y2hpbmdQZXJpb2Q7ICAgIC8vIG5zCisKKyAgICBXUChIaWREZXZpY2UpIG1EZXZpY2U7CisgICAgYm9vbCBtVmFsaWQ7Cit9OworCit9IC8vIG5hbWVzcGFjZSBTZW5zb3JIYWxFeHQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNlbmRpZiAvLyBBTkRST0lEX1NFTlNPUkhBTF9FWFRfSElEUkFXX1NFTlNPUl9ICisKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRSYXdTZW5zb3JEYWVtb24uY3BwIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFJhd1NlbnNvckRhZW1vbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJmMzRiYwotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRSYXdTZW5zb3JEYWVtb24uY3BwCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgIkhpZFJhd1NlbnNvckRhZW1vbi5oIgorI2luY2x1ZGUgIkNvbm5lY3Rpb25EZXRlY3Rvci5oIgorI2luY2x1ZGUgIkR5bmFtaWNTZW5zb3JNYW5hZ2VyLmgiCisjaW5jbHVkZSAiSGlkUmF3U2Vuc29yRGV2aWNlLmgiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TeXN0ZW1DbG9jay5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjZGVmaW5lIERFVl9QQVRIICAgICAgICAgICAgICAgICIvZGV2LyIKKyNkZWZpbmUgREVWX05BTUVfUkVHRVggICAgICAgICAgIl5oaWRyYXdbMC05XSskIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgU2Vuc29ySGFsRXh0IHsKKworSGlkUmF3U2Vuc29yRGFlbW9uOjpIaWRSYXdTZW5zb3JEYWVtb24oRHluYW1pY1NlbnNvck1hbmFnZXImIG1hbmFnZXIpCisgICAgICAgIDogQmFzZUR5bmFtaWNTZW5zb3JEYWVtb24obWFuYWdlcikgeworICAgIG1EZXRlY3RvciA9IG5ldyBGaWxlQ29ubmVjdGlvbkRldGVjdG9yKAorICAgICAgICAgICAgdGhpcywgc3RkOjpzdHJpbmcoREVWX1BBVEgpLCBzdGQ6OnN0cmluZyhERVZfTkFNRV9SRUdFWCkpOworfQorCitCYXNlU2Vuc29yVmVjdG9yIEhpZFJhd1NlbnNvckRhZW1vbjo6Y3JlYXRlU2Vuc29yKGNvbnN0IHN0ZDo6c3RyaW5nICZkZXZpY2VLZXkpIHsKKyAgICBCYXNlU2Vuc29yVmVjdG9yIHJldDsKKyAgICBzcDxIaWRSYXdTZW5zb3JEZXZpY2U+IGRldmljZShIaWRSYXdTZW5zb3JEZXZpY2U6OmNyZWF0ZShkZXZpY2VLZXkpKTsKKworICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVigiY3JlYXRlZCBIaWRSYXdTZW5zb3JEZXZpY2UoJXApIHN1Y2Nlc3NmdWxseSBvbiBkZXZpY2UgJXMgY29udGFpbnMgJXp1IHNlbnNvcnMiLAorICAgICAgICAgICAgICBkZXZpY2UuZ2V0KCksIGRldmljZUtleS5jX3N0cigpLCBkZXZpY2UtPmdldFNlbnNvcnMoKS5zaXplKCkpOworCisgICAgICAgIC8vIGNvbnZlcnQgdHlwZQorICAgICAgICBmb3IgKGF1dG8gJmkgOiBkZXZpY2UtPmdldFNlbnNvcnMoKSkgeworICAgICAgICAgICAgcmV0LnB1c2hfYmFjayhpKTsKKyAgICAgICAgfQorICAgICAgICBtSGlkUmF3U2Vuc29yRGV2aWNlcy5lbXBsYWNlKGRldmljZUtleSwgZGV2aWNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGNyZWF0ZSBIaWRSYXdTZW5zb3JEZXZpY2Ugb2JqZWN0Iik7CisgICAgfQorCisgICAgQUxPR0UoInJldHVybiAlenUgc2Vuc29ycyIsIHJldC5zaXplKCkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgSGlkUmF3U2Vuc29yRGFlbW9uOjpyZW1vdmVTZW5zb3IoY29uc3Qgc3RkOjpzdHJpbmcgJmRldmljZUtleSkgeworICAgIG1IaWRSYXdTZW5zb3JEZXZpY2VzLmVyYXNlKGRldmljZUtleSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFNlbnNvckhhbEV4dAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkUmF3U2Vuc29yRGFlbW9uLmggYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkUmF3U2Vuc29yRGFlbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM0YjJhMgotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRSYXdTZW5zb3JEYWVtb24uaApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFTlNPUkhBTF9FWFRfSElEUkFXX1NFTlNPUl9EQUVNT05fSAorI2RlZmluZSBBTkRST0lEX1NFTlNPUkhBTF9FWFRfSElEUkFXX1NFTlNPUl9EQUVNT05fSAorCisjaW5jbHVkZSAiQmFzZUR5bmFtaWNTZW5zb3JEYWVtb24uaCIKKworI2luY2x1ZGUgPEhpZFBhcnNlci5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL3NlbnNvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworCit1c2luZyBIaWRVdGlsOjpIaWRQYXJzZXI7Cit1c2luZyBIaWRVdGlsOjpIaWRSZXBvcnQ7Cit1c2luZyBIaWRVdGlsOjpIaWRJdGVtOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgU2Vuc29ySGFsRXh0IHsKKworY2xhc3MgSGlkUmF3U2Vuc29yRGV2aWNlOworY2xhc3MgQ29ubmVjdGlvbkRldGVjdG9yOworCitjbGFzcyBIaWRSYXdTZW5zb3JEYWVtb24gOiBwdWJsaWMgQmFzZUR5bmFtaWNTZW5zb3JEYWVtb24geworICAgIGZyaWVuZCBjbGFzcyBIaWRSYXdTZW5zb3JEYWVtb25UZXN0OworcHVibGljOgorICAgIEhpZFJhd1NlbnNvckRhZW1vbihEeW5hbWljU2Vuc29yTWFuYWdlciYgbWFuYWdlcik7CisgICAgdmlydHVhbCB+SGlkUmF3U2Vuc29yRGFlbW9uKCkgPSBkZWZhdWx0OworcHJpdmF0ZToKKyAgICB2aXJ0dWFsIEJhc2VTZW5zb3JWZWN0b3IgY3JlYXRlU2Vuc29yKGNvbnN0IHN0ZDo6c3RyaW5nICZkZXZpY2VLZXkpOworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVTZW5zb3IoY29uc3Qgc3RkOjpzdHJpbmcgJmRldmljZUtleSk7CisKKyAgICBjbGFzcyBIaWRSYXdTZW5zb3I7CisgICAgdm9pZCByZWdpc3RlckV4aXN0aW5nKCk7CisKKyAgICBzcDxDb25uZWN0aW9uRGV0ZWN0b3I+IG1EZXRlY3RvcjsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHNwPEhpZFJhd1NlbnNvckRldmljZT4+IG1IaWRSYXdTZW5zb3JEZXZpY2VzOworfTsKKworfSAvLyBuYW1lc3BhY2UgU2Vuc29ySGFsRXh0Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1NFTlNPUkhBTF9FWFRfSElEUkFXX1NFTlNPUl9EQUVNT05fSAorCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkUmF3U2Vuc29yRGV2aWNlLmNwcCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRSYXdTZW5zb3JEZXZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZTkwNjAKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkUmF3U2Vuc29yRGV2aWNlLmNwcApAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJIaWRSYXdTZW5zb3JEZXZpY2UuaCIKKyNpbmNsdWRlICJIaWRSYXdTZW5zb3IuaCIKKyNpbmNsdWRlICJIaWRTZW5zb3JEZWYuaCIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWRyYXcuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKworI2luY2x1ZGUgPHNldD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFNlbnNvckhhbEV4dCB7CisKK3VzaW5nIG5hbWVzcGFjZSBIaWQ6OlNlbnNvcjo6U2Vuc29yVHlwZVVzYWdlOwordXNpbmcgbmFtZXNwYWNlIEhpZDo6U2Vuc29yOjpQcm9wZXJ0eVVzYWdlOworCitjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8dW5zaWduZWQgaW50PiBIaWRSYXdTZW5zb3JEZXZpY2U6OnNJbnRlcmVzdGVkeworICAgICAgICBBQ0NFTEVST01FVEVSXzNELCBHWVJPTUVURVJfM0QsIENPTVBBU1NfM0QsIENVU1RPTX07CisKK3NwPEhpZFJhd1NlbnNvckRldmljZT4gSGlkUmF3U2Vuc29yRGV2aWNlOjpjcmVhdGUoY29uc3Qgc3RkOjpzdHJpbmcgJmRldk5hbWUpIHsKKyAgICBzcDxIaWRSYXdTZW5zb3JEZXZpY2U+IGRldmljZShuZXcgSGlkUmF3U2Vuc29yRGV2aWNlKGRldk5hbWUpKTsKKyAgICAvLyByZW1vdmUgKzEgc3Ryb25nIGNvdW50IGFkZGVkIGJ5IGNvbnN0cnVjdG9yCisgICAgZGV2aWNlLT5kZWNTdHJvbmcoZGV2aWNlLmdldCgpKTsKKworICAgIGlmIChkZXZpY2UtPm1WYWxpZCkgeworICAgICAgICByZXR1cm4gZGV2aWNlOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KK30KKworSGlkUmF3U2Vuc29yRGV2aWNlOjpIaWRSYXdTZW5zb3JEZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcgJmRldk5hbWUpCisgICAgICAgIDogUmVmQmFzZSgpLCBIaWRSYXdEZXZpY2UoZGV2TmFtZSwgc0ludGVyZXN0ZWQpLAorICAgICAgICAgIFRocmVhZChmYWxzZSAvKmNhbkNhbGxKYXZhKi8pLCBtVmFsaWQoZmFsc2UpIHsKKyAgICBpZiAoIUhpZFJhd0RldmljZTo6aXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gY3JlYXRlIEhpZFJhd1NlbnNvciBvYmplY3RzIGZyb20gZGlnZXN0CisgICAgLy8gSGlkUmF3U2Vuc29yIG9iamVjdCB3aWxsIHRha2Ugc3A8SGlkUmF3U2Vuc29yRGV2aWNlPiBhcyBwYXJhbWV0ZXIsIHNvIGluY3JlbWVudCBzdHJvbmcgY291bnQKKyAgICAvLyB0byBwcmV2ZW50ICJ0aGlzIiBiZWluZyBkZXN0cnVjdGVkLgorICAgIHRoaXMtPmluY1N0cm9uZyh0aGlzKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmRpZ2VzdCA6IG1EaWdlc3RWZWN0b3IpIHsgLy8gZm9yIGVhY2ggdXNhZ2UgLSB2ZWM8UmVwb3J0UGFja2V0PiBwYWlyCisgICAgICAgIHVpbnQzMl90IHVzYWdlID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGRpZ2VzdC5mdWxsVXNhZ2UpOworICAgICAgICBzcDxIaWRSYXdTZW5zb3I+IHMobmV3IEhpZFJhd1NlbnNvcih0aGlzLCB1c2FnZSwgZGlnZXN0LnBhY2tldHMpKTsKKyAgICAgICAgaWYgKHMtPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZwYWNrZXQgOiBkaWdlc3QucGFja2V0cykgeworICAgICAgICAgICAgICAgIGlmIChwYWNrZXQudHlwZSA9PSBIaWRQYXJzZXI6OlJFUE9SVF9UWVBFX0lOUFVUKSB7IC8vIG9ubHkgdXNlZCBmb3IgaW5wdXQgbWFwcGluZworICAgICAgICAgICAgICAgICAgICBtU2Vuc29ycy5lbXBsYWNlKHBhY2tldC5pZC8qIHJlcG9ydCBpZCovLCBzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1TZW5zb3JzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBydW4oIkhpZFJhd1NlbnNvciIpOworICAgIG1WYWxpZCA9IHRydWU7Cit9CisKK0hpZFJhd1NlbnNvckRldmljZTo6fkhpZFJhd1NlbnNvckRldmljZSgpIHsKKyAgICBBTE9HVigifkhpZFJhd1NlbnNvckRldmljZSAlcCIsIHRoaXMpOworICAgIHJlcXVlc3RFeGl0QW5kV2FpdCgpOworICAgIEFMT0dWKCJ+SGlkUmF3U2Vuc29yRGV2aWNlICVwLCB0aHJlYWQgZXhpdGVkIiwgdGhpcyk7Cit9CisKK2Jvb2wgSGlkUmF3U2Vuc29yRGV2aWNlOjp0aHJlYWRMb29wKCkgeworICAgIEFMT0dWKCJIaWQgUmF3IERldmljZSB0aHJlYWQgc3RhcnRlZCAlcCIsIHRoaXMpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZmZlcjsKKyAgICBib29sIHJldDsKKyAgICB1aW50OF90IHVzYWdlSWQ7CisKKyAgICB3aGlsZSghVGhyZWFkOjpleGl0UGVuZGluZygpKSB7CisgICAgICAgIHJldCA9IHJlY2VpdmVSZXBvcnQoJnVzYWdlSWQsICZidWZmZXIpOworICAgICAgICBpZiAoIXJldCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBhdXRvIGkgPSBtU2Vuc29ycy5maW5kKHVzYWdlSWQpOworICAgICAgICBpZiAoaSA9PSBtU2Vuc29ycy5lbmQoKSkgeworICAgICAgICAgICAgQUxPR1coIklucHV0IG9mIHVua25vdyB1c2FnZSBpZCAldSByZWNlaXZlZCIsIHVzYWdlSWQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpLT5zZWNvbmQtPmhhbmRsZUlucHV0KHVzYWdlSWQsIGJ1ZmZlcik7CisgICAgfQorCisgICAgQUxPR0koIkhpZCBSYXcgRGV2aWNlIHRocmVhZCBlbmRlZCBmb3IgJXAiLCB0aGlzKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK0Jhc2VTZW5zb3JWZWN0b3IgSGlkUmF3U2Vuc29yRGV2aWNlOjpnZXRTZW5zb3JzKCkgY29uc3QgeworICAgIEJhc2VTZW5zb3JWZWN0b3IgcmV0OworICAgIHN0ZDo6c2V0PHNwPEJhc2VTZW5zb3JPYmplY3Q+PiBzZXQ7CisgICAgZm9yIChjb25zdCBhdXRvICZzIDogbVNlbnNvcnMpIHsKKyAgICAgICAgaWYgKHNldC5maW5kKHMuc2Vjb25kKSA9PSBzZXQuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldC5wdXNoX2JhY2socy5zZWNvbmQpOworICAgICAgICAgICAgc2V0Lmluc2VydChzLnNlY29uZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworfSAvLyBuYW1lc3BhY2UgU2Vuc29ySGFsRXh0Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkUmF3U2Vuc29yRGV2aWNlLmggYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkUmF3U2Vuc29yRGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZkNDM1ZQotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRSYXdTZW5zb3JEZXZpY2UuaApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgQU5EUk9JRF9TRU5TT1JIQUxfRVhUX0hJRFJBV19TRU5TT1JfREVWSUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9TRU5TT1JIQUxfRVhUX0hJRFJBV19TRU5TT1JfREVWSUNFX0gKKworI2luY2x1ZGUgIkJhc2VTZW5zb3JPYmplY3QuaCIKKyNpbmNsdWRlICJCYXNlRHluYW1pY1NlbnNvckRhZW1vbi5oIiAvLyBCYXNlU2Vuc29yVmVjdG9yCisjaW5jbHVkZSAiSGlkUmF3RGV2aWNlLmgiCisjaW5jbHVkZSAiSGlkUmF3U2Vuc29yLmgiCisKKyNpbmNsdWRlIDxIaWRQYXJzZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgU2Vuc29ySGFsRXh0IHsKKworY2xhc3MgSGlkUmF3U2Vuc29yRGV2aWNlIDogcHVibGljIEhpZFJhd0RldmljZSwgcHVibGljIFRocmVhZCB7CitwdWJsaWM6CisgICAgc3RhdGljIHNwPEhpZFJhd1NlbnNvckRldmljZT4gY3JlYXRlKGNvbnN0IHN0ZDo6c3RyaW5nICZkZXZOYW1lKTsKKyAgICB2aXJ0dWFsIH5IaWRSYXdTZW5zb3JEZXZpY2UoKTsKKworICAgIC8vIGdldCBhIGxpc3Qgb2Ygc2Vuc29ycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBkZXZpY2UKKyAgICBCYXNlU2Vuc29yVmVjdG9yIGdldFNlbnNvcnMoKSBjb25zdDsKK3ByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDx1bnNpZ25lZCBpbnQ+IHNJbnRlcmVzdGVkOworCisgICAgLy8gY29uc3RydWN0b3Igd2lsbCByZXN1bHQgaW4gKzEgc3Ryb25nIGNvdW50CisgICAgZXhwbGljaXQgSGlkUmF3U2Vuc29yRGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nICZkZXZOYW1lKTsKKyAgICAvLyBpbXBsZW1lbnQgZnVuY3Rpb24gb2YgVGhyZWFkCisgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKSBvdmVycmlkZTsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dW5zaWduZWQgaW50LypyZXBvcnRJZCovLCBzcDxIaWRSYXdTZW5zb3I+PiBtU2Vuc29yczsKKyAgICBib29sIG1WYWxpZDsKK307CisKK30gLy8gbmFtZXNwYWNlIFNlbnNvckhhbEV4dAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9TRU5TT1JIQUxfRVhUX0hJRFJBV19ERVZJQ0VfSAorCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkU2Vuc29yRGVmLmggYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkU2Vuc29yRGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcyOGIyOAotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRTZW5zb3JEZWYuaApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIEhJRF9TRU5TT1JfREVGX0hfCisjZGVmaW5lIEhJRF9TRU5TT1JfREVGX0hfCituYW1lc3BhY2UgSGlkIHsKK25hbWVzcGFjZSBTZW5zb3IgeworbmFtZXNwYWNlIEdlbmVyYWxVc2FnZSB7CitlbnVtIHsKKyAgICBTVEFURSA9IDB4MjAwMjAxLAorICAgIEVWRU5UID0gMHgyMDAyMDIsCit9OworCit9IC8vbmFtZXNwYWNlIFVzYWdlCituYW1lc3BhY2UgUHJvcGVydHlVc2FnZSB7CitlbnVtIHsKKyAgICBGUklFTkRMWV9OQU1FID0gMHgyMDAzMDEsCisgICAgTUlOSU1VTV9SRVBPUlRfSU5URVJWQUwgPSAweDIwMDMwNCwKKyAgICBQRVJTSVNURU5UX1VOSVFVRV9JRCA9IDB4MjAwMzAyLAorICAgIFBPV0VSX1NUQVRFID0gMHgyMDAzMTksCisgICAgUkFOR0VfTUFYSU1VTSA9IDB4MjAwMzE0LAorICAgIFJBTkdFX01JTklNVU0gPSAweDIwMDMxNSwKKyAgICBSRVBPUlRJTkdfU1RBVEUgPSAweDIwMDMxNiwKKyAgICBSRVBPUlRfSU5URVJWQUwgPSAweDIwMDMwRSwKKyAgICBSRVNPTFVUSU9OID0gMHgyMDAzMTMsCisgICAgU0FNUExJTkdfUkFURSA9MHgyMDAzMTcsCisgICAgU0VOU09SX0NPTk5FQ1RJT05fVFlQRSA9IDB4MjAwMzA5LAorICAgIFNFTlNPUl9ERVNDUklQVElPTiA9IDB4MjAwMzA4LAorICAgIFNFTlNPUl9NQU5VRkFDVFVSRVIgPSAweDIwMDMwNSwKKyAgICBTRU5TT1JfTU9ERUwgPSAweDIwMDMwNiwKKyAgICBTRU5TT1JfU0VSSUFMX05VTUJFUiA9IDB4MjAwMzA3LAorICAgIFNFTlNPUl9TVEFUVVMgPSAweDIwMDMwMywKK307Cit9IC8vIG5zbWVzcGFjZSBQcm9wZXJ0eVVzYWdlCisKK25hbWVzcGFjZSBTZW5zb3JUeXBlVXNhZ2UgeworZW51bSB7CisgICAgQUNDRUxFUk9NRVRFUl8zRCA9IDB4MjAwMDczLAorICAgIENPTVBBU1NfM0QgPSAweDIwMDA4MywKKyAgICBDVVNUT00gPSAweDIwMDBFMSwKKyAgICBERVZJQ0VfT1JJRU5UQVRJT04gPSAweDIwMDA4QSwKKyAgICBHWVJPTUVURVJfM0QgPSAweDIwMDA3NiwKK307Cit9IC8vIG5hbWVzcGFjZSBTZW5zb3JUeXBlVXNhZ2UKKworbmFtZXNwYWNlIFJlcG9ydFVzYWdlIHsKK2VudW0geworICAgIEFDQ0VMRVJBVElPTl9YX0FYSVMgPSAweDIwMDQ1MywKKyAgICBBQ0NFTEVSQVRJT05fWV9BWElTID0gMHgyMDA0NTQsCisgICAgQUNDRUxFUkFUSU9OX1pfQVhJUyA9IDB4MjAwNDU1LAorICAgIEFOR1VMQVJfVkVMT0NJVFlfWF9BWElTID0gMHgyMDA0NTcsCisgICAgQU5HVUxBUl9WRUxPQ0lUWV9ZX0FYSVMgPSAweDIwMDQ1OCwKKyAgICBBTkdVTEFSX1ZFTE9DSVRZX1pfQVhJUyA9IDB4MjAwNDU5LAorICAgIENVU1RPTV9WQUxVRV8xID0gMHgyMDA1NDQsCisgICAgQ1VTVE9NX1ZBTFVFXzIgPSAweDIwMDU0NSwKKyAgICBDVVNUT01fVkFMVUVfMyA9IDB4MjAwNTQ2LAorICAgIENVU1RPTV9WQUxVRV80ID0gMHgyMDA1NDcsCisgICAgQ1VTVE9NX1ZBTFVFXzUgPSAweDIwMDU0OCwKKyAgICBDVVNUT01fVkFMVUVfNiA9IDB4MjAwNTQ5LAorICAgIE1BR05FVElDX0ZMVVhfWF9BWElTID0gMHgyMDA0ODUsCisgICAgTUFHTkVUSUNfRkxVWF9ZX0FYSVMgPSAweDIwMDQ4NiwKKyAgICBNQUdORVRJQ19GTFVYX1pfQVhJUyA9IDB4MjAwNDg3LAorICAgIE1BR05FVE9NRVRFUl9BQ0NVUkFDWSA9IDB4MjAwNDg4LAorICAgIE9SSUVOVEFUSU9OX1FVQVRFUk5JT04gPSAweDIwMDQ4MywKK307Cit9IC8vIG5hbWVzcGFjZSBSZXBvcnRVc2FnZQorCituYW1lc3BhY2UgUmF3TWluTWF4IHsKK2VudW0geworICAgIFJFUE9SVElOR19TVEFURV9NSU4gPSAwLAorICAgIFJFUE9SVElOR19TVEFURV9NQVggPSA1LAorICAgIFBPV0VSX1NUQVRFX01JTiA9IDAsCisgICAgUE9XRVJfU1RBVEVfTUFYID0gNSwKK307Cit9IC8vIG5hbWVzcGFjZSBSYXdNaW5NYXgKKworbmFtZXNwYWNlIFN0YXRlVmFsdWUgeworZW51bSB7CisgICAgUE9XRVJfU1RBVEVfRlVMTF9QT1dFUiA9IDEsCisgICAgUE9XRVJfU1RBVEVfUE9XRVJfT0ZGID0gNSwKKworICAgIFJFUE9SVElOR19TVEFURV9BTExfRVZFTlQgPSAxLAorICAgIFJFUE9SVElOR19TVEFURV9OT19FVkVOVCA9IDAsCit9OworfSAvLyBTdGF0ZVZhbHVlCit9IC8vIG5hbWVzcGFjZSBTZW5zb3IKK30gLy8gbmFtZXNwYWNlIEhpZAorI2VuZGlmIC8vIEhJRF9TRU5TT1JfREVGX0hfCisKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9BbmRyb2lkLm1rIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWExZDg5MAotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsOTkgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK0NPTU1PTl9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvciAtV2V4dHJhCisKK2hpZHBhcnNlcl9zcmMgOj0gXAorICAgIEhpZEdsb2JhbC5jcHAgXAorICAgIEhpZEl0ZW0uY3BwIFwKKyAgICBIaWRMb2NhbC5jcHAgXAorICAgIEhpZFBhcnNlci5jcHAgXAorICAgIEhpZFJlcG9ydC5jcHAgXAorICAgIEhpZFRyZWUuY3BwCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGxpYmhpZHBhcnNlcgorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKyMgaW5kZW5kZWQgdG8gYmUgdXNlZCBieSBoYWwgY29tcG9uZW50cywgdGh1cyBwcm9waWV0YXJ5CitMT0NBTF9QUk9QUklFVEFSWV9NT0RVTEUgOj0gdHJ1ZQorCitMT0NBTF9DRkxBR1MgKz0gJChDT01NT05fQ0ZMQUdTKSAtRExPR19UQUc9XCJIaWRVdGlsXCIKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGhpZHBhcnNlcl9zcmMpCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmJhc2UKK0xPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSAkKExPQ0FMX1BBVEgpCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKKyMKKyMgaG9zdCBzaWRlIHNoYXJlZCBsaWJyYXJ5IChmb3IgaG9zdCB0ZXN0LCBleGFtcGxlLCBldGMpCisjCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBsaWJoaWRwYXJzZXJfaG9zdAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfQ0ZMQUdTICs9ICQoQ09NTU9OX0NGTEFHUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoaGlkcGFyc2VyX3NyYykKKworTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTIDo9ICQoTE9DQUxfUEFUSCkKK2luY2x1ZGUgJChCVUlMRF9IT1NUX1NIQVJFRF9MSUJSQVJZKQorCisjCisjIEV4YW1wbGUgb2YgSGlkUGFyc2VyCisjCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBoaWRwYXJzZXJfZXhhbXBsZQorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfQ0ZMQUdTICs9ICQoQ09NTU9OX0NGTEFHUykKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgJChoaWRwYXJzZXJfc3JjKSBcCisgICAgdGVzdC9IaWRQYXJzZXJFeGFtcGxlLmNwcCBcCisgICAgdGVzdC9UZXN0SGlkRGVzY3JpcHRvci5jcHAKKworTE9DQUxfQ19JTkNMVURFUyArPSAkKExPQ0FMX1BBVEgpL3Rlc3QKK2luY2x1ZGUgJChCVUlMRF9IT1NUX0VYRUNVVEFCTEUpCisKKyMKKyMgQW5vdGhlciBleGFtcGxlIG9mIEhpZFBhcnNlcgorIworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gaGlkcGFyc2VyX2V4YW1wbGUyCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9DRkxBR1MgKz0gJChDT01NT05fQ0ZMQUdTKQorTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICAkKGhpZHBhcnNlcl9zcmMpIFwKKyAgICB0ZXN0L0hpZFBhcnNlckV4YW1wbGUyLmNwcCBcCisgICAgdGVzdC9UZXN0SGlkRGVzY3JpcHRvci5jcHAKKworTE9DQUxfQ19JTkNMVURFUyArPSAkKExPQ0FMX1BBVEgpL3Rlc3QKK2luY2x1ZGUgJChCVUlMRF9IT1NUX0VYRUNVVEFCTEUpCisKKyMKKyMgVGVzdCBmb3IgVHJpU3RhdGUgdGVtcGxhdGUKKyMKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IHRyaXN0YXRlX3Rlc3QKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX0NGTEFHUyArPSAkKENPTU1PTl9DRkxBR1MpCitMT0NBTF9TUkNfRklMRVMgOj0gdGVzdC9UcmlTdGF0ZVRlc3QuY3BwCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgICBsaWJndGVzdCBcCisgICAgIGxpYmd0ZXN0X21haW4KKworTE9DQUxfQ19JTkNMVURFUyArPSAkKExPQ0FMX1BBVEgpL3Rlc3QKK2luY2x1ZGUgJChCVUlMRF9IT1NUX05BVElWRV9URVNUKQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL0hpZERlZnMuaCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWREZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU0NDVkYgotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWREZWZzLmgKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBISURVVElMX0hJRERFRlNfSF8KKyNkZWZpbmUgSElEVVRJTF9ISURERUZTX0hfCisKK25hbWVzcGFjZSBIaWRVdGlsIHsKKworLy8gSElEIHNwZWNpZmljYXRpb24gY29uc3RhbnRzIGRlZmluaXRpb24KKy8vCisvLyBEZWZpbml0aW9ucyBhcmUgZnJvbSBISUQgc3BlY2lmaWNhdGlvbiB2MS4xMSwgd2hpY2ggY2FuIGJlIG9idGFpbmVkIGZyb20gaHR0cDovL3d3dy51c2Iub3JnCisvLworLy8gUHJlZmVycmVkIG5hbWVzcGFjZSBmb3IgbmFtZXNwYWNlIHJlc3RyaWN0aW9uIHRoYW4gZW51bSBjbGFzcyBhcyBlbnVtIGNsYXNzIGhhcyBzdHJvbmcgdHlwZQorLy8gd2hpY2ggaXMgaW5jb252ZW5pZW50IGluIGEgcGFyc2VyLCBpbiB3aGljaCBpbnB1dCBiaW5hcnkgdmFsdWVzIGhhcyB0byBiZSBjb21wYXJlZCB3aXRoIHRoZXNlCisvLyBkZWZpbml0aW9ucyBmcmVxdW5ldGx5LgorbmFtZXNwYWNlIEhpZERlZiB7CisvLyBIaWQgc3BlYyA2LjIuMi4zCituYW1lc3BhY2UgVGFnVHlwZSB7CitlbnVtIHsKKyAgICBNQUlOLAorICAgIEdMT0JBTCwKKyAgICBMT0NBTCwKKyAgICBSRVNFUlZFRAorfTsKK30gLy8gbmFtZXNwYWNlIFRhZ1R5cGUKKworLy8gSElEIHNwZWMgNi4yLjIuNAorbmFtZXNwYWNlIFJlcG9ydEZsYWcgeworZW51bSB7CisgICAgREFUQV9DT05TVCA9IDEsCisgICAgQVJSQVlfVkFSSUFCTEUgPSAyLAorICAgIFdSQVAgPSA0LAorICAgIE5PTkxJTkVBUiA9IDgsCisgICAgTk9fUFJFRkVSUkVEID0gMHgxMCwKKyAgICBOVUxMX1NUQVRFID0gMHgyMCwKKyAgICBWT0xBVElMRSA9IDB4NDAsCisgICAgLy8gYml0IDcgcmVzZXJ2ZWQKKyAgICBCVUZGRVJFRF9CWVRFUyA9IDB4MTAwCit9OworfSAvLyBuYW1lc3BhY2UgUmVwb3J0RmxhZworCisvLyBISUQgc3BlYyA2LjIuMi41CituYW1lc3BhY2UgTWFpblRhZyB7CitlbnVtIHsKKyAgICBJTlBVVCA9IDgsCisgICAgT1VUUFVUID0gOSwKKyAgICBDT0xMRUNUSU9OID0gMTAsCisgICAgRkVBVFVSRSA9IDExLAorICAgIEVORF9DT0xMRUNUSU9OID0gMTIsCisgICAgTE9OR19JVEVNID0gMTUsCit9OworfSAvLyBuYW1lc3BhY2UgTWFpblRhZworCisvLyBISUQgc3BlYyA2LjIuMi42CituYW1lc3BhY2UgQ29sbGVjdGlvblR5cGUgeworZW51bSB7CisgICAgUEhZU0lDQUwgPSAwLAorICAgIEFQUExJQ0FUSU9OLAorICAgIExPR0lDQUwsCisgICAgUkVQT1JULAorICAgIE5BTUVEX0FSUkFZLAorICAgIFVTQUdFX1NXSVRDSCwKKyAgICBVU0FHRV9NT0RJRklFUgorfTsKK30gLy8gbmFtZXNwYWNlIENvbGxlY3Rpb25UeXBlCisKKy8vIEhJRCBzcGVjIDYuMi4yLjcKK25hbWVzcGFjZSBHbG9iYWxUYWcgeworZW51bSB7CisgICAgVVNBR0VfUEFHRSwKKyAgICBMT0dJQ0FMX01JTklNVU0sCisgICAgTE9HSUNBTF9NQVhJTVVNLAorICAgIFBIWVNJQ0FMX01JTklNVU0sCisgICAgUEhZU0lDQUxfTUFYSU1VTSwKKyAgICBVTklUX0VYUE9ORU5ULAorICAgIFVOSVQsCisgICAgUkVQT1JUX1NJWkUsCisgICAgUkVQT1JUX0lELAorICAgIFJFUE9SVF9DT1VOVCwKKyAgICBQVVNILAorICAgIFBPUAorfTsKK30gLy9uYW1lc3BhY2UgR2xvYmFsVGFnCisKKy8vIEhJRCBzcGVjIDYuMi4yLjgKK25hbWVzcGFjZSBMb2NhbFRhZyB7CitlbnVtIEhpZExvY2FsVGFnIHsKKyAgICBVU0FHRSwKKyAgICBVU0FHRV9NSU5JTVVNLAorICAgIFVTQUdFX01BWElNVU0sCisgICAgREVTSUdOQVRPUl9JTkRFWCwKKyAgICBERVNJR05BVE9SX01JTklNVU0sCisgICAgREVTSUdOQVRPUl9NQVhJTVVNLAorICAgIC8vIHRoZXJlIGlzIGEgaG9sZSBoZXJlIGluIHRoZSBzcGVjCisgICAgU1RSSU5HX0lOREVYID0gNywKKyAgICBTVFJJTkdfTUlOSU1VTSwKKyAgICBTVFJJTkdfTUFYSU1VTSwKKyAgICBERUxJTUlUT1IKK307Cit9IC8vIG5hbWVzcGFjZSBMb2NhbFRhZworCit9IC8vbmFtZXNwYWNlIEhpZERlZgorfSAvL25hbWVzcGFjZSBIaWRVdGlsCisKKyNlbmRpZiAvLyBISURVVElMX0hJRERFRlNfSF8KZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWRHbG9iYWwuY3BwIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL0hpZEdsb2JhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE0NzEzYgotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWRHbG9iYWwuY3BwCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlICJIaWREZWZzLmgiCisjaW5jbHVkZSAiSGlkR2xvYmFsLmgiCisjaW5jbHVkZSAiSGlkTG9nLmgiCisKK25hbWVzcGFjZSBIaWRVdGlsIHsKK3VzaW5nIG5hbWVzcGFjZSBIaWREZWY6Okdsb2JhbFRhZzsKKworYm9vbCBIaWRHbG9iYWw6OmFwcGVuZChjb25zdCBIaWRJdGVtICZpKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIEhpZERlZjo6VGFnVHlwZTsKKyAgICBpZiAoaS50eXBlICE9IEdMT0JBTCkgeworICAgICAgICBMT0dfRSA8PCAiSGlkR2xvYmFsOjphcHBlbmQgY2Fubm90IHByb2Nlc3MgdGFnIHRoYXQgaXMgbm90IGdsb2JhbCwgIiA8PCBpIDw8IExPR19FTkRMOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGkudGFnID09IFBVU0ggfHwgaS50YWcgPT0gUE9QKSB7CisgICAgICAgIExPR19FIDw8ICJQVVNIIGFuZCBQT1Agc2hvdWxkIGJlIGhhbmRsZWQgaW4gSGlkR2xvYmFsU3RhY2ssICIgPDwgaSA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludCBzaWduZWRJbnRlZ2VyOworICAgIHVuc2lnbmVkIHVuc2lnbmVkSW50ZWdlcjsKKyAgICBib29sIHNpZ25lZEVycm9yID0gIWkuZGF0YUFzU2lnbmVkKCZzaWduZWRJbnRlZ2VyKTsKKyAgICBib29sIHVuc2lnbmVkRXJyb3IgPSAhaS5kYXRhQXNVbnNpZ25lZCgmdW5zaWduZWRJbnRlZ2VyKTsKKworICAgIGJvb2wgdmFsdWVFcnJvciA9IGZhbHNlOworICAgIGJvb2wgcmV0ID0gdHJ1ZTsKKyAgICBzd2l0Y2ggKGkudGFnKSB7CisgICAgICAgIGNhc2UgVVNBR0VfUEFHRToKKyAgICAgICAgICAgIHVzYWdlUGFnZSA9IHVuc2lnbmVkSW50ZWdlcjsKKyAgICAgICAgICAgIHZhbHVlRXJyb3IgPSB1bnNpZ25lZEVycm9yOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTE9HSUNBTF9NSU5JTVVNOgorICAgICAgICAgICAgbG9naWNhbE1pbiA9IHNpZ25lZEludGVnZXI7CisgICAgICAgICAgICB2YWx1ZUVycm9yID0gc2lnbmVkRXJyb3I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMT0dJQ0FMX01BWElNVU06CisgICAgICAgICAgICBsb2dpY2FsTWF4ID0gc2lnbmVkSW50ZWdlcjsKKyAgICAgICAgICAgIHZhbHVlRXJyb3IgPSBzaWduZWRFcnJvcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBIWVNJQ0FMX01JTklNVU06CisgICAgICAgICAgICBwaHlzaWNhbE1pbiA9IHNpZ25lZEludGVnZXI7CisgICAgICAgICAgICB2YWx1ZUVycm9yID0gc2lnbmVkRXJyb3I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQSFlTSUNBTF9NQVhJTVVNOgorICAgICAgICAgICAgcGh5c2ljYWxNYXggPSBzaWduZWRJbnRlZ2VyOworICAgICAgICAgICAgdmFsdWVFcnJvciA9IHNpZ25lZEVycm9yOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVU5JVF9FWFBPTkVOVDoKKyAgICAgICAgICAgIGV4cG9uZW50ID0gdW5zaWduZWRJbnRlZ2VyOworICAgICAgICAgICAgdmFsdWVFcnJvciA9IHVuc2lnbmVkRXJyb3I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBVTklUOgorICAgICAgICAgICAgdW5pdCA9IHVuc2lnbmVkSW50ZWdlcjsKKyAgICAgICAgICAgIHZhbHVlRXJyb3IgPSB1bnNpZ25lZEVycm9yOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVQT1JUX1NJWkU6CisgICAgICAgICAgICByZXBvcnRTaXplID0gdW5zaWduZWRJbnRlZ2VyOworICAgICAgICAgICAgdmFsdWVFcnJvciA9IHVuc2lnbmVkRXJyb3I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRVBPUlRfSUQ6CisgICAgICAgICAgICByZXBvcnRJZCA9IHVuc2lnbmVkSW50ZWdlcjsKKyAgICAgICAgICAgIHZhbHVlRXJyb3IgPSB1bnNpZ25lZEVycm9yOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVQT1JUX0NPVU5UOgorICAgICAgICAgICAgcmVwb3J0Q291bnQgPSB1bnNpZ25lZEludGVnZXI7CisgICAgICAgICAgICB2YWx1ZUVycm9yID0gdW5zaWduZWRFcnJvcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0UgPDwgInVua25vd24gZ2xvYmFsIHRhZywgIiA8PCBpIDw8IExPR19FTkRMOworICAgICAgICAgICAgcmV0ID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHZhbHVlRXJyb3IpIHsKKyAgICAgICAgTE9HX0UgPDwgIkNhbm5vdCBnZXQgc2lnbmVkIC8gdW5zaWduZWQgZGF0YSBhdCAiIDw8IGkgPDwgTE9HX0VOREw7CisgICAgICAgIHJldCA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitib29sIEhpZEdsb2JhbFN0YWNrOjphcHBlbmQoY29uc3QgSGlkSXRlbSAmaSkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBIaWREZWY6OlRhZ1R5cGU7CisgICAgaWYgKGkudHlwZSAhPSBHTE9CQUwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgcmV0ID0gdHJ1ZTsKKyAgICBpZiAoaS50YWcgPT0gUFVTSCkgeworICAgICAgICBtU3RhY2sucHVzaF9iYWNrKHRvcCgpKTsKKyAgICB9IGVsc2UgaWYgKGkudGFnID09IFBPUCkgeworICAgICAgICBtU3RhY2sucG9wX2JhY2soKTsKKyAgICAgICAgaWYgKG1TdGFjay5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgbVN0YWNrLnB1c2hfYmFjayhIaWRHbG9iYWwoKSk7IC8vIGZhaWwtc2FmZQorICAgICAgICAgICAgcmV0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBtU3RhY2suYmFjaygpLmFwcGVuZChpKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworSGlkR2xvYmFsU3RhY2s6OkhpZEdsb2JhbFN0YWNrKCkgeworICAgIC8vIGRlZmF1bHQgZWxlbWVudAorICAgIG1TdGFjay5wdXNoX2JhY2soSGlkR2xvYmFsKCkpOworfQorCitjb25zdCBIaWRHbG9iYWwmIEhpZEdsb2JhbFN0YWNrOjp0b3AoKSBjb25zdCB7CisgICAgcmV0dXJuIG1TdGFjay5iYWNrKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIEhpZFV0aWwKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWRHbG9iYWwuaCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWRHbG9iYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTEzOWQwCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL0hpZEdsb2JhbC5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBISURVVElMX0hJREdMT0JBTF9IXworI2RlZmluZSBISURVVElMX0hJREdMT0JBTF9IXworCisjaW5jbHVkZSAiSGlkSXRlbS5oIgorI2luY2x1ZGUgIlRyaVN0YXRlLmgiCisKK25hbWVzcGFjZSBIaWRVdGlsIHsKKy8vIEEgc2V0IG9mIGdsb2JhbCBzdGF0ZXMgdGhhdCBwYXJzZXIgaGFzIHRvIGtlZXAgdHJhY2sgZHVyaW5nIHBhcnNpbmcuCisvLyBUaGV5IGFyZSBhbGwgc3BlY2lmaWVkIGluIEhJRCBzcGVjIHYxLjExIHNlY3Rpb24gNi4yLjIuNworc3RydWN0IEhpZEdsb2JhbCB7CisgICAgLy8gYWRkIGEgdG9rZW4gYW5kIGNoYW5nZSBnbG9iYWwgc3RhdGVzLCByZXR1cm5zIHZhbHVlIGluZGljYXRlcyBpZiBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bAorICAgIGJvb2wgYXBwZW5kKGNvbnN0IEhpZEl0ZW0gJmkpOworCisgICAgdHJpX3VpbnQgdXNhZ2VQYWdlOworICAgIHRyaV9pbnQgIGxvZ2ljYWxNaW47CisgICAgdHJpX2ludCAgbG9naWNhbE1heDsKKyAgICB0cmlfaW50ICBwaHlzaWNhbE1pbjsKKyAgICB0cmlfaW50ICBwaHlzaWNhbE1heDsKKyAgICB0cmlfdWludCBleHBvbmVudDsKKyAgICB0cmlfdWludCB1bml0OworICAgIHRyaV91aW50IHJlcG9ydFNpemU7CisgICAgdHJpX3VpbnQgcmVwb3J0SWQ7CisgICAgdHJpX3VpbnQgcmVwb3J0Q291bnQ7Cit9OworCisvLyBISUQgc3BlY3MgYWxsb3dzIFBVU0ggYW5kIFBPUCB0byBzYXZlIGEgc25hcHNob3Qgb2YgY3VycmVudCBnbG9iYWwgc3RhdGVzIGFuZCBjb21lIGJhY2sgdG8gdGhlCisvLyBzYXZlZCBzYXRlcyBsYXRlci4gSGlkU3RhY2sgbWFuYWdlcyB0aGlzIGxvZ2ljLiBOb3RlIHRoYXQgUFVTSCBhbmQgUE9QIGFyZSBhbHNvIEhpZEl0ZW1zLCBzbworLy8gdGhlcmUgaXMgbm8gZXhwbGljaXQgcHVzaCBhbmQgcG9wIGZ1bmN0aW9uIGluIHRoaXMgc3RhY2sgaW1wbGVtZW50YXRpb24uCitjbGFzcyBIaWRHbG9iYWxTdGFjayB7CitwdWJsaWM6CisgICAgSGlkR2xvYmFsU3RhY2soKTsKKworICAgIC8vIGFkZCBhIHRva2VuIGFuZCBjaGFuZ2UgZ2xvYmFsIHN0YXRlcywgcmV0dXJucyB2YWx1ZSBpbmRpY2F0ZXMgaWYgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwKKyAgICAvLyBpdCB0aGUgdG9rZW4gaXMgcHVzaC9wb3AsIHRoZSBzdGFjayBwdXNoL3BvcCBhY2NvcmRpbmdseS4KKyAgICBib29sIGFwcGVuZChjb25zdCBIaWRJdGVtICZpKTsKKworICAgIC8vIGdldCByZWZlcmVuY2UgdG8gdG9wIGVsZW1lbnQgb24gdGhlIHN0YWNrCisgICAgY29uc3QgSGlkR2xvYmFsJiB0b3AoKSBjb25zdDsKK3ByaXZhdGU6CisgICAgc3RkOjp2ZWN0b3I8SGlkR2xvYmFsPiBtU3RhY2s7Cit9OworCit9IC8vbmFtZXNwYWNlIEhpZFV0aWwKKworI2VuZGlmIC8vIEhJRFVUSUxfSElER0xPQUJMX0hfCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvSGlkSXRlbS5jcHAgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvSGlkSXRlbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcwNGRiNwotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWRJdGVtLmNwcApAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiSGlkSXRlbS5oIgorI2luY2x1ZGUgIkhpZERlZnMuaCIKKyNpbmNsdWRlICJTdHJlYW1Jb1V0aWwuaCIKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworbmFtZXNwYWNlIEhpZFV0aWwgeworCitib29sIEhpZEl0ZW06OmRhdGFBc1Vuc2lnbmVkKHVuc2lnbmVkIGludCAqb3V0KSBjb25zdCAgeworICAgIGlmIChkYXRhLnNpemUoKSA+IDQgfHwgZGF0YS5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKm91dCA9IDA7CisgICAgaW50IHNoaWZ0ID0gMDsKKworICAgIGZvciAoYXV0byBpIDogZGF0YSkgeworICAgICAgICAqb3V0IHw9IChpIDw8IHNoaWZ0KTsKKyAgICAgICAgc2hpZnQgKz0gODsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSGlkSXRlbTo6ZGF0YUFzU2lnbmVkKGludCAqb3V0KSBjb25zdCB7CisgICAgdW5zaWduZWQgaW50IHU7CisgICAgaWYgKCFkYXRhQXNVbnNpZ25lZCgmdSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzaXplX3QgYml0U2l6ZV8xID0gZGF0YS5zaXplKCkgKiA4IC0gMTsKKyAgICB1bnNpZ25lZCBpbnQgc2lnbiA9IHUgJiAoMSA8PCBiaXRTaXplXzEpOworICAgICpvdXQgPSB1IHwgKChzaWduID09IDApID8gMCA6ICggfjAgPDwgYml0U2l6ZV8xKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0ZDo6dmVjdG9yPEhpZEl0ZW0+IEhpZEl0ZW06OnRva2VuaXplKGNvbnN0IHVpbnQ4X3QgKmJlZ2luLCBzaXplX3Qgc2l6ZSkgeworICAgIC8vIGNvbnN0cnVjdCBhIHN0cmVhbQorICAgIGNoYXJ2ZWN0b3JidWY8dW5zaWduZWQgY2hhcj4gYnVmKGJlZ2luLCBzaXplKTsKKyAgICBzdGQ6OmlzdHJlYW0gaXMoJmJ1Zik7CisgICAgcmV0dXJuIHRva2VuaXplKGlzKTsKK30KKworc3RkOjp2ZWN0b3I8SGlkSXRlbT4gSGlkSXRlbTo6dG9rZW5pemUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmRlc2NyaXB0b3IpIHsKKyAgICAvLyBjb25zdHJ1Y3QgYSBzdHJlYW0KKyAgICBjaGFydmVjdG9yYnVmPHVuc2lnbmVkIGNoYXI+IGJ1ZihkZXNjcmlwdG9yKTsKKyAgICBzdGQ6OmlzdHJlYW0gaXMoJmJ1Zik7CisgICAgcmV0dXJuIHRva2VuaXplKGlzKTsKK30KKworc3RkOjp2ZWN0b3I8SGlkSXRlbT4gSGlkSXRlbTo6dG9rZW5pemUoc3RkOjppc3RyZWFtICZpcykgeworICAgIHN0ZDo6dmVjdG9yPEhpZEl0ZW0+IGhpZFRva2VuOworCisgICAgLy8gdGhpcyBpcyBpbXBvcnRhbnQgdG8gYXZvaWQgc2tpcHBpbmcgY2hhcmFjdGVycworICAgIGlzLnVuc2V0ZihzdGQ6Omlvc19iYXNlOjpza2lwd3MpOworICAgIHdoaWxlICghaXMuZW9mKCkpIHsKKyAgICAgICAgSGlkSXRlbSBpOworICAgICAgICBpcyA+PiBpOworICAgICAgICBpZiAoaS52YWxpZCkgeworICAgICAgICAgICAgaGlkVG9rZW4ucHVzaF9iYWNrKGkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGhpZFRva2VuOworfQorCitzdGQ6OmlzdHJlYW0mIG9wZXJhdG9yPj4oc3RkOjppc3RyZWFtICZpcywgSGlkVXRpbDo6SGlkSXRlbSAmaCkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBIaWRVdGlsOjpIaWREZWY6Ok1haW5UYWc7CisgICAgdXNpbmcgbmFtZXNwYWNlIEhpZFV0aWw6OkhpZERlZjo6VGFnVHlwZTsKKworICAgIGgudmFsaWQgPSBmYWxzZTsKKyAgICBoLm9mZnNldCA9IGlzLnRlbGxnKCk7CisgICAgaC5ieXRlU2l6ZSA9IDA7CisgICAgdW5zaWduZWQgY2hhciBmaXJzdDsKKyAgICBpcyA+PiBmaXJzdDsKKyAgICBpZiAoIWlzLmVvZigpKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3QgbGVuVGFibGVbXSA9IHsgMCwgMSwgMiwgNCB9OworICAgICAgICBzaXplX3QgbGVuID0gbGVuVGFibGVbZmlyc3QgJiAweDNdOyAvLyBsb3cgMiBiaXRzIGFyZSBsZW5ndGggZGVzY3JpcHRvcgorICAgICAgICBoLnRhZyA9IChmaXJzdCA+PiA0KTsKKyAgICAgICAgaC50eXBlID0gKGZpcnN0ICYgMHhDKSA+PiAyOworCisgICAgICAgIGlmIChoLnRhZyA9PSBMT05HX0lURU0gJiYgaC50eXBlID09IFJFU0VSVkVEKSB7IC8vIGxvbmcgaXRlbQorICAgICAgICAgICAgLy9sb25nIGl0ZW0KKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYiA9IDA7CisgICAgICAgICAgICBpcyA+PiBiOworICAgICAgICAgICAgbGVuID0gYjsKKyAgICAgICAgICAgIGlzID4+IGI7CisgICAgICAgICAgICBoLnRhZyA9IGI7CisgICAgICAgIH0KKworICAgICAgICBoLmRhdGEucmVzaXplKGxlbik7CisgICAgICAgIGZvciAoYXV0byAmaSA6IGguZGF0YSkgeworICAgICAgICAgICAgaWYgKGlzLmVvZigpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpcyA+PiBpOworICAgICAgICB9CisgICAgICAgIGguYnl0ZVNpemUgPSAoc3NpemVfdCkgaXMudGVsbGcoKSAtIGgub2Zmc2V0OworICAgICAgICBoLnZhbGlkID0gIWlzLmVvZigpOworICAgIH0KKworICAgIHJldHVybiBpczsKK30KKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSAmb3MsIGNvbnN0IEhpZFV0aWw6OkhpZEl0ZW0gJmgpIHsKKyAgICBvcyA8PCAib2Zmc2V0OiAiIDw8IGgub2Zmc2V0IDw8ICIsIHNpemU6ICIgPDwgaC5ieXRlU2l6ZQorICAgICAgIDw8ICIsIHRhZzogIiA8PCBoLnRhZyA8PCAiLCB0eXBlOiAiIDw8IGgudHlwZSA8PCAiLCBkYXRhOiAiOworICAgIGlmIChoLmRhdGEuZW1wdHkoKSkgeworICAgICAgICBvcyA8PCAiW2VtcHR5XSI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3MgPDwgaC5kYXRhLnNpemUoKSA8PCAiIGJ5dGUocykgeyI7CisgICAgICAgIGZvciAoYXV0byBpIDogaC5kYXRhKSB7CisgICAgICAgICAgICBvcyA8PCAoaW50KSBpIDw8ICIsICI7CisgICAgICAgIH0KKyAgICAgICAgb3MgPDwgIn0iOworICAgIH0KKyAgICByZXR1cm4gb3M7Cit9Cit9IC8vIG5hbWVzcGFjZSBIaWRVdGlsCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvSGlkSXRlbS5oIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL0hpZEl0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWM3OWU5Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL0hpZEl0ZW0uaApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgSElEVVRJTF9ISURJVEVNX0hfCisjZGVmaW5lIEhJRFVUSUxfSElESVRFTV9IXworCisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8aXN0cmVhbT4KKyNpbmNsdWRlIDxvc3RyZWFtPgorCituYW1lc3BhY2UgSGlkVXRpbCB7CisKK3N0cnVjdCBIaWRJdGVtIHsKKyAgICBib29sIHZhbGlkOworICAgIHVuc2lnbmVkIGludCB0eXBlOworICAgIHVuc2lnbmVkIGludCB0YWc7CisgICAgc3NpemVfdCBvZmZzZXQ7CisgICAgc3NpemVfdCBieXRlU2l6ZTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhOworCisgICAgYm9vbCBkYXRhQXNVbnNpZ25lZCh1bnNpZ25lZCBpbnQgKm91dCkgY29uc3Q7CisgICAgYm9vbCBkYXRhQXNTaWduZWQoaW50ICpvdXQpIGNvbnN0OworCisgICAgLy8gZnJpZW5kIHN0cmVhbSBmdW5jdGlvbnMKKyAgICBmcmllbmQgc3RkOjppc3RyZWFtJiBvcGVyYXRvcj4+KHN0ZDo6aXN0cmVhbSAmaXMsIEhpZEl0ZW0gJmgpOworICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtICZvcywgY29uc3QgSGlkSXRlbSAmaCk7CisKKyAgICAvLyB0b2tlbml6ZSBmcm9tIGEgdW5zaWduZWQgY2hhciB2ZWN0b3IKKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8SGlkSXRlbT4gdG9rZW5pemUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmRlc2NyaXB0b3IpOworICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxIaWRJdGVtPiB0b2tlbml6ZShjb25zdCB1aW50OF90ICpiZWdpbiwgc2l6ZV90IHNpemUpOworICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxIaWRJdGVtPiB0b2tlbml6ZShzdGQ6OmlzdHJlYW0gJmlzKTsKK307CisKKy8vIHBhcnNpbmcgaW4gZnJvbSBiaW5hcnkgc3RyZWFtCitzdGQ6OmlzdHJlYW0mIG9wZXJhdG9yPj4oc3RkOjppc3RyZWFtICZpcywgSGlkVXRpbDo6SGlkSXRlbSAmaCk7CisKKy8vIG91dHB1dCBhcyBodW1hbiByZWFkYWJsZSBzdHJpbmcgdG8gc3RyZWFtCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtICZvcywgY29uc3QgSGlkVXRpbDo6SGlkSXRlbSAmaCk7Cit9IC8vbmFtZXNwYWNlIEhpZFV0aWwKKworI2VuZGlmIC8vIEhJRFVUSUxfSElESVRFTV9IXwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL0hpZExvY2FsLmNwcCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWRMb2NhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYxN2FiZQotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWRMb2NhbC5jcHAKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgIkhpZERlZnMuaCIKKyNpbmNsdWRlICJIaWRMb2NhbC5oIgorI2luY2x1ZGUgIkhpZExvZy5oIgorI2luY2x1ZGUgPGNzdGRkZWY+CisKK25hbWVzcGFjZSBIaWRVdGlsIHsKKworY29uc3RleHByIHVpbnQzMl90IElOVkFMSURfVVNBR0UgPSAweEZGRkY7Citjb25zdGV4cHIgdWludDMyX3QgSU5WQUxJRF9ERVNJR05BVE9SID0gMHhGRkZGOworY29uc3RleHByIHVpbnQzMl90IElOVkFMSURfU1RSSU5HID0gMHhGRkZGOworCit1aW50MzJfdCBIaWRMb2NhbDo6Z2V0VXNhZ2Uoc2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgaWYgKHVzYWdlLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfVVNBR0U7CisgICAgfQorICAgIHJldHVybiAoaW5kZXggPj0gdXNhZ2Uuc2l6ZSgpKSA/IHVzYWdlLmJhY2soKSA6IHVzYWdlW2luZGV4XTsKK30KKwordWludDMyX3QgSGlkTG9jYWw6OmdldERlc2lnbmF0b3Ioc2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgaWYgKGRlc2lnbmF0b3IuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9ERVNJR05BVE9SOworICAgIH0KKyAgICByZXR1cm4gKGluZGV4ID49IGRlc2lnbmF0b3Iuc2l6ZSgpKSA/IGRlc2lnbmF0b3IuYmFjaygpIDogZGVzaWduYXRvcltpbmRleF07Cit9CisKK3VpbnQzMl90IEhpZExvY2FsOjpnZXRTdHJpbmcoc2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgaWYgKHN0cmluZy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX1NUUklORzsKKyAgICB9CisgICAgcmV0dXJuIChpbmRleCA+PSBzdHJpbmcuc2l6ZSgpKSA/IHN0cmluZy5iYWNrKCkgOiBzdHJpbmdbaW5kZXhdOworfQorCit2b2lkIEhpZExvY2FsOjpjbGVhcigpIHsKKyAgICAqdGhpcyA9IEhpZExvY2FsKCk7Cit9CisKK2Jvb2wgSGlkTG9jYWw6OmFwcGVuZChjb25zdCBIaWRJdGVtICZpKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIEhpZERlZjo6TG9jYWxUYWc7CisKKyAgICBib29sIHJldCA9IHRydWU7CisgICAgdW5zaWduZWQgdW5zaWduZWRJbnRlZ2VyOworICAgIGJvb2wgdW5zaWduZWRFcnJvciA9ICFpLmRhdGFBc1Vuc2lnbmVkKCZ1bnNpZ25lZEludGVnZXIpOworICAgIGJvb2wgdmFsdWVFcnJvciA9IGZhbHNlOworCisgICAgc3dpdGNoIChpLnRhZykgeworICAgICAgICBjYXNlIFVTQUdFOgorICAgICAgICAgICAgdXNhZ2UucHVzaF9iYWNrKHVuc2lnbmVkSW50ZWdlcik7CisgICAgICAgICAgICB2YWx1ZUVycm9yID0gdW5zaWduZWRFcnJvcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFVTQUdFX01JTklNVU06CisgICAgICAgICAgICB1c2FnZU1pbiA9IHVuc2lnbmVkSW50ZWdlcjsKKyAgICAgICAgICAgIHZhbHVlRXJyb3IgPSB1bnNpZ25lZEVycm9yOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVVNBR0VfTUFYSU1VTToKKyAgICAgICAgICAgIGlmICghdXNhZ2VNaW4uaXNTZXQoKSkgeworICAgICAgICAgICAgICAgIExPR19FIDw8ICJ1c2FnZSBtaW4gbm90IHNldCB3aGVuIHNhdyB1c2FnZSBtYXggIiA8PCBpIDw8IExPR19FTkRMOworICAgICAgICAgICAgICAgIHJldCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB1c2FnZW1heCA9IHVuc2lnbmVkSW50ZWdlcjsKKyAgICAgICAgICAgICAgICB2YWx1ZUVycm9yID0gdW5zaWduZWRFcnJvcjsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gdXNhZ2VNaW4uZ2V0KDApOyBqIDw9IHVzYWdlbWF4OyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgdXNhZ2UucHVzaF9iYWNrKGopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1c2FnZU1pbi5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RSSU5HX0lOREVYOgorICAgICAgICAgICAgc3RyaW5nLnB1c2hfYmFjayh1bnNpZ25lZEludGVnZXIpOworICAgICAgICAgICAgdmFsdWVFcnJvciA9IHVuc2lnbmVkRXJyb3I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVFJJTkdfTUlOSU1VTToKKyAgICAgICAgICAgIHN0cmluZ01pbiA9IHVuc2lnbmVkSW50ZWdlcjsKKyAgICAgICAgICAgIHZhbHVlRXJyb3IgPSB1bnNpZ25lZEVycm9yOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RSSU5HX01BWElNVU06IHsKKyAgICAgICAgICAgIGlmICghdXNhZ2VNaW4uaXNTZXQoKSkgeworICAgICAgICAgICAgICAgIExPR19FIDw8ICJzdHJpbmcgbWluIG5vdCBzZXQgd2hlbiBzYXcgc3RyaW5nIG1heCAiIDw8IGkgPDwgTE9HX0VOREw7CisgICAgICAgICAgICAgICAgcmV0ID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmluZ01heCA9IHVuc2lnbmVkSW50ZWdlcjsKKyAgICAgICAgICAgICAgICB2YWx1ZUVycm9yID0gdW5zaWduZWRFcnJvcjsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gc3RyaW5nTWluLmdldCgwKTsgaiA8PSBzdHJpbmdNYXg7ICsraikgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmcucHVzaF9iYWNrKGopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdHJpbmdNaW4uY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgREVMSU1JVE9SOgorICAgICAgICAgICAgZGVsaW1ldGVyID0gdW5zaWduZWRJbnRlZ2VyOworICAgICAgICAgICAgdmFsdWVFcnJvciA9IHVuc2lnbmVkRXJyb3I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19FIDw8ICJ1bmtub3duIGxvY2FsIHRhZywgIiA8PCBpIDw8IExPR19FTkRMOworICAgICAgICAgICAgcmV0ID0gZmFsc2U7CisgICAgfQorICAgIGlmICh2YWx1ZUVycm9yKSB7CisgICAgICAgIExPR19FIDw8ICJDYW5ub3QgZ2V0IHVuc2lnbmVkIGRhdGEgYXQgIiA8PCBpIDw8IExPR19FTkRMOworICAgICAgICByZXQgPSBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KK30gLy9uYW1lc3BhY2UgSGlkVXRpbApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL0hpZExvY2FsLmggYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvSGlkTG9jYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzMwYjMwCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL0hpZExvY2FsLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIEhJRFVUSUxfSElETE9DQUxfSF8KKyNkZWZpbmUgSElEVVRJTF9ISURMT0NBTF9IXworCisjaW5jbHVkZSAiSGlkSXRlbS5oIgorI2luY2x1ZGUgIlRyaVN0YXRlLmgiCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBIaWRVdGlsIHsKKworLy8gQSBzZXQgb2YgbG9jYWwgc3RhdGVzIHRoYXQgcGFyc2VyIGhhcyB0byBrZWVwIHRyYWNrIGR1cmluZyBwYXJzaW5nLgorLy8gVGhleSBhcmUgYWxsIHNwZWNpZmllZCBpbiBISUQgc3BlYyB2MS4xMSBzZWN0aW9uIDYuMi4yLjgKK3N0cnVjdCBIaWRMb2NhbCB7CisgICAgLy8gYWRkIGEgdG9rZW4gdG8gY2hhbmdlIGxvY2FsIHN0YXRlcywgcmV0dXJuIHZhbHVlIGluZGljYXRlcyBpZiBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bAorICAgIGJvb2wgYXBwZW5kKGNvbnN0IEhpZEl0ZW0gJmkpOworICAgIC8vIGNsZWFyIGFsbCBsb2NhbCBzdGF0ZXMuIFRoaXMgbmVlZCB0byBiZSBkb25lIGFmdGVyIGVhY2ggbWFpbiB0YWcKKyAgICB2b2lkIGNsZWFyKCk7CisKKyAgICAvLyBtdWx0aXBsZSB1c2FnZSwgZGVzaWduYXRvciBvciBzdHJpbmdzIG1heSBleGlzdCBmb3Igc2luZ2xlIGlucHV0L291dHB1dC9mZWF0dXJlIHJlcG9ydAorICAgIHVpbnQzMl90IGdldFVzYWdlKHNpemVfdCBpbmRleCkgY29uc3Q7CisgICAgdWludDMyX3QgZ2V0RGVzaWduYXRvcihzaXplX3QgaW5kZXgpIGNvbnN0OworICAgIHVpbnQzMl90IGdldFN0cmluZyhzaXplX3QgaW5kZXgpIGNvbnN0OworCisgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHVzYWdlOworICAgIC8vIGtlZXAgdHJhY2sgb2YgdXNhZ2UgbWluIHdoZW4gZXhwZWN0aW5nIGEgdXNhZ2UgbWF4CisgICAgdHJpX3VpbnQgdXNhZ2VNaW47CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gZGVzaWduYXRvcjsKKyAgICAvLyBrZWVwIHRyYWNrIG9mIGRlc2lnbmF0b3IgbWluIHdoZW4gZXhwZWN0aW5nIGRlc2lnbmF0b3IgbWF4CisgICAgdHJpX3VpbnQgZGVzaWduYXRvck1pbjsKKworICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBzdHJpbmc7CisgICAgLy8ga2VlcCB0cmFjayBvZiBzdHJpbmcgbWluIHdoZW4gZXhwZWN0aW5nIHN0cmluZyBtYXgKKyAgICB0cmlfdWludCBzdHJpbmdNaW47CisKKyAgICB0cmlfdWludCBkZWxpbWV0ZXI7Cit9OworfSAvLyBuYW1lc3BhY2UgSGlkVXRpbAorCisjZW5kaWYgLy8gSElEVVRJTF9ISURMT0NBTF9IXwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL0hpZExvZy5oIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL0hpZExvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3N2RlNTcKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvSGlkTG9nLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIEhJRFVUSUxfSElETE9HX0hfCisjZGVmaW5lIEhJRFVUSUxfSElETE9HX0hfCisKKyNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKSAmJiAhZGVmaW5lZChMT0dfVE9fQ09OU09MRSkKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2RlZmluZSBMT0dfRU5ETCAiIgorI2RlZmluZSBMT0dfRSBMT0coRVJST1IpCisjZGVmaW5lIExPR19XIExPRyhXQVJOSU5HKQorI2RlZmluZSBMT0dfSSBMT0coSU5GTykKKyNkZWZpbmUgTE9HX0QgTE9HKERFQlVHKQorI2RlZmluZSBMT0dfViBMT0coVkVSQk9TRSkKKyNlbHNlCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjZGVmaW5lIExPR19FTkRMIHN0ZDo6ZW5kbAorI2RlZmluZSBMT0dfRSAoc3RkOjpjZXJyIDw8ICJFOiAiKQorI2RlZmluZSBMT0dfVyAoc3RkOjpjZXJyIDw8ICJXOiAiKQorI2RlZmluZSBMT0dfSSAoc3RkOjpjZXJyIDw8ICJJOiAiKQorI2RlZmluZSBMT0dfRCAoc3RkOjpjZXJyIDw8ICJEOiAiKQorI2RlZmluZSBMT0dfViAoc3RkOjpjZXJyIDw8ICJWOiAiKQorI2VuZGlmCisKKyNlbmRpZiAvLyBISURVVElMX0hJRExPR19IXwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL0hpZFBhcnNlci5jcHAgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvSGlkUGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWZhZjY1Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL0hpZFBhcnNlci5jcHAKQEAgLTAsMCArMSwzMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgIkhpZERlZnMuaCIKKyNpbmNsdWRlICJIaWRQYXJzZXIuaCIKKyNpbmNsdWRlICJIaWRMb2cuaCIKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxpb21hbmlwPgorCituYW1lc3BhY2UgSGlkVXRpbCB7CisKK3ZvaWQgSGlkUGFyc2VyOjpyZXNldCgpIHsKKyAgICBtR2xvYmFsU3RhY2sgPSBIaWRHbG9iYWxTdGFjaygpOworICAgIG1Mb2NhbCA9IEhpZExvY2FsKCk7CisgICAgbVRyZWUgPSBzdGQ6Om1ha2Vfc2hhcmVkPEhpZFRyZWVOb2RlPigpOworICAgIG1DdXJyZW50ID0gbVRyZWU7Cit9CisKK2Jvb2wgSGlkUGFyc2VyOjpwYXJzZShjb25zdCBzdGQ6OnZlY3RvcjxIaWRJdGVtPiAmdG9rZW4pIHsKKyAgICAvLyBDbGVhbiB1cCBpbnRlcm5hbCBzdGF0ZXMgb2YgdGhlIHBhcnNlciBmb3IgYSBuZXcgc3RyZWFtIG9mIGRlc2NyaXB0b3IgdG9rZW4KKyAgICByZXNldCgpOworCisgICAgYm9vbCByZXQgPSB0cnVlOworICAgIHVzaW5nIG5hbWVzcGFjZSBIaWREZWY6OlRhZ1R5cGU7CisKKyAgICBmb3IgKGF1dG8gJmkgOiB0b2tlbikgeworICAgICAgICBzd2l0Y2ggKGkudHlwZSkgeworICAgICAgICAgICAgY2FzZSBNQUlOOgorICAgICAgICAgICAgICAgIHJldCA9IHByb2Nlc3NNYWluVGFnKGkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBHTE9CQUw6CisgICAgICAgICAgICAgICAgcmV0ID0gbUdsb2JhbFN0YWNrLmFwcGVuZChpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTE9DQUw6CisgICAgICAgICAgICAgICAgcmV0ID0gbUxvY2FsLmFwcGVuZChpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HX0UgPDwgIkhpZFBhcnNlciBmb3VuZCBpbGxlZ2FsIEhpZEl0ZW06ICIgPDwgaSA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgICAgICByZXQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGluIGNhc2UgYSBwYXJzZSBmYWlsdXJlLCBxdWl0IHByZW1hdHVyZWx5CisgICAgICAgIGlmICghcmV0KSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitib29sIEhpZFBhcnNlcjo6cHJvY2Vzc01haW5UYWcoY29uc3QgSGlkSXRlbSAmaSkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBIaWREZWY6Ok1haW5UYWc7CisgICAgdXNpbmcgbmFtZXNwYWNlIEhpZERlZjo6UmVwb3J0RmxhZzsKKworICAgIGJvb2wgcmV0ID0gdHJ1ZTsKKyAgICBzd2l0Y2ggKGkudGFnKSB7CisgICAgICAgIGNhc2UgQ09MTEVDVElPTjogeworICAgICAgICAgICAgdW5zaWduZWQgaW50IGNvbGxlY3Rpb25UeXBlOworICAgICAgICAgICAgaWYgKCFpLmRhdGFBc1Vuc2lnbmVkKCZjb2xsZWN0aW9uVHlwZSkpIHsKKyAgICAgICAgICAgICAgICBMT0dfRSA8PCAiQ2Fubm90IGdldCBjb2xsZWN0aW9uIHR5cGUgYXQgb2Zmc2V0ICIgPDwgaS5vZmZzZXQgPDwgTE9HX0VOREw7CisgICAgICAgICAgICAgICAgcmV0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZnVsbFVzYWdlID0KKyAgICAgICAgICAgICAgICAgICAgbUdsb2JhbFN0YWNrLnRvcCgpLnVzYWdlUGFnZS5nZXQoMCkgPDwgMTYgfCBtTG9jYWwuZ2V0VXNhZ2UoMCk7CisgICAgICAgICAgICBtQ3VycmVudCA9IG1DdXJyZW50LT5hZGRDaGlsZCgKKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxIaWRUcmVlTm9kZT4obUN1cnJlbnQsIGNvbGxlY3Rpb25UeXBlLCBmdWxsVXNhZ2UpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRU5EX0NPTExFQ1RJT046CisgICAgICAgICAgICBtQ3VycmVudCA9IG1DdXJyZW50LT5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIGlmICghbUN1cnJlbnQpIHsKKyAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIHBhcnNlIGZhaWx1cmUgc28gdGhhdCBtQ3VycmVudCB3aWxsIG5vdCBiZSBhY2Nlc3NlZAorICAgICAgICAgICAgICAgIExPR19FIDw8ICJ1bm1hdGNoZWQgRU5EX0NPTExFQ1RJT04gYXQgIiA8PCBpLm9mZnNldCA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgICAgICByZXQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElOUFVUOgorICAgICAgICBjYXNlIE9VVFBVVDoKKyAgICAgICAgY2FzZSBGRUFUVVJFOiB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcmVwb3J0VHlwZSA9IGkudGFnOworICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWc7CisgICAgICAgICAgICBpZiAoIWkuZGF0YUFzVW5zaWduZWQoJmZsYWcpKSB7CisgICAgICAgICAgICAgICAgTE9HX0UgPDwgIkNhbm5vdCBnZXQgcmVwb3J0IGZsYWcgYXQgb2Zmc2V0ICIgPDwgaS5vZmZzZXQgPDwgTE9HX0VOREw7CisgICAgICAgICAgICAgICAgcmV0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCBIaWRHbG9iYWwgJnRvcCA9IG1HbG9iYWxTdGFjay50b3AoKTsKKworICAgICAgICAgICAgLy8gdXNhZ2UgcGFnZSwgbG9jYWwgbWluL21heCwgcmVwb3J0IHNpemUgYW5kIGNvdW50IGhhdmUgdG8gYmUgZGVmaW5lZCBhdCByZXBvcnQKKyAgICAgICAgICAgIC8vIGRlZmluaXRpb24uCisgICAgICAgICAgICBpZiAoISh0b3AudXNhZ2VQYWdlLmlzU2V0KCkgJiYgdG9wLmxvZ2ljYWxNaW4uaXNTZXQoKSAmJiB0b3AubG9naWNhbE1heC5pc1NldCgpCisgICAgICAgICAgICAgICAgICAmJiB0b3AucmVwb3J0U2l6ZS5pc1NldCgpICYmIHRvcC5yZXBvcnRDb3VudC5pc1NldCgpKSkgeworICAgICAgICAgICAgICAgIExPR19FIDw8ICJSZXBvcnQgZGVmaW5lZCBhdCAiIDw8IGkub2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgPDwgIiBkb2VzIG5vdCBoYXZlIGFsbCBtYW5kYXRvcnkgZmllbGRzIHNldCIgPDwgTE9HX0VOREw7CisgICAgICAgICAgICAgICAgcmV0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodG9wLnJlcG9ydFNpemUuZ2V0KDApID4gMzIpIHsKKyAgICAgICAgICAgICAgICBMT0dfRSA8PCAiUmVwb3J0IGRlZmluZWQgYXQgIiA8PCBpLm9mZnNldAorICAgICAgICAgICAgICAgICAgICAgIDw8ICIgaGFzIHVuc3VwcG9ydGVkIHJlcG9ydCBzaXplKD4gMzIgYml0KSIgPDwgTE9HX0VOREw7CisgICAgICAgICAgICAgICAgcmV0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEhpZFJlcG9ydCByZXBvcnQocmVwb3J0VHlwZSwgZmxhZywgdG9wLCBtTG9jYWwpOworICAgICAgICAgICAgbVJlcG9ydC5wdXNoX2JhY2socmVwb3J0KTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxIaWRUcmVlTm9kZT4gbm9kZShuZXcgSGlkUmVwb3J0Tm9kZShtQ3VycmVudCwgcmVwb3J0KSk7CisgICAgICAgICAgICBtQ3VycmVudC0+YWRkQ2hpbGQobm9kZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0UgPDwgInVua25vd24gbWFpbiB0YWcsICIgPDwgaSA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgIHJldCA9IGZhbHNlOworICAgIH0KKyAgICAvLyBsb2NhbHMgaXMgY2xlYXJlZCBhZnRlciBhbnkgbWFpbiB0YWcgYWNjb3JkaW5nIHRvIEhJRCBzcGVjCisgICAgbUxvY2FsLmNsZWFyKCk7CisgICAgcmV0dXJuIHJldDsKK30KKworYm9vbCBIaWRQYXJzZXI6OnBhcnNlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJlZ2luLCBzaXplX3Qgc2l6ZSkgeworICAgIHN0ZDo6dmVjdG9yPEhpZEl0ZW0+IGhpZEl0ZW1WZWN0b3IgPSBIaWRJdGVtOjp0b2tlbml6ZShiZWdpbiwgc2l6ZSk7CisgICAgcmV0dXJuIHBhcnNlKGhpZEl0ZW1WZWN0b3IpOworfQorCit2b2lkIEhpZFBhcnNlcjo6ZmlsdGVyVHJlZSgpIHsKKyAgICBpZiAobVRyZWUgIT0gbnVsbHB0cikgeworICAgICAgICBmaWx0ZXJUcmVlKG1UcmVlKTsKKyAgICB9Cit9CisKK3ZvaWQgSGlkUGFyc2VyOjpmaWx0ZXJUcmVlKHN0ZDo6c2hhcmVkX3B0cjxIaWRUcmVlTm9kZT4gJm5vZGUpIHsKKyAgICBpZiAobm9kZS0+aXNSZXBvcnRDb2xsZWN0aW9uKCkpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEhpZFJlcG9ydE5vZGU+IHJlcG9ydE5vZGUgPQorICAgICAgICAgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxIaWRSZXBvcnROb2RlPihub2RlLT5nZXRDaGlsZHJlbigpLmZyb250KCkpOworICAgICAgICBpZiAocmVwb3J0Tm9kZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXBvcnROb2RlLT5jb2xsYXBzZShub2RlLT5nZXRGdWxsVXNhZ2UoKSk7CisgICAgICAgICAgICBub2RlID0gcmVwb3J0Tm9kZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoYXV0byAmaSA6IG5vZGUtPmdldENoaWxkcmVuKCkpIHsKKyAgICAgICAgICAgIGZpbHRlclRyZWUoaSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0hpZFBhcnNlcjo6RGlnZXN0VmVjdG9yIEhpZFBhcnNlcjo6Z2VuZXJhdGVEaWdlc3QoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDx1bnNpZ25lZCBpbnQ+ICZpbnRlcmVzdGVkVXNhZ2UpIHsKKyAgICBEaWdlc3RWZWN0b3IgZGlnZXN0VmVjdG9yOworICAgIGRpZ2VzdCgmZGlnZXN0VmVjdG9yLCBtVHJlZSwgaW50ZXJlc3RlZFVzYWdlKTsKKyAgICByZXR1cm4gZGlnZXN0VmVjdG9yOworfQorCit2b2lkIEhpZFBhcnNlcjo6ZGlnZXN0KEhpZFBhcnNlcjo6RGlnZXN0VmVjdG9yICpkaWdlc3RWZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxIaWRUcmVlTm9kZT4gJm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDx1bnNpZ25lZCBpbnQ+ICZpbnRlcmVzdGVkVXNhZ2UpIHsKKyAgICBpZiAoZGlnZXN0VmVjdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChub2RlLT5pc1VzYWdlQ29sbGVjdGlvbigpCisgICAgICAgICAgICAmJiBpbnRlcmVzdGVkVXNhZ2UuZmluZChub2RlLT5nZXRGdWxsVXNhZ2UoKSkgIT0gaW50ZXJlc3RlZFVzYWdlLmVuZCgpKSB7CisgICAgICAgIC8vIHRoaXMgY29sbGVjdGlvbiBjb250YWlucyB0aGUgdXNhZ2UgaW50ZXJlc3RlZAorICAgICAgICBSZXBvcnRTZXRHcm91cCByZXBvcnRTZXRHcm91cDsKKworICAgICAgICAvLyBvbmUgbGF5ZXIgZGVlcCBzZWFyY2gKKyAgICAgICAgZm9yIChhdXRvICZpIDogbm9kZS0+Z2V0Q2hpbGRyZW4oKSkgeworICAgICAgICAgICAgLy8gc2tpcCBhbGwgbm9kZXMgdGhhdCBpcyBub3QgYSByZXBvcnQgbm9kZQorICAgICAgICAgICAgaWYgKGktPmdldE5vZGVUeXBlKCkgIT0gSGlkVHJlZU5vZGU6OlRZUEVfUkVQT1JUKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCBIaWRSZXBvcnQgJnJlcG9ydCA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxIaWRSZXBvcnROb2RlPihpKS0+Z2V0UmVwb3J0KCk7CisKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBpZCA9IHJlcG9ydC5nZXRSZXBvcnRJZCgpOzsKKyAgICAgICAgICAgIGlmIChyZXBvcnRTZXRHcm91cC5maW5kKGlkKSA9PSByZXBvcnRTZXRHcm91cC5lbmQoKSkgeworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhbiBpZCBncm91cCBpZiBpdCBpcyBub3QgY3JlYXRlZAorICAgICAgICAgICAgICAgIHJlcG9ydFNldEdyb3VwLmVtcGxhY2UoaWQsIFJlcG9ydFNldCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUmVwb3J0U2V0ICZyZXBvcnRHcm91cCA9IHJlcG9ydFNldEdyb3VwW2lkXTsKKyAgICAgICAgICAgIHN3aXRjaChyZXBvcnQuZ2V0VHlwZSgpKSB7CisgICAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIEhpZERlZjo6TWFpblRhZzsKKyAgICAgICAgICAgICAgICBjYXNlIEZFQVRVUkU6CisgICAgICAgICAgICAgICAgICAgIHJlcG9ydEdyb3VwW1JFUE9SVF9UWVBFX0ZFQVRVUkVdLnB1c2hfYmFjayhyZXBvcnQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElOUFVUOgorICAgICAgICAgICAgICAgICAgICByZXBvcnRHcm91cFtSRVBPUlRfVFlQRV9JTlBVVF0ucHVzaF9iYWNrKHJlcG9ydCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1VUUFVUOgorICAgICAgICAgICAgICAgICAgICByZXBvcnRHcm91cFtSRVBPUlRfVFlQRV9PVVRQVVRdLnB1c2hfYmFjayhyZXBvcnQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBSZXBvcnREaWdlc3QgZGlnZXN0ID0geworICAgICAgICAgICAgLmZ1bGxVc2FnZSA9IG5vZGUtPmdldEZ1bGxVc2FnZSgpLAorICAgICAgICAgICAgLnBhY2tldHMgPSBjb252ZXJ0R3JvdXBUb1BhY2tldChyZXBvcnRTZXRHcm91cCkKKyAgICAgICAgfTsKKyAgICAgICAgZGlnZXN0VmVjdG9yLT5lbXBsYWNlX2JhY2soZGlnZXN0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmNoaWxkIDogbm9kZS0+Z2V0Q2hpbGRyZW4oKSkgeworICAgICAgICAgICAgaWYgKGNoaWxkLT5nZXROb2RlVHlwZSgpID09IEhpZFRyZWVOb2RlOjpUWVBFX05PUk1BTCkgeworICAgICAgICAgICAgICAgIC8vIG9ubHkgZm9sbG93IGludG8gY29sbGVjdGlvbiBub2RlcworICAgICAgICAgICAgICAgIGRpZ2VzdChkaWdlc3RWZWN0b3IsIGNoaWxkLCBpbnRlcmVzdGVkVXNhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGQ6OnZlY3RvcjxIaWRQYXJzZXI6OlJlcG9ydFBhY2tldD4gSGlkUGFyc2VyOjpjb252ZXJ0R3JvdXBUb1BhY2tldCgKKyAgICAgICAgY29uc3QgSGlkUGFyc2VyOjpSZXBvcnRTZXRHcm91cCAmZ3JvdXApIHsKKyAgICBzdGQ6OnZlY3RvcjxSZXBvcnRQYWNrZXQ+IHBhY2tldHM7CisKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+IHR5cGVzID0ge1JFUE9SVF9UWVBFX0ZFQVRVUkUsIFJFUE9SVF9UWVBFX0lOUFVULCBSRVBPUlRfVFlQRV9PVVRQVVR9OworCisgICAgZm9yIChjb25zdCBhdXRvICZzZXRQYWlyIDogZ3JvdXApIHsKKyAgICAgICAgdW5zaWduZWQgaW50IGlkID0gc2V0UGFpci5maXJzdDsKKyAgICAgICAgZm9yIChhdXRvIHR5cGUgOiB0eXBlcykgeworICAgICAgICAgICAgY29uc3QgYXV0byAmcmVwb3J0cyA9IHNldFBhaXIuc2Vjb25kW3R5cGVdOyAvLyBmZWF0dXJlCisKKyAgICAgICAgICAgIC8vIHRlbXBsYXRlCisgICAgICAgICAgICBSZXBvcnRQYWNrZXQgcGFja2V0ID0geworICAgICAgICAgICAgICAgIC50eXBlID0gdHlwZSwKKyAgICAgICAgICAgICAgICAuaWQgPSBpZCwKKyAgICAgICAgICAgICAgICAuYml0U2l6ZSA9IDAKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmciA6IHJlcG9ydHMpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGxvZ2ljYWwgPSByLmdldExvZ2ljYWxSYW5nZSgpOworICAgICAgICAgICAgICAgIGF1dG8gcGh5c2ljYWwgPSByLmdldFBoeXNpY2FsUmFuZ2UoKTsKKworICAgICAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0ID0gcGh5c2ljYWwuZmlyc3QgLSBsb2dpY2FsLmZpcnN0OworICAgICAgICAgICAgICAgIGRvdWJsZSBzY2FsZSA9IHN0YXRpY19jYXN0PGRvdWJsZT4oKHBoeXNpY2FsLnNlY29uZCAtIHBoeXNpY2FsLmZpcnN0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8gKGxvZ2ljYWwuc2Vjb25kIC0gbG9naWNhbC5maXJzdCk7CisgICAgICAgICAgICAgICAgc2NhbGUgKj0gci5nZXRFeHBvbmVudFZhbHVlKCk7CisKKyAgICAgICAgICAgICAgICBSZXBvcnRJdGVtIGRpZ2VzdCA9IHsKKyAgICAgICAgICAgICAgICAgICAgLnVzYWdlID0gci5nZXRGdWxsVXNhZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgLmlkID0gaWQsCisgICAgICAgICAgICAgICAgICAgIC5taW5SYXcgPSBsb2dpY2FsLmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAubWF4UmF3ID0gbG9naWNhbC5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgIC5hID0gc2NhbGUsCisgICAgICAgICAgICAgICAgICAgIC5iID0gb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAuYml0T2Zmc2V0ID0gcGFja2V0LmJpdFNpemUsCisgICAgICAgICAgICAgICAgICAgIC5iaXRTaXplID0gci5nZXRTaXplKCksCisgICAgICAgICAgICAgICAgICAgIC5jb3VudCA9IHIuZ2V0Q291bnQoKSwKKyAgICAgICAgICAgICAgICAgICAgLnVuaXQgPSByLmdldFVuaXQoKSwKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHBhY2tldC5yZXBvcnRzLnB1c2hfYmFjayhkaWdlc3QpOworICAgICAgICAgICAgICAgIHBhY2tldC5iaXRTaXplICs9IGRpZ2VzdC5iaXRTaXplICogZGlnZXN0LmNvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFwYWNrZXQucmVwb3J0cy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgcGFja2V0cy5wdXNoX2JhY2soc3RkOjptb3ZlKHBhY2tldCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBwYWNrZXRzOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgcmVwb3J0VHlwZVRvU3RyaW5nKGludCByZXBvcnRUeXBlKSB7CisgICAgc3dpdGNoIChyZXBvcnRUeXBlKSB7CisgICAgICAgIGNhc2UgSGlkUGFyc2VyOjpSRVBPUlRfVFlQRV9JTlBVVDoKKyAgICAgICAgICAgIHJldHVybiAiSU5QVVQiOworICAgICAgICBjYXNlIEhpZFBhcnNlcjo6UkVQT1JUX1RZUEVfT1VUUFVUOgorICAgICAgICAgICAgcmV0dXJuICJPVVRQVVQiOworICAgICAgICBjYXNlIEhpZFBhcnNlcjo6UkVQT1JUX1RZUEVfRkVBVFVSRToKKyAgICAgICAgICAgIHJldHVybiAiRkVBVFVSRSI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIklOVkFMSUQgUkVQT1JUIjsKKyAgICB9Cit9CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0gJm9zLCBjb25zdCBIaWRQYXJzZXI6OkRpZ2VzdFZlY3RvciAmZGlnZXN0cykgeworICAgIGZvciAoY29uc3QgYXV0byAmaSA6IGRpZ2VzdHMpIHsKKyAgICAgICAgb3MgPDwgIlVzYWdlOiAweCIgPDwgc3RkOjpoZXggIDw8IGkuZnVsbFVzYWdlIDw8IHN0ZDo6ZGVjCisgICAgICAgICAgIDw8ICIsICIgPDwgaS5wYWNrZXRzLnNpemUoKSA8PCAiIHJlcG9ydCBwYWNrZXQ6IiA8PCBMT0dfRU5ETDsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwYWNrZXQgOiBpLnBhY2tldHMpIHsKKyAgICAgICAgICAgIG9zIDw8IHJlcG9ydFR5cGVUb1N0cmluZyhwYWNrZXQudHlwZSkgPDwgIiBpZDogIiA8PCBwYWNrZXQuaWQKKyAgICAgICAgICAgICAgIDw8ICIgc2l6ZTogIiA8PCBwYWNrZXQuYml0U2l6ZQorICAgICAgICAgICAgICAgPDwgImIoIiA8PCBwYWNrZXQuZ2V0Qnl0ZVNpemUoKSA8PCAiQiksICIKKyAgICAgICAgICAgICAgIDw8IHBhY2tldC5yZXBvcnRzLnNpemUoKSA8PCAiIGVudHJpZXMiIDw8IExPR19FTkRMOworCisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnJlcG9ydCA6IHBhY2tldC5yZXBvcnRzKSB7CisgICAgICAgICAgICAgICAgZG91YmxlIG1pbiwgbWF4OworICAgICAgICAgICAgICAgIHJlcG9ydC5kZWNvZGUocmVwb3J0Lm1hc2socmVwb3J0Lm1pblJhdyksICZtaW4pOworICAgICAgICAgICAgICAgIHJlcG9ydC5kZWNvZGUocmVwb3J0Lm1hc2socmVwb3J0Lm1heFJhdyksICZtYXgpOworCisgICAgICAgICAgICAgICAgb3MgPDwgIiAgIiA8PCByZXBvcnQuYml0T2Zmc2V0IDw8ICIgc2l6ZTogIiA8PCByZXBvcnQuYml0U2l6ZQorICAgICAgICAgICAgICAgICAgIDw8ICIsIGNvdW50OiAiIDw8IHJlcG9ydC5jb3VudAorICAgICAgICAgICAgICAgICAgIDw8ICIsIHVzYWdlOiAiIDw8IHN0ZDo6aGV4IDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6c2V0dyg4KQorICAgICAgICAgICAgICAgICAgIDw8IHJlcG9ydC51c2FnZSA8PCBzdGQ6OmRlYworICAgICAgICAgICAgICAgICAgIDw8ICIsIG1pbjogIiA8PCByZXBvcnQubWluUmF3IDw8ICIsIG1heDogIiA8PCByZXBvcnQubWF4UmF3CisgICAgICAgICAgICAgICAgICAgPDwgIiwgbWluRGVjb2RlZDogIiA8PCBtaW4KKyAgICAgICAgICAgICAgICAgICA8PCAiLCBtYXhEZWNvZGVkOiAiIDw8IG1heAorICAgICAgICAgICAgICAgICAgIDw8ICIsIGE6ICIgPDwgcmVwb3J0LmEgPDwgIiwgYjogIiA8PCByZXBvcnQuYgorICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6aGV4CisgICAgICAgICAgICAgICAgICAgPDwgIiwgbWluUmF3SGV4OiAweCIgPDwgcmVwb3J0Lm1hc2socmVwb3J0Lm1pblJhdykKKyAgICAgICAgICAgICAgICAgICA8PCAiLCBtYXhSYXdIZXg6IDB4IiA8PCByZXBvcnQubWFzayhyZXBvcnQubWF4UmF3KQorICAgICAgICAgICAgICAgICAgIDw8ICIsIHJhd01hc2tlZDogMHgiIDw8IHJlcG9ydC5yYXdNYXNrKCkKKyAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmRlYyA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBvcyA8PCBMT0dfRU5ETDsKKyAgICB9CisgICAgb3MgPDwgTE9HX0VOREw7CisgICAgcmV0dXJuIG9zOworfQorfSAvLyBuYW1lc3BhY2UgSGlkVXRpbApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL0hpZFBhcnNlci5oIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL0hpZFBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZjVlYzYKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvSGlkUGFyc2VyLmgKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBISURVVElMX0hJRFBBUlNFUl9IXworI2RlZmluZSBISURVVElMX0hJRFBBUlNFUl9IXworCisjaW5jbHVkZSAiSGlkSXRlbS5oIgorI2luY2x1ZGUgIkhpZFRyZWUuaCIKKyNpbmNsdWRlICJIaWRHbG9iYWwuaCIKKyNpbmNsdWRlICJIaWRMb2NhbC5oIgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8b3N0cmVhbT4KKworbmFtZXNwYWNlIEhpZFV0aWwgeworY2xhc3MgSGlkUGFyc2VyIHsKK3B1YmxpYzoKKyAgICBlbnVtIHsKKyAgICAgICAgUkVQT1JUX1RZUEVfRkVBVFVSRSA9IDAsCisgICAgICAgIFJFUE9SVF9UWVBFX0lOUFVUID0gMSwKKyAgICAgICAgUkVQT1JUX1RZUEVfT1VUUFVUID0gMgorICAgIH07CisKKyAgICBzdHJ1Y3QgUmVwb3J0SXRlbTsKKyAgICBzdHJ1Y3QgUmVwb3J0UGFja2V0OworCisgICAgLy8gcmVwb3J0IChpbmNsdWRpbmcgaW5wdXQgb3V0cHV0IGFuZCBmZWF0dXJlKSBncm91cGVkIGJ5IGZ1bGwgdXNhZ2UKKyAgICBzdHJ1Y3QgUmVwb3J0RGlnZXN0IHsKKyAgICAgICAgdW5zaWduZWQgaW50IGZ1bGxVc2FnZTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8UmVwb3J0UGFja2V0PiBwYWNrZXRzOworICAgIH07CisKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFJlcG9ydERpZ2VzdD4gRGlnZXN0VmVjdG9yOworCisgICAgLy8gcGFyc2UgSElEIGRlc2NyaXB0b3IKKyAgICBib29sIHBhcnNlKGNvbnN0IHN0ZDo6dmVjdG9yPEhpZEl0ZW0+ICZ0b2tlbik7CisgICAgYm9vbCBwYXJzZShjb25zdCB1bnNpZ25lZCBjaGFyICpiZWdpbiwgc2l6ZV90IHNpemUpOworCisgICAgLy8gZmlsdGVyIHRoZSB0cmVlIHRvIGVsaW1pbmF0ZSBzaW5nbGUgY2hpbGQgcmVwb3J0IGxlYWYgbm9kZSBjYXVzZXMgYnkgdXNhZ2UgYXJyYXkgdHlwZQorICAgIC8vIHJlcG9ydHMKKyAgICB2b2lkIGZpbHRlclRyZWUoKTsKKworICAgIC8vIGdlbmVyYXRlIGEgbGlzdCBvZiByZXBvcnQgZGlnZXN0IGZvciBhbGwgaW50ZXJlc3RlZCB1c2FnZS4gSXQgd2lsbCBhdXRvbWF0aWNhbGx5CisgICAgLy8gY2FsbCBmaWx0ZXJUcmVlKCkuCisgICAgRGlnZXN0VmVjdG9yIGdlbmVyYXRlRGlnZXN0KGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDx1bnNpZ25lZCBpbnQ+ICZpbnRlcmVzdGVkVXNhZ2UpOworCisgICAgLy8gZ2V0IHBhcnNlZCB0cmVlIChmaWx0ZXJlZCBvciBub3QgZmlsdGVyZWQpCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEhpZFRyZWVOb2RlPiBnZXRUcmVlKCkgY29uc3QgeyByZXR1cm4gbVRyZWU7IH0KKworICAgIC8vIGdldCBhbGwgcGFyc2VkIHJlcG9ydCBpbiBhIHBhcnNlZCBmb3JtLgorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEhpZFJlcG9ydD4mIGdldFJlcG9ydCgpIGNvbnN0IHsgcmV0dXJuIG1SZXBvcnQ7IH0KKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIHN0ZDo6YXJyYXk8c3RkOjp2ZWN0b3I8SGlkUmVwb3J0PiwgMz4gUmVwb3J0U2V0OworICAgIHR5cGVkZWYgc3RkOjp1bm9yZGVyZWRfbWFwPHVuc2lnbmVkIGludCAvKiByZXBvcnRJZCAqLywgUmVwb3J0U2V0PiBSZXBvcnRTZXRHcm91cDsKKworICAgIC8vIGhlbHBlciBzdWJyb3V0aW5lcworICAgIHZvaWQgcmVzZXQoKTsKKyAgICBib29sIHByb2Nlc3NNYWluVGFnKGNvbnN0IEhpZEl0ZW0gJmkpOworICAgIHN0YXRpYyB2b2lkIGZpbHRlclRyZWUoc3RkOjpzaGFyZWRfcHRyPEhpZFRyZWVOb2RlPiAmbm9kZSk7CisgICAgc3RhdGljIHZvaWQgZGlnZXN0KAorICAgICAgICAgICAgRGlnZXN0VmVjdG9yICpkaWdlc3RWZWN0b3IsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SGlkVHJlZU5vZGU+ICZub2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PHVuc2lnbmVkIGludD4gJmludGVyZXN0ZWRVc2FnZSk7CisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPFJlcG9ydFBhY2tldD4gY29udmVydEdyb3VwVG9QYWNrZXQoY29uc3QgUmVwb3J0U2V0R3JvdXAgJmdyb3VwKTsKKworICAgIEhpZEdsb2JhbFN0YWNrIG1HbG9iYWxTdGFjazsKKyAgICBIaWRMb2NhbCBtTG9jYWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEhpZFRyZWVOb2RlPiBtVHJlZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SGlkVHJlZU5vZGU+IG1DdXJyZW50OworICAgIHN0ZDo6dmVjdG9yPEhpZFJlcG9ydD4gbVJlcG9ydDsKK307CisKK3N0cnVjdCBIaWRQYXJzZXI6OlJlcG9ydEl0ZW0geworICAgIHVuc2lnbmVkIGludCB1c2FnZTsKKyAgICB1bnNpZ25lZCBpbnQgaWQ7CisgICAgaW50IHR5cGU7IC8vIGZlYXR1cmUsIGlucHV0IG9yIG91dHB1dAorCisgICAgaW50NjRfdCBtaW5SYXc7CisgICAgaW50NjRfdCBtYXhSYXc7CisKKyAgICAvLyBjb252ZXJzaW9uIGZvciBmbG9hdCBwb2ludCB2YWx1ZXMKKyAgICAvLyByZWFsIHZhbHVlID0gKHNpZ25FeHRlbmRJZk5lZWRlZChyYXcpICsgYikgKiBhCisgICAgLy8gcmF3IHZhbHVlID0gbWFzayhyZWFsL2EgLSBiKTsKKyAgICAvLworICAgIC8vIGNvbnZlcnNpb24gZm9yIGludGVnZXIgdmFsdWVzCisgICAgLy8gcmVhbCB2YWx1ZSA9IHNpZ25FeHRlbmRlZElmTmVlZGVkKHJhdykgKyBiOworICAgIC8vIHJhdyB2YWx1ZSA9IG1hc2socmVhbCAtIGIpOworICAgIGRvdWJsZSBhOyAvLyBzY2FsaW5nCisgICAgaW50NjRfdCBiOyAvLyBvZmZzZXQKKyAgICB1bnNpZ25lZCBpbnQgdW5pdDsKKworICAgIHNpemVfdCBiaXRPZmZzZXQ7CisgICAgc2l6ZV90IGJpdFNpemU7IC8vIGJpdCBsZW5ndGggcGVyIHVuaXQKKyAgICBzaXplX3QgY291bnQ7CisKKyAgICAvLyBoZWxwZXIgZnVuY3Rpb24KKyAgICBib29sIGlzU2lnbmVkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbWluUmF3IDwgMDsKKyAgICB9CisKKyAgICBib29sIGlzQnl0ZUFsaWduZWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAoYml0T2Zmc2V0ICYgNykgPT0gMCAmJiAoYml0U2l6ZSAmIDcpID09IDA7CisgICAgfQorCisgICAgLy8gY29udmVydCByYXcgdmFsdWVzIHRvIHVuc2lnbmVkIGZvcm1hdAorICAgIHVpbnQzMl90IG1hc2soaW50NjRfdCBpbnB1dCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGlucHV0ICYgcmF3TWFzaygpKTsKKyAgICB9CisKKyAgICBib29sIGRlY29kZSh1aW50MzJfdCBpbnB1dCwgZG91YmxlICpvdXRwdXQpIGNvbnN0IHsKKyAgICAgICAgaWYgKG91dHB1dCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaW50NjRfdCBzID0gc2lnbkV4dGVuZElmTmVlZGVkKGlucHV0KTsKKyAgICAgICAgaWYgKHMgPCBtaW5SYXcgfHwgcyA+IG1heFJhdykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgICpvdXRwdXQgPSAocyArIGIpICogYTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCBlbmNvZGUoZG91YmxlIGlucHV0LCB1aW50MzJfdCAqb3V0cHV0KSBjb25zdCB7CisgICAgICAgIGlmIChvdXRwdXQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlucHV0ID0gaW5wdXQgLyBhIC0gYjsKKyAgICAgICAgaWYgKGlucHV0IDwgbWluUmF3IHx8IGlucHV0ID4gbWF4UmF3KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgKm91dHB1dCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzdGF0aWNfY2FzdDxpbnQ2NF90PihpbnB1dCkgJiByYXdNYXNrKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpbnQ2NF90IHJhd01hc2soKSBjb25zdCB7CisgICAgICAgIGNvbnN0ZXhwciBpbnQ2NF90IG9uZSA9IDE7CisgICAgICAgIHJldHVybiAob25lIDw8IGJpdFNpemUpIC0gMTsKKyAgICB9CisKKyAgICBpbnQ2NF90IHNpZ25FeHRlbmRJZk5lZWRlZChpbnQ2NF90IHZhbHVlKSBjb25zdCB7CisgICAgICAgIHJldHVybiB2YWx1ZSB8ICgoaXNTaWduZWQoKSAmJiBpc05lZ2F0aXZlKHZhbHVlKSkgPyB+cmF3TWFzaygpIDogMCk7CisgICAgfQorCisgICAgYm9vbCBpc05lZ2F0aXZlKGludDY0X3QgdmFsdWUpIGNvbnN0IHsKKyAgICAgICAgY29uc3RleHByIGludDY0X3Qgb25lID0gMTsKKyAgICAgICAgcmV0dXJuICgob25lIDw8IChiaXRTaXplIC0gMSkpICYgdmFsdWUpICE9IDA7CisgICAgfQorfTsKKworLy8gYSBjb2xsZWN0aW9uIG9mIHJlcG9ydCBpdGVtIHRoYXQgZm9ybXMgYSBwYWNrZXQKKy8vIHRoaXMgaXMgdGhlIGlucHV0IG91dHB1dCB1bml0IHdpdGggSElEIGhhcmR3YXJlCitzdHJ1Y3QgSGlkUGFyc2VyOjpSZXBvcnRQYWNrZXQgeworICAgIHN0ZDo6dmVjdG9yPFJlcG9ydEl0ZW0+IHJlcG9ydHM7CisgICAgc2l6ZV90IGJpdFNpemU7CisgICAgaW50IHR5cGU7IC8vIFJFUE9SVF9UWVBFX0ZFQVRVUkUvSU5QVVQvT1VUUFVUCisgICAgdW5zaWduZWQgaW50IGlkOworCisgICAgc2l6ZV90IGdldEJ5dGVTaXplKCkgY29uc3QgeyByZXR1cm4gKGJpdFNpemUgKyA3KSAvIDg7IH07Cit9OworCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtICZvcywgY29uc3QgSGlkUGFyc2VyOjpEaWdlc3RWZWN0b3IgJmRpZ2VzdDIpOworfSAvLyBuYW1lc3BhY2UgSGlkVXRpbAorCisjZW5kaWYgLy8gSElEVVRJTF9ISURQQVJTRVJfSF8KZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWRSZXBvcnQuY3BwIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL0hpZFJlcG9ydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIyYjc4YgotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWRSZXBvcnQuY3BwCkBAIC0wLDAgKzEsMjI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlICJIaWRSZXBvcnQuaCIKKyNpbmNsdWRlICJIaWREZWZzLmgiCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxpb21hbmlwPgorCituYW1lc3BhY2UgSGlkVXRpbCB7CitIaWRSZXBvcnQ6OkhpZFJlcG9ydCh1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgSGlkR2xvYmFsICZnbG9iYWwsIGNvbnN0IEhpZExvY2FsICZsb2NhbCkKKyAgICAgICAgOiBtUmVwb3J0VHlwZSh0eXBlKSwKKyAgICAgICAgICBtRmxhZyhkYXRhKSwKKyAgICAgICAgICBtVXNhZ2VQYWdlKGdsb2JhbC51c2FnZVBhZ2UuZ2V0KDApKSwgICAvLyBkZWZhdWx0IHZhbHVlIDAKKyAgICAgICAgICBtVXNhZ2UobG9jYWwuZ2V0VXNhZ2UoMCkpLAorICAgICAgICAgIG1Vc2FnZVZlY3Rvcihsb2NhbC51c2FnZSksCisgICAgICAgICAgbUxvZ2ljYWxNaW4oZ2xvYmFsLmxvZ2ljYWxNaW4uZ2V0KDApKSwgLy8gZGVmYXVsdCB2YWx1ZSAwCisgICAgICAgICAgbUxvZ2ljYWxNYXgoZ2xvYmFsLmxvZ2ljYWxNYXguZ2V0KDApKSwKKyAgICAgICAgICBtUmVwb3J0U2l6ZShnbG9iYWwucmVwb3J0U2l6ZSksCisgICAgICAgICAgbVJlcG9ydENvdW50KGdsb2JhbC5yZXBvcnRDb3VudCksCisgICAgICAgICAgbVBoeXNpY2FsTWluKGdsb2JhbC5waHlzaWNhbE1pbiksCisgICAgICAgICAgbVBoeXNpY2FsTWF4KGdsb2JhbC5waHlzaWNhbE1heCksCisgICAgICAgICAgbUV4cG9uZW50KGdsb2JhbC5leHBvbmVudCksCisgICAgICAgICAgbVVuaXQoZ2xvYmFsLnVuaXQpLAorICAgICAgICAgIG1SZXBvcnRJZChnbG9iYWwucmVwb3J0SWQpIHsgfQorCitzdGQ6OnN0cmluZyBIaWRSZXBvcnQ6OmdldFN0cmluZ1R5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlcG9ydFR5cGVUb1N0cmluZyhtUmVwb3J0VHlwZSk7Cit9CisKK3N0ZDo6c3RyaW5nIEhpZFJlcG9ydDo6cmVwb3J0VHlwZVRvU3RyaW5nKGludCB0eXBlKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIEhpZERlZjo6TWFpblRhZzsKKyAgICBzd2l0Y2godHlwZSkgeworICAgICAgICBjYXNlIElOUFVUOgorICAgICAgICAgICAgcmV0dXJuICJJTlBVVCI7CisgICAgICAgIGNhc2UgT1VUUFVUOgorICAgICAgICAgICAgcmV0dXJuICJPVVRQVVQiOworICAgICAgICBjYXNlIEZFQVRVUkU6CisgICAgICAgICAgICByZXR1cm4gIkZFQVRVUkUiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICI8PFVOS05PV04+PiI7CisgICAgfQorfQorCitkb3VibGUgSGlkUmVwb3J0OjpnZXRFeHBvbmVudFZhbHVlKCkgY29uc3QgeworICAgIGlmICghbUV4cG9uZW50LmlzU2V0KCkpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIC8vIGRlZmF1bHQgZXhwb25lbnQgaXMgMAorICAgIGludCBleHBvbmVudEludCA9IG1FeHBvbmVudC5nZXQoMCk7CisgICAgaWYgKGV4cG9uZW50SW50ID4gMTUgfHwgZXhwb25lbnRJbnQgPCAwKSB7CisgICAgICAgIHJldHVybiBOQU47CisgICAgfQorICAgIHJldHVybiBwb3coMTAuMCwgc3RhdGljX2Nhc3Q8ZG91YmxlPigoZXhwb25lbnRJbnQgPD0gNykgPyBleHBvbmVudEludCA6IGV4cG9uZW50SW50IC0gMTYpKTsKK30KKworc3RkOjpzdHJpbmcgSGlkUmVwb3J0OjpnZXRFeHBvbmVudFN0cmluZygpIGNvbnN0IHsKKyAgICBpbnQgZXhwb25lbnRJbnQgPSBtRXhwb25lbnQuZ2V0KDApOworICAgIGlmIChleHBvbmVudEludCA+IDE1IHx8IGV4cG9uZW50SW50IDwgMCkgeworICAgICAgICByZXR1cm4gIltlcnJvcl0iOworICAgIH0KKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoIngxMF4iKQorICAgICAgICAgICAgKyBzdGQ6OnRvX3N0cmluZygoZXhwb25lbnRJbnQgPD0gNykgPyBleHBvbmVudEludCA6IGV4cG9uZW50SW50IC0gMTYpOworfQorCitzdGQ6OnN0cmluZyBIaWRSZXBvcnQ6OmdldFVuaXRTdHJpbmcoKSBjb25zdCB7CisgICAgaWYgKCFtVW5pdC5pc1NldCgpKSB7CisgICAgICAgIHJldHVybiAiZGVmYXVsdCI7CisgICAgfQorICAgIHJldHVybiAiW25vdCBpbXBsZW1lbnRlZF0iOworCisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHJldDsKKyAgICByZXQgPDwgc3RkOjpoZXggPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KDIpIDw8IG1Vbml0LmdldCgwKTsKKyAgICByZXR1cm4gcmV0LnN0cigpOworfQorCitzdGQ6OnN0cmluZyBIaWRSZXBvcnQ6OmdldEZsYWdTdHJpbmcoKSBjb25zdCB7CisgICAgdXNpbmcgbmFtZXNwYWNlIEhpZERlZjo6UmVwb3J0RmxhZzsKKyAgICBzdGQ6OnN0cmluZyByZXQ7CisgICAgcmV0ICs9IChtRmxhZyAmIERBVEFfQ09OU1QpID8gIkNvbnN0ICIgOiAiRGF0YSAiOworICAgIHJldCArPSAobUZsYWcgJiBBUlJBWV9WQVJJQUJMRSkgPyAiVmFyaWFibGUgIiA6ICJBcnJheSAiOworICAgIHJldCArPSAobUZsYWcgJiBXUkFQKSA/ICJXcmFwICIgOiAiIjsKKyAgICByZXQgKz0gKG1GbGFnICYgTk9OTElORUFSKSA/ICJOb25saW5lYXIgIiA6ICIiOworICAgIHJldCArPSAobUZsYWcgJiBOT19QUkVGRVJSRUQpID8gIk5vUHJlZmVycmVkICIgOiAiIjsKKyAgICByZXQgKz0gKG1GbGFnICYgTlVMTF9TVEFURSkgPyAiTnVsbFN0YXRlICIgOiAiIjsKKyAgICByZXQgKz0gKG1GbGFnICYgVk9MQVRJTEUpID8gIlZvbGF0aWxlICIgOiAiIjsKKyAgICByZXQgKz0gKG1GbGFnICYgQlVGRkVSRURfQllURVMpID8gIkJ1ZmZlcmVkQnl0ZXMgIiA6ICIiOworICAgIHJldHVybiByZXQ7Cit9CisKKy8vIGlzQXJyYXkoKSB3aWxsIHJldHVybiB0cnVlIGZvciByZXBvcnRzIHRoYXQgbWF5IGNvbnRhaW5zIG11bHRpcGxlIHZhbHVlcywgZS5nLiBrZXlib2FyZCBzY2FuCisvLyBjb2RlLCB3aGljaCBjYW4gaGF2ZSBtdWx0aXBsZSB2YWx1ZSwgZWFjaCBkZW5vdGluZyBhIGtleSBwcmVzc2VkIGRvd24gYXQgdGhlIHNhbWUgdGltZS4gSXQgd2lsbAorLy8gcmV0dXJuIGZhbHNlIGlmIHJlcG9yIHJlcHJlc2VudCBhIHZlY3RvciBvciBtYXRyaXguCisvLworLy8gVGhpcyBzbGlnaHRseSBkZXZpYXRlcyBmcm9tIEhJRCdzIGRlZmluaXRpb24sIGl0IGlzIG1vcmUgY29udmVuaWVudCB0aGlzIHdheSBhcyBtYXRyaXgvdmVjdG9yCisvLyBpbnB1dCBpcyB0cmVhdGVkIHNpbWlsYXJseSBhcyB2YXJpYWJsZXMuCitib29sIEhpZFJlcG9ydDo6aXNBcnJheSgpIGNvbnN0IHsKKyAgICB1c2luZyBuYW1lc3BhY2UgSGlkRGVmOjpSZXBvcnRGbGFnOworICAgIHJldHVybiAobUZsYWcgJiBBUlJBWV9WQVJJQUJMRSkgPT0gMCAmJiBtSXNDb2xsYXBzZWQ7Cit9CisKK2Jvb2wgSGlkUmVwb3J0Ojppc1ZhcmlhYmxlKCkgY29uc3QgeworICAgIHJldHVybiAhaXNBcnJheSgpOworfQorCitib29sIEhpZFJlcG9ydDo6aXNEYXRhKCkgY29uc3QgeworICAgIHVzaW5nIG5hbWVzcGFjZSBIaWREZWY6OlJlcG9ydEZsYWc7CisgICAgcmV0dXJuIChtRmxhZyAmIERBVEFfQ09OU1QpID09IDA7Cit9CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBIaWRSZXBvcnQmIGgpIHsKKyAgICBvcyA8PCBoLmdldFN0cmluZ1R5cGUoKSA8PCAiLCAiCisgICAgICAgPDwgInVzYWdlOiAiIDw8IHN0ZDo6aGV4IDw8IGguZ2V0RnVsbFVzYWdlKCkgPDwgc3RkOjpkZWMgPDwgIiwgIjsKKworICAgIGlmIChoLmlzRGF0YSgpKSB7CisgICAgICAgIGF1dG8gcmFuZ2UgPSBoLmdldExvZ2ljYWxSYW5nZSgpOworICAgICAgICBvcyA8PCAibG9nTWluOiAiIDw8IHJhbmdlLmZpcnN0IDw8ICIsICIKKyAgICAgICAgICAgPDwgImxvZ01heDogIiA8PCByYW5nZS5zZWNvbmQgPDwgIiwgIjsKKworICAgICAgICBpZiAocmFuZ2UgPT0gaC5nZXRQaHlzaWNhbFJhbmdlKCkpIHsKKyAgICAgICAgICAgIG9zIDw8ICJwaHk9PT1sb2csICI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByYW5nZSA9IGguZ2V0UGh5c2ljYWxSYW5nZSgpOworICAgICAgICAgICAgb3MgPDwgInBoeU1pbjogIiA8PCByYW5nZS5maXJzdCA8PCAiLCAiCisgICAgICAgICAgICAgICA8PCAicGh5TWF4OiAiIDw8IHJhbmdlLnNlY29uZCA8PCAiLCAiOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGguaXNBcnJheSgpKSB7CisgICAgICAgICAgICBvcyA8PCAibWFwOiAoIiA8PCBzdGQ6OmhleDsKKyAgICAgICAgICAgIGZvciAoYXV0byBpIDogaC5nZXRVc2FnZVZlY3RvcigpKSB7CisgICAgICAgICAgICAgICAgb3MgPDwgaSA8PCAiLCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcyA8PCAiKSwgIiA8PCBzdGQ6OmRlYzsKKyAgICAgICAgfQorCisgICAgICAgIG9zIDw8ICJleHBvbmVudDogIiA8PCBoLmdldEV4cG9uZW50U3RyaW5nKCkgPDwgIiwgIgorICAgICAgICAgICA8PCAidW5pdDogIiA8PCBoLmdldFVuaXRTdHJpbmcoKSA8PCAiLCAiOworICAgIH0gZWxzZSB7CisgICAgICAgIG9zIDw8ICJjb25zdGFudDogIjsKKyAgICB9CisgICAgb3MgPDwgInNpemU6ICIgPDwgaC5nZXRTaXplKCkgPDwgImJpdCB4ICIgPDwgaC5nZXRDb3VudCgpIDw8ICIsICIKKyAgICAgICA8PCAiaWQ6ICIgPDwgaC5tUmVwb3J0SWQ7CisKKyAgICByZXR1cm4gb3M7Cit9CisKK3N0ZDo6cGFpcjxpbnQ2NF90LCBpbnQ2NF90PiBIaWRSZXBvcnQ6OmdldExvZ2ljYWxSYW5nZSgpIGNvbnN0IHsKKyAgICBpbnQ2NF90IGEgPSBtTG9naWNhbE1pbjsKKyAgICBpbnQ2NF90IGIgPSBtTG9naWNhbE1heDsKKworICAgIGlmIChhID4gYikgeworICAgICAgICAvLyBtaWdodCBiZSB1bnNpZ25lZAorICAgICAgICBhID0gYSAmICgoc3RhdGljX2Nhc3Q8aW50NjRfdD4oMSkgPDwgZ2V0U2l6ZSgpKSAtIDEpOworICAgICAgICBiID0gYiAmICgoc3RhdGljX2Nhc3Q8aW50NjRfdD4oMSkgPDwgZ2V0U2l6ZSgpKSAtIDEpOworICAgICAgICBpZiAoYSA+IGIpIHsKKyAgICAgICAgICAgIC8vIGJhZCBoaWQgZGVzY3JpcHRvcgorICAgICAgICAgICAgcmV0dXJuIHswLCAwfTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4ge2EsIGJ9OworfQorCitzdGQ6OnBhaXI8aW50NjRfdCwgaW50NjRfdD4gSGlkUmVwb3J0OjpnZXRQaHlzaWNhbFJhbmdlKCkgY29uc3QgeworICAgIGlmICghKG1QaHlzaWNhbE1pbi5pc1NldCgpICYmIG1QaHlzaWNhbE1heC5pc1NldCgpKSkgeworICAgICAgICAvLyBwaHlzaWNhbCByYW5nZSB1bmRlZmluZWQsIHVzZSBsb2dpY2FsIHJhbmdlCisgICAgICAgIHJldHVybiBnZXRMb2dpY2FsUmFuZ2UoKTsKKyAgICB9CisKKyAgICBpbnQ2NF90IGEgPSBtUGh5c2ljYWxNaW4uZ2V0KDApOworICAgIGludDY0X3QgYiA9IG1QaHlzaWNhbE1heC5nZXQoMCk7CisKKyAgICBpZiAoYSA+IGIpIHsKKyAgICAgICAgYSA9IGEgJiAoKHN0YXRpY19jYXN0PGludDY0X3Q+KDEpIDw8IGdldFNpemUoKSkgLSAxKTsKKyAgICAgICAgYiA9IGIgJiAoKHN0YXRpY19jYXN0PGludDY0X3Q+KDEpIDw8IGdldFNpemUoKSkgLSAxKTsKKyAgICAgICAgaWYgKGEgPiBiKSB7CisgICAgICAgICAgICByZXR1cm4gezAsIDB9OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB7YSwgYn07Cit9CisKK3Vuc2lnbmVkIGludCBIaWRSZXBvcnQ6OmdldEZ1bGxVc2FnZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVVzYWdlIHwgKG1Vc2FnZVBhZ2UgPDwgMTYpOworfQorCitzaXplX3QgSGlkUmVwb3J0OjpnZXRTaXplKCkgY29uc3QgeworICAgIHJldHVybiBtUmVwb3J0U2l6ZTsKK30KKworc2l6ZV90IEhpZFJlcG9ydDo6Z2V0Q291bnQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1SZXBvcnRDb3VudDsKK30KKwordW5zaWduZWQgaW50IEhpZFJlcG9ydDo6Z2V0VW5pdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVVuaXQuZ2V0KDApOyAvLyBkZWZhdWx0IHVuaXQgaXMgMCBtZWFucyBkZWZhdWx0IHVuaXQKK30KKwordW5zaWduZWQgSGlkUmVwb3J0OjpnZXRSZXBvcnRJZCgpIGNvbnN0IHsKKyAgICAvLyBpZiByZXBvcnQgaWQgaXMgbm90IHNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gemVybworICAgIHJldHVybiBtUmVwb3J0SWQuZ2V0KDApOworfQorCit1bnNpZ25lZCBIaWRSZXBvcnQ6OmdldFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1SZXBvcnRUeXBlOworfQorCit2b2lkIEhpZFJlcG9ydDo6c2V0Q29sbGFwc2VkKHVpbnQzMl90IGZ1bGxVc2FnZSkgeworICAgIG1Vc2FnZSA9IGZ1bGxVc2FnZSAmIDB4RkZGRjsKKyAgICBtVXNhZ2VQYWdlID0gZnVsbFVzYWdlID4+IDE2OworICAgIG1Jc0NvbGxhcHNlZCA9IHRydWU7Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGludD4mIEhpZFJlcG9ydDo6Z2V0VXNhZ2VWZWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Vc2FnZVZlY3RvcjsKK30KK30gLy8gbmFtZXNwYWNlIEhpZFV0aWwKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWRSZXBvcnQuaCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWRSZXBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjAxYjY4Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL0hpZFJlcG9ydC5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgSElEVVRJTF9ISURSRVBPUlRfSF8KKyNkZWZpbmUgSElEVVRJTF9ISURSRVBPUlRfSF8KKworI2luY2x1ZGUgIkhpZEdsb2JhbC5oIgorI2luY2x1ZGUgIkhpZExvY2FsLmgiCisjaW5jbHVkZSAiVHJpU3RhdGUuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgSGlkVXRpbCB7CisKK2NsYXNzIEhpZFBhcnNlcjsKK2NsYXNzIEhpZFRyZWVOb2RlOworCisvLyBIaWRSZXBvcnQgcmVwcmVzZW50IGFuIGlucHV0LCBvdXRwdXQgb3IgZmVhdHVyZSByZXBvcnQKK2NsYXNzIEhpZFJlcG9ydCB7CisgICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBIaWRSZXBvcnQmIGgpOworcHVibGljOgorICAgIEhpZFJlcG9ydCh1aW50MzJfdCB0eXBlXywgdWludDMyX3QgZGF0YSwgY29uc3QgSGlkR2xvYmFsICZnbG9iYWwsIGNvbnN0IEhpZExvY2FsICZsb2NhbCk7CisKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCBkdXJpbmcgcGFyc2luZyBwcm9jZXNzIHdoZW4gdGhlIHBhcnNlciByZWdyb3VwcyBtdWx0aS12YWx1ZWQgcmVwb3J0IGludG8gb25lCisgICAgdm9pZCBzZXRDb2xsYXBzZWQodWludDMyX3QgZnVsbFVzYWdlKTsKKworICAgIC8vIGdldCByZXBvcnQgaWQKKyAgICB1bnNpZ25lZCBpbnQgZ2V0UmVwb3J0SWQoKSBjb25zdDsKKyAgICAvLyBnZXQgdHlwZSBvZiByZXBvcnQsIHJldHVybiBjb25zdGFudCBvZiBIaWREZWY6Ok1haW5UYWcKKyAgICB1bnNpZ25lZCBpbnQgZ2V0VHlwZSgpIGNvbnN0OworICAgIC8vIEZ1bGwgc2Vuc29yIHVzYWdlCisgICAgdW5zaWduZWQgaW50IGdldEZ1bGxVc2FnZSgpIGNvbnN0OworCisgICAgLy8gYmluYXJ5IHByb3BlcnRpZXMKKyAgICBib29sIGlzQXJyYXkoKSBjb25zdDsKKyAgICBib29sIGlzRGF0YSgpIGNvbnN0OworICAgIGJvb2wgaXNWYXJpYWJsZSgpIGNvbnN0OworCisgICAgLy8gbG9naWNhbCBhbmQgcGh5c2ljYWwgdmFsdWUgcmFuZ2UKKyAgICBzdGQ6OnBhaXI8aW50NjRfdCwgaW50NjRfdD4gZ2V0TG9naWNhbFJhbmdlKCkgY29uc3Q7CisgICAgc3RkOjpwYWlyPGludDY0X3QsIGludDY0X3Q+IGdldFBoeXNpY2FsUmFuZ2UoKSBjb25zdDsKKyAgICBkb3VibGUgZ2V0RXhwb25lbnRWYWx1ZSgpIGNvbnN0OworCisgICAgLy8gcmV0dXJuIEhJRCB1bml0IG5pYmJsZXMgaW4gYW4gdW5zaWduZWQgaW50CisgICAgdW5zaWduZWQgaW50IGdldFVuaXQoKSBjb25zdDsKKworICAgIC8vIHNpemUgaW4gYml0cworICAgIHNpemVfdCBnZXRTaXplKCkgY29uc3Q7CisgICAgLy8gZGltZW5zaW9uIChpZiBpdCBpcyB2ZWN0b3IvbWF0cml4KSBvciBudW1iZXIgb2YgY29uY3VycmVudCBpbnB1dCB2YWx1ZXMKKyAgICAvLyBpdCBpcyBhbHNvIHVzZWQgdG8gY2FsY3VsYXRlIG1lbW9yeSBmb290IHByaW50CisgICAgc2l6ZV90IGdldENvdW50KCkgY29uc3Q7CisKKyAgICAvLyBmb3Igb3V0cHV0IHRvIHN0cmVhbQorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyByZXBvcnRUeXBlVG9TdHJpbmcoaW50IHR5cGUpOworICAgIHN0ZDo6c3RyaW5nIGdldFN0cmluZ1R5cGUoKSBjb25zdDsKKyAgICBzdGQ6OnN0cmluZyBnZXRFeHBvbmVudFN0cmluZygpIGNvbnN0OworICAgIHN0ZDo6c3RyaW5nIGdldFVuaXRTdHJpbmcoKSBjb25zdDsKKyAgICBzdGQ6OnN0cmluZyBnZXRGbGFnU3RyaW5nKCkgY29uc3Q7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dW5zaWduZWQgaW50PiYgZ2V0VXNhZ2VWZWN0b3IoKSBjb25zdDsKK3ByaXZhdGU6CisgICAgYm9vbCBtSXNDb2xsYXBzZWQ7CisKKyAgICAvLyBtYW5kYXRhcnkgZmllbGRzCisgICAgdW5zaWduZWQgaW50IG1SZXBvcnRUeXBlOworICAgIHVuc2lnbmVkIGludCBtRmxhZzsKKyAgICB1bnNpZ25lZCBpbnQgbVVzYWdlUGFnZTsKKyAgICB1bnNpZ25lZCBpbnQgbVVzYWdlOworICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGludD4gbVVzYWdlVmVjdG9yOworCisgICAgaW50IG1Mb2dpY2FsTWluOyAgICAgICAgLy8gMzIgYml0IGlzIGVub3VnaAorICAgIGludCBtTG9naWNhbE1heDsKKyAgICB1bnNpZ25lZCBpbnQgbVJlcG9ydFNpemU7CisgICAgdW5zaWduZWQgaW50IG1SZXBvcnRDb3VudDsKKworICAgIC8vIHRoZXNlIGJlbG93IGFyZSBvcHRpb25hbAorICAgIHRyaV9pbnQgbVBoeXNpY2FsTWluOworICAgIHRyaV9pbnQgbVBoeXNpY2FsTWF4OworCisgICAgdHJpX3VpbnQgbUV4cG9uZW50OworICAgIHRyaV91aW50IG1Vbml0OworICAgIHRyaV91aW50IG1SZXBvcnRJZDsKK307CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBIaWRSZXBvcnQmIGgpOworfSAvLyBuYW1lc3BhY2UgSGlkVXRpbAorI2VuZGlmIC8vIEhJRFVUSUxfSElEUkVQT1JUX0hfCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvSGlkVHJlZS5jcHAgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvSGlkVHJlZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIwNDEzNQotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9IaWRUcmVlLmNwcApAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiSGlkRGVmcy5oIgorI2luY2x1ZGUgIkhpZExvZy5oIgorI2luY2x1ZGUgIkhpZFRyZWUuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBIaWRVdGlsIHsKKworLy8gSGlkVHJlZU5vZGUKK0hpZFRyZWVOb2RlOjpIaWRUcmVlTm9kZSgpIDogbU5vZGVUeXBlKFRZUEVfVU5JTklUSUFMSVpFRCksIG1EYXRhKDApLCBtRnVsbFVzYWdlKDApIHsKK30KKworSGlkVHJlZU5vZGU6OkhpZFRyZWVOb2RlKHN0ZDo6c2hhcmVkX3B0cjxIaWRUcmVlTm9kZT4gcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRhdGEsIHVpbnQzMl90IGZ1bGxVc2FnZSwgaW50IG5vZGVUeXBlKQorICAgICAgICA6IG1Ob2RlVHlwZShub2RlVHlwZSksIG1EYXRhKGRhdGEpLAorICAgICAgICBtRnVsbFVzYWdlKGZ1bGxVc2FnZSksIG1QYXJlbnQocGFyZW50KSB7Cit9CisKK0hpZFRyZWVOb2RlOjpIaWRUcmVlTm9kZShzdGQ6OnNoYXJlZF9wdHI8SGlkVHJlZU5vZGU+IHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkYXRhLCB1aW50MzJfdCBmdWxsVXNhZ2UpCisgICAgICAgIDogbU5vZGVUeXBlKFRZUEVfTk9STUFMKSwgbURhdGEoZGF0YSksCisgICAgICAgIG1GdWxsVXNhZ2UoZnVsbFVzYWdlKSwgbVBhcmVudChwYXJlbnQpIHsKK30KKwordm9pZCBIaWRUcmVlTm9kZTo6b3V0cHV0UmVjdXJzaXZlKHN0ZDo6b3N0cmVhbSAmb3MsIGludCBsZXZlbCkgY29uc3QgeworICAgIGluc2VydEluZGVudGF0aW9uKG9zLCBsZXZlbCk7CisgICAgb3MgPDwgIk5vZGUgZGF0YTogIiA8PCBtRGF0YQorICAgICAgIDw8ICIsIHVzYWdlICIgPDwgc3RkOjpoZXggPDwgbUZ1bGxVc2FnZSA8PCBzdGQ6OmRlYyA8PCBMT0dfRU5ETDsKKworICAgIGZvciAoYXV0byAmY2hpbGQgOiBtQ2hpbGRyZW4pIHsKKyAgICAgICAgY2hpbGQtPm91dHB1dFJlY3Vyc2l2ZShvcywgbGV2ZWwgKyAxKTsKKyAgICB9Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxIaWRUcmVlTm9kZT4gSGlkVHJlZU5vZGU6OmRlZXBDb3B5KAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SGlkVHJlZU5vZGU+IHBhcmVudCkgY29uc3QgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxIaWRUcmVlTm9kZT4gY29weShuZXcgSGlkVHJlZU5vZGUocGFyZW50LCBtRGF0YSwgbUZ1bGxVc2FnZSwgbU5vZGVUeXBlKSk7CisgICAgZm9yIChhdXRvICZpIDogbUNoaWxkcmVuKSB7CisgICAgICAgIGNvcHktPm1DaGlsZHJlbi5wdXNoX2JhY2soaS0+ZGVlcENvcHkoY29weSkpOworICAgIH0KKyAgICByZXR1cm4gY29weTsKK30KKwordm9pZCBIaWRUcmVlTm9kZTo6aW5zZXJ0SW5kZW50YXRpb24oc3RkOjpvc3RyZWFtICZvcywgaW50IGxldmVsKSBjb25zdCB7CisgICAgY29uc3RleHByIGNoYXIgaW5kZW50Q2hhcmFjdGVyID0gJ1x0JzsKKyAgICBzdGQ6OmZpbGxfbihzdGQ6Om9zdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4ob3MpLCBsZXZlbCwgaW5kZW50Q2hhcmFjdGVyKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEhpZFRyZWVOb2RlPiBIaWRUcmVlTm9kZTo6YWRkQ2hpbGQoc3RkOjpzaGFyZWRfcHRyPEhpZFRyZWVOb2RlPiBjaGlsZCkgeworICAgIG1DaGlsZHJlbi5wdXNoX2JhY2soY2hpbGQpOworICAgIHJldHVybiBjaGlsZDsKK30KKworc3RkOjpzaGFyZWRfcHRyPEhpZFRyZWVOb2RlPiBIaWRUcmVlTm9kZTo6Z2V0UGFyZW50KCkgY29uc3QgeworICAgIHJldHVybiBtUGFyZW50LmxvY2soKTsKK30KKworYm9vbCBIaWRUcmVlTm9kZTo6aXNSZXBvcnRDb2xsZWN0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBtTm9kZVR5cGUgPT0gVFlQRV9OT1JNQUwgJiYgbUNoaWxkcmVuLnNpemUoKSA9PSAxCisgICAgICAgICAgICAmJiBtQ2hpbGRyZW4uZnJvbnQoKS0+bU5vZGVUeXBlID09IFRZUEVfUkVQT1JUOworfQorCit1bnNpZ25lZCBpbnQgSGlkVHJlZU5vZGU6OmdldEZ1bGxVc2FnZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUZ1bGxVc2FnZTsKK30KKworc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEhpZFRyZWVOb2RlPj4mIEhpZFRyZWVOb2RlOjpnZXRDaGlsZHJlbigpIHsKKyAgICByZXR1cm4gbUNoaWxkcmVuOworfQorCitjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8SGlkVHJlZU5vZGU+PiYgSGlkVHJlZU5vZGU6OmdldENoaWxkcmVuKCkgY29uc3QgeworICAgIHJldHVybiBtQ2hpbGRyZW47Cit9CisKK2Jvb2wgSGlkVHJlZU5vZGU6OmlzVXNhZ2VDb2xsZWN0aW9uKCkgY29uc3QgeworICAgIHVzaW5nIG5hbWVzcGFjZSBIaWREZWY6OkNvbGxlY3Rpb25UeXBlOworICAgIHJldHVybiBtTm9kZVR5cGUgPT0gVFlQRV9OT1JNQUwgJiYgKG1EYXRhID09IFBIWVNJQ0FMIHx8IG1EYXRhID09IEFQUExJQ0FUSU9OKTsKK30KKworaW50IEhpZFRyZWVOb2RlOjpnZXROb2RlVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU5vZGVUeXBlOworfQorCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgSGlkVHJlZU5vZGUmIG4pIHsKKyAgICBuLm91dHB1dFJlY3Vyc2l2ZShvcywgMCk7CisgICAgcmV0dXJuIG9zOworfQorCisvLyBIaWRSZXBvcnROb2RlCitIaWRSZXBvcnROb2RlOjpIaWRSZXBvcnROb2RlKHN0ZDo6c2hhcmVkX3B0cjxIaWRUcmVlTm9kZT4gcGFyZW50LCBjb25zdCBIaWRSZXBvcnQgJnJlcG9ydCkKKyAgICA6IEhpZFRyZWVOb2RlKHBhcmVudCwgMCAvKmRhdGEqLywgMCAvKmZ1bGxVc2FnZSovLCBUWVBFX1JFUE9SVCksIG1SZXBvcnQocmVwb3J0KSB7Cit9CisKK3ZvaWQgSGlkUmVwb3J0Tm9kZTo6b3V0cHV0UmVjdXJzaXZlKHN0ZDo6b3N0cmVhbSAmb3MsIGludCBsZXZlbCkgY29uc3QgeworICAgIGluc2VydEluZGVudGF0aW9uKG9zLCBsZXZlbCk7CisgICAgb3MgPDwgbVJlcG9ydCA8PCBMT0dfRU5ETDsKK30KKworc3RkOjpzaGFyZWRfcHRyPEhpZFRyZWVOb2RlPiBIaWRSZXBvcnROb2RlOjpkZWVwQ29weSgKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEhpZFRyZWVOb2RlPiBwYXJlbnQpIGNvbnN0IHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SGlkVHJlZU5vZGU+IGNvcHkobmV3IEhpZFJlcG9ydE5vZGUocGFyZW50LCBtUmVwb3J0KSk7CisgICAgcmV0dXJuIGNvcHk7Cit9CisKK2NvbnN0IEhpZFJlcG9ydCYgSGlkUmVwb3J0Tm9kZTo6Z2V0UmVwb3J0KCkgY29uc3QgeworICAgIHJldHVybiBtUmVwb3J0OworfQorCit2b2lkIEhpZFJlcG9ydE5vZGU6OmNvbGxhcHNlKHVuc2lnbmVkIGludCBuZXdVc2FnZSkgeworICAgIG1SZXBvcnQuc2V0Q29sbGFwc2VkKG5ld1VzYWdlKTsKK30KKworfSAvL25hbWVzcGFjZSBIaWRVdGlsCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvSGlkVHJlZS5oIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL0hpZFRyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzUyMDA3Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL0hpZFRyZWUuaApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIEhJRFVUSUxfSElEVFJFRV9IXworI2RlZmluZSBISURVVElMX0hJRFRSRUVfSF8KKworI2luY2x1ZGUgIkhpZFJlcG9ydC5oIgorCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK25hbWVzcGFjZSBIaWRVdGlsIHsKKworLy8gSElEIHJlcG9ydCBwYXJzZXIgb3V0cHV0IHRyZWUgbm9kZQorY2xhc3MgSGlkVHJlZU5vZGUgeworICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgSGlkVHJlZU5vZGUmIG4pOworcHVibGljOgorICAgIGVudW0geworICAgICAgICBUWVBFX1VOSU5JVElBTElaRUQgPSAwLAorICAgICAgICBUWVBFX05PUk1BTCA9IDEsCisgICAgICAgIFRZUEVfUkVQT1JUID0gMiAgICAgLy8gY2FuIGJlIGNhc3QgdG8gSGlkUmVwb3J0Tm9kZQorICAgIH07CisgICAgSGlkVHJlZU5vZGUoKTsKKyAgICBIaWRUcmVlTm9kZShzdGQ6OnNoYXJlZF9wdHI8SGlkVHJlZU5vZGU+IHBhcmVudCwgdWludDMyX3QgZGF0YSwgdWludDMyX3QgZnVsbFVzYWdlKTsKKworICAgIHZpcnR1YWwgfkhpZFRyZWVOb2RlKCkgPSBkZWZhdWx0OworCisgICAgLy8gbWFrZSBhIGRlZXAgY29weSBvZiB0cmVlIGF0IGFuZCBiZWxvdyB0aGlzIG5vZGUgYW5kIGF0dGFjaCBpdCB0byBzcGVjaWZpZWQgcGFyZW50IG5vZGUKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxIaWRUcmVlTm9kZT4gZGVlcENvcHkoCisgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEhpZFRyZWVOb2RlPiBwYXJlbnQgPSBudWxscHRyKSBjb25zdDsKKworICAgIC8vIGFkZCBjaGlsZCB0byB0aGlzIG5vZGUKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SGlkVHJlZU5vZGU+IGFkZENoaWxkKHN0ZDo6c2hhcmVkX3B0cjxIaWRUcmVlTm9kZT4gY2hpbGQpOworCisgICAgLy8gZ2V0IGFsbCBjaGlsZHJlbiBvZiBhIG5vZGUKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8SGlkVHJlZU5vZGU+PiYgZ2V0Q2hpbGRyZW4oKTsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8SGlkVHJlZU5vZGU+PiYgZ2V0Q2hpbGRyZW4oKSBjb25zdDsKKworICAgIC8vIGdldCBwYXJlbnQgKG51bGxwdHIgaWYgaXQgaXMgcm9vdCBub2RlIG9yIGlmIGxvY2sgd2Vha19wdHIgZmFpbGVkKQorICAgIHN0ZDo6c2hhcmVkX3B0cjxIaWRUcmVlTm9kZT4gZ2V0UGFyZW50KCkgY29uc3Q7CisKKyAgICAvLyBhY2Nlc3MgdXNhZ2Ugb2YgdGhpcyBub2RlCisgICAgdW5zaWduZWQgaW50IGdldEZ1bGxVc2FnZSgpIGNvbnN0OworCisgICAgYm9vbCBpc1JlcG9ydENvbGxlY3Rpb24oKSBjb25zdDsKKyAgICBib29sIGlzVXNhZ2VDb2xsZWN0aW9uKCkgY29uc3Q7CisgICAgaW50IGdldE5vZGVUeXBlKCkgY29uc3Q7Citwcm90ZWN0ZWQ6CisgICAgLy8gZm9yIGRlcml2ZWQgY2xhc3MgdG8gZGVmaW5lIGRpZmZlcmVudCBub2RlVHlwZQorICAgIEhpZFRyZWVOb2RlKHN0ZDo6c2hhcmVkX3B0cjxIaWRUcmVlTm9kZT4gcGFyZW50LAorICAgICAgICAgICAgICB1aW50MzJfdCBkYXRhLCB1aW50MzJfdCBmdWxsVXNhZ2UsIGludCBub2RlVHlwZSk7CisKKyAgICAvLyBoZWxwZXIgZm9yIHN0cmVhbSBvdXRwdXQKKyAgICB2b2lkIGluc2VydEluZGVudGF0aW9uKHN0ZDo6b3N0cmVhbSAmb3MsIGludCBsZXZlbCkgY29uc3Q7Citwcml2YXRlOgorICAgIC8vIGhlbHBlciBmb3Igc3RyZWFtIG91dHB1dAorICAgIHZpcnR1YWwgdm9pZCBvdXRwdXRSZWN1cnNpdmUoc3RkOjpvc3RyZWFtJiBvcywgaW50IGxldmVsKSBjb25zdDsKKworICAgIGludCBtTm9kZVR5cGU7CisgICAgdWludDMyX3QgbURhdGE7CisgICAgdWludDMyX3QgbUZ1bGxVc2FnZTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxIaWRUcmVlTm9kZT4+IG1DaGlsZHJlbjsKKyAgICBzdGQ6OndlYWtfcHRyPEhpZFRyZWVOb2RlPiBtUGFyZW50OworfTsKKworLy8gVHJlZSBub2RlIHRoYXQgY29ycmVzcG9uZHMgdG8gYW4gaW5wdXQsIG91dHB1dCBvciBmZWF0dXJlIHJlcG9ydAorY2xhc3MgSGlkUmVwb3J0Tm9kZSA6IHB1YmxpYyBIaWRUcmVlTm9kZSB7CitwdWJsaWM6CisgICAgSGlkUmVwb3J0Tm9kZShzdGQ6OnNoYXJlZF9wdHI8SGlkVHJlZU5vZGU+IHBhcmVudCwgY29uc3QgSGlkUmVwb3J0ICZyZXBvcnQpOworCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8SGlkVHJlZU5vZGU+IGRlZXBDb3B5KAorICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxIaWRUcmVlTm9kZT4gcGFyZW50ID0gbnVsbHB0cikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLyBvYnRhaW4gSGlkUmVwb3J0IGF0dGFjaGVkIHRvIHRoaXMgbm9kZQorICAgIGNvbnN0IEhpZFJlcG9ydCYgZ2V0UmVwb3J0KCkgY29uc3Q7CisKKyAgICAvLyByZXNldCB1c2FnZSBvZiBub2RlIGFuZCBzZXQgdW5kZXJseWluZyByZXBvcnQgdG8gY29sbGFwc2VkCisgICAgdm9pZCBjb2xsYXBzZSh1bnNpZ25lZCBpbnQgbmV3VXNhZ2UpOworcHJpdmF0ZToKKyAgICB2aXJ0dWFsIHZvaWQgb3V0cHV0UmVjdXJzaXZlKHN0ZDo6b3N0cmVhbSAmb3MsIGludCBsZXZlbCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBIaWRSZXBvcnQgbVJlcG9ydDsKK307CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBIaWRUcmVlTm9kZSYgbik7CisKK30gLy8gbmFtZXNwYWNlIEhpZFV0aWwKKworI2VuZGlmIC8vIEhJRFVUSUxfSElEVFJFRV9IXwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL1N0cmVhbUlvVXRpbC5oIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL1N0cmVhbUlvVXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YTk0YjYKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvU3RyZWFtSW9VdGlsLmgKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBISURVVElMX1NUUkVBTV9JT19VVElMX0hfCisjZGVmaW5lIEhJRFVUSUxfU1RSRUFNX0lPX1VUSUxfSF8KKworI2luY2x1ZGUgIkhpZExvZy5oIgorI2luY2x1ZGUgPGlzdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgSGlkVXRpbCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIENoYXJUPgorY2xhc3MgY2hhcnZlY3RvcmJ1ZiA6IHB1YmxpYyBzdGQ6OnN0cmVhbWJ1ZiB7IC8vIGNsYXNzIG5hbWUgaXMgY29uc2lzdGVudCB3aXRoIHN0ZCBsaWIKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfY29uc3Q8Q2hhclQ+Ojp2YWx1ZSA9PSBmYWxzZSwgImNhbm5vdCB1c2UgY29uc3QgdHlwZSIpOworcHVibGljOgorICAgIC8vIHIvdyBidWZmZXIgY29uc3RydWN0b3JzCisgICAgY2hhcnZlY3RvcmJ1ZihzdGQ6OnZlY3RvcjxDaGFyVD4gJnZlYykgeworICAgICAgICBpbml0KHZlYy5kYXRhKCksIHZlYy5zaXplKCkpOworICAgIH0KKworICAgIGNoYXJ2ZWN0b3JidWYoQ2hhclQgKmJlZ2luLCBDaGFyVCAqZW5kKSB7CisgICAgICAgIGFzc2VydChlbmQgPj0gYmVnaW4pOworICAgICAgICBpbml0KGJlZ2luLCBlbmQgLSBiZWdpbik7CisgICAgfQorCisgICAgY2hhcnZlY3RvcmJ1ZihDaGFyVCAqYmVnaW4sIHNpemVfdCBzaXplKSB7CisgICAgICAgIGluaXQoYmVnaW4sIHNpemUpOworICAgIH0KKworICAgIC8vIHIvbyBidWZmZXIgY29uc3RydWN0b3IKKyAgICBjaGFydmVjdG9yYnVmKGNvbnN0IHN0ZDo6dmVjdG9yPENoYXJUPiAmdmVjKSB7CisgICAgICAgIGluaXQodmVjLmRhdGEoKSwgdmVjLnNpemUoKSk7CisgICAgfQorCisgICAgY2hhcnZlY3RvcmJ1Zihjb25zdCBDaGFyVCAqYmVnaW4sIGNvbnN0IENoYXJUICplbmQpIHsKKyAgICAgICAgYXNzZXJ0KGVuZCA+PSBiZWdpbik7CisgICAgICAgIGluaXQoYmVnaW4sIGVuZCAtIGJlZ2luKTsKKyAgICB9CisKKyAgICBjaGFydmVjdG9yYnVmKGNvbnN0IENoYXJUICpiZWdpbiwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgaW5pdChiZWdpbiwgc2l6ZSk7CisgICAgfQorIHByb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHN0ZDo6c3RyZWFtcG9zIHNlZWtwb3MoCisgICAgICAgICAgICBzdGQ6OnN0cmVhbXBvcyBzcCwgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgd2hpY2ggPQorICAgICAgICAgICAgc3RkOjppb3NfYmFzZTo6aW4gfCBzdGQ6Omlvc19iYXNlOjpvdXQpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIHNlZWtvZmYoc3RkOjpzdHJlYW1vZmYoc3ApLCBzdGQ6Omlvc19iYXNlOjpiZWcsIHdoaWNoKTsKKyAgICB9CisKKyAgICAvLyB0aGlzIGlzIG5lZWRlZCB0byB1c2UgZnRlbGwoKSBvbiBzdHJlYW0KKyAgICB2aXJ0dWFsIHN0ZDo6c3RyZWFtcG9zIHNlZWtvZmYoCisgICAgICAgICAgICBzdGQ6OnN0cmVhbW9mZiBvZmYsIHN0ZDo6aW9zX2Jhc2U6OnNlZWtkaXIgd2F5LAorICAgICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgd2hpY2ggPQorICAgICAgICAgICAgc3RkOjppb3NfYmFzZTo6aW4gfCBzdGQ6Omlvc19iYXNlOjpvdXQpIG92ZXJyaWRlIHsKKworICAgICAgICAvLyBwcHRyKCkgPT0gbnVsbHB0cjogcmVhZC1vbmx5CisgICAgICAgIGFzc2VydChwcHRyKCkgPT0gbnVsbHB0ciB8fCBlZ3B0cigpIC0gZWJhY2soKSA9PSBlcHB0cigpIC0gcGJhc2UoKSk7CisgICAgICAgIGJvb2wgaW4gPSB3aGljaCAmIHN0ZDo6aW9zX2Jhc2U6OmluOworICAgICAgICBib29sIG91dCA9IHdoaWNoICYgc3RkOjppb3NfYmFzZTo6b3V0OworICAgICAgICBwb3NfdHlwZSBlbmQgPSBlZ3B0cigpIC0gZWJhY2soKTsKKworICAgICAgICBpZiAoIWluICYmICFvdXQpIHsKKyAgICAgICAgICAgIHJldHVybiBwb3NfdHlwZSgtMSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW4gJiYgb3V0ICYmIHdheSA9PSBzdGQ6Omlvc19iYXNlOjpjdXIpIHsKKyAgICAgICAgICAgIHJldHVybiBwb3NfdHlwZSgtMSk7CisgICAgICAgIH0KKworICAgICAgICBvZmZfdHlwZSBub2ZmOworICAgICAgICBzd2l0Y2ggKHdheSkgeworICAgICAgICAgICAgY2FzZSBzdGQ6Omlvc19iYXNlOjpiZWc6CisgICAgICAgICAgICAgICAgbm9mZiA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHN0ZDo6aW9zX2Jhc2U6OmN1cjoKKyAgICAgICAgICAgICAgICBpZiAoaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgbm9mZiA9IGdwdHIoKSAtIGViYWNrKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbm9mZiA9IHBwdHIoKSAtIHBiYXNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBzdGQ6Omlvc19iYXNlOjplbmQ6CisgICAgICAgICAgICAgICAgbm9mZiA9IGVuZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHBvc190eXBlKC0xKTsKKyAgICAgICAgfQorICAgICAgICBub2ZmICs9IG9mZjsKKyAgICAgICAgaWYgKG5vZmYgPCAwIHx8ICBub2ZmID4gZW5kKSB7CisgICAgICAgICAgICByZXR1cm4gcG9zX3R5cGUoLTEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5vZmYgIT0gMCAmJiAoKGluICYmIGdwdHIoKSA9PSBudWxscHRyKSB8fCAob3V0ICYmIHBwdHIoKSA9PSBudWxscHRyKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBwb3NfdHlwZSgtMSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW4pIHsKKyAgICAgICAgICAgIHNldGcoZWJhY2soKSwgZWJhY2soKSArIG5vZmYsIGVncHRyKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dCkgeworICAgICAgICAgICAgc2V0cChwYmFzZSgpLCBlcHB0cigpKTsKKyAgICAgICAgICAgIHBidW1wKG5vZmYpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHBvc190eXBlKG5vZmYpOworICAgIH0KK3ByaXZhdGU6CisgICAgLy8gcmVhZCBvbmx5IGJ1ZmZlciBpbml0CisgICAgdm9pZCBpbml0KGNvbnN0IENoYXJUICpiYXNlLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBzZXRnKChjaGFyKiliYXNlLCAoY2hhciopYmFzZSwgKGNoYXIqKShiYXNlICsgc2l6ZSkpOworICAgIH0KKworICAgIC8vIHJlYWQgd3JpdGUgYnVmZmVyIGluaXQKKyAgICB2b2lkIGluaXQoQ2hhclQgKmJhc2UsIHNpemVfdCBzaXplKSB7CisgICAgICAgIHNldGcoKGNoYXIqKWJhc2UsIChjaGFyKiliYXNlLCAoY2hhciopKGJhc2UgKyBzaXplKSk7CisgICAgICAgIHNldHAoKGNoYXIqKWJhc2UsIChjaGFyKikoYmFzZSArIHNpemUpKTsKKyAgICB9Cit9OworCisvLyBkdW1wIGJpbmFyeSB2YWx1ZXMKK3RlbXBsYXRlIDxjbGFzcyBGb3J3YXJkSXRlcmF0b3I+Cit2b2lkIGhleGR1bXBUb1N0cmVhbShzdGQ6Om9zdHJlYW0gJm9zLCBjb25zdCBGb3J3YXJkSXRlcmF0b3IgJmZpcnN0LCBjb25zdCBGb3J3YXJkSXRlcmF0b3IgJmxhc3QpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KAorICAgICAgICAgICAgc3RkOjppc19jb252ZXJ0aWJsZTwKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxGb3J3YXJkSXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeSwKKyAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnPjo6dmFsdWUKKyAgICAgICAgICAgICYmIHN0ZDo6aXNfY29udmVydGlibGU8CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8Rm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyPjo6dmFsdWUKKyAgICAgICAgICAgICYmIHNpemVvZih0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxGb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlKQorICAgICAgICAgICAgICAgID09IHNpemVvZih1bnNpZ25lZCBjaGFyKSwKKyAgICAgICAgICAgICJPbmx5IGFjY2VwdHMgZm9yd2FyZCBpdGVyYXRvciBvZiBhIHR5cGUgb2Ygc2l6ZSAxICIKKyAgICAgICAgICAgICAgICAidGhhdCBjYW4gYmUgY29udmVydCB0byB1bnNpZ25lZCBjaGFyLlxuIik7CisgICAgc2l6ZV90IGMgPSAwOworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzczsKKyAgICBmb3IgKEZvcndhcmRJdGVyYXRvciBpID0gZmlyc3Q7IGkgIT0gbGFzdDsgKytpLCArK2MpIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciB2ID0gKmk7CisgICAgICAgIC8vIGZvcm1hdHRpbmcKKyAgICAgICAgc3dpdGNoIChjICYgMHhmKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgLy8gYWRkcmVzcworICAgICAgICAgICAgICAgIG9zIDw8IHNzLnN0cigpIDw8IExPR19FTkRMOworICAgICAgICAgICAgICAgIHNzLnN0cigiIik7CisgICAgICAgICAgICAgICAgc3MgPDwgc3RkOjpoZXg7CisgICAgICAgICAgICAgICAgc3MgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KDQpIDw8IGMgPDwgIjogIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAvLyBzcGFjZQorICAgICAgICAgICAgICAgIHNzIDw8ICIgIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzcyA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OnNldHcoMikKKyAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KHYpKSA8PCAiICI7CisgICAgfQorICAgIG9zIDw8IHNzLnN0cigpIDw8IExPR19FTkRMOworfQorfSAvL25hbWVzcGFjZSBIaWRVdGlsCisKKyNlbmRpZiAvLyBISURVVElMX1NUUkVBTV9JT19VVElMX0hfCisKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9UcmlTdGF0ZS5oIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL1RyaVN0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU0NDgyNgotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy9UcmlTdGF0ZS5oCkBAIC0wLDAgKzEsMjU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgSElEVVRJTF9UUklTVEFURV9IXworI2RlZmluZSBISURVVElMX1RSSVNUQVRFX0hfCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCituYW1lc3BhY2UgSGlkVXRpbCB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgVHJpU3RhdGUgeworcHVibGljOgorICAgIC8vIGNvbnN0cnVjdG9yCisgICAgVHJpU3RhdGUoKSA6IG1Jc1NldChmYWxzZSkgeyB9CisgICAgVHJpU3RhdGUoY29uc3QgVHJpU3RhdGU8VD4gJm90aGVyKSA6IG1Jc1NldChvdGhlci5tSXNTZXQpLCBtVmFsdWUob3RoZXIubVZhbHVlKSB7IH0KKyAgICBleHBsaWNpdCBUcmlTdGF0ZShjb25zdCBUICZ2YWx1ZSkgOiBtSXNTZXQodHJ1ZSksIG1WYWx1ZSh2YWx1ZSkgeyB9CisKKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgICBtVmFsdWUgPSBUKCk7CisgICAgICAgIG1Jc1NldCA9IGZhbHNlOworICAgIH0KKyAgICBib29sIGlzU2V0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUlzU2V0OworICAgIH0KKworICAgIGNvbnN0IFQgZ2V0KGNvbnN0IFQgJmRlZmF1bHRWYWx1ZSkgY29uc3QgeworICAgICAgICByZXR1cm4gaXNTZXQoKSA/IG1WYWx1ZSA6IGRlZmF1bHRWYWx1ZTsKKyAgICB9CisKKyAgICAvLyBvcGVyYXRvciBvdmVybG9hZGluZworICAgIGV4cGxpY2l0IG9wZXJhdG9yIFQgKCkgY29uc3QgeworICAgICAgICBhc3NlcnQobUlzU2V0KTsKKyAgICAgICAgcmV0dXJuIG1WYWx1ZTsKKyAgICB9CisKKyAgICBUcmlTdGF0ZTxUPiYgb3BlcmF0b3I9KGNvbnN0IFRyaVN0YXRlPFQ+ICZvdGhlcikgeworICAgICAgICBtSXNTZXQgPSBvdGhlci5tSXNTZXQ7CisgICAgICAgIG1WYWx1ZSA9IG90aGVyLm1WYWx1ZTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFRyaVN0YXRlPFQ+JiBvcGVyYXRvcj0oY29uc3QgVCYgdmFsdWUpIHsKKyAgICAgICAgbUlzU2V0ID0gdHJ1ZTsKKyAgICAgICAgbVZhbHVlID0gdmFsdWU7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBUcmlTdGF0ZTxUPiYgb3BlcmF0b3IrKygpICB7CisgICAgICAgIGlmIChtSXNTZXQpIHsKKyAgICAgICAgICAgIG1WYWx1ZSsrOworICAgICAgICB9CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBUcmlTdGF0ZTxUPiBvcGVyYXRvcisrKGludCkgeworICAgICAgICBUcmlTdGF0ZTxUPiB0bXAoKnRoaXMpOworICAgICAgICBvcGVyYXRvcisrKCk7CisgICAgICAgIHJldHVybiB0bXA7CisgICAgfQorCisgICAgVHJpU3RhdGU8VD4mIG9wZXJhdG9yLS0oKSAgeworICAgICAgICBpZiAobUlzU2V0KSB7CisgICAgICAgICAgICBtVmFsdWUtLTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgVHJpU3RhdGU8VD4gb3BlcmF0b3ItLShpbnQpIHsKKyAgICAgICAgVHJpU3RhdGU8VD4gdG1wKCp0aGlzKTsKKyAgICAgICAgb3BlcmF0b3ItLSgpOworICAgICAgICByZXR1cm4gdG1wOworICAgIH0KKworI2RlZmluZSBVTkFSWV9PUChvcCkgXAorICAgIFRyaVN0YXRlPFQ+IG9wZXJhdG9yIG9wKCkgeyBcCisgICAgICAgIFRyaVN0YXRlPFQ+IHRtcCgqdGhpcyk7IFwKKyAgICAgICAgaWYgKG1Jc1NldCkgeyBcCisgICAgICAgICAgICB0bXAubVZhbHVlID0gb3AgdG1wLm1WYWx1ZTsgXAorICAgICAgICB9IFwKKyAgICAgICAgcmV0dXJuIHRtcDsgXAorICAgIH0KKworICAgIFVOQVJZX09QKCEpOworICAgIFVOQVJZX09QKC0pOworICAgIFVOQVJZX09QKH4pOworI3VuZGVmIFVOQVJZX09QCisKKyNkZWZpbmUgQ09NUE9VTkRfQVNTSUdOX09QKG9wKSBcCisgICAgVHJpU3RhdGU8VD4mIG9wZXJhdG9yIG9wIChjb25zdCBUcmlTdGF0ZTxUPiYgcmhzKSB7IFwKKyAgICAgICAgaWYgKG1Jc1NldCAmJiByaHMubUlzU2V0KSB7IFwKKyAgICAgICAgICAgIG1WYWx1ZSBvcCByaHMubVZhbHVlOyBcCisgICAgICAgIH0gZWxzZSB7IFwKKyAgICAgICAgICAgIG1Jc1NldCA9IGZhbHNlOyBcCisgICAgICAgIH0gXAorICAgICAgICByZXR1cm4gKnRoaXM7IFwKKyAgICB9IFwKKyAgICBUcmlTdGF0ZTxUPiYgb3BlcmF0b3Igb3AoY29uc3QgVCYgcmhzKSB7IFwKKyAgICAgICAgaWYgKG1Jc1NldCkgeyBcCisgICAgICAgICAgICBtVmFsdWUgb3AgcmhzOyBcCisgICAgICAgIH0gXAorICAgICAgICByZXR1cm4gKnRoaXM7IFwKKyAgICB9CisKKyAgICBDT01QT1VORF9BU1NJR05fT1AoKz0pOworICAgIENPTVBPVU5EX0FTU0lHTl9PUCgtPSk7CisgICAgQ09NUE9VTkRfQVNTSUdOX09QKCo9KTsKKyAgICBDT01QT1VORF9BU1NJR05fT1AoLz0pOworICAgIENPTVBPVU5EX0FTU0lHTl9PUCglPSk7CisgICAgQ09NUE9VTkRfQVNTSUdOX09QKCY9KTsKKyAgICBDT01QT1VORF9BU1NJR05fT1AofD0pOworICAgIENPTVBPVU5EX0FTU0lHTl9PUChePSk7CisjdW5kZWYgQ09NUE9VTkRfQVNTSUdOX09QCisKKyAgICBUcmlTdGF0ZTxUPiYgb3BlcmF0b3IgPj49KGludCBpKSB7CisgICAgICAgIGlmIChtSXNTZXQpIHsKKyAgICAgICAgICAgIG1WYWx1ZSA+Pj0gaTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKnRoaXM7IFwKKyAgICB9CisKKyAgICBUcmlTdGF0ZTxUPiYgb3BlcmF0b3IgPDw9KGludCBpKSB7CisgICAgICAgIGlmIChtSXNTZXQpIHsKKyAgICAgICAgICAgIG1WYWx1ZSA8PD0gaTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKnRoaXM7IFwKKyAgICB9CisKKyAgICBUcmlTdGF0ZTxUPiBvcGVyYXRvciA8PChpbnQgaSkgeyBcCisgICAgICAgIFRyaVN0YXRlPFQ+IHRtcCgqdGhpcyk7CisgICAgICAgIG9wZXJhdG9yPDwoaSk7CisgICAgICAgIHJldHVybiB0bXA7CisgICAgfQorCisgICAgVHJpU3RhdGU8VD4gb3BlcmF0b3IgPj4oaW50IGkpIHsgXAorICAgICAgICBUcmlTdGF0ZTxUPiB0bXAoKnRoaXMpOworICAgICAgICBvcGVyYXRvcj4+KGkpOworICAgICAgICByZXR1cm4gdG1wOworICAgIH0KKworI2RlZmluZSBCSU5BUllfT1Aob3AsIGNvbXBvdW5kX29wKSBcCisgICAgZnJpZW5kIFRyaVN0YXRlPFQ+IG9wZXJhdG9yIG9wKFRyaVN0YXRlPFQ+IGxocywgY29uc3QgVHJpU3RhdGU8VD4mIHJocykgeyBcCisgICAgICAgIGxocyBjb21wb3VuZF9vcCByaHM7IFwKKyAgICByZXR1cm4gbGhzOyBcCisgICAgfVwKKyAgICAgICAgZnJpZW5kIFRyaVN0YXRlPFQ+IG9wZXJhdG9yIG9wKFRyaVN0YXRlPFQ+IGxocywgY29uc3QgVCYgcmhzKSB7IFwKKyAgICBsaHMgY29tcG91bmRfb3AgcmhzOyBcCisgICAgICAgIHJldHVybiBsaHM7IFwKKyAgICB9XAorICAgIGZyaWVuZCBUcmlTdGF0ZTxUPiBvcGVyYXRvciBvcChjb25zdCBUICZsaHMsIGNvbnN0IFRyaVN0YXRlPFQ+JiByaHMpIHsgXAorICAgICAgICBUcmlTdGF0ZTxUPiB0bXAobGhzKTsgXAorICAgICAgICByZXR1cm4gdG1wIG9wIHJoczsgXAorICAgIH0KKworICAgIEJJTkFSWV9PUCgrLCArPSk7CisgICAgQklOQVJZX09QKC0sIC09KTsKKyAgICBCSU5BUllfT1AoKiwgKj0pOworICAgIEJJTkFSWV9PUCgvLCAvPSk7CisgICAgQklOQVJZX09QKCUsICU9KTsKKyAgICBCSU5BUllfT1AoJiwgJj0pOworICAgIEJJTkFSWV9PUCh8LCB8PSk7CisgICAgQklOQVJZX09QKF4sIF49KTsKKyN1bmRlZiBCSU5BUllfT1AKKworI2RlZmluZSBSRUxBVElPTl9PUChvcCkgXAorICAgIGZyaWVuZCBUcmlTdGF0ZTxib29sPiBvcGVyYXRvciBvcChjb25zdCBUcmlTdGF0ZTxUPiYgbGhzLCBjb25zdCBUcmlTdGF0ZTxUPiYgcmhzKSB7IFwKKyAgICAgICAgaWYgKGxocy5tSXNTZXQgJiYgcmhzLm1Jc1NldCkgeyBcCisgICAgICAgICAgICByZXR1cm4gVHJpU3RhdGU8Ym9vbD4obGhzLm1WYWx1ZSBvcCByaHMubVZhbHVlKTsgXAorICAgICAgICB9IGVsc2UgeyBcCisgICAgICAgIHJldHVybiBUcmlTdGF0ZTxib29sPigpOyBcCisgICAgICAgIH0gXAorICAgIH0gXAorICAgIGZyaWVuZCBUcmlTdGF0ZTxib29sPiBvcGVyYXRvciBvcChjb25zdCBUcmlTdGF0ZTxUPiYgbGhzLCBjb25zdCBUJiByaHMpIHsgXAorICAgICAgICBpZiAobGhzLm1Jc1NldCkgeyBcCisgICAgICAgICAgICByZXR1cm4gVHJpU3RhdGU8Ym9vbD4obGhzLm1WYWx1ZSBvcCByaHMpOyBcCisgICAgICAgIH0gZWxzZSB7IFwKKyAgICAgICAgICAgIHJldHVybiBUcmlTdGF0ZTxib29sPigpOyBcCisgICAgICAgIH0gXAorICAgIH0gXAorICAgIGZyaWVuZCBUcmlTdGF0ZTxib29sPiBvcGVyYXRvciBvcChjb25zdCBUJiBsaHMsIGNvbnN0IFRyaVN0YXRlPFQ+JiByaHMpIHsgXAorICAgICAgICBpZiAocmhzLm1Jc1NldCkgeyBcCisgICAgICAgICAgICByZXR1cm4gVHJpU3RhdGU8Ym9vbD4obGhzIG9wIHJocy5tVmFsdWUpOyBcCisgICAgICAgIH0gZWxzZSB7IFwKKyAgICAgICAgICAgIHJldHVybiBUcmlTdGF0ZTxib29sPigpOyBcCisgICAgICAgIH0gXAorICAgIH0KKworICAgIFJFTEFUSU9OX09QKD09KTsKKyAgICBSRUxBVElPTl9PUCghPSk7CisgICAgUkVMQVRJT05fT1AoPj0pOworICAgIFJFTEFUSU9OX09QKDw9KTsKKyAgICBSRUxBVElPTl9PUCg+KTsKKyAgICBSRUxBVElPTl9PUCg8KTsKKyN1bmRlZiBSRUxBVElPTl9PUAorCisgICAgZnJpZW5kIFRyaVN0YXRlPGJvb2w+IG9wZXJhdG9yICYmKFRyaVN0YXRlPFQ+JiBsaHMsIGNvbnN0IFRyaVN0YXRlPFQ+JiByaHMpIHsKKyAgICAgICAgaWYgKGxocy5tSXNTZXQgJiYgcmhzLm1Jc1NldCkgeworICAgICAgICAgICAgcmV0dXJuIFRyaVN0YXRlPGJvb2w+KGxocy5tVmFsdWUgJiYgcmhzLm1WYWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gVHJpU3RhdGU8Ym9vbD4oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZyaWVuZCBUcmlTdGF0ZTxib29sPiBvcGVyYXRvciB8fChUcmlTdGF0ZTxUPiYgbGhzLCBjb25zdCBUcmlTdGF0ZTxUPiYgcmhzKSB7CisgICAgICAgIGlmIChsaHMubUlzU2V0ICYmIHJocy5tSXNTZXQpIHsKKyAgICAgICAgICAgIHJldHVybiBUcmlTdGF0ZTxib29sPihsaHMubVZhbHVlIHx8IHJocy5tVmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIFRyaVN0YXRlPGJvb2w+KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PChzdGQ6Om9zdHJlYW0gJm9zLCBjb25zdCBUcmlTdGF0ZTxUPiAmdikgeworICAgICAgICBpZiAodi5tSXNTZXQpIHsKKyAgICAgICAgICAgIG9zIDw8IHYubVZhbHVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3MgPDwgIltub3Qgc2V0XSI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9zOworICAgIH0KKworICAgIGZyaWVuZCBzdGQ6OmlzdHJlYW0mIG9wZXJhdG9yID4+KHN0ZDo6aXN0cmVhbSAmaXMsIGNvbnN0IFRyaVN0YXRlPFQ+ICZ2KSB7CisgICAgICAgIFQgYTsKKyAgICAgICAgaXMgPj4gYTsKKyAgICAgICAgdiA9IFRyaVN0YXRlPFQ+KGEpOworICAgICAgICByZXR1cm4gaXM7CisgICAgfQorcHJpdmF0ZToKKyAgICBib29sIG1Jc1NldDsKKyAgICBUIG1WYWx1ZTsKK307CisKKy8vIGNvbW1vbmx5IHVzZWQgb25lcwordHlwZWRlZiBUcmlTdGF0ZTx1bnNpZ25lZD4gdHJpX3VpbnQ7Cit0eXBlZGVmIFRyaVN0YXRlPGludD4gdHJpX2ludDsKKwordHlwZWRlZiBUcmlTdGF0ZTx1aW50MzJfdD4gdHJpX3VpbnQzMl90OwordHlwZWRlZiBUcmlTdGF0ZTxpbnQzMl90PiB0cmlfaW50MzJfdDsKK3R5cGVkZWYgVHJpU3RhdGU8dWludDhfdD4gdHJpX3VpbnQ4X3Q7Cit0eXBlZGVmIFRyaVN0YXRlPHVpbnQxNl90PiB0cmlfdWludDE2X3Q7Cit9CisKKyNlbmRpZiAvLyBISURVVElMX1RSSVNUQVRFX0hfCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvdGVzdC9IaWRQYXJzZXJFeGFtcGxlLmNwcCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy90ZXN0L0hpZFBhcnNlckV4YW1wbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNzI0M2UKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvdGVzdC9IaWRQYXJzZXJFeGFtcGxlLmNwcApAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiSGlkTG9nLmgiCisjaW5jbHVkZSAiSGlkUGFyc2VyLmgiCisjaW5jbHVkZSAiVGVzdEhpZERlc2NyaXB0b3IuaCIKKyNpbmNsdWRlIDxlcnJuby5oPgorCit1c2luZyBIaWRVdGlsOjpIaWRQYXJzZXI7CisKK2Jvb2wgZG9QYXJzZSgpIHsKKyAgICBIaWRQYXJzZXIgaGlkUGFyc2VyOworICAgIGJvb2wgcmV0ID0gdHJ1ZTsKKworICAgIGZvciAoY29uc3QgVGVzdEhpZERlc2NyaXB0b3IgKnAgPSBnRGVzY3JpcHRvckFycmF5OyA7ICsrcCkgeworICAgICAgICBpZiAocC0+ZGF0YSA9PSBudWxscHRyIHx8IHAtPmxlbiA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gcC0+bmFtZSAhPSBudWxscHRyID8gcC0+bmFtZSA6ICJ1bm5hbWVkIjsKKyAgICAgICAgYm9vbCBwYXJzZVJlc3VsdCA9IGhpZFBhcnNlci5wYXJzZShwLT5kYXRhLCBwLT5sZW4pOworCisgICAgICAgIGlmIChwYXJzZVJlc3VsdCkgeworICAgICAgICAgICAgTE9HX1YgPDwgbmFtZSA8PCAiICBmaWx0ZXJlZCB0cmVlOiAiIDw8IExPR19FTkRMOworICAgICAgICAgICAgTE9HX1YgPDwgKihoaWRQYXJzZXIuZ2V0VHJlZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IGZhbHNlOworICAgICAgICAgICAgTE9HX0UgPDwgbmFtZSA8PCAiIHBhcnNpbmcgZXJyb3IhIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitib29sIGRvUGFyc2VBbmRGaWx0ZXIoKSB7CisgICAgSGlkUGFyc2VyIGhpZFBhcnNlcjsKKyAgICBib29sIHJldCA9IHRydWU7CisKKyAgICBmb3IgKGNvbnN0IFRlc3RIaWREZXNjcmlwdG9yICpwID0gZ0Rlc2NyaXB0b3JBcnJheTsgOyArK3ApIHsKKyAgICAgICAgaWYgKHAtPmRhdGEgPT0gbnVsbHB0ciB8fCBwLT5sZW4gPT0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSA9IHAtPm5hbWUgIT0gbnVsbHB0ciA/IHAtPm5hbWUgOiAidW5uYW1lZCI7CisgICAgICAgIGJvb2wgcGFyc2VSZXN1bHQgPSBoaWRQYXJzZXIucGFyc2UocC0+ZGF0YSwgcC0+bGVuKTsKKworICAgICAgICBpZiAocGFyc2VSZXN1bHQpIHsKKyAgICAgICAgICAgIGhpZFBhcnNlci5maWx0ZXJUcmVlKCk7CisgICAgICAgICAgICBMT0dfViA8PCBuYW1lIDw8ICIgIGZpbHRlcmVkIHRyZWU6ICIgPDwgTE9HX0VOREw7CisgICAgICAgICAgICBMT0dfViA8PCAqKGhpZFBhcnNlci5nZXRUcmVlKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gZmFsc2U7CisgICAgICAgICAgICBMT0dfRSA8PCBuYW1lIDw8ICIgcGFyc2luZyBlcnJvciEiIDw8IExPR19FTkRMOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2Jvb2wgZG9EaWdlc3QoKSB7CisgICAgSGlkUGFyc2VyIGhpZFBhcnNlcjsKKyAgICBib29sIHJldCA9IHRydWU7CisKKyAgICAvLyB2YWx1ZSBmcm9tIEhJRCBzZW5zb3IgdXNhZ2UgcGFnZSBzcGVjCisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVuc2lnbmVkIGludD4gaW50ZXJlc3RlZFVzYWdlID0geworICAgICAgICAweDIwMDA3MywgLy8gYWNjZWxlcm9tZXRlciAzZAorICAgICAgICAweDIwMDA3NiwgLy8gZ3lybyAzZAorICAgICAgICAweDIwMDA4MywgLy8gbWFnIDNkCisgICAgICAgIDB4MjAwMDhhLCAvLyBkZXZpY2Ugb3JpZW50YXRpb24gKHJvdGF0aW9uIHZlY3RvcikKKyAgICB9OworCisgICAgZm9yIChjb25zdCBUZXN0SGlkRGVzY3JpcHRvciAqcCA9IGdEZXNjcmlwdG9yQXJyYXk7IDsgKytwKSB7CisgICAgICAgIGlmIChwLT5kYXRhID09IG51bGxwdHIgfHwgcC0+bGVuID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBwLT5uYW1lICE9IG51bGxwdHIgPyBwLT5uYW1lIDogInVubmFtZWQiOworICAgICAgICBib29sIHBhcnNlUmVzdWx0ID0gaGlkUGFyc2VyLnBhcnNlKHAtPmRhdGEsIHAtPmxlbik7CisKKyAgICAgICAgaWYgKCFwYXJzZVJlc3VsdCkgeworICAgICAgICAgICAgTE9HX0UgPDwgbmFtZSA8PCAiIHBhcnNpbmcgZXJyb3IhIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgIHJldCA9IGZhbHNlOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBoaWRQYXJzZXIuZmlsdGVyVHJlZSgpOworICAgICAgICBMT0dfViA8PCBuYW1lIDw8ICIgIGRpZ2VzdDogIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgSGlkUGFyc2VyOjpEaWdlc3RWZWN0b3IgZGlnZXN0VmVjdG9yID0gaGlkUGFyc2VyLmdlbmVyYXRlRGlnZXN0KGludGVyZXN0ZWRVc2FnZSk7CisgICAgICAgIExPR19WIDw8IGRpZ2VzdFZlY3RvcjsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBwcmludFVzYWdlKGNoYXIgKmFyZ3YwKSB7CisgICAgTE9HX1YgPDwgIlVzYWdlOiAiIDw8IGFyZ3YwIDw8ICIgdGVzdF9uYW1lIiA8PCBMT0dfRU5ETDsKKyAgICBMT0dfViA8PCAiICB0ZXN0X25hbWUgY2FuIGJlIHBhcnNlLCBwYXJzZV9maWx0ZXIsIGRpZ2VzdC4iIDw8IExPR19FTkRMOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgICAgaW50IHJldDsKKworICAgIGlmIChhcmdjICE9IDIpIHsKKyAgICAgICAgTE9HX0UgPDwgIkVycm9yOiBuZWVkIHBhcmFtIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgcHJpbnRVc2FnZShhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKHN0cmNtcChhcmd2WzFdLCAicGFyc2UiKSA9PSAwKSB7CisgICAgICAgIHJldCA9IGRvUGFyc2UoKSA/IDAgOiAxOworICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJwYXJzZV9maWx0ZXIiKSA9PSAwKSB7CisgICAgICAgIHJldCA9IGRvUGFyc2VBbmRGaWx0ZXIoKSA/IDAgOiAxOworICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJkaWdlc3QiKSA9PSAwKSB7CisgICAgICAgIHJldCA9IGRvRGlnZXN0KCkgPyAwIDogMTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dfRSA8PCAiRXJyb3I6IHVua25vd24gdGVzdCBuYW1lIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgcHJpbnRVc2FnZShhcmd2WzBdKTsKKyAgICAgICAgcmV0ID0gLUVOT0VOVDsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL3Rlc3QvSGlkUGFyc2VyRXhhbXBsZTIuY3BwIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL3Rlc3QvSGlkUGFyc2VyRXhhbXBsZTIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNTFkZmYKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvdGVzdC9IaWRQYXJzZXJFeGFtcGxlMi5jcHAKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJUZXN0SGlkRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIkhpZExvZy5oIgorI2luY2x1ZGUgIkhpZFBhcnNlci5oIgorI2luY2x1ZGUgIlN0cmVhbUlvVXRpbC5oIgorCit1c2luZyBuYW1lc3BhY2UgSGlkVXRpbDsKKwordm9pZCBwcmludFJhd1ZhbHVlKGNvbnN0IHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+ICZkZXNjcmlwdG9yKSB7CisgICAgTE9HX0QgPDwgIkRlc2NyaXB0b3IgWyIgPDwgZGVzY3JpcHRvci5zaXplKCkgPDwgIl06ICIgPDwgc3RkOjpoZXg7CisgICAgaGV4ZHVtcFRvU3RyZWFtKExPR19ELCBkZXNjcmlwdG9yLmJlZ2luKCksIGRlc2NyaXB0b3IuZW5kKCkpOworfQorCit2b2lkIHByaW50VG9rZW4oY29uc3Qgc3RkOjp2ZWN0b3I8SGlkSXRlbT4gJmhpZEl0ZW1WZWN0b3IpIHsKKyAgICBMT0dfViA8PCAiVG90YWwgIiA8PCBoaWRJdGVtVmVjdG9yLnNpemUoKSA8PCAiIHRva2VucyIgPDwgTE9HX0VOREw7CisgICAgZm9yIChhdXRvICZpIDogaGlkSXRlbVZlY3RvcikgeworICAgICAgICBMT0dfViA8PCBpIDw8IExPR19FTkRMOworICAgIH0KK30KKworaW50IG1haW4oKSB7CisgICAgY29uc3QgVGVzdEhpZERlc2NyaXB0b3IgKnQgPSBmaW5kVGVzdERlc2NyaXB0b3IoImFjY2VsMyIpOworICAgIGNvbnN0ZXhwciB1bnNpZ25lZCBpbnQgQUNDRUxfM0RfVVNBR0UgPSAweDIwMDA3MzsKKworICAgIGFzc2VydCh0ICE9IG51bGxwdHIpOworICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+IGRlc2NyaXB0b3IodC0+ZGF0YSwgdC0+ZGF0YSArIHQtPmxlbik7CisKKyAgICAvLyBwYXJzZSBjYW4gYmUgZG9uZSBpbiBvbmUgc3RlcCB3aXRoIEhpZFBhcnNlcjo6cGFyc2UoY29uc3QgdW5zaWduZWQgY2hhciAqYmVnaW4sIHNpemVfdCBzaXplKTsKKyAgICAvLyBoZXJlIGl0IGlzIGRvbmUgaW4gbXVsdGlwbGUgc3RlcHMgZm9yIGlsbHVzdHJhdGlvbiBwdXJwb3NlCisgICAgSGlkUGFyc2VyIGhpZFBhcnNlcjsKKyAgICAvLyBwcmludCBvdXQgcmF3IHZhbHVlCisgICAgcHJpbnRSYXdWYWx1ZShkZXNjcmlwdG9yKTsKKworICAgIC8vIHRva2VuaXplIGl0CisgICAgc3RkOjp2ZWN0b3I8SGlkSXRlbT4gaGlkSXRlbVZlY3RvciA9IEhpZEl0ZW06OnRva2VuaXplKGRlc2NyaXB0b3IpOworCisgICAgLy8gcHJpbnQgb3V0IHRva2VucworICAgIHByaW50VG9rZW4oaGlkSXRlbVZlY3Rvcik7CisKKyAgICAvLyBwYXJzZSBpdAorICAgIGlmIChoaWRQYXJzZXIucGFyc2UoaGlkSXRlbVZlY3RvcikpIHsKKyAgICAgICAgLy8gbWFraW5nIGEgZGVlcGNvcHkgb2YgdHJlZSAobm90IG5lY2Vzc2FyeSwgYnV0IGZvciBpbGx1c3RyYXRpb24pCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxIaWRUcmVlTm9kZT4gdHJlZSA9IGhpZFBhcnNlci5nZXRUcmVlKCktPmRlZXBDb3B5KCk7CisKKyAgICAgICAgTE9HX1YgPDwgIlRyZWU6ICIgPDwgTE9HX0VOREw7CisgICAgICAgIExPR19WIDw8ICp0cmVlOworICAgICAgICBMT0dfViA8PCBMT0dfRU5ETDsKKworICAgICAgICBoaWRQYXJzZXIuZmlsdGVyVHJlZSgpOworICAgICAgICBMT0dfViA8PCAiRmlsdGVyZWRUcmVlOiAiIDw8IExPR19FTkRMOworICAgICAgICBMT0dfViA8PCAqKGhpZFBhcnNlci5nZXRUcmVlKCkpOworCisgICAgICAgIExPR19WIDw8ICJEaWdlc3RWZWN0b3I6ICIgPDwgTE9HX0VOREw7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1bnNpZ25lZCBpbnQ+IGludGVyZXN0ZWQgPSB7QUNDRUxfM0RfVVNBR0V9OworICAgICAgICBIaWRQYXJzZXI6OkRpZ2VzdFZlY3RvciBkaWdlc3RWZWN0b3IgPSBoaWRQYXJzZXIuZ2VuZXJhdGVEaWdlc3QoaW50ZXJlc3RlZCk7CisgICAgICAgIExPR19WIDw8IGRpZ2VzdFZlY3RvcjsKKworICAgIH0gZWxzZSB7CisgICAgICAgIExPR19WIDw8ICJQYXJzaW5nIEVycm9yIiA8PCBMT0dfRU5ETDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL3Rlc3QvVGVzdEhpZERlc2NyaXB0b3IuY3BwIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFV0aWxzL3Rlc3QvVGVzdEhpZERlc2NyaXB0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNTdkNGYKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvdGVzdC9UZXN0SGlkRGVzY3JpcHRvci5jcHAKQEAgLTAsMCArMSwyNjA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlICJUZXN0SGlkRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIlRlc3RIaWRTZW5zb3JTcGVjLmgiCisjaW5jbHVkZSA8Y3N0cmluZz4KKworLyoqCisgKiBFeGFtcGxlIEhJRCBzZW5zb3IgZGVzY3JpcHRvcnMgaW4gdGhpcyBmaWxlIGlzIGV4dHJhY3RlZCBmcm9tIHB1Ymxpc2hlZCBkb2N1bWVudAorICogIkhJRCBTZW5zb3JzIFVzYWdlIiAoaGlkLXNlbnNvcnMtdXNhZ2UuZG9jeCkuIFRoZXkgYXJlIGFkZGVkIGZvciB0ZXN0aW5nIG9mIEhpZFBhcnNlci4KKyAqCisgKiBJdCBpcyBzbGlnaHRseSBtb2RpZmllZCBpbiBvcmRlciB0byBjb21waWxlLgorICovCituYW1lc3BhY2UgeworLyoqCisgKiBUd28gc2Vuc29ycyBjb2xsZWN0aW9uIHNrZWxldG9uIGV4YW1wbGUuCisgKi8KK2NvbnN0IHVuc2lnbmVkIGNoYXIgY29sMV9yZXBvcnRfZGVzY3JpcHRvcltdID0geworICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKyAgICBISURfVVNBR0VfU0VOU09SX1RZUEVfQ09MTEVDVElPTiwKKyAgICBISURfQ09MTEVDVElPTihBcHBsaWNhdGlvbiksCisKKyAgICBISURfUkVQT1JUX0lEKDEpLAorICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKworICAgIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9NT1RJT05fQUNDRUxFUk9NRVRFUl8zRCwKKyAgICBISURfQ09MTEVDVElPTihQaHlzaWNhbCksCisKKyAgICAvL0ZlYXR1cmUgUmVwb3J0IERlc2NyaXB0b3IgZm9yIFNlbnNvciBSZXBvcnQgSUQgPSAxCisKKyAgICAvL0lucHV0IFJlcG9ydCBEZXNjcmlwdG9yIGZvciBTZW5zb3IgUmVwb3J0IElEID0gMQorCisgICAgSElEX0VORF9DT0xMRUNUSU9OLCAvL2ZvciBSZXBvcnQgSUQgPSAxCisKKyAgICBISURfUkVQT1JUX0lEKDIpLAorICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKyAgICBISURfVVNBR0VfU0VOU09SX1RZUEVfTU9USU9OX0dZUk9NRVRFUl8zRCwKKyAgICBISURfQ09MTEVDVElPTihQaHlzaWNhbCksCisKKyAgICAvL0ZlYXR1cmUgUmVwb3J0IERlc2NyaXB0b3IgZm9yIFNlbnNvciBSZXBvcnQgSUQgPSAyCisKKyAgICAvL0lucHV0IFJlcG9ydCBEZXNjcmlwdG9yIGZvciBTZW5zb3IgUmVwb3J0IElEID0gMgorCisgICAgSElEX0VORF9DT0xMRUNUSU9OLCAvL2ZvciBSZXBvcnQgSUQgPSAyCisKKyAgICAvL01vcmUgc2Vuc29ycyBmb2xsb3cgdXNpbmcgdGhlIHNhbWUgcGF0dGVybgorCisgICAgSElEX0VORF9DT0xMRUNUSU9OIC8vQXBwbGljYXRpb24KK307CisKKworLyoqCisgKiBDb21wb3NpdGUgZGV2aWNlIGRlc2NyaXB0b3IgZXhhbXBsZTogdHdvIHNlbnNvcnMgd2l0aCBhIGtleWJvYXJkIGFuZCBhIG1vdXNlLgorICovCitjb25zdCB1bnNpZ25lZCBjaGFyIGNvbDJfcmVwb3J0X2Rlc2NyaXB0b3JbXSA9IHsKKyAgICAvL2tleWJvYXJkCisgICAgMHgwNVUsIDB4MDFVLCAgICAgICAgIC8vIFVTQUdFIFBBR0UgKEdlbmVyaWMgRGVza3RvcCkKKyAgICAweDA5VSwgMHgwNlUsICAgICAgICAgLy8gVVNBR0UgKEtleWJvYXJkKQorICAgIDB4QTFVLCAweDAxVSwgICAgICAgICAvLyBDT0xMRUNUSU9OIChBcHBsaWNhdGlvbikKKworICAgIDB4ODVVLCAweDAzVSwgICAgICAgICAvLyBSRVBPUlRfSUQgKDEpCisKKyAgICAweDE1VSwgMHgwMFUsICAgICAgICAgLy8gICBMT0dJQ0FMIE1JTklNVU0gKDApCisgICAgMHgyNVUsIDB4MDFVLCAgICAgICAgIC8vICAgTE9HSUNBTCBNQVhJTVVNICgxKQorICAgIDB4NzVVLCAweDAxVSwgICAgICAgICAvLyAgIFJFUE9SVCBTSVpFICgxKQorICAgIDB4OTVVLCAweDA4VSwgICAgICAgICAvLyAgIFJFUE9SVCBDT1VOVCAoOCkKKyAgICAweDA1VSwgMHgwN1UsICAgICAgICAgLy8gICBVU0FHRSBQQUdFIChLZXlib2FyZCkKKyAgICAweDE5VSwgMHhFMFUsICAgICAgICAgLy8gICBVU0FHRSBNSU5JTVVNIChLZXlib2FyZCBMZWZ0Q29udHJvbCkKKyAgICAweDI5VSwgMHhFN1UsICAgICAgICAgLy8gICBVU0FHRSBNQVhJTVVNIChLZXlib2FyZCBSaWdodCBHVUkpCisgICAgMHg4MVUsIDB4MDJVLCAgICAgICAgIC8vICAgSU5QVVQgKFZhcikKKworICAgIDB4NzVVLCAweDA4VSwgICAgICAgICAvLyAgIFJFUE9SVCBTSVpFICg4KQorICAgIDB4OTVVLCAweDBBVSwgICAgICAgICAvLyAgIFJFUE9SVCBDT1VOVCAoMTApCisgICAgMHgxOVUsIDB4MDBVLCAgICAgICAgIC8vICAgVVNBR0UgTUlOSU1VTSAoTm8gZXZlbnQpCisgICAgMHgyOVUsIDB4OTFVLCAgICAgICAgIC8vICAgVVNBR0UgTUFYSU1VTSAoS2V5Ym9hcmQgTEFORzIpCisgICAgMHgyNlUsIDB4RkZVLCAweDAwVSwgIC8vICAgTE9HSUNBTCBNQVhJTVVNICgweEZGKQorICAgIDB4ODFVLCAweDAwVSwgICAgICAgICAvLyAgIElOUFVUIChEYXRhLEFyeSxBYnMpCisKKyAgICAweEMwVSwgICAgICAgICAgICAgICAgLy8gRU5EIENPTExFQ1RJT04sIC8va2V5Ym9hcmQKKworICAgIC8vIFR3byBzZW5zb3IgY29sbGVjdGlvbiBza2VsZXRvbiBleGFtcGxlOgorICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKyAgICBISURfVVNBR0VfU0VOU09SX1RZUEVfQ09MTEVDVElPTiwKKyAgICBISURfQ09MTEVDVElPTihBcHBsaWNhdGlvbiksCisKKyAgICBISURfUkVQT1JUX0lEKDIpLAorICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKworICAgIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9NT1RJT05fQUNDRUxFUk9NRVRFUl8zRCwKKyAgICBISURfQ09MTEVDVElPTihQaHlzaWNhbCksCisKKyAgICAvL0ZlYXR1cmUgUmVwb3J0IERlc2NyaXB0b3IgZm9yIFNlbnNvciBSZXBvcnQgSUQgPSAyCisKKyAgICAvL0lucHV0IFJlcG9ydCBEZXNjcmlwdG9yIGZvciBTZW5zb3IgUmVwb3J0IElEID0gMgorCisgICAgSElEX0VORF9DT0xMRUNUSU9OLCAvL2ZvciBSZXBvcnQgSUQgPSAyCisKKyAgICBISURfUkVQT1JUX0lEKDMpLAorICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKyAgICBISURfVVNBR0VfU0VOU09SX1RZUEVfTU9USU9OX0dZUk9NRVRFUl8zRCwKKyAgICBISURfQ09MTEVDVElPTihQaHlzaWNhbCksCisKKyAgICAvL0ZlYXR1cmUgUmVwb3J0IERlc2NyaXB0b3IgZm9yIFNlbnNvciBSZXBvcnQgSUQgPSAzCisKKyAgICAvL0lucHV0IFJlcG9ydCBEZXNjcmlwdG9yIGZvciBTZW5zb3IgUmVwb3J0IElEID0gMworCisgICAgSElEX0VORF9DT0xMRUNUSU9OLCAvL2ZvciBSZXBvcnQgSUQgPSAzCisKKyAgICAvL01vcmUgc2Vuc29ycyBmb2xsb3cgdXNpbmcgdGhlIHNhbWUgcGF0dGVybgorCisgICAgSElEX0VORF9DT0xMRUNUSU9OLCAvL1NlbnNvciBjb2xsZWN0aW9uCisKKyAgICAvL21vdXNlCisgICAgMHgwNVUsIDB4MDFVLCAgICAgICAgIC8vIFVTQUdFIFBBR0UgKEdlbmVyaWMgRGVza3RvcCkKKyAgICAweDA5VSwgMHgwMlUsICAgICAgICAgLy8gVVNBR0UgKE1vdXNlKQorICAgIDB4QTFVLCAweDAxVSwgICAgICAgICAvLyBDT0xMRUNUSU9OIChBcHBsaWNhdGlvbikKKyAgICAweDg1VSwgMHgwNFUsICAgICAgICAgLy8gUkVQT1JUX0lEICg0KQorCisgICAgLy8gNSBtb3VzZSBidXR0b25zCisgICAgMHgwNVUsIDB4MDlVLCAgICAgICAgIC8vICAgVVNBR0UgUEFHRSAoQnV0dG9uKQorICAgIDB4MTlVLCAweDAxVSwgICAgICAgICAvLyAgIFVTQUdFIE1JTklNVU0gKEJ1dHRvbiAxKQorICAgIDB4MjlVLCAweDA1VSwgICAgICAgICAvLyAgIFVTQUdFIE1BWElNVU0gKEJ1dHRvbiA1KQorICAgIDB4MTVVLCAweDAwVSwgICAgICAgICAvLyAgIExPR0lDQUwgTUlOSU1VTSAoMCkKKyAgICAweDI1VSwgMHgwMVUsICAgICAgICAgLy8gICBMT0dJQ0FMIE1BWElNVU0gKDEpCisgICAgMHg5NVUsIDB4MDVVLCAgICAgICAgIC8vICAgUkVQT1JUIENPVU5UICg1KQorICAgIDB4NzVVLCAweDAxVSwgICAgICAgICAvLyAgIFJFUE9SVCBTSVpFICgxKQorICAgIDB4ODFVLCAweDAyVSwgICAgICAgICAvLyAgIElOUFVUIChEYXRhLFZhcixBYnMpCisKKyAgICAvLyAgMyB1bnVzZWQgYnV0dG9uczoKKyAgICAweDk1VSwgMHgwMVUsICAgICAgICAgLy8gICBSRVBPUlQgQ09VTlQgKDEpCisgICAgMHg3NVUsIDB4MDNVLCAgICAgICAgIC8vICAgUkVQT1JUIFNJWkUgKDMpCisgICAgMHg4MVUsIDB4MDNVLCAgICAgICAgIC8vICAgSU5QVVQgKENuc3QsVmFyLEFicykKKworICAgIC8vIG1vdXNlIChkZWx0YSB4LCBkZWx0YSB5KSBwb3NpdGlvbgorICAgIDB4MTVVLCAweDgxVSwgICAgICAgICAvLyAgIExPR0lDQUwgTUlOSU1VTSAoLTEyNykKKyAgICAweDI1VSwgMHg3ZlUsICAgICAgICAgLy8gICBMT0dJQ0FMIE1BWElNVU0gKCsxMjcpCisgICAgMHg3NVUsIDB4MDhVLCAgICAgICAgIC8vICAgUkVQT1JUIFNJWkUgKDgpCisgICAgMHg5NVUsIDB4MDJVLCAgICAgICAgIC8vICAgUkVQT1JUIENPVU5UICgyKQorICAgIDB4MDVVLCAweDAxVSwgICAgICAgICAvLyAgIFVTQUdFIFBBR0UgKEdlbmVyaWMgRGVza3RvcCkKKyAgICAweDA5VSwgMHgzMFUsICAgICAgICAgLy8gICBVU0FHRShYKQorICAgIDB4MDlVLCAweDMxVSwgICAgICAgICAvLyAgIFVTQUdFIChZKQorICAgIDB4ODFVLCAweDA2VSwgICAgICAgICAvLyAgIElOUFVUIChEYXRhLFZhcixSZWwpCisKKyAgICAweEMwVSwgICAgICAgICAgICAgICAgLy8gRU5EIENPTExFQ1RJT04gLy9tb3VzZQorfTsKKworCisvKioKKyAqIENvbXBvc2l0ZSBkZXZpY2UgZGVzY3JpcHRvciBleGFtcGxlOiBvbmUgc2Vuc29yIHdpdGggYSBrZXlib2FyZCBhbmQgYSBtb3VzZS4KKyAqLworY29uc3QgdW5zaWduZWQgY2hhciBjb2wzX3JlcG9ydF9kZXNjcmlwdG9yW10gPSB7CisgICAgLy9rZXlib2FyZAorICAgIDB4MDVVLCAweDAxVSwgICAgICAgICAvLyBVU0FHRSBQQUdFIChHZW5lcmljIERlc2t0b3ApCisgICAgMHgwOVUsIDB4MDZVLCAgICAgICAgIC8vIFVTQUdFIChLZXlib2FyZCkKKyAgICAweEExVSwgMHgwMVUsICAgICAgICAgLy8gQ09MTEVDVElPTiAoQXBwbGljYXRpb24pCisKKyAgICAweDg1VSwgMHgwM1UsICAgICAgICAgLy8gUkVQT1JUX0lEICgxKQorCisgICAgMHgxNVUsIDB4MDBVLCAgICAgICAgIC8vICAgTE9HSUNBTCBNSU5JTVVNICgwKQorICAgIDB4MjVVLCAweDAxVSwgICAgICAgICAvLyAgIExPR0lDQUwgTUFYSU1VTSAoMSkKKyAgICAweDc1VSwgMHgwMVUsICAgICAgICAgLy8gICBSRVBPUlQgU0laRSAoMSkKKyAgICAweDk1VSwgMHgwOFUsICAgICAgICAgLy8gICBSRVBPUlQgQ09VTlQgKDgpCisgICAgMHgwNVUsIDB4MDdVLCAgICAgICAgIC8vICAgVVNBR0UgUEFHRSAoS2V5Ym9hcmQpCisgICAgMHgxOVUsIDB4RTBVLCAgICAgICAgIC8vICAgVVNBR0UgTUlOSU1VTSAoS2V5Ym9hcmQgTGVmdENvbnRyb2wpCisgICAgMHgyOVUsIDB4RTdVLCAgICAgICAgIC8vICAgVVNBR0UgTUFYSU1VTSAoS2V5Ym9hcmQgUmlnaHQgR1VJKQorICAgIDB4ODFVLCAweDAyVSwgICAgICAgICAvLyAgIElOUFVUIChWYXIpCisKKyAgICAweDc1VSwgMHgwOFUsICAgICAgICAgLy8gICBSRVBPUlQgU0laRSAoOCkKKyAgICAweDk1VSwgMHgwQVUsICAgICAgICAgLy8gICBSRVBPUlQgQ09VTlQgKDEwKQorICAgIDB4MTlVLCAweDAwVSwgICAgICAgICAvLyAgIFVTQUdFIE1JTklNVU0gKE5vIGV2ZW50KQorICAgIDB4MjlVLCAweDkxVSwgICAgICAgICAvLyAgIFVTQUdFIE1BWElNVU0gKEtleWJvYXJkIExBTkcyKQorICAgIDB4MjZVLCAweEZGVSwgMHgwMFUsICAvLyAgIExPR0lDQUwgTUFYSU1VTSAoMHhGRikKKyAgICAweDgxVSwgMHgwMFUsICAgICAgICAgLy8gICBJTlBVVCAoRGF0YSxBcnksQWJzKQorCisgICAgMHhDMFUsICAgICAgICAgICAgICAgIC8vIEVORCBDT0xMRUNUSU9OLCAvL2tleWJvYXJkCisKKyAgICAvLyBPbmUgc2Vuc29yIGNvbGxlY3Rpb24gc2tlbGV0b24gZXhhbXBsZToKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisgICAgSElEX1VTQUdFX1NFTlNPUl9UWVBFX0NPTExFQ1RJT04sCisgICAgSElEX0NPTExFQ1RJT04oQXBwbGljYXRpb24pLAorCisgICAgSElEX1JFUE9SVF9JRCgyKSwKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisKKyAgICBISURfVVNBR0VfU0VOU09SX1RZUEVfTU9USU9OX0dZUk9NRVRFUl8zRCwKKyAgICBISURfQ09MTEVDVElPTihQaHlzaWNhbCksCisKKyAgICAvL0ZlYXR1cmUgUmVwb3J0IERlc2NyaXB0b3IgZm9yIFNlbnNvciBSZXBvcnQgSUQgPSAyCisKKyAgICAvL0lucHV0IFJlcG9ydCBEZXNjcmlwdG9yIGZvciBTZW5zb3IgUmVwb3J0IElEID0gMgorCisgICAgSElEX0VORF9DT0xMRUNUSU9OLCAvL2ZvciBSZXBvcnQgSUQgPSAyCisKKyAgICBISURfRU5EX0NPTExFQ1RJT04sIC8vU2Vuc29yIGNvbGxlY3Rpb24KKworICAgIC8vbW91c2UKKyAgICAweDA1VSwgMHgwMVUsICAgICAgICAgLy8gVVNBR0UgUEFHRSAoR2VuZXJpYyBEZXNrdG9wKQorICAgIDB4MDlVLCAweDAyVSwgICAgICAgICAvLyBVU0FHRSAoTW91c2UpCisgICAgMHhBMVUsIDB4MDFVLCAgICAgICAgIC8vIENPTExFQ1RJT04gKEFwcGxpY2F0aW9uKQorICAgIDB4ODVVLCAweDA0VSwgICAgICAgICAvLyBSRVBPUlRfSUQgKDMpCisKKyAgICAvLyA1IG1vdXNlIGJ1dHRvbnMKKyAgICAweDA1VSwgMHgwOVUsICAgICAgICAgLy8gICBVU0FHRSBQQUdFIChCdXR0b24pCisgICAgMHgxOVUsIDB4MDFVLCAgICAgICAgIC8vICAgVVNBR0UgTUlOSU1VTSAoQnV0dG9uIDEpCisgICAgMHgyOVUsIDB4MDVVLCAgICAgICAgIC8vICAgVVNBR0UgTUFYSU1VTSAoQnV0dG9uIDUpCisgICAgMHgxNVUsIDB4MDBVLCAgICAgICAgIC8vICAgTE9HSUNBTCBNSU5JTVVNICgwKQorICAgIDB4MjVVLCAweDAxVSwgICAgICAgICAvLyAgIExPR0lDQUwgTUFYSU1VTSAoMSkKKyAgICAweDk1VSwgMHgwNVUsICAgICAgICAgLy8gICBSRVBPUlQgQ09VTlQgKDUpCisgICAgMHg3NVUsIDB4MDFVLCAgICAgICAgIC8vICAgUkVQT1JUIFNJWkUgKDEpCisgICAgMHg4MVUsIDB4MDJVLCAgICAgICAgIC8vICAgSU5QVVQgKERhdGEsVmFyLEFicykKKworICAgIC8vICAzIHVudXNlZCBidXR0b25zOgorICAgIDB4OTVVLCAweDAxVSwgICAgICAgICAvLyAgIFJFUE9SVCBDT1VOVCAoMSkKKyAgICAweDc1VSwgMHgwM1UsICAgICAgICAgLy8gICBSRVBPUlQgU0laRSAoMykKKyAgICAweDgxVSwgMHgwM1UsICAgICAgICAgLy8gICBJTlBVVCAoQ25zdCxWYXIsQWJzKQorCisgICAgLy8gbW91c2UgKGRlbHRhIHgsIGRlbHRhIHkpIHBvc2l0aW9uCisgICAgMHgxNVUsIDB4ODFVLCAgICAgICAgIC8vICAgTE9HSUNBTCBNSU5JTVVNICgtMTI3KQorICAgIDB4MjVVLCAweDdmVSwgICAgICAgICAvLyAgIExPR0lDQUwgTUFYSU1VTSAoKzEyNykKKyAgICAweDc1VSwgMHgwOFUsICAgICAgICAgLy8gICBSRVBPUlQgU0laRSAoOCkKKyAgICAweDk1VSwgMHgwMlUsICAgICAgICAgLy8gICBSRVBPUlQgQ09VTlQgKDIpCisgICAgMHgwNVUsIDB4MDFVLCAgICAgICAgIC8vICAgVVNBR0UgUEFHRSAoR2VuZXJpYyBEZXNrdG9wKQorICAgIDB4MDlVLCAweDMwVSwgICAgICAgICAvLyAgIFVTQUdFKFgpCisgICAgMHgwOVUsIDB4MzFVLCAgICAgICAgIC8vICAgVVNBR0UgKFkpCisgICAgMHg4MVUsIDB4MDZVLCAgICAgICAgIC8vICAgSU5QVVQgKERhdGEsVmFyLFJlbCkKKworICAgIDB4QzBVLCAgICAgICAgICAgICAgICAgLy8gICBFTkQgQ09MTEVDVElPTiAvL21vdXNlCit9OworCisKKy8qKgorICogU2ltcGxlIGN1c3RvbSBzZW5zb3IgZXhhbXBsZS4KKyAqLworY29uc3QgdW5zaWduZWQgY2hhciBjdXMxX3JlcG9ydF9kZXNjcmlwdG9yW10gPSB7CisgICAgSElEX1VTQUdFX1BBR0VfU0VOU09SLCAgICAgICAgIC8vIFVTQUdFX1BBR0UgKFNlbnNvcikKKyAgICBISURfVVNBR0VfU0VOU09SX1RZUEVfT1RIRVJfQ1VTVE9NLCAvLyBVU0FHRSAoU2ltcGxlIEN1c3RvbSkKKyAgICBISURfQ09MTEVDVElPTihQaHlzaWNhbCksCisKKyAgICAvL2lucHV0IHJlcG9ydHMgKHRyYW5zbWl0KQorICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzEsCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwgLy8gPSBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9USU9OX1NQRUVEIHZhbHVlCisKKyAgICBISURfRU5EX0NPTExFQ1RJT04KK307CisKKworLyoqCisgKiBNb3JlIGNvbXBsZXggY3VzdG9tIHNlbnNvciBleGFtcGxlLgorICovCitjb25zdCB1bnNpZ25lZCBjaGFyIGN1czJfcmVwb3J0X2Rlc2NyaXB0b3JbXSA9IHsKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsICAgICAgICAgLy8gVVNBR0VfUEFHRSAoU2Vuc29yKQorICAgIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9PVEhFUl9DVVNUT00sIC8vIFVTQUdFIChTaW1wbGUgQ3VzdG9tKQorICAgIEhJRF9DT0xMRUNUSU9OKFBoeXNpY2FsKSwKKworICAgIC8vaW5wdXQgcmVwb3J0cyAodHJhbnNtaXQpCisgICAgSElEX1VTQUdFX1BBR0VfU0VOU09SLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVVNBR0UsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHhGRiksCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLCAvLyA9IEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9NT1RJT05fU1BFRURPTUVURVIKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX0JPT0xFQU5fQVJSQVksCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHhGRiksCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLCAvLyA9IEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9NT1RJT05fU1BFRURPTUVURVIKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzEsCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwgLy8gPSBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9USU9OX1NQRUVEIHZhbHVlCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8yLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksIC8vID0gSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PVElPTl9TUEVFRCB2YWx1ZQorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMywKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLCAvLyA9IEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT1RJT05fU1BFRUQgdmFsdWUKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzQsCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwgLy8gPSBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9USU9OX1NQRUVEIHZhbHVlCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV81LAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksIC8vID0gSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PVElPTl9TUEVFRCB2YWx1ZQorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfNiwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLCAvLyA9IEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT1RJT05fU1BFRUQgdmFsdWUKKworICAgIEhJRF9FTkRfQ09MTEVDVElPTgorfTsKKworCisvKioKKyAqIEN1c3RvbSBzZW5zb3IgZXhhbXBsZSB3aXRoIGZlYXR1cmVzCisgKi8KK2NvbnN0IHVuc2lnbmVkIGNoYXIgY3VzM19yZXBvcnRfZGVzY3JpcHRvcltdID0geworICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwgICAgICAgICAvLyBVU0FHRV9QQUdFIChTZW5zb3IpCisgICAgSElEX1VTQUdFX1NFTlNPUl9UWVBFX09USEVSX0NVU1RPTSwgLy8gVVNBR0UgKFNpbXBsZSBDdXN0b20pCisgICAgSElEX0NPTExFQ1RJT04oUGh5c2ljYWwpLAorCisgICAgLy9mZWF0dXJlIHJlcG9ydHMgKHhtaXQvcmVjZWl2ZSkKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9TRU5TT1JfQ09OTkVDVElPTl9UWVBFLCAgLy8gTkFyeQorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDIpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ09OTkVDVElPTl9UWVBFX1BDX0lOVEVHUkFURURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ09OTkVDVElPTl9UWVBFX1BDX0FUVEFDSEVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NPTk5FQ1RJT05fVFlQRV9QQ19FWFRFUk5BTF9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNSksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfTk9fRVZFTlRTX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9BTExfRVZFTlRTX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9USFJFU0hPTERfRVZFTlRTX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9OT19FVkVOVFNfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfQUxMX0VWRU5UU19XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9USFJFU0hPTERfRVZFTlRTX1dBS0VfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNSksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9VTkRFRklORURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDBfRlVMTF9QT1dFUl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EMV9MT1dfUE9XRVJfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDJfU1RBTkRCWV9XSVRIX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDNfU0xFRVBfV0lUSF9XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0Q0X1BPV0VSX09GRl9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg2KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1VOS05PV05fU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfUkVBRFlfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9UX0FWQUlMQUJMRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT19EQVRBX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0lOSVRJQUxJWklOR19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9BQ0NFU1NfREVOSUVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0VSUk9SX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVF9JTlRFUlZBTCwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfMzIoMHhGRiwweEZGLDB4RkYsMHhGRiksCisgICAgSElEX1JFUE9SVF9TSVpFKDMyKSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDApLAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBKEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT00sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfQ0hBTkdFX1NFTlNJVElWSVRZX0FCUyksCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHhGRiksCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBKEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT00sSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9NQVgpLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTSxISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX01JTiksCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorCisgICAgLy9pbnB1dCByZXBvcnRzICh0cmFuc21pdCkKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg2KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1VOS05PV05fU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfUkVBRFlfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9UX0FWQUlMQUJMRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT19EQVRBX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0lOSVRJQUxJWklOR19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9BQ0NFU1NfREVOSUVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0VSUk9SX1NFTCwKKyAgICBISURfSU5QVVQoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVCwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg1KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1VOS05PV05fU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfU1RBVEVfQ0hBTkdFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9QUk9QRVJUWV9DSEFOR0VEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX0RBVEFfVVBEQVRFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9QT0xMX1JFU1BPTlNFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX0NIQU5HRV9TRU5TSVRJVklUWV9TRUwsCisgICAgSElEX0lOUFVUKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVVNBR0UsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHhGRiksCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLCAvLyA9IEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9NT1RJT05fU1BFRURPTUVURVIKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzEsCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwgLy8gPSBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9USU9OX1NQRUVEIHZhbHVlCisKKyAgICBISURfRU5EX0NPTExFQ1RJT04KK307CisKKworLyoqCisgKiBGdWxsIGN1c3RvbSBzZW5zb3IgZXhhbXBsZSB3aXRoIGZlYXR1cmUuCisgKi8KK2NvbnN0IHVuc2lnbmVkIGNoYXIgY3VzNF9yZXBvcnRfZGVzY3JpcHRvcltdID0geworICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwgICAgICAgICAvLyBVU0FHRV9QQUdFIChTZW5zb3IpCisgICAgSElEX1VTQUdFX1NFTlNPUl9UWVBFX09USEVSX0NVU1RPTSwgLy8gVVNBR0UgKFNpbXBsZSBDdXN0b20pCisgICAgSElEX0NPTExFQ1RJT04oQXBwbGljYXRpb24pLAorCisgICAgLy9mZWF0dXJlIHJlcG9ydHMgKHhtaXQvcmVjZWl2ZSkKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9TRU5TT1JfQ09OTkVDVElPTl9UWVBFLCAgLy8gTkFyeQorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDIpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ09OTkVDVElPTl9UWVBFX1BDX0lOVEVHUkFURURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ09OTkVDVElPTl9UWVBFX1BDX0FUVEFDSEVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NPTk5FQ1RJT05fVFlQRV9QQ19FWFRFUk5BTF9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNSksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfTk9fRVZFTlRTX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9BTExfRVZFTlRTX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9USFJFU0hPTERfRVZFTlRTX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9OT19FVkVOVFNfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfQUxMX0VWRU5UU19XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9USFJFU0hPTERfRVZFTlRTX1dBS0VfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNSksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9VTkRFRklORURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDBfRlVMTF9QT1dFUl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EMV9MT1dfUE9XRVJfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDJfU1RBTkRCWV9XSVRIX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDNfU0xFRVBfV0lUSF9XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0Q0X1BPV0VSX09GRl9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg2KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1VOS05PV05fU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfUkVBRFlfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9UX0FWQUlMQUJMRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT19EQVRBX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0lOSVRJQUxJWklOR19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9BQ0NFU1NfREVOSUVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0VSUk9SX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVF9JTlRFUlZBTCwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfMzIoMHhGRiwweEZGLDB4RkYsMHhGRiksCisgICAgSElEX1JFUE9SVF9TSVpFKDMyKSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDApLAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBKEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT00sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfQ0hBTkdFX1NFTlNJVElWSVRZX0FCUyksCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHhGRiksCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBKEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT00sSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9NQVgpLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTSxISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX01JTiksCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorCisgICAgLy9pbnB1dCByZXBvcnRzICh0cmFuc21pdCkKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg2KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1VOS05PV05fU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfUkVBRFlfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9UX0FWQUlMQUJMRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT19EQVRBX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0lOSVRJQUxJWklOR19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9BQ0NFU1NfREVOSUVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0VSUk9SX1NFTCwKKyAgICBISURfSU5QVVQoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVCwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg1KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1VOS05PV05fU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfU1RBVEVfQ0hBTkdFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9QUk9QRVJUWV9DSEFOR0VEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX0RBVEFfVVBEQVRFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9QT0xMX1JFU1BPTlNFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX0NIQU5HRV9TRU5TSVRJVklUWV9TRUwsCisgICAgSElEX0lOUFVUKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVVNBR0UsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHhGRiksCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fQk9PTEVBTl9BUlJBWSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweEZGKSwKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8xLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8yLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8zLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV80LAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV81LAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV82LAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisKKyNpZiAxIC8vZGVmaW5lIHZlbmRvci1zcGVjaWZpYyAobm9uLXNwZWMpIGN1c3RvbSBkYXRhZmllbGRzCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV83LAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV84LAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV85LAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8xMCwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMTEsCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzEyLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8xMywKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMTQsCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzE1LAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8xNiwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMTcsCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzE4LAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8xOSwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMjAsCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzIxLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8yMiwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMjMsCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzI0LAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8yNSwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMjYsCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzI3LAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8yOCwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorI2VuZGlmCisgICAgSElEX0VORF9DT0xMRUNUSU9OCit9OworCisKKy8qKgorICogSHVtYW4gcHJlc2VuY2Ugc2Vuc29yIGV4YW1wbGUuCisgKi8KK2NvbnN0IHVuc2lnbmVkIGNoYXIgcHJlc19yZXBvcnRfZGVzY3JpcHRvcltdID0geworICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKyAgICBISURfVVNBR0VfU0VOU09SX1RZUEVfQklPTUVUUklDX1BSRVNFTkNFLAorICAgIEhJRF9DT0xMRUNUSU9OKFBoeXNpY2FsKSwKKworICAgIC8vZmVhdHVyZSByZXBvcnRzICh4bWl0L3JlY2VpdmUpCisgICAgSElEX1VTQUdFX1BBR0VfU0VOU09SLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfU0VOU09SX0NPTk5FQ1RJT05fVFlQRSwgIC8vIE5BcnkKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCgyKSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NPTk5FQ1RJT05fVFlQRV9QQ19JTlRFR1JBVEVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NPTk5FQ1RJT05fVFlQRV9QQ19BVFRBQ0hFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfRVhURVJOQUxfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDUpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX05PX0VWRU5UU19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfQUxMX0VWRU5UU19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfVEhSRVNIT0xEX0VWRU5UU19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfTk9fRVZFTlRTX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX0FMTF9FVkVOVFNfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfVEhSRVNIT0xEX0VWRU5UU19XQUtFX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDUpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfVU5ERUZJTkVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QwX0ZVTExfUE9XRVJfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDFfTE9XX1BPV0VSX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QyX1NUQU5EQllfV0lUSF9XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QzX1NMRUVQX1dJVEhfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9ENF9QT1dFUl9PRkZfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNiksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9VTktOT1dOX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1JFQURZX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PVF9BVkFJTEFCTEVfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9fREFUQV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9JTklUSUFMSVpJTkdfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfQUNDRVNTX0RFTklFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9FUlJPUl9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRfSU5URVJWQUwsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzMyKDB4RkYsMHhGRiwweEZGLDB4RkYpLAorICAgIEhJRF9SRVBPUlRfU0laRSgzMiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgwKSwKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorCisgICAgLy9pbnB1dCByZXBvcnRzICh0cmFuc21pdCkKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg2KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1VOS05PV05fU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfUkVBRFlfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9UX0FWQUlMQUJMRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT19EQVRBX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0lOSVRJQUxJWklOR19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9BQ0NFU1NfREVOSUVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0VSUk9SX1NFTCwKKyAgICBISURfSU5QVVQoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVCwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg1KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1VOS05PV05fU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfU1RBVEVfQ0hBTkdFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9QUk9QRVJUWV9DSEFOR0VEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX0RBVEFfVVBEQVRFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9QT0xMX1JFU1BPTlNFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX0NIQU5HRV9TRU5TSVRJVklUWV9TRUwsCisgICAgSElEX0lOUFVUKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9CSU9NRVRSSUNfSFVNQU5fUFJFU0VOQ0UsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksIC8vIEZhbHNlCisgICAgSElEX0xPR0lDQUxfTUFYXzgoMSksIC8vIFRydWUKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKworICAgIEhJRF9FTkRfQ09MTEVDVElPTgorfTsKKworCisvKioKKyAqIFByb3hpbWl0eSBzZW5zb3IgZXhhbXBsZS4KKyAqLworY29uc3QgdW5zaWduZWQgY2hhciBwcm94X3JlcG9ydF9kZXNjcmlwdG9yW10gPSB7CisgICAgSElEX1VTQUdFX1BBR0VfU0VOU09SLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9CSU9NRVRSSUNfUFJPWElNSVRZLAorICAgIEhJRF9DT0xMRUNUSU9OKFBoeXNpY2FsKSwKKworICAgIC8vZmVhdHVyZSByZXBvcnRzICh4bWl0L3JlY2VpdmUpCisgICAgSElEX1VTQUdFX1BBR0VfU0VOU09SLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfU0VOU09SX0NPTk5FQ1RJT05fVFlQRSwgIC8vIE5BcnkKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCgyKSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NPTk5FQ1RJT05fVFlQRV9QQ19JTlRFR1JBVEVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NPTk5FQ1RJT05fVFlQRV9QQ19BVFRBQ0hFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfRVhURVJOQUxfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDUpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX05PX0VWRU5UU19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfQUxMX0VWRU5UU19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfVEhSRVNIT0xEX0VWRU5UU19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfTk9fRVZFTlRTX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX0FMTF9FVkVOVFNfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfVEhSRVNIT0xEX0VWRU5UU19XQUtFX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDUpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfVU5ERUZJTkVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QwX0ZVTExfUE9XRVJfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDFfTE9XX1BPV0VSX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QyX1NUQU5EQllfV0lUSF9XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QzX1NMRUVQX1dJVEhfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9ENF9QT1dFUl9PRkZfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNiksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9VTktOT1dOX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1JFQURZX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PVF9BVkFJTEFCTEVfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9fREFUQV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9JTklUSUFMSVpJTkdfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfQUNDRVNTX0RFTklFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9FUlJPUl9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRfSU5URVJWQUwsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzMyKDB4RkYsMHhGRiwweEZGLDB4RkYpLAorICAgIEhJRF9SRVBPUlRfU0laRSgzMiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgwKSwKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQShISURfVVNBR0VfU0VOU09SX0RBVEFfQklPTUVUUklDX0hVTUFOX1BST1hJTUlUWV9SQU5HRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9DSEFOR0VfU0VOU0lUSVZJVFlfQUJTKSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweEZGKSwKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRCksIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCAibWV0ZXIiIHRvICJjZW50aW1ldGVyIgorICAgIC8vIHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCBkZWNpbWFsIHBvaW50CisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX0JJT01FVFJJQ19IVU1BTl9QUk9YSU1JVFlfUkFOR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfTUFYKSwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEQpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgIm1ldGVyIiB0byAiY2VudGltZXRlciIKKyAgICAvLyB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBKEhJRF9VU0FHRV9TRU5TT1JfREFUQV9CSU9NRVRSSUNfSFVNQU5fUFJPWElNSVRZX1JBTkdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX01JTiksCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBEKSwgLy8gc2NhbGUgZGVmYXVsdCB1bml0ICJtZXRlciIgdG8gImNlbnRpbWV0ZXIiCisgICAgLy8gdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IGRlY2ltYWwgcG9pbnQKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorCisgICAgLy9pbnB1dCByZXBvcnRzICh0cmFuc21pdCkKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg2KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1VOS05PV05fU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfUkVBRFlfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9UX0FWQUlMQUJMRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT19EQVRBX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0lOSVRJQUxJWklOR19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9BQ0NFU1NfREVOSUVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0VSUk9SX1NFTCwKKyAgICBISURfSU5QVVQoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVCwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg1KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1VOS05PV05fU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfU1RBVEVfQ0hBTkdFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9QUk9QRVJUWV9DSEFOR0VEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX0RBVEFfVVBEQVRFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9QT0xMX1JFU1BPTlNFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX0NIQU5HRV9TRU5TSVRJVklUWV9TRUwsCisgICAgSElEX0lOUFVUKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9CSU9NRVRSSUNfSFVNQU5fUFJPWElNSVRZX09VVF9PRl9SQU5HRSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwgLy8gRmFsc2UKKyAgICBISURfTE9HSUNBTF9NQVhfOCgxKSwgLy8gVHJ1ZQorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9CSU9NRVRSSUNfSFVNQU5fUFJPWElNSVRZX1JBTkdFLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRCksICAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgIm1ldGVyIiB0byAiY2VudGltZXRlciIKKyAgICAvLyB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorCisgICAgSElEX0VORF9DT0xMRUNUSU9OCit9OworCisKKy8qKgorICogQmFyb21ldGVyIHNlbnNvciBleGFtcGxlLgorICovCitjb25zdCB1bnNpZ25lZCBjaGFyIGJhcl9yZXBvcnRfZGVzY3JpcHRvcltdID0geworICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKyAgICBISURfVVNBR0VfU0VOU09SX1RZUEVfRU5WSVJPTk1FTlRBTF9BVE1PU1BIRVJJQ19QUkVTU1VSRSwKKyAgICBISURfQ09MTEVDVElPTihQaHlzaWNhbCksCisKKyAgICAvL2ZlYXR1cmUgcmVwb3J0cyAoeG1pdC9yZWNlaXZlKQorICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1NFTlNPUl9DT05ORUNUSU9OX1RZUEUsICAvLyBOQXJ5CisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoMiksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfSU5URUdSQVRFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfQVRUQUNIRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ09OTkVDVElPTl9UWVBFX1BDX0VYVEVSTkFMX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg1KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9OT19FVkVOVFNfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX0FMTF9FVkVOVFNfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX1RIUkVTSE9MRF9FVkVOVFNfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX05PX0VWRU5UU19XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9BTExfRVZFTlRTX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX1RIUkVTSE9MRF9FVkVOVFNfV0FLRV9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg1KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX1VOREVGSU5FRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EMF9GVUxMX1BPV0VSX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QxX0xPV19QT1dFUl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EMl9TVEFOREJZX1dJVEhfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EM19TTEVFUF9XSVRIX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDRfUE9XRVJfT0ZGX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDYpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfVU5LTk9XTl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9SRUFEWV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT1RfQVZBSUxBQkxFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PX0RBVEFfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfSU5JVElBTElaSU5HX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0FDQ0VTU19ERU5JRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfRVJST1JfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUX0lOVEVSVkFMLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF8zMigweEZGLDB4RkYsMHhGRiwweEZGKSwKKyAgICBISURfUkVQT1JUX1NJWkUoMzIpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMCksCisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX0VOVklST05NRU5UQUxfQVRNT1NQSEVSSUNfUFJFU1NVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfQ0hBTkdFX1NFTlNJVElWSVRZX0FCUyksCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHhGRiksCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgIkJhciIgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX0VOVklST05NRU5UQUxfQVRNT1NQSEVSSUNfUFJFU1NVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfTUFYKSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweEZGKSwKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCAiQmFyIiB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQShISURfVVNBR0VfU0VOU09SX0RBVEFfRU5WSVJPTk1FTlRBTF9BVE1PU1BIRVJJQ19QUkVTU1VSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9NSU4pLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4RkYpLAorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgZGVmYXVsdCB1bml0ICJCYXIiIHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisKKyAgICAvL2lucHV0IHJlcG9ydHMgKHRyYW5zbWl0KQorICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDYpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfVU5LTk9XTl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9SRUFEWV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT1RfQVZBSUxBQkxFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PX0RBVEFfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfSU5JVElBTElaSU5HX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0FDQ0VTU19ERU5JRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfRVJST1JfU0VMLAorICAgIEhJRF9JTlBVVChEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5ULAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDUpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfVU5LTk9XTl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9TVEFURV9DSEFOR0VEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1BST1BFUlRZX0NIQU5HRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfREFUQV9VUERBVEVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1BPTExfUkVTUE9OU0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfQ0hBTkdFX1NFTlNJVElWSVRZX1NFTCwKKyAgICBISURfSU5QVVQoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0VOVklST05NRU5UQUxfQVRNT1NQSEVSSUNfUFJFU1NVUkUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHhGRiksCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgIkJhciIgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisKKyAgICBISURfRU5EX0NPTExFQ1RJT04KK307CisKKworLyoqCisgKiBIdW1pZGl0eSBzZW5zb3IgZXhhbXBsZS4KKyAqLworY29uc3QgdW5zaWduZWQgY2hhciBodW1pX3JlcG9ydF9kZXNjcmlwdG9yW10gPSB7CisgICAgSElEX1VTQUdFX1BBR0VfU0VOU09SLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9FTlZJUk9OTUVOVEFMX0hVTUlESVRZLAorICAgIEhJRF9DT0xMRUNUSU9OKFBoeXNpY2FsKSwKKworICAgIC8vZmVhdHVyZSByZXBvcnRzICh4bWl0L3JlY2VpdmUpCisgICAgSElEX1VTQUdFX1BBR0VfU0VOU09SLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfU0VOU09SX0NPTk5FQ1RJT05fVFlQRSwgIC8vIE5BcnkKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCgyKSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NPTk5FQ1RJT05fVFlQRV9QQ19JTlRFR1JBVEVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NPTk5FQ1RJT05fVFlQRV9QQ19BVFRBQ0hFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfRVhURVJOQUxfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDUpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX05PX0VWRU5UU19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfQUxMX0VWRU5UU19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfVEhSRVNIT0xEX0VWRU5UU19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfTk9fRVZFTlRTX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX0FMTF9FVkVOVFNfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfVEhSRVNIT0xEX0VWRU5UU19XQUtFX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDUpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfVU5ERUZJTkVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QwX0ZVTExfUE9XRVJfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDFfTE9XX1BPV0VSX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QyX1NUQU5EQllfV0lUSF9XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QzX1NMRUVQX1dJVEhfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9ENF9QT1dFUl9PRkZfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNiksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9VTktOT1dOX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1JFQURZX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PVF9BVkFJTEFCTEVfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9fREFUQV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9JTklUSUFMSVpJTkdfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfQUNDRVNTX0RFTklFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9FUlJPUl9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRfSU5URVJWQUwsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzMyKDB4RkYsMHhGRiwweEZGLDB4RkYpLAorICAgIEhJRF9SRVBPUlRfU0laRSgzMiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgwKSwKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQShISURfVVNBR0VfU0VOU09SX0RBVEFfRU5WSVJPTk1FTlRBTF9SRUxBVElWRV9IVU1JRElUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9DSEFOR0VfU0VOU0lUSVZJVFlfQUJTKSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHgxMCwweDI3KSwgLy8gMTAwMDAgPSAwLjAwIHRvIDEwMC4wMCBwZXJjZW50IHdpdGggMiBkaWdpdHMgcGFzdCBkZWNpbWFsIHBvaW50CisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX0VOVklST05NRU5UQUxfUkVMQVRJVkVfSFVNSURJVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfTUFYKSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHgxMCwweDI3KSwgLy8gMTAwMDAgPSAwLjAwIHRvIDEwMC4wMCBwZXJjZW50IHdpdGggMiBkaWdpdHMgcGFzdCBkZWNpbWFsIHBvaW50CisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX0VOVklST05NRU5UQUxfUkVMQVRJVkVfSFVNSURJVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfTUlOKSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHgxMCwweDI3KSwgLy8gMTAwMDAgPSAwLjAwIHRvIDEwMC4wMCBwZXJjZW50IHdpdGggMiBkaWdpdHMgcGFzdCBkZWNpbWFsIHBvaW50CisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKworICAgIC8vaW5wdXQgcmVwb3J0cyAodHJhbnNtaXQpCisgICAgSElEX1VTQUdFX1BBR0VfU0VOU09SLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNiksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9VTktOT1dOX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1JFQURZX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PVF9BVkFJTEFCTEVfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9fREFUQV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9JTklUSUFMSVpJTkdfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfQUNDRVNTX0RFTklFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9FUlJPUl9TRUwsCisgICAgSElEX0lOUFVUKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlQsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNSksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9VTktOT1dOX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1NUQVRFX0NIQU5HRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfUFJPUEVSVFlfQ0hBTkdFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9EQVRBX1VQREFURURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfUE9MTF9SRVNQT05TRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9DSEFOR0VfU0VOU0lUSVZJVFlfU0VMLAorICAgIEhJRF9JTlBVVChEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfRU5WSVJPTk1FTlRBTF9SRUxBVElWRV9IVU1JRElUWSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHgxMCwweDI3KSwgLy8gMTAwMDAgPSAwLjAwIHRvIDEwMC4wMCBwZXJjZW50IHdpdGggMiBkaWdpdHMgcGFzdCBkZWNpbWFsIHBvaW50CisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgInBlcmNlbnQiCisgICAgLy8gdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisKKyAgICBISURfRU5EX0NPTExFQ1RJT04KK307CisKKworLyoqCisgKiBUZW1wZXJhdHVyZSBzZW5zb3IgZXhhbXBsZS4KKyAqLworY29uc3QgdW5zaWduZWQgY2hhciB0ZW1wX3JlcG9ydF9kZXNjcmlwdG9yW10gPSB7CisgICAgSElEX1VTQUdFX1BBR0VfU0VOU09SLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9FTlZJUk9OTUVOVEFMX1RFTVBFUkFUVVJFLAorICAgIEhJRF9DT0xMRUNUSU9OKFBoeXNpY2FsKSwKKworICAgIC8vZmVhdHVyZSByZXBvcnRzICh4bWl0L3JlY2VpdmUpCisgICAgSElEX1VTQUdFX1BBR0VfU0VOU09SLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfU0VOU09SX0NPTk5FQ1RJT05fVFlQRSwgIC8vIE5BcnkKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCgyKSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NPTk5FQ1RJT05fVFlQRV9QQ19JTlRFR1JBVEVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NPTk5FQ1RJT05fVFlQRV9QQ19BVFRBQ0hFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfRVhURVJOQUxfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDUpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX05PX0VWRU5UU19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfQUxMX0VWRU5UU19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfVEhSRVNIT0xEX0VWRU5UU19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfTk9fRVZFTlRTX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX0FMTF9FVkVOVFNfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfVEhSRVNIT0xEX0VWRU5UU19XQUtFX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDUpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfVU5ERUZJTkVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QwX0ZVTExfUE9XRVJfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDFfTE9XX1BPV0VSX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QyX1NUQU5EQllfV0lUSF9XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QzX1NMRUVQX1dJVEhfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9ENF9QT1dFUl9PRkZfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNiksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9VTktOT1dOX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1JFQURZX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PVF9BVkFJTEFCTEVfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9fREFUQV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9JTklUSUFMSVpJTkdfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfQUNDRVNTX0RFTklFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9FUlJPUl9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRfSU5URVJWQUwsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzMyKDB4RkYsMHhGRiwweEZGLDB4RkYpLAorICAgIEhJRF9SRVBPUlRfU0laRSgzMiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgwKSwKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQShISURfVVNBR0VfU0VOU09SX0RBVEFfRU5WSVJPTk1FTlRBTF9URU1QRVJBVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9DSEFOR0VfU0VOU0lUSVZJVFlfQUJTKSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweEZGKSwKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCAiQ2Vsc2l1cyIKKyAgICAvLyB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQShISURfVVNBR0VfU0VOU09SX0RBVEFfRU5WSVJPTk1FTlRBTF9URU1QRVJBVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9NQVgpLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCAiQ2Vsc2l1cyIKKyAgICAvLyB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQShISURfVVNBR0VfU0VOU09SX0RBVEFfRU5WSVJPTk1FTlRBTF9URU1QRVJBVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9NSU4pLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCAiQ2Vsc2l1cyIKKyAgICAvLyB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorCisgICAgLy9pbnB1dCByZXBvcnRzICh0cmFuc21pdCkKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg2KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1VOS05PV05fU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfUkVBRFlfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9UX0FWQUlMQUJMRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT19EQVRBX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0lOSVRJQUxJWklOR19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9BQ0NFU1NfREVOSUVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0VSUk9SX1NFTCwKKyAgICBISURfSU5QVVQoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVCwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCgxNiksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9VTktOT1dOX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1NUQVRFX0NIQU5HRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfUFJPUEVSVFlfQ0hBTkdFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9EQVRBX1VQREFURURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfUE9MTF9SRVNQT05TRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9DSEFOR0VfU0VOU0lUSVZJVFlfU0VMLAorICAgIEhJRF9JTlBVVChEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfRU5WSVJPTk1FTlRBTF9URU1QRVJBVFVSRSwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgIkNlbHNpdXMiCisgICAgLy8gdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IHRoZSBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisKKyAgICBISURfRU5EX0NPTExFQ1RJT04KK307CisKKworLyoqCisgKiBBbWJpZW50IGxpZ2h0IHNlbnNvciBleGFtcGxlLgorICovCitjb25zdCB1bnNpZ25lZCBjaGFyIGFsc19yZXBvcnRfZGVzY3JpcHRvcltdID0geworICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwgICAgICAgICAvLyBVU0FHRV9QQUdFIChTZW5zb3IpCisgICAgSElEX1VTQUdFX1NFTlNPUl9UWVBFX0xJR0hUX0FNQklFTlRMSUdIVCwgLy8gVVNBR0UgKEFtYmllbnRMaWdodCkKKyAgICBISURfQ09MTEVDVElPTihQaHlzaWNhbCksCisKKyAgICAvL2ZlYXR1cmUgcmVwb3J0cyAoeG1pdC9yZWNlaXZlKQorICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1NFTlNPUl9DT05ORUNUSU9OX1RZUEUsICAvLyBOQXJ5CisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoMiksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfSU5URUdSQVRFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfQVRUQUNIRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ09OTkVDVElPTl9UWVBFX1BDX0VYVEVSTkFMX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg1KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9OT19FVkVOVFNfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX0FMTF9FVkVOVFNfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX1RIUkVTSE9MRF9FVkVOVFNfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX05PX0VWRU5UU19XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9BTExfRVZFTlRTX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX1RIUkVTSE9MRF9FVkVOVFNfV0FLRV9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg1KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX1VOREVGSU5FRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EMF9GVUxMX1BPV0VSX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QxX0xPV19QT1dFUl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EMl9TVEFOREJZX1dJVEhfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EM19TTEVFUF9XSVRIX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDRfUE9XRVJfT0ZGX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDYpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfVU5LTk9XTl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9SRUFEWV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT1RfQVZBSUxBQkxFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PX0RBVEFfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfSU5JVElBTElaSU5HX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0FDQ0VTU19ERU5JRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfRVJST1JfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUX0lOVEVSVkFMLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF8zMigweEZGLDB4RkYsMHhGRiwweEZGKSwKKyAgICBISURfUkVQT1JUX1NJWkUoMzIpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMCksCisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xJR0hUX0lMTFVNSU5BTkNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX0NIQU5HRV9TRU5TSVRJVklUWV9SRUxfUENUKSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHgxMCwweDI3KSwgLy8gMTAwMDAgPSAwLjAwIHRvIDEwMC4wMCBwZXJjZW50IHdpdGggMiBkaWdpdHMgcGFzdCBkZWNpbWFsIHBvaW50CisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAgLy8gc2NhbGUgZGVmYXVsdCB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCBkZWNpbWFsIHBvaW50CisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xJR0hUX0lMTFVNSU5BTkNFLEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfTUFYKSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweEZGKSwKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRiksIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCB0byBwcm92aWRlIDEgZGlnaXQgcGFzdCBkZWNpbWFsIHBvaW50CisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xJR0hUX0lMTFVNSU5BTkNFLEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfTUlOKSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweEZGKSwKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRiksIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCB0byBwcm92aWRlIDEgZGlnaXQgcGFzdCBkZWNpbWFsIHBvaW50CisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKworICAgIC8vYWRkIHRoaXMgZGVmaW5pdGlvbiBpZiByZXF1aXJlZCBieSB0aGUgc3BlY2lmaWMgYXBwbGljYXRpb24KKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFU1BPTlNFX0NVUlZFLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMTApLCAvL2FzIHJlcXVpcmVkIGZvciBuIHBhaXIgb2YgdmFsdWVzCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwKSwgLy8gc2NhbGUgZGVmYXVsdCB1bml0IHRvIHByb3ZpZGUgMCBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBwb2ludAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisKKyAgICAvL2lucHV0IHJlcG9ydHMgKHRyYW5zbWl0KQorICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDYpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfVU5LTk9XTl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9SRUFEWV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT1RfQVZBSUxBQkxFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PX0RBVEFfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfSU5JVElBTElaSU5HX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0FDQ0VTU19ERU5JRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfRVJST1JfU0VMLAorICAgIEhJRF9JTlBVVChEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5ULAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDUpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfVU5LTk9XTl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9TVEFURV9DSEFOR0VEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1BST1BFUlRZX0NIQU5HRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfREFUQV9VUERBVEVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1BPTExfUkVTUE9OU0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfQ0hBTkdFX1NFTlNJVElWSVRZX1NFTCwKKyAgICBISURfSU5QVVQoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xJR0hUX0lMTFVNSU5BTkNFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4RkYpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEYpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgdG8gcHJvdmlkZSAxIGRpZ2l0IHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfTElHSFRfQ09MT1JfVEVNUEVSQVRVUkUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHhGRiksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMCksCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MSUdIVF9DSFJPTUFUSUNJVFlfWCwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweEZGKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBDKSwgLy8gc2NhbGUgZGVmYXVsdCB1bml0IHRvIHByb3ZpZGUgNCBkaWdpdHMgcGFzdCBkZWNpbWFsIHBvaW50CisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MSUdIVF9DSFJPTUFUSUNJVFlfWSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweEZGKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBDKSwgLy8gc2NhbGUgZGVmYXVsdCB1bml0IHRvIHByb3ZpZGUgNCBkaWdpdHMgcGFzdCBkZWNpbWFsIHBvaW50CisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorCisgICAgSElEX0VORF9DT0xMRUNUSU9OCit9OworCisKKy8qKgorICogM0QgYWNjZWxlcm9tZXRlciBzZW5zb3IgZXhhbXBsZS4KKyAqLworY29uc3QgdW5zaWduZWQgY2hhciBhY2NlbDNfcmVwb3J0X2Rlc2NyaXB0b3JbXSA9IHsKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisgICAgSElEX1VTQUdFX1NFTlNPUl9UWVBFX01PVElPTl9BQ0NFTEVST01FVEVSXzNELAorICAgIEhJRF9DT0xMRUNUSU9OKFBoeXNpY2FsKSwKKworICAgIC8vZmVhdHVyZSByZXBvcnRzICh4bWl0L3JlY2VpdmUpCisgICAgSElEX1VTQUdFX1BBR0VfU0VOU09SLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfU0VOU09SX0NPTk5FQ1RJT05fVFlQRSwgIC8vIE5BcnkKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCgyKSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NPTk5FQ1RJT05fVFlQRV9QQ19JTlRFR1JBVEVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NPTk5FQ1RJT05fVFlQRV9QQ19BVFRBQ0hFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfRVhURVJOQUxfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDUpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX05PX0VWRU5UU19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfQUxMX0VWRU5UU19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfVEhSRVNIT0xEX0VWRU5UU19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfTk9fRVZFTlRTX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX0FMTF9FVkVOVFNfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfVEhSRVNIT0xEX0VWRU5UU19XQUtFX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDUpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfVU5ERUZJTkVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QwX0ZVTExfUE9XRVJfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDFfTE9XX1BPV0VSX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QyX1NUQU5EQllfV0lUSF9XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QzX1NMRUVQX1dJVEhfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9ENF9QT1dFUl9PRkZfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNiksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9VTktOT1dOX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1JFQURZX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PVF9BVkFJTEFCTEVfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9fREFUQV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9JTklUSUFMSVpJTkdfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfQUNDRVNTX0RFTklFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9FUlJPUl9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRfSU5URVJWQUwsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzMyKDB4RkYsMHhGRiwweEZGLDB4RkYpLAorICAgIEhJRF9SRVBPUlRfU0laRSgzMiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgwKSwKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBKEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT1RJT05fQUNDRUxFUkFUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX0NIQU5HRV9TRU5TSVRJVklUWV9BQlMpLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4RkYpLAorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCBHcyB0byBjZW50aS1HcworICAgIC8vIHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCBHcyBkZWNpbWFsIHBvaW50CisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKworICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQShISURfVVNBR0VfU0VOU09SX0RBVEFfTU9USU9OX0FDQ0VMRVJBVElPTixISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX01BWCksCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCBHcyB0byBjZW50aS1HcworICAgIC8vIHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCBHcyBkZWNpbWFsIHBvaW50CisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKworICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQShISURfVVNBR0VfU0VOU09SX0RBVEFfTU9USU9OX0FDQ0VMRVJBVElPTixISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX01JTiksCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCBHcyB0byBjZW50aS1HcworICAgIC8vIHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCBHcyBkZWNpbWFsIHBvaW50CisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKworICAgIC8vaW5wdXQgcmVwb3J0cyAodHJhbnNtaXQpCisgICAgSElEX1VTQUdFX1BBR0VfU0VOU09SLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNiksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9VTktOT1dOX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1JFQURZX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PVF9BVkFJTEFCTEVfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9fREFUQV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9JTklUSUFMSVpJTkdfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfQUNDRVNTX0RFTklFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9FUlJPUl9TRUwsCisgICAgSElEX0lOUFVUKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlQsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNSksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9VTktOT1dOX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1NUQVRFX0NIQU5HRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfUFJPUEVSVFlfQ0hBTkdFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9EQVRBX1VQREFURURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfUE9MTF9SRVNQT05TRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9DSEFOR0VfU0VOU0lUSVZJVFlfU0VMLAorICAgIEhJRF9JTlBVVChEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9USU9OX0FDQ0VMRVJBVElPTl9YX0FYSVMsCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCBHcyB0byBjZW50aS1HcworICAgIC8vIHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCBHcyBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PVElPTl9BQ0NFTEVSQVRJT05fWV9BWElTLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksICAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgR3MgdG8gY2VudGktR3MKKyAgICAvLyB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgR3MgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT1RJT05fQUNDRUxFUkFUSU9OX1pfQVhJUywKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAgLy8gc2NhbGUgZGVmYXVsdCB1bml0IEdzIHRvIGNlbnRpLUdzCisgICAgLy8gdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IEdzIGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKworICAgIC8vaW5jbHVkZSB0aGUgZm9sbG93aW5nIGRhdGFmaWVsZCBpZiByZXF1aXJlZCB0byBzdXBwb3J0IHRoZSCTc2hha2WUIGV2ZW50CisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PVElPTl9TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwgLy8gRmFsc2UgPSBTdGlsbAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDEpLCAvLyBUcnVlID0gSW4gTW90aW9uCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisKKyAgICBISURfRU5EX0NPTExFQ1RJT04KK307CisKKworLyoqCisgKiAzRCBneXJvc2NvcGUgc2Vuc29yIGV4YW1wbGUuCisgKi8KK2NvbnN0IHVuc2lnbmVkIGNoYXIgZ3lybzNfcmVwb3J0X2Rlc2NyaXB0b3JbXSA9IHsKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisgICAgSElEX1VTQUdFX1NFTlNPUl9UWVBFX01PVElPTl9HWVJPTUVURVJfM0QsCisgICAgSElEX0NPTExFQ1RJT04oUGh5c2ljYWwpLAorCisgICAgLy9mZWF0dXJlIHJlcG9ydHMgKHhtaXQvcmVjZWl2ZSkKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9TRU5TT1JfQ09OTkVDVElPTl9UWVBFLCAgLy8gTkFyeQorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDIpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ09OTkVDVElPTl9UWVBFX1BDX0lOVEVHUkFURURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ09OTkVDVElPTl9UWVBFX1BDX0FUVEFDSEVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NPTk5FQ1RJT05fVFlQRV9QQ19FWFRFUk5BTF9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNSksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfTk9fRVZFTlRTX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9BTExfRVZFTlRTX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9USFJFU0hPTERfRVZFTlRTX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9OT19FVkVOVFNfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfQUxMX0VWRU5UU19XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9USFJFU0hPTERfRVZFTlRTX1dBS0VfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNSksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9VTkRFRklORURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDBfRlVMTF9QT1dFUl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EMV9MT1dfUE9XRVJfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDJfU1RBTkRCWV9XSVRIX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDNfU0xFRVBfV0lUSF9XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0Q0X1BPV0VSX09GRl9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg2KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1VOS05PV05fU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfUkVBRFlfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9UX0FWQUlMQUJMRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT19EQVRBX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0lOSVRJQUxJWklOR19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9BQ0NFU1NfREVOSUVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0VSUk9SX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVF9JTlRFUlZBTCwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfMzIoMHhGRiwweEZGLDB4RkYsMHhGRiksCisgICAgSElEX1JFUE9SVF9TSVpFKDMyKSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDApLAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBKEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT1RJT05fQU5HVUxBUl9WRUxPQ0lUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9DSEFOR0VfU0VOU0lUSVZJVFlfQUJTKSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweEZGKSwKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBKEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT1RJT05fQU5HVUxBUl9WRUxPQ0lUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9NQVgpLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBKEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT1RJT05fQU5HVUxBUl9WRUxPQ0lUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9NSU4pLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisKKyAgICAvL2lucHV0IHJlcG9ydHMgKHRyYW5zbWl0KQorICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDYpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfVU5LTk9XTl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9SRUFEWV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT1RfQVZBSUxBQkxFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PX0RBVEFfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfSU5JVElBTElaSU5HX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0FDQ0VTU19ERU5JRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfRVJST1JfU0VMLAorICAgIEhJRF9JTlBVVChEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5ULAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDUpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfVU5LTk9XTl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9TVEFURV9DSEFOR0VEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1BST1BFUlRZX0NIQU5HRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfREFUQV9VUERBVEVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1BPTExfUkVTUE9OU0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfQ0hBTkdFX1NFTlNJVElWSVRZX1NFTCwKKyAgICBISURfSU5QVVQoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PVElPTl9BTkdVTEFSX1ZFTE9DSVRZX1hfQVhJUywKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9USU9OX0FOR1VMQVJfVkVMT0NJVFlfWV9BWElTLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT1RJT05fQU5HVUxBUl9WRUxPQ0lUWV9aX0FYSVMsCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgZGVmYXVsdCB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisKKyAgICBISURfRU5EX0NPTExFQ1RJT04KK307CisKKworLyoqCisgKiAzRCBjb21wYXNzIHNlbnNvciBleGFtcGxlLgorICovCitjb25zdCB1bnNpZ25lZCBjaGFyIGNvbXAzX3JlcG9ydF9kZXNjcmlwdG9yW10gPSB7CisgICAgSElEX1VTQUdFX1BBR0VfU0VOU09SLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9PUklFTlRBVElPTl9DT01QQVNTXzNELAorICAgIEhJRF9DT0xMRUNUSU9OKFBoeXNpY2FsKSwKKworICAgIC8vZmVhdHVyZSByZXBvcnRzICh4bWl0L3JlY2VpdmUpCisgICAgSElEX1VTQUdFX1BBR0VfU0VOU09SLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfU0VOU09SX0NPTk5FQ1RJT05fVFlQRSwgIC8vIE5BcnkKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCgyKSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NPTk5FQ1RJT05fVFlQRV9QQ19JTlRFR1JBVEVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NPTk5FQ1RJT05fVFlQRV9QQ19BVFRBQ0hFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfRVhURVJOQUxfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDUpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX05PX0VWRU5UU19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfQUxMX0VWRU5UU19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfVEhSRVNIT0xEX0VWRU5UU19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfTk9fRVZFTlRTX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX0FMTF9FVkVOVFNfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfVEhSRVNIT0xEX0VWRU5UU19XQUtFX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDUpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfVU5ERUZJTkVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QwX0ZVTExfUE9XRVJfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDFfTE9XX1BPV0VSX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QyX1NUQU5EQllfV0lUSF9XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QzX1NMRUVQX1dJVEhfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9ENF9QT1dFUl9PRkZfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEUsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoNiksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9VTktOT1dOX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1JFQURZX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PVF9BVkFJTEFCTEVfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9fREFUQV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9JTklUSUFMSVpJTkdfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfQUNDRVNTX0RFTklFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9FUlJPUl9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRfSU5URVJWQUwsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzMyKDB4RkYsMHhGRiwweEZGLDB4RkYpLAorICAgIEhJRF9SRVBPUlRfU0laRSgzMiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgwKSwKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQShISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fTUFHTkVUSUNfSEVBRElORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9DSEFOR0VfU0VOU0lUSVZJVFlfQUJTKSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweEZGKSwKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBKEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9NQUdORVRJQ19IRUFESU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX01BWCksCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBGKSwgLy8gc2NhbGUgZGVmYXVsdCB1bml0IHRvIHByb3ZpZGUgMSBkaWdpdCBwYXN0IGRlY2ltYWwgcG9pbnQKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQShISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fTUFHTkVUSUNfSEVBRElORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9NSU4pLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRiksIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCB0byBwcm92aWRlIDEgZGlnaXQgcGFzdCBkZWNpbWFsIHBvaW50CisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX01BR05FVElDX0ZMVVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfQ0hBTkdFX1NFTlNJVElWSVRZX0FCUyksCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHhGRiksCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IGRlY2ltYWwgcG9pbnQKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQShISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fTUFHTkVUSUNfRkxVWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9NQVgpLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRiksIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCB0byBwcm92aWRlIDEgZGlnaXQgcGFzdCBkZWNpbWFsIHBvaW50CisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX01BR05FVElDX0ZMVVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfTUlOKSwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEYpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgdG8gcHJvdmlkZSAxIGRpZ2l0IHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisKKyAgICAvL2lucHV0IHJlcG9ydHMgKHRyYW5zbWl0KQorICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDYpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfVU5LTk9XTl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9SRUFEWV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT1RfQVZBSUxBQkxFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PX0RBVEFfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfSU5JVElBTElaSU5HX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0FDQ0VTU19ERU5JRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfRVJST1JfU0VMLAorICAgIEhJRF9JTlBVVChEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5ULAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDUpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfVU5LTk9XTl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9TVEFURV9DSEFOR0VEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1BST1BFUlRZX0NIQU5HRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfREFUQV9VUERBVEVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1BPTExfUkVTUE9OU0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfQ0hBTkdFX1NFTlNJVElWSVRZX1NFTCwKKyAgICBISURfSU5QVVQoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX0NPTVBFTlNBVEVEX01BR05FVElDX05PUlRILAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRiksIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCB0byBwcm92aWRlIDEgZGlnaXQgcGFzdCBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX0NPTVBFTlNBVEVEX1RSVUVfTk9SVEgsCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBGKSwgLy8gc2NhbGUgZGVmYXVsdCB1bml0IHRvIHByb3ZpZGUgMSBkaWdpdCBwYXN0IGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fTUFHTkVUSUNfTk9SVEgsCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBGKSwgLy8gc2NhbGUgZGVmYXVsdCB1bml0IHRvIHByb3ZpZGUgMSBkaWdpdCBwYXN0IGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fVFJVRV9OT1JUSCwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEYpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgdG8gcHJvdmlkZSAxIGRpZ2l0IHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9NQUdORVRJQ19GTFVYX1hfQVhJUywKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEQpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgdG8gIm1pbGxpR2F1c3MiCisgICAgLy8gdG8gcHJvdmlkZSAzIGRpZ2l0cyBwYXN0IGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fTUFHTkVUSUNfRkxVWF9ZX0FYSVMsCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBEKSwgLy8gc2NhbGUgZGVmYXVsdCB1bml0IHRvICJtaWxsaUdhdXNzIgorICAgIC8vIHRvIHByb3ZpZGUgMyBkaWdpdHMgcGFzdCBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX01BR05FVElDX0ZMVVhfWl9BWElTLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRCksIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCB0byAibWlsbGlHYXVzcyIKKyAgICAvLyB0byBwcm92aWRlIDMgZGlnaXRzIHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9NQUdORVRPTUVURVJfQUNDVVJBQ1ksCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoMiksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX01BR05FVE9NRVRFUl9BQ0NVUkFDWV9MT1csCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX01BR05FVE9NRVRFUl9BQ0NVUkFDWV9NRURJVU0sCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX01BR05FVE9NRVRFUl9BQ0NVUkFDWV9ISUdILAorICAgIEhJRF9JTlBVVChEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKworICAgIEhJRF9FTkRfQ09MTEVDVElPTgorfTsKKworCisvKioKKyAqIDNEIGluY2xpbm9tYXRlciBleGFtcGxlLgorICovCitjb25zdCB1bnNpZ25lZCBjaGFyIGluYzNfcmVwb3J0X2Rlc2NyaXB0b3JbXSA9IHsKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisgICAgSElEX1VTQUdFX1NFTlNPUl9UWVBFX09SSUVOVEFUSU9OX0lOQ0xJTk9NRVRFUl8zRCwKKyAgICBISURfQ09MTEVDVElPTihQaHlzaWNhbCksCisKKyAgICAvL2ZlYXR1cmUgcmVwb3J0cyAoeG1pdC9yZWNlaXZlKQorICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1NFTlNPUl9DT05ORUNUSU9OX1RZUEUsICAvLyBOQXJ5CisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoMiksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfSU5URUdSQVRFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfQVRUQUNIRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ09OTkVDVElPTl9UWVBFX1BDX0VYVEVSTkFMX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg1KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9OT19FVkVOVFNfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX0FMTF9FVkVOVFNfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX1RIUkVTSE9MRF9FVkVOVFNfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX05PX0VWRU5UU19XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9BTExfRVZFTlRTX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX1RIUkVTSE9MRF9FVkVOVFNfV0FLRV9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg1KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX1VOREVGSU5FRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EMF9GVUxMX1BPV0VSX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QxX0xPV19QT1dFUl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EMl9TVEFOREJZX1dJVEhfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EM19TTEVFUF9XSVRIX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDRfUE9XRVJfT0ZGX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDYpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfVU5LTk9XTl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9SRUFEWV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT1RfQVZBSUxBQkxFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PX0RBVEFfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfSU5JVElBTElaSU5HX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0FDQ0VTU19ERU5JRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfRVJST1JfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUX0lOVEVSVkFMLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF8zMigweEZGLDB4RkYsMHhGRiwweEZGKSwKKyAgICBISURfUkVQT1JUX1NJWkUoMzIpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMCksCisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX1RJTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfQ0hBTkdFX1NFTlNJVElWSVRZX0FCUyksCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHhGRiksCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IGRlY2ltYWwgcG9pbnQKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQShISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fVElMVCxISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX01BWCksCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgZGVmYXVsdCB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCBkZWNpbWFsIHBvaW50CisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEEoSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX1RJTFQsSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9NSU4pLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9GRUFUVVJFKERhdGFfVmFyX0FicyksCisKKyAgICAvL2lucHV0IHJlcG9ydHMgKHRyYW5zbWl0KQorICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDYpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfVU5LTk9XTl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9SRUFEWV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT1RfQVZBSUxBQkxFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PX0RBVEFfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfSU5JVElBTElaSU5HX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0FDQ0VTU19ERU5JRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfRVJST1JfU0VMLAorICAgIEhJRF9JTlBVVChEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5ULAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDUpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfVU5LTk9XTl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9TVEFURV9DSEFOR0VEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1BST1BFUlRZX0NIQU5HRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfREFUQV9VUERBVEVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1BPTExfUkVTUE9OU0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfQ0hBTkdFX1NFTlNJVElWSVRZX1NFTCwKKyAgICBISURfSU5QVVQoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX1RJTFRfWCwKKyAgICBISURfTE9HSUNBTF9NSU5fMTYoMHgwMSwweDgwKSwgLy8gICAgTE9HSUNBTF9NSU5JTVVNICgtMzI3NjcpCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHg3RiksIC8vICAgIExPR0lDQUxfTUFYSU1VTSAoMzI3NjcpCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgdG8gcHJvdmlkZSAyIGRpZ2l0cyBwYXN0IGRlY2ltYWwgcG9pbnQKKyAgICBISURfSU5QVVQoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fVElMVF9ZLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksIC8vIHNjYWxlIGRlZmF1bHQgdW5pdCB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgZGVjaW1hbCBwb2ludAorICAgIEhJRF9JTlBVVChEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9USUxUX1osCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwgLy8gc2NhbGUgZGVmYXVsdCB1bml0IHRvIHByb3ZpZGUgMiBkaWdpdHMgcGFzdCBkZWNpbWFsIHBvaW50CisgICAgSElEX0lOUFVUKERhdGFfVmFyX0FicyksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX01BR05FVE9NRVRFUl9BQ0NVUkFDWSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCgyKSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fTUFHTkVUT01FVEVSX0FDQ1VSQUNZX0xPVywKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fTUFHTkVUT01FVEVSX0FDQ1VSQUNZX01FRElVTSwKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fTUFHTkVUT01FVEVSX0FDQ1VSQUNZX0hJR0gsCisgICAgSElEX0lOUFVUKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorCisgICAgSElEX0VORF9DT0xMRUNUSU9OCit9OworCisKKy8qKgorICogRGV2aWNlIG9yaWVudGF0aW9uIHNlbnNvciBleGFtcGxlLiBOb3RlIHRoaXMgbWFwcyB0byByb3RhdGlvbiB2ZWN0b3Igc2Vuc29yIGluIGFuZHJvaWQuCisgKi8KK2NvbnN0IHVuc2lnbmVkIGNoYXIgZGV2b3JfcmVwb3J0X2Rlc2NyaXB0b3JbXSA9IHsKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisgICAgSElEX1VTQUdFX1NFTlNPUl9UWVBFX09SSUVOVEFUSU9OX0RFVklDRV9PUklFTlRBVElPTiwKKyAgICBISURfQ09MTEVDVElPTihQaHlzaWNhbCksCisKKyAgICAvL2ZlYXR1cmUgcmVwb3J0cyAoeG1pdC9yZWNlaXZlKQorICAgIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1NFTlNPUl9DT05ORUNUSU9OX1RZUEUsICAvLyBOQXJ5CisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzgoMiksCisgICAgSElEX1JFUE9SVF9TSVpFKDgpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX0NPTExFQ1RJT04oTG9naWNhbCksCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfSU5URUdSQVRFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfQVRUQUNIRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ09OTkVDVElPTl9UWVBFX1BDX0VYVEVSTkFMX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg1KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9OT19FVkVOVFNfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX0FMTF9FVkVOVFNfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX1RIUkVTSE9MRF9FVkVOVFNfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX05PX0VWRU5UU19XQUtFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9BTExfRVZFTlRTX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX1RIUkVTSE9MRF9FVkVOVFNfV0FLRV9TRUwsCisgICAgSElEX0ZFQVRVUkUoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg1KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX1VOREVGSU5FRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EMF9GVUxMX1BPV0VSX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFX0QxX0xPV19QT1dFUl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EMl9TVEFOREJZX1dJVEhfV0FLRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EM19TTEVFUF9XSVRIX1dBS0VfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDRfUE9XRVJfT0ZGX1NFTCwKKyAgICBISURfRkVBVFVSRShEYXRhX0Fycl9BYnMpLAorICAgIEhJRF9FTkRfQ09MTEVDVElPTiwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDYpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfVU5LTk9XTl9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9SRUFEWV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT1RfQVZBSUxBQkxFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX05PX0RBVEFfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfSU5JVElBTElaSU5HX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0FDQ0VTU19ERU5JRURfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfRVJST1JfU0VMLAorICAgIEhJRF9GRUFUVVJFKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUX0lOVEVSVkFMLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF8zMigweEZGLDB4RkYsMHhGRiwweEZGKSwKKyAgICBISURfUkVQT1JUX1NJWkUoMzIpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMCksCisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NIQU5HRV9TRU5TSVRJVklUWV9BQlMsCisgICAgSElEX0xPR0lDQUxfTUlOXzgoMCksCisgICAgSElEX0xPR0lDQUxfTUFYXzE2KDB4RkYsMHhGRiksCisgICAgSElEX1JFUE9SVF9TSVpFKDE2KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9VTklUX0VYUE9ORU5UKDB4MEUpLCAvLyBzY2FsZSBkZWZhdWx0IHVuaXQgIm1ldGVyIiB0byBwcm92aWRlIDIgZGlnaXRzIHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQShISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fUVVBVEVSTklPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9DSEFOR0VfU0VOU0lUSVZJVFlfQUJTKSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweEZGKSwKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBKEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9RVUFURVJOSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX01BWCksCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDAxKSwKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQShISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fUVVBVEVSTklPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9NSU4pLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoMSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwMSksCisgICAgSElEX0ZFQVRVUkUoRGF0YV9WYXJfQWJzKSwKKworICAgIC8vaW5jbHVkZSB0aGlzIGlmIHRoZSB2YWx1ZXMgYXJlIGNhbGN1bGF0ZWQgaW4gZmlybXdhcmUKKyAgICAvL290aGVyd2lzZSwgdGhlIGRyaXZlciB3aWxsIGNhbGN1bGF0ZSB0aGVzZSB2YWx1ZXMgZnJvbSB0aGUgUXVhdGVybmlvbgorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQShISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fUk9UQVRJT05fTUFUUklYLAorICAgICAgICAgICAgICAgICAgICAgICAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX0NIQU5HRV9TRU5TSVRJVklUWV9BQlMpLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4RkYpLAorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQShISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fUk9UQVRJT05fTUFUUklYLAorICAgICAgICAgICAgICAgICAgICAgICAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX01BWCksCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQShISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fUk9UQVRJT05fTUFUUklYLAorICAgICAgICAgICAgICAgICAgICAgICAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX01JTiksCisgICAgSElEX0xPR0lDQUxfTUlOXzE2KDB4MDEsMHg4MCksIC8vICAgIExPR0lDQUxfTUlOSU1VTSAoLTMyNzY3KQorICAgIEhJRF9MT0dJQ0FMX01BWF8xNigweEZGLDB4N0YpLCAvLyAgICBMT0dJQ0FMX01BWElNVU0gKDMyNzY3KQorICAgIEhJRF9SRVBPUlRfU0laRSgxNiksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfVU5JVF9FWFBPTkVOVCgweDBFKSwKKyAgICBISURfRkVBVFVSRShEYXRhX1Zhcl9BYnMpLAorCisgICAgLy9pbnB1dCByZXBvcnRzICh0cmFuc21pdCkKKyAgICBISURfVVNBR0VfUEFHRV9TRU5TT1IsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURSwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg2KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX1VOS05PV05fU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfUkVBRFlfU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9UX0FWQUlMQUJMRV9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9OT19EQVRBX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0lOSVRJQUxJWklOR19TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9BQ0NFU1NfREVOSUVEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX1NUQVRFX0VSUk9SX1NFTCwKKyAgICBISURfSU5QVVQoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVCwKKyAgICBISURfTE9HSUNBTF9NSU5fOCgwKSwKKyAgICBISURfTE9HSUNBTF9NQVhfOCg1KSwKKyAgICBISURfUkVQT1JUX1NJWkUoOCksCisgICAgSElEX1JFUE9SVF9DT1VOVCgxKSwKKyAgICBISURfQ09MTEVDVElPTihMb2dpY2FsKSwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX1VOS05PV05fU0VMLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfU1RBVEVfQ0hBTkdFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9QUk9QRVJUWV9DSEFOR0VEX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX0RBVEFfVVBEQVRFRF9TRUwsCisgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9QT0xMX1JFU1BPTlNFX1NFTCwKKyAgICBISURfVVNBR0VfU0VOU09SX0VWRU5UX0NIQU5HRV9TRU5TSVRJVklUWV9TRUwsCisgICAgSElEX0lOUFVUKERhdGFfQXJyX0FicyksCisgICAgSElEX0VORF9DT0xMRUNUSU9OLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9RVUFURVJOSU9OLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoNCksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRSksCisgICAgSElEX0lOUFVUKERhdGFfQXJyX0FicyksCisKKyAgICAvL2luY2x1ZGUgdGhpcyBpZiB0aGUgdmFsdWVzIGFyZSBjYWxjdWxhdGVkIGluIGZpcm13YXJlCisgICAgLy9vdGhlcndpc2UsIHRoZSBkcml2ZXIgd2lsbCBjYWxjdWxhdGUgdGhlc2UgdmFsdWVzIGZyb20gdGhlIFF1YXRlcm5pb24KKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fUk9UQVRJT05fTUFUUklYLAorICAgIEhJRF9MT0dJQ0FMX01JTl8xNigweDAxLDB4ODApLCAvLyAgICBMT0dJQ0FMX01JTklNVU0gKC0zMjc2NykKKyAgICBISURfTE9HSUNBTF9NQVhfMTYoMHhGRiwweDdGKSwgLy8gICAgTE9HSUNBTF9NQVhJTVVNICgzMjc2NykKKyAgICBISURfUkVQT1JUX1NJWkUoMTYpLAorICAgIEhJRF9SRVBPUlRfQ09VTlQoOSksCisgICAgSElEX1VOSVRfRVhQT05FTlQoMHgwRiksCisgICAgSElEX0lOUFVUKERhdGFfQXJyX0FicyksCisKKyAgICBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fTUFHTkVUT01FVEVSX0FDQ1VSQUNZLAorICAgIEhJRF9MT0dJQ0FMX01JTl84KDApLAorICAgIEhJRF9MT0dJQ0FMX01BWF84KDIpLAorICAgIEhJRF9SRVBPUlRfU0laRSg4KSwKKyAgICBISURfUkVQT1JUX0NPVU5UKDEpLAorICAgIEhJRF9DT0xMRUNUSU9OKExvZ2ljYWwpLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9NQUdORVRPTUVURVJfQUNDVVJBQ1lfTE9XLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9NQUdORVRPTUVURVJfQUNDVVJBQ1lfTUVESVVNLAorICAgIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9NQUdORVRPTUVURVJfQUNDVVJBQ1lfSElHSCwKKyAgICBISURfSU5QVVQoRGF0YV9BcnJfQWJzKSwKKyAgICBISURfRU5EX0NPTExFQ1RJT04sCisKKyAgICBISURfRU5EX0NPTExFQ1RJT04KK307Cit9IC8vIGFubm95bW91cyBuYW1lc3BhY2UKKworLyoqCisgKiBHbG9iYWwgdGVzdCB2ZWN0b3IgZW50cnkuCisgKi8KKyNkZWZpbmUgVEVTVF9ERVNDUklQVE9SKG5hbWUpIFwKKyAgICB7IG5hbWUgIyMgX3JlcG9ydF9kZXNjcmlwdG9yLCBzaXplb2YobmFtZSAjIyBfcmVwb3J0X2Rlc2NyaXB0b3IpLCAjbmFtZSB9CisKK2NvbnN0IFRlc3RIaWREZXNjcmlwdG9yIGdEZXNjcmlwdG9yQXJyYXlbXSA9IHsKKyAgICBURVNUX0RFU0NSSVBUT1IoYWNjZWwzKSwKKyAgICBURVNUX0RFU0NSSVBUT1IoY29sMSksCisgICAgVEVTVF9ERVNDUklQVE9SKGNvbDIpLAorICAgIFRFU1RfREVTQ1JJUFRPUihjb2wzKSwKKyAgICBURVNUX0RFU0NSSVBUT1IoY3VzMSksCisgICAgVEVTVF9ERVNDUklQVE9SKGN1czIpLAorICAgIFRFU1RfREVTQ1JJUFRPUihjdXMzKSwKKyAgICBURVNUX0RFU0NSSVBUT1IoY3VzNCksCisgICAgVEVTVF9ERVNDUklQVE9SKHByZXMpLAorICAgIFRFU1RfREVTQ1JJUFRPUihwcm94KSwKKyAgICBURVNUX0RFU0NSSVBUT1IoYmFyKSwKKyAgICBURVNUX0RFU0NSSVBUT1IoaHVtaSksCisgICAgVEVTVF9ERVNDUklQVE9SKHRlbXApLAorICAgIFRFU1RfREVTQ1JJUFRPUihhbHMpLAorICAgIFRFU1RfREVTQ1JJUFRPUihneXJvMyksCisgICAgVEVTVF9ERVNDUklQVE9SKGNvbXAzKSwKKyAgICBURVNUX0RFU0NSSVBUT1IoaW5jMyksCisgICAgVEVTVF9ERVNDUklQVE9SKGRldm9yKSwKKyAgICB7bnVsbHB0ciwgMCwgbnVsbHB0cn0gLy9zZW50aW5lbAorfTsKKyN1bmRlZiBURVNUX0RFU0NSSVBUT1IKKworY29uc3QgVGVzdEhpZERlc2NyaXB0b3IgKmZpbmRUZXN0RGVzY3JpcHRvcihjb25zdCBjaGFyICpuYW1lKSB7CisgICAgaWYgKG5hbWUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IFRlc3RIaWREZXNjcmlwdG9yICpwID0gZ0Rlc2NyaXB0b3JBcnJheTsgOyArK3ApIHsKKyAgICAgICAgaWYgKHAtPmRhdGEgPT0gbnVsbHB0ciB8fCBwLT5sZW4gPT0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmNtcChwLT5uYW1lLCBuYW1lKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy90ZXN0L1Rlc3RIaWREZXNjcmlwdG9yLmggYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvdGVzdC9UZXN0SGlkRGVzY3JpcHRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxN2NiNzIKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvdGVzdC9UZXN0SGlkRGVzY3JpcHRvci5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBISURVVElMX1RFU1RfSElEREVTQ1JJUFRPUl9IXworI2RlZmluZSBISURVVElMX1RFU1RfSElEREVTQ1JJUFRPUl9IXworCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworc3RydWN0IFRlc3RIaWREZXNjcmlwdG9yIHsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOworICAgIHNpemVfdCBsZW47CisgICAgY29uc3QgY2hhciAqbmFtZTsKK307CisKK2V4dGVybiBjb25zdCBUZXN0SGlkRGVzY3JpcHRvciBnRGVzY3JpcHRvckFycmF5W107Citjb25zdCBUZXN0SGlkRGVzY3JpcHRvciAqZmluZFRlc3REZXNjcmlwdG9yKGNvbnN0IGNoYXIgKm5hbWUpOworCisjZW5kaWYgLy8gSElEVVRJTF9URVNUX0hJRERFU0NSSVBUT1JfSF8KZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy90ZXN0L1Rlc3RIaWRTZW5zb3JTcGVjLmggYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvdGVzdC9UZXN0SGlkU2Vuc29yU3BlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMmNiNmMKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvdGVzdC9UZXN0SGlkU2Vuc29yU3BlYy5oCkBAIC0wLDAgKzEsODU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgSElEVVRJTF9URVNUX0hJRFNFTlNPUlNQRUNfSAorI2RlZmluZSBISURVVElMX1RFU1RfSElEU0VOU09SU1BFQ19ICisvKioKKyAqIEV4YW1wbGUgSElEIHNlbnNvciBkZWZpbml0aW9uIGluIGZyb20gcHVibGlzaGVkIGRvY3VtZW50ICJISUQgU2Vuc29ycyBVc2FnZSIKKyAqIChoaWQtc2Vuc29ycy11c2FnZS5kb2N4KS4gVGhpcyBmaWxlIGlzIGFkZGVkIGFzIHBhcnQgb2YgdGhlIHRlc3QgY2FzZS4KKyAqCisgKiBJdCBpcyBzbGlnaHRseSBtb2RpZmllZCBpbiBvcmRlciB0byBjb21waWxlLgorICovCisjZGVmaW5lIEhJRF9VU0FHRV9QQUdFX1NFTlNPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNSwweDIwCisKKy8vc2Vuc29yIGNhdGVnb3J5IHVzYWdlcworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfQ09MTEVDVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHgwMQorLy9zZW5zb3IgY2F0ZWdvcnkgYmlvbWV0cmljCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfQ0FURUdPUllfQklPTUVUUklDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDEwCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9CSU9NRVRSSUNfUFJFU0VOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDExCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9CSU9NRVRSSUNfUFJPWElNSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDEyCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9CSU9NRVRSSUNfVE9VQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDEzCisvL3NlbnNvciBjYXRlZ29yeSBlbGVjdHJpY2FsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfQ0FURUdPUllfRUxFQ1RSSUNBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDIwCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9FTEVDVFJJQ0FMX0NBUEFDSVRBTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDIxCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9FTEVDVFJJQ0FMX0NVUlJFTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDIyCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9FTEVDVFJJQ0FMX1BPV0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDIzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9FTEVDVFJJQ0FMX0lORFVDVEFOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDI0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9FTEVDVFJJQ0FMX1JFU0lTVEFOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDI1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9FTEVDVFJJQ0FMX1ZPTFRBR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDI2CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9FTEVDVFJJQ0FMX1BPVEVOVElPTUVURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDI3CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9FTEVDVFJJQ0FMX0ZSRVFVRU5DWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDI4CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9FTEVDVFJJQ0FMX1BFUklPRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDI5CisvL3NlbnNvciBjYXRlZ29yeSBlbnZpcm9ubWVudGFsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfQ0FURUdPUllfRU5WSVJPTk1FTlRBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDMwCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9FTlZJUk9OTUVOVEFMX0FUTU9TUEhFUklDX1BSRVNTVVJFICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDMxCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9FTlZJUk9OTUVOVEFMX0hVTUlESVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDMyCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9FTlZJUk9OTUVOVEFMX1RFTVBFUkFUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDMzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9FTlZJUk9OTUVOVEFMX1dJTkRfRElSRUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDM0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9FTlZJUk9OTUVOVEFMX1dJTkRfU1BFRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweDM1CisvL3NlbnNvciBjYXRlZ29yeSBsaWdodAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0NBVEVHT1JZX0xJR0hUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHg0MAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfTElHSFRfQU1CSUVOVExJR0hUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHg0MQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfTElHSFRfQ09OU1VNRVJfSU5GUkFSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHg0MgorLy9zZW5zb3IgY2F0ZWdvcnkgbG9jYXRpb24KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9DQVRFR09SWV9MT0NBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NTAKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX0xPQ0FUSU9OX0JST0FEQ0FTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NTEKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX0xPQ0FUSU9OX0RFQURfUkVDS09OSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NTIKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX0xPQ0FUSU9OX0dQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NTMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX0xPQ0FUSU9OX0xPT0tVUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NTQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX0xPQ0FUSU9OX09USEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NTUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX0xPQ0FUSU9OX1NUQVRJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NTYKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX0xPQ0FUSU9OX1RSSUFOR1VMQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NTcKKy8vc2Vuc29yIGNhdGVnb3J5IG1lY2hhbmljYWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9DQVRFR09SWV9NRUNIQU5JQ0FMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NjAKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX01FQ0hBTklDQUxfQk9PTEVBTl9TV0lUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NjEKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX01FQ0hBTklDQUxfQk9PTEVBTl9TV0lUQ0hfQVJSQVkgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NjIKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX01FQ0hBTklDQUxfTVVMVElWQUxVRV9TV0lUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NjMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX01FQ0hBTklDQUxfRk9SQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NjQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX01FQ0hBTklDQUxfUFJFU1NVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NjUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX01FQ0hBTklDQUxfU1RSQUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NjYKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX01FQ0hBTklDQUxfU0NBTEVfV0VJR0hUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NjcKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX01FQ0hBTklDQUxfVklCUkFUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NjgKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX01FQ0hBTklDQUxfSEFMTF9FRkZFQ1RfU1dJVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4NjkKKy8vc2Vuc29yIGNhdGVnb3J5IG1vdGlvbgorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0NBVEVHT1JZX01PVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHg3MAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfTU9USU9OX0FDQ0VMRVJPTUVURVJfMUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHg3MQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfTU9USU9OX0FDQ0VMRVJPTUVURVJfMkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHg3MgorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfTU9USU9OX0FDQ0VMRVJPTUVURVJfM0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHg3MworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfTU9USU9OX0dZUk9NRVRFUl8xRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHg3NAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfTU9USU9OX0dZUk9NRVRFUl8yRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHg3NQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfTU9USU9OX0dZUk9NRVRFUl8zRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHg3NgorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfTU9USU9OX01PVElPTl9ERVRFQ1RPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHg3NworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfTU9USU9OX1NQRUVET01FVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHg3OAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfTU9USU9OX0FDQ0VMRVJPTUVURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHg3OQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1RZUEVfTU9USU9OX0dZUk9NRVRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksMHg3QQorLy9zZW5zb3IgY2F0ZWdvcnkgb3JpZW50YXRpb24KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9DQVRFR09SWV9PUklFTlRBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4ODAKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX09SSUVOVEFUSU9OX0NPTVBBU1NfMUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4ODEKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX09SSUVOVEFUSU9OX0NPTVBBU1NfMkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4ODIKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX09SSUVOVEFUSU9OX0NPTVBBU1NfM0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4ODMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX09SSUVOVEFUSU9OX0lOQ0xJTk9NRVRFUl8xRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4ODQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX09SSUVOVEFUSU9OX0lOQ0xJTk9NRVRFUl8yRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4ODUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX09SSUVOVEFUSU9OX0lOQ0xJTk9NRVRFUl8zRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4ODYKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX09SSUVOVEFUSU9OX0RJU1RBTkNFXzFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4ODcKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX09SSUVOVEFUSU9OX0RJU1RBTkNFXzJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4ODgKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX09SSUVOVEFUSU9OX0RJU1RBTkNFXzNEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4ODkKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX09SSUVOVEFUSU9OX0RFVklDRV9PUklFTlRBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4OEEKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX09SSUVOVEFUSU9OX0NPTVBBU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4OEIKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX09SSUVOVEFUSU9OX0lOQ0xJTk9NRVRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4OEMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX09SSUVOVEFUSU9OX0RJU1RBTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4OEQKKy8vc2Vuc29yIGNhdGVnb3J5IHNjYW5uZXIKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9DQVRFR09SWV9TQ0FOTkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4OTAKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX1NDQU5ORVJfQkFSQ09ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4OTEKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX1NDQU5ORVJfUkZJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4OTIKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX1NDQU5ORVJfTkZDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4OTMKKy8vc2Vuc29yIGNhdGVnb3J5IHRpbWUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9DQVRFR09SWV9USU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4QTAKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX1RJTUVfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4QTEKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9UWVBFX1RJTUVfUlRDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LDB4QTIKKy8vc2Vuc29yIGNhdGVnb3J5IG90aGVyCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfQ0FURUdPUllfT1RIRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweEUwCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9PVEhFUl9DVVNUT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweEUxCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9PVEhFUl9HRU5FUklDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweEUyCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVFlQRV9PVEhFUl9HRU5FUklDX0VOVU1FUkFUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwweEUzCisKKy8vdW5pdCB1c2FnZXMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19OT1RfU1BFQ0lGSUVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDY1LDB4MDAgICAgICAgICAgICAgICAgLy8gVW5pdAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0xVWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjcsMHhFMSwweDAwLDB4MDAsMHgwMSAvLyBVbml0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfS0VMVklOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2NywweDAxLDB4MDAsMHgwMSwweDAwIC8vIFVuaXQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19GQUhSRU5IRUlUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDY3LDB4MDMsMHgwMCwweDAxLDB4MDAgLy8gVW5pdAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX1BBU0NBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjYsMHhGMSwweEUxICAgICAgICAgICAvLyBVbml0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfTkVXVE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2NiwweDExLDB4RTEgICAgICAgICAgIC8vIFVuaXQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19NRVRFUlNfUEVSX1NFQ09ORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDY2LDB4MTEsMHhGMCAgICAgICAgICAgLy8gVW5pdAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX01FVEVSU19QRVJfU0VDX1NRUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjYsMHgxMSwweEUwICAgICAgICAgICAvLyBVbml0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfRkFSQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2NywweEUxLDB4NEYsMHgyMCwweDAwIC8vIFVuaXQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19BTVBFUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDY3LDB4MDEsMHgwMCwweDEwLDB4MDAgLy8gVW5pdAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX1dBVFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjYsMHgyMSwweEQxICAgICAgICAgICAvLyBVbml0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfSEVOUlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2NywweDIxLDB4RTEsMHhFMCwweDAwIC8vIFVuaXQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19PSE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDY3LDB4MjEsMHhEMSwweEUwLDB4MDAgLy8gVW5pdAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX1ZPTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjcsMHgyMSwweEQxLDB4RjAsMHgwMCAvLyBVbml0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfSEVSVFogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2NiwweDAxLDB4RjAgICAgICAgICAgIC8vIFVuaXQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19ERUdSRUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDY1LDB4MTQgICAgICAgICAgICAgICAgLy8gVW5pdAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0RFR1JFRVNfUEVSX1NFQ09ORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjYsMHgxNCwweEYwICAgICAgICAgICAvLyBVbml0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfREVHUkVFU19QRVJfU0VDX1NRUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2NiwweDE0LDB4RTAgICAgICAgICAgIC8vIFVuaXQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19SQURJQU5TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDY1LDB4MTIgICAgICAgICAgICAgICAgLy8gVW5pdAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX1JBRElBTlNfUEVSX1NFQ09ORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjYsMHgxMiwweEYwICAgICAgICAgICAvLyBVbml0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfUkFESUFOU19QRVJfU0VDX1NRUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2NiwweDEyLDB4RTAgICAgICAgICAgIC8vIFVuaXQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19TRUNPTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDY2LDB4MDEsMHgxMCAgICAgICAgICAgLy8gVW5pdAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0dBVVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjcsMHgwMSwweEUxLDB4RjAsMHgwMCAvLyBVbml0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfR1JBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2NiwweDAxLDB4MDEgICAgICAgICAgIC8vIFVuaXQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19DRU5USU1FVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDY1LDB4MTEgICAgICAgICAgICAgICAgLy8gVW5pdAorI2lmZGVmIERFRklORV9OT05fSElEX1VOSVRTCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfQ0VMU0lVUyAgICAgICAgICAgICAgIlVzZSBVbml0KEtlbHZpbikgYW5kIHN1YnRyYWN0IDI3My4xNSIKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19LSUxPR1JBTSAgICAgICAgICAgICAiVXNlIFVuaXQoZ3JhbSkgYW5kIFVuaXRFeHBvbmVudCgweDAzKSIKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19NRVRFUiAgICAgICAgICAgICAgICAiVXNlIFVuaXQoY2VudGltZXRlcikgYW5kIFVuaXRFeHBvbmVudCgweDAyKSIKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19CQVIgICAgICAgICAgICAgICAgICAiVXNlIFVuaXQoUGFzY2FsKSBhbmQgVW5pdEV4cG9uZW50KDB4MDUpIgorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0tOT1QgICAgICAgICAgICAgICAgICJVc2UgVW5pdChtL3MpIGFuZCBtdWx0aXBseSBieSAxODUyLzM2MDAiCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfUEVSQ0VOVCAgICAgICAgICAgICAgIlVzZSBVbml0KE5vdF9TcGVjaWZpZWQpIgorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0cgICAgICAgICAgICAgICAgICAgICJVc2UgVW5pdChtL3MyKSBhbmQgZGl2aWRlIGJ5IDkuOCIKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19NSUxMSVNFQ09ORCAgICAgICAgICAiVXNlIFVuaXQoc2Vjb25kKSBhbmQgVW5pdEV4cG9uZW50KDB4MEQpIgorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX01JTExJR0FVU1MgICAgICAgICAgICJVc2UgVW5pdChHYXVzcykgYW5kIFVuaXRFeHBvbmVudCgweDBEKSIKKyNlbmRpZgorLy91bml0IGRlcHJlY2F0ZWQgdXNhZ2VzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfREVQUkVDQVRFRF9MVVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0RFUFJFQ0FURURfS0VMVklOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19ERVBSRUNBVEVEX0NFTFNJVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfREVQUkVDQVRFRF9QQVNDQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0RFUFJFQ0FURURfTkVXVE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19ERVBSRUNBVEVEX01FVEVSU19QRVJfU0VDT05EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfREVQUkVDQVRFRF9LSUxPR1JBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0RFUFJFQ0FURURfTUVURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19ERVBSRUNBVEVEX01FVEVSU19QRVJfU0VDX1NRUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfREVQUkVDQVRFRF9GQVJBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0RFUFJFQ0FURURfQU1QRVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEIKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19ERVBSRUNBVEVEX1dBVFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBDCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfREVQUkVDQVRFRF9IRU5SWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0RFUFJFQ0FURURfT0hNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19ERVBSRUNBVEVEX1ZPTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBGCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfREVQUkVDQVRFRF9IRVJUWiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0RFUFJFQ0FURURfQkFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTEKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19ERVBSRUNBVEVEX0RFR1JFRVNfQU5USV9DTE9DS1dJU0UgICAgICAgICAgICAgICAgICAgICAgICAweDEyCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfREVQUkVDQVRFRF9ERUdSRUVTX0NMT0NLV0lTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0RFUFJFQ0FURURfREVHUkVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19ERVBSRUNBVEVEX0RFR1JFRVNfUEVSX1NFQ09ORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfREVQUkVDQVRFRF9LTk9UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNgorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0RFUFJFQ0FURURfUEVSQ0VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTcKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19ERVBSRUNBVEVEX1NFQ09ORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfREVQUkVDQVRFRF9NSUxMSVNFQ09ORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1VOSVRTX0RFUFJFQ0FURURfRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUEKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9VTklUU19ERVBSRUNBVEVEX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFCCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfREVQUkVDQVRFRF9NSUxMSUdBVVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQworCisvL2RhdGEgdHlwZSB1c2FnZSBtb2RpZmllcnMgLS0gd2UgdXNlIHRoZW0gYXMgbW9kaWZpZXJzIGZvciBzZW5zb3IgcHJvcGVydGllcyAmIGRhdGEgZmllbGRzCisvL3RvIGNyZWF0ZSB0aHJlc2hvbGRzLCBmb3IgZXhhbXBsZS4KKy8vTk9URTogdGhlIHVzYWdlIHRhYmxlcyBhY3R1YWxseSBkZWZpbmUgdGhlc2UgYXMgdHdvIGJ5dGVzLCBidXQgaW4gb3JkZXIKKy8vdG8gZ2V0IHRoZSBkZWZpbmUgbWFjcm9zIHRvIHdvcmsgc28gdGhlc2UgYXJlIJFvci1lZJIgdGhlc2UgYXJlIGRlZmluZWQKKy8vaGVyZSBhcyBvbmx5IG9uZSBieXRlLgorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgLy8gVVMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9DSEFOR0VfU0VOU0lUSVZJVFlfQUJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwIC8vIFVTCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfTUFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMCAvLyBVUworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX01JTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAgLy8gVVMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9BQ0NVUkFDWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwIC8vIFVTCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfUkVTT0xVVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MCAvLyBVUworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX1RIUkVTSE9MRF9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjAgLy8gVVMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9USFJFU0hPTERfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDcwIC8vIFVTCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfQ0FMSUJSQVRJT05fT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MCAvLyBVUworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX0NBTElCUkFUSU9OX01VTFRJUExJRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTAgLy8gVVMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9SRVBPUlRfSU5URVJWQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEEwIC8vIFVTCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfRlJFUVVFTkNZX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCMCAvLyBVUworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX1BFUklPRF9NQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QzAgLy8gVVMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PRF9DSEFOR0VfU0VOU0lUSVZJVFlfUkFOR0VfUENUICAgICAgICAgICAgICAgICAgICAgICAgICAweEQwIC8vIFVTCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT0RfQ0hBTkdFX1NFTlNJVElWSVRZX1JFTF9QQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMCAvLyBVUworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9EX1ZFTkRPUl9SRVNFUlZFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RjAgLy8gVVMKKworCisvL3N0YXRlIHVzYWdlcworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwMSwweDAyIC8vIE5BcnkKKy8vc3RhdGUgc2VsZWN0b3JzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfVU5LTk9XTl9TRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDAwLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfUkVBRFlfU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDAxLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9UX0FWQUlMQUJMRV9TRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDAyLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9fREFUQV9TRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDAzLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfSU5JVElBTElaSU5HX1NFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDA0LDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfQUNDRVNTX0RFTklFRF9TRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDA1LDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfRVJST1JfU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDA2LDB4MDggLy8gU2VsCisvL3N0YXRlIGVudW1zCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfVU5LTk9XTl9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfUkVBRFlfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMiAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9UX0FWQUlMQUJMRV9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMyAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfTk9fREFUQV9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNCAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfSU5JVElBTElaSU5HX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNSAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfQUNDRVNTX0RFTklFRF9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNiAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfRVJST1JfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNyAvLyBFbnVtCisvL3N0YXRlIGRlcHJlY2F0ZWQgZW51bXMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9ERVBSRUNBVEVEX1VOS05PV05fRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfREVQUkVDQVRFRF9OT1RfQVZBSUxBQkxFX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1NUQVRFX0RFUFJFQ0FURURfUkVBRFlfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9ERVBSRUNBVEVEX05PX0RBVEFfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfU1RBVEVfREVQUkVDQVRFRF9JTklUSUFMSVpJTkdfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1NUQVRFX0RFUFJFQ0FURURfQUNDRVNTX0RFTklFRF9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9TVEFURV9ERVBSRUNBVEVEX0VSUk9SX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2CisKKy8vZXZlbnQgdXNhZ2VzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDAyLDB4MDIgLy8gTkFyeQorLy9ldmVudCBzZWxlY3RvcnMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9VTktOT1dOX1NFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MTAsMHgwOCAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9TVEFURV9DSEFOR0VEX1NFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MTEsMHgwOCAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9QUk9QRVJUWV9DSEFOR0VEX1NFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MTIsMHgwOCAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9EQVRBX1VQREFURURfU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MTMsMHgwOCAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9QT0xMX1JFU1BPTlNFX1NFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MTQsMHgwOCAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9DSEFOR0VfU0VOU0lUSVZJVFlfU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MTUsMHgwOCAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9NQVhfUkVBQ0hFRF9TRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MTYsMHgwOCAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9NSU5fUkVBQ0hFRF9TRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MTcsMHgwOCAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9ISUdIX1RIUkVTSE9MRF9DUk9TU19VUFdBUkRfU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MTgsMHgwOCAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9ISUdIX1RIRVNIT0xEX0NST1NTX0FCT1ZFX1NFTCAgICAgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9ISUdIX1RIUkVTSE9MRF9DUk9TU19VUFdBUkRfU0VMCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfSElHSF9USFJFU0hPTERfQ1JPU1NfRE9XTldBUkRfU0VMICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDE5LDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfSElHSF9USFJFU0hPTERfQ1JPU1NfQkVMT1dfU0VMICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfSElHSF9USFJFU0hPTERfQ1JPU1NfRE9XTldBUkRfU0VMCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfTE9XX1RIUkVTSE9MRF9DUk9TU19VUFdBUkRfU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDFBLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfTE9XX1RIUkVTSE9MRF9DUk9TU19BQk9WRV9TRUwgICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfTE9XX1RIUkVTSE9MRF9DUk9TU19VUFdBUkRfU0VMCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfTE9XX1RIUkVTSE9MRF9DUk9TU19ET1dOV0FSRF9TRUwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDFCLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfTE9XX1RIUkVTSE9MRF9DUk9TU19CRUxPV19TRUwgICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfTE9XX1RIUkVTSE9MRF9DUk9TU19ET1dOV0FSRF9TRUwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9aRVJPX1RIUkVTSE9MRF9DUk9TU19VUFdBUkRfU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MUMsMHgwOCAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9aRVJPX1RIUkVTSE9MRF9DUk9TU19BQk9WRV9TRUwgICAgICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9aRVJPX1RIUkVTSE9MRF9DUk9TU19VUFdBUkRfU0VMCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfWkVST19USFJFU0hPTERfQ1JPU1NfRE9XTldBUkRfU0VMICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDFELDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfWkVST19USFJFU0hPTERfQ1JPU1NfQkVMT1dfU0VMICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfWkVST19USFJFU0hPTERfQ1JPU1NfRE9XTldBUkRfU0VMCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfUEVSSU9EX0VYQ0VFREVEX1NFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDFFLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfRlJFUVVFTkNZX0VYQ0VFREVEX1NFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDFGLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfQ09NUExFWF9UUklHR0VSX1NFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDIwLDB4MDggLy8gU2VsCisvL2V2ZW50IGVudW1zCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfVU5LTk9XTl9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfU1RBVEVfQ0hBTkdFRF9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMiAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfUFJPUEVSVFlfQ0hBTkdFRF9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMyAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfREFUQV9VUERBVEVEX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNCAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfUE9MTF9SRVNQT05TRV9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNSAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfQ0hBTkdFX1NFTlNJVElWSVRZX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNiAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfTUFYX1JFQUNIRURfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNyAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfTUlOX1JFQUNIRURfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOCAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfSElHSF9USFJFU0hPTERfQ1JPU1NfVVBXQVJEX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfSElHSF9USEVTSE9MRF9DUk9TU19BQk9WRV9FTlVNICAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9ISUdIX1RIUkVTSE9MRF9DUk9TU19VUFdBUkRfRU5VTQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0hJR0hfVEhSRVNIT0xEX0NST1NTX0RPV05XQVJEX0VOVU0gICAgICAgICAgICAgICAgICAgICAgIDB4MEEgLy8gRW51bQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0hJR0hfVEhSRVNIT0xEX0NST1NTX0JFTE9XX0VOVU0gIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfSElHSF9USFJFU0hPTERfQ1JPU1NfRE9XTldBUkRfRU5VTQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0xPV19USFJFU0hPTERfQ1JPU1NfVVBXQVJEX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEIgLy8gRW51bQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0xPV19USFJFU0hPTERfQ1JPU1NfQUJPVkVfRU5VTSAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfTE9XX1RIUkVTSE9MRF9DUk9TU19VUFdBUkRfRU5VTQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0xPV19USFJFU0hPTERfQ1JPU1NfRE9XTldBUkRfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgIDB4MEMgLy8gRW51bQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0xPV19USFJFU0hPTERfQ1JPU1NfQkVMT1dfRU5VTSAgIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfTE9XX1RIUkVTSE9MRF9DUk9TU19ET1dOV0FSRF9FTlVNCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfWkVST19USFJFU0hPTERfQ1JPU1NfVVBXQVJEX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAgMHgwRCAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfWkVST19USFJFU0hPTERfQ1JPU1NfQUJPVkVfRU5VTSAgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9aRVJPX1RIUkVTSE9MRF9DUk9TU19VUFdBUkRfRU5VTQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX1pFUk9fVEhSRVNIT0xEX0NST1NTX0RPV05XQVJEX0VOVU0gICAgICAgICAgICAgICAgICAgICAgIDB4MEUgLy8gRW51bQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX1pFUk9fVEhSRVNIT0xEX0NST1NTX0JFTE9XX0VOVU0gIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfWkVST19USFJFU0hPTERfQ1JPU1NfRE9XTldBUkRfRU5VTQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX1BFUklPRF9FWENFRURFRF9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEYgLy8gRW51bQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0ZSRVFVRU5DWV9FWENFRURFRF9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAgLy8gRW51bQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0NPTVBMRVhfVFJJR0dFUl9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTEgLy8gRW51bQorLy9ldmVudCBkZXByZWNhdGVkIGVudW1zCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfREVQUkVDQVRFRF9VTktOT1dOX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0RFUFJFQ0FURURfU1RBVEVfQ0hBTkdFRF9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9ERVBSRUNBVEVEX1BST1BFUlRZX0NIQU5HRURfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfREVQUkVDQVRFRF9EQVRBX1VQREFURV9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0RFUFJFQ0FURURfUE9MTF9SRVNQT05TRV9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9ERVBSRUNBVEVEX0NIQU5HRV9TRU5TSVRJVklUWV9FTlVNICAgICAgICAgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfREVQUkVDQVRFRF9NQVhfUkVBQ0hFRF9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0RFUFJFQ0FURURfTUlOX1JFQUNIRURfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9ERVBSRUNBVEVEX0hJR0hfVEhSRVNISE9MRF9DUk9TU19BQk9WRV9FTlVNICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfREVQUkVDQVRFRF9ISUdIX1RIUkVTSEhPTERfQ1JPU1NfQkVMT1dfRU5VTSAgICAgICAgICAgICAgMHgwOQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0RFUFJFQ0FURURfTE9XX1RIUkVTSEhPTERfQ1JPU1NfQUJPVkVfRU5VTSAgICAgICAgICAgICAgIDB4MEEKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9ERVBSRUNBVEVEX0xPV19USFJFU0hIT0xEX0NST1NTX0JFTE9XX0VOVU0gICAgICAgICAgICAgICAweDBCCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfREVQUkVDQVRFRF9aRVJPX1RIUkVTSE9MRF9DUk9TU19BQk9WRV9FTlVNICAgICAgICAgICAgICAgMHgwQworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0VWRU5UX0RFUFJFQ0FURURfWkVST19USFJFU0hPTERfQ1JPU1NfQkVMT1dfRU5VTSAgICAgICAgICAgICAgIDB4MEQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9FVkVOVF9ERVBSRUNBVEVEX1BFUklPRF9FWENFRURFRF9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAweDBFCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRVZFTlRfREVQUkVDQVRFRF9GUkVRVUVOQ1lfRVhDRUVERURfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgMHgwRgorCisvL3Byb3BlcnR5IHVzYWdlcyAoZ2V0L3NldCBmZWF0dXJlIHJlcG9ydCkKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MDAsMHgwMworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0ZSSUVORExZX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwMSwweDAzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUEVSU0lTVEVOVF9VTklRVUVfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDAyLDB4MDMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9TRU5TT1JfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MDMsMHgwMworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX01JTklNVU1fUkVQT1JUX0lOVEVSVkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwNCwweDAzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfU0VOU09SX01BTlVGQUNUVVJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDA1LDB4MDMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9TRU5TT1JfTU9ERUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MDYsMHgwMworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1NFTlNPUl9TRVJJQUxfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwNywweDAzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfU0VOU09SX0RFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDA4LDB4MDMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9TRU5TT1JfQ09OTkVDVElPTl9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MDksMHgwMyAvLyBOQXJ5CisvL2JlZ2luIGNvbm5lY3Rpb24gdHlwZSBzZWxlY3RvcnMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfSU5URUdSQVRFRF9TRUwgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MzAsMHgwOCAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfQVRUQUNIRURfU0VMICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MzEsMHgwOCAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DT05ORUNUSU9OX1RZUEVfUENfRVhURVJOQUxfU0VMICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MzIsMHgwOCAvLyBTZWwKKy8vZW5kIGNvbm5lY3Rpb24gdHlwZSBzZWxlY3RvcnMKKy8vYmVnaW4gY29ubmVjdGlvbiB0eXBlIGVudW1zCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ09OTkVDVElPTl9UWVBFX1BDX0lOVEVHUkFURURfRU5VTSAgICAgICAgICAgICAgICAgICAgMHgwMSAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ09OTkVDVElPTl9UWVBFX1BDX0FUVEFDSEVEX0VOVU0gICAgICAgICAgICAgICAgICAgICAgMHgwMiAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ09OTkVDVElPTl9UWVBFX1BDX0VYVEVSTkFMX0VOVU0gICAgICAgICAgICAgICAgICAgICAgMHgwMyAvLyBFbnVtCisvL2VuZCBjb25uZWN0aW9uIHR5cGUgZW51bXMKKy8vYmVnaW4gY29ubmVjdGlvbiB0eXBlIGRlcHJlY2F0ZWQgZW51bXMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9ERVBSRUNBVEVEX0NPTk5FQ1RJT05fVFlQRV9QQ19JTlRFR1JBVEVEX0VOVU0gICAgICAgICAweDAwIC8vIEVudW0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9ERVBSRUNBVEVEX0NPTk5FQ1RJT05fVFlQRV9QQ19BVFRBQ0hFRF9FTlVNICAgICAgICAgICAweDAxIC8vIEVudW0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9ERVBSRUNBVEVEX0NPTk5FQ1RJT05fVFlQRV9QQ19FWFRFUk5BTF9FTlVNICAgICAgICAgICAweDAyIC8vIEVudW0KKy8vZW5kIGNvbm5lY3Rpb24gdHlwZSBkZXByZWNhdGVkIGVudW1zCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfU0VOU09SX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDBBLDB4MDMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9IQVJEV0FSRV9SRVZJU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MEIsMHgwMworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0ZJUk1XQVJFX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwQywweDAzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVMRUFTRV9EQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDBELDB4MDMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRfSU5URVJWQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MEUsMHgwMworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0NIQU5HRV9TRU5TSVRJVklUWV9BQlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwRiwweDAzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfQ0hBTkdFX1NFTlNJVElWSVRZX1JBTkdFX1BDVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDEwLDB4MDMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9DSEFOR0VfU0VOU0lUSVZJVFlfUkVMX1BDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MTEsMHgwMworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0FDQ1VSQUNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxMiwweDAzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVTT0xVVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDEzLDB4MDMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SQU5HRV9NQVhJTVVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MTQsMHgwMworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JBTkdFX01JTklNVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxNSwweDAzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDE2LDB4MDMgLy8gTkFyeQorLy9iZWdpbiByZXBvcnRpbmcgc3RhdGUgc2VsZWN0b3JzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX05PX0VWRU5UU19TRUwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDQwLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9SRVBPUlRJTkdfU1RBVEVfT05fTk9ORV9TRUwgICAgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfTk9fRVZFTlRTX1NFTAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9BTExfRVZFTlRTX1NFTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg0MSwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfUkVQT1JUSU5HX1NUQVRFX09OX0FMTF9TRUwgICAgICAgIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX0FMTF9FVkVOVFNfU0VMCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX1RIUkVTSE9MRF9FVkVOVFNfU0VMICAgICAgICAgICAgICAgICAgMHgwQSwweDQyLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9SRVBPUlRJTkdfU1RBVEVfT05fVEhSRVNIT0xEX1NFTCAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfVEhSRVNIT0xEX0VWRU5UU19TRUwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfTk9fRVZFTlRTX1dBS0VfU0VMICAgICAgICAgICAgICAgICAgICAweDBBLDB4NDMsMHgwOCAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfQUxMX0VWRU5UU19XQUtFX1NFTCAgICAgICAgICAgICAgICAgICAweDBBLDB4NDQsMHgwOCAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfVEhSRVNIT0xEX0VWRU5UU19XQUtFX1NFTCAgICAgICAgICAgICAweDBBLDB4NDUsMHgwOCAvLyBTZWwKKy8vZW5kIHJlcG9ydGluZyBzdGF0ZSBzZWxlY3RvcnMKKy8vYmVnaW4gcmVwb3J0aW5nIHN0YXRlIGVudW1zCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX05PX0VWRU5UU19FTlVNICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9SRVBPUlRJTkdfU1RBVEVfT05fTk9ORV9FTlVNICAgICAgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfTk9fRVZFTlRTX0VOVU0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfQUxMX0VWRU5UU19FTlVNICAgICAgICAgICAgICAgICAgICAgICAweDAyIC8vIEVudW0KKyNkZWZpbmUgSElEX1VTQUdFX1JFUE9SVElOR19TVEFURV9PTl9BTExfRU5VTSAgICAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9BTExfRVZFTlRTX0VOVU0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfVEhSRVNIT0xEX0VWRU5UU19FTlVNICAgICAgICAgICAgICAgICAweDAzIC8vIEVudW0KKyNkZWZpbmUgSElEX1VTQUdFX1JFUE9SVElOR19TVEFURV9PTl9USFJFU0hPTERfRU5VTSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9USFJFU0hPTERfRVZFTlRTX0VOVU0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVBPUlRJTkdfU1RBVEVfTk9fRVZFTlRTX1NFTF9XQUtFX0VOVU0gICAgICAgICAgICAgICAgICAgMHgwNCAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUkVQT1JUSU5HX1NUQVRFX0FMTF9FVkVOVFNfU0VMX1dBS0VfRU5VTSAgICAgICAgICAgICAgICAgIDB4MDUgLy8gRW51bQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1JFUE9SVElOR19TVEFURV9USFJFU0hPTERfRVZFTlRTX1dBS0VfRU5VTSAgICAgICAgICAgIDB4MDYgLy8gRW51bQorLy9lbmQgcmVwb3J0aW5nIHN0YXRlIGVudW1zCisvL2JlZ2luIHJlcG9ydGluZyBzdGF0ZSBkZXByZWNhdGVkIGVudW1zCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfREVQUkVDQVRFRF9SRVBPUlRJTkdfU1RBVEVfTk9fRVZFTlRTX0VOVU0gICAgICAgICAgICAgMHgwMCAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9ERVBSRUNBVEVEX1JFUE9SVElOR19TVEFURV9PTl9OT05FX0VOVU0gICAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0RFUFJFQ0FURURfUkVQT1JUSU5HX1NUQVRFX05PX0VWRU5UU19FTlVNCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfREVQUkVDQVRFRF9SRVBPUlRJTkdfU1RBVEVfQUxMX0VWRU5UU19FTlVNICAgICAgICAgICAgMHgwMSAvLyBFbnVtCisjZGVmaW5lIEhJRF9VU0FHRV9ERVBSRUNBVEVEX1JFUE9SVElOR19TVEFURV9PTl9BTExfRU5VTSAgICAgICBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0RFUFJFQ0FURURfUkVQT1JUSU5HX1NUQVRFX0FMTF9FVkVOVFNfRU5VTQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0RFUFJFQ0FURURfUkVQT1JUSU5HX1NUQVRFX1RIUkVTSE9MRF9FVkVOVFNfRU5VTSAgICAgIDB4MDIgLy8gRW51bQorI2RlZmluZSBISURfVVNBR0VfREVQUkVDQVRFRF9SRVBPUlRJTkdfU1RBVEVfT05fVEhSRVNIT0xEX0VOVU0gSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9ERVBSRUNBVEVEX1JFUE9SVElOR19TVEFURV9USFJFU0hPTERfRVZFTlRTX0VOVU0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9ERVBSRUNBVEVEX1JFUE9SVElOR19TVEFURV9OT19FVkVOVFNfV0FLRV9FTlVNICAgICAgICAweDAzIC8vIEVudW0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9ERVBSRUNBVEVEX1JFUE9SVElOR19TVEFURV9BTExfRVZFTlRTX1dBS0VfRU5VTSAgICAgICAweDA0IC8vIEVudW0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9ERVBSRUNBVEVEX1JFUE9SVElOR19TVEFURV9USFJFU0hPTERfRVZFTlRTX1dBS0VfRU5VTSAweDA1IC8vIEVudW0KKy8vZW5kIHJlcG9ydGluZyBzdGF0ZSBkZXByZWNhdGVkIGVudW1zCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfU0FNUExJTkdfUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDE3LDB4MDMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9SRVNQT05TRV9DVVJWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MTgsMHgwMworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1BPV0VSX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxOSwweDAzIC8vIE5BcnkKKy8vYmVnaW4gcG93ZXIgc3RhdGUgc2VsZWN0b3JzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfVU5ERUZJTkVEX1NFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDUwLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDBfRlVMTF9QT1dFUl9TRUwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDUxLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDFfTE9XX1BPV0VSX1NFTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDUyLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDJfU1RBTkRCWV9XSVRIX1dBS0VfU0VMICAgICAgICAgICAgICAgICAgMHgwQSwweDUzLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDNfU0xFRVBfV0lUSF9XQUtFX1NFTCAgICAgICAgICAgICAgICAgICAgMHgwQSwweDU0LDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfUE9XRVJfU1RBVEVfRDRfUE9XRVJfT0ZGX1NFTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDU1LDB4MDggLy8gU2VsCisvL2VuZCBwb3dlciBzdGF0ZSBzZWxlY3RvcnMKKy8vYmVnaW4gcG93ZXIgc3RhdGUgZW51bXMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9VTkRFRklORURfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxIC8vIEVudW0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EMF9GVUxMX1BPV0VSX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAweDAyIC8vIEVudW0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EMV9MT1dfUE9XRVJfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAweDAzIC8vIEVudW0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EMl9TVEFOREJZX1dJVEhfV0FLRV9FTlVNICAgICAgICAgICAgICAgICAweDA0IC8vIEVudW0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9EM19TTEVFUF9XSVRIX1dBS0VfRU5VTSAgICAgICAgICAgICAgICAgICAweDA1IC8vIEVudW0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9QT1dFUl9TVEFURV9ENF9QT1dFUl9PRkZfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAweDA2IC8vIEVudW0KKy8vZW5kIHBvd2VyIHN0YXRlIGVudW1zCisvL2JlZ2luIGRlcHJlY2F0ZWQgcG93ZXIgc3RhdGUgZW51bXMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9ERVBSRUNBVEVEX1BPV0VSX1NUQVRFX1VOREVGSU5FRF9FTlVNICAgICAgICAgICAgICAgICAweDAwIC8vIEVudW0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9ERVBSRUNBVEVEX1BPV0VSX1NUQVRFX0QwX0ZVTExfUE9XRVJfRU5VTSAgICAgICAgICAgICAweDAxIC8vIEVudW0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9ERVBSRUNBVEVEX1BPV0VSX1NUQVRFX0QxX0xPV19QT1dFUl9FTlVNICAgICAgICAgICAgICAweDAyIC8vIEVudW0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9ERVBSRUNBVEVEX1BPV0VSX1NUQVRFX0QyX1NUQU5EQllfV0lUSF9XQUtFX0VOVU0gICAgICAweDAzIC8vIEVudW0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9ERVBSRUNBVEVEX1BPV0VSX1NUQVRFX0QzX1NMRUVQX1dJVEhfV0FLRV9FTlVNICAgICAgICAweDA0IC8vIEVudW0KKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9ERVBSRUNBVEVEX1BPV0VSX1NUQVRFX0Q0X1BPV0VSX09GRl9FTlVNICAgICAgICAgICAgICAweDA1IC8vIEVudW0KKy8vZW5kIGRlcHJlY2F0ZWQgcG93ZXIgc3RhdGUgZW51bXMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9ERVBSRUNBVEVEX0ZFQVRVUkVfUEFHRV9DT1VOVCAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MUEsMHgwMworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0RFUFJFQ0FURURfRkVBVFVSRV9QQUdFX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxQiwweDAzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfREVQUkVDQVRFRF9JTlBVVF9QQUdFX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDFDLDB4MDMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9ERVBSRUNBVEVEX0lOUFVUX1BBR0VfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MUQsMHgwMworCisvL2RhdGEgdHlwZSBsb2NhdGlvbgorLy9kYXRhIGZpZWxkIHVzYWdlcyAoaW5wdXQgcmVwb3J0KQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTE9DQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwMCwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MT0NBVElPTl9ERVNJUkVEX0FDQ1VSQUNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDAxLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xPQ0FUSU9OX0FMVElUVURFX0FOVEVOTkFfU0VBTEVWRUwgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MDIsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTE9DQVRJT05fRElGRkVSRU5USUFMX1JFRkVSRU5DRV9TVEFUSU9OX0lEICAgICAgICAgICAgICAgIDB4MEEsMHgwMywweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MT0NBVElPTl9BTFRJVElERV9FTElQU09JRF9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDA0LDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xPQ0FUSU9OX0FMVElUSURFX0VMSVBTT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MDUsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTE9DQVRJT05fQUxUSVRVREVfU0VBTEVWRUxfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwNiwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MT0NBVElPTl9BTFRJVFVERV9TRUFMRVZFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDA3LDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xPQ0FUSU9OX0RHUFNfREFUQV9BR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MDgsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTE9DQVRJT05fRVJST1JfUkFESVVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwOSwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MT0NBVElPTl9GSVhfUVVBTElUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDBBLDB4MDQgLy8gTkFyeQorLy9iZWdpbiBmaXggcXVhbGl0eSBzZWxlY3RvcnMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0ZJWF9RVUFMSVRZX05PX0ZJWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NzAsMHgwOCAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0ZJWF9RVUFMSVRZX0dQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NzEsMHgwOCAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0ZJWF9RVUFMSVRZX0RHUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NzIsMHgwOCAvLyBTZWwKKy8vZW5kIGZpeCBxdWFsaXR5IHNlbGVjdG9ycworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTE9DQVRJT05fRklYX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwQiwweDA0IC8vIE5BcnkKKy8vYmVnaW4gZml4IHR5cGUgc2VsZWN0b3JzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9GSVhfVFlQRV9OT19GSVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDgwLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9GSVhfVFlQRV9HUFNfU1BTX01PREVfRklYX1ZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDgxLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9GSVhfVFlQRV9ER1BTX1NQU19NT0RFX0ZJWF9WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDgyLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9GSVhfVFlQRV9HUFNfUFBTX01PREVfRklYX1ZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDgzLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9GSVhfVFlQRV9SRUFMX1RJTUVfS0lORU1BVElDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDg0LDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9GSVhfVFlQRV9GTE9BVF9SVEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDg1LDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9GSVhfVFlQRV9FU1RJTUFURURfREVBRF9SRUNLT05JTkcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDg2LDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9GSVhfVFlQRV9NQU5VQUxfSU5QVVRfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDg3LDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9GSVhfVFlQRV9TSU1VTEFUT1JfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDg4LDB4MDggLy8gU2VsCisvL2VuZCBmaXggdHlwZSBzZWxlY3RvcnMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xPQ0FUSU9OX0dFT0lEQUxfU0VQQVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MEMsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTE9DQVRJT05fR1BTX09QRVJBVElPTl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwRCwweDA0IC8vIE5BcnkKKy8vYmVnaW4gZ3BzIG9wZXJhdGlvbiBtb2RlIHNlbGVjdG9ycworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfR1BTX09QX01PREVfTUFOVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg5MCwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfR1BTX09QX01PREVfQVVUT01BVElDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg5MSwweDA4IC8vIFNlbAorLy9lbmQgZ3BzIG9wZXJhdGlvbiBtb2RlIHNlbGVjdG9ycworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTE9DQVRJT05fR1BTX1NFTEVDVElPTl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwRSwweDA0IC8vIE5BcnkKKy8vYmVnaW4gZ3BzIHNlbGVjdGlvbiBtb2RlIHNlbGVjdG9ycworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfR1BTX1NFTF9NT0RFX0FVVE9OT01PVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHhBMCwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfR1BTX1NFTF9NT0RFX0RHUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHhBMSwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfR1BTX1NFTF9NT0RFX0VTVElNQVRFRF9ERUFEX1JFQ0tPTklORyAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHhBMiwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfR1BTX1NFTF9NT0RFX01BTlVBTF9JTlBVVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHhBMywweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfR1BTX1NFTF9NT0RFX1NJTVVMQVRPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHhBNCwweDA4IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfR1BTX1NFTF9NT0RFX0RBVEFfTk9UX1ZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHhBNSwweDA4IC8vIFNlbAorLy9lbmQgZ3BzIHNlbGVjdGlvbiBtb2RlIHNlbGVjdG9ycworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTE9DQVRJT05fR1BTX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwRiwweDA0IC8vIE5BcnkKKy8vYmVnaW4gZ3BzIHN0YXR1cyBzZWxlY3RvcnMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0dQU19TVEFUVVNfREFUQV9WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4QjAsMHgwOCAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0dQU19TVEFUVVNfREFUQV9OT1RfVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4QjEsMHgwOCAvLyBTZWwKKy8vZW5kIGdwcyBzdGF0dXMgc2VsZWN0b3JzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MT0NBVElPTl9QT1NJVElPTl9ESUxVVElPTl9PRl9QUkVDSVNJT04gICAgICAgICAgICAgICAgICAgMHgwQSwweDEwLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xPQ0FUSU9OX0hPUklaT05UQUxfRElMVVRJT05fT0ZfUFJFQ0lTSU9OICAgICAgICAgICAgICAgICAweDBBLDB4MTEsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTE9DQVRJT05fVkVSVElDQUxfRElMVVRJT05fT0ZfUFJFQ0lTSU9OICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxMiwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MT0NBVElPTl9MQVRJVFVERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDEzLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xPQ0FUSU9OX0xPTkdJVFVERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MTQsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTE9DQVRJT05fVFJVRV9IRUFESU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxNSwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MT0NBVElPTl9NQUdORVRJQ19IRUFESU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDE2LDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xPQ0FUSU9OX01BR05FVElDX1ZBUklBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MTcsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTE9DQVRJT05fU1BFRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxOCwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MT0NBVElPTl9TQVRFTExJVEVTX0lOX1ZJRVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDE5LDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xPQ0FUSU9OX1NBVEVMTElURVNfSU5fVklFV19BWklNVVRIICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MUEsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTE9DQVRJT05fU0FURUxMSVRFU19JTl9WSUVXX0VMRVZBVElPTiAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxQiwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MT0NBVElPTl9TQVRFTExJVEVTX0lOX1ZJRVdfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDFDLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xPQ0FUSU9OX1NBVEVMTElURVNfSU5fVklFV19QUk5zICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MUQsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTE9DQVRJT05fU0FURUxMSVRFU19JTl9WSUVXX1NUTl9SQVRJTyAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgxRSwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MT0NBVElPTl9TQVRFTExJVEVTX1VTRURfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDFGLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xPQ0FUSU9OX1NBVEVMTElURVNfVVNFRF9QUk5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MjAsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTE9DQVRJT05fTk1FQV9TRU5URU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgyMSwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MT0NBVElPTl9BRERSRVNTX0xJTkVfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDIyLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xPQ0FUSU9OX0FERFJFU1NfTElORV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MjMsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTE9DQVRJT05fQ0lUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgyNCwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MT0NBVElPTl9TVEFURV9PUl9QUk9WSU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDI1LDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xPQ0FUSU9OX0NPVU5UUllfT1JfUkVHSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MjYsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTE9DQVRJT05fUE9TVEFMX0NPREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgyNywweDA0CisvL3Byb3BlcnR5IHVzYWdlcyAoZ2V0L3NldCBmZWF0dXJlIHJlcG9ydCkKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9MT0NBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MkEsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0xPQ0FUSU9OX0RFU0lSRURfQUNDVVJBQ1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgyQiwweDA0IC8vIE5BcnkKKy8vYmVnaW4gbG9jYXRpb24gZGVzaXJlZCBhY2N1cmFjeSBzZWxlY3RvcnMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9ERVNJUkVEX0FDQ1VSQUNZX0RFRkFVTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NjAsMHgwOCAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9ERVNJUkVEX0FDQ1VSQUNZX0hJR0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NjEsMHgwOCAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9ERVNJUkVEX0FDQ1VSQUNZX01FRElVTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NjIsMHgwOCAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9ERVNJUkVEX0FDQ1VSQUNZX0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NjMsMHgwOCAvLyBTZWwKKy8vZW5kIGxvY2F0aW9uIGRlc2lyZWQgYWNjdXJhY3kgc2VsZWN0b3JzCisKKy8vZGF0YSB0eXBlIGVudmlyb25tZW50YWwKKy8vZGF0YSBmaWVsZCB1c2FnZXMgKGlucHV0IHJlcG9ydCkKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0VOVklST05NRU5UQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MzAsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfRU5WSVJPTk1FTlRBTF9BVE1PU1BIRVJJQ19QUkVTU1VSRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgzMSwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9FTlZJUk9OTUVOVEFMX1JFRkVSRU5DRV9QUkVTU1VSRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDMyLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0VOVklST05NRU5UQUxfUkVMQVRJVkVfSFVNSURJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MzMsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfRU5WSVJPTk1FTlRBTF9URU1QRVJBVFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgzNCwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9FTlZJUk9OTUVOVEFMX1dJTkRfRElSRUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDM1LDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0VOVklST05NRU5UQUxfV0lORF9TUEVFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MzYsMHgwNAorLy9wcm9wZXJ0eSB1c2FnZXMgKGdldC9zZXQgZmVhdHVyZSByZXBvcnQpCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfRU5WSVJPTk1FTlRBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDQwLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9FTlZJUk9OTUVOVEFMX1JFRkVSRU5DRV9QUkVTU1VSRSAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NDEsMHgwNAorCisvL2RhdGEgdHlwZSBtb3Rpb24KKy8vZGF0YSBmaWVsZCB1c2FnZXMgKGlucHV0IHJlcG9ydCkKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NTAsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9USU9OX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1MSwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT1RJT05fQUNDRUxFUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDUyLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PVElPTl9BQ0NFTEVSQVRJT05fWF9BWElTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NTMsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9USU9OX0FDQ0VMRVJBVElPTl9ZX0FYSVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1NCwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT1RJT05fQUNDRUxFUkFUSU9OX1pfQVhJUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDU1LDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PVElPTl9BTkdVTEFSX1ZFTE9DSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NTYsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9USU9OX0FOR1VMQVJfVkVMT0NJVFlfWF9BWElTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1NywweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT1RJT05fQU5HVUxBUl9WRUxPQ0lUWV9ZX0FYSVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDU4LDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PVElPTl9BTkdVTEFSX1ZFTE9DSVRZX1pfQVhJUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NTksMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9USU9OX0FOR1VMQVJfUE9TSVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1QSwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT1RJT05fQU5HVUxBUl9QT1NJVElPTl9YX0FYSVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDVCLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PVElPTl9BTkdVTEFSX1BPU0lUSU9OX1lfQVhJUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NUMsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTU9USU9OX0FOR1VMQVJfUE9TSVRJT05fWl9BWElTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1RCwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NT1RJT05fU1BFRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDVFLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01PVElPTl9JTlRFTlNJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NUYsMHgwNAorCisvL2RhdGEgdHlwZSBvcmllbnRhdGlvbgorLy9kYXRhIGZpZWxkIHVzYWdlcyAoaW5wdXQgcmVwb3J0KQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg3MCwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9NQUdORVRJQ19IRUFESU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDcxLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX01BR05FVElDX0hFQURJTkdfWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NzIsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fTUFHTkVUSUNfSEVBRElOR19ZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg3MywweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9NQUdORVRJQ19IRUFESU5HX1ogICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDc0LDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX0NPTVBFTlNBVEVEX01BR05FVElDX05PUlRIICAgICAgICAgICAgICAgICAgICAweDBBLDB4NzUsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fQ09NUEVOU0FURURfVFJVRV9OT1JUSCAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg3NiwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9NQUdORVRJQ19OT1JUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDc3LDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX1RSVUVfTk9SVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NzgsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fRElTVEFOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg3OSwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9ESVNUQU5DRV9YICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDdBLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX0RJU1RBTkNFX1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4N0IsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fRElTVEFOQ0VfWiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg3QywweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9ESVNUQU5DRV9PVVRfT0ZfUkFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDdELDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX1RJTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4N0UsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fVElMVF9YICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg3RiwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9USUxUX1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDgwLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX1RJTFRfWiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4ODEsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fUk9UQVRJT05fTUFUUklYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg4MiwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9RVUFURVJOSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDgzLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX01BR05FVElDX0ZMVVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4ODQsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fTUFHTkVUSUNfRkxVWF9YX0FYSVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg4NSwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTl9NQUdORVRJQ19GTFVYX1lfQVhJUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDg2LDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX09SSUVOVEFUSU9OX01BR05FVElDX0ZMVVhfWl9BWElTICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4ODcsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fTUFHTkVUT01FVEVSX0FDQ1VSQUNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4ODgsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fTUFHTkVUT01FVEVSX0FDQ1VSQUNZX0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4RTAsMHgwOAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fTUFHTkVUT01FVEVSX0FDQ1VSQUNZX01FRElVTSAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4RTEsMHgwOAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfT1JJRU5UQVRJT05fTUFHTkVUT01FVEVSX0FDQ1VSQUNZX0hJR0ggICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4RTIsMHgwOAorCisvL2RhdGEgdHlwZSBtZWNoYW5pY2FsCisvL2RhdGEgZmllbGQgdXNhZ2VzIChpbnB1dCByZXBvcnQpCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NRUNIQU5JQ0FMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDkwLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01FQ0hBTklDQUxfQk9PTEVBTl9TV0lUQ0hfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4OTEsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTUVDSEFOSUNBTF9CT09MRUFOX1NXSVRDSF9BUlJBWV9TVEFURVMgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg5MiwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NRUNIQU5JQ0FMX01VTFRJVkFMVUVfU1dJVENIX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDkzLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01FQ0hBTklDQUxfRk9SQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4OTQsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTUVDSEFOSUNBTF9BQlNPTFVURV9QUkVTU1VSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg5NSwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NRUNIQU5JQ0FMX0dBVUdFX1BSRVNTVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDk2LDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01FQ0hBTklDQUxfU1RSQUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4OTcsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTUVDSEFOSUNBTF9XRUlHSFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg5OCwweDA0CisvL3Byb3BlcnR5IHVzYWdlcyAoZ2V0L3NldCBmZWF0dXJlIHJlcG9ydCkKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9NRUNIQU5JQ0FMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4QTAsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX01FQ0hBTklDQUxfVklCUkFUSU9OX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHhBMSwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9NRUNIQU5JQ0FMX1ZJQlJBVElPTl9TUEVFRF9GT1JXQVJEICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweEEyLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX01FQ0hBTklDQUxfVklCUkFUSU9OX1NQRUVEX0JBQ0tXQVJEICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4QTMsMHgwNAorCisvL2RhdGEgdHlwZSBiaW9tZXRyaWMKKy8vZGF0YSBmaWVsZCB1c2FnZXMgKGlucHV0IHJlcG9ydCkKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0JJT01FVFJJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4QjAsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfQklPTUVUUklDX0hVTUFOX1BSRVNFTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHhCMSwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9CSU9NRVRSSUNfSFVNQU5fUFJPWElNSVRZX1JBTkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweEIyLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0JJT01FVFJJQ19IVU1BTl9QUk9YSU1JVFlfT1VUX09GX1JBTkdFICAgICAgICAgICAgICAgICAgICAweDBBLDB4QjMsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfQklPTUVUUklDX0hVTUFOX1RPVUNIX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHhCNCwweDA0CisKKy8vZGF0YSB0eXBlIGxpZ2h0IHNlbnNvcgorLy9kYXRhIGZpZWxkIHVzYWdlcyAoaW5wdXQgcmVwb3J0KQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTElHSFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHhEMCwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MSUdIVF9JTExVTUlOQU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweEQxLDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xJR0hUX0NPTE9SX1RFTVBFUkFUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4RDIsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTElHSFRfQ0hST01BVElDSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHhEMywweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9MSUdIVF9DSFJPTUFUSUNJVFlfWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweEQ0LDB4MDQKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0xJR0hUX0NIUk9NQVRJQ0lUWV9ZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4RDUsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfTElHSFRfQ09OU1VNRVJfSVJfU0VOVEVOQ0VfUkVDRUlWRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHhENiwweDA0CisvL3Byb3BlcnR5IHVzYWdlcyAoZ2V0L3NldCBmZWF0dXJlIHJlcG9ydCkKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9MSUdIVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4RTAsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0xJR0hUX0NPTlNVTUVSX0lSX1NFTlRFTkNFX1NFTkQgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHhFMSwweDA0CisKKy8vZGF0YSB0eXBlIHNjYW5uZXIKKy8vZGF0YSBmaWVsZCB1c2FnZXMgKGlucHV0IHJlcG9ydCkKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX1NDQU5ORVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4RjAsMHgwNAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfU0NBTk5FUl9SRklEX1RBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHhGMSwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9TQ0FOTkVSX05GQ19TRU5URU5DRV9SRUNFSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweEYyLDB4MDQKKy8vcHJvcGVydHkgdXNhZ2VzIChnZXQvc2V0IGZlYXR1cmUgcmVwb3J0KQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1NDQU5ORVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHhGOCwweDA0CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfU0NBTk5FUl9ORkNfU0VOVEVOQ0VfU0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweEY5LDB4MDQKKworLy9kYXRhIHR5cGUgZWxlY3RyaWNhbAorLy9kYXRhIGZpZWxkIHVzYWdlcyAoaW5wdXQgcmVwb3J0KQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfRUxFQ1RSSUNBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwMCwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9FTEVDVFJJQ0FMX0NBUEFDSVRBTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDAxLDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0VMRUNUUklDQUxfQ1VSUkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MDIsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfRUxFQ1RSSUNBTF9QT1dFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwMywweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9FTEVDVFJJQ0FMX0lORFVDVEFOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDA0LDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0VMRUNUUklDQUxfUkVTSVNUQU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MDUsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfRUxFQ1RSSUNBTF9WT0xUQUdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwNiwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9FTEVDVFJJQ0FMX0ZSRVFVRU5DWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDA3LDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0VMRUNUUklDQUxfUEVSSU9EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MDgsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfRUxFQ1RSSUNBTF9QRVJDRU5UX09GX1JBTkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgwOSwweDA1CisKKy8vZGF0YSB0eXBlIHRpbWUKKy8vZGF0YSBmaWVsZCB1c2FnZXMgKGlucHV0IHJlcG9ydCkKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX1RJTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MjAsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfVElNRV9ZRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgyMSwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9USU1FX01PTlRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDIyLDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX1RJTUVfREFZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MjMsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfVElNRV9EQVlfT0ZfV0VFSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgyNCwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9USU1FX0hPVVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDI1LDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX1RJTUVfTUlOVVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MjYsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfVElNRV9TRUNPTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgyNywweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9USU1FX01JTExJU0VDT05EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDI4LDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX1RJTUVfVElNRVNUQU1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MjksMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfVElNRV9KVUxJQU5fREFZX09GX1lFQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgyQSwweDA1CisvL3Byb3BlcnR5IHVzYWdlcyAoZ2V0L3NldCBmZWF0dXJlIHJlcG9ydCkKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9USU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4MzAsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1RJTUVfVElNRV9aT05FX09GRlNFVF9GUk9NX1VUQyAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgzMSwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfVElNRV9USU1FX1pPTkVfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDMyLDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9USU1FX0RBWUxJR0hUX1NBVklOR1NfVElNRV9PQlNFUlZFRCAgICAgICAgICAgICAgICAgICAweDBBLDB4MzMsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX1RJTUVfVElNRV9UUklNX0FESlVTVE1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHgzNCwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfVElNRV9BUk1fQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDM1LDB4MDUKKworLy9kYXRhIHR5cGUgY3VzdG9tCisvL2RhdGEgZmllbGQgdXNhZ2VzIChpbnB1dCByZXBvcnQpCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDQwLDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9VU0FHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NDEsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX0JPT0xFQU5fQVJSQVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg0MiwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDQzLDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NDQsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg0NSwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDQ2LDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NDcsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg0OCwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDQ5LDB4MDUKKworI2lmIDEgLy9kZWZpbmUgdmVuZG9yLXNwZWNpZmljIChub24tc3BlYykgY3VzdG9tIGRhdGFmaWVsZHMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV83ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NEEsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg0QiwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDRDLDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8xMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NEQsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg0RSwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDRGLDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8xMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NTAsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1MSwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDUyLDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8xNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NTMsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1NCwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDU1LDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8xOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NTYsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1NywweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDU4LDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8yMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NTksMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1QSwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDVCLDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8yNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NUMsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfQ1VTVE9NX1ZBTFVFXzI2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1RCwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9DVVNUT01fVkFMVUVfMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDVFLDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0NVU1RPTV9WQUxVRV8yOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NUYsMHgwNQorI2VuZGlmCisKKy8vZGF0YSB0eXBlIGdlbmVyaWMKKy8vZGF0YSBmaWVsZCB1c2FnZXMgKGlucHV0IHJlcG9ydCkKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0dFTkVSSUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NjAsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfR0VORVJJQ19HVUlEX09SX1BST1BFUlRZS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg2MSwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9HRU5FUklDX0NBVEVHT1JZX0dVSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDYyLDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0dFTkVSSUNfVFlQRV9HVUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NjMsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfR0VORVJJQ19FVkVOVF9QUk9QRVJUWUtFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg2NCwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9HRU5FUklDX1BST1BFUlRZX1BST1BFUlRZS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDY1LDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0dFTkVSSUNfREFUQUZJRUxEX1BST1BFUlRZS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NjYsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfR0VORVJJQ19FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg2NywweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9HRU5FUklDX1BST1BFUlRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDY4LDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0dFTkVSSUNfREFUQUZJRUxEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NjksMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfRU5VTUVSQVRPUl9UQUJMRV9ST1dfSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg2QSwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9FTlVNRVJBVE9SX1RBQkxFX1JPV19DT1VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDZCLDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0dFTkVSSUNfR1VJRF9PUl9QUk9QRVJUWUtFWV9LSU5EICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NkMsMHgwNSAvLyBOQXJ5CisvL2JlZ2luIEdvclBLIGtpbmQgc2VsZWN0b3JzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfR09SUEtfS0lORF9DQVRFR09SWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweEQwLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfR09SUEtfS0lORF9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweEQxLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfR09SUEtfS0lORF9FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweEQyLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfR09SUEtfS0lORF9QUk9QRVJUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweEQzLDB4MDggLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfR09SUEtfS0lORF9EQVRBRklFTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweEQ0LDB4MDggLy8gU2VsCisvL2VuZCBHb3JQSyBraW5kIHNlbGVjdG9ycworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfR0VORVJJQ19HVUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg2RCwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9HRU5FUklDX1BST1BFUlRZS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDZFLDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0dFTkVSSUNfVE9QX0xFVkVMX0NPTExFQ1RJT05fSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NkYsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfR0VORVJJQ19SRVBPUlRfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg3MCwweDA1CisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9HRU5FUklDX1JFUE9SVF9JVEVNX1BPU0lUSU9OX0lOREVYICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDcxLDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0dFTkVSSUNfRklSTVdBUkVfVkFSVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NzIsMHgwNSAvLyBOQXJ5CisvL2JlZ2luIGZpcm13YXJlIHZhcnR5cGUgc2VsZWN0b3JzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9OVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDAwLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDAxLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9VSTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDAyLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9JMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDAzLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9VSTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDA0LDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9JMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDA1LDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9VSTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDA2LDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9JNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDA3LDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9VSTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDA4LDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9JOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDA5LDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9SNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDBBLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9SOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDBCLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9XU1RSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDBDLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9TVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDBELDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9DTFNJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDBFLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9WRUNUT1JfVlRfVUkxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDBGLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMTZFMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDEwLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMTZFMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDExLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMTZFMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDEyLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMTZFMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDEzLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMTZFNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDE0LDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMTZFNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDE1LDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMTZFNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDE2LDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMTZFNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDE3LDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMTZFOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDE4LDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMTZFOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDE5LDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMTZFQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDFBLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMTZFQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDFCLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMTZFQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDFDLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMTZFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDFELDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMTZFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDFFLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMTZFRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDFGLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMzJFMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDIwLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMzJFMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDIxLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMzJFMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDIyLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMzJFMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDIzLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMzJFNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDI0LDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMzJFNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDI1LDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMzJFNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDI2LDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMzJFNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDI3LDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMzJFOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDI4LDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMzJFOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDI5LDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMzJFQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDJBLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMzJFQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDJCLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMzJFQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDJDLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMzJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDJELDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMzJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDJFLDB4MDkgLy8gU2VsCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfRklSTVdBUkVfVkFSVFlQRV9WVF9GMzJFRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDJGLDB4MDkgLy8gU2VsCisvL2VuZCBmaXJtd2FyZSB2YXJ0eXBlIHNlbGVjdG9ycworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfR0VORVJJQ19VTklUX09GX01FQVNVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg3MywweDA1IC8vIE5BcnkKKy8vYmVnaW4gdW5pdCBvZiBtZWFzdXJlIHNlbGVjdG9ycworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9OT1RfU1BFQ0lGSUVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg0MCwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9MVVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg0MSwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9ERUdSRUVTX0tFTFZJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg0MiwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9ERUdSRUVTX0NFTFNJVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg0MywweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9QQVNDQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg0NCwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9ORVdUT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg0NSwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9NRVRFUlNfUEVSX1NFQ09ORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg0NiwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9LSUxPR1JBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg0NywweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9NRVRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg0OCwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9NRVRFUlNfUEVSX1NFQ19TUVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg0OSwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9GQVJBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg0QSwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9BTVBFUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg0QiwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9XQVRUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg0QywweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9IRU5SWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg0RCwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9PSE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg0RSwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9WT0xUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg0RiwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9IRVJUWiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1MCwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9CQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1MSwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9ERUdSRUVTX0FOVElfQ0xPQ0tXSVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1MiwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9ERUdSRUVTX0NMT0NLV0lTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1MywweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9ERUdSRUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1NCwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9ERUdSRUVTX1BFUl9TRUNPTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1NSwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9ERUdSRUVTX1BFUl9TRUNfU1FSRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1NiwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9LTk9UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1NywweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9QRVJDRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1OCwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9TRUNPTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1OSwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9NSUxMSVNFQ09ORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1QSwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1QiwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1QywweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9NSUxMSUdBVVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1RCwweDA5IC8vIFNlbAorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0dFTkVSSUNfVU5JVF9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg1RSwweDA5IC8vIFNlbAorLy9lbmQgdW5pdCBvZiBtZWFzdXJlIHNlbGVjdG9ycworI2RlZmluZSBISURfVVNBR0VfU0VOU09SX0RBVEFfR0VORVJJQ19VTklUX0VYUE9ORU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg3NCwweDA1IC8vIE5BcnkKKy8vYmVnaW4gdW5pdCBleHBvbmVudCBzZWxlY3RvcnMKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX0VYUE9ORU5UXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NzAsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX0VYUE9ORU5UXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NzEsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX0VYUE9ORU5UXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NzIsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX0VYUE9ORU5UXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NzMsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX0VYUE9ORU5UXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NzQsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX0VYUE9ORU5UXzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NzUsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX0VYUE9ORU5UXzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NzYsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX0VYUE9ORU5UXzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NzcsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX0VYUE9ORU5UXzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NzgsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX0VYUE9ORU5UXzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NzksMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX0VYUE9ORU5UX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4N0EsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX0VYUE9ORU5UX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4N0IsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX0VYUE9ORU5UX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4N0MsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX0VYUE9ORU5UX0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4N0QsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX0VYUE9ORU5UX0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4N0UsMHgwOSAvLyBTZWwKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9HRU5FUklDX0VYUE9ORU5UX0YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4N0YsMHgwOSAvLyBTZWwKKy8vZW5kIHVuaXQgZXhwb25lbnQgc2VsZWN0b3JzCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfREFUQV9HRU5FUklDX1JFUE9SVF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDc1LDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0dFTkVSSUNfUkVQT1JUX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4NzYsMHgwNQorLy9wcm9wZXJ0eSB1c2FnZXMgKGdldC9zZXQgZmVhdHVyZSByZXBvcnQpCisjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfUFJPUEVSVFlfR0VORVJJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwweDgwLDB4MDUKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9QUk9QRVJUWV9FTlVNRVJBVE9SX1RBQkxFX1JPV19JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLDB4ODEsMHgwNQorI2RlZmluZSBISURfVVNBR0VfU0VOU09SX1BST1BFUlRZX0VOVU1FUkFUT1JfVEFCTEVfUk9XX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsMHg4MiwweDA1CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gT3RoZXIgSElEIGRlZmluaXRpb25zCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vTk9URTogVGhlc2UgZGVmaW5pdGlvbnMgYXJlIGRlc2lnbmVkIHRvIHBlcm1pdCBjb21waWxpbmcgdGhlIEhJRCByZXBvcnQgZGVzY3JpcHRvcnMKKy8vIHdpdGggc29tZXdoYXQgc2VsZi1leHBsYW5hdG9yeSBpbmZvcm1hdGlvbiB0byBoZWxwIHJlYWRhYmlsaXR5IGFuZCByZWR1Y2UgZXJyb3JzCisKKy8vaW5wdXQsb3V0cHV0LGZlYXR1cmUgZmxhZ3MKKyNkZWZpbmUgRGF0YV9BcnJfQWJzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgQ29uc3RfQXJyX0FicyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgRGF0YV9WYXJfQWJzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQ29uc3RfVmFyX0FicyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgRGF0YV9WYXJfUmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYKKy8vY29sbGVjdGlvbiBmbGFncworI2RlZmluZSBQaHlzaWNhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBBcHBsaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBMb2dpY2FsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBOYW1lZEFycmF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBVc2FnZVN3aXRjaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNQorLy9vdGhlcgorI2RlZmluZSBVbmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAorCisjZGVmaW5lIEhJRF9VU0FHRV9QQUdFKGEpICAgICAgICAgICAgICAgICAgICAgICAweDA1LGEKKyNkZWZpbmUgSElEX1VTQUdFKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksYQorI2RlZmluZSBISURfVVNBR0UxNihhLGIpICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSxhLGIKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBKGEsYikgICAgICAgICAgICAgIGF8YiAgICAgLy9UaGlzIG9yLXMgdGhlIG1vZCBpbnRvIHVzYWdlCisjZGVmaW5lIEhJRF9DT0xMRUNUSU9OKGEpICAgICAgICAgICAgICAgICAgICAgICAweEExLGEKKyNkZWZpbmUgSElEX1JFUE9SVF9JRChhKSAgICAgICAgICAgICAgICAgICAgICAgIDB4ODUsYQorI2RlZmluZSBISURfUkVQT1JUX1NJWkUoYSkgICAgICAgICAgICAgICAgICAgICAgMHg3NSxhCisjZGVmaW5lIEhJRF9SRVBPUlRfQ09VTlQoYSkgICAgICAgICAgICAgICAgICAgICAweDk1LGEKKyNkZWZpbmUgSElEX1VTQUdFX01JTl84KGEpICAgICAgICAgICAgICAgICAgICAgIDB4MTksYQorI2RlZmluZSBISURfVVNBR0VfTUlOXzE2KGEsYikgICAgICAgICAgICAgICAgICAgMHgxQSxhLGIKKyNkZWZpbmUgSElEX1VTQUdFX01BWF84KGEpICAgICAgICAgICAgICAgICAgICAgIDB4MjksYQorI2RlZmluZSBISURfVVNBR0VfTUFYXzE2KGEsYikgICAgICAgICAgICAgICAgICAgMHgyQSxhLGIKKyNkZWZpbmUgSElEX0xPR0lDQUxfTUlOXzgoYSkgICAgICAgICAgICAgICAgICAgIDB4MTUsYQorI2RlZmluZSBISURfTE9HSUNBTF9NSU5fMTYoYSxiKSAgICAgICAgICAgICAgICAgMHgxNixhLGIKKyNkZWZpbmUgSElEX0xPR0lDQUxfTUlOXzMyKGEsYixjLGQpICAgICAgICAgICAgIDB4MTcsYSxiLGMsZAorI2RlZmluZSBISURfTE9HSUNBTF9NQVhfOChhKSAgICAgICAgICAgICAgICAgICAgMHgyNSxhCisjZGVmaW5lIEhJRF9MT0dJQ0FMX01BWF8xNihhLGIpICAgICAgICAgICAgICAgICAweDI2LGEsYgorI2RlZmluZSBISURfTE9HSUNBTF9NQVhfMzIoYSxiLGMsZCkgICAgICAgICAgICAgMHgyNyxhLGIsYyxkCisjZGVmaW5lIEhJRF9VTklUX0VYUE9ORU5UKGEpICAgICAgICAgICAgICAgICAgICAweDU1LGEKKyNkZWZpbmUgSElEX0lOUFVUKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODEsYQorI2RlZmluZSBISURfT1VUUFVUKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5MSxhCisjZGVmaW5lIEhJRF9GRUFUVVJFKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAweEIxLGEKKyNkZWZpbmUgSElEX0VORF9DT0xMRUNUSU9OICAgICAgICAgICAgICAgICAgICAgIDB4QzAKKworI2VuZGlmIC8vIEhJRFVUSUxfVEVTVF9ISURTRU5TT1JTUEVDX0gKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRVdGlscy90ZXN0L1RyaVN0YXRlVGVzdC5jcHAgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvdGVzdC9UcmlTdGF0ZVRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkY2RmMGIKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkVXRpbHMvdGVzdC9UcmlTdGF0ZVRlc3QuY3BwCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlICJUcmlTdGF0ZS5oIgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCit1c2luZyBIaWRVdGlsOjpUcmlTdGF0ZTsKK3R5cGVkZWYgVHJpU3RhdGU8dWludDMyX3Q+IHRyaV91aW50MzJfdDsKK3R5cGVkZWYgVHJpU3RhdGU8aW50MzJfdD4gdHJpX2ludDMyX3Q7Cit0eXBlZGVmIFRyaVN0YXRlPGludDE2X3Q+IHRyaV9pbnQxNl90OworCitURVNUKFRyaVN0YXRlVGVzdCwgQ29uc3RydWN0b3IpIHsKKyAgICB0cmlfdWludDMyX3QgYTsKKyAgICBFWFBFQ1RfRkFMU0UoYS5pc1NldCgpKTsKKworICAgIGEgKz0gMTsKKyAgICBFWFBFQ1RfRkFMU0UoYS5pc1NldCgpKTsKKworICAgIGEgLT0gMTsKKyAgICBFWFBFQ1RfRkFMU0UoYS5pc1NldCgpKTsKKworICAgIGEgKj0gMTsKKyAgICBFWFBFQ1RfRkFMU0UoYS5pc1NldCgpKTsKKworICAgIGEgLz0gMTsKKyAgICBFWFBFQ1RfRkFMU0UoYS5pc1NldCgpKTsKKworICAgIHRyaV91aW50MzJfdCBiOworICAgIGIgPSBhOworICAgIEVYUEVDVF9GQUxTRShiLmlzU2V0KCkpOworCisgICAgYSA9IDE7CisgICAgRVhQRUNUX1RSVUUoYS5pc1NldCgpKTsKKworICAgIGIgPSBhOworICAgIEVYUEVDVF9UUlVFKGIuaXNTZXQoKSk7CisKKyAgICBhLmNsZWFyKCk7CisgICAgRVhQRUNUX0ZBTFNFKGEuaXNTZXQoKSk7CisgICAgRVhQRUNUX1RSVUUoYi5pc1NldCgpKTsKKworICAgIHRyaV91aW50MzJfdCBjKGIpOworICAgIEVYUEVDVF9UUlVFKGMuaXNTZXQoKSk7CisKKyAgICBjLmNsZWFyKCk7CisgICAgRVhQRUNUX0ZBTFNFKGMuaXNTZXQoKSk7CisKKyAgICB0cmlfdWludDMyX3QgZChhKTsKKyAgICBFWFBFQ1RfRkFMU0UoYy5pc1NldCgpKTsKK30KKworVEVTVChUcmlTdGF0ZVRlc3QsIEluY0FuZERlY09wZXJhdGlvbikgeworICAgIHRyaV9pbnQzMl90IGEoMSk7CisKKyAgICBFWFBFQ1RfRVEoMiwgKCsrYSkuZ2V0KDApKTsKKyAgICBFWFBFQ1RfRVEoMiwgKGErKykuZ2V0KDApKTsKKyAgICBFWFBFQ1RfRVEoMywgYS5nZXQoMCkpOworCisgICAgRVhQRUNUX0VRKDIsICgtLWEpLmdldCgwKSk7CisgICAgRVhQRUNUX0VRKDIsIChhLS0pLmdldCgwKSk7CisgICAgRVhQRUNUX0VRKDEsIGEuZ2V0KDApKTsKKworICAgIHRyaV91aW50MzJfdCBiOworICAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDx1aW50MzJfdD4oMTAwKSwgKCsrYikuZ2V0KDEwMCkpOworICAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDx1aW50MzJfdD4oMTAxKSwgKGIrKykuZ2V0KDEwMSkpOworICAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDx1aW50MzJfdD4oMTAyKSwgYi5nZXQoMTAyKSk7CisgICAgRVhQRUNUX0ZBTFNFKGIuaXNTZXQoKSk7CisKKyAgICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KDEwMyksICgtLWIpLmdldCgxMDMpKTsKKyAgICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KDEwNCksIChiLS0pLmdldCgxMDQpKTsKKyAgICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KDEwNSksIGIuZ2V0KDEwNSkpOworICAgIEVYUEVDVF9GQUxTRShiLmlzU2V0KCkpOworfQorCitURVNUKFRyaVN0YXRlVGVzdCwgQ29tcGFyaXNvbikgeworICAgIHRyaV9pbnQzMl90IGEoMSk7CisgICAgdHJpX2ludDMyX3QgYigxKTsKKyAgICB0cmlfaW50MzJfdCBjKDIpOworICAgIHRyaV9pbnQzMl90IGQ7CisKKyAgICBFWFBFQ1RfRVEoYSwgYik7CisgICAgRVhQRUNUX0ZBTFNFKChhICE9IGIpKTsKKyAgICBFWFBFQ1RfVFJVRSghKGEgIT0gYikpOworICAgIEVYUEVDVF9ORSgtMSwgYSk7CisKKyAgICBFWFBFQ1RfTFQoYSwgYyk7CisgICAgRVhQRUNUX0xUKGEsIDMpOworCisgICAgRVhQRUNUX0dUKGMsIGIpOworICAgIEVYUEVDVF9HVChjLCAwKTsKKworICAgIEVYUEVDVF9MRShhLCAxKTsKKyAgICBFWFBFQ1RfTEUoYSwgYyk7CisgICAgRVhQRUNUX0xFKGEsIDMpOworICAgIEVYUEVDVF9MRShhLCBiKTsKKworICAgIEVYUEVDVF9HRShjLCBiKTsKKyAgICBFWFBFQ1RfR0UoYiwgYSk7CisgICAgRVhQRUNUX0dFKGMsIDApOworICAgIEVYUEVDVF9HRShjLCAyKTsKKworICAgIEVYUEVDVF9GQUxTRSgoYSA9PSBkKS5pc1NldCgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoKGEgPj0gZCkuaXNTZXQoKSk7CisgICAgRVhQRUNUX0ZBTFNFKChhIDw9IGQpLmlzU2V0KCkpOworICAgIEVYUEVDVF9GQUxTRSgoYSAhPSBkKS5pc1NldCgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoKGEgPiBkKS5pc1NldCgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoKGEgPCBkKS5pc1NldCgpKTsKKworICAgIC8vRVhQRUNUX0VRKGEsIGQpOyAvLyB3aWxsIGNhdXNlIHJ1bnRpbWUgZmFpbHVyZQorICAgIC8vIGR1ZSB0byBjb252ZXJ0aW5nIGEgbm90LXNldCBUcmlTdGF0ZTxib29sPiB0byBib29sCit9CisKK1RFU1QoVHJpU3RhdGVUZXN0LCBDb21wb3VuZEFzc2lnbikgeworICAgIHRyaV91aW50MzJfdCB4OworCisgICAgeCArPSAxMDsKKyAgICBFWFBFQ1RfRkFMU0UoeC5pc1NldCgpKTsKKyAgICB4IC09IDEwOworICAgIEVYUEVDVF9GQUxTRSh4LmlzU2V0KCkpOworICAgIHggKj0gMTA7CisgICAgRVhQRUNUX0ZBTFNFKHguaXNTZXQoKSk7CisgICAgeCAvPSAxMDsKKyAgICBFWFBFQ1RfRkFMU0UoeC5pc1NldCgpKTsKKyAgICB4ICY9IDEwOworICAgIEVYUEVDVF9GQUxTRSh4LmlzU2V0KCkpOworICAgIHggfD0gMTA7CisgICAgRVhQRUNUX0ZBTFNFKHguaXNTZXQoKSk7CisgICAgeCAlPSAxMDsKKyAgICBFWFBFQ1RfRkFMU0UoeC5pc1NldCgpKTsKKyAgICB4IDw8PSAxMDsKKyAgICBFWFBFQ1RfRkFMU0UoeC5pc1NldCgpKTsKKyAgICB4ID4+PSAxMDsKKyAgICBFWFBFQ1RfRkFMU0UoeC5pc1NldCgpKTsKKworICAgIHRyaV9pbnQzMl90IHksIHosIHc7CisjZGVmaW5lIFRFU1RfQ09NUE9VTkRfQVNTSUdOKGEsIG9wLCBvcF9jLCBiKSBcCisgICAgeSA9IHogPSBhOyBcCisgICAgdyA9IGI7IFwKKyAgICB5IG9wX2MgYjsgXAorICAgIEVYUEVDVF9UUlVFKHkuaXNTZXQoKSk7IFwKKyAgICBFWFBFQ1RfRVEoeSwgKGEgb3AgYikpOyBcCisgICAgRVhQRUNUX0VRKHksICh6IG9wIGIpKTsgXAorICAgIEVYUEVDVF9FUSh5LCAoYSBvcCB3KSk7CisKKyAgICBURVNUX0NPTVBPVU5EX0FTU0lHTigxMjMsICssICs9LCA0NTYpOworICAgIFRFU1RfQ09NUE9VTkRfQVNTSUdOKDEyMywgLSwgLT0sIDQ1Nik7CisgICAgVEVTVF9DT01QT1VORF9BU1NJR04oMTIzLCAqLCAqPSwgNDU2KTsKKyAgICBURVNUX0NPTVBPVU5EX0FTU0lHTigxMjMsIC8sIC89LCA0NTYpOworICAgIFRFU1RfQ09NUE9VTkRfQVNTSUdOKDEyMywgfCwgfD0sIDQ1Nik7CisgICAgVEVTVF9DT01QT1VORF9BU1NJR04oMTIzLCAmLCAmPSwgNDU2KTsKKyAgICBURVNUX0NPTVBPVU5EX0FTU0lHTigxMjMsIF4sIF49LCA0NTYpOworICAgIFRFU1RfQ09NUE9VTkRfQVNTSUdOKDEyMywgJSwgJT0sIDQ1Nik7CisjdW5kZWYgVEVTVF9DT01QT1VORF9BU1NJR04KKyAgICB5ID0geiA9IDEyMzsKKyAgICB3ID0gMTA7CisgICAgeSA8PD0gMTA7CisgICAgRVhQRUNUX1RSVUUoeS5pc1NldCgpKTsKKyAgICBFWFBFQ1RfRVEoMTIzIDw8IDEwLCB5KTsKKworICAgIHkgPSB6ID0gMTIzNDU7CisgICAgdyA9IDEwOworICAgIHkgPj49IDEwOworICAgIEVYUEVDVF9UUlVFKHkuaXNTZXQoKSk7CisgICAgRVhQRUNUX0VRKDEyMzQ1ID4+IDEwLCB5KTsKK30KKworVEVTVChUcmlTdGF0ZVRlc3QsIFVuYXJ5T3BlcmF0aW9uKSB7CisgICAgdHJpX2ludDE2X3QgcDsKKyAgICBFWFBFQ1RfRkFMU0UoKCFwKS5pc1NldCgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoKC1wKS5pc1NldCgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoKH5wKS5pc1NldCgpKTsKKworICAgIHRyaV9pbnQxNl90IHEoMTIzNCk7CisgICAgRVhQRUNUX1RSVUUoKCFxKS5pc1NldCgpKTsKKyAgICBFWFBFQ1RfRVEoIXN0YXRpY19jYXN0PGludDE2X3Q+KDEyMzQpLCAoIXEpKTsKKworICAgIHRyaV9pbnQxNl90IHIoMTIzNCk7CisgICAgRVhQRUNUX1RSVUUoKC1yKS5pc1NldCgpKTsKKyAgICBFWFBFQ1RfRVEoLTEyMzQsICgtcikpOworCisgICAgdHJpX2ludDE2X3QgcygxMjM0KTsKKyAgICBFWFBFQ1RfVFJVRSgofnMpLmlzU2V0KCkpOworICAgIEVYUEVDVF9FUSh+c3RhdGljX2Nhc3Q8aW50MTZfdD4oMTIzNCksIH5zKTsKK30KKwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL1JpbmdCdWZmZXIuY3BwIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL1JpbmdCdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NTdhN2MKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvUmluZ0J1ZmZlci5jcHAKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiUmluZ0J1ZmZlci5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworUmluZ0J1ZmZlcjo6UmluZ0J1ZmZlcihzaXplX3Qgc2l6ZSkKKyAgICA6IG1TaXplKHNpemUpLAorICAgICAgbURhdGEoKHNlbnNvcnNfZXZlbnRfdCAqKW1hbGxvYyhzaXplb2Yoc2Vuc29yc19ldmVudF90KSAqIG1TaXplKSksCisgICAgICBtUmVhZFBvcygwKSwKKyAgICAgIG1Xcml0ZVBvcygwKSB7Cit9CisKK1JpbmdCdWZmZXI6On5SaW5nQnVmZmVyKCkgeworICAgIGZyZWUobURhdGEpOworICAgIG1EYXRhID0gTlVMTDsKK30KKworc3NpemVfdCBSaW5nQnVmZmVyOjp3cml0ZShjb25zdCBzZW5zb3JzX2V2ZW50X3QgKmV2LCBzaXplX3Qgc2l6ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBzaXplX3QgbnVtQXZhaWxhYmxlVG9SZWFkID0gbVdyaXRlUG9zIC0gbVJlYWRQb3M7CisgICAgc2l6ZV90IG51bUF2YWlsYWJsZVRvV3JpdGUgPSBtU2l6ZSAtIG51bUF2YWlsYWJsZVRvUmVhZDsKKworICAgIGlmIChzaXplID4gbnVtQXZhaWxhYmxlVG9Xcml0ZSkgeworICAgICAgICBzaXplID0gbnVtQXZhaWxhYmxlVG9Xcml0ZTsKKyAgICB9CisKKyAgICBzaXplX3Qgd3JpdGVQb3MgPSAobVdyaXRlUG9zICUgbVNpemUpOworICAgIHNpemVfdCBjb3B5ID0gbVNpemUgLSB3cml0ZVBvczsKKworICAgIGlmIChjb3B5ID4gc2l6ZSkgeworICAgICAgICBjb3B5ID0gc2l6ZTsKKyAgICB9CisKKyAgICBtZW1jcHkoJm1EYXRhW3dyaXRlUG9zXSwgZXYsIGNvcHkgKiBzaXplb2Yoc2Vuc29yc19ldmVudF90KSk7CisKKyAgICBpZiAoc2l6ZSA+IGNvcHkpIHsKKyAgICAgICAgbWVtY3B5KG1EYXRhLCAmZXZbY29weV0sIChzaXplIC0gY29weSkgKiBzaXplb2Yoc2Vuc29yc19ldmVudF90KSk7CisgICAgfQorCisgICAgbVdyaXRlUG9zICs9IHNpemU7CisKKyAgICBpZiAobnVtQXZhaWxhYmxlVG9SZWFkID09IDAgJiYgc2l6ZSA+IDApIHsKKyAgICAgICAgbU5vdEVtcHR5Q29uZGl0aW9uLmJyb2FkY2FzdCgpOworICAgIH0KKworICAgIHJldHVybiBzaXplOworfQorCitzc2l6ZV90IFJpbmdCdWZmZXI6OnJlYWQoc2Vuc29yc19ldmVudF90ICpldiwgc2l6ZV90IHNpemUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgc2l6ZV90IG51bUF2YWlsYWJsZVRvUmVhZDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIG51bUF2YWlsYWJsZVRvUmVhZCA9IG1Xcml0ZVBvcyAtIG1SZWFkUG9zOworICAgICAgICBpZiAobnVtQXZhaWxhYmxlVG9SZWFkID4gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBtTm90RW1wdHlDb25kaXRpb24ud2FpdChtTG9jayk7CisgICAgfQorCisgICAgaWYgKHNpemUgPiBudW1BdmFpbGFibGVUb1JlYWQpIHsKKyAgICAgICAgc2l6ZSA9IG51bUF2YWlsYWJsZVRvUmVhZDsKKyAgICB9CisKKyAgICBzaXplX3QgcmVhZFBvcyA9IChtUmVhZFBvcyAlIG1TaXplKTsKKyAgICBzaXplX3QgY29weSA9IG1TaXplIC0gcmVhZFBvczsKKworICAgIGlmIChjb3B5ID4gc2l6ZSkgeworICAgICAgICBjb3B5ID0gc2l6ZTsKKyAgICB9CisKKyAgICBtZW1jcHkoZXYsICZtRGF0YVtyZWFkUG9zXSwgY29weSAqIHNpemVvZihzZW5zb3JzX2V2ZW50X3QpKTsKKworICAgIGlmIChzaXplID4gY29weSkgeworICAgICAgICBtZW1jcHkoJmV2W2NvcHldLCBtRGF0YSwgKHNpemUgLSBjb3B5KSAqIHNpemVvZihzZW5zb3JzX2V2ZW50X3QpKTsKKyAgICB9CisKKyAgICBtUmVhZFBvcyArPSBzaXplOworCisgICAgcmV0dXJuIHNpemU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9SaW5nQnVmZmVyLmggYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvUmluZ0J1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNmI4YzkKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvUmluZ0J1ZmZlci5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFJJTkdfQlVGRkVSX0hfCisKKyNkZWZpbmUgUklOR19CVUZGRVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKworI2luY2x1ZGUgPGhhcmR3YXJlL3NlbnNvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgUmluZ0J1ZmZlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgUmluZ0J1ZmZlcihzaXplX3Qgc2l6ZSk7CisgICAgflJpbmdCdWZmZXIoKTsKKworICAgIHNzaXplX3Qgd3JpdGUoY29uc3Qgc2Vuc29yc19ldmVudF90ICpldiwgc2l6ZV90IHNpemUpOworICAgIHNzaXplX3QgcmVhZChzZW5zb3JzX2V2ZW50X3QgKmV2LCBzaXplX3Qgc2l6ZSk7CisKK3ByaXZhdGU6CisgICAgTXV0ZXggbUxvY2s7CisgICAgQ29uZGl0aW9uIG1Ob3RFbXB0eUNvbmRpdGlvbjsKKworICAgIHNpemVfdCBtU2l6ZTsKKyAgICBzZW5zb3JzX2V2ZW50X3QgKm1EYXRhOworICAgIHNpemVfdCBtUmVhZFBvcywgbVdyaXRlUG9zOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmluZ0J1ZmZlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFJJTkdfQlVGRkVSX0hfCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvU2Vuc29yRXZlbnRDYWxsYmFjay5oIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL1NlbnNvckV2ZW50Q2FsbGJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjc5NTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL1NlbnNvckV2ZW50Q2FsbGJhY2suaApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFTlNPUkhBTF9EU0VfU0VOU09SX0VWRU5UX0NBTExCQUNLX0gKKyNkZWZpbmUgQU5EUk9JRF9TRU5TT1JIQUxfRFNFX1NFTlNPUl9FVkVOVF9DQUxMQkFDS19ICisKKyNpbmNsdWRlICJVdGlscy5oIgorI2luY2x1ZGUgPGhhcmR3YXJlL3NlbnNvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFNlbnNvckhhbEV4dCB7CitjbGFzcyBCYXNlU2Vuc29yT2JqZWN0OworCisvLyBpZiB0aW1lc3RhbXAgaW4gc2Vuc29yc19ldmVudF90IGhhcyB0aGlzIHZhbHVlLCBpdCB3aWxsIGJlIGZpbGxlZCBhdCBkaXNwYXRjaGVyLgorY29uc3RleHByIGludDY0X3QgVElNRVNUQU1QX0FVVE9fRklMTCA9IC0xOworCitjbGFzcyBTZW5zb3JFdmVudENhbGxiYWNrIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIGludCBzdWJtaXRFdmVudChTUChCYXNlU2Vuc29yT2JqZWN0KSBzZW5zb3IsIGNvbnN0IHNlbnNvcnNfZXZlbnRfdCAmZSkgPSAwOworICAgIHZpcnR1YWwgflNlbnNvckV2ZW50Q2FsbGJhY2soKSA9IGRlZmF1bHQ7Cit9OworCit9IC8vIG5hbWVzcGFjZSBTZW5zb3JIYWxFeHQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfU0VOU09SSEFMX0RTRV9TRU5TT1JfRVZFTlRfQ0FMTEJBQ0tfSApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL1V0aWxzLmggYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTZjMTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL1V0aWxzLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIEFORFJPSURfU0VOU09SSEFMX0VYVF9VVElMU19ICisjZGVmaW5lIEFORFJPSURfU0VOU09SSEFMX0VYVF9VVElMU19ICisKKy8vIEhvc3QgYnVpbGQgZG9lcyBub3QgaGF2ZSBSZWZCYXNlCisjaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjZGVmaW5lIFJFRl9CQVNFKGEpIDo6YW5kcm9pZDo6UmVmQmFzZQorI2RlZmluZSBTUChhKSBzcDxhPgorI2RlZmluZSBXUChhKSB3cDxhPgorI2RlZmluZSBTUF9USElTIHRoaXMKKyNkZWZpbmUgUFJPTU9URShhKSAoYSkucHJvbW90ZSgpCisjZWxzZQorI2luY2x1ZGUgPG1lbW9yeT4KKyNkZWZpbmUgUkVGX0JBU0UoYSkgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxhPgorI2RlZmluZSBTUChhKSBzdGQ6OnNoYXJlZF9wdHI8YT4KKyNkZWZpbmUgV1AoYSkgc3RkOjp3ZWFrX3B0cjxhPgorI2RlZmluZSBTUF9USElTIHNoYXJlZF9mcm9tX3RoaXMoKQorI2RlZmluZSBQUk9NT1RFKGEpIChhKS5sb2NrKCkKKyNlbmRpZgorCisjZW5kaWYgLy8gQU5EUk9JRF9TRU5TT1JIQUxfRVhUX1VUSUxTX0gKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9zZW5zb3JzLmNwcCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9zZW5zb3JzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzIwM2IyCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL3NlbnNvcnMuY3BwCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaW5jbHVkZSAiRHluYW1pY1NlbnNvck1hbmFnZXIuaCIKKyNpbmNsdWRlICJzZW5zb3JzLmgiCisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1NlbnNvckNvbnRleHQ6OlNlbnNvckNvbnRleHQoY29uc3Qgc3RydWN0IGh3X21vZHVsZV90ICptb2R1bGUpIHsKKyAgICBtZW1zZXQoJmRldmljZSwgMCwgc2l6ZW9mKGRldmljZSkpOworCisgICAgZGV2aWNlLmNvbW1vbi50YWcgPSBIQVJEV0FSRV9ERVZJQ0VfVEFHOworICAgIGRldmljZS5jb21tb24udmVyc2lvbiA9IFNFTlNPUlNfREVWSUNFX0FQSV9WRVJTSU9OXzFfMzsKKyAgICBkZXZpY2UuY29tbW9uLm1vZHVsZSA9IGNvbnN0X2Nhc3Q8aHdfbW9kdWxlX3QgKj4obW9kdWxlKTsKKyAgICBkZXZpY2UuY29tbW9uLmNsb3NlID0gQ2xvc2VXcmFwcGVyOworICAgIGRldmljZS5hY3RpdmF0ZSA9IEFjdGl2YXRlV3JhcHBlcjsKKyAgICBkZXZpY2Uuc2V0RGVsYXkgPSBTZXREZWxheVdyYXBwZXI7CisgICAgZGV2aWNlLnBvbGwgPSBQb2xsV3JhcHBlcjsKKyAgICBkZXZpY2UuYmF0Y2ggPSBCYXRjaFdyYXBwZXI7CisgICAgZGV2aWNlLmZsdXNoID0gRmx1c2hXcmFwcGVyOworCisgICAgLy8gaW5pdGlhbGl6ZSBkeW5hbWljIHNlbnNvciBtYW5hZ2VyCisgICAgaW50MzJfdCBiYXNlID0gcHJvcGVydHlfZ2V0X2ludDMyKCJzZW5zb3IuZHluYW1pY19zZW5zb3JfaGFsLmhhbmRsZV9iYXNlIiwga0R5bmFtaWNIYW5kbGVCYXNlKTsKKyAgICBpbnQzMl90IGNvdW50ID0KKyAgICAgICAgICAgIHByb3BlcnR5X2dldF9pbnQzMigic2Vuc29yLmR5bmFtaWNfc2Vuc29yX2hhbC5oYW5kbGVfY291bnQiLCBrTWF4RHluYW1pY0hhbmRsZUNvdW50KTsKKyAgICBtRHluYW1pY1NlbnNvck1hbmFnZXIucmVzZXQoRHluYW1pY1NlbnNvck1hbmFnZXI6OmNyZWF0ZUluc3RhbmNlKGJhc2UsIGNvdW50LCBudWxscHRyKSk7Cit9CisKK2ludCBTZW5zb3JDb250ZXh0OjpjbG9zZSgpIHsKKyAgICBkZWxldGUgdGhpczsKKyAgICByZXR1cm4gMDsKK30KKworaW50IFNlbnNvckNvbnRleHQ6OmFjdGl2YXRlKGludCBoYW5kbGUsIGludCBlbmFibGVkKSB7CisgICAgcmV0dXJuIG1EeW5hbWljU2Vuc29yTWFuYWdlci0+YWN0aXZhdGUoaGFuZGxlLCBlbmFibGVkKTsKK30KKworaW50IFNlbnNvckNvbnRleHQ6OnNldERlbGF5KGludCBoYW5kbGUsIGludDY0X3QgZGVsYXlOcykgeworICAgIHJldHVybiBtRHluYW1pY1NlbnNvck1hbmFnZXItPnNldERlbGF5KGhhbmRsZSwgZGVsYXlOcyk7Cit9CisKK2ludCBTZW5zb3JDb250ZXh0Ojpwb2xsKHNlbnNvcnNfZXZlbnRfdCAqZGF0YSwgaW50IGNvdW50KSB7CisgICAgcmV0dXJuIG1EeW5hbWljU2Vuc29yTWFuYWdlci0+cG9sbChkYXRhLCBjb3VudCk7Cit9CisKK2ludCBTZW5zb3JDb250ZXh0OjpiYXRjaCgKKyAgICAgICAgaW50IGhhbmRsZSwKKyAgICAgICAgaW50NjRfdCBzYW1wbGluZ19wZXJpb2RfbnMsCisgICAgICAgIGludDY0X3QgbWF4X3JlcG9ydF9sYXRlbmN5X25zKSB7CisgICAgcmV0dXJuIG1EeW5hbWljU2Vuc29yTWFuYWdlci0+YmF0Y2goaGFuZGxlLCBzYW1wbGluZ19wZXJpb2RfbnMsIG1heF9yZXBvcnRfbGF0ZW5jeV9ucyk7Cit9CisKK2ludCBTZW5zb3JDb250ZXh0OjpmbHVzaChpbnQgaGFuZGxlKSB7CisgICAgcmV0dXJuIG1EeW5hbWljU2Vuc29yTWFuYWdlci0+Zmx1c2goaGFuZGxlKTsKK30KKworLy8gc3RhdGljCitpbnQgU2Vuc29yQ29udGV4dDo6Q2xvc2VXcmFwcGVyKHN0cnVjdCBod19kZXZpY2VfdCAqZGV2KSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U2Vuc29yQ29udGV4dCAqPihkZXYpLT5jbG9zZSgpOworfQorCisvLyBzdGF0aWMKK2ludCBTZW5zb3JDb250ZXh0OjpBY3RpdmF0ZVdyYXBwZXIoCisgICAgICAgIHN0cnVjdCBzZW5zb3JzX3BvbGxfZGV2aWNlX3QgKmRldiwgaW50IGhhbmRsZSwgaW50IGVuYWJsZWQpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTZW5zb3JDb250ZXh0ICo+KGRldiktPmFjdGl2YXRlKGhhbmRsZSwgZW5hYmxlZCk7Cit9CisKKy8vIHN0YXRpYworaW50IFNlbnNvckNvbnRleHQ6OlNldERlbGF5V3JhcHBlcigKKyAgICAgICAgc3RydWN0IHNlbnNvcnNfcG9sbF9kZXZpY2VfdCAqZGV2LCBpbnQgaGFuZGxlLCBpbnQ2NF90IGRlbGF5TnMpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTZW5zb3JDb250ZXh0ICo+KGRldiktPnNldERlbGF5KGhhbmRsZSwgZGVsYXlOcyk7Cit9CisKKy8vIHN0YXRpYworaW50IFNlbnNvckNvbnRleHQ6OlBvbGxXcmFwcGVyKAorICAgICAgICBzdHJ1Y3Qgc2Vuc29yc19wb2xsX2RldmljZV90ICpkZXYsIHNlbnNvcnNfZXZlbnRfdCAqZGF0YSwgaW50IGNvdW50KSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U2Vuc29yQ29udGV4dCAqPihkZXYpLT5wb2xsKGRhdGEsIGNvdW50KTsKK30KKworLy8gc3RhdGljCitpbnQgU2Vuc29yQ29udGV4dDo6QmF0Y2hXcmFwcGVyKAorICAgICAgICBzdHJ1Y3Qgc2Vuc29yc19wb2xsX2RldmljZV8xICpkZXYsCisgICAgICAgIGludCBoYW5kbGUsCisgICAgICAgIGludCBmbGFncywKKyAgICAgICAgaW50NjRfdCBzYW1wbGluZ19wZXJpb2RfbnMsCisgICAgICAgIGludDY0X3QgbWF4X3JlcG9ydF9sYXRlbmN5X25zKSB7CisgICAgKHZvaWQpIGZsYWdzOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFNlbnNvckNvbnRleHQgKj4oZGV2KS0+YmF0Y2goCisgICAgICAgICAgICBoYW5kbGUsIHNhbXBsaW5nX3BlcmlvZF9ucywgbWF4X3JlcG9ydF9sYXRlbmN5X25zKTsKK30KKworLy8gc3RhdGljCitpbnQgU2Vuc29yQ29udGV4dDo6Rmx1c2hXcmFwcGVyKHN0cnVjdCBzZW5zb3JzX3BvbGxfZGV2aWNlXzEgKmRldiwgaW50IGhhbmRsZSkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFNlbnNvckNvbnRleHQgKj4oZGV2KS0+Zmx1c2goaGFuZGxlKTsKK30KKworc2l6ZV90IFNlbnNvckNvbnRleHQ6OmdldFNlbnNvckxpc3Qoc2Vuc29yX3QgY29uc3QgKipsaXN0KSB7CisgICAgKmxpc3QgPSAmKG1EeW5hbWljU2Vuc29yTWFuYWdlci0+Z2V0RHluYW1pY01ldGFTZW5zb3IoKSk7CisgICAgcmV0dXJuIDE7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBzZW5zb3JfdCBjb25zdCAqc2Vuc29yX2xpc3Q7CisKK3N0YXRpYyBpbnQgb3Blbl9zZW5zb3JzKAorICAgICAgICBjb25zdCBzdHJ1Y3QgaHdfbW9kdWxlX3QgKm1vZHVsZSwKKyAgICAgICAgY29uc3QgY2hhciAqLAorICAgICAgICBzdHJ1Y3QgaHdfZGV2aWNlX3QgKipkZXYpIHsKKyAgICBTZW5zb3JDb250ZXh0ICpjdHggPSBuZXcgU2Vuc29yQ29udGV4dChtb2R1bGUpOworICAgIGN0eC0+Z2V0U2Vuc29yTGlzdCgmc2Vuc29yX2xpc3QpOworICAgICpkZXYgPSAmY3R4LT5kZXZpY2UuY29tbW9uOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGh3X21vZHVsZV9tZXRob2RzX3Qgc2Vuc29yc19tb2R1bGVfbWV0aG9kcyA9IHsKKyAgICAub3BlbiA9IG9wZW5fc2Vuc29ycworfTsKKworc3RhdGljIGludCBnZXRfc2Vuc29yc19saXN0KAorICAgICAgICBzdHJ1Y3Qgc2Vuc29yc19tb2R1bGVfdCAqLAorICAgICAgICBzdHJ1Y3Qgc2Vuc29yX3QgY29uc3QgKipsaXN0KSB7CisgICAgKmxpc3QgPSBzZW5zb3JfbGlzdDsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzZXRfb3BlcmF0aW9uX21vZGUodW5zaWduZWQgaW50IG1vZGUpIHsKKyAgICByZXR1cm4gKG1vZGUpID8gLUVJTlZBTCA6IDA7Cit9CisKK3N0cnVjdCBzZW5zb3JzX21vZHVsZV90IEhBTF9NT0RVTEVfSU5GT19TWU0gPSB7CisgICAgLmNvbW1vbiA9IHsKKyAgICAgICAgICAgIC50YWcgPSBIQVJEV0FSRV9NT0RVTEVfVEFHLAorICAgICAgICAgICAgLnZlcnNpb25fbWFqb3IgPSAxLAorICAgICAgICAgICAgLnZlcnNpb25fbWlub3IgPSAwLAorICAgICAgICAgICAgLmlkID0gU0VOU09SU19IQVJEV0FSRV9NT0RVTEVfSUQsCisgICAgICAgICAgICAubmFtZSA9ICJHb29nbGUgRHluYW1pYyBTZW5zb3IgTWFuYWdlciIsCisgICAgICAgICAgICAuYXV0aG9yID0gIkdvb2dsZSIsCisgICAgICAgICAgICAubWV0aG9kcyA9ICZzZW5zb3JzX21vZHVsZV9tZXRob2RzLAorICAgICAgICAgICAgLmRzbyAgPSBOVUxMLAorICAgICAgICAgICAgLnJlc2VydmVkID0gezB9LAorICAgIH0sCisgICAgLmdldF9zZW5zb3JzX2xpc3QgPSBnZXRfc2Vuc29yc19saXN0LAorICAgIC5zZXRfb3BlcmF0aW9uX21vZGUgPSBzZXRfb3BlcmF0aW9uX21vZGUsCit9OwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL3NlbnNvcnMuaCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9zZW5zb3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZkODcwOAotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9zZW5zb3JzLmgKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU0VOU09SU19IXworI2RlZmluZSBTRU5TT1JTX0hfCisKKyNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL3NlbnNvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisgICAgbmFtZXNwYWNlIFNlbnNvckhhbEV4dCB7CisgICAgICAgIGNsYXNzIER5bmFtaWNTZW5zb3JNYW5hZ2VyOworICAgIH0gLy8gbmFtZXNwYWNlIEJhc2VTZW5zb3JPYmplY3QKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwordXNpbmcgYW5kcm9pZDo6U2Vuc29ySGFsRXh0OjpEeW5hbWljU2Vuc29yTWFuYWdlcjsKKworY2xhc3MgU2Vuc29yQ29udGV4dCB7CitwdWJsaWM6CisgICAgc3RydWN0IHNlbnNvcnNfcG9sbF9kZXZpY2VfMSBkZXZpY2U7CisKKyAgICBleHBsaWNpdCBTZW5zb3JDb250ZXh0KGNvbnN0IHN0cnVjdCBod19tb2R1bGVfdCAqbW9kdWxlKTsKKworICAgIHNpemVfdCBnZXRTZW5zb3JMaXN0KHNlbnNvcl90IGNvbnN0ICoqbGlzdCk7CisKK3ByaXZhdGU6CisKKyAgICBpbnQgY2xvc2UoKTsKKyAgICBpbnQgYWN0aXZhdGUoaW50IGhhbmRsZSwgaW50IGVuYWJsZWQpOworICAgIGludCBzZXREZWxheShpbnQgaGFuZGxlLCBpbnQ2NF90IGRlbGF5TnMpOworICAgIGludCBwb2xsKHNlbnNvcnNfZXZlbnRfdCAqZGF0YSwgaW50IGNvdW50KTsKKworICAgIGludCBiYXRjaChpbnQgaGFuZGxlLCBpbnQ2NF90IHNhbXBsaW5nX3BlcmlvZF9ucywKKyAgICAgICAgICAgICAgaW50NjRfdCBtYXhfcmVwb3J0X2xhdGVuY3lfbnMpOworCisgICAgaW50IGZsdXNoKGludCBoYW5kbGUpOworCisgICAgLy8gc3RhdGljIHdyYXBwZXJzCisgICAgc3RhdGljIGludCBDbG9zZVdyYXBwZXIoc3RydWN0IGh3X2RldmljZV90ICpkZXYpOworCisgICAgc3RhdGljIGludCBBY3RpdmF0ZVdyYXBwZXIoCisgICAgICAgICAgICBzdHJ1Y3Qgc2Vuc29yc19wb2xsX2RldmljZV90ICpkZXYsIGludCBoYW5kbGUsIGludCBlbmFibGVkKTsKKworICAgIHN0YXRpYyBpbnQgU2V0RGVsYXlXcmFwcGVyKAorICAgICAgICAgICAgc3RydWN0IHNlbnNvcnNfcG9sbF9kZXZpY2VfdCAqZGV2LCBpbnQgaGFuZGxlLCBpbnQ2NF90IGRlbGF5TnMpOworCisgICAgc3RhdGljIGludCBQb2xsV3JhcHBlcigKKyAgICAgICAgICAgIHN0cnVjdCBzZW5zb3JzX3BvbGxfZGV2aWNlX3QgKmRldiwgc2Vuc29yc19ldmVudF90ICpkYXRhLCBpbnQgY291bnQpOworCisgICAgc3RhdGljIGludCBCYXRjaFdyYXBwZXIoCisgICAgICAgICAgICBzdHJ1Y3Qgc2Vuc29yc19wb2xsX2RldmljZV8xICpkZXYsCisgICAgICAgICAgICBpbnQgaGFuZGxlLAorICAgICAgICAgICAgaW50IGZsYWdzLAorICAgICAgICAgICAgaW50NjRfdCBzYW1wbGluZ19wZXJpb2RfbnMsCisgICAgICAgICAgICBpbnQ2NF90IG1heF9yZXBvcnRfbGF0ZW5jeV9ucyk7CisKKyAgICBzdGF0aWMgaW50IEZsdXNoV3JhcHBlcihzdHJ1Y3Qgc2Vuc29yc19wb2xsX2RldmljZV8xICpkZXYsIGludCBoYW5kbGUpOworCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtEeW5hbWljSGFuZGxlQmFzZSA9IDB4MTAwMDA7CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtEeW5hbWljSGFuZGxlRW5kID0gMHgxMDAwMDAwOworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrTWF4RHluYW1pY0hhbmRsZUNvdW50ID0ga0R5bmFtaWNIYW5kbGVFbmQgLSBrRHluYW1pY0hhbmRsZUJhc2U7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RHluYW1pY1NlbnNvck1hbmFnZXI+IG1EeW5hbWljU2Vuc29yTWFuYWdlcjsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNlbnNvckNvbnRleHQpOworfTsKKworI2VuZGlmICAvLyBTRU5TT1JTX0hfCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvdGVzdC9IaWRSYXdEZXZpY2VUZXN0LmNwcCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci90ZXN0L0hpZFJhd0RldmljZVRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNjhlMzkKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvdGVzdC9IaWRSYXdEZXZpY2VUZXN0LmNwcApAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIExPR19UQUcgIkhpZFJhd0RldmljZVRlc3QiCisKKyNpbmNsdWRlICJIaWRSYXdEZXZpY2UuaCIKKyNpbmNsdWRlICJIaWRSYXdTZW5zb3IuaCIKKyNpbmNsdWRlICJIaWRTZW5zb3JEZWYuaCIKKyNpbmNsdWRlICJTZW5zb3JFdmVudENhbGxiYWNrLmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKyNpbmNsdWRlICJIaWRMb2cuaCIKKyNpbmNsdWRlICJTdHJlYW1Jb1V0aWwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFNlbnNvckhhbEV4dCB7CisKKy8qCisgKiBIb3N0IHRlc3QgdGhhdCB2ZXJpZmllcyBIaWRSYXdEZXZpY2UgYW5kIEhpZFJhd1NlbnNvciB3b3JrcyBjb3JyZWN0bHkuCisgKi8KK2NsYXNzIEhpZFJhd0RldmljZVRlc3QgeworcHVibGljOgorICAgIHN0YXRpYyB2b2lkIHRlc3QoY29uc3QgY2hhciAqZGV2aWNlUGF0aCkgeworICAgICAgICB1c2luZyBuYW1lc3BhY2UgSGlkOjpTZW5zb3I6OlNlbnNvclR5cGVVc2FnZTsKKyAgICAgICAgdXNpbmcgSGlkVXRpbDo6aGV4ZHVtcFRvU3RyZWFtOworCisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1bnNpZ25lZCBpbnQ+IGludGVyZXN0ZWRVc2FnZXsKKyAgICAgICAgICAgICAgICBBQ0NFTEVST01FVEVSXzNELCBHWVJPTUVURVJfM0QsIENPTVBBU1NfM0QsIENVU1RPTX07CisKKyAgICAgICAgU1AoSGlkUmF3RGV2aWNlKSBkZXZpY2UgPQorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8SGlkUmF3RGV2aWNlPihzdGQ6OnN0cmluZyhkZXZpY2VQYXRoKSwgaW50ZXJlc3RlZFVzYWdlKTsKKyAgICAgICAgY29uc3QgSGlkRGV2aWNlOjpIaWREZXZpY2VJbmZvICZpbmZvID0gZGV2aWNlLT5nZXREZXZpY2VJbmZvKCk7CisKKyAgICAgICAgTE9HX1YgPDwgIlNpemVvZiBkZXNjcmlwdG9yOiAiIDw8IGluZm8uZGVzY3JpcHRvci5zaXplKCkgPDwgTE9HX0VOREw7CisgICAgICAgIExPR19WIDw8ICJEZXNjcmlwdG9yOiAiIDw8IExPR19FTkRMOworICAgICAgICBoZXhkdW1wVG9TdHJlYW0oTE9HX1YsIGluZm8uZGVzY3JpcHRvci5iZWdpbigpLCBpbmZvLmRlc2NyaXB0b3IuZW5kKCkpOworCisgICAgICAgIGlmICghZGV2aWNlLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIExPR19FIDw8ICJpbnZhbGlkIGRldmljZSIgPDwgTE9HX0VOREw7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBMT0dfViA8PCAiRGlnZXN0OiAiIDw8IExPR19FTkRMOworICAgICAgICBMT0dfViA8PCBkZXZpY2UtPm1EaWdlc3RWZWN0b3I7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmZmVyOworICAgICAgICAvLyBEdW1wIGZpcnN0IGZldyBmZWF0dXJlIElEIHRvIGhlbHAgZGVidWdnaW5nLgorICAgICAgICAvLyBJZiBkZXZpY2UgZG9lcyBub3QgaW1wbGVtZW50IGFsbCB0aGVzZSBmZWF0dXJlcywgaXQgd2lsbCBzaG93IGVycm9yIG1lc3NhZ2VzLgorICAgICAgICBmb3IgKGludCBmZWF0dXJlSWQgPSAwOyBmZWF0dXJlSWQgPD0gNTsgKytmZWF0dXJlSWQpIHsKKyAgICAgICAgICAgIGlmICghZGV2aWNlLT5nZXRGZWF0dXJlKGZlYXR1cmVJZCwgJmJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICBMT0dfRSA8PCAiY2Fubm90IGdldCBmZWF0dXJlICIgPDwgZmVhdHVyZUlkIDw8IExPR19FTkRMOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dfViA8PCAiRHVtcCBvZiBmZWF0dXJlICIgPDwgZmVhdHVyZUlkIDw8IExPR19FTkRMOworICAgICAgICAgICAgICAgIGhleGR1bXBUb1N0cmVhbShMT0dfViwgYnVmZmVyLmJlZ2luKCksIGJ1ZmZlci5lbmQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8KKyAgICAgICAgLy8gdXNlIEhpZFJhd1NlbnNvciB0byBvcGVyYXRlIHRoZSBkZXZpY2UsIHBpY2sgZmlyc3QgZGlnZXN0CisgICAgICAgIC8vCisgICAgICAgIGF1dG8gJnJlcG9ydERpZ2VzdCA9IGRldmljZS0+bURpZ2VzdFZlY3RvclswXTsKKyAgICAgICAgU1AoSGlkUmF3U2Vuc29yKSBzZW5zb3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPEhpZFJhd1NlbnNvcj4oCisgICAgICAgICAgICAgICAgZGV2aWNlLCByZXBvcnREaWdlc3QuZnVsbFVzYWdlLCByZXBvcnREaWdlc3QucGFja2V0cyk7CisKKyAgICAgICAgaWYgKCFzZW5zb3ItPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgTE9HX0UgPDwgIlNlbnNvciBpcyBub3QgdmFsaWQgIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHNlbnNvcl90ICpzID0gc2Vuc29yLT5nZXRTZW5zb3IoKTsKKyAgICAgICAgTE9HX1YgPDwgIlNlbnNvciBuYW1lOiAiIDw8IHMtPm5hbWUgPDwgIiwgdmVuZG9yOiAiIDw8IHMtPnZlbmRvciA8PCBMT0dfRU5ETDsKKyAgICAgICAgTE9HX1YgPDwgc2Vuc29yLT5kdW1wKCkgPDwgTE9HX0VOREw7CisKKyAgICAgICAgY2xhc3MgQ2FsbGJhY2sgOiBwdWJsaWMgU2Vuc29yRXZlbnRDYWxsYmFjayB7CisgICAgICAgICAgICB2aXJ0dWFsIGludCBzdWJtaXRFdmVudChTUChCYXNlU2Vuc29yT2JqZWN0KSAvKnNlbnNvciovLCBjb25zdCBzZW5zb3JzX2V2ZW50X3QgJmUpIHsKKyAgICAgICAgICAgICAgICBMT0dfViA8PCAic2Vuc29yOiAiIDw8IGUuc2Vuc29yIDw8ICIsIHR5cGU6ICIgPDwgZS50eXBlIDw8ICIsIHRzOiAiIDw8IGUudGltZXN0YW1wCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgdmFsdWVzICgiIDw8IGUuZGF0YVswXSA8PCAiLCAiIDw8IGUuZGF0YVsxXSA8PCAiLCAiIDw8IGUuZGF0YVsyXSA8PCAiKSIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQ2FsbGJhY2sgY2FsbGJhY2s7CisgICAgICAgIHNlbnNvci0+c2V0RXZlbnRDYWxsYmFjaygmY2FsbGJhY2spOworCisgICAgICAgIC8vIFJlcXVlc3Qgc2Vuc29yIHNhbXBsZXMgYXQgdG8gMTBIeiAoMTAwbXMpCisgICAgICAgIHNlbnNvci0+YmF0Y2goMTAwTEwqMTAwMCoxMDAwIC8qbnMqLywgMCk7CisgICAgICAgIHNlbnNvci0+ZW5hYmxlKHRydWUpOworCisgICAgICAgIC8vIGdldCBhIGNvdXBsZSBvZiBldmVudHMKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxMDA7ICsraSkgeworICAgICAgICAgICAgdWludDhfdCBpZDsKKyAgICAgICAgICAgIGlmICghZGV2aWNlLT5yZWNlaXZlUmVwb3J0KCZpZCwgJmJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICBMT0dfRSA8PCAiUmVjZWl2ZSByZXBvcnQgZXJyb3IiIDw8IExPR19FTkRMOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2Vuc29yLT5oYW5kbGVJbnB1dChpZCwgYnVmZmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNsZWFuIHVwCisgICAgICAgIHNlbnNvci0+ZW5hYmxlKGZhbHNlKTsKKworICAgICAgICBMT0dfViA8PCAiRG9uZSEiIDw8IExPR19FTkRMOworICAgIH0KK307Cit9IC8vbmFtZXNwYWNlIFNlbnNvckhhbEV4dAorfSAvL25hbWVzcGFjZSBhbmRyb2lkCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgICBpZiAoYXJnYyAhPSAyKSB7CisgICAgICAgIExPR19FIDw8ICJVc2FnZTogIiA8PCBhcmd2WzBdIDw8ICIgaGlkcmF3LWRldi1wYXRoIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBhbmRyb2lkOjpTZW5zb3JIYWxFeHQ6OkhpZFJhd0RldmljZVRlc3Q6OnRlc3QoYXJndlsxXSk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvdGVzdC9IaWRSYXdTZW5zb3JUZXN0LmNwcCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci90ZXN0L0hpZFJhd1NlbnNvclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YTc0N2EKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvdGVzdC9IaWRSYXdTZW5zb3JUZXN0LmNwcApAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIExPR19UQUcgIkhpZFJhd1NlbnNvclRlc3QiCisKKyNpbmNsdWRlICJIaWREZXZpY2UuaCIKKyNpbmNsdWRlICJIaWRMb2cuaCIKKyNpbmNsdWRlICJIaWRMb2cuaCIKKyNpbmNsdWRlICJIaWRQYXJzZXIuaCIKKyNpbmNsdWRlICJIaWRSYXdTZW5zb3IuaCIKKyNpbmNsdWRlICJIaWRTZW5zb3JEZWYuaCIKKyNpbmNsdWRlICJTdHJlYW1Jb1V0aWwuaCIKKyNpbmNsdWRlICJUZXN0SGlkRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCisKKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgU2Vuc29ySGFsRXh0IHsKKworY2xhc3MgSGlkUmF3RHVtbXlEZXZpY2UgOiBwdWJsaWMgSGlkRGV2aWNlIHsKK3B1YmxpYzoKKyAgICBzdHJ1Y3QgRGF0YVBhaXIgeworICAgICAgICB1aW50OF90IGlkOworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhOworICAgIH07CisKKyAgICBIaWRSYXdEdW1teURldmljZSgpIHsKKyAgICAgICAgLy8gZHVtbXkgdmFsdWVzCisgICAgICAgIG1JbmZvID0geworICAgICAgICAgIC5uYW1lID0gIlRlc3Qgc2Vuc29yIG5hbWUiLAorICAgICAgICAgIC5waHlzaWNhbFBhdGggPSAiL3BoeXNpY2FsL3BhdGgiLAorICAgICAgICAgIC5idXNUeXBlID0gIlVTQiIsCisgICAgICAgICAgLnZlbmRvcklkID0gMHgxMjM0LAorICAgICAgICAgIC5wcm9kdWN0SWQgPSAweDU2NzgsCisgICAgICAgICAgLmRlc2NyaXB0b3IgPSB7MH0KKyAgICAgIH07CisgICAgfQorCisgICAgdmlydHVhbCBjb25zdCBIaWREZXZpY2VJbmZvJiBnZXREZXZpY2VJbmZvKCkgeworICAgICAgICByZXR1cm4gbUluZm87CisgICAgfQorCisgICAgLy8gZ2V0IGZlYXR1cmUgZnJvbSBkZXZpY2UKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0RmVhdHVyZSh1aW50OF90IGlkLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqb3V0KSB7CisgICAgICAgIGF1dG8gaSA9IG1GZWF0dXJlLmZpbmQoaWQpOworICAgICAgICBpZiAoaSA9PSBtRmVhdHVyZS5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgICpvdXQgPSBpLT5zZWNvbmQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIHdyaXRlIGZlYXR1cmUgdG8gZGV2aWNlCisgICAgdmlydHVhbCBib29sIHNldEZlYXR1cmUodWludDhfdCBpZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmluKSB7CisgICAgICAgIGF1dG8gaSA9IG1GZWF0dXJlLmZpbmQoaWQpOworICAgICAgICBpZiAoaSA9PSBtRmVhdHVyZS5lbmQoKSB8fCBpbi5zaXplKCkgIT0gaS0+c2Vjb25kLnNpemUoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGktPnNlY29uZCA9IGluOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBzZW5kIHJlcG9ydCB0byBkZWZhdWx0IG91dHB1dCBlbmRwb2ludAorICAgIHZpcnR1YWwgYm9vbCBzZW5kUmVwb3J0KHVpbnQ4X3QgaWQsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZkYXRhKSB7CisgICAgICAgIERhdGFQYWlyIHBhaXIgPSB7CisgICAgICAgICAgICAuaWQgPSBpZCwKKyAgICAgICAgICAgIC5kYXRhID0gZGF0YQorICAgICAgICB9OworICAgICAgICBtT3V0cHV0LnB1c2hfYmFjayhwYWlyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gcmVjZWl2ZSBmcm9tIGRlZmF1bHQgaW5wdXQgZW5kcG9pbnQKKyAgICB2aXJ0dWFsIGJvb2wgcmVjZWl2ZVJlcG9ydCh1aW50OF90ICogLyppZCovLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqIC8qZGF0YSovKSB7CisgICAgICAgIC8vIG5vdCBuZWNlc3NhcnksIGFzIGlucHV0IHJlcG9ydCBjYW4gYmUgZGlyZWN0bHkgZmVlZCB0byBIaWRSYXdTZW5zb3IgZm9yIHRlc3RpbmcgcHVycG9zZQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBkZXF1ZXVPdXRwdXRSZXBvcnQoRGF0YVBhaXIgKnBhaXIpIHsKKyAgICAgICAgaWYgKCFtT3V0cHV0LmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAqcGFpciA9IG1PdXRwdXQuZnJvbnQoKTsKKyAgICAgICAgbU91dHB1dC5wb3BfZnJvbnQoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCitwcml2YXRlOgorICAgIEhpZERldmljZUluZm8gbUluZm87CisgICAgc3RkOjpkZXF1ZTxEYXRhUGFpcj4gbU91dHB1dDsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDhfdCwgc3RkOjp2ZWN0b3I8dWludDhfdD4+IG1GZWF0dXJlOworfTsKKworY2xhc3MgSGlkUmF3U2Vuc29yVGVzdCB7CitwdWJsaWM6CisgICAgc3RhdGljIGJvb2wgdGVzdCgpIHsKKyAgICAgICAgYm9vbCByZXQgPSB0cnVlOworICAgICAgICB1c2luZyBuYW1lc3BhY2UgSGlkOjpTZW5zb3I6OlNlbnNvclR5cGVVc2FnZTsKKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVuc2lnbmVkIGludD4gaW50ZXJlc3RlZFVzYWdleworICAgICAgICAgICAgICAgIEFDQ0VMRVJPTUVURVJfM0QsIEdZUk9NRVRFUl8zRCwgQ09NUEFTU18zRCwgQ1VTVE9NfTsKKyAgICAgICAgU1AoSGlkRGV2aWNlKSBkZXZpY2UobmV3IEhpZFJhd0R1bW15RGV2aWNlKCkpOworCisgICAgICAgIEhpZFBhcnNlciBoaWRQYXJzZXI7CisgICAgICAgIGZvciAoY29uc3QgVGVzdEhpZERlc2NyaXB0b3IgKnAgPSBnRGVzY3JpcHRvckFycmF5OyA7ICsrcCkgeworICAgICAgICAgICAgaWYgKHAtPmRhdGEgPT0gbnVsbHB0ciB8fCBwLT5sZW4gPT0gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSA9IHAtPm5hbWUgIT0gbnVsbHB0ciA/IHAtPm5hbWUgOiAidW5uYW1lZCI7CisgICAgICAgICAgICBpZiAoIWhpZFBhcnNlci5wYXJzZShwLT5kYXRhLCBwLT5sZW4pKSB7CisgICAgICAgICAgICAgICAgTE9HX0UgPDwgbmFtZSA8PCAiIHBhcnNpbmcgZXJyb3IhIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgICAgICByZXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGlkUGFyc2VyLmZpbHRlclRyZWUoKTsKKyAgICAgICAgICAgIExPR19WIDw8IG5hbWUgPDwgIiAgZGlnZXN0OiAiIDw8IExPR19FTkRMOworICAgICAgICAgICAgYXV0byBkaWdlc3RWZWN0b3IgPSBoaWRQYXJzZXIuZ2VuZXJhdGVEaWdlc3QoaW50ZXJlc3RlZFVzYWdlKTsKKyAgICAgICAgICAgIExPR19WIDw8IGRpZ2VzdFZlY3RvcjsKKworICAgICAgICAgICAgaWYgKGRpZ2VzdFZlY3Rvci5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgTE9HX1YgPDwgbmFtZSA8PCAiIGRvZXMgbm90IGNvbnRhaW4gaW50ZXJlc3RlZCB1c2FnZSIgPDwgTE9HX0VOREw7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExPR19WIDw8IG5hbWUgPDwgIiAgc2Vuc29yOiAiIDw8IExPR19FTkRMOworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZkaWdlc3QgOiBkaWdlc3RWZWN0b3IpIHsKKyAgICAgICAgICAgICAgICBMT0dfSSA8PCAiU2Vuc29yIHVzYWdlICIgPDwgc3RkOjpoZXggPDwgZGlnZXN0LmZ1bGxVc2FnZSA8PCBzdGQ6OmRlYyA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgICAgICBhdXRvICpzID0gbmV3IEhpZFJhd1NlbnNvcihkZXZpY2UsIGRpZ2VzdC5mdWxsVXNhZ2UsIGRpZ2VzdC5wYWNrZXRzKTsKKyAgICAgICAgICAgICAgICBpZiAocy0+bVZhbGlkKSB7CisgICAgICAgICAgICAgICAgICAgIExPR19WIDw8ICJVc2FnZSAiIDw8IHN0ZDo6aGV4IDw8IGRpZ2VzdC5mdWxsVXNhZ2UgPDwgc3RkOjpkZWMgPDwgTE9HX0VOREw7CisgICAgICAgICAgICAgICAgICAgIExPR19WIDw8IHMtPmR1bXAoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMT0dfViA8PCAiU2Vuc29yIG9mIHVzYWdlICIgPDwgc3RkOjpoZXggPDwgZGlnZXN0LmZ1bGxVc2FnZSA8PCBzdGQ6OmRlYworICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIG5vdCB2YWxpZCEiIDw8IExPR19FTkRMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExPR19WIDw8IExPR19FTkRMOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorfTsKKworfS8vIG5hbWVzcGFjZSBTZW5zb3JIYWxFeHQKK30vLyBuYW1lc3BhY2UgYW5kcm9pZAorCitpbnQgbWFpbigpIHsKKyAgICByZXR1cm4gYW5kcm9pZDo6U2Vuc29ySGFsRXh0OjpIaWRSYXdTZW5zb3JUZXN0Ojp0ZXN0KCkgPyAwIDogMTsKK30KZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9tdWx0aWhhbC5jcHAgYi9tb2R1bGVzL3NlbnNvcnMvbXVsdGloYWwuY3BwCmluZGV4IGYzOGQ5MGQuLjI4MTAxMTggMTAwNjQ0Ci0tLSBhL21vZHVsZXMvc2Vuc29ycy9tdWx0aWhhbC5jcHAKKysrIGIvbW9kdWxlcy9zZW5zb3JzL211bHRpaGFsLmNwcApAQCAtMTQsMzMgKzE0LDMwIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8aGFyZHdhcmUvc2Vuc29ycy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxkaXJlbnQuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8cG9sbC5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CisjaW5jbHVkZSAiU2Vuc29yRXZlbnRRdWV1ZS5oIgorI2luY2x1ZGUgIm11bHRpaGFsLmgiCiAKICNkZWZpbmUgTE9HX05ERUJVRyAxCiAjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9zZW5zb3JzLmg+CiAKICNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPGZzdHJlYW0+CiAjaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KIAotI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CiAjaW5jbHVkZSA8ZGxmY24uaD4KLSNpbmNsdWRlIDxTZW5zb3JFdmVudFF1ZXVlLmg+Ci0KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHBvbGwuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KIAotc3RhdGljIGNvbnN0IGNoYXIqIENPTkZJR19GSUxFTkFNRSA9ICIvc3lzdGVtL2V0Yy9zZW5zb3JzL2hhbHMuY29uZiI7Ci1zdGF0aWMgY29uc3QgaW50IE1BWF9DT05GX0xJTkVfTEVOR1RIID0gMTAyNDsKIAogc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBpbml0X21vZHVsZXNfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwogc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBpbml0X3NlbnNvcnNfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwpAQCAtMjU4LDkgKzI1NSw5IEBACiAgICAgfQogfQogCi0vLyBBbmRyb2lkIEwgcmVxdWlyZXMgc2Vuc29yIEhBTHMgdG8gYmUgZWl0aGVyIDFfMCBvciAxXzMgY29tcGxpYW50CisvLyBBbmRyb2lkIE4gYW5kIGhpcmUgcmVxdWlyZSBzZW5zb3IgSEFMcyB0byBiZSBhdCBsZWFzdCAxXzMgY29tcGxpYW50CiAjZGVmaW5lIEhBTF9WRVJTSU9OX0lTX0NPTVBMSUFOVCh2ZXJzaW9uKSAgXAotICAgICh2ZXJzaW9uID09IFNFTlNPUlNfREVWSUNFX0FQSV9WRVJTSU9OXzFfMCB8fCB2ZXJzaW9uID49IFNFTlNPUlNfREVWSUNFX0FQSV9WRVJTSU9OXzFfMykKKyAgICAodmVyc2lvbiA+PSBTRU5TT1JTX0RFVklDRV9BUElfVkVSU0lPTl8xXzMpCiAKIC8vIFJldHVybnMgdHJ1ZSBpZiBIQUwgaXMgY29tcGxpYW50LCBmYWxzZSBpZiBIQUwgaXMgbm90IGNvbXBsaWFudCBvciBpZiBoYW5kbGUgaXMgaW52YWxpZAogc3RhdGljIGJvb2wgaGFsSXNDb21wbGlhbnQoc2Vuc29yc19wb2xsX2NvbnRleHRfdCAqY3R4LCBpbnQgaGFuZGxlKSB7CkBAIC01MDQsMTMgKzUwMSwxMyBAQAogICovCiBzdGF0aWMgdm9pZCBnZXRfc29fcGF0aHMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICpzb19wYXRocykgewogICAgIHN0ZDo6c3RyaW5nIGxpbmU7Ci0gICAgc3RkOjppZnN0cmVhbSBjb25mX2ZpbGUoQ09ORklHX0ZJTEVOQU1FKTsKKyAgICBzdGQ6Omlmc3RyZWFtIGNvbmZfZmlsZShNVUxUSV9IQUxfQ09ORklHX0ZJTEVfUEFUSCk7CiAKICAgICBpZighY29uZl9maWxlKSB7Ci0gICAgICAgIEFMT0dXKCJObyBtdWx0aWhhbCBjb25maWcgZmlsZSBmb3VuZCBhdCAlcyIsIENPTkZJR19GSUxFTkFNRSk7CisgICAgICAgIEFMT0dXKCJObyBtdWx0aWhhbCBjb25maWcgZmlsZSBmb3VuZCBhdCAlcyIsIE1VTFRJX0hBTF9DT05GSUdfRklMRV9QQVRIKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBBTE9HVigiTXVsdGloYWwgY29uZmlnIGZpbGUgZm91bmQgYXQgJXMiLCBDT05GSUdfRklMRU5BTUUpOworICAgIEFMT0dWKCJNdWx0aWhhbCBjb25maWcgZmlsZSBmb3VuZCBhdCAlcyIsIE1VTFRJX0hBTF9DT05GSUdfRklMRV9QQVRIKTsKICAgICB3aGlsZSAoc3RkOjpnZXRsaW5lKGNvbmZfZmlsZSwgbGluZSkpIHsKICAgICAgICAgQUxPR1YoImNvbmZpZyBmaWxlIGxpbmU6ICclcyciLCBsaW5lLmNfc3RyKCkpOwogICAgICAgICBzb19wYXRocy0+cHVzaF9iYWNrKGxpbmUpOwpAQCAtNjYwLDYgKzY1NywxMCBAQAogICAgIC5nZXRfc2Vuc29yc19saXN0ID0gbW9kdWxlX19nZXRfc2Vuc29yc19saXN0CiB9OwogCitzdHJ1Y3Qgc2Vuc29yc19tb2R1bGVfdCAqZ2V0X211bHRpX2hhbF9tb2R1bGVfaW5mbygpIHsKKyAgICByZXR1cm4gKCZIQUxfTU9EVUxFX0lORk9fU1lNKTsKK30KKwogc3RhdGljIGludCBvcGVuX3NlbnNvcnMoY29uc3Qgc3RydWN0IGh3X21vZHVsZV90KiBod19tb2R1bGUsIGNvbnN0IGNoYXIqIG5hbWUsCiAgICAgICAgIHN0cnVjdCBod19kZXZpY2VfdCoqIGh3X2RldmljZV9vdXQpIHsKICAgICBBTE9HVigib3Blbl9zZW5zb3JzIGJlZ2luLi4uIik7CmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvbXVsdGloYWwuaCBiL21vZHVsZXMvc2Vuc29ycy9tdWx0aWhhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMGM3Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvbXVsdGloYWwuaApAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgSEFSRFdBUkVfTElCSEFSRFdBUkVfTU9EVUxFU19TRU5TT1JTX01VTFRJSEFMX0hfCisjZGVmaW5lIEhBUkRXQVJFX0xJQkhBUkRXQVJFX01PRFVMRVNfU0VOU09SU19NVUxUSUhBTF9IXworCisjaW5jbHVkZSA8aGFyZHdhcmUvc2Vuc29ycy5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CisKK3N0YXRpYyBjb25zdCBjaGFyKiBNVUxUSV9IQUxfQ09ORklHX0ZJTEVfUEFUSCA9ICIvc3lzdGVtL2V0Yy9zZW5zb3JzL2hhbHMuY29uZiI7CisKK3N0cnVjdCBzZW5zb3JzX21vZHVsZV90ICpnZXRfbXVsdGlfaGFsX21vZHVsZV9pbmZvKHZvaWQpOworCisjZW5kaWYgLy8gSEFSRFdBUkVfTElCSEFSRFdBUkVfTU9EVUxFU19TRU5TT1JTX01VTFRJSEFMX0hfCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvdGVzdHMvU2Vuc29yRXZlbnRRdWV1ZV90ZXN0LmNwcCBiL21vZHVsZXMvc2Vuc29ycy90ZXN0cy9TZW5zb3JFdmVudFF1ZXVlX3Rlc3QuY3BwCmluZGV4IDMyMThiYjkuLmQzZDc1ZWUgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvc2Vuc29ycy90ZXN0cy9TZW5zb3JFdmVudFF1ZXVlX3Rlc3QuY3BwCisrKyBiL21vZHVsZXMvc2Vuc29ycy90ZXN0cy9TZW5zb3JFdmVudFF1ZXVlX3Rlc3QuY3BwCkBAIC0zMiw3ICszMiw3IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgY2hlY2tJbnQoY2hhciogbXNnLCBpbnQgZXhwZWN0ZWQsIGludCBhY3R1YWwpIHsKK2Jvb2wgY2hlY2tJbnQoY29uc3QgY2hhciogbXNnLCBpbnQgZXhwZWN0ZWQsIGludCBhY3R1YWwpIHsKICAgICBpZiAoYWN0dWFsICE9IGV4cGVjdGVkKSB7CiAgICAgICAgIHByaW50ZigiJXM7IGV4cGVjdGVkICVkOyBhY3R1YWwgd2FzICVkXG4iLCBtc2csIGV4cGVjdGVkLCBhY3R1YWwpOwogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xODcsNyArMTg3LDcgQEAKIH0KIAogCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKK2ludCBtYWluKGludCBhcmdjIF9fYXR0cmlidXRlKCh1bnVzZWQpKSwgY2hhciAqKmFyZ3YgX19hdHRyaWJ1dGUoKHVudXNlZCkpKSB7CiAgICAgaWYgKHRlc3RTaW1wbGVXcml0ZVNpemVDb3VudHMoKSAmJgogICAgICAgICAgICAgdGVzdFdyYXBwaW5nV3JpdGVTaXplQ291bnRzKCkgJiYKICAgICAgICAgICAgIHRlc3RGdWxsUXVldWVJbygpKSB7CmRpZmYgLS1naXQgYS9tb2R1bGVzL3NvdW5kdHJpZ2dlci9BbmRyb2lkLm1rIGIvbW9kdWxlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5tawppbmRleCBiYjU4MDUzLi44MjUwZjliIDEwMDY0NAotLS0gYS9tb2R1bGVzL3NvdW5kdHJpZ2dlci9BbmRyb2lkLm1rCisrKyBiL21vZHVsZXMvc291bmR0cmlnZ2VyL0FuZHJvaWQubWsKQEAgLTE5LDYgKzE5LDcgQEAKIAogTE9DQUxfTU9EVUxFIDo9IHNvdW5kX3RyaWdnZXIuc3R1Yi5kZWZhdWx0CiBMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBodworTE9DQUxfUFJPUFJJRVRBUllfTU9EVUxFIDo9IHRydWUKIExPQ0FMX1NSQ19GSUxFUyA6PSBzb3VuZF90cmlnZ2VyX2h3LmMKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlibG9nIGxpYmN1dGlscwogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKZGlmZiAtLWdpdCBhL21vZHVsZXMvdGhlcm1hbC9BbmRyb2lkLm1rIGIvbW9kdWxlcy90aGVybWFsL0FuZHJvaWQubWsKaW5kZXggODBhZDc4YS4uZmY1MTE0NSAxMDA2NDQKLS0tIGEvbW9kdWxlcy90aGVybWFsL0FuZHJvaWQubWsKKysrIGIvbW9kdWxlcy90aGVybWFsL0FuZHJvaWQubWsKQEAgLTE4LDYgKzE4LDcgQEAKIAogTE9DQUxfTU9EVUxFIDo9IHRoZXJtYWwuZGVmYXVsdAogTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gaHcKK0xPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSA6PSB0cnVlCiBMT0NBTF9TUkNfRklMRVMgOj0gdGhlcm1hbC5jCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmxvZyBsaWJjdXRpbHMKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCmRpZmYgLS1naXQgYS9tb2R1bGVzL3RoZXJtYWwvdGhlcm1hbC5jIGIvbW9kdWxlcy90aGVybWFsL3RoZXJtYWwuYwppbmRleCA2YmE1ODQ1Li43ZjRkZTNiIDEwMDY0NAotLS0gYS9tb2R1bGVzL3RoZXJtYWwvdGhlcm1hbC5jCisrKyBiL21vZHVsZXMvdGhlcm1hbC90aGVybWFsLmMKQEAgLTEzOCw4ICsxMzgsOSBAQAogICAgICAgICAgICAgZmNsb3NlKGZpbGUpOwogICAgICAgICAgICAgZmNsb3NlKGNwdV9maWxlKTsKICAgICAgICAgICAgIHJldHVybiBlcnJubyA/IC1lcnJubyA6IC1FSU87CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmY2xvc2UoY3B1X2ZpbGUpOwogICAgICAgICB9Ci0gICAgICAgIGZjbG9zZShjcHVfZmlsZSk7CiAKICAgICAgICAgaWYgKGxpc3QgIT0gTlVMTCkgewogICAgICAgICAgICAgbGlzdFtzaXplXSA9IChjcHVfdXNhZ2VfdCkgewpkaWZmIC0tZ2l0IGEvbW9kdWxlcy90dl9pbnB1dC9BbmRyb2lkLmJwIGIvbW9kdWxlcy90dl9pbnB1dC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOTE5OGQKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3R2X2lucHV0L0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAidHZfaW5wdXQuZGVmYXVsdCIsCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiaHciLAorICAgIHByb3ByaWV0YXJ5OiB0cnVlLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorICAgIHNyY3M6IFsidHZfaW5wdXQuY3BwIl0sCit9CmRpZmYgLS1naXQgYS9tb2R1bGVzL3R2X2lucHV0L0FuZHJvaWQubWsgYi9tb2R1bGVzL3R2X2lucHV0L0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YWE3ZmMuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy90dl9pbnB1dC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gaHcKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3V0aWxzIGxpYmxvZwotTE9DQUxfU1JDX0ZJTEVTIDo9IHR2X2lucHV0LmNwcAotTE9DQUxfTU9EVUxFIDo9IHR2X2lucHV0LmRlZmF1bHQKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tb2R1bGVzL3R2X2lucHV0L3R2X2lucHV0LmNwcCBiL21vZHVsZXMvdHZfaW5wdXQvdHZfaW5wdXQuY3BwCmluZGV4IDExNGU4MGUuLmRkYWNlMjggMTAwNjQ0Ci0tLSBhL21vZHVsZXMvdHZfaW5wdXQvdHZfaW5wdXQuY3BwCisrKyBiL21vZHVsZXMvdHZfaW5wdXQvdHZfaW5wdXQuY3BwCkBAIC0zNywxOCArMzcsMTggQEAKICAgICAgICAgY29uc3QgY2hhciogbmFtZSwgc3RydWN0IGh3X2RldmljZV90KiogZGV2aWNlKTsKIAogc3RhdGljIHN0cnVjdCBod19tb2R1bGVfbWV0aG9kc190IHR2X2lucHV0X21vZHVsZV9tZXRob2RzID0gewotICAgIG9wZW46IHR2X2lucHV0X2RldmljZV9vcGVuCisgICAgLm9wZW4gPSB0dl9pbnB1dF9kZXZpY2Vfb3BlbgogfTsKIAogdHZfaW5wdXRfbW9kdWxlX3QgSEFMX01PRFVMRV9JTkZPX1NZTSA9IHsKLSAgICBjb21tb246IHsKLSAgICAgICAgdGFnOiBIQVJEV0FSRV9NT0RVTEVfVEFHLAotICAgICAgICB2ZXJzaW9uX21ham9yOiAwLAotICAgICAgICB2ZXJzaW9uX21pbm9yOiAxLAotICAgICAgICBpZDogVFZfSU5QVVRfSEFSRFdBUkVfTU9EVUxFX0lELAotICAgICAgICBuYW1lOiAiU2FtcGxlIFRWIGlucHV0IG1vZHVsZSIsCi0gICAgICAgIGF1dGhvcjogIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QiLAotICAgICAgICBtZXRob2RzOiAmdHZfaW5wdXRfbW9kdWxlX21ldGhvZHMsCisgICAgLmNvbW1vbiA9IHsKKyAgICAgICAgLnRhZyA9IEhBUkRXQVJFX01PRFVMRV9UQUcsCisgICAgICAgIC52ZXJzaW9uX21ham9yID0gMCwKKyAgICAgICAgLnZlcnNpb25fbWlub3IgPSAxLAorICAgICAgICAuaWQgPSBUVl9JTlBVVF9IQVJEV0FSRV9NT0RVTEVfSUQsCisgICAgICAgIC5uYW1lID0gIlNhbXBsZSBUViBpbnB1dCBtb2R1bGUiLAorICAgICAgICAuYXV0aG9yID0gIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QiLAorICAgICAgICAubWV0aG9kcyA9ICZ0dl9pbnB1dF9tb2R1bGVfbWV0aG9kcywKICAgICB9CiB9OwogCmRpZmYgLS1naXQgYS9tb2R1bGVzL3VzYmF1ZGlvL0FuZHJvaWQubWsgYi9tb2R1bGVzL3VzYmF1ZGlvL0FuZHJvaWQubWsKaW5kZXggOWRmMWU3OS4uYjM2YmY5ZiAxMDA2NDQKLS0tIGEvbW9kdWxlcy91c2JhdWRpby9BbmRyb2lkLm1rCisrKyBiL21vZHVsZXMvdXNiYXVkaW8vQW5kcm9pZC5tawpAQCAtMTgsNiArMTgsNyBAQAogCiBMT0NBTF9NT0RVTEUgOj0gYXVkaW8udXNiLmRlZmF1bHQKIExPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IGh3CitMT0NBTF9QUk9QUklFVEFSWV9NT0RVTEUgOj0gdHJ1ZQogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKIAlhdWRpb19oYWwuYwogTE9DQUxfQ19JTkNMVURFUyArPSBcCmRpZmYgLS1naXQgYS9tb2R1bGVzL3VzYmNhbWVyYS9DYW1lcmEuY3BwIGIvbW9kdWxlcy91c2JjYW1lcmEvQ2FtZXJhLmNwcAppbmRleCBjZjYyZjdmLi5iMzk2MjkxIDEwMDY0NAotLS0gYS9tb2R1bGVzL3VzYmNhbWVyYS9DYW1lcmEuY3BwCisrKyBiL21vZHVsZXMvdXNiY2FtZXJhL0NhbWVyYS5jcHAKQEAgLTQ4NCw5ICs0ODQsOSBAQAogICAgIC8vIFRPRE86IGR1bXAgYWxsIHNldHRpbmdzCiAgICAgZHByaW50ZihmZCwgIk1vc3QgUmVjZW50IFNldHRpbmdzOiAoJXApXG4iLCBtU2V0dGluZ3MpOwogCi0gICAgZHByaW50ZihmZCwgIk51bWJlciBvZiBzdHJlYW1zOiAlZFxuIiwgbVN0cmVhbXMuc2l6ZSgpKTsKKyAgICBkcHJpbnRmKGZkLCAiTnVtYmVyIG9mIHN0cmVhbXM6ICV6dVxuIiwgbVN0cmVhbXMuc2l6ZSgpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdHJlYW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGRwcmludGYoZmQsICJTdHJlYW0gJWQvJWQ6XG4iLCBpLCBtU3RyZWFtcy5zaXplKCkpOworICAgICAgICBkcHJpbnRmKGZkLCAiU3RyZWFtICV6dS8lenU6XG4iLCBpLCBtU3RyZWFtcy5zaXplKCkpOwogICAgICAgICBtU3RyZWFtc1tpXS0+ZHVtcChmZCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy91c2JjYW1lcmEvQ2FtZXJhLmggYi9tb2R1bGVzL3VzYmNhbWVyYS9DYW1lcmEuaAppbmRleCA2NDE5YzdkLi40MDUxMzQ1IDEwMDY0NAotLS0gYS9tb2R1bGVzL3VzYmNhbWVyYS9DYW1lcmEuaAorKysgYi9tb2R1bGVzL3VzYmNhbWVyYS9DYW1lcmEuaApAQCAtMzgsNyArMzgsNyBAQAogICAgIHB1YmxpYzoKICAgICAgICAgLy8gaWQgaXMgdXNlZCB0byBkaXN0aW5ndWlzaCBjYW1lcmFzLiAwIDw9IGlkIDwgTlVNX0NBTUVSQVMuCiAgICAgICAgIC8vIG1vZHVsZSBpcyBhIGhhbmRsZSB0byB0aGUgSEFMIG1vZHVsZSwgdXNlZCB3aGVuIHRoZSBkZXZpY2UgaXMgb3BlbmVkLgotICAgICAgICBDYW1lcmEoaW50IGlkKTsKKyAgICAgICAgZXhwbGljaXQgQ2FtZXJhKGludCBpZCk7CiAgICAgICAgIHZpcnR1YWwgfkNhbWVyYSgpOwogCiAgICAgICAgIC8vIENvbW1vbiBDYW1lcmEgRGV2aWNlIE9wZXJhdGlvbnMgKHNlZSA8aGFyZHdhcmUvY2FtZXJhX2NvbW1vbi5oPikKZGlmZiAtLWdpdCBhL21vZHVsZXMvdXNiY2FtZXJhL0NhbWVyYUhBTC5jcHAgYi9tb2R1bGVzL3VzYmNhbWVyYS9DYW1lcmFIQUwuY3BwCmluZGV4IDY1MmU5MzcuLmM1NDI4M2IgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvdXNiY2FtZXJhL0NhbWVyYUhBTC5jcHAKKysrIGIvbW9kdWxlcy91c2JjYW1lcmEvQ2FtZXJhSEFMLmNwcApAQCAtNjUsNyArNjUsNyBAQAogCiBpbnQgQ2FtZXJhSEFMOjpnZXROdW1iZXJPZkNhbWVyYXMoKSB7CiAgICAgYW5kcm9pZDo6TXV0ZXg6OkF1dG9sb2NrIGFsKG1Nb2R1bGVMb2NrKTsKLSAgICBBTE9HVigiJXM6ICVkIiwgX19mdW5jX18sIG1DYW1lcmFzLnNpemUoKSk7CisgICAgQUxPR1YoIiVzOiAlenUiLCBfX2Z1bmNfXywgbUNhbWVyYXMuc2l6ZSgpKTsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihtQ2FtZXJhcy5zaXplKCkpOwogfQogCkBAIC0xMjYsMjkgKzEyNiwyOSBAQAogfQogCiBzdGF0aWMgaHdfbW9kdWxlX21ldGhvZHNfdCBnQ2FtZXJhTW9kdWxlTWV0aG9kcyA9IHsKLSAgICBvcGVuIDogb3Blbl9kZXYKKyAgICAub3BlbiA9IG9wZW5fZGV2CiB9OwogCiBjYW1lcmFfbW9kdWxlX3QgSEFMX01PRFVMRV9JTkZPX1NZTSBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkgPSB7Ci0gICAgY29tbW9uIDogewotICAgICAgICB0YWcgICAgICAgICAgICAgICAgOiBIQVJEV0FSRV9NT0RVTEVfVEFHLAotICAgICAgICBtb2R1bGVfYXBpX3ZlcnNpb24gOiBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfNCwKLSAgICAgICAgaGFsX2FwaV92ZXJzaW9uICAgIDogSEFSRFdBUkVfSEFMX0FQSV9WRVJTSU9OLAotICAgICAgICBpZCAgICAgICAgICAgICAgICAgOiBDQU1FUkFfSEFSRFdBUkVfTU9EVUxFX0lELAotICAgICAgICBuYW1lICAgICAgICAgICAgICAgOiAiRGVmYXVsdCBVU0IgQ2FtZXJhIEhBTCIsCi0gICAgICAgIGF1dGhvciAgICAgICAgICAgICA6ICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IiwKLSAgICAgICAgbWV0aG9kcyAgICAgICAgICAgIDogJmdDYW1lcmFNb2R1bGVNZXRob2RzLAotICAgICAgICBkc28gICAgICAgICAgICAgICAgOiBOVUxMLAotICAgICAgICByZXNlcnZlZCAgICAgICAgICAgOiB7MH0sCisgICAgLmNvbW1vbiA9IHsKKyAgICAgICAgLnRhZyAgICAgICAgICAgICAgICA9IEhBUkRXQVJFX01PRFVMRV9UQUcsCisgICAgICAgIC5tb2R1bGVfYXBpX3ZlcnNpb24gPSBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfNCwKKyAgICAgICAgLmhhbF9hcGlfdmVyc2lvbiAgICA9IEhBUkRXQVJFX0hBTF9BUElfVkVSU0lPTiwKKyAgICAgICAgLmlkICAgICAgICAgICAgICAgICA9IENBTUVSQV9IQVJEV0FSRV9NT0RVTEVfSUQsCisgICAgICAgIC5uYW1lICAgICAgICAgICAgICAgPSAiRGVmYXVsdCBVU0IgQ2FtZXJhIEhBTCIsCisgICAgICAgIC5hdXRob3IgICAgICAgICAgICAgPSAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIsCisgICAgICAgIC5tZXRob2RzICAgICAgICAgICAgPSAmZ0NhbWVyYU1vZHVsZU1ldGhvZHMsCisgICAgICAgIC5kc28gICAgICAgICAgICAgICAgPSBOVUxMLAorICAgICAgICAucmVzZXJ2ZWQgICAgICAgICAgID0gezB9LAogICAgIH0sCi0gICAgZ2V0X251bWJlcl9vZl9jYW1lcmFzIDogZ2V0X251bWJlcl9vZl9jYW1lcmFzLAotICAgIGdldF9jYW1lcmFfaW5mbyAgICAgICA6IGdldF9jYW1lcmFfaW5mbywKLSAgICBzZXRfY2FsbGJhY2tzICAgICAgICAgOiBzZXRfY2FsbGJhY2tzLAotICAgIGdldF92ZW5kb3JfdGFnX29wcyAgICA6IE5VTEwsCi0gICAgb3Blbl9sZWdhY3kgICAgICAgICAgIDogTlVMTCwKLSAgICBzZXRfdG9yY2hfbW9kZSAgICAgICAgOiBOVUxMLAotICAgIGluaXQgICAgICAgICAgICAgICAgICA6IE5VTEwsCi0gICAgcmVzZXJ2ZWQgICAgICAgICAgICAgIDogezB9LAorICAgIC5nZXRfbnVtYmVyX29mX2NhbWVyYXMgPSBnZXRfbnVtYmVyX29mX2NhbWVyYXMsCisgICAgLmdldF9jYW1lcmFfaW5mbyAgICAgICA9IGdldF9jYW1lcmFfaW5mbywKKyAgICAuc2V0X2NhbGxiYWNrcyAgICAgICAgID0gc2V0X2NhbGxiYWNrcywKKyAgICAuZ2V0X3ZlbmRvcl90YWdfb3BzICAgID0gTlVMTCwKKyAgICAub3Blbl9sZWdhY3kgICAgICAgICAgID0gTlVMTCwKKyAgICAuc2V0X3RvcmNoX21vZGUgICAgICAgID0gTlVMTCwKKyAgICAuaW5pdCAgICAgICAgICAgICAgICAgID0gTlVMTCwKKyAgICAucmVzZXJ2ZWQgICAgICAgICAgICAgID0gezB9LAogfTsKIH0gLy8gZXh0ZXJuICJDIgogCmRpZmYgLS1naXQgYS9tb2R1bGVzL3VzYmNhbWVyYS9Ib3RwbHVnVGhyZWFkLmNwcCBiL21vZHVsZXMvdXNiY2FtZXJhL0hvdHBsdWdUaHJlYWQuY3BwCmluZGV4IDZjNjUwODYuLjAyZTcxNjcgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvdXNiY2FtZXJhL0hvdHBsdWdUaHJlYWQuY3BwCisrKyBiL21vZHVsZXMvdXNiY2FtZXJhL0hvdHBsdWdUaHJlYWQuY3BwCkBAIC0zOSw2ICszOSw3IEBACiB9CiAKIGJvb2wgSG90cGx1Z1RocmVhZDo6dGhyZWFkTG9vcCgpIHsKKyAgICAodm9pZCltTW9kdWxlOyAgLy8gc2lsZW5jZSB3YXJuaW5nIGFib3V0IHVudXNlZCBtZW1iZXIuCiAKICAgICAvKioKICAgICAgKiBDaGVjayBjYW1lcmEgY29ubmVjdGlvbiBzdGF0dXMgY2hhbmdlLCBpZiBjb25uZWN0ZWQsIGRvIGJlbG93OgpkaWZmIC0tZ2l0IGEvbW9kdWxlcy91c2JjYW1lcmEvSG90cGx1Z1RocmVhZC5oIGIvbW9kdWxlcy91c2JjYW1lcmEvSG90cGx1Z1RocmVhZC5oCmluZGV4IGExM2FkYjcuLjYyNWRjYjQgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvdXNiY2FtZXJhL0hvdHBsdWdUaHJlYWQuaAorKysgYi9tb2R1bGVzL3VzYmNhbWVyYS9Ib3RwbHVnVGhyZWFkLmgKQEAgLTM2LDcgKzM2LDcgQEAKIGNsYXNzIEhvdHBsdWdUaHJlYWQgOiBwdWJsaWMgYW5kcm9pZDo6VGhyZWFkIHsKIAogICAgIHB1YmxpYzoKLSAgICAgICAgSG90cGx1Z1RocmVhZChDYW1lcmFIQUwgKmhhbCk7CisgICAgICAgIGV4cGxpY2l0IEhvdHBsdWdUaHJlYWQoQ2FtZXJhSEFMICpoYWwpOwogICAgICAgICB+SG90cGx1Z1RocmVhZCgpOwogCiAgICAgICAgIC8vIE92ZXJyaWRlIGJlbG93IHR3byBtZXRob2RzIGZvciBwcm9wZXIgY2xlYW51cC4KZGlmZiAtLWdpdCBhL21vZHVsZXMvdXNiY2FtZXJhL1N0cmVhbS5jcHAgYi9tb2R1bGVzL3VzYmNhbWVyYS9TdHJlYW0uY3BwCmluZGV4IGY1Njg2NmUuLjJiODM0MjEgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvdXNiY2FtZXJhL1N0cmVhbS5jcHAKKysrIGIvbW9kdWxlcy91c2JjYW1lcmEvU3RyZWFtLmNwcApAQCAtMTcwLDEwICsxNzAsOSBAQAogICAgIC8vIFRvRG86IHByZXR0eXByaW50IHVzYWdlIG1hc2sgZmxhZ3MKICAgICBkcHJpbnRmKGZkLCAiR3JhbGxvYyBVc2FnZSBNYXNrOiAlIyIgUFJJeDMyICJcbiIsIG1TdHJlYW0tPnVzYWdlKTsKICAgICBkcHJpbnRmKGZkLCAiTWF4IEJ1ZmZlciBDb3VudDogJSIgUFJJdTMyICJcbiIsIG1TdHJlYW0tPm1heF9idWZmZXJzKTsKLSAgICBkcHJpbnRmKGZkLCAiTnVtYmVyIG9mIEJ1ZmZlcnMgaW4gdXNlIGJ5IEhBTDogJSIgUFJJdTMyICJcbiIsIG1CdWZmZXJzLnNpemUoKSk7CisgICAgZHByaW50ZihmZCwgIk51bWJlciBvZiBCdWZmZXJzIGluIHVzZSBieSBIQUw6ICV6dVxuIiwgbUJ1ZmZlcnMuc2l6ZSgpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1CdWZmZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGRwcmludGYoZmQsICJCdWZmZXIgJSIgUFJJdTMyICIvJSIgUFJJdTMyICI6ICVwXG4iLCBpLCBtQnVmZmVycy5zaXplKCksCi0gICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0pOworICAgICAgICBkcHJpbnRmKGZkLCAiQnVmZmVyICV6dS8lenU6ICVwXG4iLCBpLCBtQnVmZmVycy5zaXplKCksIG1CdWZmZXJzW2ldKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL21vZHVsZXMvdXNiY2FtZXJhL1VzYkNhbWVyYS5jcHAgYi9tb2R1bGVzL3VzYmNhbWVyYS9Vc2JDYW1lcmEuY3BwCmluZGV4IDgyYTExNDUuLjlkNTNmYzYgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvdXNiY2FtZXJhL1VzYkNhbWVyYS5jcHAKKysrIGIvbW9kdWxlcy91c2JjYW1lcmEvVXNiQ2FtZXJhLmNwcApAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgIkNhbWVyYS5oIgogI2luY2x1ZGUgIlVzYkNhbWVyYS5oIgogCi0jZGVmaW5lIEFSUkFZX1NJWkUoYSkgKHNpemVvZihhKSAvIHNpemVvZihhWzBdKSkKKyNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKChhKVswXSkpCiAKIG5hbWVzcGFjZSB1c2JfY2FtZXJhX2hhbCB7CiAKQEAgLTMxMyw3ICszMTMsNyBAQAogICAgIHJldHVybiBzZXRUZW1wbGF0ZShDQU1FUkEzX1RFTVBMQVRFX01BTlVBTCwgbS5nZXQoKSk7CiB9CiAKLWJvb2wgVXNiQ2FtZXJhOjppc1ZhbGlkQ2FwdHVyZVNldHRpbmdzKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90KiBzZXR0aW5ncykgeworYm9vbCBVc2JDYW1lcmE6OmlzVmFsaWRDYXB0dXJlU2V0dGluZ3MoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QqIC8qc2V0dGluZ3MqLykgewogICAgIC8vIFRPRE86IHJlamVjdCBzZXR0aW5ncyB0aGF0IGNhbm5vdCBiZSBjYXB0dXJlZAogICAgIHJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy91c2JjYW1lcmEvVXNiQ2FtZXJhLmggYi9tb2R1bGVzL3VzYmNhbWVyYS9Vc2JDYW1lcmEuaAppbmRleCBmZTUyYWRlLi41NzAxN2ZlIDEwMDY0NAotLS0gYS9tb2R1bGVzL3VzYmNhbWVyYS9Vc2JDYW1lcmEuaAorKysgYi9tb2R1bGVzL3VzYmNhbWVyYS9Vc2JDYW1lcmEuaApAQCAtMjgsNyArMjgsNyBAQAogICovCiBjbGFzcyBVc2JDYW1lcmEgOiBwdWJsaWMgQ2FtZXJhIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIFVzYkNhbWVyYShpbnQgaWQpOworICAgICAgICBleHBsaWNpdCBVc2JDYW1lcmEoaW50IGlkKTsKICAgICAgICAgflVzYkNhbWVyYSgpOwogCiAgICAgcHJpdmF0ZToKZGlmZiAtLWdpdCBhL21vZHVsZXMvdmVoaWNsZS9BbmRyb2lkLm1rIGIvbW9kdWxlcy92ZWhpY2xlL0FuZHJvaWQubWsKaW5kZXggYTY2NmJjNi4uOWZkNDlkYSAxMDA2NDQKLS0tIGEvbW9kdWxlcy92ZWhpY2xlL0FuZHJvaWQubWsKKysrIGIvbW9kdWxlcy92ZWhpY2xlL0FuZHJvaWQubWsKQEAgLTE5LDYgKzE5LDcgQEAKIExPQ0FMX01PRFVMRSA6PSB2ZWhpY2xlLmRlZmF1bHQKIAogTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gaHcKK0xPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSA6PSB0cnVlCiBMT0NBTF9DX0lOQ0xVREVTIDo9IGhhcmR3YXJlL2xpYmhhcmR3YXJlCiBMT0NBTF9TUkNfRklMRVMgOj0gdmVoaWNsZS5jIHRpbWVVdGlsLmNwcAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJsb2cgbGliY3V0aWxzIGxpYnV0aWxzCmRpZmYgLS1naXQgYS9tb2R1bGVzL3ZlaGljbGUvdmVoaWNsZS5jIGIvbW9kdWxlcy92ZWhpY2xlL3ZlaGljbGUuYwppbmRleCBhMjZmMjdjLi4yZDk0NWZkIDEwMDY0NAotLS0gYS9tb2R1bGVzL3ZlaGljbGUvdmVoaWNsZS5jCisrKyBiL21vZHVsZXMvdmVoaWNsZS92ZWhpY2xlLmMKQEAgLTI3OSwxMCArMjc5LDEwIEBACiAgICAgICAgICAgICBBTE9HRCgiVmFsdWUgdHlwZTogRkxPQVRcblZhbHVlOiAlZlxuIiwgZGF0YS0+dmFsdWUuZmxvYXRfdmFsdWUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgVkVISUNMRV9WQUxVRV9UWVBFX0lOVDMyOgotICAgICAgICAgICAgQUxPR0QoIlZhbHVlIHR5cGU6IElOVDMyXG5WYWx1ZTogJWRcbiIsIGRhdGEtPnZhbHVlLmludDMyX3ZhbHVlKTsKKyAgICAgICAgICAgIEFMT0dEKCJWYWx1ZSB0eXBlOiBJTlQzMlxuVmFsdWU6ICUiIFBSSWQzMiAiXG4iLCBkYXRhLT52YWx1ZS5pbnQzMl92YWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfSU5UNjQ6Ci0gICAgICAgICAgICBBTE9HRCgiVmFsdWUgdHlwZTogSU5UNjRcblZhbHVlOiAlbGxkXG4iLCBkYXRhLT52YWx1ZS5pbnQ2NF92YWx1ZSk7CisgICAgICAgICAgICBBTE9HRCgiVmFsdWUgdHlwZTogSU5UNjRcblZhbHVlOiAlIiBQUklkNjQgIlxuIiwgZGF0YS0+dmFsdWUuaW50NjRfdmFsdWUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgVkVISUNMRV9WQUxVRV9UWVBFX0JPT0xFQU46CiAgICAgICAgICAgICBBTE9HRCgiVmFsdWUgdHlwZTogQk9PTEVBTlxuVmFsdWU6ICVkXG4iLCBkYXRhLT52YWx1ZS5ib29sZWFuX3ZhbHVlKTsKQEAgLTMzMSwyMiArMzMxLDYgQEAKICAgICAgICAgZXZlbnQucHJvcCA9IHN1Yi0+cHJvcDsKICAgICAgICAgZXZlbnQudGltZXN0YW1wID0gZWxhcHNlZFJlYWx0aW1lTmFubygpOwogICAgICAgICBzd2l0Y2ggKHN1Yi0+cHJvcCkgewotICAgICAgICAgICAgY2FzZSBWRUhJQ0xFX1BST1BFUlRZX0RSSVZJTkdfU1RBVFVTOgotICAgICAgICAgICAgICAgIGV2ZW50LnZhbHVlX3R5cGUgPSBWRUhJQ0xFX1ZBTFVFX1RZUEVfSU5UMzI7Ci0gICAgICAgICAgICAgICAgc3dpdGNoICgoZXZlbnQudGltZXN0YW1wICYgMHgzMDAwMDAwMCk+PjI4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnZhbHVlLmRyaXZpbmdfc3RhdHVzID0gVkVISUNMRV9EUklWSU5HX1NUQVRVU19VTlJFU1RSSUNURUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQudmFsdWUuZHJpdmluZ19zdGF0dXMgPSBWRUhJQ0xFX0RSSVZJTkdfU1RBVFVTX05PX1ZJREVPOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnZhbHVlLmRyaXZpbmdfc3RhdHVzID0gVkVISUNMRV9EUklWSU5HX1NUQVRVU19OT19LRVlCT0FSRF9JTlBVVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQudmFsdWUuZHJpdmluZ19zdGF0dXMgPSBWRUhJQ0xFX0RSSVZJTkdfU1RBVFVTX05PX0NPTkZJRzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFZFSElDTEVfUFJPUEVSVFlfR0VBUl9TRUxFQ1RJT046CiAgICAgICAgICAgICAgICAgZXZlbnQudmFsdWVfdHlwZSA9IFZFSElDTEVfVkFMVUVfVFlQRV9JTlQzMjsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKChldmVudC50aW1lc3RhbXAgJiAweDMwMDAwMDAwKT4+MjgpIHsKZGlmZiAtLWdpdCBhL21vZHVsZXMvdmlicmF0b3IvQW5kcm9pZC5icCBiL21vZHVsZXMvdmlicmF0b3IvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzRhZWJmCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy92aWJyYXRvci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogInZpYnJhdG9yLmRlZmF1bHQiLAorCisgICAgLy8gSEFMIG1vZHVsZSBpbXBsZW1lbnRhdGlvbiBzdG9yZWQgaW4KKyAgICAvLyBody88VklCUkFUT1JfSEFSRFdBUkVfTU9EVUxFX0lEPi5kZWZhdWx0LnNvCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiaHciLAorICAgIHByb3ByaWV0YXJ5OiB0cnVlLAorICAgIGluY2x1ZGVfZGlyczogWyJoYXJkd2FyZS9saWJoYXJkd2FyZSJdLAorICAgIHNyY3M6IFsidmlicmF0b3IuYyJdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmxvZyJdLAorfQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy92aWJyYXRvci92aWJyYXRvci5jIGIvbW9kdWxlcy92aWJyYXRvci92aWJyYXRvci5jCmluZGV4IDZiM2NlNTcuLjkyYzQ2ZTIgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvdmlicmF0b3IvdmlicmF0b3IuYworKysgYi9tb2R1bGVzL3ZpYnJhdG9yL3ZpYnJhdG9yLmMKQEAgLTIxLDQ3ICsyMSw1MSBAQAogCiAjaW5jbHVkZSA8bWFsbG9jLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPG1hdGguaD4KIAorI2RlZmluZSBUSU1FT1VUX1NUUl9MRU4gICAgICAgICAyMAorCiBzdGF0aWMgY29uc3QgY2hhciBUSEVfREVWSUNFW10gPSAiL3N5cy9jbGFzcy90aW1lZF9vdXRwdXQvdmlicmF0b3IvZW5hYmxlIjsKIAotc3RhdGljIGludCB2aWJyYV9leGlzdHMoKSB7CitzdGF0aWMgYm9vbCBkZXZpY2VfZXhpc3RzKGNvbnN0IGNoYXIgKmZpbGUpIHsKICAgICBpbnQgZmQ7CiAKLSAgICBmZCA9IFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKFRIRV9ERVZJQ0UsIE9fUkRXUikpOworICAgIGZkID0gVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oZmlsZSwgT19SRFdSKSk7CiAgICAgaWYoZmQgPCAwKSB7Ci0gICAgICAgIEFMT0dFKCJWaWJyYXRvciBmaWxlIGRvZXMgbm90IGV4aXN0IDogJWQiLCBmZCk7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgY2xvc2UoZmQpOwotICAgIHJldHVybiAxOworICAgIHJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgaW50IHNlbmRpdCh1bnNpZ25lZCBpbnQgdGltZW91dF9tcykKK3N0YXRpYyBib29sIHZpYnJhX2V4aXN0cygpIHsKKyAgICByZXR1cm4gZGV2aWNlX2V4aXN0cyhUSEVfREVWSUNFKTsKK30KKworc3RhdGljIGludCB3cml0ZV92YWx1ZShjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICp2YWx1ZSkKIHsKICAgICBpbnQgdG9fd3JpdGUsIHdyaXR0ZW4sIHJldCwgZmQ7CiAKLSAgICBjaGFyIHZhbHVlWzIwXTsgLyogbGFyZ2UgZW5vdWdoIGZvciBtaWxsaW9ucyBvZiB5ZWFycyAqLwotCi0gICAgZmQgPSBURU1QX0ZBSUxVUkVfUkVUUlkob3BlbihUSEVfREVWSUNFLCBPX1JEV1IpKTsKLSAgICBpZihmZCA8IDApIHsKKyAgICBmZCA9IFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKGZpbGUsIE9fV1JPTkxZKSk7CisgICAgaWYgKGZkIDwgMCkgewogICAgICAgICByZXR1cm4gLWVycm5vOwogICAgIH0KIAotICAgIHRvX3dyaXRlID0gc25wcmludGYodmFsdWUsIHNpemVvZih2YWx1ZSksICIldVxuIiwgdGltZW91dF9tcyk7CisgICAgdG9fd3JpdGUgPSBzdHJsZW4odmFsdWUpICsgMTsKICAgICB3cml0dGVuID0gVEVNUF9GQUlMVVJFX1JFVFJZKHdyaXRlKGZkLCB2YWx1ZSwgdG9fd3JpdGUpKTsKLQogICAgIGlmICh3cml0dGVuID09IC0xKSB7CiAgICAgICAgIHJldCA9IC1lcnJubzsKICAgICB9IGVsc2UgaWYgKHdyaXR0ZW4gIT0gdG9fd3JpdGUpIHsKICAgICAgICAgLyogZXZlbiB0aG91Z2ggRUFHQUlOIGlzIGFuIGVycm5vIHZhbHVlIHRoYXQgY291bGQgYmUgc2V0CiAgICAgICAgICAgIGJ5IHdyaXRlKCkgaW4gc29tZSBjYXNlcywgbm9uZSBvZiB0aGVtIGFwcGx5IGhlcmUuICBTbywgdGhpcyByZXR1cm4KICAgICAgICAgICAgdmFsdWUgY2FuIGJlIGNsZWFybHkgaWRlbnRpZmllZCB3aGVuIGRlYnVnZ2luZyBhbmQgc3VnZ2VzdHMgdGhlCi0gICAgICAgICAgIGNhbGxlciB0aGF0IGl0IG1heSB0cnkgdG8gY2FsbCB2aWJyYXJvcl9vbigpIGFnYWluICovCisgICAgICAgICAgIGNhbGxlciB0aGF0IGl0IG1heSB0cnkgdG8gY2FsbCB2aWJyYXRvcl9vbigpIGFnYWluICovCiAgICAgICAgIHJldCA9IC1FQUdBSU47CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0ID0gMDsKQEAgLTczLDYgKzc3LDE0IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBzZW5kaXQodW5zaWduZWQgaW50IHRpbWVvdXRfbXMpCit7CisgICAgY2hhciB2YWx1ZVtUSU1FT1VUX1NUUl9MRU5dOyAvKiBsYXJnZSBlbm91Z2ggZm9yIG1pbGxpb25zIG9mIHllYXJzICovCisKKyAgICBzbnByaW50Zih2YWx1ZSwgc2l6ZW9mKHZhbHVlKSwgIiV1IiwgdGltZW91dF9tcyk7CisgICAgcmV0dXJuIHdyaXRlX3ZhbHVlKFRIRV9ERVZJQ0UsIHZhbHVlKTsKK30KKwogc3RhdGljIGludCB2aWJyYV9vbih2aWJyYXRvcl9kZXZpY2VfdCogdmlicmFkZXYgX191bnVzZWQsIHVuc2lnbmVkIGludCB0aW1lb3V0X21zKQogewogICAgIC8qIGNvbnN0YW50IG9uLCB1cCB0byBtYXhpbXVtIGFsbG93ZWQgdGltZSAqLwpAQCAtODQsNiArOTYsNDcgQEAKICAgICByZXR1cm4gc2VuZGl0KDApOwogfQogCitzdGF0aWMgY29uc3QgY2hhciBMRURfREVWSUNFW10gPSAiL3N5cy9jbGFzcy9sZWRzL3ZpYnJhdG9yIjsKKworc3RhdGljIGludCB3cml0ZV9sZWRfZmlsZShjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgICBjaGFyIGZpbGVfc3RyWzUwXTsKKworICAgIHNucHJpbnRmKGZpbGVfc3RyLCBzaXplb2YoZmlsZV9zdHIpLCAiJXMvJXMiLCBMRURfREVWSUNFLCBmaWxlKTsKKyAgICByZXR1cm4gd3JpdGVfdmFsdWUoZmlsZV9zdHIsIHZhbHVlKTsKK30KKworc3RhdGljIGJvb2wgdmlicmFfbGVkX2V4aXN0cygpCit7CisgICAgaW50IGZkOworICAgIGNoYXIgZmlsZV9zdHJbNTBdOworCisgICAgc25wcmludGYoZmlsZV9zdHIsIHNpemVvZihmaWxlX3N0ciksICIlcy8lcyIsIExFRF9ERVZJQ0UsICJhY3RpdmF0ZSIpOworICAgIHJldHVybiBkZXZpY2VfZXhpc3RzKGZpbGVfc3RyKTsKK30KKworc3RhdGljIGludCB2aWJyYV9sZWRfb24odmlicmF0b3JfZGV2aWNlX3QqIHZpYnJhZGV2IF9fdW51c2VkLCB1bnNpZ25lZCBpbnQgdGltZW91dF9tcykKK3sKKyAgICBpbnQgcmV0OworICAgIGNoYXIgdmFsdWVbVElNRU9VVF9TVFJfTEVOXTsgLyogbGFyZ2UgZW5vdWdoIGZvciBtaWxsaW9ucyBvZiB5ZWFycyAqLworCisgICAgcmV0ID0gd3JpdGVfbGVkX2ZpbGUoInN0YXRlIiwgIjEiKTsKKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgc25wcmludGYodmFsdWUsIHNpemVvZih2YWx1ZSksICIldVxuIiwgdGltZW91dF9tcyk7CisgICAgcmV0ID0gd3JpdGVfbGVkX2ZpbGUoImR1cmF0aW9uIiwgdmFsdWUpOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gd3JpdGVfbGVkX2ZpbGUoImFjdGl2YXRlIiwgIjEiKTsKK30KKworc3RhdGljIGludCB2aWJyYV9sZWRfb2ZmKHZpYnJhdG9yX2RldmljZV90KiB2aWJyYWRldiBfX3VudXNlZCkKK3sKKyAgICByZXR1cm4gd3JpdGVfbGVkX2ZpbGUoImFjdGl2YXRlIiwgIjAiKTsKK30KKwogc3RhdGljIGludCB2aWJyYV9jbG9zZShod19kZXZpY2VfdCAqZGV2aWNlKQogewogICAgIGZyZWUoZGV2aWNlKTsKQEAgLTkyLDcgKzE0NSwxNSBAQAogCiBzdGF0aWMgaW50IHZpYnJhX29wZW4oY29uc3QgaHdfbW9kdWxlX3QqIG1vZHVsZSwgY29uc3QgY2hhciogaWQgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgaHdfZGV2aWNlX3QqKiBkZXZpY2UgX191bnVzZWQpIHsKLSAgICBpZiAoIXZpYnJhX2V4aXN0cygpKSB7CisgICAgYm9vbCB1c2VfbGVkOworCisgICAgaWYgKHZpYnJhX2V4aXN0cygpKSB7CisgICAgICAgIEFMT0dEKCJWaWJyYXRvciB1c2luZyB0aW1lZF9vdXRwdXQiKTsKKyAgICAgICAgdXNlX2xlZCA9IGZhbHNlOworICAgIH0gZWxzZSBpZiAodmlicmFfbGVkX2V4aXN0cygpKSB7CisgICAgICAgIEFMT0dEKCJWaWJyYXRvciB1c2luZyBMRUQgdHJpZ2dlciIpOworICAgICAgICB1c2VfbGVkID0gdHJ1ZTsKKyAgICB9IGVsc2UgewogICAgICAgICBBTE9HRSgiVmlicmF0b3IgZGV2aWNlIGRvZXMgbm90IGV4aXN0LiBDYW5ub3Qgc3RhcnQgdmlicmF0b3IiKTsKICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CiAgICAgfQpAQCAtMTA5LDggKzE3MCwxMyBAQAogICAgIHZpYnJhZGV2LT5jb21tb24udmVyc2lvbiA9IEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTigxLDApOwogICAgIHZpYnJhZGV2LT5jb21tb24uY2xvc2UgPSB2aWJyYV9jbG9zZTsKIAotICAgIHZpYnJhZGV2LT52aWJyYXRvcl9vbiA9IHZpYnJhX29uOwotICAgIHZpYnJhZGV2LT52aWJyYXRvcl9vZmYgPSB2aWJyYV9vZmY7CisgICAgaWYgKHVzZV9sZWQpIHsKKyAgICAgICAgdmlicmFkZXYtPnZpYnJhdG9yX29uID0gdmlicmFfbGVkX29uOworICAgICAgICB2aWJyYWRldi0+dmlicmF0b3Jfb2ZmID0gdmlicmFfbGVkX29mZjsKKyAgICB9IGVsc2UgeworICAgICAgICB2aWJyYWRldi0+dmlicmF0b3Jfb24gPSB2aWJyYV9vbjsKKyAgICAgICAgdmlicmFkZXYtPnZpYnJhdG9yX29mZiA9IHZpYnJhX29mZjsKKyAgICB9CiAKICAgICAqZGV2aWNlID0gKGh3X2RldmljZV90ICopIHZpYnJhZGV2OwogCmRpZmYgLS1naXQgYS9tb2R1bGVzL3ZyL0FuZHJvaWQubWsgYi9tb2R1bGVzL3ZyL0FuZHJvaWQubWsKaW5kZXggNDNjOGU5Mi4uZTA0YzBkYSAxMDA2NDQKLS0tIGEvbW9kdWxlcy92ci9BbmRyb2lkLm1rCisrKyBiL21vZHVsZXMvdnIvQW5kcm9pZC5tawpAQCAtMTgsNiArMTgsNyBAQAogCiBMT0NBTF9NT0RVTEUgOj0gdnIuZGVmYXVsdAogTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gaHcKK0xPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSA6PSB0cnVlCiBMT0NBTF9TUkNfRklMRVMgOj0gdnIuYwogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdXRpbHMKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEyL0FuZHJvaWQubWsgYi90ZXN0cy9jYW1lcmEyL0FuZHJvaWQubWsKaW5kZXggZTQ1ZjQ2Ny4uZTRmOTY0MCAxMDA2NDQKLS0tIGEvdGVzdHMvY2FtZXJhMi9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL2NhbWVyYTIvQW5kcm9pZC5tawpAQCAtMjUsMTAgKzI1LDEyIEBACiAJbGliZ3VpIFwKIAlsaWJzeW5jIFwKIAlsaWJ1aSBcCi0JbGliZGwKKwlsaWJkbCBcCisJYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMgogCiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKIAlzeXN0ZW0vbWVkaWEvY2FtZXJhL2luY2x1ZGUgXAorCXN5c3RlbS9tZWRpYS9wcml2YXRlL2NhbWVyYS9pbmNsdWRlIFwKIAlmcmFtZXdvcmtzL2F2L2luY2x1ZGUvIFwKIAlmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlIFwKIAlmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlIFwKZGlmZiAtLWdpdCBhL3Rlc3RzL2NhbWVyYTIvQ2FtZXJhTW9kdWxlRml4dHVyZS5oIGIvdGVzdHMvY2FtZXJhMi9DYW1lcmFNb2R1bGVGaXh0dXJlLmgKaW5kZXggNjYxYzY5My4uYjBkNDllMiAxMDA2NDQKLS0tIGEvdGVzdHMvY2FtZXJhMi9DYW1lcmFNb2R1bGVGaXh0dXJlLmgKKysrIGIvdGVzdHMvY2FtZXJhMi9DYW1lcmFNb2R1bGVGaXh0dXJlLmgKQEAgLTM1LDcgKzM1LDcgQEAKIHRlbXBsYXRlIDxib29sIEluZm9RdWlyayA9IGZhbHNlPgogc3RydWN0IENhbWVyYU1vZHVsZUZpeHR1cmUgewogCi0gICAgQ2FtZXJhTW9kdWxlRml4dHVyZShpbnQgQ2FtZXJhSUQgPSAtMSkgeworICAgIGV4cGxpY2l0IENhbWVyYU1vZHVsZUZpeHR1cmUoaW50IENhbWVyYUlEID0gLTEpIHsKICAgICAgICAgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19DT05TVFJVQ1RPUjsKIAogICAgICAgICBtQ2FtZXJhSUQgPSBDYW1lcmFJRDsKQEAgLTc0LDcgKzc0LDYgQEAKICAgICB2b2lkIFRlYXJEb3duKCkgewogICAgICAgICBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX1RFQVJfRE9XTjsKIAotICAgICAgICBkZWxldGUgbU1vZHVsZTsKICAgICAgICAgVGVhckRvd25NaXhpbigpOwogCiAgICAgICAgIC8qIGltcG9ydGFudDogZGV2aWNlIG11c3QgYmUgZGVzdHJ1Y3RlZCBiZWZvcmUgY2xvc2luZyBtb2R1bGUsCkBAIC04NSw2ICs4NCw3IEBACiAgICAgICAgICAgICBBU1NFUlRfRVEoMCwgSFdNb2R1bGVIZWxwZXJzOjpjbG9zZU1vZHVsZShtTW9kdWxlLT5nZXREc28oKSkpCiAgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBjbG9zZSBjYW1lcmEgSEFMIG1vZHVsZSI7CiAgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIG1Nb2R1bGU7CiAgICAgfQogCiAgICAgdm9pZCBDcmVhdGVDYW1lcmEoaW50IGNhbWVyYUlELCAvKm91dCovIHNwPENhbWVyYURldmljZUJhc2U+ICpkZXZpY2UpIHsKQEAgLTk4LDcgKzk4LDcgQEAKICAgICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6CiAgICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18xOgogICAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKLSAgICAgICAgICAgICAgICAqZGV2aWNlID0gbmV3IENhbWVyYTNEZXZpY2UoY2FtZXJhSUQpOworICAgICAgICAgICAgICAgICpkZXZpY2UgPSBuZXcgQ2FtZXJhM0RldmljZShTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgY2FtZXJhSUQpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgZGV2aWNlLT5jbGVhcigpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhMi9DYW1lcmFNdWx0aVN0cmVhbVRlc3RzLmNwcCBiL3Rlc3RzL2NhbWVyYTIvQ2FtZXJhTXVsdGlTdHJlYW1UZXN0cy5jcHAKaW5kZXggZWI2NGRiMS4uZjRhZWFiNyAxMDA2NDQKLS0tIGEvdGVzdHMvY2FtZXJhMi9DYW1lcmFNdWx0aVN0cmVhbVRlc3RzLmNwcAorKysgYi90ZXN0cy9jYW1lcmEyL0NhbWVyYU11bHRpU3RyZWFtVGVzdHMuY3BwCkBAIC0zMzQsNyArMzM0LDcgQEAKICAgICAgICAgICAgIGludCBoZWlnaHQsCiAgICAgICAgICAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiYgZGV2aWNlLAogICAgICAgICAgICAgQ2FtZXJhU3RyZWFtUGFyYW1zIHBhcmFtID0gREVGQVVMVF9TVFJFQU1fUEFSQU1FVEVSUywKLSAgICAgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UgPSBOVUxMLAorICAgICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UgPSBOVUxMLAogICAgICAgICAgICAgYm9vbCB1c2VDcHVDb25zdW1lciA9IHRydWUpIHsKICAgICAgICAgcGFyYW0ubUZvcm1hdCA9IE1hcEF1dG9Gb3JtYXQocGFyYW0ubUZvcm1hdCk7CiAgICAgICAgIHJldHVybiBuZXcgQ2FtZXJhU3RyZWFtKHdpZHRoLCBoZWlnaHQsIGRldmljZSwKZGlmZiAtLWdpdCBhL3Rlc3RzL2NhbWVyYTIvQ2FtZXJhU3RyZWFtRml4dHVyZS5oIGIvdGVzdHMvY2FtZXJhMi9DYW1lcmFTdHJlYW1GaXh0dXJlLmgKaW5kZXggYmY3ZmI0Mi4uOTJmZjA1YiAxMDA2NDQKLS0tIGEvdGVzdHMvY2FtZXJhMi9DYW1lcmFTdHJlYW1GaXh0dXJlLmgKKysrIGIvdGVzdHMvY2FtZXJhMi9DYW1lcmFTdHJlYW1GaXh0dXJlLmgKQEAgLTcxLDcgKzcxLDcgQEAKICAgICA6IHB1YmxpYyBDYW1lcmFNb2R1bGVGaXh0dXJlPC8qSW5mb1F1aXJrKi90cnVlPiB7CiAKIHB1YmxpYzoKLSAgICBDYW1lcmFTdHJlYW1GaXh0dXJlKENhbWVyYVN0cmVhbVBhcmFtcyBwKQorICAgIGV4cGxpY2l0IENhbWVyYVN0cmVhbUZpeHR1cmUoQ2FtZXJhU3RyZWFtUGFyYW1zIHApCiAgICAgOiBDYW1lcmFNb2R1bGVGaXh0dXJlKFRlc3RTZXR0aW5nczo6RGV2aWNlSWQoKSkgewogICAgICAgICBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX0NPTlNUUlVDVE9SOwogCmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEyL2NhbWVyYTJfdXRpbHMuY3BwIGIvdGVzdHMvY2FtZXJhMi9jYW1lcmEyX3V0aWxzLmNwcAppbmRleCBjNjNjMzJhLi5kYWIwYWU5IDEwMDY0NAotLS0gYS90ZXN0cy9jYW1lcmEyL2NhbWVyYTJfdXRpbHMuY3BwCisrKyBiL3Rlc3RzL2NhbWVyYTIvY2FtZXJhMl91dGlscy5jcHAKQEAgLTE3Niw3ICsxNzYsNyBAQAogfQogCiBzdGF0dXNfdCBNZXRhZGF0YVF1ZXVlOjpmcmVlQnVmZmVycyhMaXN0PGNhbWVyYV9tZXRhZGF0YV90Kj46Oml0ZXJhdG9yIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxjYW1lcmFfbWV0YWRhdGFfdCo+OjppdGVyYXRvciBlbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExpc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPjo6aXRlcmF0b3ImIGVuZCkgewogICAgIHdoaWxlIChzdGFydCAhPSBlbmQpIHsKICAgICAgICAgZnJlZV9jYW1lcmFfbWV0YWRhdGEoKnN0YXJ0KTsKICAgICAgICAgc3RhcnQgPSBtU3RyZWFtU2xvdC5lcmFzZShzdGFydCk7CmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEyL2NhbWVyYTJfdXRpbHMuaCBiL3Rlc3RzL2NhbWVyYTIvY2FtZXJhMl91dGlscy5oCmluZGV4IGFiMWZjZmIuLjI3NGVlNzYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2NhbWVyYTIvY2FtZXJhMl91dGlscy5oCisrKyBiL3Rlc3RzL2NhbWVyYTIvY2FtZXJhMl91dGlscy5oCkBAIC02NSw3ICs2NSw3IEBACiAKICAgcHJpdmF0ZToKICAgICBzdGF0dXNfdCBmcmVlQnVmZmVycyhMaXN0PGNhbWVyYV9tZXRhZGF0YV90Kj46Oml0ZXJhdG9yIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPjo6aXRlcmF0b3IgZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMaXN0PGNhbWVyYV9tZXRhZGF0YV90Kj46Oml0ZXJhdG9yJiBlbmQpOwogCiAgICAgY2FtZXJhMl9kZXZpY2VfdCAqbURldmljZTsKIApAQCAtMTY2LDcgKzE2Niw3IEBACiAgKi8KIGNsYXNzIFN0cmVhbUFkYXB0ZXI6IHB1YmxpYyBjYW1lcmEyX3N0cmVhbV9vcHMgewogICBwdWJsaWM6Ci0gICAgU3RyZWFtQWRhcHRlcihzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBjb25zdW1lcik7CisgICAgZXhwbGljaXQgU3RyZWFtQWRhcHRlcihzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBjb25zdW1lcik7CiAKICAgICB+U3RyZWFtQWRhcHRlcigpOwogCmRpZmYgLS1naXQgYS90ZXN0cy9maW5nZXJwcmludC9BbmRyb2lkLmJwIGIvdGVzdHMvZmluZ2VycHJpbnQvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGUzZGVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZmluZ2VycHJpbnQvQW5kcm9pZC5icApAQCAtMCwwICsxLDE0IEBACitjY190ZXN0IHsKKyAgICBuYW1lOiAiZmluZ2VycHJpbnRfdGVzdHMiLAorICAgIHNyY3M6IFsiZmluZ2VycHJpbnRfdGVzdHMuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYmhhcmR3YXJlIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZmluZ2VycHJpbnQvQW5kcm9pZC5tayBiL3Rlc3RzL2ZpbmdlcnByaW50L0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMDNjMzkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZmluZ2VycHJpbnQvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLSAgICBmaW5nZXJwcmludF90ZXN0cy5jcHAgXAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJsb2cgXAotICAgIGxpYmhhcmR3YXJlIFwKLQotI0xPQ0FMX0NfSU5DTFVERVMgKz0gXAotIyAgICBzeXN0ZW0vbWVkaWEvY2FtZXJhL2luY2x1ZGUgXAotCi1MT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdleHRyYQotCi1MT0NBTF9NT0RVTEU6PSBmaW5nZXJwcmludF90ZXN0cwotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLQotaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQpkaWZmIC0tZ2l0IGEvdGVzdHMvaGFyZHdhcmUvc3RydWN0LW9mZnNldC5jcHAgYi90ZXN0cy9oYXJkd2FyZS9zdHJ1Y3Qtb2Zmc2V0LmNwcAppbmRleCAxMGMwODk1Li43ZjdmMmUwIDEwMDY0NAotLS0gYS90ZXN0cy9oYXJkd2FyZS9zdHJ1Y3Qtb2Zmc2V0LmNwcAorKysgYi90ZXN0cy9oYXJkd2FyZS9zdHJ1Y3Qtb2Zmc2V0LmNwcApAQCAtMTE2LDcgKzExNiw5IEBACiAgICAgQ0hFQ0tfTUVNQkVSX0FUKHNlbnNvcnNfcG9sbF9kZXZpY2VfMV90LCBiYXRjaCwgNzYsIDE0NCk7CiAgICAgQ0hFQ0tfTUVNQkVSX0FUKHNlbnNvcnNfcG9sbF9kZXZpY2VfMV90LCBmbHVzaCwgODAsIDE1Mik7CiAgICAgQ0hFQ0tfTUVNQkVSX0FUKHNlbnNvcnNfcG9sbF9kZXZpY2VfMV90LCBpbmplY3Rfc2Vuc29yX2RhdGEsIDg0LCAxNjApOwotICAgIENIRUNLX01FTUJFUl9BVChzZW5zb3JzX3BvbGxfZGV2aWNlXzFfdCwgcmVzZXJ2ZWRfcHJvY3MsIDg4LCAxNjgpOworICAgIENIRUNLX01FTUJFUl9BVChzZW5zb3JzX3BvbGxfZGV2aWNlXzFfdCwgcmVnaXN0ZXJfZGlyZWN0X2NoYW5uZWwsIDg4LCAxNjgpOworICAgIENIRUNLX01FTUJFUl9BVChzZW5zb3JzX3BvbGxfZGV2aWNlXzFfdCwgY29uZmlnX2RpcmVjdF9yZXBvcnQsIDkyLCAxNzYpOworICAgIENIRUNLX01FTUJFUl9BVChzZW5zb3JzX3BvbGxfZGV2aWNlXzFfdCwgcmVzZXJ2ZWRfcHJvY3MsIDk2LCAxODQpOwogCiAgICAgLy9UeXBlcyBkZWZpbmVkIGluIGZiLmgKICAgICBDSEVDS19NRU1CRVJfQVQoZnJhbWVidWZmZXJfZGV2aWNlX3QsIGNvbW1vbiwgMCwgMCk7CmRpZmYgLS1naXQgYS90ZXN0cy9od2MvY25hdGl2ZXdpbmRvdy5jIGIvdGVzdHMvaHdjL2NuYXRpdmV3aW5kb3cuYwppbmRleCA1YzE2YWZiLi41YjFkNzhlIDEwMDY0NAotLS0gYS90ZXN0cy9od2MvY25hdGl2ZXdpbmRvdy5jCisrKyBiL3Rlc3RzL2h3Yy9jbmF0aXZld2luZG93LmMKQEAgLTM3LDcgKzM3LDcgQEAKIHN0YXRpYyBpbnQgdHJhY2VfbGV2ZWwgPSAxOwogCiAjZGVmaW5lIF9UUkFDRShuLGZtdC4uLikgXAotCWRvIHsgaWYgKHRyYWNlX2xldmVsID49IG4pIGZwcmludGYoc3RkZXJyLCAiQ05XOiAiIGZtdCk7IH0gd2hpbGUgKDApCisJZG8geyBpZiAodHJhY2VfbGV2ZWwgPj0gKG4pKSBmcHJpbnRmKHN0ZGVyciwgIkNOVzogIiBmbXQpOyB9IHdoaWxlICgwKQogCiAjZGVmaW5lIEVSUk9SKGZtdC4uLikgX1RSQUNFKDAsIGZtdCkKICNkZWZpbmUgSU5GTyhmbXQuLi4pIF9UUkFDRSgxLCBmbXQpCmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dC9ldmRldi9BbmRyb2lkLm1rIGIvdGVzdHMvaW5wdXQvZXZkZXYvQW5kcm9pZC5tawppbmRleCAzYWViMmY4Li5iODkyYTdmIDEwMDY0NAotLS0gYS90ZXN0cy9pbnB1dC9ldmRldi9BbmRyb2lkLm1rCisrKyBiL3Rlc3RzL2lucHV0L2V2ZGV2L0FuZHJvaWQubWsKQEAgLTIsNyArMiw2IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfQ19JTkNMVURFUyArPSBoYXJkd2FyZS9saWJoYXJkd2FyZS9tb2R1bGVzL2lucHV0L2V2ZGV2Ci1MT0NBTF9DX0lOQ0xVREVTICs9ICQoVE9QKS9leHRlcm5hbC9nbW9jay9pbmNsdWRlCiAKIExPQ0FMX1NSQ19GSUxFUzo9IFwKICAgICBCaXRVdGlsc190ZXN0LmNwcCBcCmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dC9ldmRldi9JbnB1dEh1Yl90ZXN0LmNwcCBiL3Rlc3RzL2lucHV0L2V2ZGV2L0lucHV0SHViX3Rlc3QuY3BwCmluZGV4IDY0NjcxZmYuLjNkNjIxNTIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2lucHV0L2V2ZGV2L0lucHV0SHViX3Rlc3QuY3BwCisrKyBiL3Rlc3RzL2lucHV0L2V2ZGV2L0lucHV0SHViX3Rlc3QuY3BwCkBAIC01MCw5ICs1MCw5IEBACiAgICAgICAgIG1JbnB1dENiKGtOb29wSW5wdXRDYiksIG1EZXZpY2VBZGRlZENiKGtOb29wRGV2aWNlQ2IpLCBtRGV2aWNlUmVtb3ZlZENiKGtOb29wRGV2aWNlQ2IpIHt9CiAgICAgdmlydHVhbCB+VGVzdElucHV0Q2FsbGJhY2soKSA9IGRlZmF1bHQ7CiAKLSAgICB2b2lkIHNldElucHV0Q2FsbGJhY2soSW5wdXRDYkZ1bmMgY2IpIHsgbUlucHV0Q2IgPSBjYjsgfQotICAgIHZvaWQgc2V0RGV2aWNlQWRkZWRDYWxsYmFjayhEZXZpY2VDYkZ1bmMgY2IpIHsgbURldmljZUFkZGVkQ2IgPSBjYjsgfQotICAgIHZvaWQgc2V0RGV2aWNlUmVtb3ZlZENhbGxiYWNrKERldmljZUNiRnVuYyBjYikgeyBtRGV2aWNlUmVtb3ZlZENiID0gY2I7IH0KKyAgICB2b2lkIHNldElucHV0Q2FsbGJhY2soY29uc3QgSW5wdXRDYkZ1bmMmIGNiKSB7IG1JbnB1dENiID0gY2I7IH0KKyAgICB2b2lkIHNldERldmljZUFkZGVkQ2FsbGJhY2soY29uc3QgRGV2aWNlQ2JGdW5jJiBjYikgeyBtRGV2aWNlQWRkZWRDYiA9IGNiOyB9CisgICAgdm9pZCBzZXREZXZpY2VSZW1vdmVkQ2FsbGJhY2soY29uc3QgRGV2aWNlQ2JGdW5jJiBjYikgeyBtRGV2aWNlUmVtb3ZlZENiID0gY2I7IH0KIAogICAgIHZpcnR1YWwgdm9pZCBvbklucHV0RXZlbnQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElucHV0RGV2aWNlTm9kZT4mIG5vZGUsIElucHV0RXZlbnQmIGV2ZW50LAogICAgICAgICAgICAgbnNlY3NfdCBldmVudF90aW1lKSBvdmVycmlkZSB7CmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dC9ldmRldi9UZXN0SGVscGVycy5oIGIvdGVzdHMvaW5wdXQvZXZkZXYvVGVzdEhlbHBlcnMuaAppbmRleCA0NjFkYjA0Li5kMjZhZGZiIDEwMDY0NAotLS0gYS90ZXN0cy9pbnB1dC9ldmRldi9UZXN0SGVscGVycy5oCisrKyBiL3Rlc3RzL2lucHV0L2V2ZGV2L1Rlc3RIZWxwZXJzLmgKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogY2xhc3MgVGVtcEZpbGUgewogcHVibGljOgotICAgIFRlbXBGaWxlKGNvbnN0IGNoYXIqIHBhdGgpOworICAgIGV4cGxpY2l0IFRlbXBGaWxlKGNvbnN0IGNoYXIqIHBhdGgpOwogICAgIH5UZW1wRmlsZSgpOwogCiAgICAgLy8gTm8gY29weSBvciBhc3NpZ24KZGlmZiAtLWdpdCBhL3Rlc3RzL2tleW1hc3Rlci9rZXltYXN0ZXJfdGVzdC5jcHAgYi90ZXN0cy9rZXltYXN0ZXIva2V5bWFzdGVyX3Rlc3QuY3BwCmluZGV4IDYyNjZkNDAuLjMwNDBhNWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2tleW1hc3Rlci9rZXltYXN0ZXJfdGVzdC5jcHAKKysrIGIvdGVzdHMva2V5bWFzdGVyL2tleW1hc3Rlcl90ZXN0LmNwcApAQCAtNDEsNyArNDEsNyBAQAogCiBjbGFzcyBVbmlxdWVCbG9iIDogcHVibGljIFVuaXF1ZVB0cjx1aW50OF90W10+IHsKIHB1YmxpYzoKLSAgICBVbmlxdWVCbG9iKHNpemVfdCBsZW5ndGgpIDoKKyAgICBleHBsaWNpdCBVbmlxdWVCbG9iKHNpemVfdCBsZW5ndGgpIDoKICAgICAgICAgICAgIG1MZW5ndGgobGVuZ3RoKSB7CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0cy9udXNlbnNvcnMvQW5kcm9pZC5icCBiL3Rlc3RzL251c2Vuc29ycy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MjM0NjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9udXNlbnNvcnMvQW5kcm9pZC5icApAQCAtMCwwICsxLDEwIEBACitjY19iaW5hcnkgeworICAgIG5hbWU6ICJ0ZXN0LW51c2Vuc29ycyIsCisKKyAgICBzcmNzOiBbIm51c2Vuc29ycy5jcHAiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliaGFyZHdhcmUiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS90ZXN0cy9udXNlbnNvcnMvQW5kcm9pZC5tayBiL3Rlc3RzL251c2Vuc29ycy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjQ5MDk2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL251c2Vuc29ycy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCW51c2Vuc29ycy5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGliY3V0aWxzIGxpYmhhcmR3YXJlCi0KLUxPQ0FMX01PRFVMRTo9IHRlc3QtbnVzZW5zb3JzCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdmVoaWNsZS9SRUFETUUgYi90ZXN0cy92ZWhpY2xlL1JFQURNRQppbmRleCBiOGZjN2Q0Li40MmQyMjEwIDEwMDY0NAotLS0gYS90ZXN0cy92ZWhpY2xlL1JFQURNRQorKysgYi90ZXN0cy92ZWhpY2xlL1JFQURNRQpAQCAtNDksMTMgKzQ5LDEzIEBACiAkIG1tbSBoYXJkd2FyZS9saWJoYXJkd2FyZQogCiBUaGlzIHdpbGwgZ2VuZXJhdGUgdGhlIGZvbGxvd2luZyBiaW5hcmllcyB0aGF0IHdlIGNhcmUgYWJvdXQ6Ci1pKSBvdXQvdGFyZ2V0L3Byb2R1Y3QvWFhYL3N5c3RlbS9saWIvaHcvdmVoaWNsZS5kZWZhdWx0LnNvCitpKSBvdXQvdGFyZ2V0L3Byb2R1Y3QvWFhYL3ZlbmRvci9saWIvaHcvdmVoaWNsZS5kZWZhdWx0LnNvCiBpaSkgb3V0L3RhcmdldC9wcm9kdWN0L1hYWC9kYXRhL25hdGl2ZXRlc3QvdmVoaWNsZV90ZXN0cwogaWlpKSBvdXQvdGFyZ2V0L3Byb2R1Y3QvWFhYL3N5c3RlbS9iaW4vdmVoaWNsZS1oYWwtdG9vbAogCiBUaGUgbG9jYXRpb24gZm9yIHRoZSBmaXJzdCBzaGFyZWQgbGlicmFyeSB3b3VsZCBiZToKLSQgYWRiIHB1c2ggb3V0L3RhcmdldC9wcm9kdWN0L1hYWC9zeXN0ZW0vbGliL2h3L3ZlaGljbGUuZGVmYXVsdC5zbwotL3N5c3RlbS9saWIvaHcKKyQgYWRiIHB1c2ggb3V0L3RhcmdldC9wcm9kdWN0L1hYWC92ZW5kb3IvbGliL2h3L3ZlaGljbGUuZGVmYXVsdC5zbworL3ZlbmRvci9saWIvaHcKIFlvdSBjYW4gYWxzbyB1c2UgJ2FkYiBzeW5jJyBpZiB5b3UgbGlrZSwgYWx0aG91Z2ggdGhpcyBpcyB0aGUgZWFzaWVzdCBsZWFzdAogaGFzc2xlIHdheSBvZiBwdXR0aW5nIGl0IGluIHBsYWNlLgogCmRpZmYgLS1naXQgYS90ZXN0cy92ZWhpY2xlL3ZlaGljbGUtaGFsLXRvb2wuYyBiL3Rlc3RzL3ZlaGljbGUvdmVoaWNsZS1oYWwtdG9vbC5jCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggYzkzNzkwYS4uZTg1ZGY2MgotLS0gYS90ZXN0cy92ZWhpY2xlL3ZlaGljbGUtaGFsLXRvb2wuYworKysgYi90ZXN0cy92ZWhpY2xlL3ZlaGljbGUtaGFsLXRvb2wuYwpAQCAtOTgsNiArOTgsNyBAQAogICAgICAgICAgICAgbWVtY3B5KGFzY2lpX291dCwgZGF0YS0+dmFsdWUuc3RyX3ZhbHVlLmRhdGEsIGRhdGEtPnZhbHVlLnN0cl92YWx1ZS5sZW4pOwogICAgICAgICAgICAgYXNjaWlfb3V0W2RhdGEtPnZhbHVlLnN0cl92YWx1ZS5sZW5dID0gJ1wwJzsKICAgICAgICAgICAgIHByaW50ZigiVmFsdWUgVHlwZTogU1RSSU5HICVzXG4iLCBhc2NpaV9vdXQpOworICAgICAgICAgICAgZnJlZShhc2NpaV9vdXQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgVkVISUNMRV9WQUxVRV9UWVBFX0JZVEVTOgogICAgICAgICAgICAgcHJpbnRmKCJWYWx1ZSB0eXBlOiBCWVRFU1xuIFNpemU6ICVkIiwgZGF0YS0+dmFsdWUuYnl0ZXNfdmFsdWUubGVuKTsK