ZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCmluZGV4IDQzNDhlZTAuLjMzYTA5NmIgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQuYnAKKysrIGIvQW5kcm9pZC5icApAQCAtMjcsNiArMjcsNyBAQAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJkbCIsCisgICAgICAgICJsaWJ2bmRrc3VwcG9ydCIsCiAgICAgXSwKICAgICBjZmxhZ3M6IFsiLURRRU1VX0hBUkRXQVJFIl0sCiAKZGlmZiAtLWdpdCBhL0NsZWFuU3BlYy5tayBiL0NsZWFuU3BlYy5tawppbmRleCBiODRlMWI2Li4xYzY0YmZjIDEwMDY0NAotLS0gYS9DbGVhblNwZWMubWsKKysrIGIvQ2xlYW5TcGVjLm1rCkBAIC00NywzICs0NywxMyBAQAogIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICMgTkVXRVIgQ0xFQU4gU1RFUFMgTVVTVCBCRSBBVCBUSEUgRU5EIE9GIFRIRSBMSVNUCiAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1mICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGliZHluYW1pY19zZW5zb3JfZXh0LnNvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliNjQvbGliZHluYW1pY19zZW5zb3JfZXh0LnNvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliL2h3L3NlbnNvcnMuZHluYW1pY19zZW5zb3JfaGFsLnNvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliNjQvaHcvc2Vuc29ycy5keW5hbWljX3NlbnNvcl9oYWwuc28pCisKKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIE5FV0VSIENMRUFOIFNURVBTIE1VU1QgQkUgQVQgVEhFIEVORCBPRiBUSEUgTElTVAorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwpkaWZmIC0tZ2l0IGEvaGFyZHdhcmUuYyBiL2hhcmR3YXJlLmMKaW5kZXggN2U0ZGViZS4uOGZhYWMwNyAxMDA2NDQKLS0tIGEvaGFyZHdhcmUuYworKysgYi9oYXJkd2FyZS5jCkBAIC0yOSw2ICsyOSw4IEBACiAjZGVmaW5lIExPR19UQUcgIkhBTCIKICNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKKyNpbmNsdWRlIDx2bmRrc3VwcG9ydC9saW5rZXIuaD4KKwogLyoqIEJhc2UgcGF0aCBvZiB0aGUgaGFsIG1vZHVsZXMgKi8KICNpZiBkZWZpbmVkKF9fTFA2NF9fKQogI2RlZmluZSBIQUxfTElCUkFSWV9QQVRIMSAiL3N5c3RlbS9saWI2NC9odyIKQEAgLTgwLDcgKzgyLDE0IEBACiAgICAgICogZGxvcGVuIHJldHVybnMuIFNpbmNlIFJUTERfR0xPQkFMIGlzIG5vdCBvcidkIGluIHdpdGgKICAgICAgKiBSVExEX05PVyB0aGUgZXh0ZXJuYWwgc3ltYm9scyB3aWxsIG5vdCBiZSBnbG9iYWwKICAgICAgKi8KLSAgICBoYW5kbGUgPSBkbG9wZW4ocGF0aCwgUlRMRF9OT1cpOworICAgIGlmIChzdHJuY21wKHBhdGgsICIvc3lzdGVtLyIsIDgpID09IDApIHsKKyAgICAgICAgLyogSWYgdGhlIGxpYnJhcnkgaXMgaW4gc3lzdGVtIHBhcnRpdGlvbiwgbm8gbmVlZCB0byBjaGVjaworICAgICAgICAgKiBzcGhhbCBuYW1lc3BhY2UuIE9wZW4gaXQgd2l0aCBkbG9wZW4uCisgICAgICAgICAqLworICAgICAgICBoYW5kbGUgPSBkbG9wZW4ocGF0aCwgUlRMRF9OT1cpOworICAgIH0gZWxzZSB7CisgICAgICAgIGhhbmRsZSA9IGFuZHJvaWRfbG9hZF9zcGhhbF9saWJyYXJ5KHBhdGgsIFJUTERfTk9XKTsKKyAgICB9CiAgICAgaWYgKGhhbmRsZSA9PSBOVUxMKSB7CiAgICAgICAgIGNoYXIgY29uc3QgKmVycl9zdHIgPSBkbGVycm9yKCk7CiAgICAgICAgIEFMT0dFKCJsb2FkOiBtb2R1bGU9JXNcbiVzIiwgcGF0aCwgZXJyX3N0cj9lcnJfc3RyOiJ1bmtub3duIik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2F1ZGlvLmggYi9pbmNsdWRlL2hhcmR3YXJlL2F1ZGlvLmgKaW5kZXggYzk1YWQwOS4uMmQ2ZWIzMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9hdWRpby5oCisrKyBiL2luY2x1ZGUvaGFyZHdhcmUvYXVkaW8uaApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPHN0cmluZ3MuaD4KICNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CiAKICNpbmNsdWRlIDxjdXRpbHMvYml0b3BzLmg+CiAKQEAgLTU5LDE5ICs2MCw2IEBACiAvKiBNaW5pbWFsIGF1ZGlvIEhBTCB2ZXJzaW9uIHN1cHBvcnRlZCBieSB0aGUgYXVkaW8gZnJhbWV3b3JrICovCiAjZGVmaW5lIEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl9NSU4gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzJfMAogCi0vKioKLSAqIExpc3Qgb2Yga25vd24gYXVkaW8gSEFMIG1vZHVsZXMuIFRoaXMgaXMgdGhlIGJhc2UgbmFtZSBvZiB0aGUgYXVkaW8gSEFMCi0gKiBsaWJyYXJ5IGNvbXBvc2VkIG9mIHRoZSAiYXVkaW8uIiBwcmVmaXgsIG9uZSBvZiB0aGUgYmFzZSBuYW1lcyBiZWxvdyBhbmQKLSAqIGEgc3VmZml4IHNwZWNpZmljIHRvIHRoZSBkZXZpY2UuCi0gKiBlLmc6IGF1ZGlvLnByaW1hcnkuZ29sZGZpc2guc28gb3IgYXVkaW8uYTJkcC5kZWZhdWx0LnNvCi0gKi8KLQotI2RlZmluZSBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSAicHJpbWFyeSIKLSNkZWZpbmUgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0EyRFAgImEyZHAiCi0jZGVmaW5lIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9VU0IgInVzYiIKLSNkZWZpbmUgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1JFTU9URV9TVUJNSVggInJfc3VibWl4IgotI2RlZmluZSBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfQ09ERUNfT0ZGTE9BRCAiY29kZWNfb2ZmbG9hZCIKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioKQEAgLTgyLDExICs3MCw2IEBACiAgKiAgYXVkaW8gZGV2aWNlIHBhcmFtZXRlcnMKICAqLwogCi0vKiBCVCBTQ08gTm9pc2UgUmVkdWN0aW9uICsgRWNobyBDYW5jZWxsYXRpb24gcGFyYW1ldGVycyAqLwotI2RlZmluZSBBVURJT19QQVJBTUVURVJfS0VZX0JUX05SRUMgImJ0X2hlYWRzZXRfbnJlYyIKLSNkZWZpbmUgQVVESU9fUEFSQU1FVEVSX1ZBTFVFX09OICJvbiIKLSNkZWZpbmUgQVVESU9fUEFSQU1FVEVSX1ZBTFVFX09GRiAib2ZmIgotCiAvKiBUVFkgbW9kZSBzZWxlY3Rpb24gKi8KICNkZWZpbmUgQVVESU9fUEFSQU1FVEVSX0tFWV9UVFlfTU9ERSAidHR5X21vZGUiCiAjZGVmaW5lIEFVRElPX1BBUkFNRVRFUl9WQUxVRV9UVFlfT0ZGICJ0dHlfb2ZmIgpAQCAtOTQsOCArNzcsNyBAQAogI2RlZmluZSBBVURJT19QQVJBTUVURVJfVkFMVUVfVFRZX0hDTyAidHR5X2hjbyIKICNkZWZpbmUgQVVESU9fUEFSQU1FVEVSX1ZBTFVFX1RUWV9GVUxMICJ0dHlfZnVsbCIKIAotLyogSGVhcmluZyBBaWQgQ29tcGF0aWJpbGl0eSAtIFRlbGVjb2lsIChIQUMtVCkgbW9kZSBvbi9vZmYKLSAgIFN0cmluZ3MgbXVzdCBiZSBpbiBzeW5jIHdpdGggQ2FsbEZlYXR1cmVzU2V0dGluZy5qYXZhICovCisvKiBIZWFyaW5nIEFpZCBDb21wYXRpYmlsaXR5IC0gVGVsZWNvaWwgKEhBQy1UKSBtb2RlIG9uL29mZiAqLwogI2RlZmluZSBBVURJT19QQVJBTUVURVJfS0VZX0hBQyAiSEFDU2V0dGluZyIKICNkZWZpbmUgQVVESU9fUEFSQU1FVEVSX1ZBTFVFX0hBQ19PTiAiT04iCiAjZGVmaW5lIEFVRElPX1BBUkFNRVRFUl9WQUxVRV9IQUNfT0ZGICJPRkYiCkBAIC0xMDYsNjMgKzg4LDE1IEBACiAvKiBBMkRQIHNvdXJjZSBhZGRyZXNzIHNldCBieSBmcmFtZXdvcmsgKi8KICNkZWZpbmUgQVVESU9fUEFSQU1FVEVSX0EyRFBfU09VUkNFX0FERFJFU1MgImEyZHBfc291cmNlX2FkZHJlc3MiCiAKLS8qIFNjcmVlbiBzdGF0ZSAqLwotI2RlZmluZSBBVURJT19QQVJBTUVURVJfS0VZX1NDUkVFTl9TVEFURSAic2NyZWVuX3N0YXRlIgotCiAvKiBCbHVldG9vdGggU0NPIHdpZGViYW5kICovCiAjZGVmaW5lIEFVRElPX1BBUkFNRVRFUl9LRVlfQlRfU0NPX1dCICJidF93YnMiCiAKLS8qIEdldCBhIG5ldyBIVyBzeW5jaHJvbml6YXRpb24gc291cmNlIGlkZW50aWZpZXIuCi0gKiBSZXR1cm4gYSB2YWxpZCBzb3VyY2UgKHBvc2l0aXZlIGludGVnZXIpIG9yIEFVRElPX0hXX1NZTkNfSU5WQUxJRCBpZiBhbiBlcnJvciBvY2N1cnMKLSAqIG9yIG5vIEhXIHN5bmMgaXMgYXZhaWxhYmxlLiAqLwotI2RlZmluZSBBVURJT19QQVJBTUVURVJfSFdfQVZfU1lOQyAiaHdfYXZfc3luYyIKLQogLyoqCiAgKiAgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMKICAqLwogCi0jZGVmaW5lIEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fUk9VVElORyAicm91dGluZyIgICAgICAgICAgICAgLyogYXVkaW9fZGV2aWNlc190ICovCi0jZGVmaW5lIEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fRk9STUFUICJmb3JtYXQiICAgICAgICAgICAgICAgLyogYXVkaW9fZm9ybWF0X3QgKi8KLSNkZWZpbmUgQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9DSEFOTkVMUyAiY2hhbm5lbHMiICAgICAgICAgICAvKiBhdWRpb19jaGFubmVsX21hc2tfdCAqLwotI2RlZmluZSBBVURJT19QQVJBTUVURVJfU1RSRUFNX0ZSQU1FX0NPVU5UICJmcmFtZV9jb3VudCIgICAgIC8qIHNpemVfdCAqLwotI2RlZmluZSBBVURJT19QQVJBTUVURVJfU1RSRUFNX0lOUFVUX1NPVVJDRSAiaW5wdXRfc291cmNlIiAgIC8qIGF1ZGlvX3NvdXJjZV90ICovCi0jZGVmaW5lIEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU0FNUExJTkdfUkFURSAic2FtcGxpbmdfcmF0ZSIgLyogdWludDMyX3QgKi8KLQotI2RlZmluZSBBVURJT19QQVJBTUVURVJfREVWSUNFX0NPTk5FQ1QgImNvbm5lY3QiICAgICAgICAgICAgLyogYXVkaW9fZGV2aWNlc190ICovCi0jZGVmaW5lIEFVRElPX1BBUkFNRVRFUl9ERVZJQ0VfRElTQ09OTkVDVCAiZGlzY29ubmVjdCIgICAgICAvKiBhdWRpb19kZXZpY2VzX3QgKi8KLQotLyogUXVlcnkgc3VwcG9ydGVkIGZvcm1hdHMuIFRoZSByZXNwb25zZSBpcyBhICd8JyBzZXBhcmF0ZWQgbGlzdCBvZiBzdHJpbmdzIGZyb20KLSAqIGF1ZGlvX2Zvcm1hdF90IGVudW0gZS5nOiAic3VwX2Zvcm1hdHM9QVVESU9fRk9STUFUX1BDTV8xNl9CSVQiICovCi0jZGVmaW5lIEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX0ZPUk1BVFMgInN1cF9mb3JtYXRzIgotLyogUXVlcnkgc3VwcG9ydGVkIGNoYW5uZWwgbWFza3MuIFRoZSByZXNwb25zZSBpcyBhICd8JyBzZXBhcmF0ZWQgbGlzdCBvZiBzdHJpbmdzIGZyb20KLSAqIGF1ZGlvX2NoYW5uZWxfbWFza190IGVudW0gZS5nOiAic3VwX2NoYW5uZWxzPUFVRElPX0NIQU5ORUxfT1VUX1NURVJFT3xBVURJT19DSEFOTkVMX09VVF9NT05PIiAqLwotI2RlZmluZSBBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9DSEFOTkVMUyAic3VwX2NoYW5uZWxzIgotLyogUXVlcnkgc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGVzLiBUaGUgcmVzcG9uc2UgaXMgYSAnfCcgc2VwYXJhdGVkIGxpc3Qgb2YgaW50ZWdlciB2YWx1ZXMgZS5nOgotICogInN1cF9zYW1wbGluZ19yYXRlcz00NDEwMHw0ODAwMCIgKi8KLSNkZWZpbmUgQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfU0FNUExJTkdfUkFURVMgInN1cF9zYW1wbGluZ19yYXRlcyIKLQotLyogU2V0IHRoZSBIVyBzeW5jaHJvbml6YXRpb24gc291cmNlIGZvciBhbiBvdXRwdXQgc3RyZWFtLiAqLwotI2RlZmluZSBBVURJT19QQVJBTUVURVJfU1RSRUFNX0hXX0FWX1NZTkMgImh3X2F2X3N5bmMiCi0KLS8qIEVuYWJsZSBtb25vIGF1ZGlvIHBsYXliYWNrIGlmIDEsIGVsc2Ugc2hvdWxkIGJlIDAuICovCi0jZGVmaW5lIEFVRElPX1BBUkFNRVRFUl9NT05PX09VVFBVVCAibW9ub19vdXRwdXQiCi0KLS8qKgotICogYXVkaW8gY29kZWMgcGFyYW1ldGVycwotICovCi0KLSNkZWZpbmUgQVVESU9fT0ZGTE9BRF9DT0RFQ19QQVJBTVMgIm11c2ljX29mZmxvYWRfY29kZWNfcGFyYW0iCi0jZGVmaW5lIEFVRElPX09GRkxPQURfQ09ERUNfQklUX1BFUl9TQU1QTEUgIm11c2ljX29mZmxvYWRfYml0X3Blcl9zYW1wbGUiCi0jZGVmaW5lIEFVRElPX09GRkxPQURfQ09ERUNfQklUX1JBVEUgIm11c2ljX29mZmxvYWRfYml0X3JhdGUiCi0jZGVmaW5lIEFVRElPX09GRkxPQURfQ09ERUNfQVZHX0JJVF9SQVRFICJtdXNpY19vZmZsb2FkX2F2Z19iaXRfcmF0ZSIKLSNkZWZpbmUgQVVESU9fT0ZGTE9BRF9DT0RFQ19JRCAibXVzaWNfb2ZmbG9hZF9jb2RlY19pZCIKLSNkZWZpbmUgQVVESU9fT0ZGTE9BRF9DT0RFQ19CTE9DS19BTElHTiAibXVzaWNfb2ZmbG9hZF9ibG9ja19hbGlnbiIKLSNkZWZpbmUgQVVESU9fT0ZGTE9BRF9DT0RFQ19TQU1QTEVfUkFURSAibXVzaWNfb2ZmbG9hZF9zYW1wbGVfcmF0ZSIKLSNkZWZpbmUgQVVESU9fT0ZGTE9BRF9DT0RFQ19FTkNPREVfT1BUSU9OICJtdXNpY19vZmZsb2FkX2VuY29kZV9vcHRpb24iCi0jZGVmaW5lIEFVRElPX09GRkxPQURfQ09ERUNfTlVNX0NIQU5ORUwgICJtdXNpY19vZmZsb2FkX251bV9jaGFubmVscyIKLSNkZWZpbmUgQVVESU9fT0ZGTE9BRF9DT0RFQ19ET1dOX1NBTVBMSU5HICAibXVzaWNfb2ZmbG9hZF9kb3duX3NhbXBsaW5nIgotI2RlZmluZSBBVURJT19PRkZMT0FEX0NPREVDX0RFTEFZX1NBTVBMRVMgICJkZWxheV9zYW1wbGVzIgotI2RlZmluZSBBVURJT19PRkZMT0FEX0NPREVDX1BBRERJTkdfU0FNUExFUyAgInBhZGRpbmdfc2FtcGxlcyIKKy8qIEVuYWJsZSBBQU5DICovCisjZGVmaW5lIEFVRElPX1BBUkFNRVRFUl9LRVlfQUFOQyAiYWFuY19lbmFibGVkIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTM5OSw2ICszMzMsNjUgQEAKICAgICBpbnQgKCpnZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uKShjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKTsKIAorICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgZnJhbWV3b3JrIHRvIHN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgICogY3JlYXRlX21tYXBfYnVmZmVyIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIHN0YXJ0KCkKKyAgICAgKgorICAgICAqIFxub3RlIEZ1bmN0aW9uIG9ubHkgaW1wbGVtZW50ZWQgYnkgc3RyZWFtcyBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSBzdHJlYW0gdGhlIHN0cmVhbSBvYmplY3QuCisgICAgICogXHJldHVybiAwIGluIGNhc2Ugb2Ygc3VjY2Vzcy4KKyAgICAgKiAgICAgICAgIC1FTk9TWVMgaWYgY2FsbGVkIG91dCBvZiBzZXF1ZW5jZSBvciBvbiBub24gbW1hcCBzdHJlYW0KKyAgICAgKi8KKyAgICBpbnQgKCpzdGFydCkoY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQqIHN0cmVhbSk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgdGhlIGZyYW1ld29yayB0byBzdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgICogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgc3RhcnQoKQorICAgICAqCisgICAgICogXG5vdGUgRnVuY3Rpb24gb25seSBpbXBsZW1lbnRlZCBieSBzdHJlYW1zIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgICoKKyAgICAgKiBccGFyYW1baW5dIHN0cmVhbSB0aGUgc3RyZWFtIG9iamVjdC4KKyAgICAgKiBccmV0dXJuIDAgaW4gY2FzZSBvZiBzdWNjZXNzLgorICAgICAqICAgICAgICAgLUVOT1NZUyBpZiBjYWxsZWQgb3V0IG9mIHNlcXVlbmNlIG9yIG9uIG5vbiBtbWFwIHN0cmVhbQorICAgICAqLworICAgIGludCAoKnN0b3ApKGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0KiBzdHJlYW0pOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIG1tYXAgYnVmZmVyIHVzZWQgZm9yIGF1ZGlvCisgICAgICogc2FtcGxlcyB0cmFuc2Zlci4KKyAgICAgKgorICAgICAqIFxub3RlIEZ1bmN0aW9uIG9ubHkgaW1wbGVtZW50ZWQgYnkgc3RyZWFtcyBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSBzdHJlYW0gdGhlIHN0cmVhbSBvYmplY3QuCisgICAgICogXHBhcmFtW2luXSBtaW5fc2l6ZV9mcmFtZXMgbWluaW11bSBidWZmZXIgc2l6ZSByZXF1ZXN0ZWQuIFRoZSBhY3R1YWwgYnVmZmVyCisgICAgICogICAgICAgIHNpemUgcmV0dXJuZWQgaW4gc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gY2FuIGJlIGxhcmdlci4KKyAgICAgKiBccGFyYW1bb3V0XSBpbmZvIGFkZHJlc3MgYXQgd2hpY2ggdGhlIG1tYXAgYnVmZmVyIGluZm9ybWF0aW9uIHNob3VsZCBiZSByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gMCBpZiB0aGUgYnVmZmVyIHdhcyBhbGxvY2F0ZWQuCisgICAgICogICAgICAgICAtRU5PREVWIGluIGNhc2Ugb2YgaW5pdGlhbGl6YXRpb24gZXJyb3IKKyAgICAgKiAgICAgICAgIC1FSU5WQUwgaWYgdGhlIHJlcXVlc3RlZCBidWZmZXIgc2l6ZSBpcyB0b28gbGFyZ2UKKyAgICAgKiAgICAgICAgIC1FTk9TWVMgaWYgY2FsbGVkIG91dCBvZiBzZXF1ZW5jZSAoZS5nLiBidWZmZXIgYWxyZWFkeSBhbGxvY2F0ZWQpCisgICAgICovCisgICAgaW50ICgqY3JlYXRlX21tYXBfYnVmZmVyKShjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtaW5fc2l6ZV9mcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgdGhlIGZyYW1ld29yayB0byByZWFkIGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKKyAgICAgKiB3aXRoIGFzc29jaWF0ZWQgdGltZSBzdGFtcC4KKyAgICAgKgorICAgICAqIFxub3RlIEZ1bmN0aW9uIG9ubHkgaW1wbGVtZW50ZWQgYnkgc3RyZWFtcyBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSBzdHJlYW0gdGhlIHN0cmVhbSBvYmplY3QuCisgICAgICogXHBhcmFtW291dF0gcG9zaXRpb24gYWRkcmVzcyBhdCB3aGljaCB0aGUgbW1hcCByZWFkL3dyaXRlIHBvc2l0aW9uIHNob3VsZCBiZSByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gMCBpZiB0aGUgcG9zaXRpb24gaXMgc3VjY2Vzc2Z1bGx5IHJldHVybmVkLgorICAgICAqICAgICAgICAgLUVOT0RBVEEgaWYgdGhlIHBvc2l0aW9uIGNhbm5vdCBiZSByZXRyaWV2ZWQKKyAgICAgKiAgICAgICAgIC1FTk9TWVMgaWYgY2FsbGVkIGJlZm9yZSBjcmVhdGVfbW1hcF9idWZmZXIoKQorICAgICAqLworICAgIGludCAoKmdldF9tbWFwX3Bvc2l0aW9uKShjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOwogfTsKIHR5cGVkZWYgc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgYXVkaW9fc3RyZWFtX291dF90OwogCkBAIC00NDksNiArNDQyLDY1IEBACiAgICAgICovCiAgICAgaW50ICgqZ2V0X2NhcHR1cmVfcG9zaXRpb24pKGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW1faW4gKnN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKTsKKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgZnJhbWV3b3JrIHRvIHN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgICogY3JlYXRlX21tYXBfYnVmZmVyIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIHN0YXJ0KCkKKyAgICAgKgorICAgICAqIFxub3RlIEZ1bmN0aW9uIG9ubHkgaW1wbGVtZW50ZWQgYnkgc3RyZWFtcyBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSBzdHJlYW0gdGhlIHN0cmVhbSBvYmplY3QuCisgICAgICogXHJldHVybiAwIGluIGNhc2Ugb2ZmIHN1Y2Nlc3MuCisgICAgICogICAgICAgICAtRU5PU1lTIGlmIGNhbGxlZCBvdXQgb2Ygc2VxdWVuY2Ugb3Igb24gbm9uIG1tYXAgc3RyZWFtCisgICAgICovCisgICAgaW50ICgqc3RhcnQpKGNvbnN0IHN0cnVjdCBhdWRpb19zdHJlYW1faW4qIHN0cmVhbSk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgdGhlIGZyYW1ld29yayB0byBzdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgICoKKyAgICAgKiBcbm90ZSBGdW5jdGlvbiBvbmx5IGltcGxlbWVudGVkIGJ5IHN0cmVhbXMgb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gc3RyZWFtIHRoZSBzdHJlYW0gb2JqZWN0LgorICAgICAqIFxyZXR1cm4gMCBpbiBjYXNlIG9mIHN1Y2Nlc3MuCisgICAgICogICAgICAgICAtRU5PU1lTIGlmIGNhbGxlZCBvdXQgb2Ygc2VxdWVuY2Ugb3Igb24gbm9uIG1tYXAgc3RyZWFtCisgICAgICovCisgICAgaW50ICgqc3RvcCkoY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiogc3RyZWFtKTsKKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgZnJhbWV3b3JrIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBtbWFwIGJ1ZmZlciB1c2VkIGZvciBhdWRpbworICAgICAqIHNhbXBsZXMgdHJhbnNmZXIuCisgICAgICoKKyAgICAgKiBcbm90ZSBGdW5jdGlvbiBvbmx5IGltcGxlbWVudGVkIGJ5IHN0cmVhbXMgb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gc3RyZWFtIHRoZSBzdHJlYW0gb2JqZWN0LgorICAgICAqIFxwYXJhbVtpbl0gbWluX3NpemVfZnJhbWVzIG1pbmltdW0gYnVmZmVyIHNpemUgcmVxdWVzdGVkLiBUaGUgYWN0dWFsIGJ1ZmZlcgorICAgICAqICAgICAgICBzaXplIHJldHVybmVkIGluIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvIGNhbiBiZSBsYXJnZXIuCisgICAgICogXHBhcmFtW291dF0gaW5mbyBhZGRyZXNzIGF0IHdoaWNoIHRoZSBtbWFwIGJ1ZmZlciBpbmZvcm1hdGlvbiBzaG91bGQgYmUgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIDAgaWYgdGhlIGJ1ZmZlciB3YXMgYWxsb2NhdGVkLgorICAgICAqICAgICAgICAgLUVOT0RFViBpbiBjYXNlIG9mIGluaXRpYWxpemF0aW9uIGVycm9yCisgICAgICogICAgICAgICAtRUlOVkFMIGlmIHRoZSByZXF1ZXN0ZWQgYnVmZmVyIHNpemUgaXMgdG9vIGxhcmdlCisgICAgICogICAgICAgICAtRU5PU1lTIGlmIGNhbGxlZCBvdXQgb2Ygc2VxdWVuY2UgKGUuZy4gYnVmZmVyIGFscmVhZHkgYWxsb2NhdGVkKQorICAgICAqLworICAgIGludCAoKmNyZWF0ZV9tbWFwX2J1ZmZlcikoY29uc3Qgc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtaW5fc2l6ZV9mcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgdGhlIGZyYW1ld29yayB0byByZWFkIGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKKyAgICAgKiB3aXRoIGFzc29jaWF0ZWQgdGltZSBzdGFtcC4KKyAgICAgKgorICAgICAqIFxub3RlIEZ1bmN0aW9uIG9ubHkgaW1wbGVtZW50ZWQgYnkgc3RyZWFtcyBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSBzdHJlYW0gdGhlIHN0cmVhbSBvYmplY3QuCisgICAgICogXHBhcmFtW291dF0gcG9zaXRpb24gYWRkcmVzcyBhdCB3aGljaCB0aGUgbW1hcCByZWFkL3dyaXRlIHBvc2l0aW9uIHNob3VsZCBiZSByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gMCBpZiB0aGUgcG9zaXRpb24gaXMgc3VjY2Vzc2Z1bGx5IHJldHVybmVkLgorICAgICAqICAgICAgICAgLUVOT0RBVEEgaWYgdGhlIHBvc2l0aW9uIGNhbm5vdCBiZSByZXRyZWl2ZWQKKyAgICAgKiAgICAgICAgIC1FTk9TWVMgaWYgY2FsbGVkIGJlZm9yZSBtbWFwX3JlYWRfcG9zaXRpb24oKQorICAgICAqLworICAgIGludCAoKmdldF9tbWFwX3Bvc2l0aW9uKShjb25zdCBzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7CiB9OwogdHlwZWRlZiBzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luIGF1ZGlvX3N0cmVhbV9pbl90OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2F1ZGlvX2Fsc2FvcHMuaCBiL2luY2x1ZGUvaGFyZHdhcmUvYXVkaW9fYWxzYW9wcy5oCmluZGV4IGY4Mzk0MWUuLjZhMTdhMzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvYXVkaW9fYWxzYW9wcy5oCisrKyBiL2luY2x1ZGUvaGFyZHdhcmUvYXVkaW9fYWxzYW9wcy5oCkBAIC0zOCw3ICszOCw3IEBACiBzdGF0aWMgaW5saW5lIGVudW0gcGNtX2Zvcm1hdCBwY21fZm9ybWF0X2Zyb21fYXVkaW9fZm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkKIHsKICAgICBzd2l0Y2ggKGZvcm1hdCkgewotI2lmZGVmIEhBVkVfQklHX0VORElBTgorI2lmIEhBVkVfQklHX0VORElBTgogICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CiAgICAgICAgIHJldHVybiBQQ01fRk9STUFUX1MxNl9CRTsKICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDoKQEAgLTczLDcgKzczLDcgQEAKIHN0YXRpYyBpbmxpbmUgYXVkaW9fZm9ybWF0X3QgYXVkaW9fZm9ybWF0X2Zyb21fcGNtX2Zvcm1hdChlbnVtIHBjbV9mb3JtYXQgZm9ybWF0KQogewogICAgIHN3aXRjaCAoZm9ybWF0KSB7Ci0jaWZkZWYgSEFWRV9CSUdfRU5ESUFOCisjaWYgSEFWRV9CSUdfRU5ESUFOCiAgICAgY2FzZSBQQ01fRk9STUFUX1MxNl9CRToKICAgICAgICAgcmV0dXJuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIGNhc2UgUENNX0ZPUk1BVF9TMjRfM0JFOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS9hdWRpb19lZmZlY3QuaCBiL2luY2x1ZGUvaGFyZHdhcmUvYXVkaW9fZWZmZWN0LmgKaW5kZXggOGE4ODQxNC4uMzM2NmUxNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9hdWRpb19lZmZlY3QuaAorKysgYi9pbmNsdWRlL2hhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oCkBAIC0yNiw3ICsyNiw3IEBACiAKICNpbmNsdWRlIDxjdXRpbHMvYml0b3BzLmg+CiAKLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+CiAKIAogX19CRUdJTl9ERUNMUwpAQCAtMzYsMjMxICszNiwxMSBAQAogLy8gICAgICBDb21tb24gRGVmaW5pdGlvbnMKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotLy8KLS8vLS0tIEVmZmVjdCBkZXNjcmlwdG9yIHN0cnVjdHVyZSBlZmZlY3RfZGVzY3JpcHRvcl90Ci0vLwotCi0vLyBVbmlxdWUgZWZmZWN0IElEIChjYW4gYmUgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBzaXRlOgotLy8gIGh0dHA6Ly93d3cuaXR1LmludC9JVFUtVC9hc24xL3V1aWQuaHRtbCkKLS8vIFRoaXMgZm9ybWF0IGlzIHVzZWQgZm9yIGJvdGggInR5cGUiIGFuZCAidXVpZCIgZmllbGRzIG9mIHRoZSBlZmZlY3QgZGVzY3JpcHRvciBzdHJ1Y3R1cmUuCi0vLyAtIFdoZW4gdXNlZCBmb3IgZWZmZWN0IHR5cGUgYW5kIHRoZSBlbmdpbmUgaXMgaW1wbGVtZW50aW5nIGFuZCBlZmZlY3QgY29ycmVzcG9uZGluZyB0byBhIHN0YW5kYXJkCi0vLyBPcGVuU0wgRVMgaW50ZXJmYWNlLCB0aGlzIElEIG11c3QgYmUgdGhlIG9uZSBkZWZpbmVkIGluIE9wZW5TTEVTX0lJRC5oIGZvciB0aGF0IGludGVyZmFjZS4KLS8vIC0gV2hlbiB1c2VkIGFzIHV1aWQsIGl0IHNob3VsZCBiZSBhIHVuaXF1ZSBVVUlEIGZvciB0aGlzIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24uCi10eXBlZGVmIHN0cnVjdCBlZmZlY3RfdXVpZF9zIHsKLSAgICB1aW50MzJfdCB0aW1lTG93OwotICAgIHVpbnQxNl90IHRpbWVNaWQ7Ci0gICAgdWludDE2X3QgdGltZUhpQW5kVmVyc2lvbjsKLSAgICB1aW50MTZfdCBjbG9ja1NlcTsKLSAgICB1aW50OF90IG5vZGVbNl07Ci19IGVmZmVjdF91dWlkX3Q7Ci0KLS8vIE1heGltdW0gbGVuZ3RoIG9mIGNoYXJhY3RlciBzdHJpbmdzIGluIHN0cnVjdHVyZXMgZGVmaW5lcyBieSB0aGlzIEFQSS4KLSNkZWZpbmUgRUZGRUNUX1NUUklOR19MRU5fTUFYIDY0Ci0KLS8vIE5VTEwgVVVJRCBkZWZpbml0aW9uIChtYXRjaGVzIFNMX0lJRF9OVUxMXykKLSNkZWZpbmUgRUZGRUNUX1VVSURfSU5JVElBTElaRVIgeyAweGVjNzE3OGVjLCAweGU1ZTEsIDB4NDQzMiwgMHhhM2Y0LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDQ2LCAweDU3LCAweGU2LCAweDc5LCAweDUyLCAweDEwIH0gfQotc3RhdGljIGNvbnN0IGVmZmVjdF91dWlkX3QgRUZGRUNUX1VVSURfTlVMTF8gPSBFRkZFQ1RfVVVJRF9JTklUSUFMSVpFUjsKLXN0YXRpYyBjb25zdCBlZmZlY3RfdXVpZF90ICogY29uc3QgRUZGRUNUX1VVSURfTlVMTCA9ICZFRkZFQ1RfVVVJRF9OVUxMXzsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgRUZGRUNUX1VVSURfTlVMTF9TVFIgPSAiZWM3MTc4ZWMtZTVlMS00NDMyLWEzZjQtNDY1N2U2Nzk1MjEwIjsKLQotCi0vLyBUaGUgZWZmZWN0IGRlc2NyaXB0b3IgY29udGFpbnMgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIHRvIGZhY2lsaXRhdGUgdGhlIGVudW1lcmF0aW9uIG9mIHRoZSBlZmZlY3QKLS8vIGVuZ2luZXMgcHJlc2VudCBpbiBhIGxpYnJhcnkuCi10eXBlZGVmIHN0cnVjdCBlZmZlY3RfZGVzY3JpcHRvcl9zIHsKLSAgICBlZmZlY3RfdXVpZF90IHR5cGU7ICAgICAvLyBVVUlEIG9mIHRvIHRoZSBPcGVuU0wgRVMgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHRoaXMgZWZmZWN0Ci0gICAgZWZmZWN0X3V1aWRfdCB1dWlkOyAgICAgLy8gVVVJRCBmb3IgdGhpcyBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uCi0gICAgdWludDMyX3QgYXBpVmVyc2lvbjsgICAgLy8gVmVyc2lvbiBvZiB0aGUgZWZmZWN0IGNvbnRyb2wgQVBJIGltcGxlbWVudGVkCi0gICAgdWludDMyX3QgZmxhZ3M7ICAgICAgICAgLy8gZWZmZWN0IGVuZ2luZSBjYXBhYmlsaXRpZXMvcmVxdWlyZW1lbnRzIGZsYWdzIChzZWUgYmVsb3cpCi0gICAgdWludDE2X3QgY3B1TG9hZDsgICAgICAgLy8gQ1BVIGxvYWQgaW5kaWNhdGlvbiAoc2VlIGJlbG93KQotICAgIHVpbnQxNl90IG1lbW9yeVVzYWdlOyAgIC8vIERhdGEgTWVtb3J5IHVzYWdlIChzZWUgYmVsb3cpCi0gICAgY2hhciAgICBuYW1lW0VGRkVDVF9TVFJJTkdfTEVOX01BWF07ICAgLy8gaHVtYW4gcmVhZGFibGUgZWZmZWN0IG5hbWUKLSAgICBjaGFyICAgIGltcGxlbWVudG9yW0VGRkVDVF9TVFJJTkdfTEVOX01BWF07ICAgIC8vIGh1bWFuIHJlYWRhYmxlIGVmZmVjdCBpbXBsZW1lbnRvciBuYW1lCi19IGVmZmVjdF9kZXNjcmlwdG9yX3Q7Ci0KLS8vIENQVSBsb2FkIGFuZCBtZW1vcnkgdXNhZ2UgaW5kaWNhdGlvbjogZWFjaCBlZmZlY3QgaW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGFuIGluZGljYXRpb24gb2YKLS8vIGl0cyBDUFUgYW5kIG1lbW9yeSB1c2FnZSBmb3IgdGhlIGF1ZGlvIGVmZmVjdCBmcmFtZXdvcmsgdG8gbGltaXQgdGhlIG51bWJlciBvZiBlZmZlY3RzCi0vLyBpbnN0YW50aWF0ZWQgYXQgYSBnaXZlbiB0aW1lIG9uIGEgZ2l2ZW4gcGxhdGZvcm0uCi0vLyBUaGUgQ1BVIGxvYWQgaXMgZXhwcmVzc2VkIGluIDAuMSBNSVBTIHVuaXRzIGFzIGVzdGltYXRlZCBvbiBhbiBBUk05RSBjb3JlIChBUk12NVRFKSB3aXRoIDAgV1MuCi0vLyBUaGUgbWVtb3J5IHVzYWdlIGlzIGV4cHJlc3NlZCBpbiBLQiBhbmQgaW5jbHVkZXMgb25seSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgbWVtb3J5Ci0KLS8vIERlZmluaXRpb25zIGZvciBmbGFncyBmaWVsZCBvZiBlZmZlY3QgZGVzY3JpcHRvci4KLS8vICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgfCBkZXNjcmlwdGlvbiAgICAgICAgICAgICAgIHwgYml0cyAgICAgIHwgdmFsdWVzCi0vLyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIHwgY29ubmVjdGlvbiBtb2RlICAgICAgICAgICB8IDAuLjIgICAgICB8IDAgaW5zZXJ0OiBhZnRlciB0cmFjayBwcm9jZXNzCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMSBhdXhpbGlhcnk6IGNvbm5lY3QgdG8gdHJhY2sgYXV4aWxpYXJ5Ci0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgIG91dHB1dCBhbmQgdXNlIHNlbmQgbGV2ZWwKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAyIHJlcGxhY2U6IHJlcGxhY2VzIHRyYWNrIHByb2Nlc3MgZnVuY3Rpb247Ci0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBtdXN0IGltcGxlbWVudCBTUkMsIHZvbHVtZSBhbmQgbW9ubyB0byBzdGVyZW8uCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMyBwcmUgcHJvY2Vzc2luZzogYXBwbGllZCBiZWxvdyBhdWRpbyBIQUwgb24gaW5wdXQKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCA0IHBvc3QgcHJvY2Vzc2luZzogYXBwbGllZCBiZWxvdyBhdWRpbyBIQUwgb24gb3V0cHV0Ci0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgNSAtIDcgcmVzZXJ2ZWQKLS8vICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgfCBpbnNlcnRpb24gcHJlZmVyZW5jZSAgICAgIHwgMy4uNSAgICAgIHwgMCBub25lCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMSBmaXJzdCBvZiB0aGUgY2hhaW4KLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAyIGxhc3Qgb2YgdGhlIGNoYWluCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMyBleGNsdXNpdmUgKG9ubHkgZWZmZWN0IGluIHRoZSBpbnNlcnQgY2hhaW4pCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgNC4uNyByZXNlcnZlZAotLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICB8IFZvbHVtZSBtYW5hZ2VtZW50ICAgICAgICAgfCA2Li44ICAgICAgfCAwIG5vbmUKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAxIGltcGxlbWVudHMgdm9sdW1lIGNvbnRyb2wKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAyIHJlcXVpcmVzIHZvbHVtZSBpbmRpY2F0aW9uCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgNCByZXNlcnZlZAotLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICB8IERldmljZSBpbmRpY2F0aW9uICAgICAgICAgfCA5Li4xMSAgICAgfCAwIG5vbmUKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAxIHJlcXVpcmVzIGRldmljZSB1cGRhdGVzCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMiwgNCByZXNlcnZlZAotLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICB8IFNhbXBsZSBpbnB1dCBtb2RlICAgICAgICAgfCAxMi4uMTMgICAgfCAxIGRpcmVjdDogcHJvY2VzcygpIGZ1bmN0aW9uIG9yIEVGRkVDVF9DTURfU0VUX0NPTkZJRwotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgY29tbWFuZCBtdXN0IHNwZWNpZnkgYSBidWZmZXIgZGVzY3JpcHRvcgotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDIgcHJvdmlkZXI6IHByb2Nlc3MoKSBmdW5jdGlvbiB1c2VzIHRoZQotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgYnVmZmVyUHJvdmlkZXIgaW5kaWNhdGVkIGJ5IHRoZQotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgRUZGRUNUX0NNRF9TRVRfQ09ORklHIGNvbW1hbmQgdG8gcmVxdWVzdCBpbnB1dC4KLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGJ1ZmZlcnMuCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMyBib3RoOiBib3RoIGlucHV0IG1vZGVzIGFyZSBzdXBwb3J0ZWQKLS8vICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgfCBTYW1wbGUgb3V0cHV0IG1vZGUgICAgICAgIHwgMTQuLjE1ICAgIHwgMSBkaXJlY3Q6IHByb2Nlc3MoKSBmdW5jdGlvbiBvciBFRkZFQ1RfQ01EX1NFVF9DT05GSUcKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGNvbW1hbmQgbXVzdCBzcGVjaWZ5IGEgYnVmZmVyIGRlc2NyaXB0b3IKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAyIHByb3ZpZGVyOiBwcm9jZXNzKCkgZnVuY3Rpb24gdXNlcyB0aGUKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGJ1ZmZlclByb3ZpZGVyIGluZGljYXRlZCBieSB0aGUKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIEVGRkVDVF9DTURfU0VUX0NPTkZJRyBjb21tYW5kIHRvIHJlcXVlc3Qgb3V0cHV0Ci0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBidWZmZXJzLgotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDMgYm90aDogYm90aCBvdXRwdXQgbW9kZXMgYXJlIHN1cHBvcnRlZAotLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICB8IEhhcmR3YXJlIGFjY2VsZXJhdGlvbiAgICAgfCAxNi4uMTcgICAgfCAwIE5vIGhhcmR3YXJlIGFjY2VsZXJhdGlvbgotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDEgbm9uIHR1bm5lbGVkIGh3IGFjY2VsZXJhdGlvbjogdGhlIHByb2Nlc3MoKSBmdW5jdGlvbgotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgcmVhZHMgdGhlIHNhbXBsZXMsIHNlbmQgdGhlbSB0byBIVyBhY2NlbGVyYXRlZAotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgZWZmZWN0IHByb2Nlc3NvciwgcmVhZHMgYmFjayB0aGUgcHJvY2Vzc2VkIHNhbXBsZXMKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGFuZCByZXR1cm5zIHRoZW0gdG8gdGhlIG91dHB1dCBidWZmZXIuCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMiB0dW5uZWxlZCBodyBhY2NlbGVyYXRpb246IHRoZSBwcm9jZXNzKCkgZnVuY3Rpb24gaXMKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIHRyYW5zcGFyZW50LiBUaGUgZWZmZWN0IGludGVyZmFjZSBpcyBvbmx5IHVzZWQgdG8KLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGNvbnRyb2wgdGhlIGVmZmVjdCBlbmdpbmUuIFRoaXMgbW9kZSBpcyByZWxldmFudCBmb3IKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGdsb2JhbCBlZmZlY3RzIGFjdHVhbGx5IGFwcGxpZWQgYnkgdGhlIGF1ZGlvCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBoYXJkd2FyZSBvbiB0aGUgb3V0cHV0IHN0cmVhbS4KLS8vICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgfCBBdWRpbyBNb2RlIGluZGljYXRpb24gICAgIHwgMTguLjE5ICAgIHwgMCBub25lCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMSByZXF1aXJlcyBhdWRpbyBtb2RlIHVwZGF0ZXMKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAyLi4zIHJlc2VydmVkCi0vLyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIHwgQXVkaW8gc291cmNlIGluZGljYXRpb24gICB8IDIwLi4yMSAgICB8IDAgbm9uZQotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDEgcmVxdWlyZXMgYXVkaW8gc291cmNlIHVwZGF0ZXMKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAyLi4zIHJlc2VydmVkCi0vLyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIHwgRWZmZWN0IG9mZmxvYWQgc3VwcG9ydGVkICB8IDIyICAgICAgICB8IDAgVGhlIGVmZmVjdCBjYW5ub3QgYmUgb2ZmbG9hZGVkIHRvIGFuIGF1ZGlvIERTUAotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDEgVGhlIGVmZmVjdCBjYW4gYmUgb2ZmbG9hZGVkIHRvIGFuIGF1ZGlvIERTUAotLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICB8IFByb2Nlc3MgZnVuY3Rpb24gbm90ICAgICAgfCAyMyAgICAgICAgfCAwIFRoZSBlZmZlY3QgaW1wbGVtZW50cyBhIHByb2Nlc3MgZnVuY3Rpb24uCi0vLyAgfCBpbXBsZW1lbnRlZCAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMSBUaGUgZWZmZWN0IGRvZXMgbm90IGltcGxlbWVudCBhIHByb2Nlc3MgZnVuY3Rpb246Ci0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBlbmFibGluZyB0aGUgZWZmZWN0IGhhcyBubyBpbXBhY3Qgb24gbGF0ZW5jeSBvcgotLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgQ1BVIGxvYWQuCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBFZmZlY3QgaW1wbGVtZW50YXRpb25zIHNldHRpbmcgdGhpcyBmbGFnIGRvIG5vdCBoYXZlCi0vLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICB0byBpbXBsZW1lbnQgYSBwcm9jZXNzIGZ1bmN0aW9uLgotLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gSW5zZXJ0IG1vZGUKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfVFlQRV9TSElGVCAgICAgICAgICAwCi0jZGVmaW5lIEVGRkVDVF9GTEFHX1RZUEVfU0laRSAgICAgICAgICAgMwotI2RlZmluZSBFRkZFQ1RfRkxBR19UWVBFX01BU0sgICAgICAgICAgICgoKDEgPDwgRUZGRUNUX0ZMQUdfVFlQRV9TSVpFKSAtMSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBFRkZFQ1RfRkxBR19UWVBFX1NISUZUKQotI2RlZmluZSBFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCAgICAgICAgICgwIDw8IEVGRkVDVF9GTEFHX1RZUEVfU0hJRlQpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZICAgICAgKDEgPDwgRUZGRUNUX0ZMQUdfVFlQRV9TSElGVCkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfVFlQRV9SRVBMQUNFICAgICAgICAoMiA8PCBFRkZFQ1RfRkxBR19UWVBFX1NISUZUKQotI2RlZmluZSBFRkZFQ1RfRkxBR19UWVBFX1BSRV9QUk9DICAgICAgICgzIDw8IEVGRkVDVF9GTEFHX1RZUEVfU0hJRlQpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX1RZUEVfUE9TVF9QUk9DICAgICAgKDQgPDwgRUZGRUNUX0ZMQUdfVFlQRV9TSElGVCkKLQotLy8gSW5zZXJ0IHByZWZlcmVuY2UKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5TRVJUX1NISUZUICAgICAgICAoRUZGRUNUX0ZMQUdfVFlQRV9TSElGVCArIEVGRkVDVF9GTEFHX1RZUEVfU0laRSkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5TRVJUX1NJWkUgICAgICAgICAzCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0lOU0VSVF9NQVNLICAgICAgICAgKCgoMSA8PCBFRkZFQ1RfRkxBR19JTlNFUlRfU0laRSkgLTEpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgRUZGRUNUX0ZMQUdfSU5TRVJUX1NISUZUKQotI2RlZmluZSBFRkZFQ1RfRkxBR19JTlNFUlRfQU5ZICAgICAgICAgICgwIDw8IEVGRkVDVF9GTEFHX0lOU0VSVF9TSElGVCkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5TRVJUX0ZJUlNUICAgICAgICAoMSA8PCBFRkZFQ1RfRkxBR19JTlNFUlRfU0hJRlQpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0lOU0VSVF9MQVNUICAgICAgICAgKDIgPDwgRUZGRUNUX0ZMQUdfSU5TRVJUX1NISUZUKQotI2RlZmluZSBFRkZFQ1RfRkxBR19JTlNFUlRfRVhDTFVTSVZFICAgICgzIDw8IEVGRkVDVF9GTEFHX0lOU0VSVF9TSElGVCkKLQotCi0vLyBWb2x1bWUgY29udHJvbAotI2RlZmluZSBFRkZFQ1RfRkxBR19WT0xVTUVfU0hJRlQgICAgICAgIChFRkZFQ1RfRkxBR19JTlNFUlRfU0hJRlQgKyBFRkZFQ1RfRkxBR19JTlNFUlRfU0laRSkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfVk9MVU1FX1NJWkUgICAgICAgICAzCi0jZGVmaW5lIEVGRkVDVF9GTEFHX1ZPTFVNRV9NQVNLICAgICAgICAgKCgoMSA8PCBFRkZFQ1RfRkxBR19WT0xVTUVfU0laRSkgLTEpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgRUZGRUNUX0ZMQUdfVk9MVU1FX1NISUZUKQotI2RlZmluZSBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCAgICAgICAgICgxIDw8IEVGRkVDVF9GTEFHX1ZPTFVNRV9TSElGVCkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfVk9MVU1FX0lORCAgICAgICAgICAoMiA8PCBFRkZFQ1RfRkxBR19WT0xVTUVfU0hJRlQpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX1ZPTFVNRV9OT05FICAgICAgICAgKDAgPDwgRUZGRUNUX0ZMQUdfVk9MVU1FX1NISUZUKQotCi0vLyBEZXZpY2UgaW5kaWNhdGlvbgotI2RlZmluZSBFRkZFQ1RfRkxBR19ERVZJQ0VfU0hJRlQgICAgICAgIChFRkZFQ1RfRkxBR19WT0xVTUVfU0hJRlQgKyBFRkZFQ1RfRkxBR19WT0xVTUVfU0laRSkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfREVWSUNFX1NJWkUgICAgICAgICAzCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0RFVklDRV9NQVNLICAgICAgICAgKCgoMSA8PCBFRkZFQ1RfRkxBR19ERVZJQ0VfU0laRSkgLTEpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgRUZGRUNUX0ZMQUdfREVWSUNFX1NISUZUKQotI2RlZmluZSBFRkZFQ1RfRkxBR19ERVZJQ0VfSU5EICAgICAgICAgICgxIDw8IEVGRkVDVF9GTEFHX0RFVklDRV9TSElGVCkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfREVWSUNFX05PTkUgICAgICAgICAoMCA8PCBFRkZFQ1RfRkxBR19ERVZJQ0VfU0hJRlQpCi0KLS8vIFNhbXBsZSBpbnB1dCBtb2RlcwotI2RlZmluZSBFRkZFQ1RfRkxBR19JTlBVVF9TSElGVCAgICAgICAgIChFRkZFQ1RfRkxBR19ERVZJQ0VfU0hJRlQgKyBFRkZFQ1RfRkxBR19ERVZJQ0VfU0laRSkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5QVVRfU0laRSAgICAgICAgICAyCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0lOUFVUX01BU0sgICAgICAgICAgKCgoMSA8PCBFRkZFQ1RfRkxBR19JTlBVVF9TSVpFKSAtMSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBFRkZFQ1RfRkxBR19JTlBVVF9TSElGVCkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5QVVRfRElSRUNUICAgICAgICAoMSA8PCBFRkZFQ1RfRkxBR19JTlBVVF9TSElGVCkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5QVVRfUFJPVklERVIgICAgICAoMiA8PCBFRkZFQ1RfRkxBR19JTlBVVF9TSElGVCkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5QVVRfQk9USCAgICAgICAgICAoMyA8PCBFRkZFQ1RfRkxBR19JTlBVVF9TSElGVCkKLQotLy8gU2FtcGxlIG91dHB1dCBtb2RlcwotI2RlZmluZSBFRkZFQ1RfRkxBR19PVVRQVVRfU0hJRlQgICAgICAgIChFRkZFQ1RfRkxBR19JTlBVVF9TSElGVCArIEVGRkVDVF9GTEFHX0lOUFVUX1NJWkUpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX09VVFBVVF9TSVpFICAgICAgICAgMgotI2RlZmluZSBFRkZFQ1RfRkxBR19PVVRQVVRfTUFTSyAgICAgICAgICgoKDEgPDwgRUZGRUNUX0ZMQUdfT1VUUFVUX1NJWkUpIC0xKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEVGRkVDVF9GTEFHX09VVFBVVF9TSElGVCkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfT1VUUFVUX0RJUkVDVCAgICAgICAoMSA8PCBFRkZFQ1RfRkxBR19PVVRQVVRfU0hJRlQpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX09VVFBVVF9QUk9WSURFUiAgICAgKDIgPDwgRUZGRUNUX0ZMQUdfT1VUUFVUX1NISUZUKQotI2RlZmluZSBFRkZFQ1RfRkxBR19PVVRQVVRfQk9USCAgICAgICAgICgzIDw8IEVGRkVDVF9GTEFHX09VVFBVVF9TSElGVCkKLQotLy8gSGFyZHdhcmUgYWNjZWxlcmF0aW9uIG1vZGUKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSFdfQUNDX1NISUZUICAgICAgICAoRUZGRUNUX0ZMQUdfT1VUUFVUX1NISUZUICsgRUZGRUNUX0ZMQUdfT1VUUFVUX1NJWkUpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0hXX0FDQ19TSVpFICAgICAgICAgMgotI2RlZmluZSBFRkZFQ1RfRkxBR19IV19BQ0NfTUFTSyAgICAgICAgICgoKDEgPDwgRUZGRUNUX0ZMQUdfSFdfQUNDX1NJWkUpIC0xKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEVGRkVDVF9GTEFHX0hXX0FDQ19TSElGVCkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfSFdfQUNDX1NJTVBMRSAgICAgICAoMSA8PCBFRkZFQ1RfRkxBR19IV19BQ0NfU0hJRlQpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0hXX0FDQ19UVU5ORUwgICAgICAgKDIgPDwgRUZGRUNUX0ZMQUdfSFdfQUNDX1NISUZUKQotCi0vLyBBdWRpbyBtb2RlIGluZGljYXRpb24KLSNkZWZpbmUgRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9TSElGVCAgICAoRUZGRUNUX0ZMQUdfSFdfQUNDX1NISUZUICsgRUZGRUNUX0ZMQUdfSFdfQUNDX1NJWkUpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0FVRElPX01PREVfU0laRSAgICAgMgotI2RlZmluZSBFRkZFQ1RfRkxBR19BVURJT19NT0RFX01BU0sgICAgICgoKDEgPDwgRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9TSVpFKSAtMSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBFRkZFQ1RfRkxBR19BVURJT19NT0RFX1NISUZUKQotI2RlZmluZSBFRkZFQ1RfRkxBR19BVURJT19NT0RFX0lORCAgICAgICgxIDw8IEVGRkVDVF9GTEFHX0FVRElPX01PREVfU0hJRlQpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0FVRElPX01PREVfTk9ORSAgICAgKDAgPDwgRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9TSElGVCkKLQotLy8gQXVkaW8gc291cmNlIGluZGljYXRpb24KLSNkZWZpbmUgRUZGRUNUX0ZMQUdfQVVESU9fU09VUkNFX1NISUZUICAoRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9TSElGVCArIEVGRkVDVF9GTEFHX0FVRElPX01PREVfU0laRSkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfQVVESU9fU09VUkNFX1NJWkUgICAyCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0FVRElPX1NPVVJDRV9NQVNLICAgKCgoMSA8PCBFRkZFQ1RfRkxBR19BVURJT19TT1VSQ0VfU0laRSkgLTEpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEVGRkVDVF9GTEFHX0FVRElPX1NPVVJDRV9TSElGVCkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfQVVESU9fU09VUkNFX0lORCAgICAoMSA8PCBFRkZFQ1RfRkxBR19BVURJT19TT1VSQ0VfU0hJRlQpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX0FVRElPX1NPVVJDRV9OT05FICAgKDAgPDwgRUZGRUNUX0ZMQUdfQVVESU9fU09VUkNFX1NISUZUKQotCi0vLyBFZmZlY3Qgb2ZmbG9hZCBpbmRpY2F0aW9uCi0jZGVmaW5lIEVGRkVDVF9GTEFHX09GRkxPQURfU0hJRlQgICAgICAgKEVGRkVDVF9GTEFHX0FVRElPX1NPVVJDRV9TSElGVCArIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfRkxBR19BVURJT19TT1VSQ0VfU0laRSkKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfT0ZGTE9BRF9TSVpFICAgICAgICAxCi0jZGVmaW5lIEVGRkVDVF9GTEFHX09GRkxPQURfTUFTSyAgICAgICAgKCgoMSA8PCBFRkZFQ1RfRkxBR19PRkZMT0FEX1NJWkUpIC0xKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBFRkZFQ1RfRkxBR19PRkZMT0FEX1NISUZUKQotI2RlZmluZSBFRkZFQ1RfRkxBR19PRkZMT0FEX1NVUFBPUlRFRCAgICgxIDw8IEVGRkVDVF9GTEFHX09GRkxPQURfU0hJRlQpCi0KLS8vIEVmZmVjdCBoYXMgbm8gcHJvY2VzcyBpbmRpY2F0aW9uCi0jZGVmaW5lIEVGRkVDVF9GTEFHX05PX1BST0NFU1NfU0hJRlQgICAgICAgKEVGRkVDVF9GTEFHX09GRkxPQURfU0hJRlQgKyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZGRUNUX0ZMQUdfT0ZGTE9BRF9TSVpFKQotI2RlZmluZSBFRkZFQ1RfRkxBR19OT19QUk9DRVNTX1NJWkUgICAgICAgIDEKLSNkZWZpbmUgRUZGRUNUX0ZMQUdfTk9fUFJPQ0VTU19NQVNLICAgICAgICAoKCgxIDw8IEVGRkVDVF9GTEFHX05PX1BST0NFU1NfU0laRSkgLTEpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEVGRkVDVF9GTEFHX05PX1BST0NFU1NfU0hJRlQpCi0jZGVmaW5lIEVGRkVDVF9GTEFHX05PX1BST0NFU1MgICAgICAgICAgKDEgPDwgRUZGRUNUX0ZMQUdfTk9fUFJPQ0VTU19TSElGVCkKLQogI2RlZmluZSBFRkZFQ1RfTUFLRV9BUElfVkVSU0lPTihNLCBtKSAgKCgoTSk8PDE2KSB8ICgobSkgJiAweEZGRkYpKQogI2RlZmluZSBFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IodikgICAgKCh2KT4+MTYpCiAjZGVmaW5lIEVGRkVDVF9BUElfVkVSU0lPTl9NSU5PUih2KSAgICAoKG0pICYgMHhGRkZGKQogCiAKLQogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gICAgICBFZmZlY3QgY29udHJvbCBpbnRlcmZhY2UKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTI4OCwxNSArNjgsNiBAQAogLy8gdHlwZSBhbmQgcmV0dXJuIGl0cyBhZGRyZXNzIGFzIGVmZmVjdF9oYW5kbGVfdAogdHlwZWRlZiBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zICoqZWZmZWN0X2hhbmRsZV90OwogCi0KLS8vIEZvcndhcmQgZGVmaW5pdGlvbiBvZiB0eXBlIGF1ZGlvX2J1ZmZlcl90Ci10eXBlZGVmIHN0cnVjdCBhdWRpb19idWZmZXJfcyBhdWRpb19idWZmZXJfdDsKLQotCi0KLQotCi0KIC8vIEVmZmVjdCBjb250cm9sIGludGVyZmFjZSBkZWZpbml0aW9uCiBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIHsKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNDI4LDQ5OSArMTk5LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKTsKIH07CiAKLQotLy8KLS8vLS0tIFN0YW5kYXJkaXplZCBjb21tYW5kIGNvZGVzIGZvciBjb21tYW5kKCkgZnVuY3Rpb24KLS8vCi1lbnVtIGVmZmVjdF9jb21tYW5kX2UgewotICAgRUZGRUNUX0NNRF9JTklULCAgICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBlZmZlY3QgZW5naW5lCi0gICBFRkZFQ1RfQ01EX1NFVF9DT05GSUcsICAgICAgICAgICAvLyBjb25maWd1cmUgZWZmZWN0IGVuZ2luZSAoc2VlIGVmZmVjdF9jb25maWdfdCkKLSAgIEVGRkVDVF9DTURfUkVTRVQsICAgICAgICAgICAgICAgIC8vIHJlc2V0IGVmZmVjdCBlbmdpbmUKLSAgIEVGRkVDVF9DTURfRU5BQkxFLCAgICAgICAgICAgICAgIC8vIGVuYWJsZSBlZmZlY3QgcHJvY2VzcwotICAgRUZGRUNUX0NNRF9ESVNBQkxFLCAgICAgICAgICAgICAgLy8gZGlzYWJsZSBlZmZlY3QgcHJvY2VzcwotICAgRUZGRUNUX0NNRF9TRVRfUEFSQU0sICAgICAgICAgICAgLy8gc2V0IHBhcmFtZXRlciBpbW1lZGlhdGVseSAoc2VlIGVmZmVjdF9wYXJhbV90KQotICAgRUZGRUNUX0NNRF9TRVRfUEFSQU1fREVGRVJSRUQsICAgLy8gc2V0IHBhcmFtZXRlciBkZWZlcnJlZAotICAgRUZGRUNUX0NNRF9TRVRfUEFSQU1fQ09NTUlULCAgICAgLy8gY29tbWl0IHByZXZpb3VzIHNldCBwYXJhbWV0ZXIgZGVmZXJyZWQKLSAgIEVGRkVDVF9DTURfR0VUX1BBUkFNLCAgICAgICAgICAgIC8vIGdldCBwYXJhbWV0ZXIKLSAgIEVGRkVDVF9DTURfU0VUX0RFVklDRSwgICAgICAgICAgIC8vIHNldCBhdWRpbyBkZXZpY2UgKHNlZSBhdWRpby5oLCBhdWRpb19kZXZpY2VzX3QpCi0gICBFRkZFQ1RfQ01EX1NFVF9WT0xVTUUsICAgICAgICAgICAvLyBzZXQgdm9sdW1lCi0gICBFRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFLCAgICAgICAvLyBzZXQgdGhlIGF1ZGlvIG1vZGUgKG5vcm1hbCwgcmluZywgLi4uKQotICAgRUZGRUNUX0NNRF9TRVRfQ09ORklHX1JFVkVSU0UsICAgLy8gY29uZmlndXJlIGVmZmVjdCBlbmdpbmUgcmV2ZXJzZSBzdHJlYW0oc2VlIGVmZmVjdF9jb25maWdfdCkKLSAgIEVGRkVDVF9DTURfU0VUX0lOUFVUX0RFVklDRSwgICAgIC8vIHNldCBjYXB0dXJlIGRldmljZSAoc2VlIGF1ZGlvLmgsIGF1ZGlvX2RldmljZXNfdCkKLSAgIEVGRkVDVF9DTURfR0VUX0NPTkZJRywgICAgICAgICAgIC8vIHJlYWQgZWZmZWN0IGVuZ2luZSBjb25maWd1cmF0aW9uCi0gICBFRkZFQ1RfQ01EX0dFVF9DT05GSUdfUkVWRVJTRSwgICAvLyByZWFkIGNvbmZpZ3VyZSBlZmZlY3QgZW5naW5lIHJldmVyc2Ugc3RyZWFtIGNvbmZpZ3VyYXRpb24KLSAgIEVGRkVDVF9DTURfR0VUX0ZFQVRVUkVfU1VQUE9SVEVEX0NPTkZJR1MsLy8gZ2V0IGFsbCBzdXBwb3J0ZWQgY29uZmlndXJhdGlvbnMgZm9yIGEgZmVhdHVyZS4KLSAgIEVGRkVDVF9DTURfR0VUX0ZFQVRVUkVfQ09ORklHLCAgIC8vIGdldCBjdXJyZW50IGZlYXR1cmUgY29uZmlndXJhdGlvbgotICAgRUZGRUNUX0NNRF9TRVRfRkVBVFVSRV9DT05GSUcsICAgLy8gc2V0IGN1cnJlbnQgZmVhdHVyZSBjb25maWd1cmF0aW9uCi0gICBFRkZFQ1RfQ01EX1NFVF9BVURJT19TT1VSQ0UsICAgICAvLyBzZXQgdGhlIGF1ZGlvIHNvdXJjZSAoc2VlIGF1ZGlvLmgsIGF1ZGlvX3NvdXJjZV90KQotICAgRUZGRUNUX0NNRF9PRkZMT0FELCAgICAgICAgICAgICAgLy8gc2V0IGlmIGVmZmVjdCB0aHJlYWQgaXMgYW4gb2ZmbG9hZCBvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIHRoZSBpb0hhbmRsZSBvZiB0aGUgZWZmZWN0IHRocmVhZAotICAgRUZGRUNUX0NNRF9GSVJTVF9QUk9QUklFVEFSWSA9IDB4MTAwMDAgLy8gZmlyc3QgcHJvcHJpZXRhcnkgY29tbWFuZCBjb2RlCi19OwotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX0lOSVQKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIEluaXRpYWxpemUgZWZmZWN0IGVuZ2luZTogQWxsIGNvbmZpZ3VyYXRpb25zIHJldHVybiB0byBkZWZhdWx0Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb21tYW5kIGZvcm1hdDoKLS8vICBzaXplOiAwCi0vLyAgZGF0YTogTi9BCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKGludCkKLS8vICBkYXRhOiBzdGF0dXMKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfU0VUX0NPTkZJRwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgQXBwbHkgbmV3IGF1ZGlvIHBhcmFtZXRlcnMgY29uZmlndXJhdGlvbnMgZm9yIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gY29tbWFuZCBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkKLS8vICBkYXRhOiBlZmZlY3RfY29uZmlnX3QKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YoaW50KQotLy8gIGRhdGE6IHN0YXR1cwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9SRVNFVAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgUmVzZXQgdGhlIGVmZmVjdCBlbmdpbmUuIEtlZXAgY29uZmlndXJhdGlvbiBidXQgcmVzZXRzIHN0YXRlIGFuZCBidWZmZXIgY29udGVudAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gY29tbWFuZCBmb3JtYXQ6Ci0vLyAgc2l6ZTogMAotLy8gIGRhdGE6IE4vQQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gcmVwbHkgZm9ybWF0OgotLy8gIHNpemU6IDAKLS8vICBkYXRhOiBOL0EKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfRU5BQkxFCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBFbmFibGUgdGhlIHByb2Nlc3MuIENhbGxlZCBieSB0aGUgZnJhbWV3b3JrIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCB0byBwcm9jZXNzKCkKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IDAKLS8vICBkYXRhOiBOL0EKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YoaW50KQotLy8gIGRhdGE6IHN0YXR1cwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9ESVNBQkxFCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBEaXNhYmxlIHRoZSBwcm9jZXNzLiBDYWxsZWQgYnkgdGhlIGZyYW1ld29yayBhZnRlciB0aGUgbGFzdCBjYWxsIHRvIHByb2Nlc3MoKQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gY29tbWFuZCBmb3JtYXQ6Ci0vLyAgc2l6ZTogMAotLy8gIGRhdGE6IE4vQQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gcmVwbHkgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZihpbnQpCi0vLyAgZGF0YTogc3RhdHVzCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX1NFVF9QQVJBTQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgU2V0IGEgcGFyYW1ldGVyIGFuZCBhcHBseSBpdCBpbW1lZGlhdGVseQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gY29tbWFuZCBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemUgb2YgcGFyYW0gYW5kIHZhbHVlCi0vLyAgZGF0YTogZWZmZWN0X3BhcmFtX3QgKyBwYXJhbSArIHZhbHVlLiBTZWUgZWZmZWN0X3BhcmFtX3QgZGVmaW5pdGlvbiBiZWxvdyBmb3IgdmFsdWUgb2Zmc2V0Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKGludCkKLS8vICBkYXRhOiBzdGF0dXMKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfU0VUX1BBUkFNX0RFRkVSUkVECi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBTZXQgYSBwYXJhbWV0ZXIgYnV0IGFwcGx5IGl0IG9ubHkgd2hlbiByZWNlaXZpbmcgRUZGRUNUX0NNRF9TRVRfUEFSQU1fQ09NTUlUIGNvbW1hbmQKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplIG9mIHBhcmFtIGFuZCB2YWx1ZQotLy8gIGRhdGE6IGVmZmVjdF9wYXJhbV90ICsgcGFyYW0gKyB2YWx1ZS4gU2VlIGVmZmVjdF9wYXJhbV90IGRlZmluaXRpb24gYmVsb3cgZm9yIHZhbHVlIG9mZnNldAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gcmVwbHkgZm9ybWF0OgotLy8gIHNpemU6IDAKLS8vICBkYXRhOiBOL0EKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfU0VUX1BBUkFNX0NPTU1JVAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgQXBwbHkgYWxsIHByZXZpb3VzbHkgcmVjZWl2ZWQgRUZGRUNUX0NNRF9TRVRfUEFSQU1fREVGRVJSRUQgY29tbWFuZHMKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IDAKLS8vICBkYXRhOiBOL0EKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YoaW50KQotLy8gIGRhdGE6IHN0YXR1cwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9HRVRfUEFSQU0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIEdldCBhIHBhcmFtZXRlciB2YWx1ZQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gY29tbWFuZCBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemUgb2YgcGFyYW0KLS8vICBkYXRhOiBlZmZlY3RfcGFyYW1fdCArIHBhcmFtCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemUgb2YgcGFyYW0gYW5kIHZhbHVlCi0vLyAgZGF0YTogZWZmZWN0X3BhcmFtX3QgKyBwYXJhbSArIHZhbHVlLiBTZWUgZWZmZWN0X3BhcmFtX3QgZGVmaW5pdGlvbiBiZWxvdyBmb3IgdmFsdWUgb2Zmc2V0Ci0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIFNldCB0aGUgcmVuZGVyaW5nIGRldmljZSB0aGUgYXVkaW8gb3V0cHV0IHBhdGggaXMgY29ubmVjdGVkIHRvLiBTZWUgYXVkaW8uaCwgYXVkaW9fZGV2aWNlc190Ci0vLyAgZm9yIGRldmljZSB2YWx1ZXMuCi0vLyAgVGhlIGVmZmVjdCBpbXBsZW1lbnRhdGlvbiBtdXN0IHNldCBFRkZFQ1RfRkxBR19ERVZJQ0VfSU5EIGZsYWcgaW4gaXRzIGRlc2NyaXB0b3IgdG8gcmVjZWl2ZSB0aGlzCi0vLyAgY29tbWFuZCB3aGVuIHRoZSBkZXZpY2UgY2hhbmdlcwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gY29tbWFuZCBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKHVpbnQzMl90KQotLy8gIGRhdGE6IHVpbnQzMl90Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogMAotLy8gIGRhdGE6IE4vQQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9TRVRfVk9MVU1FCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBTZXQgYW5kIGdldCB2b2x1bWUuIFVzZWQgYnkgYXVkaW8gZnJhbWV3b3JrIHRvIGRlbGVnYXRlIHZvbHVtZSBjb250cm9sIHRvIGVmZmVjdCBlbmdpbmUuCi0vLyAgVGhlIGVmZmVjdCBpbXBsZW1lbnRhdGlvbiBtdXN0IHNldCBFRkZFQ1RfRkxBR19WT0xVTUVfSU5EIG9yIEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMIGZsYWcgaW4KLS8vICBpdHMgZGVzY3JpcHRvciB0byByZWNlaXZlIHRoaXMgY29tbWFuZCBiZWZvcmUgZXZlcnkgY2FsbCB0byBwcm9jZXNzKCkgZnVuY3Rpb24KLS8vICBJZiBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCBmbGFnIGlzIHNldCBpbiB0aGUgZWZmZWN0IGRlc2NyaXB0b3IsIHRoZSBlZmZlY3QgZW5naW5lIG11c3QgcmV0dXJuCi0vLyAgdGhlIHZvbHVtZSB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIGJlZm9yZSB0aGUgZWZmZWN0IGlzIHByb2Nlc3NlZC4gVGhlIG92ZXJhbGwgdm9sdW1lICh0aGUgdm9sdW1lCi0vLyAgYWN0dWFsbHkgYXBwbGllZCBieSB0aGUgZWZmZWN0IGVuZ2luZSBtdWx0aXBsaWVkIGJ5IHRoZSByZXR1cm5lZCB2YWx1ZSkgc2hvdWxkIG1hdGNoIHRoZSB2YWx1ZQotLy8gIGluZGljYXRlZCBpbiB0aGUgY29tbWFuZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IG4gKiBzaXplb2YodWludDMyX3QpCi0vLyAgZGF0YTogdm9sdW1lIGZvciBlYWNoIGNoYW5uZWwgZGVmaW5lZCBpbiBlZmZlY3RfY29uZmlnX3QgZm9yIG91dHB1dCBidWZmZXIgZXhwcmVzc2VkIGluCi0vLyAgICAgIDguMjQgZml4ZWQgcG9pbnQgZm9ybWF0Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogbiAqIHNpemVvZih1aW50MzJfdCkgLyAwCi0vLyAgZGF0YTogLSBpZiBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCBpcyBzZXQgaW4gZWZmZWN0IGRlc2NyaXB0b3I6Ci0vLyAgICAgICAgICAgICAgdm9sdW1lIGZvciBlYWNoIGNoYW5uZWwgZGVmaW5lZCBpbiBlZmZlY3RfY29uZmlnX3QgZm9yIG91dHB1dCBidWZmZXIgZXhwcmVzc2VkIGluCi0vLyAgICAgICAgICAgICAgOC4yNCBmaXhlZCBwb2ludCBmb3JtYXQKLS8vICAgICAgICAtIGlmIEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMIGlzIG5vdCBzZXQgaW4gZWZmZWN0IGRlc2NyaXB0b3I6Ci0vLyAgICAgICAgICAgICAgTi9BCi0vLyAgSXQgaXMgbGVnYWwgdG8gcmVjZWl2ZSBhIG51bGwgcG9pbnRlciBhcyBwUmVwbHlEYXRhIGluIHdoaWNoIGNhc2UgdGhlIGVmZmVjdCBmcmFtZXdvcmsgaGFzCi0vLyAgZGVsZWdhdGVkIHZvbHVtZSBjb250cm9sIHRvIGFub3RoZXIgZWZmZWN0Ci0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBTZXQgdGhlIGF1ZGlvIG1vZGUuIFRoZSBlZmZlY3QgaW1wbGVtZW50YXRpb24gbXVzdCBzZXQgRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9JTkQgZmxhZyBpbiBpdHMKLS8vICBkZXNjcmlwdG9yIHRvIHJlY2VpdmUgdGhpcyBjb21tYW5kIHdoZW4gdGhlIGF1ZGlvIG1vZGUgY2hhbmdlcy4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZih1aW50MzJfdCkKLS8vICBkYXRhOiBhdWRpb19tb2RlX3QKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiAwCi0vLyAgZGF0YTogTi9BCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX1NFVF9DT05GSUdfUkVWRVJTRQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgQXBwbHkgbmV3IGF1ZGlvIHBhcmFtZXRlcnMgY29uZmlndXJhdGlvbnMgZm9yIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBvZiByZXZlcnNlIHN0cmVhbS4KLS8vICBBbiBleGFtcGxlIG9mIHJldmVyc2Ugc3RyZWFtIGlzIHRoZSBlY2hvIHJlZmVyZW5jZSBzdXBwbGllZCB0byBhbiBBY291c3RpYyBFY2hvIENhbmNlbGVyLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gY29tbWFuZCBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkKLS8vICBkYXRhOiBlZmZlY3RfY29uZmlnX3QKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YoaW50KQotLy8gIGRhdGE6IHN0YXR1cwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9TRVRfSU5QVVRfREVWSUNFCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBTZXQgdGhlIGNhcHR1cmUgZGV2aWNlIHRoZSBhdWRpbyBpbnB1dCBwYXRoIGlzIGNvbm5lY3RlZCB0by4gU2VlIGF1ZGlvLmgsIGF1ZGlvX2RldmljZXNfdAotLy8gIGZvciBkZXZpY2UgdmFsdWVzLgotLy8gIFRoZSBlZmZlY3QgaW1wbGVtZW50YXRpb24gbXVzdCBzZXQgRUZGRUNUX0ZMQUdfREVWSUNFX0lORCBmbGFnIGluIGl0cyBkZXNjcmlwdG9yIHRvIHJlY2VpdmUgdGhpcwotLy8gIGNvbW1hbmQgd2hlbiB0aGUgZGV2aWNlIGNoYW5nZXMKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZih1aW50MzJfdCkKLS8vICBkYXRhOiB1aW50MzJfdAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gcmVwbHkgZm9ybWF0OgotLy8gIHNpemU6IDAKLS8vICBkYXRhOiBOL0EKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfR0VUX0NPTkZJRwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gZGVzY3JpcHRpb246Ci0vLyAgUmVhZCBhdWRpbyBwYXJhbWV0ZXJzIGNvbmZpZ3VyYXRpb25zIGZvciBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IDAKLS8vICBkYXRhOiBOL0EKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YoZWZmZWN0X2NvbmZpZ190KQotLy8gIGRhdGE6IGVmZmVjdF9jb25maWdfdAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9HRVRfQ09ORklHX1JFVkVSU0UKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIFJlYWQgYXVkaW8gcGFyYW1ldGVycyBjb25maWd1cmF0aW9ucyBmb3IgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIG9mIHJldmVyc2Ugc3RyZWFtCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb21tYW5kIGZvcm1hdDoKLS8vICBzaXplOiAwCi0vLyAgZGF0YTogTi9BCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkKLS8vICBkYXRhOiBlZmZlY3RfY29uZmlnX3QKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfR0VUX0ZFQVRVUkVfU1VQUE9SVEVEX0NPTkZJR1MKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIFF1ZXJpZXMgZm9yIHN1cHBvcnRlZCBjb25maWd1cmF0aW9ucyBmb3IgYSBwYXJ0aWN1bGFyIGZlYXR1cmUgKGUuZy4gZ2V0IHRoZSBzdXBwb3J0ZWQKLS8vIGNvbWJpbmF0aW9ucyBvZiBtYWluIGFuZCBhdXhpbGlhcnkgY2hhbm5lbHMgZm9yIGEgbm9pc2Ugc3VwcHJlc3NvcikuCi0vLyBUaGUgY29tbWFuZCBwYXJhbWV0ZXIgaXMgdGhlIGZlYXR1cmUgaWRlbnRpZmllciAoU2VlIGVmZmVjdF9mZWF0dXJlX2UgZm9yIGEgbGlzdCBvZiBkZWZpbmVkCi0vLyBmZWF0dXJlcykgZm9sbG93ZWQgYnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRvciB0byByZXR1cm4uCi0vLyBUaGUgcmVwbHkgaXMgY29tcG9zZWQgb2Y6Ci0vLyAgLSBzdGF0dXMgKHVpbnQzMl90KToKLS8vICAgICAgICAgIC0gMCBpZiBmZWF0dXJlIGlzIHN1cHBvcnRlZAotLy8gICAgICAgICAgLSAtRU5PU1lTIGlmIHRoZSBmZWF0dXJlIGlzIG5vdCBzdXBwb3J0ZWQsCi0vLyAgICAgICAgICAtIC1FTk9NRU0gaWYgdGhlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ1dCB0aGUgdG90YWwgbnVtYmVyIG9mIHN1cHBvcnRlZCBjb25maWd1cmF0aW9ucwotLy8gICAgICAgICAgZXhjZWVkcyB0aGUgbWF4aW11bSBudW1iZXIgaW5kaWNhdGVkIGJ5IHRoZSBjYWxsZXIuCi0vLyAgLSB0b3RhbCBudW1iZXIgb2Ygc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb25zICh1aW50MzJfdCkKLS8vICAtIGFuIGFycmF5IG9mIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRvcnMuCi0vLyBUaGUgYWN0dWFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyByZXR1cm5lZCBtdXN0IG5vdCBleGNlZWQgdGhlIG1heGltdW0gbnVtYmVyIGluZGljYXRlZCBieQotLy8gdGhlIGNhbGxlci4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IDIgeCBzaXplb2YodWludDMyX3QpCi0vLyAgZGF0YTogZWZmZWN0X2ZlYXR1cmVfZSArIG1heGltdW0gbnVtYmVyIG9mIGNvbmZpZ3VyYXRpb25zIHRvIHJldHVybgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gcmVwbHkgZm9ybWF0OgotLy8gIHNpemU6IDIgeCBzaXplb2YodWludDMyX3QpICsgbiB4IHNpemVvZiAoPGNvbmZpZyBkZXNjcmlwdG9yPikKLS8vICBkYXRhOiBzdGF0dXMgKyB0b3RhbCBudW1iZXIgb2YgY29uZmlndXJhdGlvbnMgc3VwcG9ydGVkICsgYXJyYXkgb2YgbiBjb25maWcgZGVzY3JpcHRvcnMKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfR0VUX0ZFQVRVUkVfQ09ORklHCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBSZXRyaWV2ZXMgY3VycmVudCBjb25maWd1cmF0aW9uIGZvciBhIGdpdmVuIGZlYXR1cmUuCi0vLyBUaGUgcmVwbHkgc3RhdHVzIGlzOgotLy8gICAgICAtIDAgaWYgZmVhdHVyZSBpcyBzdXBwb3J0ZWQKLS8vICAgICAgLSAtRU5PU1lTIGlmIHRoZSBmZWF0dXJlIGlzIG5vdCBzdXBwb3J0ZWQsCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb21tYW5kIGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YodWludDMyX3QpCi0vLyAgZGF0YTogZWZmZWN0X2ZlYXR1cmVfZQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gcmVwbHkgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZih1aW50MzJfdCkgKyBzaXplb2YgKDxjb25maWcgZGVzY3JpcHRvcj4pCi0vLyAgZGF0YTogc3RhdHVzICsgY29uZmlnIGRlc2NyaXB0b3IKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfU0VUX0ZFQVRVUkVfQ09ORklHCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICBTZXRzIGN1cnJlbnQgY29uZmlndXJhdGlvbiBmb3IgYSBnaXZlbiBmZWF0dXJlLgotLy8gVGhlIHJlcGx5IHN0YXR1cyBpczoKLS8vICAgICAgLSAwIGlmIGZlYXR1cmUgaXMgc3VwcG9ydGVkCi0vLyAgICAgIC0gLUVOT1NZUyBpZiB0aGUgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkLAotLy8gICAgICAtIC1FSU5WQUwgaWYgdGhlIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gY29tbWFuZCBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKHVpbnQzMl90KSArIHNpemVvZiAoPGNvbmZpZyBkZXNjcmlwdG9yPikKLS8vICBkYXRhOiBlZmZlY3RfZmVhdHVyZV9lICsgY29uZmlnIGRlc2NyaXB0b3IKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YodWludDMyX3QpCi0vLyAgZGF0YTogc3RhdHVzCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBjb21tYW5kOiBFRkZFQ1RfQ01EX1NFVF9BVURJT19TT1VSQ0UKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIFNldCB0aGUgYXVkaW8gc291cmNlIHRoZSBjYXB0dXJlIHBhdGggaXMgY29uZmlndXJlZCBmb3IgKENhbWNvcmRlciwgdm9pY2UgcmVjb2duaXRpb24uLi4pLgotLy8gIFNlZSBhdWRpby5oLCBhdWRpb19zb3VyY2VfdCBmb3IgdmFsdWVzLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gY29tbWFuZCBmb3JtYXQ6Ci0vLyAgc2l6ZTogc2l6ZW9mKHVpbnQzMl90KQotLy8gIGRhdGE6IHVpbnQzMl90Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZXBseSBmb3JtYXQ6Ci0vLyAgc2l6ZTogMAotLy8gIGRhdGE6IE4vQQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29tbWFuZDogRUZGRUNUX0NNRF9PRkZMT0FECi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZXNjcmlwdGlvbjoKLS8vICAxLmluZGljYXRlIGlmIHRoZSBwbGF5YmFjayB0aHJlYWQgdGhlIGVmZmVjdCBpcyBhdHRhY2hlZCB0byBpcyBvZmZsb2FkZWQgb3Igbm90Ci0vLyAgMi51cGRhdGUgdGhlIGlvIGhhbmRsZSBvZiB0aGUgcGxheWJhY2sgdGhyZWFkIHRoZSBlZmZlY3QgaXMgYXR0YWNoZWQgdG8KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQgZm9ybWF0OgotLy8gIHNpemU6IHNpemVvZihlZmZlY3Rfb2ZmbG9hZF9wYXJhbV90KQotLy8gIGRhdGE6IGVmZmVjdF9vZmZsb2FkX3BhcmFtX3QKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJlcGx5IGZvcm1hdDoKLS8vICBzaXplOiBzaXplb2YodWludDMyX3QpCi0vLyAgZGF0YTogdWludDMyX3QKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfRklSU1RfUFJPUFJJRVRBUlkKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlc2NyaXB0aW9uOgotLy8gIEFsbCBwcm9wcmlldGFyeSBlZmZlY3QgY29tbWFuZHMgbXVzdCB1c2UgY29tbWFuZCBjb2RlcyBhYm92ZSB0aGlzIHZhbHVlLiBUaGUgc2l6ZSBhbmQgZm9ybWF0IG9mCi0vLyAgY29tbWFuZCBhbmQgcmVzcG9uc2UgZmllbGRzIGlzIGZyZWUgaW4gdGhpcyBjYXNlCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotLy8gQXVkaW8gYnVmZmVyIGRlc2NyaXB0b3IgdXNlZCBieSBwcm9jZXNzKCksIGJ1ZmZlclByb3ZpZGVyKCkgZnVuY3Rpb25zIGFuZCBidWZmZXJfY29uZmlnX3QKLS8vIHN0cnVjdHVyZS4gTXVsdGktY2hhbm5lbCBhdWRpbyBpcyBhbHdheXMgaW50ZXJsZWF2ZWQuIFRoZSBjaGFubmVsIG9yZGVyIGlzIGZyb20gTFNCIHRvIE1TQiB3aXRoCi0vLyByZWdhcmQgdG8gdGhlIGNoYW5uZWwgbWFzayBkZWZpbml0aW9uIGluIGF1ZGlvLmgsIGF1ZGlvX2NoYW5uZWxfbWFza190IGUuZyA6Ci0vLyBTdGVyZW86IGxlZnQsIHJpZ2h0Ci0vLyA1IHBvaW50IDE6IGZyb250IGxlZnQsIGZyb250IHJpZ2h0LCBmcm9udCBjZW50ZXIsIGxvdyBmcmVxdWVuY3ksIGJhY2sgbGVmdCwgYmFjayByaWdodAotLy8gVGhlIGJ1ZmZlciBzaXplIGlzIGV4cHJlc3NlZCBpbiBmcmFtZSBjb3VudCwgYSBmcmFtZSBiZWluZyBjb21wb3NlZCBvZiBzYW1wbGVzIGZvciBhbGwKLS8vIGNoYW5uZWxzIGF0IGEgZ2l2ZW4gdGltZS4gRnJhbWUgc2l6ZSBmb3IgdW5zcGVjaWZpZWQgZm9ybWF0IChBVURJT19GT1JNQVRfT1RIRVIpIGlzIDggYml0IGJ5Ci0vLyBkZWZpbml0aW9uCi1zdHJ1Y3QgYXVkaW9fYnVmZmVyX3MgewotICAgIHNpemVfdCAgIGZyYW1lQ291bnQ7ICAgICAgICAvLyBudW1iZXIgb2YgZnJhbWVzIGluIGJ1ZmZlcgotICAgIHVuaW9uIHsKLSAgICAgICAgdm9pZCogICAgICAgcmF3OyAgICAgICAgLy8gcmF3IHBvaW50ZXIgdG8gc3RhcnQgb2YgYnVmZmVyCi0gICAgICAgIGludDMyX3QqICAgIHMzMjsgICAgICAgIC8vIHBvaW50ZXIgdG8gc2lnbmVkIDMyIGJpdCBkYXRhIGF0IHN0YXJ0IG9mIGJ1ZmZlcgotICAgICAgICBpbnQxNl90KiAgICBzMTY7ICAgICAgICAvLyBwb2ludGVyIHRvIHNpZ25lZCAxNiBiaXQgZGF0YSBhdCBzdGFydCBvZiBidWZmZXIKLSAgICAgICAgdWludDhfdCogICAgdTg7ICAgICAgICAgLy8gcG9pbnRlciB0byB1bnNpZ25lZCA4IGJpdCBkYXRhIGF0IHN0YXJ0IG9mIGJ1ZmZlcgotICAgIH07Ci19OwotCi0vLyBUaGUgYnVmZmVyX3Byb3ZpZGVyX3Mgc3RydWN0dXJlIGNvbnRhaW5zIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkCi0vLyBieSB0aGUgZWZmZWN0IGVuZ2luZSBwcm9jZXNzKCkgZnVuY3Rpb24gdG8gcXVlcnkgYW5kIHJlbGVhc2UgaW5wdXQKLS8vIG9yIG91dHB1dCBhdWRpbyBidWZmZXIuCi0vLyBUaGUgZ2V0QnVmZmVyKCkgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJldHJpZXZlIGEgYnVmZmVyIHdoZXJlIGRhdGEKLS8vIHNob3VsZCByZWFkIGZyb20gb3Igd3JpdHRlbiB0byBieSBwcm9jZXNzKCkgZnVuY3Rpb24uCi0vLyBUaGUgcmVsZWFzZUJ1ZmZlcigpIGZ1bmN0aW9uIE1VU1QgYmUgY2FsbGVkIHdoZW4gdGhlIGJ1ZmZlciByZXRyaWV2ZWQKLS8vIHdpdGggZ2V0QnVmZmVyKCkgaXMgbm90IG5lZWRlZCBhbnltb3JlLgotLy8gVGhlIHByb2Nlc3MgZnVuY3Rpb24gc2hvdWxkIHVzZSB0aGUgYnVmZmVyIHByb3ZpZGVyIG1lY2hhbmlzbSB0byByZXRyaWV2ZQotLy8gaW5wdXQgb3Igb3V0cHV0IGJ1ZmZlciBpZiB0aGUgaW5CdWZmZXIgb3Igb3V0QnVmZmVyIHBhc3NlZCBhcyBhcmd1bWVudCBpcyBOVUxMCi0vLyBhbmQgdGhlIGJ1ZmZlciBjb25maWd1cmF0aW9uIChidWZmZXJfY29uZmlnX3QpIGdpdmVuIGJ5IHRoZSBFRkZFQ1RfQ01EX1NFVF9DT05GSUcKLS8vIGNvbW1hbmQgZGlkIG5vdCBzcGVjaWZ5IGFuIGF1ZGlvIGJ1ZmZlci4KLQotdHlwZWRlZiBpbnQzMl90ICgqIGJ1ZmZlcl9mdW5jdGlvbl90KSh2b2lkICpjb29raWUsIGF1ZGlvX2J1ZmZlcl90ICpidWZmZXIpOwotCi10eXBlZGVmIHN0cnVjdCBidWZmZXJfcHJvdmlkZXJfcyB7Ci0gICAgYnVmZmVyX2Z1bmN0aW9uX3QgZ2V0QnVmZmVyOyAgICAgICAvLyByZXRyaWV2ZSBuZXh0IGJ1ZmZlcgotICAgIGJ1ZmZlcl9mdW5jdGlvbl90IHJlbGVhc2VCdWZmZXI7ICAgLy8gcmVsZWFzZSB1c2VkIGJ1ZmZlcgotICAgIHZvaWQgICAgICAgKmNvb2tpZTsgICAgICAgICAgICAgICAgLy8gZm9yIHVzZSBieSBjbGllbnQgb2YgYnVmZmVyIHByb3ZpZGVyIGZ1bmN0aW9ucwotfSBidWZmZXJfcHJvdmlkZXJfdDsKLQotCi0vLyBUaGUgYnVmZmVyX2NvbmZpZ19zIHN0cnVjdHVyZSBzcGVjaWZpZXMgdGhlIGlucHV0IG9yIG91dHB1dCBhdWRpbyBmb3JtYXQKLS8vIHRvIGJlIHVzZWQgYnkgdGhlIGVmZmVjdCBlbmdpbmUuIEl0IGlzIHBhcnQgb2YgdGhlIGVmZmVjdF9jb25maWdfdAotLy8gc3RydWN0dXJlIHRoYXQgZGVmaW5lcyBib3RoIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVyIGNvbmZpZ3VyYXRpb25zIGFuZCBpcwotLy8gcGFzc2VkIGJ5IHRoZSBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgb3IgRUZGRUNUX0NNRF9TRVRfQ09ORklHX1JFVkVSU0UgY29tbWFuZC4KLXR5cGVkZWYgc3RydWN0IGJ1ZmZlcl9jb25maWdfcyB7Ci0gICAgYXVkaW9fYnVmZmVyX3QgIGJ1ZmZlcjsgICAgIC8vIGJ1ZmZlciBmb3IgdXNlIGJ5IHByb2Nlc3MoKSBmdW5jdGlvbiBpZiBub3QgcGFzc2VkIGV4cGxpY2l0bHkKLSAgICB1aW50MzJfdCAgIHNhbXBsaW5nUmF0ZTsgICAgLy8gc2FtcGxpbmcgcmF0ZQotICAgIHVpbnQzMl90ICAgY2hhbm5lbHM7ICAgICAgICAvLyBjaGFubmVsIG1hc2sgKHNlZSBhdWRpb19jaGFubmVsX21hc2tfdCBpbiBhdWRpby5oKQotICAgIGJ1ZmZlcl9wcm92aWRlcl90IGJ1ZmZlclByb3ZpZGVyOyAgIC8vIGJ1ZmZlciBwcm92aWRlcgotICAgIHVpbnQ4X3QgICAgZm9ybWF0OyAgICAgICAgICAvLyBBdWRpbyBmb3JtYXQgKHNlZSBhdWRpb19mb3JtYXRfdCBpbiBhdWRpby5oKQotICAgIHVpbnQ4X3QgICAgYWNjZXNzTW9kZTsgICAgICAvLyByZWFkL3dyaXRlIG9yIGFjY3VtdWxhdGUgaW4gYnVmZmVyIChlZmZlY3RfYnVmZmVyX2FjY2Vzc19lKQotICAgIHVpbnQxNl90ICAgbWFzazsgICAgICAgICAgICAvLyBpbmRpY2F0ZXMgd2hpY2ggb2YgdGhlIGFib3ZlIGZpZWxkcyBpcyB2YWxpZAotfSBidWZmZXJfY29uZmlnX3Q7Ci0KLS8vIFZhbHVlcyBmb3IgImFjY2Vzc01vZGUiIGZpZWxkIG9mIGJ1ZmZlcl9jb25maWdfdDoKLS8vICAgb3ZlcndyaXRlLCByZWFkIG9ubHksIGFjY3VtdWxhdGUgKHJlYWQvbW9kaWZ5L3dyaXRlKQotZW51bSBlZmZlY3RfYnVmZmVyX2FjY2Vzc19lIHsKLSAgICBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSwKLSAgICBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFELAotICAgIEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUKLQotfTsKLQotLy8gZmVhdHVyZSBpZGVudGlmaWVycyBmb3IgRUZGRUNUX0NNRF9HRVRfRkVBVFVSRV9TVVBQT1JURURfQ09ORklHUyBjb21tYW5kCi1lbnVtIGVmZmVjdF9mZWF0dXJlX2UgewotICAgIEVGRkVDVF9GRUFUVVJFX0FVWF9DSEFOTkVMUywgLy8gc3VwcG9ydHMgYXV4aWxpYXJ5IGNoYW5uZWxzIChlLmcuIGR1YWwgbWljIG5vaXNlIHN1cHByZXNzb3IpCi0gICAgRUZGRUNUX0ZFQVRVUkVfQ05UCi19OwotCi0vLyBFRkZFQ1RfRkVBVFVSRV9BVVhfQ0hBTk5FTFMgZmVhdHVyZSBjb25maWd1cmF0aW9uIGRlc2NyaXB0b3IuIERlc2NyaWJlIGEgY29tYmluYXRpb24KLS8vIG9mIG1haW4gYW5kIGF1eGlsaWFyeSBjaGFubmVscyBzdXBwb3J0ZWQKLXR5cGVkZWYgc3RydWN0IGNoYW5uZWxfY29uZmlnX3MgewotICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1haW5fY2hhbm5lbHM7IC8vIGNoYW5uZWwgbWFzayBmb3IgbWFpbiBjaGFubmVscwotICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGF1eF9jaGFubmVsczsgIC8vIGNoYW5uZWwgbWFzayBmb3IgYXV4aWxpYXJ5IGNoYW5uZWxzCi19IGNoYW5uZWxfY29uZmlnX3Q7Ci0KLQotLy8gVmFsdWVzIGZvciBiaXQgZmllbGQgIm1hc2siIGluIGJ1ZmZlcl9jb25maWdfdC4gSWYgYSBiaXQgaXMgc2V0LCB0aGUgY29ycmVzcG9uZGluZyBmaWVsZAotLy8gaW4gYnVmZmVyX2NvbmZpZ190IG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gZXhlY3V0aW5nIHRoZSBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgY29tbWFuZAotI2RlZmluZSBFRkZFQ1RfQ09ORklHX0JVRkZFUiAgICAweDAwMDEgIC8vIGJ1ZmZlciBmaWVsZCBtdXN0IGJlIHRha2VuIGludG8gYWNjb3VudAotI2RlZmluZSBFRkZFQ1RfQ09ORklHX1NNUF9SQVRFICAweDAwMDIgIC8vIHNhbXBsaW5nUmF0ZSBmaWVsZCBtdXN0IGJlIHRha2VuIGludG8gYWNjb3VudAotI2RlZmluZSBFRkZFQ1RfQ09ORklHX0NIQU5ORUxTICAweDAwMDQgIC8vIGNoYW5uZWxzIGZpZWxkIG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50Ci0jZGVmaW5lIEVGRkVDVF9DT05GSUdfRk9STUFUICAgIDB4MDAwOCAgLy8gZm9ybWF0IGZpZWxkIG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50Ci0jZGVmaW5lIEVGRkVDVF9DT05GSUdfQUNDX01PREUgIDB4MDAxMCAgLy8gYWNjZXNzTW9kZSBmaWVsZCBtdXN0IGJlIHRha2VuIGludG8gYWNjb3VudAotI2RlZmluZSBFRkZFQ1RfQ09ORklHX1BST1ZJREVSICAweDAwMjAgIC8vIGJ1ZmZlclByb3ZpZGVyIGZpZWxkIG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50Ci0jZGVmaW5lIEVGRkVDVF9DT05GSUdfQUxMIChFRkZFQ1RfQ09ORklHX0JVRkZFUiB8IEVGRkVDVF9DT05GSUdfU01QX1JBVEUgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfQ09ORklHX0NIQU5ORUxTIHwgRUZGRUNUX0NPTkZJR19GT1JNQVQgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfQ09ORklHX0FDQ19NT0RFIHwgRUZGRUNUX0NPTkZJR19QUk9WSURFUikKLQotCi0vLyBlZmZlY3RfY29uZmlnX3Mgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgZm9ybWF0IG9mIHRoZSBwQ21kRGF0YSBhcmd1bWVudCBvZiBFRkZFQ1RfQ01EX1NFVF9DT05GSUcKLS8vIGNvbW1hbmQgdG8gY29uZmlndXJlIGF1ZGlvIHBhcmFtZXRlcnMgYW5kIGJ1ZmZlcnMgZm9yIGVmZmVjdCBlbmdpbmUgaW5wdXQgYW5kIG91dHB1dC4KLXR5cGVkZWYgc3RydWN0IGVmZmVjdF9jb25maWdfcyB7Ci0gICAgYnVmZmVyX2NvbmZpZ190ICAgaW5wdXRDZmc7Ci0gICAgYnVmZmVyX2NvbmZpZ190ICAgb3V0cHV0Q2ZnOwotfSBlZmZlY3RfY29uZmlnX3Q7Ci0KLQotLy8gZWZmZWN0X3BhcmFtX3Mgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgZm9ybWF0IG9mIHRoZSBwQ21kRGF0YSBhcmd1bWVudCBvZiBFRkZFQ1RfQ01EX1NFVF9QQVJBTQotLy8gY29tbWFuZCBhbmQgcENtZERhdGEgYW5kIHBSZXBseURhdGEgb2YgRUZGRUNUX0NNRF9HRVRfUEFSQU0gY29tbWFuZC4KLS8vIHBzaXplIGFuZCB2c2l6ZSByZXByZXNlbnQgdGhlIGFjdHVhbCBzaXplIG9mIHBhcmFtZXRlciBhbmQgdmFsdWUuCi0vLwotLy8gTk9URTogdGhlIHN0YXJ0IG9mIHZhbHVlIGZpZWxkIGluc2lkZSB0aGUgZGF0YSBmaWVsZCBpcyBhbHdheXMgb24gYSAzMiBiaXQgYm91bmRhcnk6Ci0vLwotLy8gICstLS0tLS0tLS0tLSsKLS8vICB8IHN0YXR1cyAgICB8IHNpemVvZihpbnQpCi0vLyAgKy0tLS0tLS0tLS0tKwotLy8gIHwgcHNpemUgICAgIHwgc2l6ZW9mKGludCkKLS8vICArLS0tLS0tLS0tLS0rCi0vLyAgfCB2c2l6ZSAgICAgfCBzaXplb2YoaW50KQotLy8gICstLS0tLS0tLS0tLSsKLS8vICB8ICAgICAgICAgICB8ICAgfCAgICAgICAgICAgfAotLy8gIH4gcGFyYW1ldGVyIH4gICA+IHBzaXplICAgICB8Ci0vLyAgfCAgICAgICAgICAgfCAgIHwgICAgICAgICAgID4gICgocHNpemUgLSAxKS9zaXplb2YoaW50KSArIDEpICogc2l6ZW9mKGludCkKLS8vICArLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAgfAotLy8gIHwgcGFkZGluZyAgIHwgICAgICAgICAgICAgICB8Ci0vLyAgKy0tLS0tLS0tLS0tKwotLy8gIHwgICAgICAgICAgIHwgICB8Ci0vLyAgfiB2YWx1ZSAgICAgfiAgID4gdnNpemUKLS8vICB8ICAgICAgICAgICB8ICAgfAotLy8gICstLS0tLS0tLS0tLSsKLQotdHlwZWRlZiBzdHJ1Y3QgZWZmZWN0X3BhcmFtX3MgewotICAgIGludDMyX3QgICAgIHN0YXR1czsgICAgIC8vIFRyYW5zYWN0aW9uIHN0YXR1cyAodW51c2VkIGZvciBjb21tYW5kLCB1c2VkIGZvciByZXBseSkKLSAgICB1aW50MzJfdCAgICBwc2l6ZTsgICAgICAvLyBQYXJhbWV0ZXIgc2l6ZQotICAgIHVpbnQzMl90ICAgIHZzaXplOyAgICAgIC8vIFZhbHVlIHNpemUKLSAgICBjaGFyICAgICAgICBkYXRhW107ICAgICAvLyBTdGFydCBvZiBQYXJhbWV0ZXIgKyBWYWx1ZSBkYXRhCi19IGVmZmVjdF9wYXJhbV90OwotCi0vLyBNYXhpbXVtIGVmZmVjdF9wYXJhbV90IHNpemUKLSNkZWZpbmUgRUZGRUNUX1BBUkFNX1NJWkVfTUFYICAgICAgIDY1NTM2Ci0KLS8vIHN0cnVjdHVyZSB1c2VkIGJ5IEVGRkVDVF9DTURfT0ZGTE9BRCBjb21tYW5kCi10eXBlZGVmIHN0cnVjdCBlZmZlY3Rfb2ZmbG9hZF9wYXJhbV9zIHsKLSAgICBib29sIGlzT2ZmbG9hZDsgICAgICAgICAvLyB0cnVlIGlmIHRoZSBwbGF5YmFjayB0aHJlYWQgdGhlIGVmZmVjdCBpcyBhdHRhY2hlZCB0byBpcyBvZmZsb2FkZWQKLSAgICBpbnQgaW9IYW5kbGU7ICAgICAgICAgICAvLyBpbyBoYW5kbGUgb2YgdGhlIHBsYXliYWNrIHRocmVhZCB0aGUgZWZmZWN0IGlzIGF0dGFjaGVkIHRvCi19IGVmZmVjdF9vZmZsb2FkX3BhcmFtX3Q7Ci0KLQogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gICAgICBFZmZlY3QgbGlicmFyeSBpbnRlcmZhY2UKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvY2FtZXJhMy5oIGIvaW5jbHVkZS9oYXJkd2FyZS9jYW1lcmEzLmgKaW5kZXggYTdkZjBlZS4uY2VjMmFiMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9jYW1lcmEzLmgKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS9jYW1lcmEzLmgKQEAgLTE0NzksNiArMTQ3OSwxMyBAQAogICAgICAqICAgICAgYW5kcm9pZC5sZW5zLm9wdGljYWxTdGFiaWxpemF0aW9uTW9kZSAoaWYgaXQgaXMgc3VwcG9ydGVkKQogICAgICAqICAgICAgYW5kcm9pZC5zY2FsZXIuY3JvcFJlZ2lvbgogICAgICAqICAgICAgYW5kcm9pZC5zdGF0aXN0aWNzLmZhY2VEZXRlY3RNb2RlIChpZiBpdCBpcyBzdXBwb3J0ZWQpCisgICAgICogICA2LiBUbyByZWR1Y2UgdGhlIGFtb3VudCBvZiBkYXRhIHBhc3NlZCBhY3Jvc3MgcHJvY2VzcyBib3VuZGFyaWVzIGF0CisgICAgICogICAgICBoaWdoIGZyYW1lIHJhdGUsIHdpdGhpbiBvbmUgYmF0Y2gsIGNhbWVyYSBmcmFtZXdvcmsgb25seSBwcm9wYWdhdGVzCisgICAgICogICAgICB0aGUgbGFzdCBzaHV0dGVyIG5vdGlmeSBhbmQgdGhlIGxhc3QgY2FwdHVyZSByZXN1bHRzIChpbmNsdWRpbmcgcGFydGlhbAorICAgICAqICAgICAgcmVzdWx0cyBhbmQgZmluYWwgcmVzdWx0KSB0byB0aGUgYXBwLiBUaGUgc2h1dHRlciBub3RpZmllcyBhbmQgY2FwdHVyZQorICAgICAqICAgICAgcmVzdWx0cyBmb3IgdGhlIG90aGVyIHJlcXVlc3RzIGluIHRoZSBiYXRjaCBhcmUgZGVyaXZlZCBieQorICAgICAqICAgICAgdGhlIGNhbWVyYSBmcmFtZXdvcmsuIEFzIGEgcmVzdWx0LCB0aGUgSEFMIGNhbiByZXR1cm4gZW1wdHkgbWV0YWRhdGEKKyAgICAgKiAgICAgIGV4Y2VwdCBmb3IgdGhlIGxhc3QgcmVzdWx0IGluIHRoZSBiYXRjaC4KICAgICAgKgogICAgICAqIEZvciBtb3JlIGRldGFpbHMgYWJvdXQgaGlnaCBzcGVlZCBzdHJlYW0gcmVxdWlyZW1lbnRzLCBzZWUKICAgICAgKiBhbmRyb2lkLmNvbnRyb2wuYXZhaWxhYmxlSGlnaFNwZWVkVmlkZW9Db25maWd1cmF0aW9ucyBhbmQgQ09OU1RSQUlORURfSElHSF9TUEVFRF9WSURFTwpAQCAtMTU5Nyw2ICsxNjA0LDEzIEBACiAgICAgICogICB2YWx1ZSBvZiB0aGlzIGlzIDAuCiAgICAgICogICBGb3IgYWxsIHN0cmVhbXMgcGFzc2VkIHZpYSBjb25maWd1cmVfc3RyZWFtcygpLCB0aGUgSEFMIG11c3Qgd3JpdGUKICAgICAgKiAgIG92ZXIgdGhpcyBmaWVsZCB3aXRoIGl0cyB1c2FnZSBmbGFncy4KKyAgICAgKgorICAgICAqICAgRnJvbSBBbmRyb2lkIE8sIHRoZSB1c2FnZSBmbGFnIGZvciBhbiBvdXRwdXQgc3RyZWFtIG1heSBiZSBiaXR3aXNlCisgICAgICogICBjb21iaW5hdGlvbiBvZiB1c2FnZSBmbGFncyBmb3IgbXVsdGlwbGUgY29uc3VtZXJzLCBmb3IgdGhlIHB1cnBvc2Ugb2YKKyAgICAgKiAgIHNoYXJpbmcgb25lIGNhbWVyYSBzdHJlYW0gYmV0d2VlbiB0aG9zZSBjb25zdW1lcnMuIFRoZSBIQUwgbXVzdCBmYWlsCisgICAgICogICBjb25maWd1cmVfc3RyZWFtcyBjYWxsIHdpdGggLUVJTlZBTCBpZiB0aGUgY29tYmluZWQgZmxhZ3MgY2Fubm90IGJlCisgICAgICogICBzdXBwb3J0ZWQgZHVlIHRvIGltY29tcGF0aWJsZSBidWZmZXIgZm9ybWF0LCBkYXRhU3BhY2UsIG9yIG90aGVyIGhhcmR3YXJlCisgICAgICogICBsaW1pdGF0aW9ucy4KICAgICAgKi8KICAgICB1aW50MzJfdCB1c2FnZTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS9jYW1lcmFfY29tbW9uLmggYi9pbmNsdWRlL2hhcmR3YXJlL2NhbWVyYV9jb21tb24uaAppbmRleCBjNzRkN2JiLi43YmFmYTg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2hhcmR3YXJlL2NhbWVyYV9jb21tb24uaAorKysgYi9pbmNsdWRlL2hhcmR3YXJlL2NhbWVyYV9jb21tb24uaApAQCAtMTQzLDggKzE0Myw4IEBACiAjZGVmaW5lIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wIEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTigxLCAwKSAvLyBERVBSRUNBVEVECiAjZGVmaW5lIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8wIEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTigyLCAwKSAvLyBOTyBMT05HRVIgU1VQUE9SVEVECiAjZGVmaW5lIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8xIEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTigyLCAxKSAvLyBOTyBMT05HRVIgU1VQUE9SVEVECi0jZGVmaW5lIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wIEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTigzLCAwKQotI2RlZmluZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMSBIQVJEV0FSRV9ERVZJQ0VfQVBJX1ZFUlNJT04oMywgMSkKKyNkZWZpbmUgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzAgSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKDMsIDApIC8vIE5PIExPTkdFUiBTVVBQT1JURUQKKyNkZWZpbmUgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzEgSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKDMsIDEpIC8vIE5PIExPTkdFUiBTVVBQT1JURUQKICNkZWZpbmUgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIgSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKDMsIDIpCiAjZGVmaW5lIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18zIEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTigzLCAzKQogI2RlZmluZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNCBIQVJEV0FSRV9ERVZJQ0VfQVBJX1ZFUlNJT04oMywgNCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvZmluZ2VycHJpbnQuaCBiL2luY2x1ZGUvaGFyZHdhcmUvZmluZ2VycHJpbnQuaAppbmRleCBiNDQ2NWJhLi44NmNlZDliIDEwMDY0NAotLS0gYS9pbmNsdWRlL2hhcmR3YXJlL2ZpbmdlcnByaW50LmgKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS9maW5nZXJwcmludC5oCkBAIC0yMyw2ICsyMyw3IEBACiAjZGVmaW5lIEZJTkdFUlBSSU5UX01PRFVMRV9BUElfVkVSU0lPTl8xXzAgSEFSRFdBUkVfTU9EVUxFX0FQSV9WRVJTSU9OKDEsIDApCiAjZGVmaW5lIEZJTkdFUlBSSU5UX01PRFVMRV9BUElfVkVSU0lPTl8yXzAgSEFSRFdBUkVfTU9EVUxFX0FQSV9WRVJTSU9OKDIsIDApCiAjZGVmaW5lIEZJTkdFUlBSSU5UX01PRFVMRV9BUElfVkVSU0lPTl8yXzEgSEFSRFdBUkVfTU9EVUxFX0FQSV9WRVJTSU9OKDIsIDEpCisjZGVmaW5lIEZJTkdFUlBSSU5UX01PRFVMRV9BUElfVkVSU0lPTl8zXzAgSEFSRFdBUkVfTU9EVUxFX0FQSV9WRVJTSU9OKDMsIDApCiAjZGVmaW5lIEZJTkdFUlBSSU5UX0hBUkRXQVJFX01PRFVMRV9JRCAiZmluZ2VycHJpbnQiCiAKIHR5cGVkZWYgZW51bSBmaW5nZXJwcmludF9tc2dfdHlwZSB7CkBAIC01MSw2ICs1Miw3IEBACiAgICAgRklOR0VSUFJJTlRfRVJST1JfTk9fU1BBQ0UgPSA0LCAvKiBObyBzcGFjZSBhdmFpbGFibGUgdG8gc3RvcmUgYSB0ZW1wbGF0ZSAqLwogICAgIEZJTkdFUlBSSU5UX0VSUk9SX0NBTkNFTEVEID0gNSwgLyogVGhlIGN1cnJlbnQgb3BlcmF0aW9uIGNhbid0IHByb2NlZWQuIFNlZSBhYm92ZS4gKi8KICAgICBGSU5HRVJQUklOVF9FUlJPUl9VTkFCTEVfVE9fUkVNT1ZFID0gNiwgLyogZmluZ2VycHJpbnQgd2l0aCBnaXZlbiBpZCBjYW4ndCBiZSByZW1vdmVkICovCisgICAgRklOR0VSUFJJTlRfRVJST1JfTE9DS09VVCA9IDcsIC8qIHRoZSBmaW5nZXJwcmludCBoYXJkd2FyZSBpcyBpbiBsb2Nrb3V0IGR1ZSB0byB0b28gbWFueSBhdHRlbXB0cyAqLwogICAgIEZJTkdFUlBSSU5UX0VSUk9SX1ZFTkRPUl9CQVNFID0gMTAwMCAvKiB2ZW5kb3Itc3BlY2lmaWMgZXJyb3IgbWVzc2FnZXMgc3RhcnQgaGVyZSAqLwogfSBmaW5nZXJwcmludF9lcnJvcl90OwogCkBAIC02OSw2ICs3MSw4IEBACiAgICAgRklOR0VSUFJJTlRfQUNRVUlSRURfSU1BR0VSX0RJUlRZID0gMywgLyogc2Vuc29yIG5lZWRzIHRvIGJlIGNsZWFuZWQgKi8KICAgICBGSU5HRVJQUklOVF9BQ1FVSVJFRF9UT09fU0xPVyA9IDQsIC8qIG1vc3RseSBzd2lwZS10eXBlIHNlbnNvcnM7IG5vdCBlbm91Z2ggZGF0YSBjb2xsZWN0ZWQgKi8KICAgICBGSU5HRVJQUklOVF9BQ1FVSVJFRF9UT09fRkFTVCA9IDUsIC8qIGZvciBzd2lwZSBhbmQgYXJlYSBzZW5zb3JzOyB0ZWxsIHVzZXIgdG8gc2xvdyBkb3duKi8KKyAgICBGSU5HRVJQUklOVF9BQ1FVSVJFRF9ERVRFQ1RFRCA9IDYsIC8qIHdoZW4gdGhlIGZpbmdlciBpcyBmaXJzdCBkZXRlY3RlZC4gVXNlZCB0byBvcHRpbWl6ZSB3YWtldXAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG91bGQgYmUgZm9sbG93ZWQgYnkgb25lIG9mIHRoZSBhYm92ZSBtZXNzYWdlcyAqLwogICAgIEZJTkdFUlBSSU5UX0FDUVVJUkVEX1ZFTkRPUl9CQVNFID0gMTAwMCAvKiB2ZW5kb3Itc3BlY2lmaWMgYWNxdWlzaXRpb24gbWVzc2FnZXMgc3RhcnQgaGVyZSAqLwogfSBmaW5nZXJwcmludF9hY3F1aXJlZF9pbmZvX3Q7CiAKQEAgLTg1LDE0ICs4OSwxMyBAQAogICAgIHVpbnQ2NF90IG1zZzsgLyogVmVuZG9yIHNwZWNpZmljIG1lc3NhZ2UuIFVzZWQgZm9yIHVzZXIgZ3VpZGFuY2UgKi8KIH0gZmluZ2VycHJpbnRfZW5yb2xsX3Q7CiAKLXR5cGVkZWYgc3RydWN0IGZpbmdlcnByaW50X2VudW1lcmF0ZWQgewordHlwZWRlZiBzdHJ1Y3QgZmluZ2VycHJpbnRfaXRlcmF0b3IgewogICAgIGZpbmdlcnByaW50X2Zpbmdlcl9pZF90IGZpbmdlcjsKICAgICB1aW50MzJfdCByZW1haW5pbmdfdGVtcGxhdGVzOwotfSBmaW5nZXJwcmludF9lbnVtZXJhdGVkX3Q7Cit9IGZpbmdlcnByaW50X2l0ZXJhdG9yX3Q7CiAKLXR5cGVkZWYgc3RydWN0IGZpbmdlcnByaW50X3JlbW92ZWQgewotICAgIGZpbmdlcnByaW50X2Zpbmdlcl9pZF90IGZpbmdlcjsKLX0gZmluZ2VycHJpbnRfcmVtb3ZlZF90OwordHlwZWRlZiBmaW5nZXJwcmludF9pdGVyYXRvcl90IGZpbmdlcnByaW50X2VudW1lcmF0ZWRfdDsKK3R5cGVkZWYgZmluZ2VycHJpbnRfaXRlcmF0b3JfdCBmaW5nZXJwcmludF9yZW1vdmVkX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGZpbmdlcnByaW50X2FjcXVpcmVkIHsKICAgICBmaW5nZXJwcmludF9hY3F1aXJlZF9pbmZvX3QgYWNxdWlyZWRfaW5mbzsgLyogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGltYWdlICovCkBAIC0yMDcsMTIgKzIxMCwxMyBAQAogICAgIC8qCiAgICAgICogRW51bWVyYXRlIGFsbCB0aGUgZmluZ2VycHJpbnQgdGVtcGxhdGVzIGZvdW5kIGluIHRoZSBkaXJlY3Rvcnkgc2V0IGJ5CiAgICAgICogc2V0X2FjdGl2ZV9ncm91cCgpCi0gICAgICogRm9yIGVhY2ggdGVtcGxhdGUgZm91bmQgbm90aWZ5KCkgd2lsbCBiZSBjYWxsZWQgd2l0aDoKKyAgICAgKiBGb3IgZWFjaCB0ZW1wbGF0ZSBmb3VuZCBhIG5vdGlmeSgpIHdpbGwgYmUgY2FsbGVkIHdpdGg6CiAgICAgICogZmluZ2VycHJpbnRfbXNnLnR5cGUgPT0gRklOR0VSUFJJTlRfVEVNUExBVEVfRU5VTUVSQVRFRAogICAgICAqIGZpbmdlcnByaW50X21zZy5kYXRhLmVudW1lcmF0ZWQuZmluZ2VyIGluZGljYXRpbmcgYSB0ZW1wbGF0ZSBpZAogICAgICAqIGZpbmdlcnByaW50X21zZy5kYXRhLmVudW1lcmF0ZWQucmVtYWluaW5nX3RlbXBsYXRlcyBpbmRpY2F0aW5nIGhvdyBtYW55IG1vcmUKICAgICAgKiBlbnVtZXJhdGlvbiBtZXNzYWdlcyB0byBleHBlY3QuCi0gICAgICoKKyAgICAgKiBOb3RlOiBJZiB0aGVyZSBhcmUgbm8gZmluZ2VycHJpbnRzLCB0aGVuIHRoaXMgc2hvdWxkIHJldHVybiAwIGFuZCB0aGUgZmlyc3QgZmluZ2VycHJpbnQKKyAgICAgKiAgICAgICAgICAgICAgICAgIGVudW1lcmF0ZWQgc2hvdWxkIGhhdmUgZmluZ2VyaWQ9MCBhbmQgcmVtYWluaW5nPTAKICAgICAgKiBGdW5jdGlvbiByZXR1cm46IDAgaWYgZW51bWVyYXRlIHJlcXVlc3QgaXMgYWNjZXB0ZWQKICAgICAgKiAgICAgICAgICAgICAgICAgIG9yIGEgbmVnYXRpdmUgbnVtYmVyIGluIGNhc2Ugb2YgZXJyb3IsIGdlbmVyYWxseSBmcm9tIHRoZSBlcnJuby5oIHNldC4KICAgICAgKi8KQEAgLTIyMiw5ICsyMjYsMTQgQEAKICAgICAgKiBGaW5nZXJwcmludCByZW1vdmUgcmVxdWVzdDoKICAgICAgKiBEZWxldGVzIGEgZmluZ2VycHJpbnQgdGVtcGxhdGUuCiAgICAgICogV29ya3Mgb25seSB3aXRoaW4gdGhlIHBhdGggc2V0IGJ5IHNldF9hY3RpdmVfZ3JvdXAoKS4KLSAgICAgKiBub3RpZnkoKSB3aWxsIGJlIGNhbGxlZCB3aXRoIGRldGFpbHMgb24gdGhlIHRlbXBsYXRlIGRlbGV0ZWQuCi0gICAgICogZmluZ2VycHJpbnRfbXNnLnR5cGUgPT0gRklOR0VSUFJJTlRfVEVNUExBVEVfUkVNT1ZFRCBhbmQKLSAgICAgKiBmaW5nZXJwcmludF9tc2cuZGF0YS5yZW1vdmVkLmZpbmdlciBpbmRpY2F0aW5nIHRoZSB0ZW1wbGF0ZSBpZCByZW1vdmVkLgorICAgICAqIFRoZSBmaWQgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIGFzIGEgd2lkY2FyZDoKKyAgICAgKiAgICogZmlkID09IDAgLS0gZGVsZXRlIGFsbCB0aGUgdGVtcGxhdGVzIGluIHRoZSBncm91cC4KKyAgICAgKiAgICogZmlkICE9IDAgLS0gZGVsZXRlIHRoaXMgc3BlY2lmaWMgdGVtcGxhdGUgZnJvbSB0aGUgZ3JvdXAuCisgICAgICogRm9yIGVhY2ggdGVtcGxhdGUgZm91bmQgYSBub3RpZnkoKSB3aWxsIGJlIGNhbGxlZCB3aXRoOgorICAgICAqIGZpbmdlcnByaW50X21zZy50eXBlID09IEZJTkdFUlBSSU5UX1RFTVBMQVRFX1JFTU9WRUQKKyAgICAgKiBmaW5nZXJwcmludF9tc2cuZGF0YS5yZW1vdmVkLmZpbmdlciBpbmRpY2F0aW5nIGEgdGVtcGxhdGUgaWQgZGVsZXRlZAorICAgICAqIGZpbmdlcnByaW50X21zZy5kYXRhLnJlbW92ZWQucmVtYWluaW5nX3RlbXBsYXRlcyBpbmRpY2F0aW5nIGhvdyBtYW55IG1vcmUKKyAgICAgKiB0ZW1wbGF0ZXMgd2lsbCBiZSBkZWxldGVkIGJ5IHRoaXMgb3BlcmF0aW9uLgogICAgICAqCiAgICAgICogRnVuY3Rpb24gcmV0dXJuOiAwIGlmIGZpbmdlcnByaW50IHRlbXBsYXRlKHMpIGNhbiBiZSBzdWNjZXNzZnVsbHkgZGVsZXRlZAogICAgICAqICAgICAgICAgICAgICAgICAgb3IgYSBuZWdhdGl2ZSBudW1iZXIgaW4gY2FzZSBvZiBlcnJvciwgZ2VuZXJhbGx5IGZyb20gdGhlIGVycm5vLmggc2V0LgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS9mdXNlZF9sb2NhdGlvbi5oIGIvaW5jbHVkZS9oYXJkd2FyZS9mdXNlZF9sb2NhdGlvbi5oCmluZGV4IDczMzYwYTEuLjU1MGUxOTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvZnVzZWRfbG9jYXRpb24uaAorKysgYi9pbmNsdWRlL2hhcmR3YXJlL2Z1c2VkX2xvY2F0aW9uLmgKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CiAKKyNpbmNsdWRlICJnbnNzLWJhc2UuaCIKIAogLyoqCiAgKiBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIGludGVyZmFjZSBvZiB0aGUgRnVzZWQgTG9jYXRpb24gUHJvdmlkZXIuCkBAIC0xMDMsMTYgKzEwNCw2IEBACiAjZGVmaW5lIEZMUF9TVEFUVVNfTE9DQVRJT05fVU5BVkFJTEFCTEUgICAgICAgMQogCiAvKioKLSAqIFRoaXMgY29uc3RhbnQgaXMgdXNlZCB3aXRoIHRoZSBiYXRjaGVkIGxvY2F0aW9ucwotICogQVBJcy4gQmF0Y2hpbmcgaXMgbWFuZGF0b3J5IHdoZW4gRkxQIGltcGxlbWVudGF0aW9uCi0gKiBpcyBzdXBwb3J0ZWQuIElmIHRoZSBmbGFnIGlzIHNldCwgdGhlIGhhcmR3YXJlIGltcGxlbWVudGF0aW9uCi0gKiB3aWxsIHdha2UgdXAgdGhlIGFwcGxpY2F0aW9uIHByb2Nlc3NvciB3aGVuIHRoZSBGSUZPIGlzIGZ1bGwsCi0gKiBJZiB0aGUgZmxhZyBpcyBub3Qgc2V0LCB0aGUgaGFyZHdhcmUgaW1wbGVtZW50YXRpb24gd2lsbCBkcm9wCi0gKiB0aGUgb2xkZXN0IGRhdGEgd2hlbiB0aGUgRklGTyBpcyBmdWxsLgotICovCi0jZGVmaW5lIEZMUF9CQVRDSF9XQUtFVVBfT05fRklGT19GVUxMICAgICAgICAweDAwMDAwMDEKLQotLyoqCiAgKiBXaGlsZSBiYXRjaGluZywgdGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBub3QgY2FsbCB0aGUKICAqIGZscF9sb2NhdGlvbl9jYWxsYmFjayBvbiBldmVyeSBsb2NhdGlvbiBmaXguIEhvd2V2ZXIsCiAgKiBzb21ldGltZXMgaW4gaGlnaCBwb3dlciBtb2RlLCB0aGUgc3lzdGVtIG1pZ2h0IG5lZWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFyZHdhcmUvZ25zcy1iYXNlLmggYi9pbmNsdWRlL2hhcmR3YXJlL2duc3MtYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NjAyMGQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2hhcmR3YXJlL2duc3MtYmFzZS5oCkBAIC0wLDAgKzEsMjc1IEBACisvLyBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBieSBoaWRsLWdlbi4gRG8gbm90IGVkaXQgbWFudWFsbHkuCisvLyBTb3VyY2U6IGFuZHJvaWQuaGFyZHdhcmUuZ25zc0AxLjAKKy8vIFJvb3Q6IGFuZHJvaWQuaGFyZHdhcmU6aGFyZHdhcmUvaW50ZXJmYWNlcworCisjaWZuZGVmIEhJRExfR0VORVJBVEVEX0FORFJPSURfSEFSRFdBUkVfR05TU19WMV8wX0VYUE9SVEVEX0NPTlNUQU5UU19IXworI2RlZmluZSBISURMX0dFTkVSQVRFRF9BTkRST0lEX0hBUkRXQVJFX0dOU1NfVjFfMF9FWFBPUlRFRF9DT05TVEFOVFNfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitlbnVtIHsKKyAgICBHTlNTX01BWF9TVlNfQ09VTlQgPSA2NHUsIC8vIDY0Cit9OworCitlbnVtIHsKKyAgICBHTlNTX0NPTlNURUxMQVRJT05fVU5LTk9XTiA9IDAsCisgICAgR05TU19DT05TVEVMTEFUSU9OX0dQUyA9IDEsCisgICAgR05TU19DT05TVEVMTEFUSU9OX1NCQVMgPSAyLAorICAgIEdOU1NfQ09OU1RFTExBVElPTl9HTE9OQVNTID0gMywKKyAgICBHTlNTX0NPTlNURUxMQVRJT05fUVpTUyA9IDQsCisgICAgR05TU19DT05TVEVMTEFUSU9OX0JFSURPVSA9IDUsCisgICAgR05TU19DT05TVEVMTEFUSU9OX0dBTElMRU8gPSA2LAorfTsKKworZW51bSB7CisgICAgR1BTX0xPQ0FUSU9OX0hBU19MQVRfTE9ORyA9IDEsIC8vIDB4MDAwMQorICAgIEdQU19MT0NBVElPTl9IQVNfQUxUSVRVREUgPSAyLCAvLyAweDAwMDIKKyAgICBHUFNfTE9DQVRJT05fSEFTX1NQRUVEID0gNCwgLy8gMHgwMDA0CisgICAgR1BTX0xPQ0FUSU9OX0hBU19CRUFSSU5HID0gOCwgLy8gMHgwMDA4CisgICAgR1BTX0xPQ0FUSU9OX0hBU19IT1JJWk9OVEFMX0FDQ1VSQUNZID0gMTYsIC8vIDB4MDAxMAorICAgIEdQU19MT0NBVElPTl9IQVNfVkVSVElDQUxfQUNDVVJBQ1kgPSAzMiwgLy8gMHgwMDIwCisgICAgR1BTX0xPQ0FUSU9OX0hBU19TUEVFRF9BQ0NVUkFDWSA9IDY0LCAvLyAweDAwNDAKKyAgICBHUFNfTE9DQVRJT05fSEFTX0JFQVJJTkdfQUNDVVJBQ1kgPSAxMjgsIC8vIDB4MDA4MAorfTsKKworZW51bSB7CisgICAgQVBOX0lQX0lOVkFMSUQgPSAwLAorICAgIEFQTl9JUF9JUFY0ID0gMSwKKyAgICBBUE5fSVBfSVBWNiA9IDIsCisgICAgQVBOX0lQX0lQVjRWNiA9IDMsCit9OworCitlbnVtIHsKKyAgICBBR1BTX1RZUEVfU1VQTCA9IDEsCisgICAgQUdQU19UWVBFX0MySyA9IDIsCit9OworCitlbnVtIHsKKyAgICBHTlNTX1JFUVVFU1RfQUdOU1NfREFUQV9DT05OID0gMSwKKyAgICBHTlNTX1JFTEVBU0VfQUdOU1NfREFUQV9DT05OID0gMiwKKyAgICBHTlNTX0FHTlNTX0RBVEFfQ09OTkVDVEVEID0gMywKKyAgICBHTlNTX0FHTlNTX0RBVEFfQ09OTl9ET05FID0gNCwKKyAgICBHTlNTX0FHTlNTX0RBVEFfQ09OTl9GQUlMRUQgPSA1LAorfTsKKworZW51bSB7CisgICAgQUdQU19TRVRJRF9UWVBFX05PTkUgPSAwLAorICAgIEFHUFNfU0VUSURfVFlQRV9JTVNJID0gMSwKKyAgICBBR1BTX1NFVElEX1RZUEVfTVNJU0RNID0gMiwKK307CisKK2VudW0geworICAgIEFHUFNfUklMX05FVFdPUktfVFlQRV9NT0JJTEUgPSAwLAorICAgIEFHUFNfUklMX05FVFdPUktfVFlQRV9XSUZJID0gMSwKKyAgICBBR1BTX1JJTF9ORVRXT1JLX1RZUEVfTU1TID0gMiwKKyAgICBBR1BTX1JJTF9ORVRXT1JLX1RZUEVfU1VQTCA9IDMsCisgICAgQUdQU19SSUxfTkVUV09SS19UWVBFX0RVTiA9IDQsCisgICAgQUdQU19SSUxfTkVUV09SS19UWVBFX0hJUFJJID0gNSwKKyAgICBBR1BTX1JJTF9ORVRXT1JLX1RZUEVfV0lNQVggPSA2LAorfTsKKworZW51bSB7CisgICAgQUdQU19SRUZfTE9DQVRJT05fVFlQRV9HU01fQ0VMTElEID0gMSwKKyAgICBBR1BTX1JFRl9MT0NBVElPTl9UWVBFX1VNVFNfQ0VMTElEID0gMiwKKyAgICBBR1BTX1JFRl9MT0NBVElPTl9UWVBFX0xURV9DRUxMSUQgPSA0LAorfTsKKworZW51bSB7CisgICAgQUdQU19SSUxfUkVRVUVTVF9TRVRJRF9JTVNJID0gMXUsIC8vICgxIDw8IDBMKQorICAgIEFHUFNfUklMX1JFUVVFU1RfU0VUSURfTVNJU0ROID0gMnUsIC8vICgxIDw8IDFMKQorfTsKKworZW51bSB7CisgICAgR1BTX1BPU0lUSU9OX01PREVfU1RBTkRBTE9ORSA9IDAsCisgICAgR1BTX1BPU0lUSU9OX01PREVfTVNfQkFTRUQgPSAxLAorICAgIEdQU19QT1NJVElPTl9NT0RFX01TX0FTU0lTVEVEID0gMiwKK307CisKK2VudW0geworICAgIEdQU19QT1NJVElPTl9SRUNVUlJFTkNFX1BFUklPRElDID0gMHUsIC8vIDAKKyAgICBHUFNfUE9TSVRJT05fUkVDVVJSRU5DRV9TSU5HTEUgPSAxdSwgLy8gMQorfTsKKworZW51bSB7CisgICAgR1BTX0RFTEVURV9FUEhFTUVSSVMgPSAxLCAvLyAweDAwMDEKKyAgICBHUFNfREVMRVRFX0FMTUFOQUMgPSAyLCAvLyAweDAwMDIKKyAgICBHUFNfREVMRVRFX1BPU0lUSU9OID0gNCwgLy8gMHgwMDA0CisgICAgR1BTX0RFTEVURV9USU1FID0gOCwgLy8gMHgwMDA4CisgICAgR1BTX0RFTEVURV9JT05PID0gMTYsIC8vIDB4MDAxMAorICAgIEdQU19ERUxFVEVfVVRDID0gMzIsIC8vIDB4MDAyMAorICAgIEdQU19ERUxFVEVfSEVBTFRIID0gNjQsIC8vIDB4MDA0MAorICAgIEdQU19ERUxFVEVfU1ZESVIgPSAxMjgsIC8vIDB4MDA4MAorICAgIEdQU19ERUxFVEVfU1ZTVEVFUiA9IDI1NiwgLy8gMHgwMTAwCisgICAgR1BTX0RFTEVURV9TQURBVEEgPSA1MTIsIC8vIDB4MDIwMAorICAgIEdQU19ERUxFVEVfUlRJID0gMTAyNCwgLy8gMHgwNDAwCisgICAgR1BTX0RFTEVURV9DRUxMREJfSU5GTyA9IDMyNzY4LCAvLyAweDgwMDAKKyAgICBHUFNfREVMRVRFX0FMTCA9IDY1NTM1LCAvLyAweEZGRkYKK307CisKK2VudW0geworICAgIEZMUF9CQVRDSF9XQUtFVVBfT05fRklGT19GVUxMID0gMSwgLy8gMHgwMQorfTsKKworZW51bSB7CisgICAgR1BTX0NBUEFCSUxJVFlfU0NIRURVTElORyA9IDF1LCAvLyAoMSA8PCAwKQorICAgIEdQU19DQVBBQklMSVRZX01TQiA9IDJ1LCAvLyAoMSA8PCAxKQorICAgIEdQU19DQVBBQklMSVRZX01TQSA9IDR1LCAvLyAoMSA8PCAyKQorICAgIEdQU19DQVBBQklMSVRZX1NJTkdMRV9TSE9UID0gOHUsIC8vICgxIDw8IDMpCisgICAgR1BTX0NBUEFCSUxJVFlfT05fREVNQU5EX1RJTUUgPSAxNnUsIC8vICgxIDw8IDQpCisgICAgR1BTX0NBUEFCSUxJVFlfR0VPRkVOQ0lORyA9IDMydSwgLy8gKDEgPDwgNSkKKyAgICBHUFNfQ0FQQUJJTElUWV9NRUFTVVJFTUVOVFMgPSA2NHUsIC8vICgxIDw8IDYpCisgICAgR1BTX0NBUEFCSUxJVFlfTkFWX01FU1NBR0VTID0gMTI4dSwgLy8gKDEgPDwgNykKK307CisKK2VudW0geworICAgIEdQU19TVEFUVVNfTk9ORSA9IDAsCisgICAgR1BTX1NUQVRVU19TRVNTSU9OX0JFR0lOID0gMSwKKyAgICBHUFNfU1RBVFVTX1NFU1NJT05fRU5EID0gMiwKKyAgICBHUFNfU1RBVFVTX0VOR0lORV9PTiA9IDMsCisgICAgR1BTX1NUQVRVU19FTkdJTkVfT0ZGID0gNCwKK307CisKK2VudW0geworICAgIEdOU1NfU1ZfRkxBR1NfTk9ORSA9IDAsCisgICAgR05TU19TVl9GTEFHU19IQVNfRVBIRU1FUklTX0RBVEEgPSAxLCAvLyAoMSA8PCAwKQorICAgIEdOU1NfU1ZfRkxBR1NfSEFTX0FMTUFOQUNfREFUQSA9IDIsIC8vICgxIDw8IDEpCisgICAgR05TU19TVl9GTEFHU19VU0VEX0lOX0ZJWCA9IDQsIC8vICgxIDw8IDIpCisgICAgR05TU19TVl9GTEFHU19IQVNfQ0FSUklFUl9GUkVRVUVOQ1kgPSA4LCAvLyAoMSA8PCAzKQorfTsKKworZW51bSB7CisgICAgR1BTX0dFT0ZFTkNFX0VOVEVSRUQgPSAxLCAvLyAoMSA8PCAwTCkKKyAgICBHUFNfR0VPRkVOQ0VfRVhJVEVEID0gMiwgLy8gKDEgPDwgMUwpCisgICAgR1BTX0dFT0ZFTkNFX1VOQ0VSVEFJTiA9IDQsIC8vICgxIDw8IDJMKQorfTsKKworZW51bSB7CisgICAgR1BTX0dFT0ZFTkNFX1VOQVZBSUxBQkxFID0gMSwgLy8gKDEgPDwgMEwpCisgICAgR1BTX0dFT0ZFTkNFX0FWQUlMQUJMRSA9IDIsIC8vICgxIDw8IDFMKQorfTsKKworZW51bSB7CisgICAgR1BTX0dFT0ZFTkNFX09QRVJBVElPTl9TVUNDRVNTID0gMCwKKyAgICBHUFNfR0VPRkVOQ0VfRVJST1JfVE9PX01BTllfR0VPRkVOQ0VTID0gLTEwMCwgLy8gKC0xMDApCisgICAgR1BTX0dFT0ZFTkNFX0VSUk9SX0lEX0VYSVNUUyA9IC0xMDEsIC8vICgtMTAxKQorICAgIEdQU19HRU9GRU5DRV9FUlJPUl9JRF9VTktOT1dOID0gLTEwMiwgLy8gKC0xMDIpCisgICAgR1BTX0dFT0ZFTkNFX0VSUk9SX0lOVkFMSURfVFJBTlNJVElPTiA9IC0xMDMsIC8vICgtMTAzKQorICAgIEdQU19HRU9GRU5DRV9FUlJPUl9HRU5FUklDID0gLTE0OSwgLy8gKC0xNDkpCit9OworCitlbnVtIHsKKyAgICBHUFNfTUVBU1VSRU1FTlRfU1VDQ0VTUyA9IDAsCisgICAgR1BTX01FQVNVUkVNRU5UX0VSUk9SX0FMUkVBRFlfSU5JVCA9IC0xMDAsIC8vICgtMTAwKQorICAgIEdQU19NRUFTVVJFTUVOVF9FUlJPUl9HRU5FUklDID0gLTEwMSwgLy8gKC0xMDEpCit9OworCitlbnVtIHsKKyAgICBHTlNTX0NMT0NLX0hBU19MRUFQX1NFQ09ORCA9IDEsIC8vICgxIDw8IDApCisgICAgR05TU19DTE9DS19IQVNfVElNRV9VTkNFUlRBSU5UWSA9IDIsIC8vICgxIDw8IDEpCisgICAgR05TU19DTE9DS19IQVNfRlVMTF9CSUFTID0gNCwgLy8gKDEgPDwgMikKKyAgICBHTlNTX0NMT0NLX0hBU19CSUFTID0gOCwgLy8gKDEgPDwgMykKKyAgICBHTlNTX0NMT0NLX0hBU19CSUFTX1VOQ0VSVEFJTlRZID0gMTYsIC8vICgxIDw8IDQpCisgICAgR05TU19DTE9DS19IQVNfRFJJRlQgPSAzMiwgLy8gKDEgPDwgNSkKKyAgICBHTlNTX0NMT0NLX0hBU19EUklGVF9VTkNFUlRBSU5UWSA9IDY0LCAvLyAoMSA8PCA2KQorfTsKKworZW51bSB7CisgICAgR05TU19NRUFTVVJFTUVOVF9IQVNfU05SID0gMXUsIC8vICgxIDw8IDApCisgICAgR05TU19NRUFTVVJFTUVOVF9IQVNfQ0FSUklFUl9GUkVRVUVOQ1kgPSA1MTJ1LCAvLyAoMSA8PCA5KQorICAgIEdOU1NfTUVBU1VSRU1FTlRfSEFTX0NBUlJJRVJfQ1lDTEVTID0gMTAyNHUsIC8vICgxIDw8IDEwKQorICAgIEdOU1NfTUVBU1VSRU1FTlRfSEFTX0NBUlJJRVJfUEhBU0UgPSAyMDQ4dSwgLy8gKDEgPDwgMTEpCisgICAgR05TU19NRUFTVVJFTUVOVF9IQVNfQ0FSUklFUl9QSEFTRV9VTkNFUlRBSU5UWSA9IDQwOTZ1LCAvLyAoMSA8PCAxMikKKyAgICBHTlNTX01FQVNVUkVNRU5UX0hBU19BVVRPTUFUSUNfR0FJTl9DT05UUk9MID0gODE5MnUsIC8vICgxIDw8IDEzKQorfTsKKworZW51bSB7CisgICAgR05TU19NVUxUSVBBVEhfSU5ESUNBVE9SX1VOS05PV04gPSAwLAorICAgIEdOU1NfTVVMVElQQVRIX0lORElDQVRPUl9QUkVTRU5UID0gMSwKKyAgICBHTlNTX01VTFRJUEFUSF9JTkRJQ0FUSU9SX05PVF9QUkVTRU5UID0gMiwKK307CisKK2VudW0geworICAgIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfVU5LTk9XTiA9IDB1LCAvLyAwCisgICAgR05TU19NRUFTVVJFTUVOVF9TVEFURV9DT0RFX0xPQ0sgPSAxdSwgLy8gKDEgPDwgMCkKKyAgICBHTlNTX01FQVNVUkVNRU5UX1NUQVRFX0JJVF9TWU5DID0gMnUsIC8vICgxIDw8IDEpCisgICAgR05TU19NRUFTVVJFTUVOVF9TVEFURV9TVUJGUkFNRV9TWU5DID0gNHUsIC8vICgxIDw8IDIpCisgICAgR05TU19NRUFTVVJFTUVOVF9TVEFURV9UT1dfREVDT0RFRCA9IDh1LCAvLyAoMSA8PCAzKQorICAgIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfTVNFQ19BTUJJR1VPVVMgPSAxNnUsIC8vICgxIDw8IDQpCisgICAgR05TU19NRUFTVVJFTUVOVF9TVEFURV9TWU1CT0xfU1lOQyA9IDMydSwgLy8gKDEgPDwgNSkKKyAgICBHTlNTX01FQVNVUkVNRU5UX1NUQVRFX0dMT19TVFJJTkdfU1lOQyA9IDY0dSwgLy8gKDEgPDwgNikKKyAgICBHTlNTX01FQVNVUkVNRU5UX1NUQVRFX0dMT19UT0RfREVDT0RFRCA9IDEyOHUsIC8vICgxIDw8IDcpCisgICAgR05TU19NRUFTVVJFTUVOVF9TVEFURV9CRFNfRDJfQklUX1NZTkMgPSAyNTZ1LCAvLyAoMSA8PCA4KQorICAgIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfQkRTX0QyX1NVQkZSQU1FX1NZTkMgPSA1MTJ1LCAvLyAoMSA8PCA5KQorICAgIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfR0FMX0UxQkNfQ09ERV9MT0NLID0gMTAyNHUsIC8vICgxIDw8IDEwKQorICAgIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfR0FMX0UxQ18yTkRfQ09ERV9MT0NLID0gMjA0OHUsIC8vICgxIDw8IDExKQorICAgIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfR0FMX0UxQl9QQUdFX1NZTkMgPSA0MDk2dSwgLy8gKDEgPDwgMTIpCisgICAgR05TU19NRUFTVVJFTUVOVF9TVEFURV9TQkFTX1NZTkMgPSA4MTkydSwgLy8gKDEgPDwgMTMpCisgICAgR05TU19NRUFTVVJFTUVOVF9TVEFURV9UT1dfS05PV04gPSAxNjM4NHUsIC8vICgxIDw8IDE0KQorICAgIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfR0xPX1RPRF9LTk9XTiA9IDMyNzY4dSwgLy8gKDEgPDwgMTUpCit9OworCitlbnVtIHsKKyAgICBHTlNTX0FEUl9TVEFURV9VTktOT1dOID0gMCwKKyAgICBHTlNTX0FEUl9TVEFURV9WQUxJRCA9IDEsIC8vICgxIDw8IDApCisgICAgR05TU19BRFJfU1RBVEVfUkVTRVQgPSAyLCAvLyAoMSA8PCAxKQorICAgIEdOU1NfQURSX1NUQVRFX0NZQ0xFX1NMSVAgPSA0LCAvLyAoMSA8PCAyKQorfTsKKworZW51bSB7CisgICAgR1BTX05BVklHQVRJT05fTUVTU0FHRV9TVUNDRVNTID0gMCwKKyAgICBHUFNfTkFWSUdBVElPTl9NRVNTQUdFX0VSUk9SX0FMUkVBRFlfSU5JVCA9IC0xMDAsIC8vICgtMTAwKQorICAgIEdQU19OQVZJR0FUSU9OX01FU1NBR0VfRVJST1JfR0VORVJJQyA9IC0xMDEsIC8vICgtMTAxKQorfTsKKworZW51bSB7CisgICAgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9VTktOT1dOID0gMCwKKyAgICBHTlNTX05BVklHQVRJT05fTUVTU0FHRV9UWVBFX0dOU1NfTDFDQSA9IDI1NywgLy8gMHgwMTAxCisgICAgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9HTlNTX0wyQ05BViA9IDI1OCwgLy8gMHgwMTAyCisgICAgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9HTlNTX0w1Q05BViA9IDI1OSwgLy8gMHgwMTAzCisgICAgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9HTlNTX0NOQVYyID0gMjYwLCAvLyAweDAxMDQKKyAgICBHTlNTX05BVklHQVRJT05fTUVTU0FHRV9UWVBFX0dMT19MMUNBID0gNzY5LCAvLyAweDAzMDEKKyAgICBHTlNTX05BVklHQVRJT05fTUVTU0FHRV9UWVBFX0JEU19EMSA9IDEyODEsIC8vIDB4MDUwMQorICAgIEdOU1NfTkFWSUdBVElPTl9NRVNTQUdFX1RZUEVfQkRTX0QyID0gMTI4MiwgLy8gMHgwNTAyCisgICAgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9HQUxfSSA9IDE1MzcsIC8vIDB4MDYwMQorICAgIEdOU1NfTkFWSUdBVElPTl9NRVNTQUdFX1RZUEVfR0FMX0YgPSAxNTM4LCAvLyAweDA2MDIKK307CisKK3R5cGVkZWYgZW51bSB7CisgICAgTkFWX01FU1NBR0VfU1RBVFVTX1BBUklUWV9QQVNTRUQgPSAxLCAvLyAoMSA8PCAwKQorICAgIE5BVl9NRVNTQUdFX1NUQVRVU19QQVJJVFlfUkVCVUlMVCA9IDIsIC8vICgxIDw8IDEpCisgICAgTkFWX01FU1NBR0VfU1RBVFVTX1VOS05PV04gPSAwLAorfSBuYXZpZ2F0aW9uX21lc3NhZ2Vfc3RhdHVzOworCitlbnVtIHsKKyAgICBHUFNfTklfVFlQRV9WT0lDRSA9IDEsCisgICAgR1BTX05JX1RZUEVfVU1UU19TVVBMID0gMiwKKyAgICBHUFNfTklfVFlQRV9VTVRTX0NUUkxfUExBTkUgPSAzLAorfTsKKworZW51bSB7CisgICAgR1BTX05JX05FRURfTk9USUZZID0gMXUsIC8vIDB4MDAwMQorICAgIEdQU19OSV9ORUVEX1ZFUklGWSA9IDJ1LCAvLyAweDAwMDIKKyAgICBHUFNfTklfUFJJVkFDWV9PVkVSUklERSA9IDR1LCAvLyAweDAwMDQKK307CisKK2VudW0geworICAgIEdQU19OSV9SRVNQT05TRV9BQ0NFUFQgPSAxLAorICAgIEdQU19OSV9SRVNQT05TRV9ERU5ZID0gMiwKKyAgICBHUFNfTklfUkVTUE9OU0VfTk9SRVNQID0gMywKK307CisKK2VudW0geworICAgIEdQU19FTkNfTk9ORSA9IDAsCisgICAgR1BTX0VOQ19TVVBMX0dTTV9ERUZBVUxUID0gMSwKKyAgICBHUFNfRU5DX1NVUExfVVRGOCA9IDIsCisgICAgR1BTX0VOQ19TVVBMX1VDUzIgPSAzLAorICAgIEdQU19FTkNfVU5LTk9XTiA9IC0xLCAvLyAoLTEpCit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgIC8vIEhJRExfR0VORVJBVEVEX0FORFJPSURfSEFSRFdBUkVfR05TU19WMV8wX0VYUE9SVEVEX0NPTlNUQU5UU19IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS9ncHMuaCBiL2luY2x1ZGUvaGFyZHdhcmUvZ3BzLmgKaW5kZXggYWNmNjAxYi4uNGUxMDhiMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9ncHMuaAorKysgYi9pbmNsdWRlL2hhcmR3YXJlL2dwcy5oCkBAIC0yNiw4ICsyNiw0MiBAQAogCiAjaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KIAorI2luY2x1ZGUgImduc3MtYmFzZS5oIgorCiBfX0JFR0lOX0RFQ0xTCiAKKy8qCisgKiBFbnVtcyBkZWZpbmVkIGluIEhJREwgaW4gaGFyZHdhcmUvaW50ZXJmYWNlcyBhcmUgYXV0by1nZW5lcmF0ZWQgYW5kIHByZXNlbnQKKyAqIGluIGduc3MtYmFzZS5oLgorICovCisKKy8qIGZvciBjb21wYXRpYmlsaXR5ICovCisKKy8qKiBNYXhpbXVtIG51bWJlciBvZiBTVnMgZm9yIGdwc19zdl9zdGF0dXNfY2FsbGJhY2soKS4gKi8KKyNkZWZpbmUgR05TU19NQVhfU1ZTIEdOU1NfTUFYX1NWU19DT1VOVAorLyoqIE1heGltdW0gbnVtYmVyIG9mIE1lYXN1cmVtZW50cyBpbiBnbnNzX21lYXN1cmVtZW50X2NhbGxiYWNrKCkuICovCisjZGVmaW5lIEdOU1NfTUFYX01FQVNVUkVNRU5UIEdOU1NfTUFYX1NWU19DT1VOVAorCisjZGVmaW5lIEdQU19SRVFVRVNUX0FHUFNfREFUQV9DT05OIEdOU1NfUkVRVUVTVF9BR05TU19EQVRBX0NPTk4KKyNkZWZpbmUgR1BTX1JFTEVBU0VfQUdQU19EQVRBX0NPTk4gR05TU19SRUxFQVNFX0FHTlNTX0RBVEFfQ09OTgorI2RlZmluZSBHUFNfQUdQU19EQVRBX0NPTk5FQ1RFRCBHTlNTX0FHTlNTX0RBVEFfQ09OTkVDVEVECisjZGVmaW5lIEdQU19BR1BTX0RBVEFfQ09OTl9ET05FIEdOU1NfQUdOU1NfREFUQV9DT05OX0RPTkUKKyNkZWZpbmUgR1BTX0FHUFNfREFUQV9DT05OX0ZBSUxFRCBHTlNTX0FHTlNTX0RBVEFfQ09OTl9GQUlMRUQKKyNkZWZpbmUgQUdQU19SSUxfTkVUV09SS19UWVBFX01PQklMRV9NTVMgQUdQU19SSUxfTkVUV09SS19UWVBFX01NUworI2RlZmluZSBBR1BTX1JJTF9ORVRXT1JLX1RZUEVfTU9CSUxFX1NVUEwgQUdQU19SSUxfTkVUV09SS19UWVBFX1NVUEwKKyNkZWZpbmUgQUdQU19SSUxfTkVUV09SS19UVFlQRV9NT0JJTEVfRFVOIEFHUFNfUklMX05FVFdPUktfVFlQRV9EVU4KKyNkZWZpbmUgQUdQU19SSUxfTkVUV09SS19UVFlQRV9NT0JJTEVfSElQUkkgQUdQU19SSUxfTkVUV09SS19UWVBFX0hJUFJJCisjZGVmaW5lIEFHUFNfUklMX05FVFdPUktfVFRZUEVfV0lNQVggQUdQU19SSUxfTkVUV09SS19UWVBFX1dJTUFYCisjZGVmaW5lIEdOU1NfTVVMVElQQVRIX0lORElDQVRPUl9OT1RfUFJFU0VOVCBHTlNTX01VTFRJUEFUSF9JTkRJQ0FUSU9SX05PVF9QUkVTRU5UCisjZGVmaW5lIEFHUFNfU0VUSURfVFlQRV9NU0lTRE4gQUdQU19TRVRJRF9UWVBFX01TSVNETQorI2RlZmluZSBHUFNfTUVBU1VSRU1FTlRfT1BFUkFUSU9OX1NVQ0NFU1MgR1BTX01FQVNVUkVNRU5UX1NVQ0NFU1MKKyNkZWZpbmUgR1BTX05BVklHQVRJT05fTUVTU0FHRV9PUEVSQVRJT05fU1VDQ0VTUyBHUFNfTkFWSUdBVElPTl9NRVNTQUdFX1NVQ0NFU1MKKyNkZWZpbmUgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9HUFNfTDFDQSBHTlNTX05BVklHQVRJT05fTUVTU0FHRV9UWVBFX0dOU1NfTDFDQQorI2RlZmluZSBHTlNTX05BVklHQVRJT05fTUVTU0FHRV9UWVBFX0dQU19MMkNOQVYgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9HTlNTX0wyQ05BVgorI2RlZmluZSBHTlNTX05BVklHQVRJT05fTUVTU0FHRV9UWVBFX0dQU19MNUNOQVYgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9HTlNTX0w1Q05BVgorI2RlZmluZSBHTlNTX05BVklHQVRJT05fTUVTU0FHRV9UWVBFX0dQU19DTkFWMiBHTlNTX05BVklHQVRJT05fTUVTU0FHRV9UWVBFX0dOU1NfQ05BVjIKKyNkZWZpbmUgR1BTX0xPQ0FUSU9OX0hBU19BQ0NVUkFDWSBHUFNfTE9DQVRJT05fSEFTX0hPUklaT05UQUxfQUNDVVJBQ1kKKwogLyoqCiAgKiBUaGUgaWQgb2YgdGhpcyBtb2R1bGUKICAqLwpAQCAtMzksMTI3ICs3MywzNCBAQAogCiAvKiogTWF4aW11bSBudW1iZXIgb2YgU1ZzIGZvciBncHNfc3Zfc3RhdHVzX2NhbGxiYWNrKCkuICovCiAjZGVmaW5lIEdQU19NQVhfU1ZTIDMyCi0vKiogTWF4aW11bSBudW1iZXIgb2YgU1ZzIGZvciBncHNfc3Zfc3RhdHVzX2NhbGxiYWNrKCkuICovCi0jZGVmaW5lIEdOU1NfTUFYX1NWUyA2NAogCiAvKiogTWF4aW11bSBudW1iZXIgb2YgTWVhc3VyZW1lbnRzIGluIGdwc19tZWFzdXJlbWVudF9jYWxsYmFjaygpLiAqLwogI2RlZmluZSBHUFNfTUFYX01FQVNVUkVNRU5UICAgMzIKIAotLyoqIE1heGltdW0gbnVtYmVyIG9mIE1lYXN1cmVtZW50cyBpbiBnbnNzX21lYXN1cmVtZW50X2NhbGxiYWNrKCkuICovCi0jZGVmaW5lIEdOU1NfTUFYX01FQVNVUkVNRU5UICAgNjQKLQogLyoqIFJlcXVlc3RlZCBvcGVyYXRpb25hbCBtb2RlIGZvciBHUFMgb3BlcmF0aW9uLiAqLwogdHlwZWRlZiB1aW50MzJfdCBHcHNQb3NpdGlvbk1vZGU7Ci0vKiBJTVBPUlRBTlQ6IE5vdGUgdGhhdCB0aGUgZm9sbG93aW5nIHZhbHVlcyBtdXN0IG1hdGNoCi0gKiBjb25zdGFudHMgaW4gR3BzTG9jYXRpb25Qcm92aWRlci5qYXZhLiAqLwotLyoqIE1vZGUgZm9yIHJ1bm5pbmcgR1BTIHN0YW5kYWxvbmUgKG5vIGFzc2lzdGFuY2UpLiAqLwotI2RlZmluZSBHUFNfUE9TSVRJT05fTU9ERV9TVEFOREFMT05FICAgIDAKLS8qKiBBR1BTIE1TLUJhc2VkIG1vZGUuICovCi0jZGVmaW5lIEdQU19QT1NJVElPTl9NT0RFX01TX0JBU0VEICAgICAgMQotLyoqCi0gKiBBR1BTIE1TLUFzc2lzdGVkIG1vZGUuIFRoaXMgbW9kZSBpcyBub3QgbWFpbnRhaW5lZCBieSB0aGUgcGxhdGZvcm0gYW55bW9yZS4KLSAqIEl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIHVzZSBHUFNfUE9TSVRJT05fTU9ERV9NU19CQVNFRCBpbnN0ZWFkLgotICovCi0jZGVmaW5lIEdQU19QT1NJVElPTl9NT0RFX01TX0FTU0lTVEVEICAgMgogCiAvKiogUmVxdWVzdGVkIHJlY3VycmVuY2UgbW9kZSBmb3IgR1BTIG9wZXJhdGlvbi4gKi8KIHR5cGVkZWYgdWludDMyX3QgR3BzUG9zaXRpb25SZWN1cnJlbmNlOwotLyogSU1QT1JUQU5UOiBOb3RlIHRoYXQgdGhlIGZvbGxvd2luZyB2YWx1ZXMgbXVzdCBtYXRjaAotICogY29uc3RhbnRzIGluIEdwc0xvY2F0aW9uUHJvdmlkZXIuamF2YS4gKi8KLS8qKiBSZWNlaXZlIEdQUyBmaXhlcyBvbiBhIHJlY3VycmluZyBiYXNpcyBhdCBhIHNwZWNpZmllZCBwZXJpb2QuICovCi0jZGVmaW5lIEdQU19QT1NJVElPTl9SRUNVUlJFTkNFX1BFUklPRElDICAgIDAKLS8qKiBSZXF1ZXN0IGEgc2luZ2xlIHNob3QgR1BTIGZpeC4gKi8KLSNkZWZpbmUgR1BTX1BPU0lUSU9OX1JFQ1VSUkVOQ0VfU0lOR0xFICAgICAgMQogCiAvKiogR1BTIHN0YXR1cyBldmVudCB2YWx1ZXMuICovCiB0eXBlZGVmIHVpbnQxNl90IEdwc1N0YXR1c1ZhbHVlOwotLyogSU1QT1JUQU5UOiBOb3RlIHRoYXQgdGhlIGZvbGxvd2luZyB2YWx1ZXMgbXVzdCBtYXRjaAotICogY29uc3RhbnRzIGluIEdwc0xvY2F0aW9uUHJvdmlkZXIuamF2YS4gKi8KLS8qKiBHUFMgc3RhdHVzIHVua25vd24uICovCi0jZGVmaW5lIEdQU19TVEFUVVNfTk9ORSAgICAgICAgICAgICAwCi0vKiogR1BTIGhhcyBiZWd1biBuYXZpZ2F0aW5nLiAqLwotI2RlZmluZSBHUFNfU1RBVFVTX1NFU1NJT05fQkVHSU4gICAgMQotLyoqIEdQUyBoYXMgc3RvcHBlZCBuYXZpZ2F0aW5nLiAqLwotI2RlZmluZSBHUFNfU1RBVFVTX1NFU1NJT05fRU5EICAgICAgMgotLyoqIEdQUyBoYXMgcG93ZXJlZCBvbiBidXQgaXMgbm90IG5hdmlnYXRpbmcuICovCi0jZGVmaW5lIEdQU19TVEFUVVNfRU5HSU5FX09OICAgICAgICAzCi0vKiogR1BTIGlzIHBvd2VyZWQgb2ZmLiAqLwotI2RlZmluZSBHUFNfU1RBVFVTX0VOR0lORV9PRkYgICAgICAgNAogCiAvKiogRmxhZ3MgdG8gaW5kaWNhdGUgd2hpY2ggdmFsdWVzIGFyZSB2YWxpZCBpbiBhIEdwc0xvY2F0aW9uLiAqLwogdHlwZWRlZiB1aW50MTZfdCBHcHNMb2NhdGlvbkZsYWdzOwotLyogSU1QT1JUQU5UOiBOb3RlIHRoYXQgdGhlIGZvbGxvd2luZyB2YWx1ZXMgbXVzdCBtYXRjaAotICogY29uc3RhbnRzIGluIEdwc0xvY2F0aW9uUHJvdmlkZXIuamF2YS4gKi8KLS8qKiBHcHNMb2NhdGlvbiBoYXMgdmFsaWQgbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZS4gKi8KLSNkZWZpbmUgR1BTX0xPQ0FUSU9OX0hBU19MQVRfTE9ORyAgIDB4MDAwMQotLyoqIEdwc0xvY2F0aW9uIGhhcyB2YWxpZCBhbHRpdHVkZS4gKi8KLSNkZWZpbmUgR1BTX0xPQ0FUSU9OX0hBU19BTFRJVFVERSAgIDB4MDAwMgotLyoqIEdwc0xvY2F0aW9uIGhhcyB2YWxpZCBzcGVlZC4gKi8KLSNkZWZpbmUgR1BTX0xPQ0FUSU9OX0hBU19TUEVFRCAgICAgIDB4MDAwNAotLyoqIEdwc0xvY2F0aW9uIGhhcyB2YWxpZCBiZWFyaW5nLiAqLwotI2RlZmluZSBHUFNfTE9DQVRJT05fSEFTX0JFQVJJTkcgICAgMHgwMDA4Ci0vKiogR3BzTG9jYXRpb24gaGFzIHZhbGlkIGFjY3VyYWN5LiAqLwotI2RlZmluZSBHUFNfTE9DQVRJT05fSEFTX0FDQ1VSQUNZICAgMHgwMDEwCi0KLS8qKiBGbGFncyBmb3IgdGhlIGdwc19zZXRfY2FwYWJpbGl0aWVzIGNhbGxiYWNrLiAqLwotCi0vKioKLSAqIEdQUyBIQUwgc2NoZWR1bGVzIGZpeGVzIGZvciBHUFNfUE9TSVRJT05fUkVDVVJSRU5DRV9QRVJJT0RJQyBtb2RlLiBJZiB0aGlzIGlzCi0gKiBub3Qgc2V0LCB0aGVuIHRoZSBmcmFtZXdvcmsgd2lsbCB1c2UgMTAwMG1zIGZvciBtaW5faW50ZXJ2YWwgYW5kIHdpbGwgc3RhcnQKLSAqIGFuZCBjYWxsIHN0YXJ0KCkgYW5kIHN0b3AoKSB0byBzY2hlZHVsZSB0aGUgR1BTLgotICovCi0jZGVmaW5lIEdQU19DQVBBQklMSVRZX1NDSEVEVUxJTkcgICAgICAgKDEgPDwgMCkKLS8qKiBHUFMgc3VwcG9ydHMgTVMtQmFzZWQgQUdQUyBtb2RlICovCi0jZGVmaW5lIEdQU19DQVBBQklMSVRZX01TQiAgICAgICAgICAgICAgKDEgPDwgMSkKLS8qKiBHUFMgc3VwcG9ydHMgTVMtQXNzaXN0ZWQgQUdQUyBtb2RlICovCi0jZGVmaW5lIEdQU19DQVBBQklMSVRZX01TQSAgICAgICAgICAgICAgKDEgPDwgMikKLS8qKiBHUFMgc3VwcG9ydHMgc2luZ2xlLXNob3QgZml4ZXMgKi8KLSNkZWZpbmUgR1BTX0NBUEFCSUxJVFlfU0lOR0xFX1NIT1QgICAgICAoMSA8PCAzKQotLyoqIEdQUyBzdXBwb3J0cyBvbiBkZW1hbmQgdGltZSBpbmplY3Rpb24gKi8KLSNkZWZpbmUgR1BTX0NBUEFCSUxJVFlfT05fREVNQU5EX1RJTUUgICAoMSA8PCA0KQotLyoqIEdQUyBzdXBwb3J0cyBHZW9mZW5jaW5nICAqLwotI2RlZmluZSBHUFNfQ0FQQUJJTElUWV9HRU9GRU5DSU5HICAgICAgICgxIDw8IDUpCi0vKiogR1BTIHN1cHBvcnRzIE1lYXN1cmVtZW50cy4gKi8KLSNkZWZpbmUgR1BTX0NBUEFCSUxJVFlfTUVBU1VSRU1FTlRTICAgICAoMSA8PCA2KQotLyoqIEdQUyBzdXBwb3J0cyBOYXZpZ2F0aW9uIE1lc3NhZ2VzICovCi0jZGVmaW5lIEdQU19DQVBBQklMSVRZX05BVl9NRVNTQUdFUyAgICAgKDEgPDwgNykKIAogLyoqCiAgKiBGbGFncyB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggYWlkaW5nIGRhdGEgdG8gZGVsZXRlIHdoZW4gY2FsbGluZwogICogZGVsZXRlX2FpZGluZ19kYXRhKCkuCiAgKi8KIHR5cGVkZWYgdWludDE2X3QgR3BzQWlkaW5nRGF0YTsKLS8qIElNUE9SVEFOVDogTm90ZSB0aGF0IHRoZSBmb2xsb3dpbmcgdmFsdWVzIG11c3QgbWF0Y2gKLSAqIGNvbnN0YW50cyBpbiBHcHNMb2NhdGlvblByb3ZpZGVyLmphdmEuICovCi0jZGVmaW5lIEdQU19ERUxFVEVfRVBIRU1FUklTICAgICAgICAweDAwMDEKLSNkZWZpbmUgR1BTX0RFTEVURV9BTE1BTkFDICAgICAgICAgIDB4MDAwMgotI2RlZmluZSBHUFNfREVMRVRFX1BPU0lUSU9OICAgICAgICAgMHgwMDA0Ci0jZGVmaW5lIEdQU19ERUxFVEVfVElNRSAgICAgICAgICAgICAweDAwMDgKLSNkZWZpbmUgR1BTX0RFTEVURV9JT05PICAgICAgICAgICAgIDB4MDAxMAotI2RlZmluZSBHUFNfREVMRVRFX1VUQyAgICAgICAgICAgICAgMHgwMDIwCi0jZGVmaW5lIEdQU19ERUxFVEVfSEVBTFRIICAgICAgICAgICAweDAwNDAKLSNkZWZpbmUgR1BTX0RFTEVURV9TVkRJUiAgICAgICAgICAgIDB4MDA4MAotI2RlZmluZSBHUFNfREVMRVRFX1NWU1RFRVIgICAgICAgICAgMHgwMTAwCi0jZGVmaW5lIEdQU19ERUxFVEVfU0FEQVRBICAgICAgICAgICAweDAyMDAKLSNkZWZpbmUgR1BTX0RFTEVURV9SVEkgICAgICAgICAgICAgIDB4MDQwMAotI2RlZmluZSBHUFNfREVMRVRFX0NFTExEQl9JTkZPICAgICAgMHg4MDAwCi0jZGVmaW5lIEdQU19ERUxFVEVfQUxMICAgICAgICAgICAgICAweEZGRkYKIAogLyoqIEFHUFMgdHlwZSAqLwogdHlwZWRlZiB1aW50MTZfdCBBR3BzVHlwZTsKLSNkZWZpbmUgQUdQU19UWVBFX1NVUEwgICAgICAgICAgMQotI2RlZmluZSBBR1BTX1RZUEVfQzJLICAgICAgICAgICAyCiAKIHR5cGVkZWYgdWludDE2X3QgQUdwc1NldElEVHlwZTsKLSNkZWZpbmUgQUdQU19TRVRJRF9UWVBFX05PTkUgICAgMAotI2RlZmluZSBBR1BTX1NFVElEX1RZUEVfSU1TSSAgICAxCi0jZGVmaW5lIEFHUFNfU0VUSURfVFlQRV9NU0lTRE4gIDIKIAogdHlwZWRlZiB1aW50MTZfdCBBcG5JcFR5cGU7Ci0jZGVmaW5lIEFQTl9JUF9JTlZBTElEICAgICAgICAgIDAKLSNkZWZpbmUgQVBOX0lQX0lQVjQgICAgICAgICAgICAgMQotI2RlZmluZSBBUE5fSVBfSVBWNiAgICAgICAgICAgICAyCi0jZGVmaW5lIEFQTl9JUF9JUFY0VjYgICAgICAgICAgIDMKIAogLyoqCiAgKiBTdHJpbmcgbGVuZ3RoIGNvbnN0YW50cwpAQCAtMTcxLDcxICsxMTIsMzEgQEAKICAqIEdwc05pVHlwZSBjb25zdGFudHMKICAqLwogdHlwZWRlZiB1aW50MzJfdCBHcHNOaVR5cGU7Ci0jZGVmaW5lIEdQU19OSV9UWVBFX1ZPSUNFICAgICAgICAgICAgICAxCi0jZGVmaW5lIEdQU19OSV9UWVBFX1VNVFNfU1VQTCAgICAgICAgICAyCi0jZGVmaW5lIEdQU19OSV9UWVBFX1VNVFNfQ1RSTF9QTEFORSAgICAzCiAKIC8qKgogICogR3BzTmlOb3RpZnlGbGFncyBjb25zdGFudHMKICAqLwogdHlwZWRlZiB1aW50MzJfdCBHcHNOaU5vdGlmeUZsYWdzOwotLyoqIE5JIHJlcXVpcmVzIG5vdGlmaWNhdGlvbiAqLwotI2RlZmluZSBHUFNfTklfTkVFRF9OT1RJRlkgICAgICAgICAgMHgwMDAxCi0vKiogTkkgcmVxdWlyZXMgdmVyaWZpY2F0aW9uICovCi0jZGVmaW5lIEdQU19OSV9ORUVEX1ZFUklGWSAgICAgICAgICAweDAwMDIKLS8qKiBOSSByZXF1aXJlcyBwcml2YWN5IG92ZXJyaWRlLCBubyBub3RpZmljYXRpb24vbWluaW1hbCB0cmFjZSAqLwotI2RlZmluZSBHUFNfTklfUFJJVkFDWV9PVkVSUklERSAgICAgMHgwMDA0CiAKIC8qKgogICogR1BTIE5JIHJlc3BvbnNlcywgdXNlZCB0byBkZWZpbmUgdGhlIHJlc3BvbnNlIGluCiAgKiBOSSBzdHJ1Y3R1cmVzCiAgKi8KIHR5cGVkZWYgaW50IEdwc1VzZXJSZXNwb25zZVR5cGU7Ci0jZGVmaW5lIEdQU19OSV9SRVNQT05TRV9BQ0NFUFQgICAgICAgICAxCi0jZGVmaW5lIEdQU19OSV9SRVNQT05TRV9ERU5ZICAgICAgICAgICAyCi0jZGVmaW5lIEdQU19OSV9SRVNQT05TRV9OT1JFU1AgICAgICAgICAzCiAKIC8qKgogICogTkkgZGF0YSBlbmNvZGluZyBzY2hlbWUKICAqLwogdHlwZWRlZiBpbnQgR3BzTmlFbmNvZGluZ1R5cGU7Ci0jZGVmaW5lIEdQU19FTkNfTk9ORSAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEdQU19FTkNfU1VQTF9HU01fREVGQVVMVCAgICAgICAxCi0jZGVmaW5lIEdQU19FTkNfU1VQTF9VVEY4ICAgICAgICAgICAgICAyCi0jZGVmaW5lIEdQU19FTkNfU1VQTF9VQ1MyICAgICAgICAgICAgICAzCi0jZGVmaW5lIEdQU19FTkNfVU5LTk9XTiAgICAgICAgICAgICAgICAtMQogCiAvKiogQUdQUyBzdGF0dXMgZXZlbnQgdmFsdWVzLiAqLwogdHlwZWRlZiB1aW50MTZfdCBBR3BzU3RhdHVzVmFsdWU7Ci0vKiogR1BTIHJlcXVlc3RzIGRhdGEgY29ubmVjdGlvbiBmb3IgQUdQUy4gKi8KLSNkZWZpbmUgR1BTX1JFUVVFU1RfQUdQU19EQVRBX0NPTk4gIDEKLS8qKiBHUFMgcmVsZWFzZXMgdGhlIEFHUFMgZGF0YSBjb25uZWN0aW9uLiAqLwotI2RlZmluZSBHUFNfUkVMRUFTRV9BR1BTX0RBVEFfQ09OTiAgMgotLyoqIEFHUFMgZGF0YSBjb25uZWN0aW9uIGluaXRpYXRlZCAqLwotI2RlZmluZSBHUFNfQUdQU19EQVRBX0NPTk5FQ1RFRCAgICAgMwotLyoqIEFHUFMgZGF0YSBjb25uZWN0aW9uIGNvbXBsZXRlZCAqLwotI2RlZmluZSBHUFNfQUdQU19EQVRBX0NPTk5fRE9ORSAgICAgNAotLyoqIEFHUFMgZGF0YSBjb25uZWN0aW9uIGZhaWxlZCAqLwotI2RlZmluZSBHUFNfQUdQU19EQVRBX0NPTk5fRkFJTEVEICAgNQogCiB0eXBlZGVmIHVpbnQxNl90IEFHcHNSZWZMb2NhdGlvblR5cGU7Ci0jZGVmaW5lIEFHUFNfUkVGX0xPQ0FUSU9OX1RZUEVfR1NNX0NFTExJRCAgIDEKLSNkZWZpbmUgQUdQU19SRUZfTE9DQVRJT05fVFlQRV9VTVRTX0NFTExJRCAgMgotI2RlZmluZSBBR1BTX1JFRl9MT0NBVElPTl9UWVBFX01BQyAgICAgICAgICAzCi0jZGVmaW5lIEFHUFNfUkVGX0xPQ0FUSU9OX1RZUEVfTFRFX0NFTExJRCAgIDQKIAogLyogRGVwcmVjYXRlZCwgdG8gYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBBbmRyb2lkIHJlbGVhc2UuICovCiAjZGVmaW5lIEFHUFNfUkVHX0xPQ0FUSU9OX1RZUEVfTUFDICAgICAgICAgIDMKIAotLyoqIE5ldHdvcmsgdHlwZXMgZm9yIHVwZGF0ZV9uZXR3b3JrX3N0YXRlICJ0eXBlIiBwYXJhbWV0ZXIgKi8KLSNkZWZpbmUgQUdQU19SSUxfTkVUV09SS19UWVBFX01PQklMRSAgICAgICAgMAotI2RlZmluZSBBR1BTX1JJTF9ORVRXT1JLX1RZUEVfV0lGSSAgICAgICAgICAxCi0jZGVmaW5lIEFHUFNfUklMX05FVFdPUktfVFlQRV9NT0JJTEVfTU1TICAgIDIKLSNkZWZpbmUgQUdQU19SSUxfTkVUV09SS19UWVBFX01PQklMRV9TVVBMICAgMwotI2RlZmluZSBBR1BTX1JJTF9ORVRXT1JLX1RUWVBFX01PQklMRV9EVU4gICA0Ci0jZGVmaW5lIEFHUFNfUklMX05FVFdPUktfVFRZUEVfTU9CSUxFX0hJUFJJIDUKLSNkZWZpbmUgQUdQU19SSUxfTkVUV09SS19UVFlQRV9XSU1BWCAgICAgICAgNgotCiAvKiBUaGUgZm9sbG93aW5nIHR5cGVkZWYgdG9nZXRoZXIgd2l0aCBpdHMgY29uc3RhbnRzIGJlbG93IGFyZSBkZXByZWNhdGVkLCBhbmQKICAqIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCByZWxlYXNlLiAqLwogdHlwZWRlZiB1aW50MTZfdCBHcHNDbG9ja0ZsYWdzOwpAQCAtMjUxLDIwICsxNTIsNiBAQAogICogRmxhZ3MgdG8gaW5kaWNhdGUgd2hhdCBmaWVsZHMgaW4gR25zc0Nsb2NrIGFyZSB2YWxpZC4KICAqLwogdHlwZWRlZiB1aW50MTZfdCBHbnNzQ2xvY2tGbGFnczsKLS8qKiBBIHZhbGlkICdsZWFwIHNlY29uZCcgaXMgc3RvcmVkIGluIHRoZSBkYXRhIHN0cnVjdHVyZS4gKi8KLSNkZWZpbmUgR05TU19DTE9DS19IQVNfTEVBUF9TRUNPTkQgICAgICAgICAgICAgICAoMTw8MCkKLS8qKiBBIHZhbGlkICd0aW1lIHVuY2VydGFpbnR5JyBpcyBzdG9yZWQgaW4gdGhlIGRhdGEgc3RydWN0dXJlLiAqLwotI2RlZmluZSBHTlNTX0NMT0NLX0hBU19USU1FX1VOQ0VSVEFJTlRZICAgICAgICAgICgxPDwxKQotLyoqIEEgdmFsaWQgJ2Z1bGwgYmlhcycgaXMgc3RvcmVkIGluIHRoZSBkYXRhIHN0cnVjdHVyZS4gKi8KLSNkZWZpbmUgR05TU19DTE9DS19IQVNfRlVMTF9CSUFTICAgICAgICAgICAgICAgICAoMTw8MikKLS8qKiBBIHZhbGlkICdiaWFzJyBpcyBzdG9yZWQgaW4gdGhlIGRhdGEgc3RydWN0dXJlLiAqLwotI2RlZmluZSBHTlNTX0NMT0NLX0hBU19CSUFTICAgICAgICAgICAgICAgICAgICAgICgxPDwzKQotLyoqIEEgdmFsaWQgJ2JpYXMgdW5jZXJ0YWludHknIGlzIHN0b3JlZCBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmUuICovCi0jZGVmaW5lIEdOU1NfQ0xPQ0tfSEFTX0JJQVNfVU5DRVJUQUlOVFkgICAgICAgICAgKDE8PDQpCi0vKiogQSB2YWxpZCAnZHJpZnQnIGlzIHN0b3JlZCBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmUuICovCi0jZGVmaW5lIEdOU1NfQ0xPQ0tfSEFTX0RSSUZUICAgICAgICAgICAgICAgICAgICAgKDE8PDUpCi0vKiogQSB2YWxpZCAnZHJpZnQgdW5jZXJ0YWludHknIGlzIHN0b3JlZCBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmUuICovCi0jZGVmaW5lIEdOU1NfQ0xPQ0tfSEFTX0RSSUZUX1VOQ0VSVEFJTlRZICAgICAgICAgKDE8PDYpCiAKIC8qIFRoZSBmb2xsb3dpbmcgdHlwZWRlZiB0b2dldGhlciB3aXRoIGl0cyBjb25zdGFudHMgYmVsb3cgYXJlIGRlcHJlY2F0ZWQsIGFuZAogICogd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IHJlbGVhc2UuICovCkBAIC0zMDAsMTYgKzE4Nyw2IEBACiAgKiBGbGFncyB0byBpbmRpY2F0ZSB3aGF0IGZpZWxkcyBpbiBHbnNzTWVhc3VyZW1lbnQgYXJlIHZhbGlkLgogICovCiB0eXBlZGVmIHVpbnQzMl90IEduc3NNZWFzdXJlbWVudEZsYWdzOwotLyoqIEEgdmFsaWQgJ3NucicgaXMgc3RvcmVkIGluIHRoZSBkYXRhIHN0cnVjdHVyZS4gKi8KLSNkZWZpbmUgR05TU19NRUFTVVJFTUVOVF9IQVNfU05SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDwwKQotLyoqIEEgdmFsaWQgJ2NhcnJpZXIgZnJlcXVlbmN5JyBpcyBzdG9yZWQgaW4gdGhlIGRhdGEgc3RydWN0dXJlLiAqLwotI2RlZmluZSBHTlNTX01FQVNVUkVNRU5UX0hBU19DQVJSSUVSX0ZSRVFVRU5DWSAgICAgICAgICAgICAgICAgKDE8PDkpCi0vKiogQSB2YWxpZCAnY2FycmllciBjeWNsZXMnIGlzIHN0b3JlZCBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmUuICovCi0jZGVmaW5lIEdOU1NfTUVBU1VSRU1FTlRfSEFTX0NBUlJJRVJfQ1lDTEVTICAgICAgICAgICAgICAgICAgICAoMTw8MTApCi0vKiogQSB2YWxpZCAnY2FycmllciBwaGFzZScgaXMgc3RvcmVkIGluIHRoZSBkYXRhIHN0cnVjdHVyZS4gKi8KLSNkZWZpbmUgR05TU19NRUFTVVJFTUVOVF9IQVNfQ0FSUklFUl9QSEFTRSAgICAgICAgICAgICAgICAgICAgICgxPDwxMSkKLS8qKiBBIHZhbGlkICdjYXJyaWVyIHBoYXNlIHVuY2VydGFpbnR5JyBpcyBzdG9yZWQgaW4gdGhlIGRhdGEgc3RydWN0dXJlLiAqLwotI2RlZmluZSBHTlNTX01FQVNVUkVNRU5UX0hBU19DQVJSSUVSX1BIQVNFX1VOQ0VSVEFJTlRZICAgICAgICAgKDE8PDEyKQogCiAvKiBUaGUgZm9sbG93aW5nIHR5cGVkZWYgdG9nZXRoZXIgd2l0aCBpdHMgY29uc3RhbnRzIGJlbG93IGFyZSBkZXByZWNhdGVkLCBhbmQKICAqIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCByZWxlYXNlLiAqLwpAQCAtMzMxLDEyICsyMDgsNiBAQAogICogaW5kaWNhdG9yLgogICovCiB0eXBlZGVmIHVpbnQ4X3QgR25zc011bHRpcGF0aEluZGljYXRvcjsKLS8qKiBUaGUgaW5kaWNhdG9yIGlzIG5vdCBhdmFpbGFibGUgb3IgdW5rbm93bi4gKi8KLSNkZWZpbmUgR05TU19NVUxUSVBBVEhfSU5ESUNBVE9SX1VOS05PV04gICAgICAgICAgICAgICAgIDAKLS8qKiBUaGUgbWVhc3VyZW1lbnQgaXMgaW5kaWNhdGVkIHRvIGJlIGFmZmVjdGVkIGJ5IG11bHRpcGF0aC4gKi8KLSNkZWZpbmUgR05TU19NVUxUSVBBVEhfSU5ESUNBVE9SX1BSRVNFTlQgICAgICAgICAgICAgICAgIDEKLS8qKiBUaGUgbWVhc3VyZW1lbnQgaXMgaW5kaWNhdGVkIHRvIGJlIG5vdCBhZmZlY3RlZCBieSBtdWx0aXBhdGguICovCi0jZGVmaW5lIEdOU1NfTVVMVElQQVRIX0lORElDQVRPUl9OT1RfUFJFU0VOVCAgICAgICAgICAgICAyCiAKIC8qIFRoZSBmb2xsb3dpbmcgdHlwZWRlZiB0b2dldGhlciB3aXRoIGl0cyBjb25zdGFudHMgYmVsb3cgYXJlIGRlcHJlY2F0ZWQsIGFuZAogICogd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IHJlbGVhc2UuICovCkBAIC0zNjMsMjEgKzIzNCw2IEBACiAgKiBzZXQgdG8gR05TU19NRUFTVVJFTUVOVF9TVEFURV9VTktOT1dOKDApLgogICovCiB0eXBlZGVmIHVpbnQzMl90IEduc3NNZWFzdXJlbWVudFN0YXRlOwotI2RlZmluZSBHTlNTX01FQVNVUkVNRU5UX1NUQVRFX1VOS05PV04gICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBHTlNTX01FQVNVUkVNRU5UX1NUQVRFX0NPREVfTE9DSyAgICAgICAgICAgICAoMTw8MCkKLSNkZWZpbmUgR05TU19NRUFTVVJFTUVOVF9TVEFURV9CSVRfU1lOQyAgICAgICAgICAgICAgKDE8PDEpCi0jZGVmaW5lIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfU1VCRlJBTUVfU1lOQyAgICAgICAgICgxPDwyKQotI2RlZmluZSBHTlNTX01FQVNVUkVNRU5UX1NUQVRFX1RPV19ERUNPREVEICAgICAgICAgICAoMTw8MykKLSNkZWZpbmUgR05TU19NRUFTVVJFTUVOVF9TVEFURV9NU0VDX0FNQklHVU9VUyAgICAgICAgKDE8PDQpCi0jZGVmaW5lIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfU1lNQk9MX1NZTkMgICAgICAgICAgICgxPDw1KQotI2RlZmluZSBHTlNTX01FQVNVUkVNRU5UX1NUQVRFX0dMT19TVFJJTkdfU1lOQyAgICAgICAoMTw8NikKLSNkZWZpbmUgR05TU19NRUFTVVJFTUVOVF9TVEFURV9HTE9fVE9EX0RFQ09ERUQgICAgICAgKDE8PDcpCi0jZGVmaW5lIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfQkRTX0QyX0JJVF9TWU5DICAgICAgICgxPDw4KQotI2RlZmluZSBHTlNTX01FQVNVUkVNRU5UX1NUQVRFX0JEU19EMl9TVUJGUkFNRV9TWU5DICAoMTw8OSkKLSNkZWZpbmUgR05TU19NRUFTVVJFTUVOVF9TVEFURV9HQUxfRTFCQ19DT0RFX0xPQ0sgICAgKDE8PDEwKQotI2RlZmluZSBHTlNTX01FQVNVUkVNRU5UX1NUQVRFX0dBTF9FMUNfMk5EX0NPREVfTE9DSyAoMTw8MTEpCi0jZGVmaW5lIEdOU1NfTUVBU1VSRU1FTlRfU1RBVEVfR0FMX0UxQl9QQUdFX1NZTkMgICAgICgxPDwxMikKLSNkZWZpbmUgR05TU19NRUFTVVJFTUVOVF9TVEFURV9TQkFTX1NZTkMgICAgICAgICAgICAgKDE8PDEzKQogCiAvKiBUaGUgZm9sbG93aW5nIHR5cGVkZWYgdG9nZXRoZXIgd2l0aCBpdHMgY29uc3RhbnRzIGJlbG93IGFyZSBkZXByZWNhdGVkLCBhbmQKICAqIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCByZWxlYXNlLiAqLwpAQCAtMzkxLDEwICsyNDcsNiBAQAogICogRmxhZ3MgaW5kaWNhdGluZyB0aGUgQWNjdW11bGF0ZWQgRGVsdGEgUmFuZ2UncyBzdGF0ZXMuCiAgKi8KIHR5cGVkZWYgdWludDE2X3QgR25zc0FjY3VtdWxhdGVkRGVsdGFSYW5nZVN0YXRlOwotI2RlZmluZSBHTlNTX0FEUl9TVEFURV9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEdOU1NfQURSX1NUQVRFX1ZBTElEICAgICAgICAgICAgICAgICAgICAgKDE8PDApCi0jZGVmaW5lIEdOU1NfQURSX1NUQVRFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgKDE8PDEpCi0jZGVmaW5lIEdOU1NfQURSX1NUQVRFX0NZQ0xFX1NMSVAgICAgICAgICAgICAgICAgKDE8PDIpCiAKIC8qIFRoZSBmb2xsb3dpbmcgdHlwZWRlZiB0b2dldGhlciB3aXRoIGl0cyBjb25zdGFudHMgYmVsb3cgYXJlIGRlcHJlY2F0ZWQsIGFuZAogICogd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IHJlbGVhc2UuICovCkBAIC00MTQsMjYgKzI2Niw2IEBACiAgKi8KIHR5cGVkZWYgaW50MTZfdCBHbnNzTmF2aWdhdGlvbk1lc3NhZ2VUeXBlOwogCi0jZGVmaW5lIEdOU1NfTkFWSUdBVElPTl9NRVNTQUdFX1RZUEVfVU5LTk9XTiAgICAgICAwCi0vKiogR1BTIEwxIEMvQSBtZXNzYWdlIGNvbnRhaW5lZCBpbiB0aGUgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9HUFNfTDFDQSAgICAgIDB4MDEwMQotLyoqIEdQUyBMMi1DTkFWIG1lc3NhZ2UgY29udGFpbmVkIGluIHRoZSBzdHJ1Y3R1cmUuICovCi0jZGVmaW5lIEdOU1NfTkFWSUdBVElPTl9NRVNTQUdFX1RZUEVfR1BTX0wyQ05BViAgICAweDAxMDIKLS8qKiBHUFMgTDUtQ05BViBtZXNzYWdlIGNvbnRhaW5lZCBpbiB0aGUgc3RydWN0dXJlLiAqLwotI2RlZmluZSBHTlNTX05BVklHQVRJT05fTUVTU0FHRV9UWVBFX0dQU19MNUNOQVYgICAgMHgwMTAzCi0vKiogR1BTIENOQVYtMiBtZXNzYWdlIGNvbnRhaW5lZCBpbiB0aGUgc3RydWN0dXJlLiAqLwotI2RlZmluZSBHTlNTX05BVklHQVRJT05fTUVTU0FHRV9UWVBFX0dQU19DTkFWMiAgICAgMHgwMTA0Ci0vKiogR2xvbmFzcyBMMSBDQSBtZXNzYWdlIGNvbnRhaW5lZCBpbiB0aGUgc3RydWN0dXJlLiAqLwotI2RlZmluZSBHTlNTX05BVklHQVRJT05fTUVTU0FHRV9UWVBFX0dMT19MMUNBICAgICAgMHgwMzAxCi0vKiogQmVpZG91IEQxIG1lc3NhZ2UgY29udGFpbmVkIGluIHRoZSBzdHJ1Y3R1cmUuICovCi0jZGVmaW5lIEdOU1NfTkFWSUdBVElPTl9NRVNTQUdFX1RZUEVfQkRTX0QxICAgICAgICAweDA1MDEKLS8qKiBCZWlkb3UgRDIgbWVzc2FnZSBjb250YWluZWQgaW4gdGhlIHN0cnVjdHVyZS4gKi8KLSNkZWZpbmUgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9CRFNfRDIgICAgICAgIDB4MDUwMgotLyoqIEdhbGlsZW8gSS9OQVYgbWVzc2FnZSBjb250YWluZWQgaW4gdGhlIHN0cnVjdHVyZS4gKi8KLSNkZWZpbmUgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9HQUxfSSAgICAgICAgIDB4MDYwMQotLyoqIEdhbGlsZW8gRi9OQVYgbWVzc2FnZSBjb250YWluZWQgaW4gdGhlIHN0cnVjdHVyZS4gKi8KLSNkZWZpbmUgR05TU19OQVZJR0FUSU9OX01FU1NBR0VfVFlQRV9HQUxfRiAgICAgICAgIDB4MDYwMgotCiAvKioKICAqIFN0YXR1cyBvZiBOYXZpZ2F0aW9uIE1lc3NhZ2UKICAqIFdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkIHByb3Blcmx5IHdpdGhvdXQgYW55IHBhcml0eSBlcnJvciBpbiBpdHMgbmF2aWdhdGlvbiB3b3JkcywgdGhlCkBAIC00NDQsOSArMjc2LDYgQEAKICAqIGNvcnJlY3RlZC4KICAqLwogdHlwZWRlZiB1aW50MTZfdCBOYXZpZ2F0aW9uTWVzc2FnZVN0YXR1czsKLSNkZWZpbmUgTkFWX01FU1NBR0VfU1RBVFVTX1VOS05PV04gICAgICAgICAgICAgIDAKLSNkZWZpbmUgTkFWX01FU1NBR0VfU1RBVFVTX1BBUklUWV9QQVNTRUQgICAoMTw8MCkKLSNkZWZpbmUgTkFWX01FU1NBR0VfU1RBVFVTX1BBUklUWV9SRUJVSUxUICAoMTw8MSkKIAogLyogVGhpcyBjb25zdGFudCBpcyBkZXByZWNhdGVkLCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IHJlbGVhc2UuICovCiAjZGVmaW5lIE5BVl9NRVNTQUdFX1NUQVRVU19VTktPTlcgICAgICAgICAgICAgIDAKQEAgLTQ1NSwyMiArMjg0LDExIEBACiAgKiBGbGFncyB0aGF0IGluZGljYXRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzYXRlbGxpdGUKICAqLwogdHlwZWRlZiB1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR25zc1N2RmxhZ3M7Ci0jZGVmaW5lIEdOU1NfU1ZfRkxBR1NfTk9ORSAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEdOU1NfU1ZfRkxBR1NfSEFTX0VQSEVNRVJJU19EQVRBICAgICAgICAoMSA8PCAwKQotI2RlZmluZSBHTlNTX1NWX0ZMQUdTX0hBU19BTE1BTkFDX0RBVEEgICAgICAgICAgKDEgPDwgMSkKLSNkZWZpbmUgR05TU19TVl9GTEFHU19VU0VEX0lOX0ZJWCAgICAgICAgICAgICAgICgxIDw8IDIpCiAKIC8qKgogICogQ29uc3RlbGxhdGlvbiB0eXBlIG9mIEduc3NTdkluZm8KICAqLwogdHlwZWRlZiB1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICAgIEduc3NDb25zdGVsbGF0aW9uVHlwZTsKLSNkZWZpbmUgR05TU19DT05TVEVMTEFUSU9OX1VOS05PV04gICAgICAwCi0jZGVmaW5lIEdOU1NfQ09OU1RFTExBVElPTl9HUFMgICAgICAgICAgMQotI2RlZmluZSBHTlNTX0NPTlNURUxMQVRJT05fU0JBUyAgICAgICAgIDIKLSNkZWZpbmUgR05TU19DT05TVEVMTEFUSU9OX0dMT05BU1MgICAgICAzCi0jZGVmaW5lIEdOU1NfQ09OU1RFTExBVElPTl9RWlNTICAgICAgICAgNAotI2RlZmluZSBHTlNTX0NPTlNURUxMQVRJT05fQkVJRE9VICAgICAgIDUKLSNkZWZpbmUgR05TU19DT05TVEVMTEFUSU9OX0dBTElMRU8gICAgICA2CiAKIC8qKgogICogTmFtZSBmb3IgdGhlIEdQUyBYVFJBIGludGVyZmFjZS4KQEAgLTUyMiw3ICszNDAsNiBAQAogICovCiAjZGVmaW5lIEdOU1NfQ09ORklHVVJBVElPTl9JTlRFUkZBQ0UgICAgICJnbnNzX2NvbmZpZ3VyYXRpb24iCiAKLQogLyoqIFJlcHJlc2VudHMgYSBsb2NhdGlvbi4gKi8KIHR5cGVkZWYgc3RydWN0IHsKICAgICAvKiogc2V0IHRvIHNpemVvZihHcHNMb2NhdGlvbikgKi8KQEAgLTExMjYsOSArOTQzLDYgQEAKICAgICBjb25zdCBHcHNJbnRlcmZhY2UqICgqZ2V0X2dwc19pbnRlcmZhY2UpKHN0cnVjdCBncHNfZGV2aWNlX3QqIGRldik7CiB9OwogCi0jZGVmaW5lIEFHUFNfUklMX1JFUVVFU1RfU0VUSURfSU1TSSAgICAgKDE8PDBMKQotI2RlZmluZSBBR1BTX1JJTF9SRVFVRVNUX1NFVElEX01TSVNETiAgICgxPDwxTCkKLQogI2RlZmluZSBBR1BTX1JJTF9SRVFVRVNUX1JFRkxPQ19DRUxMSUQgICgxPDwwTCkKICNkZWZpbmUgQUdQU19SSUxfUkVRVUVTVF9SRUZMT0NfTUFDICAgICAoMTw8MUwpCiAKQEAgLTEyNTEsMTkgKzEwNjUsNiBAQAogICogc3Vic3lzdGVtIGtub3dzIGFib3V0IHRoZSBHZW9mZW5jZS4KICAqCiAgKi8KLSNkZWZpbmUgR1BTX0dFT0ZFTkNFX0VOVEVSRUQgICAgICgxPDwwTCkKLSNkZWZpbmUgR1BTX0dFT0ZFTkNFX0VYSVRFRCAgICAgICgxPDwxTCkKLSNkZWZpbmUgR1BTX0dFT0ZFTkNFX1VOQ0VSVEFJTiAgICgxPDwyTCkKLQotI2RlZmluZSBHUFNfR0VPRkVOQ0VfVU5BVkFJTEFCTEUgKDE8PDBMKQotI2RlZmluZSBHUFNfR0VPRkVOQ0VfQVZBSUxBQkxFICAgKDE8PDFMKQotCi0jZGVmaW5lIEdQU19HRU9GRU5DRV9PUEVSQVRJT05fU1VDQ0VTUyAgICAgICAgICAgMAotI2RlZmluZSBHUFNfR0VPRkVOQ0VfRVJST1JfVE9PX01BTllfR0VPRkVOQ0VTIC0xMDAKLSNkZWZpbmUgR1BTX0dFT0ZFTkNFX0VSUk9SX0lEX0VYSVNUUyAgICAgICAgICAtMTAxCi0jZGVmaW5lIEdQU19HRU9GRU5DRV9FUlJPUl9JRF9VTktOT1dOICAgICAgICAgLTEwMgotI2RlZmluZSBHUFNfR0VPRkVOQ0VfRVJST1JfSU5WQUxJRF9UUkFOU0lUSU9OIC0xMDMKLSNkZWZpbmUgR1BTX0dFT0ZFTkNFX0VSUk9SX0dFTkVSSUMgICAgICAgICAgICAtMTQ5CiAKIC8qKgogICogVGhlIGNhbGxiYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2VvZmVuY2UuCkBAIC0xOTcyLDEwICsxNzczLDYgQEAKICAgICBnbnNzX21lYXN1cmVtZW50X2NhbGxiYWNrIGduc3NfbWVhc3VyZW1lbnRfY2FsbGJhY2s7CiB9IEdwc01lYXN1cmVtZW50Q2FsbGJhY2tzOwogCi0jZGVmaW5lIEdQU19NRUFTVVJFTUVOVF9PUEVSQVRJT05fU1VDQ0VTUyAgICAgICAgICAwCi0jZGVmaW5lIEdQU19NRUFTVVJFTUVOVF9FUlJPUl9BTFJFQURZX0lOSVQgICAgICAtMTAwCi0jZGVmaW5lIEdQU19NRUFTVVJFTUVOVF9FUlJPUl9HRU5FUklDICAgICAgICAgICAtMTAxCi0KIC8qKgogICogRXh0ZW5kZWQgaW50ZXJmYWNlIGZvciBHUFMgTWVhc3VyZW1lbnRzIHN1cHBvcnQuCiAgKi8KQEAgLTIxNDcsMTAgKzE5NDQsNiBAQAogICAgIGduc3NfbmF2aWdhdGlvbl9tZXNzYWdlX2NhbGxiYWNrIGduc3NfbmF2aWdhdGlvbl9tZXNzYWdlX2NhbGxiYWNrOwogfSBHcHNOYXZpZ2F0aW9uTWVzc2FnZUNhbGxiYWNrczsKIAotI2RlZmluZSBHUFNfTkFWSUdBVElPTl9NRVNTQUdFX09QRVJBVElPTl9TVUNDRVNTICAgICAgICAgICAgIDAKLSNkZWZpbmUgR1BTX05BVklHQVRJT05fTUVTU0FHRV9FUlJPUl9BTFJFQURZX0lOSVQgICAgICAgICAtMTAwCi0jZGVmaW5lIEdQU19OQVZJR0FUSU9OX01FU1NBR0VfRVJST1JfR0VORVJJQyAgICAgICAgICAgICAgLTEwMQotCiAvKioKICAqIEV4dGVuZGVkIGludGVyZmFjZSBmb3IgR1BTIG5hdmlnYXRpb24gbWVzc2FnZSByZXBvcnRpbmcgc3VwcG9ydC4KICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS9ncmFsbG9jMS5oIGIvaW5jbHVkZS9oYXJkd2FyZS9ncmFsbG9jMS5oCmluZGV4IGExYTJkNjkuLjQ4NDUwMTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvZ3JhbGxvYzEuaAorKysgYi9pbmNsdWRlL2hhcmR3YXJlL2dyYWxsb2MxLmgKQEAgLTM2LDcgKzM2LDE5IEBACiAgICAgICogYWxsb2NhdGUgbWF5IGJlIE5VTEwsIHdoaWNoIGluc3RydWN0cyB0aGUgZGV2aWNlIHRvIHJlcG9ydCB3aGV0aGVyIHRoZQogICAgICAqIGdpdmVuIGFsbG9jYXRpb24gaXMgcG9zc2libGUgb3Igbm90LiAqLwogICAgIEdSQUxMT0MxX0NBUEFCSUxJVFlfVEVTVF9BTExPQ0FURSA9IDEsCi0gICAgR1JBTExPQzFfTEFTVF9DQVBBQklMSVRZID0gMSwKKworICAgIC8qIElmIHRoaXMgY2FwYWJpbGl0eSBpcyBzdXBwb3J0ZWQsIHRoZW4gdGhlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzCisgICAgICogYWxsb2NhdGluZyBidWZmZXJzIHdpdGggbW9yZSB0aGFuIG9uZSBpbWFnZSBsYXllci4gKi8KKyAgICBHUkFMTE9DMV9DQVBBQklMSVRZX0xBWUVSRURfQlVGRkVSUyA9IDIsCisKKyAgICAvKiBJZiB0aGlzIGNhcGFiaWxpdHkgaXMgc3VwcG9ydGVkLCB0aGVuIHRoZSBpbXBsZW1lbnRhdGlvbiBhbHdheXMgY2xvc2VzCisgICAgICogYW5kIGRlbGV0ZXMgYSBidWZmZXIgaGFuZGxlIHdoZW5ldmVyIHRoZSBsYXN0IHJlZmVyZW5jZSBpcyByZW1vdmVkLgorICAgICAqCisgICAgICogU3VwcG9ydGluZyB0aGlzIGNhcGFiaWxpdHkgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQuICBJdCB3aWxsIGJlY29tZQorICAgICAqIG1hbmRhdG9yeSBpbiBmdXR1cmUgcmVsZWFzZXMuICovCisgICAgR1JBTExPQzFfQ0FQQUJJTElUWV9SRUxFQVNFX0lNUExZX0RFTEVURSA9IDMsCisKKyAgICBHUkFMTE9DMV9MQVNUX0NBUEFCSUxJVFkgPSAzLAogfSBncmFsbG9jMV9jYXBhYmlsaXR5X3Q7CiAKIHR5cGVkZWYgZW51bSB7CkBAIC03MSw3ICs4Myw3IEBACiAgICAgR1JBTExPQzFfQ09OU1VNRVJfVVNBR0VfRk9SRUlHTl9CVUZGRVJTID0gMVVMTCA8PCAyMSwKIAogICAgIC8qIDFVTEwgPDwgMjIgKi8KLSAgICAvKiAxVUxMIDw8IDIzICovCisgICAgR1JBTExPQzFfQ09OU1VNRVJfVVNBR0VfR1BVX0RBVEFfQlVGRkVSID0gMVVMTCA8PCAyMywKICAgICAvKiAxVUxMIDw8IDI0ICovCiAgICAgLyogMVVMTCA8PCAyNSAqLwogICAgIC8qIDFVTEwgPDwgMjYgKi8KQEAgLTE0MSw3ICsxNTMsOSBAQAogICAgIEdSQUxMT0MxX0ZVTkNUSU9OX0xPQ0sgPSAxOCwKICAgICBHUkFMTE9DMV9GVU5DVElPTl9MT0NLX0ZMRVggPSAxOSwKICAgICBHUkFMTE9DMV9GVU5DVElPTl9VTkxPQ0sgPSAyMCwKLSAgICBHUkFMTE9DMV9MQVNUX0ZVTkNUSU9OID0gMjAsCisgICAgR1JBTExPQzFfRlVOQ1RJT05fU0VUX0xBWUVSX0NPVU5UID0gMjEsCisgICAgR1JBTExPQzFfRlVOQ1RJT05fR0VUX0xBWUVSX0NPVU5UID0gMjIsCisgICAgR1JBTExPQzFfTEFTVF9GVU5DVElPTiA9IDIyLAogfSBncmFsbG9jMV9mdW5jdGlvbl9kZXNjcmlwdG9yX3Q7CiAKIHR5cGVkZWYgZW51bSB7CkBAIC0xODgsNyArMjAyLDcgQEAKICAgICAvKiAxVUxMIDw8IDIwICovCiAgICAgLyogMVVMTCA8PCAyMSAqLwogICAgIEdSQUxMT0MxX1BST0RVQ0VSX1VTQUdFX1ZJREVPX0RFQ09ERVIgPSAxVUxMIDw8IDIyLAotICAgIC8qIDFVTEwgPDwgMjMgKi8KKyAgICBHUkFMTE9DMV9QUk9EVUNFUl9VU0FHRV9TRU5TT1JfRElSRUNUX0RBVEEgPSAxVUxMIDw8IDIzLAogICAgIC8qIDFVTEwgPDwgMjQgKi8KICAgICAvKiAxVUxMIDw8IDI1ICovCiAgICAgLyogMVVMTCA8PCAyNiAqLwpAQCAtNDQwLDYgKzQ1NCwzMCBAQAogICAgICAgICBncmFsbG9jMV9kZXZpY2VfdCogZGV2aWNlLCBncmFsbG9jMV9idWZmZXJfZGVzY3JpcHRvcl90IGRlc2NyaXB0b3IsCiAgICAgICAgIGludDMyX3QgLyphbmRyb2lkX3BpeGVsX2Zvcm1hdF90Ki8gZm9ybWF0KTsKIAorLyogc2V0TGF5ZXJDb3VudCguLi4sIGxheWVyQ291bnQpCisgKiBGdW5jdGlvbiBkZXNjcmlwdG9yOiBHUkFMTE9DMV9GVU5DVElPTl9TRVRfTEFZRVJfQ09VTlQKKyAqIE11c3QgYmUgcHJvdmlkZWQgYnkgYWxsIGdyYWxsb2MxIGRldmljZXMgdGhhdCBwcm92aWRlIHRoZQorICogR1JBTExPQzFfQ0FQQUJJTElUWV9MQVlFUkVEX0JVRkZFUlMgY2FwYWJpbGl0eS4KKyAqCisgKiBTZXRzIHRoZSBudW1iZXIgb2YgbGF5ZXJzIGluIHRoZSBidWZmZXIuCisgKgorICogQSBidWZmZXIgd2l0aCBtdWx0aXBsZSBsYXllcnMgbWF5IGJlIHVzZWQgYXMgdGhlIGJhY2tpbmcgc3RvcmUgb2YgYW4gYXJyYXkKKyAqIHRleHR1cmUuIEFsbCBsYXllcnMgb2YgYSBidWZmZXIgc2hhcmUgdGhlIHNhbWUgY2hhcmFjdGVyaXN0aWNzIChlLmcuLAorICogZGltZW5zaW9ucywgZm9ybWF0LCB1c2FnZSkuIERldmljZXMgdGhhdCBkbyBub3Qgc3VwcG9ydAorICogR1JBTExPQzFfQ0FQQUJJTElUWV9MQVlFUkVEX0JVRkZFUlMgbXVzdCBhbGxvY2F0ZSBvbmx5IGJ1ZmZlcnMgd2l0aCBhIHNpbmdsZQorICogbGF5ZXIuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgbGF5ZXJDb3VudCAtIHRoZSBkZXNpcmVkIG51bWJlciBvZiBsYXllcnMsIG11c3QgYmUgbm9uLXplcm8KKyAqCisgKiBSZXR1cm5zIEdSQUxMT0MxX0VSUk9SX05PTkUgb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcgZXJyb3JzOgorICogICBHUkFMTE9DMV9FUlJPUl9CQURfREVTQ1JJUFRPUiAtIHRoZSBidWZmZXIgZGVzY3JpcHRvciBpcyBpbnZhbGlkCisgKiAgIEdSQUxMT0MxX0VSUk9SX0JBRF9WQUxVRSAtIHRoZSBsYXllciBjb3VudCBpcyBpbnZhbGlkCisgKi8KK3R5cGVkZWYgaW50MzJfdCAvKmdyYWxsb2MxX2Vycm9yX3QqLyAoKkdSQUxMT0MxX1BGTl9TRVRfTEFZRVJfQ09VTlQpKAorICAgICAgICBncmFsbG9jMV9kZXZpY2VfdCogZGV2aWNlLCBncmFsbG9jMV9idWZmZXJfZGVzY3JpcHRvcl90IGRlc2NyaXB0b3IsCisgICAgICAgIHVpbnQzMl90IGxheWVyQ291bnQpOworCiAvKiBzZXRQcm9kdWNlclVzYWdlKC4uLiwgdXNhZ2UpCiAgKiBGdW5jdGlvbiBkZXNjcmlwdG9yOiBHUkFMTE9DMV9GVU5DVElPTl9TRVRfUFJPRFVDRVJfVVNBR0UKICAqIE11c3QgYmUgcHJvdmlkZWQgYnkgYWxsIGdyYWxsb2MxIGRldmljZXMKQEAgLTU2NCw2ICs2MDIsMjggQEAKICAgICAgICAgZ3JhbGxvYzFfZGV2aWNlX3QqIGRldmljZSwgYnVmZmVyX2hhbmRsZV90IGRlc2NyaXB0b3IsCiAgICAgICAgIGludDMyX3QqIG91dEZvcm1hdCk7CiAKKy8qIGdldExheWVyQ291bnQoLi4uLCBvdXRMYXllckNvdW50KQorICogRnVuY3Rpb24gZGVzY3JpcHRvcjogR1JBTExPQzFfRlVOQ1RJT05fR0VUX0xBWUVSX0NPVU5UCisgKiBNdXN0IGJlIHByb3ZpZGVkIGJ5IGFsbCBncmFsbG9jMSBkZXZpY2VzIHRoYXQgcHJvdmlkZSB0aGUKKyAqIEdSQUxMT0MxX0NBUEFCSUxJVFlfTEFZRVJFRF9CVUZGRVJTIGNhcGFiaWxpdHkuCisgKgorICogR2V0cyB0aGUgbnVtYmVyIG9mIGxheWVycyBvZiB0aGUgYnVmZmVyLgorICoKKyAqIFNlZSBzZXRMYXllckNvdW50IGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdmFsdWUuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgb3V0TGF5ZXJDb3VudCAtIHRoZSBudW1iZXIgb2YgbGF5ZXJzIGluIHRoZSBpbWFnZSwgbXVzdCBiZSBub24tTlVMTAorICoKKyAqIFJldHVybnMgR1JBTExPQzFfRVJST1JfTk9ORSBvciBvbmUgb2YgdGhlIGZvbGxvd2luZyBlcnJvcnM6CisgKiAgIEdSQUxMT0MxX0VSUk9SX0JBRF9IQU5ETEUgLSB0aGUgYnVmZmVyIGhhbmRsZSBpcyBpbnZhbGlkCisgKiAgIEdSQUxMT0MxX0VSUk9SX1VOU1VQUE9SVEVEIC0gdGhlIGRldmljZSBpcyB1bmFibGUgdG8gcmV0cmlldmUgdGhlCisgKiAgICAgICBsYXllciBjb3VudCBmcm9tIHRoZSBidWZmZXI7IHNlZSBub3RlIFsxXSBpbiB0aGlzIHNlY3Rpb24ncyBoZWFkZXIgZm9yCisgKiAgICAgICBtb3JlIGluZm9ybWF0aW9uCisgKi8KK3R5cGVkZWYgaW50MzJfdCAvKmdyYWxsb2MxX2Vycm9yX3QqLyAoKkdSQUxMT0MxX1BGTl9HRVRfTEFZRVJfQ09VTlQpKAorICAgICAgICBncmFsbG9jMV9kZXZpY2VfdCogZGV2aWNlLCBidWZmZXJfaGFuZGxlX3QgYnVmZmVyLAorICAgICAgICB1aW50MzJfdCogb3V0TGF5ZXJDb3VudCk7CisKIC8qIGdldFByb2R1Y2VyVXNhZ2UoLi4uLCBvdXRVc2FnZSkKICAqIEZ1bmN0aW9uIGRlc2NyaXB0b3I6IEdSQUxMT0MxX0ZVTkNUSU9OX0dFVF9QUk9EVUNFUl9VU0FHRQogICogTXVzdCBiZSBwcm92aWRlZCBieSBhbGwgZ3JhbGxvYzEgZGV2aWNlcwpAQCAtNjk2LDYgKzc1NiwxMiBAQAogICogcmVmZXJyaW5nIHRvIGEgcGFydGljdWxhciBiYWNraW5nIHN0b3JlIGlzIGZyZWVkLCB0aGF0IGJhY2tpbmcgc3RvcmUgc2hvdWxkCiAgKiBhbHNvIGJlIGZyZWVkLgogICoKKyAqIFdoZW4gR1JBTExPQzFfQ0FQQUJJTElUWV9SRUxFQVNFX0lNUExZX0RFTEVURSBpcyBzdXBwb3J0ZWQsCisgKiBuYXRpdmVfaGFuZGxlX2Nsb3NlIGFuZCBuYXRpdmVfaGFuZGxlX2RlbGV0ZSBtdXN0IGFsd2F5cyBiZSBjYWxsZWQgYnkgdGhlCisgKiBpbXBsZW1lbnRhdGlvbiB3aGVuZXZlciB0aGUgbGFzdCByZWZlcmVuY2UgaXMgcmVtb3ZlZC4gIE90aGVyd2lzZSwgYSBjYWxsCisgKiB0byByZWxlYXNlKCkgd2lsbCBiZSBmb2xsb3dlZCBieSBuYXRpdmVfaGFuZGxlX2Nsb3NlIGFuZCBuYXRpdmVfaGFuZGxlX2RlbGV0ZQorICogYnkgdGhlIGNhbGxlciB3aGVuIHRoZSBidWZmZXIgaXMgbm90IGFsbG9jYXRlZCBsb2NhbGx5IHRocm91Z2ggYWxsb2NhdGUoKS4KKyAqCiAgKiBQYXJhbWV0ZXJzOgogICogICBidWZmZXIgLSB0aGUgYnVmZmVyIGZyb20gd2hpY2ggYSByZWZlcmVuY2Ugc2hvdWxkIGJlIHJlbW92ZWQKICAqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2h3Y29tcG9zZXIuaCBiL2luY2x1ZGUvaGFyZHdhcmUvaHdjb21wb3Nlci5oCmluZGV4IDdlY2E3YzEuLjllYjFhYWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvaHdjb21wb3Nlci5oCisrKyBiL2luY2x1ZGUvaGFyZHdhcmUvaHdjb21wb3Nlci5oCkBAIC00ODEsNiArNDgxLDcgQEAKICAgICBzdHJ1Y3QgaHdfbW9kdWxlX3QgY29tbW9uOwogfSBod2NfbW9kdWxlX3Q7CiAKKyNkZWZpbmUgSFdDX0VSUk9SICgtMSkKIHR5cGVkZWYgc3RydWN0IGh3Y19jb21wb3Nlcl9kZXZpY2VfMSB7CiAgICAgLyoqCiAgICAgICogQ29tbW9uIG1ldGhvZHMgb2YgdGhlIGhhcmR3YXJlIGNvbXBvc2VyIGRldmljZS4gIFRoaXMgKm11c3QqIGJlIHRoZSBmaXJzdCBtZW1iZXIgb2YKQEAgLTcxNCw5ICs3MTUsOSBAQAogICAgICAqICgqZ2V0QWN0aXZlQ29uZmlnKSgpIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjb25maWd1cmF0aW9uIHRoYXQgaXMKICAgICAgKiBjdXJyZW50bHkgYWN0aXZlIG9uIHRoZSBjb25uZWN0ZWQgZGlzcGxheS4gVGhlIGluZGV4IGlzIHJlbGF0aXZlIHRvCiAgICAgICogdGhlIGxpc3Qgb2YgY29uZmlndXJhdGlvbiBoYW5kbGVzIHJldHVybmVkIGJ5IGdldERpc3BsYXlDb25maWdzLiBJZiB0aGVyZQotICAgICAqIGlzIG5vIGFjdGl2ZSBjb25maWd1cmF0aW9uLCAtMSBzaGFsbCBiZSByZXR1cm5lZC4KKyAgICAgKiBpcyBubyBhY3RpdmUgY29uZmlndXJhdGlvbiwgSFdDX0VSUk9SIHNoYWxsIGJlIHJldHVybmVkLgogICAgICAqCi0gICAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBpbmRleCBvbiBzdWNjZXNzIG9yIC0xIG9uIGVycm9yLgorICAgICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5kZXggb24gc3VjY2VzcyBvciBIV0NfRVJST1Igb24gZXJyb3IuCiAgICAgICoKICAgICAgKiBUaGlzIGZpZWxkIGlzIFJFUVVJUkVEIGZvciBIV0NfREVWSUNFX0FQSV9WRVJTSU9OXzFfNCBhbmQgbGF0ZXIuCiAgICAgICogSXQgc2hhbGwgYmUgTlVMTCBmb3IgcHJldmlvdXMgdmVyc2lvbnMuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL2h3Y29tcG9zZXIyLmggYi9pbmNsdWRlL2hhcmR3YXJlL2h3Y29tcG9zZXIyLmgKaW5kZXggMzVlZWRiMC4uMTFjOWJkZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9od2NvbXBvc2VyMi5oCisrKyBiL2luY2x1ZGUvaGFyZHdhcmUvaHdjb21wb3NlcjIuaApAQCAtOTQsNiArOTQsMjcgQEAKICAgICAgKiB0aGUgY2xpZW50LiBUaGlzIHdpbGwgcHJldmVudCB0aGUgY2xpZW50IGZyb20gYXBwbHlpbmcgdGhlIGNvbG9yCiAgICAgICogdHJhbnNmb3JtIGR1cmluZyBpdHMgY29tcG9zaXRpb24gc3RlcC4gKi8KICAgICBIV0MyX0NBUEFCSUxJVFlfU0tJUF9DTElFTlRfQ09MT1JfVFJBTlNGT1JNID0gMiwKKworICAgIC8qIFNwZWNpZmllcyB0aGF0IHRoZSBwcmVzZW50IGZlbmNlIG11c3Qgbm90IGJlIHVzZWQgYXMgYW4gYWNjdXJhdGUKKyAgICAgKiByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWN0dWFsIHByZXNlbnQgdGltZSBvZiBhIGZyYW1lLgorICAgICAqIFRoaXMgY2FwYWJpbGl0eSBtdXN0IG5ldmVyIGJlIHNldCBieSBIV0MyIGRldmljZXMuCisgICAgICogVGhpcyBjYXBhYmlsaXR5IG1heSBiZSBzZXQgZm9yIEhXQzEgZGV2aWNlcyB0aGF0IHVzZSB0aGUKKyAgICAgKiBIV0MyT24xQWRhcHRlciB3aGVyZSBlbXVsYXRpb24gb2YgdGhlIHByZXNlbnQgZmVuY2UgdXNpbmcgdGhlIHJldGlyZQorICAgICAqIGZlbmNlIGlzIG5vdCBmZWFzaWJsZS4KKyAgICAgKiBJbiB0aGUgZnV0dXJlLCBDVFMgdGVzdHMgd2lsbCByZXF1aXJlIHByZXNlbnQgdGltZSB0byBiZSByZWxpYWJsZS4KKyAgICAgKi8KKyAgICBIV0MyX0NBUEFCSUxJVFlfUFJFU0VOVF9GRU5DRV9JU19OT1RfUkVMSUFCTEUgPSAzLAorCisgICAgLyogU3BlY2lmaWVzIHRoYXQgYSBkZXZpY2UgaXMgYWJsZSB0byBza2lwIHRoZSB2YWxpZGF0ZURpc3BsYXkgY2FsbCBiZWZvcmUKKyAgICAgKiByZWNlaXZpbmcgYSBjYWxsIHRvIHByZXNlbnREaXNwbGF5LiBUaGUgY2xpZW50IHdpbGwgYWx3YXlzIHNraXAKKyAgICAgKiB2YWxpZGF0ZURpc3BsYXkgYW5kIHRyeSB0byBjYWxsIHByZXNlbnREaXNwbGF5IHJlZ2FyZGxlc3Mgb2YgdGhlIGNoYW5nZXMKKyAgICAgKiBpbiB0aGUgcHJvcGVydGllcyBvZiB0aGUgbGF5ZXJzLiBJZiB0aGUgZGV2aWNlIHJldHVybnMgYW55dGhpbmcgZWxzZSB0aGFuCisgICAgICogSFdDMl9FUlJPUl9OT05FLCBpdCB3aWxsIGNhbGwgdmFsaWRhdGVEaXNwbGF5IHRoZW4gcHJlc2VudERpc3BsYXkgYWdhaW4uCisgICAgICogRm9yIHRoaXMgY2FwYWJpbGl0eSB0byBiZSB3b3J0aHdoaWxlIHRoZSBkZXZpY2UgaW1wbGVtZW50YXRpb24gb2YKKyAgICAgKiBwcmVzZW50RGlzcGxheSBzaG91bGQgZmFpbCBhcyBmYXN0IGFzIHBvc3NpYmxlIGluIHRoZSBjYXNlIGEKKyAgICAgKiB2YWxpZGF0ZURpc3BsYXkgc3RlcCBpcyBuZWVkZWQuCisgICAgICovCisgICAgSFdDMl9DQVBBQklMSVRZX1NLSVBfVkFMSURBVEU9IDQsCiB9IGh3YzJfY2FwYWJpbGl0eV90OwogCiAvKiBQb3NzaWJsZSBjb21wb3NpdGlvbiB0eXBlcyBmb3IgYSBnaXZlbiBsYXllciAqLwpAQCAtMzM1LDYgKzM1Niw4IEBACiAgICAgICAgIGNhc2UgSFdDMl9DQVBBQklMSVRZX1NJREVCQU5EX1NUUkVBTTogcmV0dXJuICJTaWRlYmFuZFN0cmVhbSI7CiAgICAgICAgIGNhc2UgSFdDMl9DQVBBQklMSVRZX1NLSVBfQ0xJRU5UX0NPTE9SX1RSQU5TRk9STToKICAgICAgICAgICAgICAgICByZXR1cm4gIlNraXBDbGllbnRDb2xvclRyYW5zZm9ybSI7CisgICAgICAgIGNhc2UgSFdDMl9DQVBBQklMSVRZX1BSRVNFTlRfRkVOQ0VfSVNfTk9UX1JFTElBQkxFOgorICAgICAgICAgICAgICAgIHJldHVybiAiUHJlc2VudEZlbmNlSXNOb3RSZWxpYWJsZSI7CiAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAiVW5rbm93biI7CiAgICAgfQogfQpAQCAtNTUxLDYgKzU3NCw4IEBACiAgICAgSW52YWxpZCA9IEhXQzJfQ0FQQUJJTElUWV9JTlZBTElELAogICAgIFNpZGViYW5kU3RyZWFtID0gSFdDMl9DQVBBQklMSVRZX1NJREVCQU5EX1NUUkVBTSwKICAgICBTa2lwQ2xpZW50Q29sb3JUcmFuc2Zvcm0gPSBIV0MyX0NBUEFCSUxJVFlfU0tJUF9DTElFTlRfQ09MT1JfVFJBTlNGT1JNLAorICAgIFByZXNlbnRGZW5jZUlzTm90UmVsaWFibGUgPSBIV0MyX0NBUEFCSUxJVFlfUFJFU0VOVF9GRU5DRV9JU19OT1RfUkVMSUFCTEUsCisgICAgU2tpcFZhbGlkYXRlID0gSFdDMl9DQVBBQklMSVRZX1NLSVBfVkFMSURBVEUsCiB9OwogVE9fU1RSSU5HKGh3YzJfY2FwYWJpbGl0eV90LCBDYXBhYmlsaXR5LCBnZXRDYXBhYmlsaXR5TmFtZSkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS9od2NvbXBvc2VyX2RlZnMuaCBiL2luY2x1ZGUvaGFyZHdhcmUvaHdjb21wb3Nlcl9kZWZzLmgKaW5kZXggMThiMzBiYy4uMWU4MWU2ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS9od2NvbXBvc2VyX2RlZnMuaAorKysgYi9pbmNsdWRlL2hhcmR3YXJlL2h3Y29tcG9zZXJfZGVmcy5oCkBAIC0xMzYsOSArMTM2LDkgQEAKICAqLwogZW51bSB7CiAgICAgLyoKLSAgICAgKiBIV0NfU0tJUF9MQVlFUiBpcyBzZXQgYnkgU3VyZmFjZUZsbmdlciB0byBpbmRpY2F0ZSB0aGF0IHRoZSBIQUwKKyAgICAgKiBIV0NfU0tJUF9MQVlFUiBpcyBzZXQgYnkgU3VyZmFjZUZsaW5nZXIgdG8gaW5kaWNhdGUgdGhhdCB0aGUgSEFMCiAgICAgICogc2hhbGwgbm90IGNvbnNpZGVyIHRoaXMgbGF5ZXIgZm9yIGNvbXBvc2l0aW9uIGFzIGl0IHdpbGwgYmUgaGFuZGxlZAotICAgICAqIGJ5IFN1cmZhY2VGbGluZ2VyIChqdXN0IGFzIGlmIGNvbXBvc2l0aW9uVHlwZSB3YXMgc2V0IHRvIEhXQ19PVkVSTEFZKS4KKyAgICAgKiBieSBTdXJmYWNlRmxpbmdlciAoanVzdCBhcyBpZiBjb21wb3NpdGlvblR5cGUgd2FzIHNldCB0byBIV0NfRlJBTUVCVUZGRVIpLgogICAgICAqLwogICAgIEhXQ19TS0lQX0xBWUVSID0gMHgwMDAwMDAwMSwKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS9rZXltYXN0ZXJfZGVmcy5oIGIvaW5jbHVkZS9oYXJkd2FyZS9rZXltYXN0ZXJfZGVmcy5oCmluZGV4IDBmOWJjMjcuLjdkMWIzNDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvaGFyZHdhcmUva2V5bWFzdGVyX2RlZnMuaAorKysgYi9pbmNsdWRlL2hhcmR3YXJlL2tleW1hc3Rlcl9kZWZzLmgKQEAgLTEzNSw2ICsxMzUsMjYgQEAKICAgICBLTV9UQUdfT1NfUEFUQ0hMRVZFTCA9IEtNX1VJTlQgfCA3MDYsICAgICAgICAgIC8qIFBhdGNoIGxldmVsIG9mIHN5c3RlbSAoa2V5bWFzdGVyMikgKi8KICAgICBLTV9UQUdfVU5JUVVFX0lEID0gS01fQllURVMgfCA3MDcsICAgICAgICAgICAgIC8qIFVzZWQgdG8gcHJvdmlkZSB1bmlxdWUgSUQgaW4gYXR0ZXN0YXRpb24gKi8KICAgICBLTV9UQUdfQVRURVNUQVRJT05fQ0hBTExFTkdFID0gS01fQllURVMgfCA3MDgsIC8qIFVzZWQgdG8gcHJvdmlkZSBjaGFsbGVuZ2UgaW4gYXR0ZXN0YXRpb24gKi8KKyAgICBLTV9UQUdfQVRURVNUQVRJT05fQVBQTElDQVRJT05fSUQgPSBLTV9CWVRFUyB8IDcwOSwgLyogVXNlZCB0byBpZGVudGlmeSB0aGUgc2V0IG9mIHBvc3NpYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFwcGxpY2F0aW9ucyBvZiB3aGljaCBvbmUgaGFzIGluaXRpYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhIGtleSBhdHRlc3RhdGlvbiAqLworICAgIEtNX1RBR19BVFRFU1RBVElPTl9JRF9CUkFORCA9IEtNX0JZVEVTIHwgNzEwLCAgLyogVXNlZCB0byBwcm92aWRlIHRoZSBkZXZpY2UncyBicmFuZCBuYW1lIHRvIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlZCBpbiBhdHRlc3RhdGlvbiAqLworICAgIEtNX1RBR19BVFRFU1RBVElPTl9JRF9ERVZJQ0UgPSBLTV9CWVRFUyB8IDcxMSwgLyogVXNlZCB0byBwcm92aWRlIHRoZSBkZXZpY2UncyBkZXZpY2UgbmFtZSB0byBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWQgaW4gYXR0ZXN0YXRpb24gKi8KKyAgICBLTV9UQUdfQVRURVNUQVRJT05fSURfUFJPRFVDVCA9IEtNX0JZVEVTIHwgNzEyLCAvKiBVc2VkIHRvIHByb3ZpZGUgdGhlIGRldmljZSdzIHByb2R1Y3QgbmFtZSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGluY2x1ZGVkIGluIGF0dGVzdGF0aW9uICovCisgICAgS01fVEFHX0FUVEVTVEFUSU9OX0lEX1NFUklBTCA9IEtNX0JZVEVTIHwgNzEzLCAvKiBVc2VkIHRvIHByb3ZpZGUgdGhlIGRldmljZSdzIHNlcmlhbCBudW1iZXIgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGluY2x1ZGVkIGluIGF0dGVzdGF0aW9uICovCisgICAgS01fVEFHX0FUVEVTVEFUSU9OX0lEX0lNRUkgPSBLTV9CWVRFUyB8IDcxNCwgICAvKiBVc2VkIHRvIHByb3ZpZGUgdGhlIGRldmljZSdzIElNRUkgdG8gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkIGluIGF0dGVzdGF0aW9uICovCisgICAgS01fVEFHX0FUVEVTVEFUSU9OX0lEX01FSUQgPSBLTV9CWVRFUyB8IDcxNSwgICAvKiBVc2VkIHRvIHByb3ZpZGUgdGhlIGRldmljZSdzIE1FSUQgdG8gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkIGluIGF0dGVzdGF0aW9uICovCisgICAgS01fVEFHX0FUVEVTVEFUSU9OX0lEX01BTlVGQUNUVVJFUiA9IEtNX0JZVEVTIHwgNzE2LCAvKiBVc2VkIHRvIHByb3ZpZGUgdGhlIGRldmljZSdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW51ZmFjdHVyZXIgbmFtZSB0byBiZSBpbmNsdWRlZCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZXN0YXRpb24gKi8KKyAgICBLTV9UQUdfQVRURVNUQVRJT05fSURfTU9ERUwgPSBLTV9CWVRFUyB8IDcxNywgIC8qIFVzZWQgdG8gcHJvdmlkZSB0aGUgZGV2aWNlJ3MgbW9kZWwgbmFtZSB0byBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWQgaW4gYXR0ZXN0YXRpb24gKi8KIAogICAgIC8qIFRhZ3MgdXNlZCBvbmx5IHRvIHByb3ZpZGUgZGF0YSB0byBvciByZWNlaXZlIGRhdGEgZnJvbSBvcGVyYXRpb25zICovCiAgICAgS01fVEFHX0FTU09DSUFURURfREFUQSA9IEtNX0JZVEVTIHwgMTAwMCwgLyogVXNlZCB0byBwcm92aWRlIGFzc29jaWF0ZWQgZGF0YSBmb3IgQUVBRCBtb2Rlcy4gKi8KQEAgLTQyNyw2ICs0NDcsOCBAQAogICAgIEtNX0VSUk9SX0tFWV9SRVFVSVJFU19VUEdSQURFID0gLTYyLAogICAgIEtNX0VSUk9SX0FUVEVTVEFUSU9OX0NIQUxMRU5HRV9NSVNTSU5HID0gLTYzLAogICAgIEtNX0VSUk9SX0tFWU1BU1RFUl9OT1RfQ09ORklHVVJFRCA9IC02NCwKKyAgICBLTV9FUlJPUl9BVFRFU1RBVElPTl9BUFBMSUNBVElPTl9JRF9NSVNTSU5HID0gLTY1LAorICAgIEtNX0VSUk9SX0NBTk5PVF9BVFRFU1RfSURTID0gLTY2LAogCiAgICAgS01fRVJST1JfVU5JTVBMRU1FTlRFRCA9IC0xMDAsCiAgICAgS01fRVJST1JfVkVSU0lPTl9NSVNNQVRDSCA9IC0xMDEsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL3NlbnNvcnMtYmFzZS5oIGIvaW5jbHVkZS9oYXJkd2FyZS9zZW5zb3JzLWJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGY2MjIzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9oYXJkd2FyZS9zZW5zb3JzLWJhc2UuaApAQCAtMCwwICsxLDEzNyBAQAorLy8gVGhpcyBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQgYnkgaGlkbC1nZW4uIERvIG5vdCBlZGl0IG1hbnVhbGx5LgorLy8gU291cmNlOiBhbmRyb2lkLmhhcmR3YXJlLnNlbnNvcnNAMS4wCisvLyBSb290OiBhbmRyb2lkLmhhcmR3YXJlOmhhcmR3YXJlL2ludGVyZmFjZXMKKworI2lmbmRlZiBISURMX0dFTkVSQVRFRF9BTkRST0lEX0hBUkRXQVJFX1NFTlNPUlNfVjFfMF9FWFBPUlRFRF9DT05TVEFOVFNfSF8KKyNkZWZpbmUgSElETF9HRU5FUkFURURfQU5EUk9JRF9IQVJEV0FSRV9TRU5TT1JTX1YxXzBfRVhQT1JURURfQ09OU1RBTlRTX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworZW51bSB7CisgICAgU0VOU09SX0hBTF9OT1JNQUxfTU9ERSA9IDAsCisgICAgU0VOU09SX0hBTF9EQVRBX0lOSkVDVElPTl9NT0RFID0gMSwKK307CisKK2VudW0geworICAgIFNFTlNPUl9UWVBFX01FVEFfREFUQSA9IDAsCisgICAgU0VOU09SX1RZUEVfQUNDRUxFUk9NRVRFUiA9IDEsCisgICAgU0VOU09SX1RZUEVfTUFHTkVUSUNfRklFTEQgPSAyLAorICAgIFNFTlNPUl9UWVBFX09SSUVOVEFUSU9OID0gMywKKyAgICBTRU5TT1JfVFlQRV9HWVJPU0NPUEUgPSA0LAorICAgIFNFTlNPUl9UWVBFX0xJR0hUID0gNSwKKyAgICBTRU5TT1JfVFlQRV9QUkVTU1VSRSA9IDYsCisgICAgU0VOU09SX1RZUEVfVEVNUEVSQVRVUkUgPSA3LAorICAgIFNFTlNPUl9UWVBFX1BST1hJTUlUWSA9IDgsCisgICAgU0VOU09SX1RZUEVfR1JBVklUWSA9IDksCisgICAgU0VOU09SX1RZUEVfTElORUFSX0FDQ0VMRVJBVElPTiA9IDEwLAorICAgIFNFTlNPUl9UWVBFX1JPVEFUSU9OX1ZFQ1RPUiA9IDExLAorICAgIFNFTlNPUl9UWVBFX1JFTEFUSVZFX0hVTUlESVRZID0gMTIsCisgICAgU0VOU09SX1RZUEVfQU1CSUVOVF9URU1QRVJBVFVSRSA9IDEzLAorICAgIFNFTlNPUl9UWVBFX01BR05FVElDX0ZJRUxEX1VOQ0FMSUJSQVRFRCA9IDE0LAorICAgIFNFTlNPUl9UWVBFX0dBTUVfUk9UQVRJT05fVkVDVE9SID0gMTUsCisgICAgU0VOU09SX1RZUEVfR1lST1NDT1BFX1VOQ0FMSUJSQVRFRCA9IDE2LAorICAgIFNFTlNPUl9UWVBFX1NJR05JRklDQU5UX01PVElPTiA9IDE3LAorICAgIFNFTlNPUl9UWVBFX1NURVBfREVURUNUT1IgPSAxOCwKKyAgICBTRU5TT1JfVFlQRV9TVEVQX0NPVU5URVIgPSAxOSwKKyAgICBTRU5TT1JfVFlQRV9HRU9NQUdORVRJQ19ST1RBVElPTl9WRUNUT1IgPSAyMCwKKyAgICBTRU5TT1JfVFlQRV9IRUFSVF9SQVRFID0gMjEsCisgICAgU0VOU09SX1RZUEVfVElMVF9ERVRFQ1RPUiA9IDIyLAorICAgIFNFTlNPUl9UWVBFX1dBS0VfR0VTVFVSRSA9IDIzLAorICAgIFNFTlNPUl9UWVBFX0dMQU5DRV9HRVNUVVJFID0gMjQsCisgICAgU0VOU09SX1RZUEVfUElDS19VUF9HRVNUVVJFID0gMjUsCisgICAgU0VOU09SX1RZUEVfV1JJU1RfVElMVF9HRVNUVVJFID0gMjYsCisgICAgU0VOU09SX1RZUEVfREVWSUNFX09SSUVOVEFUSU9OID0gMjcsCisgICAgU0VOU09SX1RZUEVfUE9TRV82RE9GID0gMjgsCisgICAgU0VOU09SX1RZUEVfU1RBVElPTkFSWV9ERVRFQ1QgPSAyOSwKKyAgICBTRU5TT1JfVFlQRV9NT1RJT05fREVURUNUID0gMzAsCisgICAgU0VOU09SX1RZUEVfSEVBUlRfQkVBVCA9IDMxLAorICAgIFNFTlNPUl9UWVBFX0RZTkFNSUNfU0VOU09SX01FVEEgPSAzMiwKKyAgICBTRU5TT1JfVFlQRV9BRERJVElPTkFMX0lORk8gPSAzMywKKyAgICBTRU5TT1JfVFlQRV9MT1dfTEFURU5DWV9PRkZCT0RZX0RFVEVDVCA9IDM0LAorICAgIFNFTlNPUl9UWVBFX0FDQ0VMRVJPTUVURVJfVU5DQUxJQlJBVEVEID0gMzUsCisgICAgU0VOU09SX1RZUEVfREVWSUNFX1BSSVZBVEVfQkFTRSA9IDY1NTM2LCAvLyAweDEwMDAwCit9OworCitlbnVtIHsKKyAgICBTRU5TT1JfRkxBR19XQUtFX1VQID0gMXUsIC8vIDEKKyAgICBTRU5TT1JfRkxBR19DT05USU5VT1VTX01PREUgPSAwdSwgLy8gMAorICAgIFNFTlNPUl9GTEFHX09OX0NIQU5HRV9NT0RFID0gMnUsIC8vIDIKKyAgICBTRU5TT1JfRkxBR19PTkVfU0hPVF9NT0RFID0gNHUsIC8vIDQKKyAgICBTRU5TT1JfRkxBR19TUEVDSUFMX1JFUE9SVElOR19NT0RFID0gNnUsIC8vIDYKKyAgICBTRU5TT1JfRkxBR19EQVRBX0lOSkVDVElPTiA9IDE2dSwgLy8gMHgxMAorICAgIFNFTlNPUl9GTEFHX0RZTkFNSUNfU0VOU09SID0gMzJ1LCAvLyAweDIwCisgICAgU0VOU09SX0ZMQUdfQURESVRJT05BTF9JTkZPID0gNjR1LCAvLyAweDQwCisgICAgU0VOU09SX0ZMQUdfRElSRUNUX0NIQU5ORUxfQVNITUVNID0gMTAyNHUsIC8vIDB4NDAwCisgICAgU0VOU09SX0ZMQUdfRElSRUNUX0NIQU5ORUxfR1JBTExPQyA9IDIwNDh1LCAvLyAweDgwMAorICAgIFNFTlNPUl9GTEFHX01BU0tfUkVQT1JUSU5HX01PREUgPSAxNHUsIC8vIDB4RQorICAgIFNFTlNPUl9GTEFHX01BU0tfRElSRUNUX1JFUE9SVCA9IDg5NnUsIC8vIDB4MzgwCisgICAgU0VOU09SX0ZMQUdfTUFTS19ESVJFQ1RfQ0hBTk5FTCA9IDMwNzJ1LCAvLyAweEMwMAorfTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBTRU5TT1JfRkxBR19TSElGVF9SRVBPUlRJTkdfTU9ERSA9IDEsCisgICAgU0VOU09SX0ZMQUdfU0hJRlRfREFUQV9JTkpFQ1RJT04gPSA0LAorICAgIFNFTlNPUl9GTEFHX1NISUZUX0RZTkFNSUNfU0VOU09SID0gNSwKKyAgICBTRU5TT1JfRkxBR19TSElGVF9BRERJVElPTkFMX0lORk8gPSA2LAorICAgIFNFTlNPUl9GTEFHX1NISUZUX0RJUkVDVF9SRVBPUlQgPSA3LAorICAgIFNFTlNPUl9GTEFHX1NISUZUX0RJUkVDVF9DSEFOTkVMID0gMTAsCit9IHNlbnNvcl9mbGFnX3NoaWZ0X3Q7CisKK2VudW0geworICAgIFNFTlNPUl9TVEFUVVNfTk9fQ09OVEFDVCA9IC0xLCAvLyAoLTEpCisgICAgU0VOU09SX1NUQVRVU19VTlJFTElBQkxFID0gMCwKKyAgICBTRU5TT1JfU1RBVFVTX0FDQ1VSQUNZX0xPVyA9IDEsCisgICAgU0VOU09SX1NUQVRVU19BQ0NVUkFDWV9NRURJVU0gPSAyLAorICAgIFNFTlNPUl9TVEFUVVNfQUNDVVJBQ1lfSElHSCA9IDMsCit9OworCitlbnVtIHsKKyAgICBNRVRBX0RBVEFfRkxVU0hfQ09NUExFVEUgPSAxdSwgLy8gMQorfTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBSU5GT19CRUdJTiA9IDB1LCAvLyAwCisgICAgQUlORk9fRU5EID0gMXUsIC8vIDEKKyAgICBBSU5GT19VTlRSQUNLRURfREVMQVkgPSA2NTUzNnUsIC8vIDB4MTAwMDAKKyAgICBBSU5GT19JTlRFUk5BTF9URU1QRVJBVFVSRSA9IDY1NTM3dSwgLy8gNjU1MzcKKyAgICBBSU5GT19WRUMzX0NBTElCUkFUSU9OID0gNjU1Mzh1LCAvLyA2NTUzOAorICAgIEFJTkZPX1NFTlNPUl9QTEFDRU1FTlQgPSA2NTUzOXUsIC8vIDY1NTM5CisgICAgQUlORk9fU0FNUExJTkcgPSA2NTU0MHUsIC8vIDY1NTQwCisgICAgQUlORk9fQ0hBTk5FTF9OT0lTRSA9IDEzMTA3MnUsIC8vIDB4MjAwMDAKKyAgICBBSU5GT19DSEFOTkVMX1NBTVBMRVIgPSAxMzEwNzN1LCAvLyAxMzEwNzMKKyAgICBBSU5GT19DSEFOTkVMX0ZJTFRFUiA9IDEzMTA3NHUsIC8vIDEzMTA3NAorICAgIEFJTkZPX0NIQU5ORUxfTElORUFSX1RSQU5TRk9STSA9IDEzMTA3NXUsIC8vIDEzMTA3NQorICAgIEFJTkZPX0NIQU5ORUxfTk9OTElORUFSX01BUCA9IDEzMTA3NnUsIC8vIDEzMTA3NgorICAgIEFJTkZPX0NIQU5ORUxfUkVTQU1QTEVSID0gMTMxMDc3dSwgLy8gMTMxMDc3CisgICAgQUlORk9fTE9DQUxfR0VPTUFHTkVUSUNfRklFTEQgPSAxOTY2MDh1LCAvLyAweDMwMDAwCisgICAgQUlORk9fTE9DQUxfR1JBVklUWSA9IDE5NjYwOXUsIC8vIDE5NjYwOQorICAgIEFJTkZPX0RPQ0tfU1RBVEUgPSAxOTY2MTB1LCAvLyAxOTY2MTAKKyAgICBBSU5GT19ISUdIX1BFUkZPUk1BTkNFX01PREUgPSAxOTY2MTF1LCAvLyAxOTY2MTEKKyAgICBBSU5GT19NQUdORVRJQ19GSUVMRF9DQUxJQlJBVElPTiA9IDE5NjYxMnUsIC8vIDE5NjYxMgorICAgIEFJTkZPX0NVU1RPTV9TVEFSVCA9IDI2ODQzNTQ1NnUsIC8vIDB4MTAwMDAwMDAKKyAgICBBSU5GT19ERUJVR0dJTkdfU1RBUlQgPSAxMDczNzQxODI0dSwgLy8gMHg0MDAwMDAwMAorfSBhZGRpdGlvbmFsX2luZm9fdHlwZV90OworCit0eXBlZGVmIGVudW0geworICAgIFNFTlNPUl9ESVJFQ1RfUkFURV9TVE9QID0gMCwKKyAgICBTRU5TT1JfRElSRUNUX1JBVEVfTk9STUFMID0gMSwKKyAgICBTRU5TT1JfRElSRUNUX1JBVEVfRkFTVCA9IDIsCisgICAgU0VOU09SX0RJUkVDVF9SQVRFX1ZFUllfRkFTVCA9IDMsCit9IGRpcmVjdF9yYXRlX2xldmVsX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgU0VOU09SX0RJUkVDVF9NRU1fVFlQRV9BU0hNRU0gPSAxLAorICAgIFNFTlNPUl9ESVJFQ1RfTUVNX1RZUEVfR1JBTExPQyA9IDIsCit9IGRpcmVjdF9tZW1fdHlwZV90OworCit0eXBlZGVmIGVudW0geworICAgIFNFTlNPUl9ESVJFQ1RfRk1UX1NFTlNPUlNfRVZFTlQgPSAxLAorfSBkaXJlY3RfZm9ybWF0X3Q7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAgLy8gSElETF9HRU5FUkFURURfQU5EUk9JRF9IQVJEV0FSRV9TRU5TT1JTX1YxXzBfRVhQT1JURURfQ09OU1RBTlRTX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL3NlbnNvcnMuaCBiL2luY2x1ZGUvaGFyZHdhcmUvc2Vuc29ycy5oCmluZGV4IDMyMmFiZTYuLmRkZTk5N2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvaGFyZHdhcmUvc2Vuc29ycy5oCisrKyBiL2luY2x1ZGUvaGFyZHdhcmUvc2Vuc29ycy5oCkBAIC0yNCw2ICsyNCw4IEBACiAjaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgogCisjaW5jbHVkZSAic2Vuc29ycy1iYXNlLmgiCisKIF9fQkVHSU5fREVDTFMKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNTQsMTQgKzU2LDE1IEBACiAjZGVmaW5lIFNFTlNPUlNfSEFSRFdBUkVfUE9MTCAgICAgICAicG9sbCIKIAogLyoqCi0gKiBIYW5kbGVzIG11c3QgYmUgaGlnaGVyIHRoYW4gU0VOU09SU19IQU5ETEVfQkFTRSBhbmQgbXVzdCBiZSB1bmlxdWUuCi0gKiBBIEhhbmRsZSBpZGVudGlmaWVzIGEgZ2l2ZW4gc2Vuc29ycy4gVGhlIGhhbmRsZSBpcyB1c2VkIHRvIGFjdGl2YXRlCi0gKiBhbmQvb3IgZGVhY3RpdmF0ZSBzZW5zb3JzLgotICogSW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBBUEkgdGhlcmUgY2FuIG9ubHkgYmUgMjU2IGhhbmRsZXMuCisgKiBTZW5zb3IgaGFuZGxlIGlzIGdyZWF0ZXIgdGhhbiAwIGFuZCBsZXNzIHRoYW4gSU5UMzJfTUFYLgorICoKKyAqICoqKiogRGVwcmVjYXRlZCAqKioqCisgKiBEZWZpbmVkIHZhbHVlcyBiZWxvdyBhcmUga2VwdCBmb3IgY29kZSBjb21wYXRpYmlsaXR5LiBOb3RlIHNlbnNvciBoYW5kbGUgY2FuIGJlIGFzIGxhcmdlIGFzCisgKiBJTlQzMl9NQVguCiAgKi8KICNkZWZpbmUgU0VOU09SU19IQU5ETEVfQkFTRSAgICAgICAgICAgICAwCi0jZGVmaW5lIFNFTlNPUlNfSEFORExFX0JJVFMgICAgICAgICAgICAgOAotI2RlZmluZSBTRU5TT1JTX0hBTkRMRV9DT1VOVCAgICAgICAgICAgICgxPDxTRU5TT1JTX0hBTkRMRV9CSVRTKQorI2RlZmluZSBTRU5TT1JTX0hBTkRMRV9CSVRTICAgICAgICAgICAgIDMxCisjZGVmaW5lIFNFTlNPUlNfSEFORExFX0NPVU5UICAgICAgICAgICAgKDF1bGw8PFNFTlNPUlNfSEFORExFX0JJVFMpCiAKIAogLyoKQEAgLTgyLDcgKzg1LDcgQEAKICAqLwogZW51bSB7CiAgICAgLyogYSBwcmV2aW91cyBmbHVzaCBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZCAqLwotICAgIE1FVEFfREFUQV9GTFVTSF9DT01QTEVURSA9IDEsCisgICAgLy8gTUVUQV9EQVRBX0ZMVVNIX0NPTVBMRVRFID0gMSwKICAgICBNRVRBX0RBVEFfVkVSU0lPTiAgIC8qIGFsd2F5cyBsYXN0LCBsZWF2ZSBhdXRvLWFzc2lnbmVkICovCiB9OwogCkBAIC05NCwyNyArOTcsMTEgQEAKICNkZWZpbmUgU0VOU09SX1BFUk1JU1NJT05fQk9EWV9TRU5TT1JTICJhbmRyb2lkLnBlcm1pc3Npb24uQk9EWV9TRU5TT1JTIgogCiAvKgotICogQXZhaWxhYmlsaXR5OiBTRU5TT1JTX0RFVklDRV9BUElfVkVSU0lPTl8xXzQKLSAqIFNlbnNvciBIQUwgbW9kZXMgdXNlZCBpbiBzZXRfb3BlcmF0aW9uX21vZGUgbWV0aG9kCisgKiBzZW5zb3IgZmxhZ3MgbGVnYWN5IG5hbWVzCisgKgorICogcGxlYXNlIHVzZSBTRU5TT1JfRkxBR18qIGRpcmVjdGx5IGZvciBuZXcgaW1wbGVtZW50YXRpb24uCisgKiBAc2VlIHNlbnNvcl90CiAgKi8KLWVudW0gewotICAgIC8qCi0gICAgICogT3BlcmF0aW5nIG1vZGVzIGZvciB0aGUgSEFMLgotICAgICAqLwotCi0gICAgLyoKLSAgICAgKiBOb3JtYWwgbW9kZSBvcGVyYXRpb24uIFRoaXMgaXMgdGhlIGRlZmF1bHQgc3RhdGUgb2Ygb3BlcmF0aW9uLgotICAgICAqIFRoZSBIQUwgc2hhbGwgaW5pdGlhbGl6ZSBpbnRvIHRoaXMgbW9kZSBvbiBkZXZpY2Ugc3RhcnR1cC4KLSAgICAgKi8KLSAgICBTRU5TT1JfSEFMX05PUk1BTF9NT0RFICAgICAgICA9IDAsCi0KLSAgICAvKgotICAgICAqIERhdGEgSW5qZWN0aW9uIG1vZGUuIEluIHRoaXMgbW9kZSwgdGhlIGRldmljZSBzaGFsbCBub3Qgc291cmNlIGRhdGEgZnJvbSB0aGUKLSAgICAgKiBwaHlzaWNhbCBzZW5zb3JzIGFzIGl0IHdvdWxkIGluIG5vcm1hbCBtb2RlLiBJbnN0ZWFkIHNlbnNvciBkYXRhIGlzCi0gICAgICogaW5qZWN0ZWQgYnkgdGhlIHNlbnNvciBzZXJ2aWNlLgotICAgICAqLwotICAgIFNFTlNPUl9IQUxfREFUQV9JTkpFQ1RJT05fTU9ERSAgICAgID0gMHgxCi19OwogCiAjZGVmaW5lIFNFTlNPUl9GTEFHX01BU0sobmJpdCwgc2hpZnQpICAgKCgoMTw8KG5iaXQpKS0xKTw8KHNoaWZ0KSkKICNkZWZpbmUgU0VOU09SX0ZMQUdfTUFTS18xKHNoaWZ0KSAgICAgICBTRU5TT1JfRkxBR19NQVNLKDEsIHNoaWZ0KQpAQCAtMTIyLDc0OSArMTA5LDgyIEBACiAvKgogICogTWFzayBhbmQgc2hpZnQgZm9yIHJlcG9ydGluZyBtb2RlIHNlbnNvciBmbGFncyBkZWZpbmVkIGFib3ZlLgogICovCi0jZGVmaW5lIFJFUE9SVElOR19NT0RFX1NISUZUICAgICAgICAgICAgKDEpCisjZGVmaW5lIFJFUE9SVElOR19NT0RFX1NISUZUICAgICAgICAgICAgU0VOU09SX0ZMQUdfU0hJRlRfUkVQT1JUSU5HX01PREUKICNkZWZpbmUgUkVQT1JUSU5HX01PREVfTkJJVCAgICAgICAgICAgICAoMykKLSNkZWZpbmUgUkVQT1JUSU5HX01PREVfTUFTSyAgICAgICAgICAgICBTRU5TT1JfRkxBR19NQVNLKFJFUE9SVElOR19NT0RFX05CSVQsIFJFUE9SVElOR19NT0RFX1NISUZUKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDB4RQorI2RlZmluZSBSRVBPUlRJTkdfTU9ERV9NQVNLICAgICAgICAgICAgIFNFTlNPUl9GTEFHX01BU0tfUkVQT1JUSU5HX01PREUKIAogLyoKICAqIE1hc2sgYW5kIHNoaWZ0IGZvciBkYXRhX2luamVjdGlvbiBtb2RlIHNlbnNvciBmbGFncyBkZWZpbmVkIGFib3ZlLgogICovCi0jZGVmaW5lIERBVEFfSU5KRUNUSU9OX1NISUZUICAgICAgICAgICAgKDQpCi0jZGVmaW5lIERBVEFfSU5KRUNUSU9OX01BU0sgICAgICAgICAgICAgU0VOU09SX0ZMQUdfTUFTS18xKERBVEFfSU5KRUNUSU9OX1NISUZUKSAvLzB4MTAKKyNkZWZpbmUgREFUQV9JTkpFQ1RJT05fU0hJRlQgICAgICAgICAgICBTRU5TT1JfRkxBR19TSElGVF9EQVRBX0lOSkVDVElPTgorI2RlZmluZSBEQVRBX0lOSkVDVElPTl9NQVNLICAgICAgICAgICAgIFNFTlNPUl9GTEFHX0RBVEFfSU5KRUNUSU9OCiAKIC8qCiAgKiBNYXNrIGFuZCBzaGlmdCBmb3IgZHluYW1pYyBzZW5zb3IgZmxhZy4KICAqLwotI2RlZmluZSBEWU5BTUlDX1NFTlNPUl9TSElGVCAgICAgICAgICAgICg1KQotI2RlZmluZSBEWU5BTUlDX1NFTlNPUl9NQVNLICAgICAgICAgICAgIFNFTlNPUl9GTEFHX01BU0tfMShEWU5BTUlDX1NFTlNPUl9TSElGVCkgLy8weDIwCisjZGVmaW5lIERZTkFNSUNfU0VOU09SX1NISUZUICAgICAgICAgICAgU0VOU09SX0ZMQUdfU0hJRlRfRFlOQU1JQ19TRU5TT1IKKyNkZWZpbmUgRFlOQU1JQ19TRU5TT1JfTUFTSyAgICAgICAgICAgICBTRU5TT1JfRkxBR19EWU5BTUlDX1NFTlNPUgogCiAvKgogICogTWFzayBhbmQgc2hpZnQgZm9yIHNlbnNvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHN1cHBvcnQuCiAgKi8KLSNkZWZpbmUgQURESVRJT05BTF9JTkZPX1NISUZUICAgICAgICAgICAoNikKLSNkZWZpbmUgQURESVRJT05BTF9JTkZPX01BU0sgICAgICAgICAgICBTRU5TT1JfRkxBR19NQVNLXzEoQURESVRJT05BTF9JTkZPX1NISUZUKSAvLzB4NDAKKyNkZWZpbmUgQURESVRJT05BTF9JTkZPX1NISUZUICAgICAgICAgICBTRU5TT1JfRkxBR19TSElGVF9BRERJVElPTkFMX0lORk8KKyNkZWZpbmUgQURESVRJT05BTF9JTkZPX01BU0sgICAgICAgICAgICBTRU5TT1JfRkxBR19BRERJVElPTkFMX0lORk8KIAogLyoKLSAqIEF2YWlsYWJpbGl0eTogU0VOU09SU19ERVZJQ0VfQVBJX1ZFUlNJT05fMV8zCi0gKiBTZW5zb3IgZmxhZ3MgdXNlZCBpbiBzZW5zb3JfdC5mbGFncy4KKyAqIExlZ2FjeSBhbGlhcyBvZiBTRU5TT1JfVFlQRV9NQUdORVRJQ19GSUVMRC4KKyAqCisgKiBQcmV2aW91c2x5LCB0aGUgdHlwZSBvZiBhIHNlbnNvciBtZWFzdXJpbmcgbG9jYWwgbWFnbmV0aWMgZmllbGQgaXMgbmFtZWQKKyAqIFNFTlNPUl9UWVBFX0dFT01BR05FVElDX0ZJRUxEIGFuZCBTRU5TT1JfVFlQRV9NQUdORVRJQ19GSUVMRCBpcyBpdHMgYWxpYXMuCisgKiBTRU5TT1JfVFlQRV9NQUdORVRJQ19GSUVMRCBpcyByZWRlZmluZWQgYXMgcHJpbWFyeSBuYW1lIHRvIGF2b2lkIGNvbmZ1c2lvbi4KKyAqIFNFTlNPUl9UWVBFX0dFT01BR05FVElDX0ZJRUxEIGlzIHRoZSBhbGlhcyBhbmQgaXMgZGVwcmVjYXRpbmcuIE5ldyBpbXBsZW1lbnRhdGlvbiBtdXN0IG5vdCB1c2UKKyAqIFNFTlNPUl9UWVBFX0dFT01BR05FVElDX0ZJRUxELgogICovCi1lbnVtIHsKLSAgICAvKgotICAgICAqIFdoZXRoZXIgdGhpcyBzZW5zb3Igd2FrZXMgdXAgdGhlIEFQIGZyb20gc3VzcGVuZCBtb2RlIHdoZW4gZGF0YSBpcyBhdmFpbGFibGUuICBXaGVuZXZlcgotICAgICAqIHNlbnNvciBldmVudHMgYXJlIGRlbGl2ZXJlZCBmcm9tIGEgd2FrZV91cCBzZW5zb3IsIHRoZSBkcml2ZXIgbmVlZHMgdG8gaG9sZCBhIHdha2VfbG9jayB0aWxsCi0gICAgICogdGhlIGV2ZW50cyBhcmUgcmVhZCBieSB0aGUgU2Vuc29yU2VydmljZSBpLmUgdGlsbCBzZW5zb3JzX3BvbGxfZGV2aWNlX3QucG9sbCgpIGlzIGNhbGxlZCB0aGUKLSAgICAgKiBuZXh0IHRpbWUuIE9uY2UgcG9sbCBpcyBjYWxsZWQgYWdhaW4gaXQgbWVhbnMgZXZlbnRzIGhhdmUgYmVlbiByZWFkIGJ5IHRoZSBTZW5zb3JTZXJ2aWNlLCB0aGUKLSAgICAgKiBkcml2ZXIgY2FuIHNhZmVseSByZWxlYXNlIHRoZSB3YWtlX2xvY2suIFNlbnNvclNlcnZpY2Ugd2lsbCBjb250aW51ZSB0byBob2xkIGEgd2FrZV9sb2NrIHRpbGwKLSAgICAgKiB0aGUgYXBwIGFjdHVhbGx5IHJlYWRzIHRoZSBldmVudHMuCi0gICAgICovCi0gICAgU0VOU09SX0ZMQUdfV0FLRV9VUCA9IDFVIDw8IDAsCi0gICAgLyoKLSAgICAgKiBSZXBvcnRpbmcgbW9kZXMgZm9yIHZhcmlvdXMgc2Vuc29ycy4gRWFjaCBzZW5zb3Igd2lsbCBoYXZlIGV4YWN0bHkgb25lIG9mIHRoZXNlIG1vZGVzIHNldC4KLSAgICAgKiBUaGUgbGVhc3Qgc2lnbmlmaWNhbnQgMm5kLCAzcmQgYW5kIDR0aCBiaXRzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBmb3VyIHBvc3NpYmxlIHJlcG9ydGluZwotICAgICAqIG1vZGVzLgotICAgICAqLwotICAgIFNFTlNPUl9GTEFHX0NPTlRJTlVPVVNfTU9ERSAgICAgICAgPSAwLCAgICAvLyAwMDAwCi0gICAgU0VOU09SX0ZMQUdfT05fQ0hBTkdFX01PREUgICAgICAgICA9IDB4MiwgIC8vIDAwMTAKLSAgICBTRU5TT1JfRkxBR19PTkVfU0hPVF9NT0RFICAgICAgICAgID0gMHg0LCAgLy8gMDEwMAotICAgIFNFTlNPUl9GTEFHX1NQRUNJQUxfUkVQT1JUSU5HX01PREUgPSAweDYsICAvLyAwMTEwCi0KLSAgICAvKgotICAgICAqIFNldCB0aGlzIGZsYWcgaWYgdGhlIHNlbnNvciBzdXBwb3J0cyBkYXRhX2luamVjdGlvbiBtb2RlIGFuZCBhbGxvd3MgZGF0YSB0byBiZSBpbmplY3RlZAotICAgICAqIGZyb20gdGhlIFNlbnNvclNlcnZpY2UuIFdoZW4gaW4gZGF0YV9pbmplY3Rpb24gT05MWSBzZW5zb3JzIHdpdGggdGhpcyBmbGFnIHNldCBhcmUgaW5qZWN0ZWQKLSAgICAgKiBzZW5zb3IgZGF0YSBhbmQgb25seSBzZW5zb3JzIHdpdGggdGhpcyBmbGFnIHNldCBhcmUgYWN0aXZhdGVkLiBFZzogQWNjZWxlcm9tZXRlciBhbmQgU3RlcAotICAgICAqIENvdW50ZXIgc2Vuc29ycyBjYW4gYmUgc2V0IHdpdGggdGhpcyBmbGFnIGFuZCBTZW5zb3JTZXJ2aWNlIHdpbGwgaW5qZWN0IGFjY2VsZXJvbWV0ZXIgZGF0YQotICAgICAqIGFuZCByZWFkIHRoZSBjb3JyZXNwb25kaW5nIHN0ZXAgY291bnRzLgotICAgICAqLwotICAgIFNFTlNPUl9GTEFHX1NVUFBPUlRTX0RBVEFfSU5KRUNUSU9OID0gREFUQV9JTkpFQ1RJT05fTUFTSywgLy8gMSAwMDAwCi0KLSAgICAvKgotICAgICAqIFNldCB0aGlzIGZsYWcgaWYgdGhlIHNlbnNvciBpcyBhIGR5bmFtaWNhbGx5IGNvbm5lY3RlZCBzZW5zb3IuIFNlZQotICAgICAqIGR5bmFtaWNfc2Vuc29yX21ldGFfZXZlbnRfdCBhbmQgU0VOU09SX1RZUEVfRFlOQU1JQ19TRU5TT1JfTUVUQSBmb3IgZGV0YWlscy4KLSAgICAgKi8KLSAgICBTRU5TT1JfRkxBR19EWU5BTUlDX1NFTlNPUiA9IERZTkFNSUNfU0VOU09SX01BU0ssCi0KLSAgICAvKgotICAgICAqIFNldCB0aGlzIGZsYWcgaWYgc2Vuc29yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaXMgc3VwcG9ydGVkLiBTZWUgU0VOU09SX1RZUEVfQURESVRJT05BTF9JTkZPCi0gICAgICogYW5kIGFkZGl0aW9uYWxfaW5mb19ldmVudF90IGZvciBkZXRhaWxzLgotICAgICAqLwotICAgIFNFTlNPUl9GTEFHX0FERElUSU9OQUxfSU5GTyA9IEFERElUSU9OQUxfSU5GT19NQVNLCi19OwotCisjZGVmaW5lIFNFTlNPUl9UWVBFX0dFT01BR05FVElDX0ZJRUxEICAgU0VOU09SX1RZUEVfTUFHTkVUSUNfRklFTEQKIAogLyoKLSAqIFNlbnNvciB0eXBlCisgKiBTZW5zb3Igc3RyaW5nIHR5cGVzIGZvciBBbmRyb2lkIGRlZmluZWQgc2Vuc29yIHR5cGVzLgogICoKLSAqIEVhY2ggc2Vuc29yIGhhcyBhIHR5cGUgd2hpY2ggZGVmaW5lcyB3aGF0IHRoaXMgc2Vuc29yIG1lYXN1cmVzIGFuZCBob3cKLSAqIG1lYXN1cmVzIGFyZSByZXBvcnRlZC4gU2VlIHRoZSBCYXNlIHNlbnNvcnMgYW5kIENvbXBvc2l0ZSBzZW5zb3JzIGxpc3RzCi0gKiBmb3IgY29tcGxldGUgZGVzY3JpcHRpb25zOgotICogaHR0cDovL3NvdXJjZS5hbmRyb2lkLmNvbS9kZXZpY2VzL3NlbnNvcnMvYmFzZV90cmlnZ2Vycy5odG1sCi0gKiBodHRwOi8vc291cmNlLmFuZHJvaWQuY29tL2RldmljZXMvc2Vuc29ycy9jb21wb3NpdGVfc2Vuc29ycy5odG1sCisgKiBGb3IgQW5kcm9pZCBkZWZpbmVkIHNlbnNvciB0eXBlcywgc3RyaW5nIHR5cGUgd2lsbCBiZSBvdmVycmlkZSBpbiBzZW5zb3Igc2VydmljZSBhbmQgdGh1cyBubworICogbG9uZ2VyIG5lZWRlZCB0byBiZSBhZGRlZCB0byBzZW5zb3JfdCBkYXRhIHN0cnVjdHVyZS4KICAqCi0gKiBEZXZpY2UgbWFudWZhY3R1cmVycyAoT0VNcykgY2FuIGRlZmluZSB0aGVpciBvd24gc2Vuc29yIHR5cGVzLCBmb3IKLSAqIHRoZWlyIHByaXZhdGUgdXNlIGJ5IGFwcGxpY2F0aW9ucyBvciBzZXJ2aWNlcyBwcm92aWRlZCBieSB0aGVtLiBTdWNoCi0gKiBzZW5zb3IgdHlwZXMgYXJlIHNwZWNpZmljIHRvIGFuIE9FTSBhbmQgY2FuJ3QgYmUgZXhwb3NlZCBpbiB0aGUgU0RLLgotICogVGhlc2UgdHlwZXMgbXVzdCBzdGFydCBhdCBTRU5TT1JfVFlQRV9ERVZJQ0VfUFJJVkFURV9CQVNFLgotICoKLSAqIEFsbCBzZW5zb3JzIGRlZmluZWQgb3V0c2lkZSBvZiB0aGUgZGV2aWNlIHByaXZhdGUgcmFuZ2UgbXVzdCBjb3JyZXNwb25kIHRvCi0gKiBhIHR5cGUgZGVmaW5lZCBpbiB0aGlzIGZpbGUsIGFuZCBtdXN0IHNhdGlzZnkgdGhlIGNoYXJhY3RlcmlzdGljcyBsaXN0ZWQgaW4KLSAqIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgc2Vuc29yIHR5cGUuCi0gKgotICogU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIFNFTlNPUlNfREVWSUNFX0FQSV9WRVJTSU9OXzFfMiwgZWFjaCBzZW5zb3IgYWxzbwotICogaGFzIGEgc3RyaW5nVHlwZS4KLSAqICAtIFN0cmluZ1R5cGUgb2Ygc2Vuc29ycyBpbnNpZGUgb2YgdGhlIGRldmljZSBwcml2YXRlIHJhbmdlIE1VU1QgYmUgcHJlZml4ZWQKLSAqICAgIGJ5IHRoZSBzZW5zb3IgcHJvdmlkZXIncyBvciBPRU0gcmV2ZXJzZSBkb21haW4gbmFtZS4gSW4gcGFydGljdWxhciwgdGhleQotICogICAgY2Fubm90IHVzZSB0aGUgImFuZHJvaWQuc2Vuc29yIiBwcmVmaXguCi0gKiAgLSBTdHJpbmdUeXBlIG9mIHNlbnNvcnMgb3V0c2lkZSBvZiB0aGUgZGV2aWNlIHByaXZhdGUgcmFuZ2UgTVVTVCBjb3JyZXNwb25kCi0gKiAgICB0byB0aGUgb25lIGRlZmluZWQgaW4gdGhpcyBmaWxlIChzdGFydGluZyB3aXRoICJhbmRyb2lkLnNlbnNvciIpLgotICogICAgRm9yIGV4YW1wbGUsIGFjY2VsZXJvbWV0ZXJzIG11c3QgaGF2ZQotICogICAgICB0eXBlPVNFTlNPUl9UWVBFX0FDQ0VMRVJPTUVURVIgYW5kCi0gKiAgICAgIHN0cmluZ1R5cGU9U0VOU09SX1NUUklOR19UWVBFX0FDQ0VMRVJPTUVURVIKLSAqCi0gKiBXaGVuIGFuZHJvaWQgaW50cm9kdWNlcyBhIG5ldyBzZW5zb3IgdHlwZSB0aGF0IGNhbiByZXBsYWNlIGFuIE9FTS1kZWZpbmVkCi0gKiBzZW5zb3IgdHlwZSwgdGhlIE9FTSBtdXN0IHVzZSB0aGUgb2ZmaWNpYWwgc2Vuc29yIHR5cGUgYW5kIHN0cmluZ1R5cGUgb24KLSAqIHZlcnNpb25zIG9mIHRoZSBIQUwgdGhhdCBzdXBwb3J0IHRoaXMgbmV3IG9mZmljaWFsIHNlbnNvciB0eXBlLgotICoKLSAqIEV4YW1wbGUgKG1hZGUgdXApOiBTdXBwb3NlIEdvb2dsZSdzIEdsYXNzIHRlYW0gd2FudHMgdG8gc3VyZmFjZSBhIHNlbnNvcgotICogZGV0ZWN0aW5nIHRoYXQgR2xhc3MgaXMgb24gYSBoZWFkLgotICogIC0gU3VjaCBhIHNlbnNvciBpcyBub3Qgb2ZmaWNpYWxseSBzdXBwb3J0ZWQgaW4gYW5kcm9pZCBLaXRLYXQKLSAqICAtIEdsYXNzIGRldmljZXMgbGF1bmNoaW5nIG9uIEtpdEthdCBjYW4gaW1wbGVtZW50IGEgc2Vuc29yIHdpdGgKLSAqICAgIHR5cGUgPSAweDEwMDAxIGFuZCBzdHJpbmdUeXBlID0gImNvbS5nb29nbGUuZ2xhc3Mub25oZWFkZGV0ZWN0b3IiCi0gKiAgLSBJbiBMIGFuZHJvaWQgcmVsZWFzZSwgaWYgYW5kcm9pZCBkZWNpZGVzIHRvIGRlZmluZQotICogICAgU0VOU09SX1RZUEVfT05fSEVBRF9ERVRFQ1RPUiBhbmQgU1RSSU5HX1NFTlNPUl9UWVBFX09OX0hFQURfREVURUNUT1IsCi0gKiAgICB0aG9zZSB0eXBlcyBzaG91bGQgcmVwbGFjZSB0aGUgR2xhc3MtdGVhbS1zcGVjaWZpYyB0eXBlcyBpbiBhbGwgZnV0dXJlCi0gKiAgICBsYXVuY2hlcy4KLSAqICAtIFdoZW4gbGF1bmNoaW5nIEdsYXNzIG9uIHRoZSBMIHJlbGVhc2UsIEdvb2dsZSBzaG91bGQgbm93IHVzZSB0aGUgb2ZmaWNpYWwKLSAqICAgIHR5cGUgKFNFTlNPUl9UWVBFX09OX0hFQURfREVURUNUT1IpIGFuZCBzdHJpbmdUeXBlLgotICogIC0gVGhpcyB3YXksIGFsbCBhcHBsaWNhdGlvbnMgY2FuIG5vdyB1c2UgdGhpcyBzZW5zb3IuCisgKiBUaGVzZSBkZWZpbml0aW9ucyBhcmUgZ29pbmcgdG8gYmUgcmVtb3ZlZCBzb29uLgogICovCi0KLS8qCi0gKiBCYXNlIGZvciBkZXZpY2UgbWFudWZhY3R1cmVycyBwcml2YXRlIHNlbnNvciB0eXBlcy4KLSAqIFRoZXNlIHNlbnNvciB0eXBlcyBjYW4ndCBiZSBleHBvc2VkIGluIHRoZSBTREsuCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfREVWSUNFX1BSSVZBVEVfQkFTRSAgICAgMHgxMDAwMAotCi0vKgotICogU0VOU09SX1RZUEVfTUVUQV9EQVRBCi0gKiByZXBvcnRpbmctbW9kZTogbi9hCi0gKiB3YWtlLXVwIHNlbnNvcjogbi9hCi0gKgotICogTk8gU0VOU09SIE9GIFRIQVQgVFlQRSBNVVNUIEJFIFJFVFVSTkVEICgqZ2V0X3NlbnNvcnNfbGlzdCkoKQotICoKLSAqIFNFTlNPUl9UWVBFX01FVEFfREFUQSBpcyBhIHNwZWNpYWwgdG9rZW4gdXNlZCB0byBwb3B1bGF0ZSB0aGUKLSAqIHNlbnNvcnNfbWV0YV9kYXRhX2V2ZW50IHN0cnVjdHVyZS4gSXQgZG9lc24ndCBjb3JyZXNwb25kIHRvIGEgcGh5c2ljYWwKLSAqIHNlbnNvci4gc2Vuc29yc19tZXRhX2RhdGFfZXZlbnQgYXJlIHNwZWNpYWwsIHRoZXkgZXhpc3Qgb25seSBpbnNpZGUKLSAqIHRoZSBIQUwgYW5kIGFyZSBnZW5lcmF0ZWQgc3BvbnRhbmVvdXNseSwgYXMgb3Bwb3NlZCB0byBiZSByZWxhdGVkIHRvCi0gKiBhIHBoeXNpY2FsIHNlbnNvci4KLSAqCi0gKiAgIHNlbnNvcnNfbWV0YV9kYXRhX2V2ZW50X3QudmVyc2lvbiBtdXN0IGJlIE1FVEFfREFUQV9WRVJTSU9OCi0gKiAgIHNlbnNvcnNfbWV0YV9kYXRhX2V2ZW50X3Quc2Vuc29yIG11c3QgYmUgMAotICogICBzZW5zb3JzX21ldGFfZGF0YV9ldmVudF90LnR5cGUgbXVzdCBiZSBTRU5TT1JfVFlQRV9NRVRBX0RBVEEKLSAqICAgc2Vuc29yc19tZXRhX2RhdGFfZXZlbnRfdC5yZXNlcnZlZCBtdXN0IGJlIDAKLSAqICAgc2Vuc29yc19tZXRhX2RhdGFfZXZlbnRfdC50aW1lc3RhbXAgbXVzdCBiZSAwCi0gKgotICogVGhlIHBheWxvYWQgaXMgYSBtZXRhX2RhdGFfZXZlbnRfdCwgd2hlcmU6Ci0gKiBtZXRhX2RhdGFfZXZlbnRfdC53aGF0IGNhbiB0YWtlIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotICoKLSAqIE1FVEFfREFUQV9GTFVTSF9DT01QTEVURQotICogICBUaGlzIGV2ZW50IGluZGljYXRlcyB0aGF0IGEgcHJldmlvdXMgKCpmbHVzaCkoKSBjYWxsIGhhcyBjb21wbGV0ZWQgZm9yIHRoZSBzZW5zb3IKLSAqICAgaGFuZGxlIHNwZWNpZmllZCBpbiBtZXRhX2RhdGFfZXZlbnRfdC5zZW5zb3IuCi0gKiAgIHNlZSAoKmZsdXNoKSgpIGZvciBtb3JlIGRldGFpbHMKLSAqCi0gKiBBbGwgb3RoZXIgdmFsdWVzIGZvciBtZXRhX2RhdGFfZXZlbnRfdC53aGF0IGFyZSByZXNlcnZlZCBhbmQKLSAqIG11c3Qgbm90IGJlIHVzZWQuCi0gKgotICovCi0jZGVmaW5lIFNFTlNPUl9UWVBFX01FVEFfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICgwKQotCi0vKgotICAqIFdha2UgdXAgc2Vuc29ycy4KLSAgKiBFYWNoIHNlbnNvciBtYXkgaGF2ZSBlaXRoZXIgb3IgYm90aCBhIHdha2UtdXAgYW5kIGEgbm9uLXdha2UgdmFyaWFudC4KLSAgKiBXaGVuIHJlZ2lzdGVyZWQgaW4gYmF0Y2ggbW9kZSwgd2FrZS11cCBzZW5zb3JzIHdpbGwgd2FrZSB1cCB0aGUgQVAgd2hlbgotICAqIHRoZWlyIEZJRk9zIGFyZSBmdWxsIG9yIHdoZW4gdGhlIGJhdGNoIHRpbWVvdXQgZXhwaXJlcy4gQSBzZXBhcmF0ZSBGSUZPIGhhcwotICAqIHRvIGJlIG1haW50YWluZWQgZm9yIHdha2UgdXAgc2Vuc29ycyBhbmQgbm9uIHdha2UgdXAgc2Vuc29ycy4gVGhlIG5vbiB3YWtlLXVwCi0gICogc2Vuc29ycyBuZWVkIHRvIG92ZXJ3cml0ZSB0aGVpciBGSUZPcyB3aGVuIHRoZXkgYXJlIGZ1bGwgdGlsbCB0aGUgQVAgd2FrZXMgdXAKLSAgKiBhbmQgdGhlIHdha2UtdXAgc2Vuc29ycyB3aWxsIHdha2UtdXAgdGhlIEFQIHdoZW4gdGhlaXIgRklGT3MgYXJlIGZ1bGwgb3Igd2hlbgotICAqIHRoZSBiYXRjaCB0aW1lb3V0IGV4cGlyZXMgd2l0aG91dCBsb3NpbmcgZXZlbnRzLiBXYWtlLXVwIGFuZCBub24gd2FrZS11cCB2YXJpYW50cwotICAqIG9mIGVhY2ggc2Vuc29yIGNhbiBiZSBhY3RpdmF0ZWQgYXQgZGlmZmVyZW50IHJhdGVzIGluZGVwZW5kZW50bHkgb2YgZWFjaCBvdGhlci4KLSAgKgotICAqIE5vdGU6IFByb3hpbWl0eSBzZW5zb3IgYW5kIHNpZ25pZmljYW50IG1vdGlvbiBzZW5zb3Igd2hpY2ggd2VyZSBkZWZpbmVkIGluIHByZXZpb3VzCi0gICogcmVsZWFzZXMgYXJlIGFsc28gd2FrZS11cCBzZW5zb3JzIGFuZCBzaG91bGQgYmUgdHJlYXRlZCBhcyBzdWNoLiBXYWtlLXVwIG9uZS1zaG90Ci0gICogc2Vuc29ycyBsaWtlIFNJR05JRklDQU5UX01PVElPTiBjYW5ub3QgYmUgYmF0Y2hlZCwgaGVuY2UgdGhlIHRleHQgYWJvdXQgYmF0Y2ggYWJvdmUKLSAgKiBkb2Vzbid0IGFwcGx5IHRvIHRoZW0uIFNlZSB0aGUgZGVmaW5pdGlvbnMgb2YgU0VOU09SX1RZUEVfUFJPWElNSVRZIGFuZAotICAqIFNFTlNPUl9UWVBFX1NJR05JRklDQU5UX01PVElPTiBmb3IgbW9yZSBpbmZvLgotICAqCi0gICogU2V0IFNFTlNPUl9GTEFHX1dBS0VfVVAgZmxhZyBmb3IgYWxsIHdha2UtdXAgc2Vuc29ycy4KLSAgKgotICAqIEZvciBleGFtcGxlLCBBIGRldmljZSBjYW4gaGF2ZSB0d28gc2Vuc29ycyBib3RoIG9mIFNFTlNPUl9UWVBFX0FDQ0VMRVJPTUVURVIgYW5kCi0gICogb25lIG9mIHRoZW0gY2FuIGJlIGEgd2FrZV91cCBzZW5zb3IgKHdpdGggU0VOU09SX0ZMQUdfV0FLRV9VUCBmbGFnIHNldCkgYW5kIHRoZSBvdGhlcgotICAqIGNhbiBiZSBhIHJlZ3VsYXIgbm9uIHdha2VfdXAgc2Vuc29yLiBCb3RoIG9mIHRoZXNlIHNlbnNvcnMgbXVzdCBiZSBhY3RpdmF0ZWQvZGVhY3RpdmF0ZWQKLSAgKiBpbmRlcGVuZGVudGx5IG9mIHRoZSBvdGhlci4KLSAgKi8KLQotLyoKLSAqIFNFTlNPUl9UWVBFX0FDQ0VMRVJPTUVURVIKLSAqIHJlcG9ydGluZy1tb2RlOiBjb250aW51b3VzCi0gKgotICogIEFsbCB2YWx1ZXMgYXJlIGluIFNJIHVuaXRzIChtL3NeMikgYW5kIG1lYXN1cmUgdGhlIGFjY2VsZXJhdGlvbiBvZiB0aGUKLSAqICBkZXZpY2UgbWludXMgdGhlIGZvcmNlIG9mIGdyYXZpdHkuCi0gKgotICogIEltcGxlbWVudCB0aGUgbm9uLXdha2UtdXAgdmVyc2lvbiBvZiB0aGlzIHNlbnNvciBhbmQgaW1wbGVtZW50IHRoZSB3YWtlLXVwCi0gKiAgdmVyc2lvbiBpZiB0aGUgc3lzdGVtIHBvc3Nlc3NlcyBhIHdha2UgdXAgZmlmby4KLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9BQ0NFTEVST01FVEVSICAgICAgICAgICAgICAgICAgICAoMSkKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0FDQ0VMRVJPTUVURVIgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLmFjY2VsZXJvbWV0ZXIiCi0KLS8qCi0gKiBTRU5TT1JfVFlQRV9HRU9NQUdORVRJQ19GSUVMRAotICogcmVwb3J0aW5nLW1vZGU6IGNvbnRpbnVvdXMKLSAqCi0gKiAgQWxsIHZhbHVlcyBhcmUgaW4gbWljcm8tVGVzbGEgKHVUKSBhbmQgbWVhc3VyZSB0aGUgZ2VvbWFnbmV0aWMKLSAqICBmaWVsZCBpbiB0aGUgWCwgWSBhbmQgWiBheGlzLgotICoKLSAqICBJbXBsZW1lbnQgdGhlIG5vbi13YWtlLXVwIHZlcnNpb24gb2YgdGhpcyBzZW5zb3IgYW5kIGltcGxlbWVudCB0aGUgd2FrZS11cAotICogIHZlcnNpb24gaWYgdGhlIHN5c3RlbSBwb3NzZXNzZXMgYSB3YWtlIHVwIGZpZm8uCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfR0VPTUFHTkVUSUNfRklFTEQgICAgICAgICAgICAgICAgKDIpCi0jZGVmaW5lIFNFTlNPUl9UWVBFX01BR05FVElDX0ZJRUxEICBTRU5TT1JfVFlQRV9HRU9NQUdORVRJQ19GSUVMRAotI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfTUFHTkVUSUNfRklFTEQgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IubWFnbmV0aWNfZmllbGQiCi0KLS8qCi0gKiBTRU5TT1JfVFlQRV9PUklFTlRBVElPTgotICogcmVwb3J0aW5nLW1vZGU6IGNvbnRpbnVvdXMKLSAqCi0gKiBBbGwgdmFsdWVzIGFyZSBhbmdsZXMgaW4gZGVncmVlcy4KLSAqCi0gKiBPcmllbnRhdGlvbiBzZW5zb3JzIHJldHVybiBzZW5zb3IgZXZlbnRzIGZvciBhbGwgMyBheGVzIGF0IGEgY29uc3RhbnQKLSAqIHJhdGUgZGVmaW5lZCBieSBzZXREZWxheSgpLgotICoKLSAqIEltcGxlbWVudCB0aGUgbm9uLXdha2UtdXAgdmVyc2lvbiBvZiB0aGlzIHNlbnNvciBhbmQgaW1wbGVtZW50IHRoZSB3YWtlLXVwCi0gKiB2ZXJzaW9uIGlmIHRoZSBzeXN0ZW0gcG9zc2Vzc2VzIGEgd2FrZSB1cCBmaWZvLgotICovCi0jZGVmaW5lIFNFTlNPUl9UWVBFX09SSUVOVEFUSU9OICAgICAgICAgICAgICAgICAgICAgICgzKQotI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfT1JJRU5UQVRJT04gICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3Iub3JpZW50YXRpb24iCi0KLS8qCi0gKiBTRU5TT1JfVFlQRV9HWVJPU0NPUEUKLSAqIHJlcG9ydGluZy1tb2RlOiBjb250aW51b3VzCi0gKgotICogIEFsbCB2YWx1ZXMgYXJlIGluIHJhZGlhbnMvc2Vjb25kIGFuZCBtZWFzdXJlIHRoZSByYXRlIG9mIHJvdGF0aW9uCi0gKiAgYXJvdW5kIHRoZSBYLCBZIGFuZCBaIGF4aXMuCi0gKgotICogIEltcGxlbWVudCB0aGUgbm9uLXdha2UtdXAgdmVyc2lvbiBvZiB0aGlzIHNlbnNvciBhbmQgaW1wbGVtZW50IHRoZSB3YWtlLXVwCi0gKiAgdmVyc2lvbiBpZiB0aGUgc3lzdGVtIHBvc3Nlc3NlcyBhIHdha2UgdXAgZmlmby4KLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9HWVJPU0NPUEUgICAgICAgICAgICAgICAgICAgICAgICAoNCkKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0dZUk9TQ09QRSAgICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLmd5cm9zY29wZSIKLQotLyoKLSAqIFNFTlNPUl9UWVBFX0xJR0hUCi0gKiByZXBvcnRpbmctbW9kZTogb24tY2hhbmdlCi0gKgotICogVGhlIGxpZ2h0IHNlbnNvciB2YWx1ZSBpcyByZXR1cm5lZCBpbiBTSSBsdXggdW5pdHMuCi0gKgotICogQm90aCB3YWtlLXVwIGFuZCBub24gd2FrZS11cCB2ZXJzaW9ucyBhcmUgdXNlZnVsLgotICovCi0jZGVmaW5lIFNFTlNPUl9UWVBFX0xJR0hUICAgICAgICAgICAgICAgICAgICAgICAgICAgICg1KQotI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfTElHSFQgICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IubGlnaHQiCi0KLS8qCi0gKiBTRU5TT1JfVFlQRV9QUkVTU1VSRQotICogcmVwb3J0aW5nLW1vZGU6IGNvbnRpbnVvdXMKLSAqCi0gKiBUaGUgcHJlc3N1cmUgc2Vuc29yIHJldHVybiB0aGUgYXRobW9zcGhlcmljIHByZXNzdXJlIGluIGhlY3RvcGFzY2FsIChoUGEpCi0gKgotICogSW1wbGVtZW50IHRoZSBub24td2FrZS11cCB2ZXJzaW9uIG9mIHRoaXMgc2Vuc29yIGFuZCBpbXBsZW1lbnQgdGhlIHdha2UtdXAKLSAqIHZlcnNpb24gaWYgdGhlIHN5c3RlbSBwb3NzZXNzZXMgYSB3YWtlIHVwIGZpZm8uCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfUFJFU1NVUkUgICAgICAgICAgICAgICAgICAgICAgICAgKDYpCi0jZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9QUkVTU1VSRSAgICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5wcmVzc3VyZSIKLQotLyogU0VOU09SX1RZUEVfVEVNUEVSQVRVUkUgaXMgZGVwcmVjYXRlZCBpbiB0aGUgSEFMICovCi0jZGVmaW5lIFNFTlNPUl9UWVBFX1RFTVBFUkFUVVJFICAgICAgICAgICAgICAgICAgICAgICg3KQotI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfVEVNUEVSQVRVUkUgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IudGVtcGVyYXR1cmUiCi0KLS8qCi0gKiBTRU5TT1JfVFlQRV9QUk9YSU1JVFkKLSAqIHJlcG9ydGluZy1tb2RlOiBvbi1jaGFuZ2UKLSAqCi0gKiBUaGUgcHJveGltaXR5IHNlbnNvciB3aGljaCB0dXJucyB0aGUgc2NyZWVuIG9mZiBhbmQgYmFjayBvbiBkdXJpbmcgY2FsbHMgaXMgdGhlCi0gKiB3YWtlLXVwIHByb3hpbWl0eSBzZW5zb3IuIEltcGxlbWVudCB3YWtlLXVwIHByb3hpbWl0eSBzZW5zb3IgYmVmb3JlIGltcGxlbWVudGluZwotICogYSBub24gd2FrZS11cCBwcm94aW1pdHkgc2Vuc29yLiBGb3IgdGhlIHdha2UtdXAgcHJveGltaXR5IHNlbnNvciBzZXQgdGhlIGZsYWcKLSAqIFNFTlNPUl9GTEFHX1dBS0VfVVAuCi0gKiBUaGUgdmFsdWUgY29ycmVzcG9uZHMgdG8gdGhlIGRpc3RhbmNlIHRvIHRoZSBuZWFyZXN0IG9iamVjdCBpbiBjZW50aW1ldGVycy4KLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9QUk9YSU1JVFkgICAgICAgICAgICAgICAgICAgICAgICAoOCkKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX1BST1hJTUlUWSAgICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLnByb3hpbWl0eSIKLQotLyoKLSAqIFNFTlNPUl9UWVBFX0dSQVZJVFkKLSAqIHJlcG9ydGluZy1tb2RlOiBjb250aW51b3VzCi0gKgotICogQSBncmF2aXR5IG91dHB1dCBpbmRpY2F0ZXMgdGhlIGRpcmVjdGlvbiBvZiBhbmQgbWFnbml0dWRlIG9mIGdyYXZpdHkgaW4KLSAqIHRoZSBkZXZpY2VzJ3MgY29vcmRpbmF0ZXMuCi0gKgotICogSW1wbGVtZW50IHRoZSBub24td2FrZS11cCB2ZXJzaW9uIG9mIHRoaXMgc2Vuc29yIGFuZCBpbXBsZW1lbnQgdGhlIHdha2UtdXAKLSAqIHZlcnNpb24gaWYgdGhlIHN5c3RlbSBwb3NzZXNzZXMgYSB3YWtlIHVwIGZpZm8uCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfR1JBVklUWSAgICAgICAgICAgICAgICAgICAgICAgICAgKDkpCi0jZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9HUkFWSVRZICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5ncmF2aXR5IgotCi0vKgotICogU0VOU09SX1RZUEVfTElORUFSX0FDQ0VMRVJBVElPTgotICogcmVwb3J0aW5nLW1vZGU6IGNvbnRpbnVvdXMKLSAqCi0gKiBJbmRpY2F0ZXMgdGhlIGxpbmVhciBhY2NlbGVyYXRpb24gb2YgdGhlIGRldmljZSBpbiBkZXZpY2UgY29vcmRpbmF0ZXMsCi0gKiBub3QgaW5jbHVkaW5nIGdyYXZpdHkuCi0gKgotICogSW1wbGVtZW50IHRoZSBub24td2FrZS11cCB2ZXJzaW9uIG9mIHRoaXMgc2Vuc29yIGFuZCBpbXBsZW1lbnQgdGhlIHdha2UtdXAKLSAqIHZlcnNpb24gaWYgdGhlIHN5c3RlbSBwb3NzZXNzZXMgYSB3YWtlIHVwIGZpZm8uCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfTElORUFSX0FDQ0VMRVJBVElPTiAgICAgICAgICAgICAoMTApCi0jZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9MSU5FQVJfQUNDRUxFUkFUSU9OICAgICAgImFuZHJvaWQuc2Vuc29yLmxpbmVhcl9hY2NlbGVyYXRpb24iCi0KLQotLyoKLSAqIFNFTlNPUl9UWVBFX1JPVEFUSU9OX1ZFQ1RPUgotICogcmVwb3J0aW5nLW1vZGU6IGNvbnRpbnVvdXMKLSAqCi0gKiBUaGUgcm90YXRpb24gdmVjdG9yIHN5bWJvbGl6ZXMgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBkZXZpY2UgcmVsYXRpdmUgdG8gdGhlCi0gKiBFYXN0LU5vcnRoLVVwIGNvb3JkaW5hdGVzIGZyYW1lLgotICoKLSAqIEltcGxlbWVudCB0aGUgbm9uLXdha2UtdXAgdmVyc2lvbiBvZiB0aGlzIHNlbnNvciBhbmQgaW1wbGVtZW50IHRoZSB3YWtlLXVwCi0gKiB2ZXJzaW9uIGlmIHRoZSBzeXN0ZW0gcG9zc2Vzc2VzIGEgd2FrZSB1cCBmaWZvLgotICovCi0jZGVmaW5lIFNFTlNPUl9UWVBFX1JPVEFUSU9OX1ZFQ1RPUiAgICAgICAgICAgICAgICAgKDExKQotI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfUk9UQVRJT05fVkVDVE9SICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5yb3RhdGlvbl92ZWN0b3IiCi0KLS8qCi0gKiBTRU5TT1JfVFlQRV9SRUxBVElWRV9IVU1JRElUWQotICogcmVwb3J0aW5nLW1vZGU6IG9uLWNoYW5nZQotICoKLSAqIEEgcmVsYXRpdmUgaHVtaWRpdHkgc2Vuc29yIG1lYXN1cmVzIHJlbGF0aXZlIGFtYmllbnQgYWlyIGh1bWlkaXR5IGFuZAotICogcmV0dXJucyBhIHZhbHVlIGluIHBlcmNlbnQuCi0gKgotICogQm90aCB3YWtlLXVwIGFuZCBub24gd2FrZS11cCB2ZXJzaW9ucyBhcmUgdXNlZnVsLgotICovCi0jZGVmaW5lIFNFTlNPUl9UWVBFX1JFTEFUSVZFX0hVTUlESVRZICAgICAgICAgICAgICAgKDEyKQotI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfUkVMQVRJVkVfSFVNSURJVFkgICAgICAgICJhbmRyb2lkLnNlbnNvci5yZWxhdGl2ZV9odW1pZGl0eSIKLQotLyoKLSAqIFNFTlNPUl9UWVBFX0FNQklFTlRfVEVNUEVSQVRVUkUKLSAqIHJlcG9ydGluZy1tb2RlOiBvbi1jaGFuZ2UKLSAqCi0gKiBUaGUgYW1iaWVudCAocm9vbSkgdGVtcGVyYXR1cmUgaW4gZGVncmVlIENlbHNpdXMuCi0gKgotICogQm90aCB3YWtlLXVwIGFuZCBub24gd2FrZS11cCB2ZXJzaW9ucyBhcmUgdXNlZnVsLgotICovCi0jZGVmaW5lIFNFTlNPUl9UWVBFX0FNQklFTlRfVEVNUEVSQVRVUkUgICAgICAgICAgICAgKDEzKQotI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfQU1CSUVOVF9URU1QRVJBVFVSRSAgICAgICJhbmRyb2lkLnNlbnNvci5hbWJpZW50X3RlbXBlcmF0dXJlIgotCi0vKgotICogU0VOU09SX1RZUEVfTUFHTkVUSUNfRklFTERfVU5DQUxJQlJBVEVECi0gKiByZXBvcnRpbmctbW9kZTogY29udGludW91cwotICoKLSAqICBTaW1pbGFyIHRvIFNFTlNPUl9UWVBFX01BR05FVElDX0ZJRUxELCBidXQgdGhlIGhhcmQgaXJvbiBjYWxpYnJhdGlvbiBpcwotICogIHJlcG9ydGVkIHNlcGFyYXRlbHkgaW5zdGVhZCBvZiBiZWluZyBpbmNsdWRlZCBpbiB0aGUgbWVhc3VyZW1lbnQuCi0gKgotICogIEltcGxlbWVudCB0aGUgbm9uLXdha2UtdXAgdmVyc2lvbiBvZiB0aGlzIHNlbnNvciBhbmQgaW1wbGVtZW50IHRoZSB3YWtlLXVwCi0gKiAgdmVyc2lvbiBpZiB0aGUgc3lzdGVtIHBvc3Nlc3NlcyBhIHdha2UgdXAgZmlmby4KLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9NQUdORVRJQ19GSUVMRF9VTkNBTElCUkFURUQgICAgICgxNCkKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX01BR05FVElDX0ZJRUxEX1VOQ0FMSUJSQVRFRCAiYW5kcm9pZC5zZW5zb3IubWFnbmV0aWNfZmllbGRfdW5jYWxpYnJhdGVkIgotCi0vKgotICogU0VOU09SX1RZUEVfR0FNRV9ST1RBVElPTl9WRUNUT1IKLSAqIHJlcG9ydGluZy1tb2RlOiBjb250aW51b3VzCi0gKgotICogIFNpbWlsYXIgdG8gU0VOU09SX1RZUEVfUk9UQVRJT05fVkVDVE9SLCBidXQgbm90IHVzaW5nIHRoZSBnZW9tYWduZXRpYwotICogIGZpZWxkLgotICoKLSAqICBJbXBsZW1lbnQgdGhlIG5vbi13YWtlLXVwIHZlcnNpb24gb2YgdGhpcyBzZW5zb3IgYW5kIGltcGxlbWVudCB0aGUgd2FrZS11cAotICogIHZlcnNpb24gaWYgdGhlIHN5c3RlbSBwb3NzZXNzZXMgYSB3YWtlIHVwIGZpZm8uCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfR0FNRV9ST1RBVElPTl9WRUNUT1IgICAgICAgICAgICAoMTUpCi0jZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9HQU1FX1JPVEFUSU9OX1ZFQ1RPUiAgICAgImFuZHJvaWQuc2Vuc29yLmdhbWVfcm90YXRpb25fdmVjdG9yIgotCi0vKgotICogU0VOU09SX1RZUEVfR1lST1NDT1BFX1VOQ0FMSUJSQVRFRAotICogcmVwb3J0aW5nLW1vZGU6IGNvbnRpbnVvdXMKLSAqCi0gKiAgQWxsIHZhbHVlcyBhcmUgaW4gcmFkaWFucy9zZWNvbmQgYW5kIG1lYXN1cmUgdGhlIHJhdGUgb2Ygcm90YXRpb24KLSAqICBhcm91bmQgdGhlIFgsIFkgYW5kIFogYXhpcy4KLSAqCi0gKiAgSW1wbGVtZW50IHRoZSBub24td2FrZS11cCB2ZXJzaW9uIG9mIHRoaXMgc2Vuc29yIGFuZCBpbXBsZW1lbnQgdGhlIHdha2UtdXAKLSAqICB2ZXJzaW9uIGlmIHRoZSBzeXN0ZW0gcG9zc2Vzc2VzIGEgd2FrZSB1cCBmaWZvLgotICovCi0jZGVmaW5lIFNFTlNPUl9UWVBFX0dZUk9TQ09QRV9VTkNBTElCUkFURUQgICAgICAgICAgKDE2KQotI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfR1lST1NDT1BFX1VOQ0FMSUJSQVRFRCAgICJhbmRyb2lkLnNlbnNvci5neXJvc2NvcGVfdW5jYWxpYnJhdGVkIgotCi0vKgotICogU0VOU09SX1RZUEVfU0lHTklGSUNBTlRfTU9USU9OCi0gKiByZXBvcnRpbmctbW9kZTogb25lLXNob3QKLSAqCi0gKiBBIHNlbnNvciBvZiB0aGlzIHR5cGUgdHJpZ2dlcnMgYW4gZXZlbnQgZWFjaCB0aW1lIHNpZ25pZmljYW50IG1vdGlvbgotICogaXMgZGV0ZWN0ZWQgYW5kIGF1dG9tYXRpY2FsbHkgZGlzYWJsZXMgaXRzZWxmLgotICogRm9yIFNpZ25pZmljYW50IE1vdGlvbiBzZW5zb3IgdG8gYmUgdXNlZnVsLCBpdCBtdXN0IGJlIGRlZmluZWQgYXMgYQotICogd2FrZS11cCBzZW5zb3IuIChzZXQgU0VOU09SX0ZMQUdfV0FLRV9VUCkuIEltcGxlbWVudCB0aGUgd2FrZS11cCBzaWduaWZpY2FudCBtb3Rpb24KLSAqIHNlbnNvci4gQSBub24gd2FrZS11cCB2ZXJzaW9uIGlzIG5vdCB1c2VmdWwuCi0gKiBUaGUgb25seSBhbGxvd2VkIHZhbHVlIHRvIHJldHVybiBpcyAxLjAuCi0gKi8KLQotI2RlZmluZSBTRU5TT1JfVFlQRV9TSUdOSUZJQ0FOVF9NT1RJT04gICAgICAgICAgICAgICgxNykKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX1NJR05JRklDQU5UX01PVElPTiAgICAgICAiYW5kcm9pZC5zZW5zb3Iuc2lnbmlmaWNhbnRfbW90aW9uIgotCi0vKgotICogU0VOU09SX1RZUEVfU1RFUF9ERVRFQ1RPUgotICogcmVwb3J0aW5nLW1vZGU6IHNwZWNpYWwKLSAqCi0gKiBBIHNlbnNvciBvZiB0aGlzIHR5cGUgdHJpZ2dlcnMgYW4gZXZlbnQgZWFjaCB0aW1lIGEgc3RlcCBpcyB0YWtlbgotICogYnkgdGhlIHVzZXIuIFRoZSBvbmx5IGFsbG93ZWQgdmFsdWUgdG8gcmV0dXJuIGlzIDEuMCBhbmQgYW4gZXZlbnQKLSAqIGlzIGdlbmVyYXRlZCBmb3IgZWFjaCBzdGVwLgotICoKLSAqIEJvdGggd2FrZS11cCBhbmQgbm9uIHdha2UtdXAgdmVyc2lvbnMgYXJlIHVzZWZ1bC4KLSAqLwotCi0jZGVmaW5lIFNFTlNPUl9UWVBFX1NURVBfREVURUNUT1IgICAgICAgICAgICAgICAgICAgKDE4KQotI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfU1RFUF9ERVRFQ1RPUiAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5zdGVwX2RldGVjdG9yIgotCi0KLS8qCi0gKiBTRU5TT1JfVFlQRV9TVEVQX0NPVU5URVIKLSAqIHJlcG9ydGluZy1tb2RlOiBvbi1jaGFuZ2UKLSAqCi0gKiBBIHNlbnNvciBvZiB0aGlzIHR5cGUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHN0ZXBzIHRha2VuIGJ5IHRoZSB1c2VyIHNpbmNlCi0gKiB0aGUgbGFzdCByZWJvb3Qgd2hpbGUgYWN0aXZhdGVkLiBUaGUgdmFsdWUgaXMgcmV0dXJuZWQgYXMgYSB1aW50NjRfdCBhbmQgaXMKLSAqIHJlc2V0IHRvIHplcm8gb25seSBvbiBhIHN5c3RlbSAvIGFuZHJvaWQgcmVib290LgotICoKLSAqIEltcGxlbWVudCB0aGUgbm9uLXdha2UtdXAgdmVyc2lvbiBvZiB0aGlzIHNlbnNvciBhbmQgaW1wbGVtZW50IHRoZSB3YWtlLXVwCi0gKiB2ZXJzaW9uIGlmIHRoZSBzeXN0ZW0gcG9zc2Vzc2VzIGEgd2FrZSB1cCBmaWZvLgotICovCi0KLSNkZWZpbmUgU0VOU09SX1RZUEVfU1RFUF9DT1VOVEVSICAgICAgICAgICAgICAgICAgICAoMTkpCi0jZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9TVEVQX0NPVU5URVIgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLnN0ZXBfY291bnRlciIKLQotLyoKLSAqIFNFTlNPUl9UWVBFX0dFT01BR05FVElDX1JPVEFUSU9OX1ZFQ1RPUgotICogcmVwb3J0aW5nLW1vZGU6IGNvbnRpbnVvdXMKLSAqCi0gKiAgU2ltaWxhciB0byBTRU5TT1JfVFlQRV9ST1RBVElPTl9WRUNUT1IsIGJ1dCB1c2luZyBhIG1hZ25ldG9tZXRlciBpbnN0ZWFkCi0gKiAgb2YgdXNpbmcgYSBneXJvc2NvcGUuCi0gKgotICogSW1wbGVtZW50IHRoZSBub24td2FrZS11cCB2ZXJzaW9uIG9mIHRoaXMgc2Vuc29yIGFuZCBpbXBsZW1lbnQgdGhlIHdha2UtdXAKLSAqIHZlcnNpb24gaWYgdGhlIHN5c3RlbSBwb3NzZXNzZXMgYSB3YWtlIHVwIGZpZm8uCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfR0VPTUFHTkVUSUNfUk9UQVRJT05fVkVDVE9SICAgICAoMjApCi0jZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9HRU9NQUdORVRJQ19ST1RBVElPTl9WRUNUT1IgImFuZHJvaWQuc2Vuc29yLmdlb21hZ25ldGljX3JvdGF0aW9uX3ZlY3RvciIKLQotLyoKLSAqIFNFTlNPUl9UWVBFX0hFQVJUX1JBVEUKLSAqIHJlcG9ydGluZy1tb2RlOiBvbi1jaGFuZ2UKLSAqCi0gKiAgQSBzZW5zb3Igb2YgdGhpcyB0eXBlIHJldHVybnMgdGhlIGN1cnJlbnQgaGVhcnQgcmF0ZS4KLSAqICBUaGUgZXZlbnRzIGNvbnRhaW4gdGhlIGN1cnJlbnQgaGVhcnQgcmF0ZSBpbiBiZWF0cyBwZXIgbWludXRlIChCUE0pIGFuZCB0aGUKLSAqICBzdGF0dXMgb2YgdGhlIHNlbnNvciBkdXJpbmcgdGhlIG1lYXN1cmVtZW50LiBTZWUgaGVhcnRfcmF0ZV9ldmVudF90IGZvciBtb3JlCi0gKiAgZGV0YWlscy4KLSAqCi0gKiAgQmVjYXVzZSB0aGlzIHNlbnNvciBpcyBvbi1jaGFuZ2UsIGV2ZW50cyBtdXN0IGJlIGdlbmVyYXRlZCB3aGVuIGFuZCBvbmx5Ci0gKiAgd2hlbiBoZWFydF9yYXRlLmJwbSBvciBoZWFydF9yYXRlLnN0YXR1cyBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QKLSAqICBldmVudC4gSW4gcGFydGljdWxhciwgdXBvbiB0aGUgZmlyc3QgYWN0aXZhdGlvbiwgdW5sZXNzIHRoZSBkZXZpY2UgaXMga25vd24KLSAqICB0byBub3QgYmUgb24gdGhlIGJvZHksIHRoZSBzdGF0dXMgZmllbGQgb2YgdGhlIGZpcnN0IGV2ZW50IG11c3QgYmUgc2V0IHRvCi0gKiAgU0VOU09SX1NUQVRVU19VTlJFTElBQkxFLiBUaGUgZXZlbnQgc2hvdWxkIGJlIGdlbmVyYXRlZCBubyBmYXN0ZXIgdGhhbiBldmVyeQotICogIHBlcmlvZF9ucyBwYXNzZWQgdG8gc2V0RGVsYXkoKSBvciB0byBiYXRjaCgpLgotICogIFNlZSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgb24tY2hhbmdlIHJlcG9ydGluZyBtb2RlIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICoKLSAqICBzZW5zb3JfdC5yZXF1aXJlZFBlcm1pc3Npb24gbXVzdCBiZSBzZXQgdG8gU0VOU09SX1BFUk1JU1NJT05fQk9EWV9TRU5TT1JTLgotICoKLSAqICBCb3RoIHdha2UtdXAgYW5kIG5vbiB3YWtlLXVwIHZlcnNpb25zIGFyZSB1c2VmdWwuCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfSEVBUlRfUkFURSAgICAgICAgICAgICAgICAgICAgICAoMjEpCi0jZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9IRUFSVF9SQVRFICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLmhlYXJ0X3JhdGUiCi0KLS8qCi0gKiBTRU5TT1JfVFlQRV9XQUtFX1VQX1RJTFRfREVURUNUT1IKLSAqIHJlcG9ydGluZy1tb2RlOiBzcGVjaWFsIChzZXREZWxheSBoYXMgbm8gaW1wYWN0KQotICoKLSAqIEEgc2Vuc29yIG9mIHRoaXMgdHlwZSBnZW5lcmF0ZXMgYW4gZXZlbnQgZWFjaCB0aW1lIGEgdGlsdCBldmVudCBpcyBkZXRlY3RlZC4gQSB0aWx0IGV2ZW50Ci0gKiBzaG91bGQgYmUgZ2VuZXJhdGVkIGlmIHRoZSBkaXJlY3Rpb24gb2YgdGhlIDItc2Vjb25kcyB3aW5kb3cgYXZlcmFnZSBncmF2aXR5IGNoYW5nZWQgYnkgYXQgbGVhc3QKLSAqIDM1IGRlZ3JlZXMgc2luY2UgdGhlIGFjdGl2YXRpb24gb3IgdGhlIGxhc3QgdHJpZ2dlciBvZiB0aGUgc2Vuc29yLgotICogICAgIHJlZmVyZW5jZV9lc3RpbWF0ZWRfZ3Jhdml0eSA9IGF2ZXJhZ2Ugb2YgYWNjZWxlcm9tZXRlciBtZWFzdXJlbWVudHMgb3ZlciB0aGUgZmlyc3QKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSBzZWNvbmQgYWZ0ZXIgYWN0aXZhdGlvbiBvciB0aGUgZXN0aW1hdGVkIGdyYXZpdHkgYXQgdGhlIGxhc3QKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlci4KLSAqICAgICBjdXJyZW50X2VzdGltYXRlZF9ncmF2aXR5ID0gYXZlcmFnZSBvZiBhY2NlbGVyb21ldGVyIG1lYXN1cmVtZW50cyBvdmVyIHRoZSBsYXN0IDIgc2Vjb25kcy4KLSAqICAgICB0cmlnZ2VyIHdoZW4gYW5nbGUgKHJlZmVyZW5jZV9lc3RpbWF0ZWRfZ3Jhdml0eSwgY3VycmVudF9lc3RpbWF0ZWRfZ3Jhdml0eSkgPiAzNSBkZWdyZWVzCi0gKgotICogTGFyZ2UgYWNjZWxlcmF0aW9ucyB3aXRob3V0IGEgY2hhbmdlIGluIHBob25lIG9yaWVudGF0aW9uIHNob3VsZCBub3QgdHJpZ2dlciBhIHRpbHQgZXZlbnQuCi0gKiBGb3IgZXhhbXBsZSwgYSBzaGFycCB0dXJuIG9yIHN0cm9uZyBhY2NlbGVyYXRpb24gd2hpbGUgZHJpdmluZyBhIGNhciBzaG91bGQgbm90IHRyaWdnZXIgYSB0aWx0Ci0gKiBldmVudCwgZXZlbiB0aG91Z2ggdGhlIGFuZ2xlIG9mIHRoZSBhdmVyYWdlIGFjY2VsZXJhdGlvbiBtaWdodCB2YXJ5IGJ5IG1vcmUgdGhhbiAzNSBkZWdyZWVzLgotICoKLSAqIFR5cGljYWxseSwgdGhpcyBzZW5zb3IgaXMgaW1wbGVtZW50ZWQgd2l0aCB0aGUgaGVscCBvZiBvbmx5IGFuIGFjY2VsZXJvbWV0ZXIuIE90aGVyIHNlbnNvcnMgY2FuCi0gKiBiZSB1c2VkIGFzIHdlbGwgaWYgdGhleSBkbyBub3QgaW5jcmVhc2UgdGhlIHBvd2VyIGNvbnN1bXB0aW9uIHNpZ25pZmljYW50bHkuIFRoaXMgaXMgYSBsb3cgcG93ZXIKLSAqIHNlbnNvciB0aGF0IHNob3VsZCBhbGxvdyB0aGUgQVAgdG8gZ28gaW50byBzdXNwZW5kIG1vZGUuIERvIG5vdCBlbXVsYXRlIHRoaXMgc2Vuc29yIGluIHRoZSBIQUwuCi0gKiBMaWtlIG90aGVyIHdha2UgdXAgc2Vuc29ycywgdGhlIGRyaXZlciBpcyBleHBlY3RlZCB0byBhIGhvbGQgYSB3YWtlX2xvY2sgd2l0aCBhIHRpbWVvdXQgb2YgMjAwIG1zCi0gKiB3aGlsZSByZXBvcnRpbmcgdGhpcyBldmVudC4gVGhlIG9ubHkgYWxsb3dlZCByZXR1cm4gdmFsdWUgaXMgMS4wLgotICoKLSAqIEltcGxlbWVudCBvbmx5IHRoZSB3YWtlLXVwIHZlcnNpb24gb2YgdGhpcyBzZW5zb3IuCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfVElMVF9ERVRFQ1RPUiAgICAgICAgICAgICAgICAgICAgICAoMjIpCi0jZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9USUxUX0RFVEVDVE9SICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLnRpbHRfZGV0ZWN0b3IiCi0KLS8qCi0gKiBTRU5TT1JfVFlQRV9XQUtFX0dFU1RVUkUKLSAqIHJlcG9ydGluZy1tb2RlOiBvbmUtc2hvdAotICoKLSAqIEEgc2Vuc29yIGVuYWJsaW5nIHdha2luZyB1cCB0aGUgZGV2aWNlIGJhc2VkIG9uIGEgZGV2aWNlIHNwZWNpZmljIG1vdGlvbi4KLSAqCi0gKiBXaGVuIHRoaXMgc2Vuc29yIHRyaWdnZXJzLCB0aGUgZGV2aWNlIGJlaGF2ZXMgYXMgaWYgdGhlIHBvd2VyIGJ1dHRvbiB3YXMKLSAqIHByZXNzZWQsIHR1cm5pbmcgdGhlIHNjcmVlbiBvbi4gVGhpcyBiZWhhdmlvciAodHVybmluZyBvbiB0aGUgc2NyZWVuIHdoZW4KLSAqIHRoaXMgc2Vuc29yIHRyaWdnZXJzKSBtaWdodCBiZSBkZWFjdGl2YXRlZCBieSB0aGUgdXNlciBpbiB0aGUgZGV2aWNlCi0gKiBzZXR0aW5ncy4gQ2hhbmdlcyBpbiBzZXR0aW5ncyBkbyBub3QgaW1wYWN0IHRoZSBiZWhhdmlvciBvZiB0aGUgc2Vuc29yOgotICogb25seSB3aGV0aGVyIHRoZSBmcmFtZXdvcmsgdHVybnMgdGhlIHNjcmVlbiBvbiB3aGVuIGl0IHRyaWdnZXJzLgotICoKLSAqIFRoZSBhY3R1YWwgZ2VzdHVyZSB0byBiZSBkZXRlY3RlZCBpcyBub3Qgc3BlY2lmaWVkLCBhbmQgY2FuIGJlIGNob3NlbiBieQotICogdGhlIG1hbnVmYWN0dXJlciBvZiB0aGUgZGV2aWNlLgotICogVGhpcyBzZW5zb3IgbXVzdCBiZSBsb3cgcG93ZXIsIGFzIGl0IGlzIGxpa2VseSB0byBiZSBhY3RpdmF0ZWQgMjQvNy4KLSAqIFRoZSBvbmx5IGFsbG93ZWQgdmFsdWUgdG8gcmV0dXJuIGlzIDEuMC4KLSAqCi0gKiBJbXBsZW1lbnQgb25seSB0aGUgd2FrZS11cCB2ZXJzaW9uIG9mIHRoaXMgc2Vuc29yLgotICovCi0jZGVmaW5lIFNFTlNPUl9UWVBFX1dBS0VfR0VTVFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMjMpCi0jZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9XQUtFX0dFU1RVUkUgICAgICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3Iud2FrZV9nZXN0dXJlIgotCi0vKgotICogU0VOU09SX1RZUEVfR0xBTkNFX0dFU1RVUkUKLSAqIHJlcG9ydGluZy1tb2RlOiBvbmUtc2hvdAotICoKLSAqIEEgc2Vuc29yIGVuYWJsaW5nIGJyaWVmbHkgdHVybmluZyB0aGUgc2NyZWVuIG9uIHRvIGVuYWJsZSB0aGUgdXNlciB0bwotICogZ2xhbmNlIGNvbnRlbnQgb24gc2NyZWVuIGJhc2VkIG9uIGEgc3BlY2lmaWMgbW90aW9uLiAgVGhlIGRldmljZSBzaG91bGQKLSAqIHR1cm4gdGhlIHNjcmVlbiBvZmYgYWZ0ZXIgYSBmZXcgbW9tZW50cy4KLSAqCi0gKiBXaGVuIHRoaXMgc2Vuc29yIHRyaWdnZXJzLCB0aGUgZGV2aWNlIHR1cm5zIHRoZSBzY3JlZW4gb24gbW9tZW50YXJpbHkKLSAqIHRvIGFsbG93IHRoZSB1c2VyIHRvIGdsYW5jZSBub3RpZmljYXRpb25zIG9yIG90aGVyIGNvbnRlbnQgd2hpbGUgdGhlCi0gKiBkZXZpY2UgcmVtYWlucyBsb2NrZWQgaW4gYSBub24taW50ZXJhY3RpdmUgc3RhdGUgKGRvemluZykuIFRoaXMgYmVoYXZpb3IKLSAqIChicmllZmx5IHR1cm5pbmcgb24gdGhlIHNjcmVlbiB3aGVuIHRoaXMgc2Vuc29yIHRyaWdnZXJzKSBtaWdodCBiZSBkZWFjdGl2YXRlZAotICogYnkgdGhlIHVzZXIgaW4gdGhlIGRldmljZSBzZXR0aW5ncy4gQ2hhbmdlcyBpbiBzZXR0aW5ncyBkbyBub3QgaW1wYWN0IHRoZQotICogYmVoYXZpb3Igb2YgdGhlIHNlbnNvcjogb25seSB3aGV0aGVyIHRoZSBmcmFtZXdvcmsgYnJpZWZseSB0dXJucyB0aGUgc2NyZWVuIG9uCi0gKiB3aGVuIGl0IHRyaWdnZXJzLgotICoKLSAqIFRoZSBhY3R1YWwgZ2VzdHVyZSB0byBiZSBkZXRlY3RlZCBpcyBub3Qgc3BlY2lmaWVkLCBhbmQgY2FuIGJlIGNob3NlbiBieQotICogdGhlIG1hbnVmYWN0dXJlciBvZiB0aGUgZGV2aWNlLgotICogVGhpcyBzZW5zb3IgbXVzdCBiZSBsb3cgcG93ZXIsIGFzIGl0IGlzIGxpa2VseSB0byBiZSBhY3RpdmF0ZWQgMjQvNy4KLSAqIFRoZSBvbmx5IGFsbG93ZWQgdmFsdWUgdG8gcmV0dXJuIGlzIDEuMC4KLSAqCi0gKiBJbXBsZW1lbnQgb25seSB0aGUgd2FrZS11cCB2ZXJzaW9uIG9mIHRoaXMgc2Vuc29yLgotICovCi0jZGVmaW5lIFNFTlNPUl9UWVBFX0dMQU5DRV9HRVNUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMjQpCi0jZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9HTEFOQ0VfR0VTVFVSRSAgICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IuZ2xhbmNlX2dlc3R1cmUiCi0KLS8qKgotICogU0VOU09SX1RZUEVfUElDS19VUF9HRVNUVVJFCi0gKiByZXBvcnRpbmctbW9kZTogb25lLXNob3QKLSAqCi0gKiBBIHNlbnNvciBvZiB0aGlzIHR5cGUgdHJpZ2dlcnMgd2hlbiB0aGUgZGV2aWNlIGlzIHBpY2tlZCB1cCByZWdhcmRsZXNzIG9mIHdoZXJldmVyIGlzIHdhcwotICogYmVmb3JlIChkZXNrLCBwb2NrZXQsIGJhZykuIFRoZSBvbmx5IGFsbG93ZWQgcmV0dXJuIHZhbHVlIGlzIDEuMC4KLSAqIFRoaXMgc2Vuc29yIGRlLWFjdGl2YXRlcyBpdHNlbGYgaW1tZWRpYXRlbHkgYWZ0ZXIgaXQgdHJpZ2dlcnMuCi0gKgotICogSW1wbGVtZW50IG9ubHkgdGhlIHdha2UtdXAgdmVyc2lvbiBvZiB0aGlzIHNlbnNvci4KLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9QSUNLX1VQX0dFU1RVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDI1KQotI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfUElDS19VUF9HRVNUVVJFICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLnBpY2tfdXBfZ2VzdHVyZSIKLQotLyoKLSAqIFNFTlNPUl9UWVBFX1dSSVNUX1RJTFRfR0VTVFVSRQotICogdHJpZ2dlci1tb2RlOiBzcGVjaWFsCi0gKiB3YWtlLXVwIHNlbnNvcjogeWVzCi0gKgotICogQSBzZW5zb3Igb2YgdGhpcyB0eXBlIHRyaWdnZXJzIGFuIGV2ZW50IGVhY2ggdGltZSBhIHRpbHQgb2YgdGhlIHdyaXN0LXdvcm4KLSAqIGRldmljZSBpcyBkZXRlY3RlZC4KLSAqCi0gKiBUaGlzIHNlbnNvciBtdXN0IGJlIGxvdyBwb3dlciwgYXMgaXQgaXMgbGlrZWx5IHRvIGJlIGFjdGl2YXRlZCAyNC83LgotICogVGhlIG9ubHkgYWxsb3dlZCB2YWx1ZSB0byByZXR1cm4gaXMgMS4wLgotICoKLSAqIEltcGxlbWVudCBvbmx5IHRoZSB3YWtlLXVwIHZlcnNpb24gb2YgdGhpcyBzZW5zb3IuCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfV1JJU1RfVElMVF9HRVNUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICgyNikKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX1dSSVNUX1RJTFRfR0VTVFVSRSAgICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci53cmlzdF90aWx0X2dlc3R1cmUiCi0KLS8qCi0gKiBTRU5TT1JfVFlQRV9ERVZJQ0VfT1JJRU5UQVRJT04KLSAqIHJlcG9ydGluZy1tb2RlOiBvbi1jaGFuZ2UKLSAqCi0gKiBUaGUgY3VycmVudCBvcmllbnRhdGlvbiBvZiB0aGUgZGV2aWNlLiBUaGUgdmFsdWUgc2hvdWxkIGJlIHJlcG9ydGVkIGluIHRoZQotICogZmlyc3QgZWxlbWVudCBvZiB0aGUgJ2RhdGEnIG1lbWJlciB2YXJpYWJsZSBpbiBzZW5zb3JzX2V2ZW50X3QuIFRoZSBvbmx5Ci0gKiB2YWx1ZXMgdGhhdCBjYW4gYmUgcmVwb3J0ZWQgYXJlIChwbGVhc2UgcmVmZXIgdG8gQW5kcm9pZCBTZW5zb3IgQ29vcmRpbmF0ZQotICogU3lzdGVtIHRvIHVuZGVyc3RhbmQgdGhlIFggYW5kIFkgYXhpcyBkaXJlY3Rpb24gd2l0aCByZXNwZWN0IHRvIGRlZmF1bHQKLSAqIG9yaWVudGF0aW9uKToKLSAqICAtIDA6IGRldmljZSBpcyBpbiBkZWZhdWx0IG9yaWVudGF0aW9uIChZIGF4aXMgaXMgdmVydGljYWwgYW5kIHBvaW50cyB1cCkKLSAqICAtIDE6IGRldmljZSBpcyByb3RhdGVkIDkwIGRlZ3JlZXMgY291bnRlci1jbG9ja3dpc2UgZnJvbSBkZWZhdWx0Ci0gKiAgICAgICBvcmllbnRhdGlvbiAoWCBheGlzIGlzIHZlcnRpY2FsIGFuZCBwb2ludHMgdXApCi0gKiAgLSAyOiBkZXZpY2UgaXMgcm90YXRlZCAxODAgZGVncmVlcyBmcm9tIGRlZmF1bHQgb3JpZW50YXRpb24gKFkgYXhpcyBpcwotICogICAgICAgdmVydGljYWwgYW5kIHBvaW50cyBkb3duKQotICogIC0gMzogZGV2aWNlIGlzIHJvdGF0ZWQgOTAgZGVncmVlcyBjbG9ja3dpc2UgZnJvbSBkZWZhdWx0IG9yaWVudGF0aW9uIChYIGF4aXMKLSAqICAgICAgIGlzIHZlcnRpY2FsIGFuZCBwb2ludHMgZG93bikKLSAqCi0gKiBNb3ZpbmcgdGhlIGRldmljZSB0byBhbiBvcmllbnRhdGlvbiB3aGVyZSB0aGUgWiBheGlzIGlzIHZlcnRpY2FsIChlaXRoZXIgdXAKLSAqIG9yIGRvd24pIHNob3VsZCBub3QgY2F1c2UgYSBuZXcgZXZlbnQgdG8gYmUgcmVwb3J0ZWQuCi0gKgotICogVG8gaW1wcm92ZSB0aGUgdXNlciBleHBlcmllbmNlIG9mIHRoaXMgc2Vuc29yLCBpdCBpcyByZWNvbW1lbmRlZCB0byBpbXBsZW1lbnQKLSAqIHNvbWUgcGh5c2ljYWwgKGkuZS4sIHJvdGF0aW9uIGFuZ2xlKSBhbmQgdGVtcG9yYWwgKGkuZS4sIGRlbGF5KSBoeXN0ZXJlc2lzLgotICogSW4gb3RoZXIgd29yZHMsIG1pbm9yIG9yIHRyYW5zaWVudCByb3RhdGlvbnMgc2hvdWxkIG5vdCBjYXVzZSBhIG5ldyBldmVudCB0bwotICogYmUgcmVwb3J0ZWQuCi0gKgotICogVGhpcyBzZW5zb3Igc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgd2l0aCB0aGUgaGVscCBvZiBhbiBhY2NlbGVyb21ldGVyLgotICogVGhpcyBpcyBhIGxvdyBwb3dlciBzZW5zb3IgdGhhdCBzaG91bGQgcmVkdWNlIHRoZSBudW1iZXIgb2YgaW50ZXJydXB0cyBvZiB0aGUKLSAqIEFQLiBEbyBub3QgZW11bGF0ZSB0aGlzIHNlbnNvciBpbiB0aGUgSEFMLgotICoKLSAqIEJvdGggd2FrZS11cCBhbmQgbm9uIHdha2UtdXAgdmVyc2lvbnMgYXJlIHVzZWZ1bC4KLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9ERVZJQ0VfT1JJRU5UQVRJT04gICAgICAgICAgICAgICAgICgyNykKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0RFVklDRV9PUklFTlRBVElPTiAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IuZGV2aWNlX29yaWVudGF0aW9uIgotCi0vKgotICogU0VOU09SX1RZUEVfUE9TRV82RE9GCi0gKiB0cmlnZ2VyLW1vZGU6IGNvbnRpbnVvdXMKLSAqCi0gKiBBIHNlbnNvciBvZiB0aGlzIHR5cGUgcmV0dXJucyB0aGUgcG9zZSBvZiB0aGUgZGV2aWNlLgotICogUG9zZSBvZiB0aGUgZGV2aWNlIGlzIGRlZmluZWQgYXMgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBkZXZpY2UgZnJvbSBhCi0gKiBFYXJ0aCBDZW50ZXJlZCBFYXJ0aCBGaXhlZCBmcmFtZSBhbmQgdGhlIHRyYW5zbGF0aW9uIGZyb20gYW4gYXJiaXRyYXJ5Ci0gKiBwb2ludCBhdCBzdWJzY3JpcHRpb24uCi0gKgotICogVGhpcyBzZW5zb3IgY2FuIGJlIGhpZ2ggcG93ZXIuIEl0IGNhbiB1c2UgYW55IGFuZCBhbGwgb2YgdGhlIGZvbGxvd2luZwotICogICAgICAgICAgIC4gQWNjZWxlcm9tZXRlcgotICogICAgICAgICAgIC4gR3lyb3Njb3BlCi0gKiAgICAgICAgICAgLiBDYW1lcmEKLSAqICAgICAgICAgICAuIERlcHRoIENhbWVyYQotICoKLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9QT1NFXzZET0YgICAgICAgICAgICAgICAgICAgICAgICAgKDI4KQotI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfUE9TRV82RE9GICAgICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLnBvc2VfNmRvZiIKLQotLyoKLSAqIFNFTlNPUl9UWVBFX1NUQVRJT05BUllfREVURUNUCi0gKiB0cmlnZ2VyIG1vZGU6IG9uZSBzaG90Ci0gKgotICogQSBzZW5zb3Igb2YgdGhpcyB0eXBlIHJldHVybnMgYW4gZXZlbnQgaWYgdGhlIGRldmljZSBpcyBzdGlsbC9zdGF0aW9uYXJ5IGZvcgotICogYSB3aGlsZS4gVGhlIHBlcmlvZCBvZiB0aW1lIHRvIG1vbml0b3IgZm9yIHN0YXRpbmFyaXR5IHNob3VsZCBiZSBncmVhdGVyIHRoYW4KLSAqIDUgc2Vjb25kcywgYW5kIGxlc3MgdGhhbiAxMCBzZWNvbmRzLgotICoKLSAqIFN0YXRpb25hcml0eSBoZXJlIHJlZmVycyB0byBhYnNvbHV0ZSBzdGF0aW9uYXJpdHkuIGVnOiBkZXZpY2Ugb24gZGVzay4KLSAqCi0gKiBUaGUgb25seSBhbGxvd2VkIHZhbHVlIHRvIHJldHVybiBpcyAxLjAuCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfU1RBVElPTkFSWV9ERVRFQ1QgICAgICAgICAgICAgICAgICAgKDI5KQorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfQUNDRUxFUk9NRVRFUiAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IuYWNjZWxlcm9tZXRlciIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX01BR05FVElDX0ZJRUxEICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLm1hZ25ldGljX2ZpZWxkIgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfT1JJRU5UQVRJT04gICAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3Iub3JpZW50YXRpb24iCisjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9HWVJPU0NPUEUgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5neXJvc2NvcGUiCisjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9MSUdIVCAgICAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5saWdodCIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX1BSRVNTVVJFICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLnByZXNzdXJlIgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfVEVNUEVSQVRVUkUgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IudGVtcGVyYXR1cmUiCisjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9QUk9YSU1JVFkgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5wcm94aW1pdHkiCisjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9HUkFWSVRZICAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5ncmF2aXR5IgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfTElORUFSX0FDQ0VMRVJBVElPTiAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IubGluZWFyX2FjY2VsZXJhdGlvbiIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX1JPVEFUSU9OX1ZFQ1RPUiAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLnJvdGF0aW9uX3ZlY3RvciIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX1JFTEFUSVZFX0hVTUlESVRZICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLnJlbGF0aXZlX2h1bWlkaXR5IgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfQU1CSUVOVF9URU1QRVJBVFVSRSAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IuYW1iaWVudF90ZW1wZXJhdHVyZSIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX01BR05FVElDX0ZJRUxEX1VOQ0FMSUJSQVRFRCAgImFuZHJvaWQuc2Vuc29yLm1hZ25ldGljX2ZpZWxkX3VuY2FsaWJyYXRlZCIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0dBTUVfUk9UQVRJT05fVkVDVE9SICAgICAgICAgImFuZHJvaWQuc2Vuc29yLmdhbWVfcm90YXRpb25fdmVjdG9yIgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfR1lST1NDT1BFX1VOQ0FMSUJSQVRFRCAgICAgICAiYW5kcm9pZC5zZW5zb3IuZ3lyb3Njb3BlX3VuY2FsaWJyYXRlZCIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX1NJR05JRklDQU5UX01PVElPTiAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLnNpZ25pZmljYW50X21vdGlvbiIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX1NURVBfREVURUNUT1IgICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLnN0ZXBfZGV0ZWN0b3IiCisjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9TVEVQX0NPVU5URVIgICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5zdGVwX2NvdW50ZXIiCisjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9HRU9NQUdORVRJQ19ST1RBVElPTl9WRUNUT1IgICJhbmRyb2lkLnNlbnNvci5nZW9tYWduZXRpY19yb3RhdGlvbl92ZWN0b3IiCisjZGVmaW5lIFNFTlNPUl9TVFJJTkdfVFlQRV9IRUFSVF9SQVRFICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLnNlbnNvci5oZWFydF9yYXRlIgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfVElMVF9ERVRFQ1RPUiAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IudGlsdF9kZXRlY3RvciIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX1dBS0VfR0VTVFVSRSAgICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLndha2VfZ2VzdHVyZSIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0dMQU5DRV9HRVNUVVJFICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLmdsYW5jZV9nZXN0dXJlIgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfUElDS19VUF9HRVNUVVJFICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IucGlja191cF9nZXN0dXJlIgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfV1JJU1RfVElMVF9HRVNUVVJFICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3Iud3Jpc3RfdGlsdF9nZXN0dXJlIgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfREVWSUNFX09SSUVOVEFUSU9OICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IuZGV2aWNlX29yaWVudGF0aW9uIgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfUE9TRV82RE9GICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IucG9zZV82ZG9mIgogI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfU1RBVElPTkFSWV9ERVRFQ1QgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3Iuc3RhdGlvbmFyeV9kZXRlY3QiCi0KLS8qCi0gKiBTRU5TT1JfVFlQRV9NT1RJT05fREVURUNUCi0gKiB0cmlnZ2VyIG1vZGU6IG9uZSBzaG90Ci0gKgotICogQSBzZW5zb3Igb2YgdGhpcyB0eXBlIHJldHVybnMgYW4gZXZlbnQgaWYgdGhlIGRldmljZSBpcyBub3Qgc3RpbGwgZm9yCi0gKiBhIHdoaWxlLiBUaGUgcGVyaW9kIG9mIHRpbWUgdG8gbW9uaXRvciBmb3Igc3RhdGluYXJpdHkgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbgotICogNSBzZWNvbmRzLCBhbmQgbGVzcyB0aGFuIDEwIHNlY29uZHMuCi0gKgotICogTW90aW9uIGhlcmUgcmVmZXJzIHRvIGFueSBtZWNoYW5pc20gaW4gd2hpY2ggdGhlIGRldmljZSBpcyBjYXVzZXMgdG8gYmUKLSAqIG1vdmVkIGluIGl0cyBpbmVydGlhbCBmcmFtZS4gZWc6IFBpY2tpbiB1cCB0aGUgZGV2aWNlIGFuZCB3YWxraW5nIHdpdGggaXQKLSAqIHRvIGEgbmVhcmJ5IHJvb20gbWF5IHRyaWdnZXIgbW90aW9uIHdoZXJld2FzIGtlZXBpbmcgdGhlIGRldmljZSBvbiBhIHRhYmxlCi0gKiBvbiBhIHNtb290aCB0cmFpbiBtb3ZpbmcgYXQgY29uc3RhbnQgdmVsb2NpdHkgbWF5IG5vdCB0cmlnZ2VyIG1vdGlvbi4KLSAqCi0gKiBUaGUgb25seSBhbGxvd2VkIHZhbHVlIHRvIHJldHVybiBpcyAxLjAuCi0gKi8KLSNkZWZpbmUgU0VOU09SX1RZUEVfTU9USU9OX0RFVEVDVCAgICAgICAgICAgICAgICAgICAgICAgKDMwKQogI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfTU9USU9OX0RFVEVDVCAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IubW90aW9uX2RldGVjdCIKLQotLyoKLSAqIFNFTlNPUl9UWVBFX0hFQVJUX0JFQVQKLSAqIHRyaWdnZXIgbW9kZTogY29udGludW91cwotICoKLSAqIEEgc2Vuc29yIG9mIHRoaXMgdHlwZSByZXR1cm5zIGFuIGV2ZW50IGV2ZXJ5dGltZSBhIGhlYXIgYmVhdCBwZWFrIGlzCi0gKiBkZXRlY3RlZC4KLSAqCi0gKiBQZWFrIGhlcmUgaWRlYWxseSBjb3JyZXNwb25kcyB0byB0aGUgcG9zaXRpdmUgcGVhayBpbiB0aGUgUVJTIGNvbXBsZXggb2YKLSAqIGFuZCBFQ0cgc2lnbmFsLgotICoKLSAqIFRoZSBzZW5zb3IgaXMgbm90IGV4cGVjdGVkIHRvIGJlIG9wdGltaXplZCBmb3IgbGF0ZW5jeS4gQXMgYSBndWlkZSwgYQotICogbGF0ZW5jeSBvZiB1cCB0byAxMCBzZWNvbmRzIGlzIGFjY2VwdGFibGUuIEhvd2V2ZXIgdGhlIHRpbWVzdGFtcCBhdHRhY2hlZAotICogdG8gdGhlIGV2ZW50IHNob3VsZCBiZSBhY2N1cmF0ZSBhbmQgc2hvdWxkIGNvcnJlc3BvbmQgdG8gdGhlIHRpbWUgdGhlIHBlYWsKLSAqIG9jY3VyZWQuCi0gKgotICogVGhlIHNlbnNvciBldmVudCBjb250YWlucyBhIHBhcmFtZXRlciBmb3IgdGhlIGNvbmZpZGVuY2UgaW4gdGhlIGRldGVjdGlvbgotICogb2YgdGhlIHBlYWsgd2hlcmUgMC4wIHJlcHJlc2VudCBubyBpbmZvcm1hdGlvbiBhdCBhbGwsIGFuZCAxLjAgcmVwcmVzZW50cwotICogY2VydGFpbnR5LgotICovCi0jZGVmaW5lIFNFTlNPUl9UWVBFX0hFQVJUX0JFQVQgICAgICAgICAgICAgICAgICAgICAgICAgICgzMSkKICNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0hFQVJUX0JFQVQgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLmhlYXJ0X2JlYXQiCi0KLS8qKgotICogU0VOU09SX1RZUEVfRFlOQU1JQ19TRU5TT1JfTUVUQQotICogdHJpZ2dlci1tb2RlOiBzcGVjaWFsCi0gKiB3YWtlLXVwIHNlbnNvcjogeWVzCi0gKgotICogQSBzZW5zb3IgZXZlbnQgb2YgdGhpcyB0eXBlIGlzIHJlY2VpdmVkIHdoZW4gYSBkeW5hbWljIHNlbnNvciBpcyBhZGRlZCB0byBvciByZW1vdmVkIGZyb20gdGhlCi0gKiBzeXN0ZW0uIEF0IG1vc3Qgb25lIHNlbnNvciBvZiB0aGlzIHR5cGUgY2FuIGJlIHByZXNlbnQgaW4gb25lIHNlbnNvciBIQUwgaW1wbGVtZW50YXRpb24gYW5kCi0gKiBwcmVzZW5jZSBvZiBhIHNlbnNvciBvZiB0aGlzIHR5cGUgaW4gc2Vuc29yIEhBTCBpbXBsZW1lbnRhdGlvbiBpbmRpY2F0ZXMgdGhhdCB0aGlzIHNlbnNvciBIQUwKLSAqIHN1cHBvcnRzIGR5bmFtaWMgc2Vuc29yIGZlYXR1cmUuIE9wZXJhdGlvbnMsIHN1Y2ggYXMgYmF0Y2gsIGFjdGl2YXRlIGFuZCBzZXREZWxheSwgdG8gdGhpcwotICogc3BlY2lhbCBwdXJwb3NlIHNlbnNvciBzaG91bGQgYmUgdHJlYXRlZCBhcyBuby1vcCBhbmQgcmV0dXJuIHN1Y2Nlc3NmdWwuCi0gKgotICogQSBkeW5hbWljIHNlbnNvciBjb25uZWN0aW9uIGluZGljYXRlcyBjb25uZWN0aW9uIG9mIGEgcGh5c2ljYWwgZGV2aWNlIG9yIGluc3RhbnRpYXRpb24gb2YgYQotICogdmlydHVhbCBzZW5zb3IgYmFja2VkIGJ5IGFsZ29yaXRobTsgYW5kIGEgZHluYW1pYyBzZW5zb3IgZGlzY29ubmVjdGlvbiBpbmRpY2F0ZXMgdGhlIHRoZQotICogb3Bwb3NpdGUuIEEgc2Vuc29yIGV2ZW50IG9mIFNFTlNPUl9UWVBFX0RZTkFNSUNfU0VOU09SX01FVEEgdHlwZSBzaG91bGQgYmUgZGVsaXZlcmVkIHJlZ2FyZGxlc3MKLSAqIG9mIHRoZSBhY3RpdmF0aW9uIHN0YXR1cyBvZiB0aGUgc2Vuc29yIGluIHRoZSBldmVudCBvZiBkeW5hbWljIHNlbnNvciBjb25uZWN0aW9uIGFuZAotICogZGlzY29ubmVjdGlvbi4gSW4gdGhlIHNlbnNvciBldmVudCwgYmVzaWRlcyB0aGUgY29tbW9uIGRhdGEgZW50cmllcywgImR5bmFtaWNfc2Vuc29yX21ldGEiLCB3aGljaAotICogaW5jbHVkZXMgZmllbGRzIGZvciBjb25uZWN0aW9uIHN0YXR1cywgaGFuZGxlIG9mIHRoZSBzZW5zb3IgaW52b2x2ZWQsIHBvaW50ZXIgdG8gc2Vuc29yX3QKLSAqIHN0cnVjdHVyZSBhbmQgYSB1dWlkIGZpZWxkLCBzaG91bGQgYmUgcG9wdWxhdGVkLgotICoKLSAqIEF0IGEgZHluYW1pYyBzZW5zb3IgY29ubmVjdGlvbiBldmVudCwgZmllbGRzIG9mIHNlbnNvcl90IHN0cnVjdHVyZSByZWZlcmVuY2VkIGJ5IGEgcG9pbnRlciBpbgotICogZHluYW1pY19zZW5zb3JfbWV0YSBzaG91bGQgYmUgZmlsbGVkIGFzIGlmIGl0IHdhcyByZWd1bGFyIHNlbnNvcnMuIFNlbnNvciBIQUwgaXMgcmVzcG9uc2libGUgZm9yCi0gKiByZWNvdmVyeSBvZiBtZW1vcnkgaWYgdGhlIGNvcnJlc3BvbmRpbmcgZGF0YSBpcyBkeW5hbWljaWFsbHkgYWxsb2NhdGVkLiBIb3dldmVyLCB0aGUgdGhlIHBvaW50ZXIKLSAqIG11c3QgYmUgdmFsaWQgdW50aWwgdGhlIGZpcnN0IGFjdGl2YXRlIGNhbGwgdG8gdGhlIHNlbnNvciByZXBvcnRlZCBpbiB0aGlzIGNvbm5lY3Rpb24gZXZlbnQuIEF0IGEKLSAqIGR5bmFtaWMgc2Vuc29yIGRpc2Nvbm5lY3Rpb24sIHRoZSBzZW5zb3JfdCBwb2ludGVyIHNob3VsZCBiZSBOVUxMLgotICoKLSAqIFRoZSBzZW5zb3IgaGFuZGxlIGFzc2lnbmVkIHRvIGR5bmFtaWMgc2Vuc29ycyBzaG91bGQgbmV2ZXIgYmUgdGhlIHNhbWUgYXMgdGhhdCBvZiBhbnkgcmVndWxhcgotICogc3RhdGljIHNlbnNvcnMsIGFuZCBzaG91bGQgYmUgdW5pcXVlIHVudGlsIG5leHQgYm9vdC4gSW4gYW5vdGhlciB3b3JkLCBpZiBhIGhhbmRsZSBoIGlzIHVzZWQgZm9yCi0gKiBhIGR5bmFtaWMgc2Vuc29yIEEsIHRoYXQgc2FtZSBudW1iZXIgY2Fubm90IGJlIHVzZWQgZm9yIHRoZSBzYW1lIGR5bmFtaWMgc2Vuc29yIEEgb3IgYW5vdGhlcgotICogZHluYW1pYyBzZW5zb3IgQiBldmVuIGFmdGVyIGRpc2Nvbm5lY3Rpb24gb2YgQSB1bnRpbCByZWJvb3QuCi0gKgotICogVGhlIFVVSUQgZmllbGQgd2lsbCBiZSB1c2VkIGZvciBpZGVudGlmeWluZyB0aGUgc2Vuc29yIGluIGFkZGl0aW9uIHRvIG5hbWUsIHZlbmRvciBhbmQgdmVyc2lvbgotICogYW5kIHR5cGUuIEZvciBwaHlzaWNhbCBzZW5zb3JzIG9mIHRoZSBzYW1lIG1vZGVsLCBhbGwgc2Vuc29ycyB3aWxsIGhhdmUgdGhlIHNhbWUgdmFsdWVzIGluCi0gKiBzZW5zb3JfdCwgYnV0IHRoZSBVVUlEIHNob3VsZCBiZSB1bmlxdWUgYW5kIHBlcnNpc3RlbnQgZm9yIGVhY2ggaW5kaXZpZHVhbCB1bml0LiBBbiBhbGwgemVybyBVVUlECi0gKiBpbmRpY2F0ZXMgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGRpZmZlcmVudGlhdGUgaW5kaXZpZHVhbCBzZW5zb3IgdW5pdC4KLSAqCi0gKiBJdCBpcyByZWNvbW1lbmRlZCB0byBpbXBsZW1lbnQgdGhpcyB0eXBlIGFzIHdha2UgdXAgc2Vuc29yLgotICoKLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9EWU5BTUlDX1NFTlNPUl9NRVRBICAgICAgICAgICAgICAgICAgICAgICAgICgzMikKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0RZTkFNSUNfU0VOU09SX01FVEEgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IuZHluYW1pY19zZW5zb3JfbWV0YSIKLQotLyoqCi0gKiBTRU5TT1JfVFlQRV9BRERJVElPTkFMX0lORk8KLSAqIHJlcG9ydGluZy1tb2RlOiBOL0EKLSAqCi0gKiBUaGlzIHNlbnNvciB0eXBlIGlzIGZvciBkZWxpdmVyaW5nIGFkZGl0aW9uYWwgc2Vuc29yIGluZm9ybWF0aW9uIGFzaWRlIGZyb20gc2Vuc29yIGV2ZW50IGRhdGEuCi0gKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIG1heSBpbmNsdWRlIHNlbnNvciBmcm9udC1lbmQgZ3JvdXAgZGVsYXksIGludGVybmFsIGNhbGlicmF0aW9uIHBhcmFtZXRlcnMsCi0gKiBub2lzZSBsZXZlbCBtZXRyaWNzLCBkZXZpY2UgaW50ZXJuYWwgdGVtcGVyYXR1cmUsIGV0Yy4KLSAqCi0gKiBUaGlzIHR5cGUgd2lsbCBuZXZlciBiaW5kIHRvIGEgc2Vuc29yLiBJbiBvdGhlciB3b3Jkcywgbm8gc2Vuc29yIGluIHRoZSBzZW5zb3IgbGlzdCBzaG91bGQgYmUgb2YKLSAqIHRoZSB0eXBlIFNFTlNPUl9UWVBFX0FERElUSU9OQUxfSU5GTy4gSWYgYSBzZW5zb3IgSEFMIHN1cHBvcnRzIHNlbnNvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiBmZWF0dXJlLCBpdCByZXBvcnRzIHNlbnNvcl9ldmVudF90IHdpdGggInNlbnNvciIgZmllbGQgc2V0IHRvIGhhbmRsZSBvZiB0aGUgcmVwb3J0aW5nIHNlbnNvciBhbmQKLSAqICJ0eXBlIiBmaWVsZCBzZXQgdG8gU0VOU09SX1RZUEVfQURESVRJT05BTF9JTkZPLiBEZWxpdmVyeSBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGV2ZW50cyBpcwotICogdHJpZ2dlcmVkIHVuZGVyIHR3byBjb25kaXRpb25zOiBhbiBlbmFibGUgYWN0aXZhdGUoKSBjYWxsIG9yIGEgZmx1c2goKSBjYWxsIHRvIHRoZSBjb3JyZXNwb25kaW5nCi0gKiBzZW5zb3IuCi0gKgotICogQSBzaW5nbGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZXBvcnQgY29uc2lzdHMgb2YgbXVsdGlwbGUgZnJhbWVzLiBTZXF1ZW5jZXMgb2YgdGhlc2UgZnJhbWVzIGFyZQotICogb3JkZXJlZCB1c2luZyB0aW1lc3RhbXBzLCB3aGljaCBtZWFucyB0aGUgdGltZXN0YW1wcyBvZiBzZXF1ZW50aWFsIGZyYW1lcyBoYXZlIHRvIGJlIGF0IGxlYXN0IDEKLSAqIG5hbm9zZWNvbmQgYXBhcnQgZnJvbSBlYWNoIG90aGVyLiBFYWNoIGZyYW1lIGlzIGEgc2Vuc29yX2V2ZW50X3QgZGVsaXZlcmVkIHRocm91Z2ggdGhlIEhBTAotICogaW50ZXJmYWNlLCB3aXRoIHJlbGF0ZWQgZGF0YSBzdG9yZWQgaW4gdGhlICJhZGRpdGlvbmFsX2luZm8iIGZpZWxkLCB3aGljaCBpcyBvZiB0eXBlCi0gKiBhZGRpdGlvbmFsX2luZm9fZXZlbnRfdC4gIFRoZSAidHlwZSIgZmllbGQgb2YgYWRkaXRpb25hbF9pbmZvX2V2ZW50X3QgZGVub3RlcyB0aGUgbmF0dXJlIG9mIHRoZQotICogcGF5bG9hZCBkYXRhIChzZWUgYWRkaXRpb25hbF9pbmZvX3R5cGVfdCkuICBUaGUgInNlcmlhbCIgZmllbGQgaXMgdXNlZCB0byBrZWVwIHRoZSBzZXF1ZW5jZSBvZgotICogcGF5bG9hZCBkYXRhIHRoYXQgc3BhbnMgbXVsdGlwbGUgZnJhbWVzLiBUaGUgZmlyc3QgZnJhbWUgb2YgdGhlIGVudGlyZSByZXBvcnQgaXMgYWx3YXlzIG9mIHR5cGUKLSAqIEFJTkZPX0JFR0lOLCBhbmQgdGhlIGxhc3QgZnJhbWUgaXMgYWx3YXlzIEFJTkZPX0VORC4KLSAqCi0gKiBBbGwgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmcmFtZXMgaGF2ZSB0byBiZSBkZWxpdmVyZWQgYWZ0ZXIgZmx1c2ggY29tcGxldGUgZXZlbnQgaWYgZmx1c2goKSB3YXMKLSAqIHRyaWdnZXJpbmcgdGhlIHJlcG9ydC4KLSAqLwotI2RlZmluZSBTRU5TT1JfVFlQRV9BRERJVElPTkFMX0lORk8gICAgICAgICAgICAgICAgICAgICAgICgzMykKLSNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0FERElUSU9OQUxfSU5GTyAgICAgICAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IuYWRkaXRpb25hbF9pbmZvIgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfRFlOQU1JQ19TRU5TT1JfTUVUQSAgICAgICAgICAiYW5kcm9pZC5zZW5zb3IuZHluYW1pY19zZW5zb3JfbWV0YSIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0FERElUSU9OQUxfSU5GTyAgICAgICAgICAgICAgImFuZHJvaWQuc2Vuc29yLmFkZGl0aW9uYWxfaW5mbyIKKyNkZWZpbmUgU0VOU09SX1NUUklOR19UWVBFX0xPV19MQVRFTkNZX09GRkJPRFlfREVURUNUICAgImFuZHJvaWQuc2Vuc29yLmxvd19sYXRlbmN5X29mZmJvZHlfZGV0ZWN0IgorI2RlZmluZSBTRU5TT1JfU1RSSU5HX1RZUEVfQUNDRUxFUk9NRVRFUl9VTkNBTElCUkFURUQgICAiYW5kcm9pZC5zZW5zb3IuYWNjZWxlcm9tZXRlcl91bmNhbGlicmF0ZWQiCiAKIC8qKgogICogVmFsdWVzIHJldHVybmVkIGJ5IHRoZSBhY2NlbGVyb21ldGVyIGluIHZhcmlvdXMgbG9jYXRpb25zIGluIHRoZSB1bml2ZXJzZS4KQEAgLTg3OSwxNiArMTk5LDYgQEAKIC8qKiBNaW5pbXVtIG1hZ25ldGljIGZpZWxkIG9uIEVhcnRoJ3Mgc3VyZmFjZSAqLwogI2RlZmluZSBNQUdORVRJQ19GSUVMRF9FQVJUSF9NSU4gICAgKDMwLjBmKQogCi0vKioKLSAqIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgc3RhdHVzIGZpZWxkIG9mIHNlbnNvciBldmVudHMuCi0gKi8KLSNkZWZpbmUgU0VOU09SX1NUQVRVU19OT19DT05UQUNUICAgICAgICAtMQotI2RlZmluZSBTRU5TT1JfU1RBVFVTX1VOUkVMSUFCTEUgICAgICAgIDAKLSNkZWZpbmUgU0VOU09SX1NUQVRVU19BQ0NVUkFDWV9MT1cgICAgICAxCi0jZGVmaW5lIFNFTlNPUl9TVEFUVVNfQUNDVVJBQ1lfTUVESVVNICAgMgotI2RlZmluZSBTRU5TT1JfU1RBVFVTX0FDQ1VSQUNZX0hJR0ggICAgIDMKLQotCiBzdHJ1Y3Qgc2Vuc29yX3Q7CiAKIC8qKgpAQCAtOTEzLDcgKzIyMyw3IEBACiB9IHNlbnNvcnNfdmVjX3Q7CiAKIC8qKgotICogdW5jYWxpYnJhdGVkIGd5cm9zY29wZSBhbmQgbWFnbmV0b21ldGVyIGV2ZW50IGRhdGEKKyAqIHVuY2FsaWJyYXRlZCBhY2NlbGVyb21ldGVyLCBneXJvc2NvcGUgYW5kIG1hZ25ldG9tZXRlciBldmVudCBkYXRhCiAgKi8KIHR5cGVkZWYgc3RydWN0IHsKICAgdW5pb24gewpAQCAtOTgwLDc1ICsyOTAsNiBAQAogICAgIH07CiB9IGFkZGl0aW9uYWxfaW5mb19ldmVudF90OwogCi10eXBlZGVmIGVudW0gYWRkaXRpb25hbF9pbmZvX3R5cGUgewotICAgIC8vCi0gICAgQUlORk9fQkVHSU4gPSAweDAsICAgICAgICAgICAgICAgICAgICAgIC8vIE1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmcmFtZXMKLSAgICBBSU5GT19FTkQgICA9IDB4MSwgICAgICAgICAgICAgICAgICAgICAgLy8gTWFya3MgdGhlIGVuZCBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZyYW1lcwotICAgIC8vIEJhc2ljIGluZm9ybWF0aW9uCi0gICAgQUlORk9fVU5UUkFDS0VEX0RFTEFZID0gIDB4MTAwMDAsICAgICAgIC8vIEVzdGltYXRpb24gb2YgdGhlIGRlbGF5IHRoYXQgaXMgbm90IHRyYWNrZWQgYnkgc2Vuc29yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRpbWVzdGFtcHMuIFRoaXMgaW5jbHVkZXMgZGVsYXkgaW50cm9kdWNlZCBieQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZW5zb3IgZnJvbnQtZW5kIGZpbHRlcmluZywgZGF0YSB0cmFuc3BvcnQsIGV0Yy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxvYXRbMl06IGRlbGF5IGluIHNlY29uZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBlc3RpbWF0ZWQgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLSAgICBBSU5GT19JTlRFUk5BTF9URU1QRVJBVFVSRSwgICAgICAgICAgICAgLy8gZmxvYXQ6IENlbHNpdXMgdGVtcGVyYXR1cmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi0gICAgQUlORk9fVkVDM19DQUxJQlJBVElPTiwgICAgICAgICAgICAgICAgIC8vIEZpcnN0IHRocmVlIHJvd3Mgb2YgYSBob21vZ2VuZW91cyBtYXRyaXgsIHdoaWNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcHJlc2VudHMgY2FsaWJyYXRpb24gdG8gYSB0aHJlZS1lbGVtZW50IHZlY3RvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByYXcgc2Vuc29yIHJlYWRpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsb2F0WzEyXTogM3g0IG1hdHJpeCBpbiByb3cgbWFqb3Igb3JkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLSAgICBBSU5GT19TRU5TT1JfUExBQ0VNRU5ULCAgICAgICAgICAgICAgICAgLy8gTG9jYXRpb24gYW5kIG9yaWVudGF0aW9uIG9mIHNlbnNvciBlbGVtZW50IGluIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXZpY2UgZnJhbWU6IG9yaWdpbiBpcyB0aGUgZ2VvbWV0cmljIGNlbnRlciBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9iaWxlIGRldmljZSBzY3JlZW4gc3VyZmFjZTsgdGhlIGF4aXMgZGVmaW5pdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZXNwb25kcyB0byBBbmRyb2lkIHNlbnNvciBkZWZpbml0aW9ucy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxvYXRbMTJdOiAzeDQgbWF0cml4IGluIHJvdyBtYWpvciBvcmRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwotICAgIEFJTkZPX1NBTVBMSU5HLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmbG9hdFsyXTogcmF3IHNhbXBsZSBwZXJpb2QgaW4gc2Vjb25kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBzYW1wbGluZyBwZXJpb2QKLQotICAgIC8vIFNhbXBsaW5nIGNoYW5uZWwgbW9kZWxpbmcgaW5mb3JtYXRpb24KLSAgICBBSU5GT19DSEFOTkVMX05PSVNFID0gMHgyMDAwMCwgICAgICAgICAgLy8gaW50MzJfdDogbm9pc2UgdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmbG9hdFtuXTogcGFyYW1ldGVycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwotICAgIEFJTkZPX0NIQU5ORUxfU0FNUExFUiwgICAgICAgICAgICAgICAgICAvLyBmbG9hdFszXTogc2FtcGxlIHBlcmlvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHNhbXBsZSBwZXJpb2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICBxdWFudGl6YXRpb24gdW5pdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwotICAgIEFJTkZPX0NIQU5ORUxfRklMVEVSLCAgICAgICAgICAgICAgICAgICAvLyBSZXByZXNlbnRzIGEgZmlsdGVyOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIFxzdW1faiBhX2ogeVtuLWpdID09IFxzdW1faSBiX2kgeFtuLWldCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludDMyX3RbM106IG51bWJlciBvZiBmZWVkZm9yd2FyZCBjb2VmZmljaWVudHMsIE0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIG51bWJlciBvZiBmZWVkYmFjayBjb2VmZmljaWVudHMsIE4sIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgIEZJUiBmaWx0ZXIsIE49MS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgYml0IG1hc2sgdGhhdCByZXByZXNlbnRzIHdoaWNoIGVsZW1lbnQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICB3aGljaCB0aGUgZmlsdGVyIGlzIGFwcGxpZWQsIGJpdCAwID09IDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICBtZWFucyB0aGlzIGZpbHRlciBhcHBsaWVzIHRvIHZlY3RvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgIGVsZW1lbnQgMC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxvYXRbTStOXTogZmlsdGVyIGNvZWZmaWNpZW50cyAoYjAsIGIxLCAuLi4sIEJNLTEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICB0aGVuIChhMCwgYTEsIC4uLiwgYU4tMSksIGEwIGlzIGFsd2F5cyAxLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBNdWx0aXBsZSBmcmFtZXMgbWF5IGJlIG5lZWRlZCBmb3IgaGlnaGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIG51bWJlciBvZiB0YXBzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwotICAgIEFJTkZPX0NIQU5ORUxfTElORUFSX1RSQU5TRk9STSwgICAgICAgICAvLyBpbnQzMl90WzJdOiBzaXplIGluIChyb3csIGNvbHVtbikgLi4uIDFzdCBmcmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmbG9hdFtuXTogbWF0cml4IGVsZW1lbnQgdmFsdWVzIGluIHJvdyBtYWpvciBvcmRlci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLSAgICBBSU5GT19DSEFOTkVMX05PTkxJTkVBUl9NQVAsICAgICAgICAgICAgLy8gaW50MzJfdFsyXTogZXh0cmFwb2xhdGUgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGludGVycG9sYXRlIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmbG9hdFtuXTogbWFwcGluZyBrZXkgcG9pbnRzIGluIHBhaXJzLCAoaW4sIG91dCkuLi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgIChtYXkgYmUgdXNlZCB0byBtb2RlbCBzYXR1cmF0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwotICAgIEFJTkZPX0NIQU5ORUxfUkVTQU1QTEVSLCAgICAgICAgICAgICAgICAvLyBpbnQzMl90OiAgcmVzYW1wbGUgbWV0aG9kICgwLXRoIG9yZGVyLCAxc3Qgb3JkZXIuLi4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsb2F0WzFdOiByZXNhbXBsZSByYXRpbyAodXBzYW1wbGluZyBpZiA8IDEuMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgIGRvd25zYW1wbGluZyBpZiA+IDEuMCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi0KLSAgICAvLyBDdXN0b20gaW5mb3JtYXRpb24KLSAgICBBSU5GT19DVVNUT01fU1RBUlQgPSAgICAweDEwMDAwMDAwLCAgICAgLy8KLSAgICAvLyBEZWJ1Z2dpbmcKLSAgICBBSU5GT19ERUJVR0dJTkdfU1RBUlQgPSAweDQwMDAwMDAwLCAgICAgLy8KLX0gYWRkaXRpb25hbF9pbmZvX3R5cGVfdDsKLQogLyoqCiAgKiBVbmlvbiBvZiB0aGUgdmFyaW91cyB0eXBlcyBvZiBzZW5zb3IgZGF0YQogICogdGhhdCBjYW4gYmUgcmV0dXJuZWQuCkBAIC0xMTA2LDYgKzM0Nyw5IEBACiAgICAgICAgICAgICAvKiB1bmNhbGlicmF0ZWQgbWFnbmV0b21ldGVyIHZhbHVlcyBhcmUgaW4gbWljcm8tVGVzbGFzICovCiAgICAgICAgICAgICB1bmNhbGlicmF0ZWRfZXZlbnRfdCB1bmNhbGlicmF0ZWRfbWFnbmV0aWM7CiAKKyAgICAgICAgICAgIC8qIHVuY2FsaWJyYXRlZCBhY2NlbGVyb21ldGVyIHZhbHVlcyBhcmUgaW4gIG1ldGVyIHBlciBzZWNvbmQgcGVyIHNlY29uZCAobS9zXjIpICovCisgICAgICAgICAgICB1bmNhbGlicmF0ZWRfZXZlbnRfdCB1bmNhbGlicmF0ZWRfYWNjZWxlcm9tZXRlcjsKKwogICAgICAgICAgICAgLyogaGVhcnQgcmF0ZSBkYXRhIGNvbnRhaW5pbmcgdmFsdWUgaW4gYnBtIGFuZCBzdGF0dXMgKi8KICAgICAgICAgICAgIGhlYXJ0X3JhdGVfZXZlbnRfdCBoZWFydF9yYXRlOwogCkBAIC0xMjI4LDEzICs0NzIsMTQgQEAKICAgICAgKi8KICAgICB1aW50MzJfdCAgICAgICAgZmlmb01heEV2ZW50Q291bnQ7CiAKLSAgICAvKiB0eXBlIG9mIHRoaXMgc2Vuc29yIGFzIGEgc3RyaW5nLiBTZXQgdG8gY29ycmVzcG9uZGluZwotICAgICAqIFNFTlNPUl9TVFJJTkdfVFlQRV8qLgotICAgICAqIFdoZW4gZGVmaW5pbmcgYW4gT0VNIHNwZWNpZmljIHNlbnNvciBvciBzZW5zb3IgbWFudWZhY3R1cmVyIHNwZWNpZmljCi0gICAgICogc2Vuc29yLCB1c2UgeW91ciByZXNlcnZlIGRvbWFpbiBuYW1lIGFzIGEgcHJlZml4LgotICAgICAqIGV4OiBjb20uZ29vZ2xlLmdsYXNzLm9uaGVhZGRldGVjdG9yCi0gICAgICogRm9yIHNlbnNvcnMgb2Yga25vd24gdHlwZSwgdGhlIGFuZHJvaWQgZnJhbWV3b3JrIG1pZ2h0IG92ZXJ3cml0ZSB0aGlzCi0gICAgICogc3RyaW5nIGF1dG9tYXRpY2FsbHkuCisgICAgLyogdHlwZSBvZiB0aGlzIHNlbnNvciBhcyBhIHN0cmluZy4KKyAgICAgKgorICAgICAqIElmIHR5cGUgaXMgT0VNIHNwZWNpZmljIG9yIHNlbnNvciBtYW51ZmFjdHVyZXIgc3BlY2lmaWMgdHlwZQorICAgICAqICg+PVNFTlNPUl9UWVBFX0RFVklDRV9QUklWQVRFX0JBU0UpLCB0aGlzIHN0cmluZyBtdXN0IGJlIGRlZmluZWQgd2l0aCByZXNlcnZlZCBkb21haW4gb2YKKyAgICAgKiB2ZW5kb3IvT0VNIGFzIGEgcHJlZml4LCBlLmcuIGNvbS5nb29nbGUuZ2xhc3Mub25oZWFkZGV0ZWN0b3IKKyAgICAgKgorICAgICAqIEZvciBzZW5zb3JzIG9mIEFuZHJvaWQgZGVmaW5lZCB0eXBlcywgQW5kcm9pZCBmcmFtZXdvcmsgd2lsbCBvdmVycmlkZSB0aGlzIHZhbHVlLiBJdCBpcyBvayB0bworICAgICAqIGxlYXZlIGl0IHBvaW50aW5nIHRvIGFuIGVtcHR5IHN0cmluZy4KICAgICAgKi8KICAgICBjb25zdCBjaGFyKiAgICBzdHJpbmdUeXBlOwogCkBAIC0xMjgwLDYgKzUyNSwyMyBAQAogICAgIHZvaWQqICAgICAgICAgICByZXNlcnZlZFsyXTsKIH07CiAKKy8qKgorICogU2hhcmVkIG1lbW9yeSBpbmZvcm1hdGlvbiBmb3IgYSBkaXJlY3QgY2hhbm5lbAorICovCitzdHJ1Y3Qgc2Vuc29yc19kaXJlY3RfbWVtX3QgeworICAgIGludCB0eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVudW0gU0VOU09SX0RJUkVDVF9NRU1fLi4uCisgICAgaW50IGZvcm1hdDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW51bSBTRU5TT1JfRElSRUNUX0ZNVF8uLi4KKyAgICBzaXplX3Qgc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaXplIG9mIHRoZSBtZW1vcnkgcmVnaW9uLCBpbiBieXRlcworICAgIGNvbnN0IHN0cnVjdCBuYXRpdmVfaGFuZGxlICpoYW5kbGU7IC8vIHNoYXJlZCBtZW1vcnkgaGFuZGxlLCB3aGljaCBpcyBpbnRlcnByZXRlZCBkaWZmZXJlbnRseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlcGVuZGluZyBvbiB0eXBlCit9OworCisvKioKKyAqIERpcmVjdCBjaGFubmVsIHJlcG9ydCBjb25maWd1cmF0aW9uCisgKi8KK3N0cnVjdCBzZW5zb3JzX2RpcmVjdF9jZmdfdCB7CisgICAgaW50IHJhdGVfbGV2ZWw7ICAgICAgICAgICAgIC8vIGVudW0gU0VOU09SX0RJUkVDVF9SQVRFXy4uLgorfTsKIAogLyoKICAqIHNlbnNvcnNfcG9sbF9kZXZpY2VfdCBpcyB1c2VkIHdpdGggU0VOU09SU19ERVZJQ0VfQVBJX1ZFUlNJT05fMF8xCkBAIC0xMzM2LDcgKzU5OCwxMyBAQAogICAgICAgICAgICAgICAgICAgICBpbnQgc2Vuc29yX2hhbmRsZSwgaW50NjRfdCBzYW1wbGluZ19wZXJpb2RfbnMpOwogCiAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2Ygc2Vuc29yIGRhdGEuCisgICAgICAgICAgICAgKiBXcml0ZSBhbiBhcnJheSBvZiBzZW5zb3JfZXZlbnRfdCB0byBkYXRhLiBUaGUgc2l6ZSBvZiB0aGUKKyAgICAgICAgICAgICAqIGF2YWlsYWJsZSBidWZmZXIgaXMgc3BlY2lmaWVkIGJ5IGNvdW50LiBSZXR1cm5zIG51bWJlciBvZgorICAgICAgICAgICAgICogdmFsaWQgc2Vuc29yX2V2ZW50X3QuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmxvY2sgaWYgdGhlcmUgaXMgbm8gc2Vuc29yIGV2ZW50CisgICAgICAgICAgICAgKiBhdmFpbGFibGUgd2hlbiBiZWluZyBjYWxsZWQuIFRodXMsIHJldHVybiB2YWx1ZSBzaG91bGQgYWx3YXlzIGJlCisgICAgICAgICAgICAgKiBwb3NpdGl2ZS4KICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgaW50ICgqcG9sbCkoc3RydWN0IHNlbnNvcnNfcG9sbF9kZXZpY2VfdCAqZGV2LAogICAgICAgICAgICAgICAgICAgICBzZW5zb3JzX2V2ZW50X3QqIGRhdGEsIGludCBjb3VudCk7CkBAIC0xMzgxLDcgKzY0OSw2MSBAQAogICAgICAqLwogICAgIGludCAoKmluamVjdF9zZW5zb3JfZGF0YSkoc3RydWN0IHNlbnNvcnNfcG9sbF9kZXZpY2VfMSAqZGV2LCBjb25zdCBzZW5zb3JzX2V2ZW50X3QgKmRhdGEpOwogCi0gICAgdm9pZCAoKnJlc2VydmVkX3Byb2NzWzddKSh2b2lkKTsKKyAgICAvKgorICAgICAqIFJlZ2lzdGVyL3VucmVnaXN0ZXIgZGlyZWN0IHJlcG9ydCBjaGFubmVsLgorICAgICAqCisgICAgICogQSBIQUwgZGVjbGFyZXMgc3VwcG9ydCBmb3IgZGlyZWN0IHJlcG9ydCBieSBzZXR0aW5nIG5vbi1OVUxMIHZhbHVlcyBmb3IgYm90aAorICAgICAqIHJlZ2lzdGVyX2RpcmVjdF9jaGFubmVsIGFuZCBjb25maWdfZGlyZWN0X3JlcG9ydC4KKyAgICAgKgorICAgICAqIFRoaXMgZnVuY3Rpb24gaGFzIHR3byBvcGVyYXRpb24gbW9kZXM6CisgICAgICoKKyAgICAgKiBSZWdpc3RlcjogbWVtICE9IE5VTEwsIHJlZ2lzdGVyIGEgY2hhbm5lbCB1c2luZyBzdXBwbGllZCBzaGFyZWQgbWVtb3J5IGluZm9ybWF0aW9uLiBCeSB0aGUKKyAgICAgKiB0aW1lIHRoaXMgZnVuY3Rpb24gcmV0dXJucywgc2Vuc29ycyBtdXN0IGZpbmlzaCBpbml0aWFsaXppbmcgc2hhcmVkIG1lbW9yeSBjb250ZW50CisgICAgICogKGZvcm1hdCBkZXBlbmRlbnQsIHNlZSBTRU5TT1JfRElSRUNUX0ZNVF8qKS4KKyAgICAgKiAgICAgIFBhcmFtZXRlcnM6CisgICAgICogICAgICAgICAgbWVtICAgICAgICAgICAgIHBvaW50cyB0byBhIHZhbGlkIHN0cnVjdCBzZW5zb3JzX2RpcmVjdF9tZW1fdC4KKyAgICAgKiAgICAgICAgICBjaGFubmVsX2hhbmRsZSAgaXMgaWdub3JlZC4KKyAgICAgKiAgICAgIFJldHVybiB2YWx1ZToKKyAgICAgKiAgICAgICAgICBBIGhhbmRsZSBvZiBjaGFubmVsICg+MCwgPElOVDMyX01BWCkgd2hlbiBzdWNjZXNzLCB3aGljaCBsYXRlciBjYW4gYmUgcmVmZXJyZWQgaW4KKyAgICAgKiAgICAgICAgICB1bnJlZ2lzdGVyIG9yIGNvbmZpZ19kaXJlY3RfcmVwb3J0IGNhbGwsIG9yIGVycm9yIGNvZGUgKDwwKSB3aGVuIGZhaWxlZAorICAgICAqIFVucmVnaXN0ZXI6IG1lbSA9PSBOVUxMLCB1bnJlZ2lzdGVyIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIGNoYW5uZWwuCisgICAgICogICAgICBQYXJhbWV0ZXJzOgorICAgICAqICAgICAgICAgIG1lbSAgICAgICAgICAgICBzZXQgdG8gTlVMTAorICAgICAqICAgICAgICAgIGNoYW5uZWxfaGFuZGxlICBjb250YWlucyBoYW5kbGUgb2YgY2hhbm5lbCB0byBiZSB1bnJlZ2lzdGVyZWQKKyAgICAgKiAgICAgIFJldHVybiB2YWx1ZToKKyAgICAgKiAgICAgICAgICAwLCBldmVuIGlmIHRoZSBjaGFubmVsX2hhbmRsZSBpcyBpbnZhbGlkLCBpbiB3aGljaCBjYXNlIGl0IHdpbGwgYmUgYSBuby1vcC4KKyAgICAgKi8KKyAgICBpbnQgKCpyZWdpc3Rlcl9kaXJlY3RfY2hhbm5lbCkoc3RydWN0IHNlbnNvcnNfcG9sbF9kZXZpY2VfMSAqZGV2LAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IHNlbnNvcnNfZGlyZWN0X21lbV90KiBtZW0sIGludCBjaGFubmVsX2hhbmRsZSk7CisKKyAgICAvKgorICAgICAqIENvbmZpZ3VyZSBkaXJlY3Qgc2Vuc29yIGV2ZW50IHJlcG9ydCBpbiBkaXJlY3QgY2hhbm5lbC4KKyAgICAgKgorICAgICAqIFN0YXJ0LCBtb2RpZnkgcmF0ZSBvciBzdG9wIGRpcmVjdCByZXBvcnQgb2YgYSBzZW5zb3IgaW4gYSBjZXJ0YWluIGRpcmVjdCBjaGFubmVsLiBBIHNwZWNpYWwKKyAgICAgKiBjYXNlIGlzIHNldHRpbmcgc2Vuc29yIGhhbmRsZSAtMSB0byBzdG9wIG1lYW5zIHRvIHN0b3AgYWxsIGFjdGl2ZSBzZW5zb3IgcmVwb3J0IG9uIHRoZQorICAgICAqIGNoYW5uZWwgc3BlY2lmaWVkLgorICAgICAqCisgICAgICogQSBIQUwgZGVjbGFyZXMgc3VwcG9ydCBmb3IgZGlyZWN0IHJlcG9ydCBieSBzZXR0aW5nIG5vbi1OVUxMIHZhbHVlcyBmb3IgYm90aAorICAgICAqIHJlZ2lzdGVyX2RpcmVjdF9jaGFubmVsIGFuZCBjb25maWdfZGlyZWN0X3JlcG9ydC4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogICAgICBzZW5zb3JfaGFuZGxlICAgc2Vuc29yIHRvIGJlIGNvbmZpZ3VyZWQuIFRoZSBzZW5zb3IgaGFzIHRvIHN1cHBvcnQgZGlyZWN0IHJlcG9ydAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG1vZGUgYnkgc2V0dGluZyBmbGFncyBvZiBzZW5zb3JfdC4gQWxzbywgZGlyZWN0IHJlcG9ydCBtb2RlIGlzIG9ubHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIGZvciBjb250aW51b3VzIHJlcG9ydGluZyBtb2RlIHNlbnNvcnMuCisgICAgICogICAgICBjaGFubmVsX2hhbmRsZSAgY2hhbm5lbCBoYW5kbGUgdG8gYmUgY29uZmlndXJlZC4KKyAgICAgKiAgICAgIGNvbmZpZyAgICAgICAgICBkaXJlY3QgcmVwb3J0IHBhcmFtZXRlcnMsIHNlZSBzZW5zb3JfZGlyZWN0X2NmZ190LgorICAgICAqIFJldHVybiB2YWx1ZToKKyAgICAgKiAgICAgIC0gd2hlbiBzZW5zb3IgaXMgc3RhcnRlZCBvciBzZW5zb3IgcmF0ZSBsZXZlbCBpcyBjaGFuZ2VkOiByZXR1cm4gcG9zaXRpdmUgaWRlbnRpZmllciBvZgorICAgICAqICAgICAgICBzZW5zb3IgaW4gc3BlY2lmaWVkIGNoYW5uZWwgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIHJldHVybiBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAqICAgICAgLSB3aGVuIHNlbnNvciBpcyBzdG9wcGVkOiByZXR1cm4gMCBmb3Igc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIGZvciBmYWlsdXJlLgorICAgICAqLworICAgIGludCAoKmNvbmZpZ19kaXJlY3RfcmVwb3J0KShzdHJ1Y3Qgc2Vuc29yc19wb2xsX2RldmljZV8xICpkZXYsCisgICAgICAgICAgICBpbnQgc2Vuc29yX2hhbmRsZSwgaW50IGNoYW5uZWxfaGFuZGxlLCBjb25zdCBzdHJ1Y3Qgc2Vuc29yc19kaXJlY3RfY2ZnX3QgKmNvbmZpZyk7CisKKyAgICAvKgorICAgICAqIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLCBtdXN0IGJlIHplcm8uCisgICAgICovCisgICAgdm9pZCAoKnJlc2VydmVkX3Byb2NzWzVdKSh2b2lkKTsKIAogfSBzZW5zb3JzX3BvbGxfZGV2aWNlXzFfdDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oYXJkd2FyZS92ZWhpY2xlLmggYi9pbmNsdWRlL2hhcmR3YXJlL3ZlaGljbGUuaAppbmRleCBhNTkwZmJkLi44YjI4ZTdhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2hhcmR3YXJlL3ZlaGljbGUuaAorKysgYi9pbmNsdWRlL2hhcmR3YXJlL3ZlaGljbGUuaApAQCAtODMsNyArODMsNiBAQAogCiAvKioKICAqIEludmFsaWQgcHJvcGVydHkgdmFsdWUgdXNlZCBmb3IgYXJndW1lbnQgd2hlcmUgaW52YWxpZCBwcm9wZXJ0eSBnaXZlcyBkaWZmZXJlbnQgcmVzdWx0LgotICogQHJhbmdlX3N0YXJ0CiAgKi8KICNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9JTlZBTElEICgweDApCiAKQEAgLTEyMiw3ICsxMjEsNyBAQAogICogQGRhdGFfbWVtYmVyIGluZm9fbW9kZWxfeWVhcgogICogQHVuaXQgVkVISUNMRV9VTklUX1RZUEVfWUVBUgogICovCi0jZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfSU5GT19NT0RFTF9ZRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAxMDMpCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfSU5GT19NT0RFTF9ZRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMTAzKQogCiAvKioKICAqIEZ1ZWwgY2FwYWNpdHkgb2YgdGhlIHZlaGljbGUKQEAgLTI1Myw3ICsyNTIsNyBAQAogCiAKIAotIC8vPT09PSBIVkFDIFByb3BlcnRpZXMgPT09PQorLy89PT09IEhWQUMgUHJvcGVydGllcyA9PT09CiAKIC8qKgogICogRmFuIHNwZWVkIHNldHRpbmcKQEAgLTI2MSw4ICsyNjAsNyBAQAogICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKICAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCiAgKiBAZGF0YV9tZW1iZXIgaHZhYy5mYW5fc3BlZWQKLSAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FCi0gKiBAZGF0YV9lbnVtIFRPRE8KKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfWk9ORQogICogQGFsbG93X291dF9vZl9yYW5nZV92YWx1ZSA6IE9GRgogICovCiAjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfSFZBQ19GQU5fU1BFRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwNTAwKQpAQCAtMjczLDggKzI3MSw4IEBACiAgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQogICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKICAqIEBkYXRhX21lbWJlciBodmFjLmZhbl9kaXJlY3Rpb24KLSAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FCi0gKiBAZGF0YV9lbnVtIFRPRE8KKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfWk9ORQorICogQGRhdGFfZW51bSB2ZWhpY2xlX2h2YWNfZmFuX2RpcmVjdGlvbgogICogQGFsbG93X291dF9vZl9yYW5nZV92YWx1ZSA6IE9GRgogICovCiAjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfSFZBQ19GQU5fRElSRUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwNTAxKQpAQCAtMjkzLDkgKzI5MSw5IEBACiAvKioKICAqIEhWQUMgY3VycmVudCB0ZW1wZXJhdHVyZS4KICAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9GTE9BVAotICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0V8VkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX0NPTlRJTlVPVVMKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCiAgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQotICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfWk9ORQogICogQGRhdGFfbWVtYmVyIGh2YWMudGVtcGVyYXR1cmVfY3VycmVudAogICovCiAjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfSFZBQ19URU1QRVJBVFVSRV9DVVJSRU5UICAgICAgICAgICAgICAgICAgICgweDAwMDAwNTAyKQpAQCAtMzAzLDkgKzMwMSw5IEBACiAvKioKICAqIEhWQUMsIHRhcmdldCB0ZW1wZXJhdHVyZSBzZXQuCiAgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfRkxPQVQKLSAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFfFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9DT05USU5VT1VTCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQogICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKLSAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1pPTkUKICAqIEBkYXRhX21lbWJlciBodmFjLnRlbXBlcmF0dXJlX3NldAogICogQGFsbG93X291dF9vZl9yYW5nZV92YWx1ZSA6IE1JTiAvIE1BWCAvIE9GRgogICovCkBAIC0zMTYsNyArMzE0LDcgQEAKICAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9CT09MRUFOCiAgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQogICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKLSAqIEB6b25lX3R5cGUgVkVISUNMRV9XSU5ET1cKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfV0lORE9XCiAgKiBAZGF0YV9tZW1iZXIgaHZhYy5kZWZyb3N0X29uCiAgKi8KICNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9IVkFDX0RFRlJPU1RFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDA1MDQpCkBAIC0zMjcsNyArMzI1LDcgQEAKICAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCiAgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQogICogQGNvbmZpZ19mbGFncyBTdXBwb3J0ZWQgem9uZXMKLSAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1pPTkUKICAqIEBkYXRhX21lbWJlciBodmFjLmFjX29uCiAgKi8KICNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9IVkFDX0FDX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDA1MDUpCkBAIC0zMzcsNyArMzM1LDcgQEAKICAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9CT09MRUFOCiAgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQogICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKLSAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1pPTkUKICAqIEBkYXRhX21lbWJlciBodmFjLm1heF9hY19vbgogICovCiAjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfSFZBQ19NQVhfQUNfT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwNTA2KQpAQCAtMzQ3LDcgKzM0NSw3IEBACiAgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfQk9PTEVBTgogICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKICAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCi0gKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9aT05FCiAgKiBAZGF0YV9tZW1iZXIgaHZhYy5tYXhfZGVmcm9zdF9vbgogICovCiAjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfSFZBQ19NQVhfREVGUk9TVF9PTiAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwNTA3KQpAQCAtMzU3LDcgKzM1NSw3IEBACiAgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfQk9PTEVBTgogICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKICAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCi0gKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9aT05FCiAgKiBAZGF0YV9tZW1iZXIgaHZhYy5tYXhfcmVjaXJjX29uCiAgKi8KICNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9IVkFDX1JFQ0lSQ19PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDA1MDgpCkBAIC0zNjcsMTIgKzM2NSw5NCBAQAogICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0JPT0xFQU4KICAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCiAgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQotICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfWk9ORQogICogQGRhdGFfbWVtYmVyIGh2YWMuZHVhbF9vbgogICovCiAjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfSFZBQ19EVUFMX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwNTA5KQogCiAvKioKKyAqIE9uL29mZiBhdXRvbWF0aWMgbW9kZQorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0JPT0xFQU4KKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9aT05FCisgKiBAZGF0YV9tZW1iZXIgaHZhYy5hdXRvX29uCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9IVkFDX0FVVE9fT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDA1MEEpCisKKy8qKgorICogU2VhdCB0ZW1wZXJhdHVyZQorICoKKyAqIE5lZ2F0aXZlIHZhbHVlcyBpbmRpY2F0ZSBjb29saW5nLgorICogMCBpbmRpY2F0ZXMgb2ZmLgorICogUG9zaXRpdmUgdmFsdWVzIGluZGljYXRlIGhlYXRpbmcuCisgKgorICogU29tZSB2ZWhpY2xlcyBtYXkgaGF2ZSBtdWx0aXBsZSBsZXZlbHMgb2YgaGVhdGluZyBhbmQgY29vbGluZy4gVGhlIG1pbi9tYXgKKyAqIHJhbmdlIGRlZmluZXMgdGhlIGFsbG93YWJsZSByYW5nZSBhbmQgbnVtYmVyIG9mIHN0ZXBzIGluIGVhY2ggZGlyZWN0aW9uLgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1NFQVQKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfSFZBQ19TRUFUX1RFTVBFUkFUVVJFICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwNTBCKQorCisvKioKKyAqIFNpZGUgTWlycm9yIEhlYXQKKyAqCisgKiBJbmNyZWFzZSB2YWx1ZXMgZGVub3RlIGhpZ2hlciBoZWF0aW5nIGxldmVscyBmb3Igc2lkZSBtaXJyb3JzLgorICogMCBpbmRpY2F0ZXMgaGVhdGluZyBpcyB0dXJuZWQgb2ZmLgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0hWQUNfU0lERV9NSVJST1JfSEVBVCAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDUwQykKKworLyoqCisgKiBTdGVlcmluZyBXaGVlbCBUZW1wZXJhdHVyZQorICoKKyAqIFNldHMgdGhlIHRlbXBlcmF0dXJlIGZvciB0aGUgc3RlZXJpbmcgd2hlZWwKKyAqIFBvc2l0aXZlIHZhbHVlIGluZGljYXRlcyBoZWF0aW5nLgorICogTmVnYXRpdmUgdmFsdWUgaW5kaWNhdGVzIGNvb2xpbmcuCisgKiAwIGluZGljYXRlcyB0ZW1wcmVhdHVyZSBjb250cm9sIGlzIG9mZi4KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9IVkFDX1NURUVSSU5HX1dIRUVMX1RFTVAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDA1MEQpCisKKy8qKgorICogVGVtcGVyYXR1cmUgdW5pdHMKKyAqCisgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdGVtcGVyYXR1cmUgaXMgaW4gQ2Vsc2l1cywgRmFocmVuaGVpdCwgb3IgYSBkaWZmZXJlbnQgdW5pdC4KKyAqIFRoaXMgcGFyYW1ldGVyIGFmZmVjdHMgYWxsIEhWQUMgdGVtcGVyYXR1cmVzIGluIHRoZSBzeXN0ZW0uCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQUQKKyAqIEBkYXRhX2VudW0gdmVoaWNsZV91bml0X3R5cGUKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfSFZBQ19URU1QRVJBVFVSRV9VTklUUyAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwNTBFKQorCisvKioKKyAqIEFjdHVhbCBmYW4gc3BlZWQKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFECisgKiBAZGF0YV9tZW1iZXIgaHZhYy5mYW5fc3BlZWQKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfWk9ORQorICogQGFsbG93X291dF9vZl9yYW5nZV92YWx1ZSA6IE9GRgorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfSFZBQ19BQ1RVQUxfRkFOX1NQRUVEX1JQTSAgICAgICAgICAgICAgICAgICgweDAwMDAwNTBGKQorCisKKy8qKgogICogUmVwcmVzZW50cyBwb3dlciBzdGF0ZSBmb3IgSFZBQy4gU29tZSBIVkFDIHByb3BlcnRpZXMgd2lsbCByZXF1aXJlIG1hdGNoaW5nIHBvd2VyIHRvIGJlIHR1cm5lZCBvbgogICogdG8gZ2V0IG91dCBvZiBPRkYgc3RhdGUuIEZvciBub24tem9uZWQgSFZBQyBwcm9wZXJ0aWVzLCBWRUhJQ0xFX0FMTF9aT05FIGNvcnJlc3BvbmRzIHRvCiAgKiBnbG9iYWwgcG93ZXIgc3RhdGUuCkBAIC0zODMsMTIgKzQ2MywzMSBAQAogICogQGNvbmZpZ19zdHJpbmcgbGlzdCBvZiBIVkFDIHByb3BlcnRpZXMgd2hvc2UgcG93ZXIgaXMgY29udHJvbGxlZCBieSB0aGlzIHByb3BlcnR5LiBGb3JtYXQgaXMKICAqICAgICAgICAgICAgICAgIGhleGEtZGVjaW1hbCBudW1iZXIgKDB4Li4uKSBzZXBhcmF0ZWQgYnkgY29tbWEgbGlrZSAiMHg1MDAsMHg1MDMiLiBBbGwgem9uZXMKICAqICAgICAgICAgICAgICAgIGRlZmluZWQgaW4gdGhlc2UgYWZmZWN0ZWQgcHJvcGVydGllcyBzaG91bGQgYmUgYXZhaWxhYmxlIGluIHRoZSBwcm9wZXJ0eS4KLSAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1pPTkUKICAqIEBkYXRhX21lbWJlciBodmFjLnBvd2VyX29uCiAgKi8KICNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9IVkFDX1BPV0VSX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDA1MTApCiAKIC8qKgorICogRmFuIFBvc2l0aW9ucyBBdmFpbGFibGUKKyAqCisgKiBUaGlzIGlzIGEgYml0IG1hc2sgb2YgZmFuIHBvc2l0aW9ucyBhdmFpbGFibGUgZm9yIHRoZSB6b25lLiAgRWFjaCBlbnRyeSBpbgorICogdmVoaWNsZV9odmFjX2Zhbl9kaXJlY3Rpb24gaXMgc2VsZWN0ZWQgYnkgYml0IHBvc2l0aW9uLiAgRm9yIGluc3RhbmNlLCBpZgorICogb25seSB0aGUgRkFOX0RJUkVDVElPTl9GQUNFICgweDEpIGFuZCBGQU5fRElSRUNUSU9OX0RFRlJPU1QgKDB4NCkgYXJlIGF2YWlsYWJsZSwKKyAqIHRoZW4gdGhpcyB2YWx1ZSBzaGFsbCBiZSBzZXQgdG8gMHgxMi4KKyAqCisgKiAweDEyID0gKDEgPDwgMSkgfCAoMSA8PCA0KQorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9TVEFUSUMKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFECisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfWk9ORQorICogQGFsbG93X291dF9vZl9yYW5nZV92YWx1ZSA6IE9GRgorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfSFZBQ19GQU5fRElSRUNUSU9OX0FWQUlMQUJMRSAgICAgICAgICAgICAgICgweDAwMDAwNTExKQorCisvKioKICAqIE91dHNpZGUgdGVtcGVyYXR1cmUKICAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9GTE9BVAogICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0V8VkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX0NPTlRJTlVPVVMKQEAgLTM5Niw4ICs0OTUsNyBAQAogICogQGRhdGFfbWVtYmVyIG91dHNpZGVfdGVtcGVyYXR1cmUKICAqIEB1bml0IFZFSElDTEVfVU5JVF9UWVBFX0NFTENJVVMKICAqLwotCi0jZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfRU5WX09VVFNJREVfVEVNUEVSQVRVUkUgICAgICAgICAgICAgICAgICAgKDB4MDAwMDA3MDMpCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfRU5WX09VVFNJREVfVEVNUEVSQVRVUkUgICAgICAgICAgICAgICAgICAgICgweDAwMDAwNzAzKQogCiAKIC8qKgpAQCAtNDA4LDcgKzUwNiw3IEBACiAgKiBAZGF0YV9tZW1iZXIgY2FiaW5fdGVtcGVyYXR1cmUKICAqIEB1bml0IFZFSElDTEVfVU5JVF9UWVBFX0NFTENJVVMKICAqLwotI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0VOVl9DQUJJTl9URU1QRVJBVFVSRSAgICAgICAgICAgICAgICAgICgweDAwMDAwNzA0KQorI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0VOVl9DQUJJTl9URU1QRVJBVFVSRSAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDcwNCkKIAogCiAvKgpAQCAtNDM0LDcgKzUzMiw3IEBACiAgKiBAY29uZmlnX2ZsYWdzIE51bWJlciBvZiBwcmVzZXRzIHN1cHBvcnRlZAogICogQGRhdGFfbWVtYmVyIGludDMyX2FycmF5CiAgKi8KLSNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9SQURJT19QUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDgwMSkKKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9SQURJT19QUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDA4MDEpCiAKIC8qKgogICogQ29uc3RhbnRzIHJlbGV2YW50IHRvIHJhZGlvLgpAQCAtNDkyLDcgKzU5MCwxMyBAQAogICogICAgICAgICAgICAgICAgICAgICAgIFZFSElDTEVfQVVESU9fRVhUX0ZPQ1VTX0NBUl9QRVJNQU5FTlQgd2hlbiBjYXIgc2lkZSBpcyBwbGF5aW5nIHNvbWV0aGluZwogICogICAgICAgICAgICAgICAgICAgICAgIHBlcm1hbmVudC4KICAqICAgICAgICAgICAgICAgICAgIExPU1NfVFJBTlNJRU5UOiBhbHdheXMgc2hvdWxkIGJlIFZFSElDTEVfQVVESU9fRVhUX0ZPQ1VTX0NBUl9UUkFOU0lFTlQKLSAqICAgaW50MzJfYXJyYXlbM106IHNob3VsZCBiZSB6ZXJvLgorICogICBpbnQzMl9hcnJheVszXTogY29udGV4dCByZXF1ZXN0ZWQgYnkgYW5kcm9pZCBzaWRlIHdoZW4gcmVzcG9uZGluZyB0byBmb2N1cyByZXF1ZXN0LgorICogICAgICAgICAgICAgICAgICAgV2hlbiBjYXIgc2lkZSBpcyB0YWtpbmcgZm9jdXMgYXdheSwgdGhpcyBzaG91bGQgYmUgemVyby4KKyAqCisgKiBBIGZvY3VzIHJlc3BvbnNlIHNob3VsZCBiZSBzZW50IHBlciBlYWNoIGZvY3VzIHJlcXVlc3QgZXZlbiBpZiB0aGVyZSBpcyBubyBjaGFuZ2UgaW4KKyAqIGZvY3VzIHN0YXRlLiBUaGlzIGNhbiBoYXBwZW4gaW4gY2FzZSBsaWtlIGZvY3VzIHJlcXVlc3Qgb25seSBpbnZvbHZpbmcgY29udGV4dCBjaGFuZ2UKKyAqIHdoZXJlIGFuZHJvaWQgc2lkZSBzdGlsbCBuZWVkcyBtYXRjaGluZyBmb2N1cyByZXNwb25zZSB0byBjb25maXJtIHRoYXQgYXVkaW8gbW9kdWxlCisgKiBoYXMgbWFkZSBuZWNlc3NhcnkgY2hhbmdlcy4KICAqCiAgKiBJZiBjYXIgZG9lcyBub3Qgc3VwcG9ydCBWRUhJQ0xFX1BST1BFUlRZX0FVRElPX0ZPQ1VTLCBmb2N1cyBpcyBhc3N1bWVkIHRvIGJlIGdyYW50ZWQgYWx3YXlzLgogICoKQEAgLTUwMSw3ICs2MDUsNyBAQAogICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKICAqIEBkYXRhX21lbWJlciBpbnQzMl9hcnJheQogICovCi0jZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfQVVESU9fRk9DVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDA5MDApCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfQVVESU9fRk9DVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwOTAwKQogCiBlbnVtIHZlaGljbGVfYXVkaW9fZm9jdXNfcmVxdWVzdCB7CiAgICAgVkVISUNMRV9BVURJT19GT0NVU19SRVFVRVNUX0dBSU4gPSAweDEsCkBAIC02MzgsMTMgKzc0MiwyMyBAQAogICAgIFZFSElDTEVfQVVESU9fQ09OVEVYVF9TWVNURU1fU09VTkRfRkxBRyAgICAgICAgICAgICAgID0gMHg0MDAsCiAgICAgLyoqIFJhZGlvIGlzIHBsYXllZCAqLwogICAgIFZFSElDTEVfQVVESU9fQ09OVEVYVF9SQURJT19GTEFHICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDAsCisgICAgLyoqIEV4dCBzb3VyY2UgaXMgcGxheWVkLiBUaGlzIGlzIGZvciB0YWdnaW5nIGdlbmVyaWMgZXh0IHNvdXJjZXMuICovCisgICAgVkVISUNMRV9BVURJT19DT05URVhUX0VYVF9TT1VSQ0VfRkxBRyAgICAgICAgICAgICAgICAgPSAweDEwMDAsCiB9OwogCiAvKioKICAqIFByb3BlcnR5IHRvIGNvbnRyb2wgYXVkaW8gdm9sdW1lIG9mIGVhY2ggYXVkaW8gY29udGV4dC4KICAqCisgKiB2ZWhpY2xlX3Byb3BfY29uZmlnX3QKKyAqICAgY29uZmlnX2FycmF5WzBdIDogYml0IGZsYWdzIG9mIGFsbCBzdXBwb3J0ZWQgYXVkaW8gY29udGV4dHMuIElmIHRoaXMgaXMgMCwKKyAqICAgICAgICAgICAgICAgICAgICAgYXVkaW8gdm9sdW1lIGlzIGNvbnRyb2xsZWQgcGVyIHBoeXNpY2FsIHN0cmVhbQorICogICBjb25maWdfYXJyYXlbMV0gOiBmbGFncyBkZWZpbmVkIGluIHZlaGljbGVfYXVkaW9fdm9sdW1lX2NhcGFiaWxpdHlfZmxhZyB0bworICogICAgICAgICAgICAgICAgICAgICByZXByZXNlbnQgYXVkaW8gbW9kdWxlJ3MgY2FwYWJpbGl0eS4KKyAqCiAgKiBEYXRhIHR5cGUgbG9va3MgbGlrZToKLSAqICAgaW50MzJfYXJyYXlbMF0gOiBzdHJlYW0gY29udGV4dCBhcyBkZWZpbmVkIGluIHZlaGljbGVfYXVkaW9fY29udGV4dF9mbGFnLgorICogICBpbnQzMl9hcnJheVswXSA6IHN0cmVhbSBjb250ZXh0IGFzIGRlZmluZWQgaW4gdmVoaWNsZV9hdWRpb19jb250ZXh0X2ZsYWcuIElmIG9ubHkgcGh5c2ljYWwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gaXMgc3VwcG9ydGVkIChjb25maWdfYXJyYXlbMF0gPT0gMCksIHRoaXMgd2lsbCByZXByZXNlbnQgcGh5c2ljYWwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gbnVtYmVyLgogICogICBpbnQzMl9hcnJheVsxXSA6IHZvbHVtZSBsZXZlbCwgdmFsaWQgcmFuZ2UgaXMgMCB0byBpbnQzMl9tYXhfdmFsdWUgZGVmaW5lZCBpbiBjb25maWcuCiAgKiAgICAgICAgICAgICAgICAgICAgMCB3aWxsIGJlIG11dGUgc3RhdGUuIGludDMyX21pbl92YWx1ZSBpbiBjb25maWcgc2hvdWxkIGJlIGFsd2F5cyAwLgogICogICBpbnQzMl9hcnJheVsyXSA6IE9uZSBvZiB2ZWhpY2xlX2F1ZGlvX3ZvbHVtZV9zdGF0ZS4KQEAgLTY1OCw3ICs3NzIsMzQgQEAKICAqIEBjb25maWdfZmxhZ3MgYWxsIGF1ZGlvIGNvbnRleHRzIHN1cHBvcnRlZC4KICAqIEBkYXRhX21lbWJlciBpbnQzMl9hcnJheQogICovCi0jZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfQVVESU9fVk9MVU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDA5MDEpCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfQVVESU9fVk9MVU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwOTAxKQorCisKKy8qKgorICogZmxhZ3MgdG8gcmVwcmVzZW50IGNhcGFiaWxpdHkgb2YgYXVkaW8gdm9sdW1lIHByb3BlcnR5LgorICogdXNlZCBpbiBjb25maWdfYXJyYXlbMV0gb2YgdmVoaWNsZV9wcm9wX2NvbmZpZ190LgorICovCitlbnVtIHZlaGljbGVfYXVkaW9fdm9sdW1lX2NhcGFiaWxpdHlfZmxhZyB7CisgICAgLyoqCisgICAgICogRXh0ZXJuYWwgYXVkaW8gbW9kdWxlIG9yIHZlaGljbGUgaGFsIGhhcyBwZXJzaXN0ZW50IHN0b3JhZ2UKKyAgICAgKiB0byBrZWVwIHRoZSB2b2x1bWUgbGV2ZWwuIFRoaXMgc2hvdWxkIGJlIHNldCBvbmx5IHdoZW4gcGVyIGNvbnRleHQKKyAgICAgKiB2b2x1bWUgbGV2ZWwgaXMgc3VwcHJvdGVkLiBXaGVuIHRoaXMgaXMgc2V0LCBhdWRpbyB2b2x1bWUgbGV2ZWwgcGVyCisgICAgICogZWFjaCBjb250ZXh0IHdpbGwgYmUgcmV0cmlldmVkIGZyb20gdGhlIHByb3BlcnR5IHdoZW4gc3lzdGVuIHN0YXJ0cyB1cC4KKyAgICAgKiBBbmQgZXh0ZXJuYWwgYXVkaW8gbW9kdWxlIGlzIGFsc28gZXhwZWN0ZWQgdG8gYWRqdXN0IHZvbHVtZSBhdXRvbWF0aWNhbGx5CisgICAgICogd2hlbmV2ZXIgdGhlcmUgaXMgYW4gYXVkaW8gY29udGV4dCBjaGFuZ2UuCisgICAgICogV2hlbiB0aGlzIGZsYWcgaXMgbm90IHNldCwgYW5kcm9pZCBzaWRlIHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgaXMgbm8KKyAgICAgKiBwZXJzaXN0ZW50IHN0b3JhZ2UgYW5kIHN0b3JlZCB2YWx1ZSBpbiBhbmRyb2lkIHNpZGUgd2lsbCBiZSB1c2VkIHRvCisgICAgICogaW5pdGlhbGl6ZSB0aGUgdm9sdW1lIGxldmVsLiBBbmQgYW5kcm9pZCBzaWRlIHdpbGwgc2V0IHZvbHVtZSBsZXZlbAorICAgICAqIG9mIGVhY2ggcGh5c2ljYWwgc3RyZWFtcyB3aGVuZXZlciB0aGVyZSBpcyBhbiBhdWRpbyBjb250ZXh0IGNoYW5nZS4KKyAgICAgKi8KKyAgICBWRUhJQ0xFX0FVRElPX1ZPTFVNRV9DQVBBQklMSVRZX1BFUlNJU1RFTlRfU1RPUkFHRSA9IDB4MSwKKyAgICAvKioKKyAgICAgKiBXaGVuIHRoaXMgZmxhZyBpcyBzZXQsIHRoZSBIL1cgY2FuIHN1cHBvcnQgb25seSBzaW5nbGUgbWFzdGVyIHZvbHVtZSBmb3IgYWxsIHN0cmVhbXMuCisgICAgICogVGhlcmUgaXMgbm8gd2F5IHRvIHNldCB2b2x1bWUgbGV2ZWwgZGlmZmVyZW50bHkgcGVyIGVhY2ggc3RyZWFtIG9yIGNvbnRleHQuCisgICAgICovCisgICAgVkVISUNMRV9BVURJT19WT0xVTUVfQ0FQQUJJTElUWV9NQVNURVJfVk9MVU1FX09OTFkgPSAweDIsCit9OworCiAKIC8qKgogICogZW51bSB0byByZXByZXNlbnQgYXVkaW8gdm9sdW1lIHN0YXRlLgpAQCAtNjgzLDggKzgyNCwxOCBAQAogCiAvKioKICAqIFByb3BlcnR5IGZvciBoYW5kbGluZyB2b2x1bWUgbGltaXQgc2V0IGJ5IHVzZXIuIFRoaXMgbGltaXRzIG1heGltdW0gdm9sdW1lIHRoYXQgY2FuIGJlIHNldAotICogcGVyIGVhY2ggY29udGV4dC4KLSAqICAgaW50MzJfYXJyYXlbMF0gOiBzdHJlYW0gY29udGV4dCBhcyBkZWZpbmVkIGluIHZlaGljbGVfYXVkaW9fY29udGV4dF9mbGFnLgorICogcGVyIGVhY2ggY29udGV4dCBvciBwaHlzaWNhbCBzdHJlYW0uCisgKgorICogdmVoaWNsZV9wcm9wX2NvbmZpZ190CisgKiAgIGNvbmZpZ19hcnJheVswXSA6IGJpdCBmbGFncyBvZiBhbGwgc3VwcG9ydGVkIGF1ZGlvIGNvbnRleHRzLiBJZiB0aGlzIGlzIDAsCisgKiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHZvbHVtZSBpcyBjb250cm9sbGVkIHBlciBwaHlzaWNhbCBzdHJlYW0KKyAqICAgY29uZmlnX2FycmF5WzFdIDogZmxhZ3MgZGVmaW5lZCBpbiB2ZWhpY2xlX2F1ZGlvX3ZvbHVtZV9jYXBhYmlsaXR5X2ZsYWcgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50IGF1ZGlvIG1vZHVsZSdzIGNhcGFiaWxpdHkuCisgKgorICogRGF0YSB0eXBlIGxvb2tzIGxpa2U6CisgKiAgIGludDMyX2FycmF5WzBdIDogc3RyZWFtIGNvbnRleHQgYXMgZGVmaW5lZCBpbiB2ZWhpY2xlX2F1ZGlvX2NvbnRleHRfZmxhZy4gSWYgb25seSBwaHlzaWNhbAorICogICAgICAgICAgICAgICAgICAgIHN0cmVhbSBpcyBzdXBwb3J0ZWQgKGNvbmZpZ19hcnJheVswXSA9PSAwKSwgdGhpcyB3aWxsIHJlcHJlc2VudCBwaHlzaWNhbAorICogICAgICAgICAgICAgICAgICAgIHN0cmVhbSBudW1iZXIuCiAgKiAgIGludDMyX2FycmF5WzFdIDogbWF4aW11bSB2b2x1bWUgc2V0IHRvIHRoZSBzdHJlYW0uIElmIHRoZXJlIGlzIG5vIHJlc3RyaWN0aW9uLCB0aGlzIHZhbHVlCiAgKiAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSAgYmlnZ2VyIHRoYW4gVkVISUNMRV9QUk9QRVJUWV9BVURJT19WT0xVTUUncyBtYXggdmFsdWUuCiAgKgpAQCAtNjk4LDcgKzg0OSw3IEBACiAgKiBAY29uZmlnX2ZsYWdzIGFsbCBhdWRpbyBjb250ZXh0cyBzdXBwb3J0ZWQuCiAgKiBAZGF0YV9tZW1iZXIgaW50MzJfYXJyYXkKICAqLwotI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0FVRElPX1ZPTFVNRV9MSU1JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwOTAyKQorI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0FVRElPX1ZPTFVNRV9MSU1JVCAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDkwMikKIAogLyoqCiAgKiBJbmRleCBpbiBpbnQzMl9hcnJheSBmb3IgVkVISUNMRV9QUk9QRVJUWV9BVURJT19WT0xVTUVfTElNSVQgcHJvcGVydHkuCkBAIC03MjcsNyArODc4LDcgQEAKICAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19XUklURQogICogQGRhdGFfbWVtYmVyIGludDMyX2FycmF5CiAgKi8KLSNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9BVURJT19ST1VUSU5HX1BPTElDWSAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDkwMykKKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9BVURJT19ST1VUSU5HX1BPTElDWSAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDA5MDMpCiAKIC8qKgogICogSW5kZXggaW4gaW50MzJfYXJyYXkgZm9yIFZFSElDTEVfUFJPUEVSVFlfQVVESU9fUk9VVElOR19QT0xJQ1kgcHJvcGVydHkuCkBAIC03NTAsNyArOTAxLDcgQEAKICogICAgICAgICAgICAgICB0aGlzLgogKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKICovCi0jZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfQVVESU9fSFdfVkFSSUFOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDA5MDQpCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfQVVESU9fSFdfVkFSSUFOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwOTA0KQogCiAvKioKICAqIEZsYWcgdG8gYmUgdXNlZCBpbiB2ZWhpY2xlX3Byb3BfY29uZmlnLmNvbmZpZ19mbGFncyBmb3IgVkVISUNMRV9QUk9QRVJUWV9BVURJT19IV19WQVJJQU5ULgpAQCAtNzY2LDYgKzkxNyw3MCBAQAogICAgIFZFSElDTEVfQVVESU9fSFdfVkFSSUFOVF9GTEFHX0lOVEVSTkFMX1JBRElPX0ZMQUcgPSAweDEsCiB9OwogCisvKiogYXVkaW8gcm91dGluZyBmb3IgQU0vRk0uIFRoaXMgc2hvdWxkIGJlIGFsc28gYmUgdGhlIHZhbHVlIHdoZW4gdGhlcmUgaXMgb25seSBvbmUKKyAgICByYWRpbyBtb2R1bGUgaW4gdGhlIHN5c3RlbS4gKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9BVURJT19FWFRfUk9VVElOR19TT1VSQ0VfUkFESU9fQU1fRk0gIlJBRElPX0FNX0ZNIgorLyoqIFNob3VsZCBiZSBhZGRlZCBvbmx5IHdoZW4gdGhlcmUgaXMgYSBzZXBhcmF0ZSByYWRpbyBtb2R1bGUgd2l0aCBIRCBjYXBhYmlsaXR5LiAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0FVRElPX0VYVF9ST1VUSU5HX1NPVVJDRV9SQURJT19BTV9GTV9IRCAiUkFESU9fQU1fRk1fSEQiCisvKiogRm9yIGRpZ2lhbCBhdWRpbyBicm9hZGNhc3RpbmcgdHlwZSBvZiByYWRpbyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0FVRElPX0VYVF9ST1VUSU5HX1NPVVJDRV9SQURJT19EQUIgIlJBRElPX0RBQiIKKy8qKiBGb3Igc2F0ZWxsaXRlIHR5cGUgb2YgcmFkaW8gKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9BVURJT19FWFRfUk9VVElOR19TT1VSQ0VfUkFESU9fU0FURUxMSVRFICJSQURJT19TQVRFTExJVEUiCisvKiogRm9yIENEIG9yIERWRCAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0FVRElPX0VYVF9ST1VUSU5HX1NPVVJDRV9DRF9EVkQgIkNEX0RWRCIKKy8qKiBGb3IgMXN0IGF1eGlsaWFyeSBpbnB1dCAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0FVRElPX0VYVF9ST1VUSU5HX1NPVVJDRV9BVVhfSU4wICJBVVhfSU4wIgorLyoqIEZvciAybmQgYXV4aWxpYXJ5IGlucHV0ICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfQVVESU9fRVhUX1JPVVRJTkdfU09VUkNFX0FVWF9JTjEgIkFVWF9JTjEiCisvKiogRm9yIG5hdmlnYXRpb24gZ3VpZGFuY2UgZnJvbSBvdXRzaWRlIGFuZHJvaWQgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9BVURJT19FWFRfUk9VVElOR19TT1VSQ0VfRVhUX05BVl9HVUlEQU5DRSAiRVhUX05BVl9HVUlEQU5DRSIKKy8qKiBGb3Igdm9pY2UgY29tbWFuZCBmcm9tIG91dHNpZGUgYW5kcm9pZCAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0FVRElPX0VYVF9ST1VUSU5HX1NPVVJDRV9FWFRfVk9JQ0VfQ09NTUFORCAiRVhUX1ZPSUNFX0NPTU1BTkQiCisvKiogRm9yIHZvaWNlIGNhbGwgZnJvbSBvdXRzaWRlIGFuZHJvaWQgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9BVURJT19FWFRfUk9VVElOR19TT1VSQ0VfRVhUX1ZPSUNFX0NBTEwgIkVYVF9WT0lDRV9DQUxMIgorLyoqIEZvciBzYWZldHkgYWxlcnQgZnJvbSBvdXRzaWRlIGFuZHJvaWQgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9BVURJT19FWFRfUk9VVElOR19TT1VSQ0VfRVhUX1NBRkVUWV9BTEVSVCAiRVhUX1NBRkVUWV9BTEVSVCIKKworLyoqCisqIFByb3BlcnR5IHRvIHBhc3MgaGludCBvbiBleHRlcm5hbCBhdWRpbyByb3V0aW5nLiBXaGVuIGFuZHJvaWQgc2lkZSByZXF1ZXN0IGZvY3VzCisqIHdpdGggVkVISUNMRV9BVURJT19FWFRfRk9DVVNfQ0FSX1BMQVlfT05MWV9GTEFHIGZsYWcsIHRoaXMgcHJvcGVydHkgd2lsbCBiZSBzZXQKKyogYmVmb3JlIHNldHRpbmcgQVVESU9fRk9DVVMgcHJvcGVydHkgYXMgYSBoaW50IGZvciBleHRlcm5hbCBhdWRpbyBzb3VyY2Ugcm91dGluZy4KKyogTm90ZSB0aGF0IHNldHRpbmcgdGhpcyBwcm9wZXJ0eSBhbG9uZSBzaG91bGQgbm90IHRyaWdnZXIgYW55IGNoYW5nZS4KKyogQXVkaW8gcm91dGluZyBzaG91bGQgYmUgY2hhbmdlZCBvbmx5IHdoZW4gQVVESU9fRk9DVVMgcHJvcGVydHkgaXMgc2V0LiBOb3RlIHRoYXQKKyogdGhpcyBwcm9wZXJ0eSBhbGxvd3MgcGFzc2luZyBjdXN0b20gdmFsdWUgYXMgbG9uZyBhcyBpdCBpcyBkZWZpbmVkIGluIGNvbmZpZ19zdHJpbmcuCisqIFRoaXMgYWxsb3dzIHN1cHBvcnRpbmcgbm9uLXN0YW5kYXJkIHJvdXRpbmcgb3B0aW9ucyB0aHJvdWdoIHRoaXMgcHJvcGVydHkuCisqIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBzZXBhcmF0ZSBuYW1lIHNwYWNlIGZvciBjdXN0b20gcHJvcGVydHkgdG8gcHJldmVudCBjb25mbGljdCBpbiBmdXR1cmUKKyogYW5kcm9pZCByZWxlYXNlcy4KKyogRW5hYmxpbmcgZWFjaCBleHRlcm5hbCByb3V0aW5nIG9wdGlvbiBpcyBkb25lIGJ5IGVuYWJsaW5nIGVhY2ggYml0IGZsYWcgZm9yIHRoZSByb3V0aW5nLgorKiBUaGlzIHByb3BlcnR5IGNhbiBzdXBwb3J0IHVwIHRvIDEyOCBleHRlcm5hbCByb3V0aW5ncy4KKyogVG8gZ2l2ZSBmdWxsIGZsZXhpYmlsaXR5LCB0aGVyZSBpcyBubyBzdGFuZGFyZCBkZWZpbml0aW9uIGZvciBlYWNoIGJpdCBmbGFnIGFuZAorKiBhc3NpZ25pbmcgZWFjaCBiaWcgZmxhZyB0byBzcGVjaWZpYyByb3V0aW5nIHR5cGUgaXMgZGVjaWRlZCBieSBjb25maWdfc3RyaW5nLgorKiBjb25maWdfc3RyaW5nIGhhcyBmb3JtYXQgb2YgZWFjaCBlbnRyeSBzZXBhcmF0ZWQgYnkgJywnCisqIGFuZCBlYWNoIGVudHJ5IGhhcyBmb3JtYXQgb2YgYml0RmxhZ1Bvc2l0b246dHlwZVN0cmluZ1s6cGh5c2ljYWxTdHJlYW1OdW1iZXJdLgorKiAgYml0RmxhZ1Bvc2l0aW9uOiByZXByZXNlbnRzIHdoaWNoIGJpZyBmbGFnIHdpbGwgYmUgc2V0IHRvIGVuYWJsZSB0aGlzIHJvdXRpbmcuIDAgbWVhbnMKKyogICAgTFNCIGluIGludDMyX2FycmF5WzBdLiAzMSB3aWxsIGJlIE1TQiBpbiBpbnQzMl9hcnJheVswXS4gMTI3IHdpbGwgTVNCIGluIGludDMyX2FycmF5WzNdLgorKiAgdHlwZVN0cmluZzogc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGV4dGVybmFsIHJvdXRpbmcuIFNvbWUgdHlwZXMgYXJlIGFscmVhZHkgZGVmaW5lZAorKiAgICBpbiBWRUhJQ0xFX1BST1BFUlRZX0FVRElPX0VYVF9ST1VUSU5HX1NPVVJDRV8qIGFuZCB1c2UgdGhlbSBmaXJzdCBiZWZvcmUgYWRkaW5nIHNvbWV0aGluZworKiAgICBjdXN0b20uIEFwcGxpY2F0aW9ucyB3aWxsIGZpbmQgZWFjaCByb3V0aW5nIHVzaW5nIHRoaXMgc3RyaW5nLgorKiAgcGh5c2ljYWxTdHJlYW1OdW1iZXI6IFRoaXMgcGFydCBpcyBvcHRpb25hbCBhbmQgcmVwcmVzZW50cyBwaHlzaWNhbCBzdHJlYW0gdG8gYW5kcm9pZAorKiAgICB3aGljaCB3aWxsIGJlIGRpc2FibGVkIHdoZW4gdGhpcyByb3V0aW5nIGlzIGVuYWJsZWQuIElmIG5vdCBzcGVjaWZpZWQsIHRoaXMgcm91dGluZworKiAgICBzaG91bGQgbm90IGFmZmVjdCBwaHlzaWNhbCBzdHJlYW1zIHRvIGFuZHJvaWQuCisqIEFzIGFuIGV4YW1wbGUsIGxldCdzIGFzc3VtZSBhIHN5c3RlbSB3aXRoIHR3byBwaHlzaWNhbCBzdHJlYW1zLCAwIGZvciBtZWRpYSBhbmQgMSBmb3IKKyogbmF2IGd1aWRhbmNlLiBBbmQgbGV0J3MgYXNzdW1lIGV4dGVybmFsIHJvdXRpbmcgb3B0aW9uIG9mIGFtIGZtIHJhZGlvLCBleHRlcm5hbCBuYXZpZ2F0aW9uCisqIGd1aWRhbmNlLCBzYXRlbGxpdGUgcmFkaW8sIGFuZCBvbmUgY3VzdG9tLiBMZXQncyBhc3N1bWUgdGhhdCByYWRpbyBhbmQgc2F0ZWxsaXRlIHJlcGxhY2VzCisqIHBoeXNpY2FsIHN0cmVhbSAwIGFuZCBleHRlcm5hbCBuYXZpZ2F0aW9uIHJlcGxhY2VzIHBoeXNpY2FsIHN0cmVhbSAxLiBBbmQgYml0IGZsYWcgd2lsbCBiZQorKiBhc3NpZ25lZCBpbiB0aGUgb3JkZXIgbGlzdGVkIGFib3ZlLiBUaGlzIGNvbmZpZ3VyYXRpb24gd2lsbCBsb29rIGxpa2UgdGhpcyBpbiBjb25maWdfc3RyaW5nOgorKiAgIjA6UkFESU9fQU1fRk06MCwxOkVYVF9OQVZfR1VJREFOQ0U6MSwyOlJBRElPX1NBVEVMTElURTowLDM6Y29tLnRlc3QuU09NRVRISU5HX0NVU1RPTSIKKyogV2hlbiBhbmRyb2lkIHJlcXVlc3RzIFJBRElPX0FNX0ZNLCBpbnQzMl9hcnJheVswXSB3aWxsIGJlIHNldCB0byAweDEuCisqIFdoZW4gYW5kcm9pZCByZXF1ZXN0cyBSQURJT19TQVRFTExJVEUgKyBFWFRfTkFWX0dVSURBTkNFLCBpbnQzMl9hcnJheVswXSB3aWxsIGJlIHNldCB0byAweDJ8MHg0LgorKgorKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfSU5UMzJfVkVDNAorKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEV8VkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCisqIEBjb25maWdfc3RyaW5nIExpc3Qgb2YgYWxsIGF2YWlhYmxlIGV4dGVybmFsIHNvdXJjZSBpbiB0aGUgc3lzdGVtLgorKiBAZGF0YV9tZW1iZXIgaW50MzJfYXJyYXkKKyovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfQVVESU9fRVhUX1JPVVRJTkdfSElOVCAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwOTA1KQogCiAvKioKICAqIFByb3BlcnR5IHRvIGNvbnRyb2wgcG93ZXIgc3RhdGUgb2YgYXBwbGljYXRpb24gcHJvY2Vzc29yLgpAQCAtNzg4LDcgKzEwMDMsNyBAQAogICogQGNvbmZpZ19mbGFncyBBZGRpdGlvbmFsIGluZm8gb24gcG93ZXIgc3RhdGUuIFNob3VsZCB1c2UgdmVoaWNsZV9hcF9wb3dlcl9zdGF0ZV9jb25maWdfZmxhZy4KICAqIEBkYXRhX21lbWJlciBpbnQzMl9hcnJheQogICovCi0jZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfQVBfUE9XRVJfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBBMDApCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfQVBfUE9XRVJfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQTAwKQogCiBlbnVtIHZlaGljbGVfYXBfcG93ZXJfc3RhdGVfY29uZmlnX2ZsYWcgewogICAgIC8qKgpAQCAtODk1LDcgKzExMTAsNyBAQAogICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQUR8VkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCiAgKiBAZGF0YV9tZW1iZXIgaW50MzIKICAqLwotI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0RJU1BMQVlfQlJJR0hUTkVTUyAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQTAxKQorI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0RJU1BMQVlfQlJJR0hUTkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEEwMSkKIAogCiAvKioKQEAgLTk5OSw3ICsxMjE0LDcgQEAKICAqIEBjb25maWdfYXJyYXkgMDp2ZWhpY2xlX2luc3R1bWVudF9jbHVzdGVyX3R5cGUgMTpodyB0eXBlCiAgKiBAZGF0YV9tZW1iZXIgaW50MzJfYXJyYXkKICAqLwotI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0lOU1RSVU1FTlRfQ0xVU1RFUl9JTkZPICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBBMjApCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfSU5TVFJVTUVOVF9DTFVTVEVSX0lORk8gICAgICAgICAgICAgICAgICAgICgweDAwMDAwQTIwKQogCiAvKioKICAqIFJlcHJlc2VudHMgaW5zdHJ1bWVudCBjbHVzdGVyIHR5cGUgYXZhaWxhYmxlIGluIHN5c3RlbQpAQCAtMTAxOSw2ICsxMjM0LDYyNCBAQAogfTsKIAogLyoqCisgKiBDdXJyZW50IGRhdGUgYW5kIHRpbWUsIGVuY29kZWQgYXMgVW5peCB0aW1lLgorICogVGhpcyB2YWx1ZSBkZW5vdGVzIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZSAxLzEvMTk3MC4KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfSU5UNjQKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fU0VUCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQorICogQGRhdGFfbWVtYmVyIGludDY0X3ZhbHVlCisgKiBAdW5pdCBWRUhJQ0xFX1VOSVRfVFlQRV9TRUNTCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9VTklYX1RJTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBBMzApCisKKy8qKgorICogQ3VycmVudCB0aW1lIG9ubHkuCisgKiBTb21lIHZlaGljbGVzIG1heSBub3Qga2VlcCB0cmFjayBvZiBkYXRlLiAgVGhpcyBwcm9wZXJ0eSBvbmx5IGFmZmVjdHMgdGhlIGN1cnJlbnQgdGltZSwgaW4KKyAqIHNlY29uZHMgZHVyaW5nIHRoZSBkYXkuICBUaHVzLCB0aGUgbWF4IHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlciBpcyA4Niw0MDAgKDI0ICogNjAgKiA2MCkKKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fU0VUCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKiBAdW5pdCBWRUhJQ0xFX1VOSVRfVFlQRV9TRUNTCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9DVVJSRU5UX1RJTUVfSU5fU0VDT05EUyAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBBMzEpCisKKworLy89PT09IENhciBDYWJpbiBQcm9wZXJ0aWVzID09PT0KKy8qKgorICogTW9zdCBDYXIgQ2FiaW4gcHJvcGVydGllcyBoYXZlIGJvdGggYSBNT1ZFIGFuZCBQT1NJVElPTiBwYXJhbWV0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZW0uCisgKgorICogVGhlIE1PVkUgcGFyYW1ldGVyIHdpbGwgc3RhcnQgbW92aW5nIHRoZSBkZXZpY2UgaW4gdGhlIGluZGljYXRlZCBkaXJlY3Rpb24uICBUaGUgbWFnbml0dWRlCisgKiBpbmRpY2F0ZXMgdGhlIHJlbGF0aXZlIHNwZWVkLiAgRm9yIGluc3RhbmNlLCBzZXR0aW5nIHRoZSBXSU5ET1dfTU9WRSBwYXJhbWV0ZXIgdG8gKzEgd2lsbCByb2xsCisgKiB0aGUgd2luZG93IHVwLiAgU2V0dGluZyBpdCB0byArMiAoaWYgYXZhaWxhYmxlKSB3aWxsIHJvbGwgaXQgdXAgZmFzdGVyLgorICoKKyAqIFRoZSBQT1NJVElPTiBwYXJhbWV0ZXIgd2lsbCBtb3ZlIHRoZSBkZXZpY2UgdG8gdGhlIGRlc2lyZWQgcG9zaXRpb24uICBGb3IgaW5zdGFuY2UsIGlmIHRoZQorICogV0lORE9XX1BPUyBoYXMgYSByYW5nZSBvZiAwLTEwMCwgdGhlbiBzZXR0aW5nIHRoaXMgcGFyYW1ldGVyIHRvIDUwIHdpbGwgb3BlbiB0aGUgd2luZG93IGhhbGZ3YXkuCisgKiBEZXBlbmRpbmcgdXBvbiB0aGUgaW5pdGlhbCBwb3NpdGlvbiwgdGhlIHdpbmRvdyBtYXkgbW92ZSB1cCBvciBkb3duIHRvIHRoZSA1MCUgdmFsdWUuCisgKgorICogT0VNcyBtYXkgY2hvb3NlIHRvIGltcGxlbWVudCBvbmUgb3IgYm90aCBvZiB0aGUgTU9WRS9QT1NJVElPTiBwYXJhbWV0ZXJzIGRlcGVuZGluZyB1cG9uIHRoZQorICogY2FwYWJpbGl0eSBvZiB0aGUgaGFyZHdhcmUuCisgKi8KKworLy8gRG9vcnMKKy8qKgorICogRG9vciBwb3NpdGlvbgorICoKKyAqIFRoaXMgaXMgYW4gaW50ZWdlciBpbiBjYXNlIGEgZG9vciBtYXkgYmUgc2V0IHRvIGEgcGFydGljdWxhciBwb3NpdGlvbi4gIE1heAorICogdmFsdWUgaW5kaWNhdGVzIGZ1bGx5IG9wZW4sIG1pbiB2YWx1ZSAoMCkgaW5kaWNhdGVzIGZ1bGx5IGNsb3NlZC4KKyAqCisgKiBTb21lIHZlaGljbGVzIChtaW5pdmFucykgY2FuIG9wZW4gdGhlIGRvb3IgZWxlY3Ryb25pY2FsbHkuICBIZW5jZSwgdGhlIGFiaWxpdHkKKyAqIHRvIHdyaXRlIHRoaXMgcHJvcGVydHkuCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQUR8VkVISUNMRV9QUk9QX0FDQ0VTU19XUklURQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9ET09SCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0RPT1JfUE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEIwMCkKKworLyoqCisgKiBEb29yIG1vdmUKKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURXxWRUhJQ0xFX1BST1BfQUNDRVNTX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX0RPT1IKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfRE9PUl9NT1ZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQjAxKQorCisKKy8qKgorICogRG9vciBsb2NrCisgKgorICogJ3RydWUnIGluZGljYXRlcyBkb29yIGlzIGxvY2tlZAorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9CT09MRUFOCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfRE9PUgorICogQGRhdGFfbWVtYmVyIGJvb2xlYW5fdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0RPT1JfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEIwMikKKworLy8gTWlycm9ycworLyoqCisgKiBNaXJyb3IgWiBQb3NpdGlvbgorICoKKyAqIFBvc2l0aXZlIHZhbHVlIGluZGljYXRlcyB0aWx0IHVwd2FyZHMsIG5lZ2F0aXZlIHZhbHVlIGlzIGRvd253YXJkcworICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX01JUlJPUgorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9NSVJST1JfWl9QT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCNDApCisKKy8qKgorICogTWlycm9yIFogTW92ZQorICoKKyAqIFBvc2l0aXZlIHZhbHVlIGluZGljYXRlcyB0aWx0IHVwd2FyZHMsIG5lZ2F0aXZlIHZhbHVlIGlzIGRvd253YXJkcworICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFfFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfTUlSUk9SCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX01JUlJPUl9aX01PVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEI0MSkKKworLyoqCisgKiBNaXJyb3IgWSBQb3NpdGlvbgorICoKKyAqIFBvc2l0aXZlIHZhbHVlIGluZGljYXRlIHRpbHQgcmlnaHQsIG5lZ2F0aXZlIHZhbHVlIGlzIGxlZnQKKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9NSVJST1IKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfTUlSUk9SX1lfUE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQjQyKQorCisvKioKKyAqIE1pcnJvciBZIE1vdmUKKyAqCisgKiBQb3NpdGl2ZSB2YWx1ZSBpbmRpY2F0ZSB0aWx0IHJpZ2h0LCBuZWdhdGl2ZSB2YWx1ZSBpcyBsZWZ0CisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEV8VkVISUNMRV9QUk9QX0FDQ0VTU19XUklURQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9NSVJST1IKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfTUlSUk9SX1lfTU9WRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQjQzKQorCisvKioKKyAqIE1pcnJvciBMb2NrCisgKgorICogVHJ1ZSBpbmRpY2F0ZXMgbWlycm9yIHBvc2l0aW9ucyBhcmUgbG9ja2VkIGFuZCBub3QgY2hhbmdlYWJsZQorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9CT09MRUFOCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKKyAqIEBkYXRhX21lbWJlciBib29sZWFuX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9NSVJST1JfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCNDQpCisKKy8qKgorICogTWlycm9yIEZvbGQKKyAqCisgKiBUcnVlIGluZGljYXRlcyBtaXJyb3JzIGFyZSBmb2xkZWQKKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfQk9PTEVBTgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCisgKiBAZGF0YV9tZW1iZXIgYm9vbGVhbl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfTUlSUk9SX0ZPTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQjQ1KQorCisvLyBTZWF0cworLyoqCisgKiBTZWF0IG1lbW9yeSBzZWxlY3QKKyAqCisgKiBUaGlzIHBhcmFtZXRlciBzZWxlY3RzIHRoZSBtZW1vcnkgcHJlc2V0IHRvIHVzZSB0byBzZWxlY3QgdGhlIHNlYXQgcG9zaXRpb24uCisgKiBUaGUgbWluVmFsdWUgaXMgYWx3YXlzIDAsIGFuZCB0aGUgbWF4VmFsdWUgZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIHNlYXQKKyAqIHBvc2l0aW9ucyBhdmFpbGFibGUuCisgKgorICogRm9yIGluc3RhbmNlLCBpZiB0aGUgZHJpdmVyJ3Mgc2VhdCBoYXMgMyBtZW1vcnkgcHJlc2V0cywgdGhlIG1heFZhbHVlIHdpbGwgYmUgMy4KKyAqIFdoZW4gdGhlIHVzZXIgd2FudHMgdG8gc2VsZWN0IGEgcHJlc2V0LCB0aGUgZGVzaXJlZCBwcmVzZXQgbnVtYmVyICgxLCAyLCBvciAzKQorICogaXMgc2V0LgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19XUklURQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9TRUFUCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX1NFQVRfTUVNT1JZX1NFTEVDVCAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEI4MCkKKworLyoqCisgKiBTZWF0IG1lbW9yeSBzZXQKKyAqCisgKiBUaGlzIHNldHRpbmcgYWxsb3dzIHRoZSB1c2VyIHRvIHNhdmUgdGhlIGN1cnJlbnQgc2VhdCBwb3NpdGlvbiBzZXR0aW5ncyBpbnRvCisgKiB0aGUgc2VsZWN0ZWQgcHJlc2V0IHNsb3QuICBUaGUgbWF4VmFsdWUgZm9yIGVhY2ggc2VhdCBwb3NpdGlvbiBzaGFsbCBtYXRjaAorICogdGhlIG1heFZhbHVlIGZvciBWRUhJQ0xFX1BST1BFUlRZX1NFQVRfTUVNT1JZX1NFTEVDVC4KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX01FTU9SWV9TRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCODEpCisKKy8qKgorICogU2VhdGJlbHQgYnVja2xlZAorICoKKyAqIFRydWUgaW5kaWNhdGVzIGJlbHQgaXMgYnVja2xlZC4KKyAqCisgKiBXcml0ZSBhY2Nlc3MgaW5kaWNhdGVzIGF1dG9tYXRpYyBzZWF0IGJ1Y2tsaW5nIGNhcGFiaWxpdGllcy4gIFRoZXJlIGFyZSBubyBrbm93biBjYXJzIGF0IHRoaXMKKyAqIHRpbWUsIGJ1dCB5b3UgbmV2ZXIga25vdy4uLgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9CT09MRUFOCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQUR8VkVISUNMRV9QUk9QX0FDQ0VTU19XUklURQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9TRUFUCisgKiBAZGF0YV9tZW1iZXIgYm9vbGVhbl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfU0VBVF9CRUxUX0JVQ0tMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQjgyKQorCisvKioKKyAqIFNlYXRiZWx0IGhlaWdodCBwb3NpdGlvbgorICoKKyAqIEFkanVzdHMgdGhlIHNob3VsZGVyIGJlbHQgYW5jaG9yIHBvaW50LgorICogTWF4IHZhbHVlIGluZGljYXRlcyBoaWdoZXN0IHBvc2l0aW9uCisgKiBNaW4gdmFsdWUgaW5kaWNhdGVzIGxvd2VzdCBwb3NpdGlvbgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1NFQVQKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfU0VBVF9CRUxUX0hFSUdIVF9QT1MgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQjgzKQorCisvKioKKyAqIFNlYXRiZWx0IGhlaWdodCBtb3ZlCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEV8VkVISUNMRV9QUk9QX0FDQ0VTU19XUklURQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9TRUFUCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX1NFQVRfQkVMVF9IRUlHSFRfTU9WRSAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEI4NCkKKworLyoqCisgKiBTZWF0IGZvcmUvYWZ0IHBvc2l0aW9uCisgKgorICogU2V0cyB0aGUgc2VhdCBwb3NpdGlvbiBmb3J3YXJkIChjbG9zZXIgdG8gc3RlZXJpbmcgd2hlZWwpIGFuZCBiYWNrd2FyZHMuCisgKiBNYXggdmFsdWUgaW5kaWNhdGVzIGNsb3Nlc3QgdG8gd2hlZWwsIG1pbiB2YWx1ZSBpbmRpY2F0ZXMgbW9zdCByZWFyd2FyZAorICogcG9zaXRpb24uCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX0ZPUkVfQUZUX1BPUyAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCODUpCisKKy8qKgorICogU2VhdCBmb3JlL2FmdCBtb3ZlCisgKgorICogTW92ZXMgdGhlIHNlYXQgcG9zaXRpb24gZm9yd2FyZCBhbmQgYWZ0LgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFfFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX0ZPUkVfQUZUX01PVkUgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCODYpCisKKy8qKgorICogU2VhdCBiYWNrcmVzdCBhbmdsZSAxIHBvc2l0aW9uCisgKgorICogQmFja3Jlc3QgYW5nbGUgMSBpcyB0aGUgYWN0dWF0b3IgY2xvc2VzdCB0byB0aGUgYm90dG9tIG9mIHRoZSBzZWF0LgorICogTWF4IHZhbHVlIGluZGljYXRlcyBhbmdsaW5nIGZvcndhcmQgdG93YXJkcyB0aGUgc3RlZXJpbmcgd2hlZWwuCisgKiBNaW4gdmFsdWUgaW5kaWNhdGVzIGZ1bGwgcmVjbGluZS4KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9TRUFUCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX1NFQVRfQkFDS1JFU1RfQU5HTEVfMV9QT1MgICAgICAgICAgICAgICAgICAoMHgwMDAwMEI4NykKKworLyoqCisgKiBTZWF0IGJhY2tyZXN0IGFuZ2xlIDEgbW92ZQorICoKKyAqIE1vdmVzIHRoZSBiYWNrcmVzdCBmb3J3YXJkIG9yIHJlY2xpbmUuCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEV8VkVISUNMRV9QUk9QX0FDQ0VTU19XUklURQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9TRUFUCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX1NFQVRfQkFDS1JFU1RfQU5HTEVfMV9NT1ZFICAgICAgICAgICAgICAgICAoMHgwMDAwMEI4OCkKKworLyoqCisgKiBTZWF0IGJhY2tyZXN0IGFuZ2xlIDIgcG9zaXRpb24KKyAqCisgKiBCYWNrcmVzdCBhbmdsZSAyIGlzIHRoZSBuZXh0IGFjdHVhdG9yIHVwIGZyb20gdGhlIGJvdHRvbSBvZiB0aGUgc2VhdC4KKyAqIE1heCB2YWx1ZSBpbmRpY2F0ZXMgYW5nbGluZyBmb3J3YXJkIHRvd2FyZHMgdGhlIHN0ZWVyaW5nIHdoZWVsLgorICogTWluIHZhbHVlIGluZGljYXRlcyBmdWxsIHJlY2xpbmUuCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX0JBQ0tSRVNUX0FOR0xFXzJfUE9TICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCODkpCisKKy8qKgorICogU2VhdCBiYWNrcmVzdCBhbmdsZSAyIG1vdmUKKyAqCisgKiBNb3ZlcyB0aGUgYmFja3Jlc3QgZm9yd2FyZCBvciByZWNsaW5lLgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFfFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX0JBQ0tSRVNUX0FOR0xFXzJfTU9WRSAgICAgICAgICAgICAgICAgKDB4MDAwMDBCOEEpCisKKy8qKgorICogU2VhdCBoZWlnaHQgcG9zaXRpb24KKyAqCisgKiBTZXRzIHRoZSBzZWF0IGhlaWdodC4KKyAqIE1heCB2YWx1ZSBpbmRpY2F0ZXMgaGlnaGVzdCBwb3NpdGlvbi4KKyAqIE1pbiB2YWx1ZSBpbmRpY2F0ZXMgbG93ZXN0IHBvc2l0aW9uLgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1NFQVQKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfU0VBVF9IRUlHSFRfUE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQjhCKQorCisvKioKKyAqIFNlYXQgaGVpZ2h0IG1vdmUKKyAqCisgKiBNb3ZlcyB0aGUgc2VhdCBoZWlnaHQuCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEV8VkVISUNMRV9QUk9QX0FDQ0VTU19XUklURQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9TRUFUCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX1NFQVRfSEVJR0hUX01PVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEI4QykKKworLyoqCisgKiBTZWF0IGRlcHRoIHBvc2l0aW9uCisgKgorICogU2V0cyB0aGUgc2VhdCBkZXB0aCwgZGlzdGFuY2UgZnJvbSBiYWNrIHJlc3QgdG8gZnJvbnQgZWRnZSBvZiBzZWF0LgorICogTWF4IHZhbHVlIGluZGljYXRlcyBsb25nZXN0IGRlcHRoIHBvc2l0aW9uLgorICogTWluIHZhbHVlIGluZGljYXRlcyBzaG9ydGVzdCBwb3NpdGlvbi4KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9TRUFUCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX1NFQVRfREVQVEhfUE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEI4RCkKKworLyoqCisgKiBTZWF0IGRlcHRoIG1vdmUKKyAqCisgKiBBZGp1c3RzIHRoZSBzZWF0IGRlcHRoLgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFfFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX0RFUFRIX01PVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCOEUpCisKKy8qKgorICogU2VhdCB0aWx0IHBvc2l0aW9uCisgKgorICogU2V0cyB0aGUgc2VhdCB0aWx0LgorICogTWF4IHZhbHVlIGluZGljYXRlcyBmcm9udCBlZGdlIG9mIHNlYXQgaGlnaGVyIHRoYW4gYmFjayBlZGdlLgorICogTWluIHZhbHVlIGluZGljYXRlcyBmcm9udCBlZGdlIG9mIHNlYXQgbG93ZXIgdGhhbiBiYWNrIGVkZ2UuCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX1RJTFRfUE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCOEYpCisKKy8qKgorICogU2VhdCB0aWx0IG1vdmUKKyAqCisgKiBUaWx0cyB0aGUgc2VhdC4KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURXxWRUhJQ0xFX1BST1BfQUNDRVNTX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1NFQVQKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfU0VBVF9USUxUX01PVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQjkwKQorCisvKioKKyAqIEx1bWJlciBmb3JlL2FmdCBwb3NpdGlvbgorICoKKyAqIFB1c2hlcyB0aGUgbHVtYmFyIHN1cHBvcnQgZm9yd2FyZCBhbmQgYmFja3dhcmRzCisgKiBNYXggdmFsdWUgaW5kaWNhdGVzIG1vc3QgZm9yd2FyZCBwb3NpdGlvbi4KKyAqIE1pbiB2YWx1ZSBpbmRpY2F0ZXMgbW9zdCByZWFyd2FyZCBwb3NpdGlvbi4KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9TRUFUCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX1NFQVRfTFVNQkFSX0ZPUkVfQUZUX1BPUyAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEI5MSkKKworLyoqCisgKiBMdW1iYXIgZm9yZS9hZnQgbW92ZQorICoKKyAqIEFkanVzdHMgdGhlIGx1bWJhciBzdXBwb3J0LgorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFfFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX0xVTUJBUl9GT1JFX0FGVF9NT1ZFICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCOTIpCisKKy8qKgorICogTHVtYmFyIHNpZGUgc3VwcG9ydCBwb3NpdGlvbgorICoKKyAqIFNldHMgdGhlIGFtb3VudCBvZiBsYXRlcmFsIGx1bWJhciBzdXBwb3J0LgorICogTWF4IHZhbHVlIGluZGljYXRlcyB3aWRlc3QgbHVtYmFyIHNldHRpbmcgKGkuZS4gbGVhc3Qgc3VwcG9ydCkKKyAqIE1pbiB2YWx1ZSBpbmRpY2F0ZXMgdGhpbm5lc3QgbHVtYmFyIHNldHRpbmcuCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX0xVTUJBUl9TSURFX1NVUFBPUlRfUE9TICAgICAgICAgICAgICAgKDB4MDAwMDBCOTMpCisKKy8qKgorICogTHVtYmFyIHNpZGUgc3VwcG9ydCBtb3ZlCisgKgorICogQWRqdXN0cyB0aGUgYW1vdW50IG9mIGxhdGVyYWwgbHVtYmFyIHN1cHBvcnQuCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEV8VkVISUNMRV9QUk9QX0FDQ0VTU19XUklURQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9TRUFUCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX1NFQVRfTFVNQkFSX1NJREVfU1VQUE9SVF9NT1ZFICAgICAgICAgICAgICAoMHgwMDAwMEI5NCkKKworLyoqCisgKiBIZWFkcmVzdCBoZWlnaHQgcG9zaXRpb24KKyAqCisgKiBTZXRzIHRoZSBoZWFkcmVzdCBoZWlnaHQuCisgKiBNYXggdmFsdWUgaW5kaWNhdGVzIHRhbGxlc3Qgc2V0dGluZy4KKyAqIE1pbiB2YWx1ZSBpbmRpY2F0ZXMgc2hvcnRlc3Qgc2V0dGluZy4KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9TRUFUCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX1NFQVRfSEVBRFJFU1RfSEVJR0hUX1BPUyAgICAgICAgICAgICAgICAgICAoMHgwMDAwMEI5NSkKKworLyoqCisgKiBIZWFkcmVzdCBoZWlnaHQgbW92ZQorICoKKyAqIE1vdmVzIHRoZSBoZWFkcmVzdCB1cCBhbmQgZG93bi4KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURXxWRUhJQ0xFX1BST1BfQUNDRVNTX1dSSVRFCisgKiBAem9uZV90eXBlIFZFSElDTEVfWk9ORV9UWVBFX1NFQVQKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfU0VBVF9IRUFEUkVTVF9IRUlHSFRfTU9WRSAgICAgICAgICAgICAgICAgICgweDAwMDAwQjk2KQorCisvKioKKyAqIEhlYWRyZXN0IGFuZ2xlIHBvc2l0aW9uCisgKgorICogU2V0cyB0aGUgYW5nbGUgb2YgdGhlIGhlYWRyZXN0LgorICogTWF4IHZhbHVlIGluZGljYXRlcyBtb3N0IHVwcmlnaHQgYW5nbGUuCisgKiBNaW4gdmFsdWUgaW5kaWNhdGVzIHNoYWxsb3dlc3QgaGVhZHJlc3QgYW5nbGUuCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX0hFQURSRVNUX0FOR0xFX1BPUyAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCOTcpCisKKy8qKgorICogSGVhZHJlc3QgYW5nbGUgbW92ZQorICoKKyAqIEFkanVzdHMgdGhlIGFuZ2xlIG9mIHRoZSBoZWFkcmVzdAorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFfFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEUKKyAqIEB6b25lX3R5cGUgVkVISUNMRV9aT05FX1RZUEVfU0VBVAorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9TRUFUX0hFQURSRVNUX0FOR0xFX01PVkUgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCOTgpCisKKy8qKgorICogSGVhZHJlc3QgZm9yZS9hZnQgcG9zaXRpb24KKyAqCisgKiBBZGp1c3RzIHRoZSBoZWFkcmVzdCBmb3J3YXJkcyBhbmQgYmFja3dhcmRzLgorICogTWF4IHZhbHVlIGluZGljYXRlcyBwb3NpdGlvbiBjbG9zZXN0IHRvIGZyb250IG9mIGNhci4KKyAqIE1pbiB2YWx1ZSBpbmRpY2F0ZXMgcG9zaXRpb24gY2xvc2VzdCB0byByZWFyIG9mIGNhci4KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9TRUFUCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX1NFQVRfSEVBRFJFU1RfRk9SRV9BRlRfUE9TICAgICAgICAgICAgICAgICAoMHgwMDAwMEI5OSkKKworLyoqCisgKiBIZWFkcmVzdCBmb3JlL2FmdCBtb3ZlCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEV8VkVISUNMRV9QUk9QX0FDQ0VTU19XUklURQorICogQHpvbmVfdHlwZSBWRUhJQ0xFX1pPTkVfVFlQRV9TRUFUCisgKiBAZGF0YV9tZW1iZXIgaW50MzJfdmFsdWUKKyAqLworI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX1NFQVRfSEVBRFJFU1RfRk9SRV9BRlRfTU9WRSAgICAgICAgICAgICAgICAoMHgwMDAwMEI5QSkKKworCisvLyBXaW5kb3dzCisvKioKKyAqIFdpbmRvdyBQb3NpdGlvbgorICoKKyAqIE1heCA9IHdpbmRvdyB1cCAvIGNsb3NlZAorICogTWluID0gd2luZG93IGRvd24gLyBvcGVuCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEUKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfV0lORE9XX1BPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQkMwKQorCisvKioKKyAqIFdpbmRvdyBNb3ZlCisgKgorICogTWF4ID0gd2luZG93IHVwIC8gY2xvc2VkCisgKiBNaW4gPSB3aW5kb3cgZG93biAvIG9wZW4KKyAqIE1hZ25pdHVkZSBkZW5vdGVzIHJlbGF0aXZlIHNwZWVkLiAgSS5lLiArMiBpcyBmYXN0ZXIgdGhhbiArMSBpbiByYWlzaW5nIHRoZSB3aW5kb3cuCisgKgorICogQHZhbHVlX3R5cGUgVkVISUNMRV9WQUxVRV9UWVBFX1pPTkVEX0lOVDMyCisgKiBAY2hhbmdlX21vZGUgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX09OX0NIQU5HRQorICogQGFjY2VzcyBWRUhJQ0xFX1BST1BfQUNDRVNTX1JFQURfV1JJVEV8VkVISUNMRV9QUk9QX0FDQ0VTU19XUklURQorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9XSU5ET1dfTU9WRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCQzEpCisKKy8qKgorICogV2luZG93IFZlbnQgUG9zaXRpb24KKyAqCisgKiBUaGlzIGZlYXR1cmUgaXMgdXNlZCB0byBjb250cm9sIHRoZSB2ZW50IGZlYXR1cmUgb24gYSBzdW5yb29mLgorICoKKyAqIE1heCA9IHZlbnQgb3BlbgorICogTWluID0gdmVudCBjbG9zZWQKKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfWk9ORURfSU5UMzIKKyAqIEBjaGFuZ2VfbW9kZSBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFCisgKiBAYWNjZXNzIFZFSElDTEVfUFJPUF9BQ0NFU1NfUkVBRF9XUklURQorICogQGRhdGFfbWVtYmVyIGludDMyX3ZhbHVlCisgKi8KKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9XSU5ET1dfVkVOVF9QT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDBCQzIpCisKKy8qKgorICogV2luZG93IFZlbnQgTW92ZQorICoKKyAqIFRoaXMgZmVhdHVyZSBpcyB1c2VkIHRvIGNvbnRyb2wgdGhlIHZlbnQgZmVhdHVyZSBvbiBhIHN1bnJvb2YuCisgKgorICogTWF4ID0gdmVudCBvcGVuCisgKiBNaW4gPSB2ZW50IGNsb3NlZAorICoKKyAqIEB2YWx1ZV90eXBlIFZFSElDTEVfVkFMVUVfVFlQRV9aT05FRF9JTlQzMgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFfFZFSElDTEVfUFJPUF9BQ0NFU1NfV1JJVEUKKyAqIEBkYXRhX21lbWJlciBpbnQzMl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfV0lORE9XX1ZFTlRfTU9WRSAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQkMzKQorCisvKioKKyAqIFdpbmRvdyBMb2NrCisgKgorICogVHJ1ZSBpbmRpY2F0ZXMgd2luZG93cyBhcmUgbG9ja2VkIGFuZCBjYW4ndCBiZSBtb3ZlZC4KKyAqCisgKiBAdmFsdWVfdHlwZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfQk9PTEVBTgorICogQGNoYW5nZV9tb2RlIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9PTl9DSEFOR0UKKyAqIEBhY2Nlc3MgVkVISUNMRV9QUk9QX0FDQ0VTU19SRUFEX1dSSVRFCisgKiBAZGF0YV9tZW1iZXIgYm9vbGVhbl92YWx1ZQorICovCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfV0lORE9XX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwQkM0KQorCisKKworLyoqCiAgKiAgSC9XIHNwZWNpZmljLCBub24tc3RhbmRhcmQgcHJvcGVydHkgY2FuIGJlIGFkZGVkIGFzIG5lY2Vzc2FyeS4gU3VjaCBwcm9wZXJ0eSBzaG91bGQgdXNlCiAgKiAgcHJvcGVydHkgbnVtYmVyIGluIHJhbmdlIG9mIFtWRUhJQ0xFX1BST1BFUlRZX0NVU1RPTV9TVEFSVCwgVkVISUNMRV9QUk9QRVJUWV9DVVNUT01fRU5EXS4KICAqICBEZWZpbml0aW9uIG9mIHByb3BlcnR5IGluIHRoaXMgcmFuZ2UgaXMgY29tcGxldGVseSB1cCB0byBlYWNoIEhBTCBpbXBsZW1lbnRhdGlvbi4KQEAgLTEwMjcsMjAgKzE4NjAsMjAgQEAKICAqICBpbmNsdWRlIGNvbmZpZ19zdHJpbmcgb2YgImNvbS5YWVouc29tZV9mdXJ0aGVyX2RldGFpbHMiLgogICogIEByYW5nZV9zdGFydAogICovCi0jZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfQ1VTVE9NX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAoMHg3MDAwMDAwMCkKKyNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9DVVNUT01fU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NzAwMDAwMDApCiAvKiogQHJhbmdlX2VuZCAqLwotI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0NVU1RPTV9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NzNmZmZmZmYpCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfQ1VTVE9NX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDczZmZmZmZmKQogCiAvKioKICAqIFByb3BlcnR5IHJhbmdlIGFsbG9jYXRlZCBmb3Igc3lzdGVtJ3MgaW50ZXJuYWwgdXNhZ2UgbGlrZSB0ZXN0aW5nLiBIQUwgc2hvdWxkIG5ldmVyIGRlY2xhcmUKICAqIHByb3BlcnR5IGluIHRoaXMgcmFuZ2UuCiAgKiBAcmFuZ2Vfc3RhcnQKICAqLwotI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0lOVEVSTkFMX1NUQVJUICAgICAgICAgICAgICAgICAgICAgKDB4NzQwMDAwMDApCisjZGVmaW5lIFZFSElDTEVfUFJPUEVSVFlfSU5URVJOQUxfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDc0MDAwMDAwKQogLyoqCiAgKiBAcmFuZ2VfZW5kCiAgKi8KLSNkZWZpbmUgVkVISUNMRV9QUk9QRVJUWV9JTlRFUk5BTF9FTkQgICAgICAgICAgICAgICAgICAgICAgICgweDc0ZmZmZmZmKQorI2RlZmluZSBWRUhJQ0xFX1BST1BFUlRZX0lOVEVSTkFMX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg3NGZmZmZmZikKIAogLyoqCiAgKiBWYWx1ZSB0eXBlcyBmb3IgdmFyaW91cyBwcm9wZXJ0aWVzLgpAQCAtMTA4NiwxMiArMTkxOSwxNCBAQAogICAgIFZFSElDTEVfVU5JVF9UWVBFX01FVEVSICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMjEsCiAgICAgVkVISUNMRV9VTklUX1RZUEVfS0lMT01FVEVSICAgICAgICAgICAgID0gMHgwMDAwMDAyMywKICAgICAvLyB0ZW1wZXJhdHVyZQotICAgIFZFSElDTEVfVU5JVF9UWVBFX0NFTENJVVMgICAgICAgICAgICAgICA9IDB4MDAwMDAwMzAsCisgICAgVkVISUNMRV9VTklUX1RZUEVfQ0VMU0lVUyAgICAgICAgICAgICAgID0gMHgwMDAwMDAzMCwKKyAgICBWRUhJQ0xFX1VOSVRfVFlQRV9GQUhSRU5IRUlUICAgICAgICAgICAgPSAweDAwMDAwMDMxLAorICAgIFZFSElDTEVfVU5JVF9UWVBFX0tFTFZJTiAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMzIsCiAgICAgLy8gdm9sdW1lCiAgICAgVkVISUNMRV9VTklUX1RZUEVfTUlMTElMSVRFUiAgICAgICAgICAgID0gMHgwMDAwMDA0MCwKICAgICAvLyB0aW1lCiAgICAgVkVISUNMRV9VTklUX1RZUEVfTkFOT19TRUNTICAgICAgICAgICAgID0gMHgwMDAwMDA1MCwKLSAgICBWRUhJQ0xFX1VOT1RfVFlQRV9TRUNTICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDUzLAorICAgIFZFSElDTEVfVU5JVF9UWVBFX1NFQ1MgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwNTMsCiAgICAgVkVISUNMRV9VTklUX1RZUEVfWUVBUiAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDA1OSwKIH07CiAKQEAgLTExMDUsOCArMTk0MCwxMiBAQAogICAgICAqLwogICAgIFZFSElDTEVfUFJPUF9DSEFOR0VfTU9ERV9TVEFUSUMgICAgICAgICA9IDB4MDAsCiAgICAgLyoqCi0gICAgICogUHJvcGVydHkgb2YgdGhpcyB0eXBlIHdpbGwgYmUgcmVwb3J0ZWQgd2hlbiB0aGVyZSBpcyBhIGNoYW5nZS4gZ2V0IHNob3VsZCByZXR1cm4gdGhlCi0gICAgICogY3VycmVudCB2YWx1ZS4KKyAgICAgKiBQcm9wZXJ0eSBvZiB0aGlzIHR5cGUgd2lsbCBiZSByZXBvcnRlZCB3aGVuIHRoZXJlIGlzIGEgY2hhbmdlLgorICAgICAqIGdldCBjYWxsIHNob3VsZCByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUuCisgICAgICogU2V0IG9wZXJhdGlvbiBmb3IgdGhpcyBwcm9wZXJ0eSBpcyBhc3N1bWVkIHRvIGJlIGFzeW5jaHJvbm91cy4gV2hlbiB0aGUgcHJvcGVydHkgaXMgcmVhZAorICAgICAqIChnZXQpIGFmdGVyIHNldCwgaXQgbWF5IHN0aWxsIHJldHVybiBvbGQgdmFsdWUgdW50aWwgdW5kZXJseWluZyBIL1cgYmFja2luZyB0aGlzIHByb3BlcnR5CisgICAgICogaGFzIGFjdHVhbGx5IGNoYW5nZWQgdGhlIHN0YXRlLiBPbmNlIHN0YXRlIGlzIGNoYW5nZWQsIHRoZSBwcm9wZXJ0eSB3aWxsIGRpc3BhdGNoIGNoYW5nZWQKKyAgICAgKiB2YWx1ZSBhcyBldmVudC4KICAgICAgKi8KICAgICBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fQ0hBTkdFICAgICAgPSAweDAxLAogICAgIC8qKgpAQCAtMTExNCw2ICsxOTUzLDE4IEBACiAgICAgICogdGhlIGRhdGEuCiAgICAgICovCiAgICAgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX0NPTlRJTlVPVVMgICAgID0gMHgwMiwKKyAgICAvKioKKyAgICAgKiBQcm9wZXJ0eSBvZiB0aGlzIHR5cGUgbWF5IGJlIHBvbGxlZCB0byBnZXQgdGhlIGN1cnJlbnQgdmFsdWUuCisgICAgICovCisgICAgVkVISUNMRV9QUk9QX0NIQU5HRV9NT0RFX1BPTEwgICAgICAgICAgID0gMHgwMywKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGZvciBwcm9wZXJ0eSB3aGVyZSBjaGFuZ2UgZXZlbnQgc2hvdWxkIGJlIHNlbnQgb25seSB3aGVuIHRoZSB2YWx1ZSBpcworICAgICAqIHNldCBmcm9tIGV4dGVybmFsIGNvbXBvbmVudC4gTm9ybWFsIHZhbHVlIGNoYW5nZSB3aWxsIG5vdCB0cmlnZ2VyIGV2ZW50LgorICAgICAqIEZvciBleGFtcGxlLCBjbG9jayBwcm9wZXJ0eSBjYW4gc2VuZCBjaGFuZ2UgZXZlbnQgb25seSB3aGVuIGl0IGlzIHNldCwgb3V0c2lkZSBhbmRyb2lkLAorICAgICAqIGZvciBjYXNlIGxpa2UgdXNlciBzZXR0aW5nIHRpbWUgb3IgdGltZSBnZXR0aW5nIHVwZGF0ZS4gVGhlcmUgaXMgbm8gbmVlZCB0byBzZW5kIGl0CisgICAgICogcGVyIGV2ZXJ5IHZhbHVlIGNoYW5nZS4KKyAgICAgKi8KKyAgICBWRUhJQ0xFX1BST1BfQ0hBTkdFX01PREVfT05fU0VUICAgICAgICAgPSAweDA0LAogfTsKIAogLyoqCkBAIC0xMjM4LDE3ICsyMDg5LDE1IEBACiAgKiBWYXJpb3VzIFNlYXRzIGluIHRoZSBjYXIuCiAgKi8KIGVudW0gdmVoaWNsZV9zZWF0IHsKLSAgICBWRUhJQ0xFX1NFQVRfRFJJVkVSX0xIRCAgICAgICAgICAgICA9IDB4MDAwMSwKLSAgICBWRUhJQ0xFX1NFQVRfRFJJVkVSX1JIRCAgICAgICAgICAgICA9IDB4MDAwMiwKLSAgICBWRUhJQ0xFX1NFQVRfUk9XXzFfUEFTU0VOR0VSX0xFRlQgICA9IDB4MDAxMCwKLSAgICBWRUhJQ0xFX1NFQVRfUk9XXzFfUEFTU0VOR0VSX0NFTlRFUiA9IDB4MDAyMCwKLSAgICBWRUhJQ0xFX1NFQVRfUk9XXzFfUEFTU0VOR0VSX1JJR0hUICA9IDB4MDA0MCwKLSAgICBWRUhJQ0xFX1NFQVRfUk9XXzJfUEFTU0VOR0VSX0xFRlQgICA9IDB4MDEwMCwKLSAgICBWRUhJQ0xFX1NFQVRfUk9XXzJfUEFTU0VOR0VSX0NFTlRFUiA9IDB4MDIwMCwKLSAgICBWRUhJQ0xFX1NFQVRfUk9XXzJfUEFTU0VOR0VSX1JJR0hUICA9IDB4MDQwMCwKLSAgICBWRUhJQ0xFX1NFQVRfUk9XXzNfUEFTU0VOR0VSX0xFRlQgICA9IDB4MTAwMCwKLSAgICBWRUhJQ0xFX1NFQVRfUk9XXzNfUEFTU0VOR0VSX0NFTlRFUiA9IDB4MjAwMCwKLSAgICBWRUhJQ0xFX1NFQVRfUk9XXzNfUEFTU0VOR0VSX1JJR0hUICA9IDB4NDAwMAorICAgIFZFSElDTEVfU0VBVF9ST1dfMV9MRUZUICAgPSAweDAwMDEsCisgICAgVkVISUNMRV9TRUFUX1JPV18xX0NFTlRFUiA9IDB4MDAwMiwKKyAgICBWRUhJQ0xFX1NFQVRfUk9XXzFfUklHSFQgID0gMHgwMDA0LAorICAgIFZFSElDTEVfU0VBVF9ST1dfMl9MRUZUICAgPSAweDAwMTAsCisgICAgVkVISUNMRV9TRUFUX1JPV18yX0NFTlRFUiA9IDB4MDAyMCwKKyAgICBWRUhJQ0xFX1NFQVRfUk9XXzJfUklHSFQgID0gMHgwMDQwLAorICAgIFZFSElDTEVfU0VBVF9ST1dfM19MRUZUICAgPSAweDAxMDAsCisgICAgVkVISUNMRV9TRUFUX1JPV18zX0NFTlRFUiA9IDB4MDIwMCwKKyAgICBWRUhJQ0xFX1NFQVRfUk9XXzNfUklHSFQgID0gMHgwNDAwCiB9OwogCiAvKioKQEAgLTEyODIsNiArMjEzMSw3IEBACiAgICAgVkVISUNMRV9NSVJST1JfRFJJVkVSX1JJR0hUICA9IDB4MDAwMDAwMDIsCiAgICAgVkVISUNMRV9NSVJST1JfRFJJVkVSX0NFTlRFUiA9IDB4MDAwMDAwMDQsCiB9OworCiBlbnVtIHZlaGljbGVfdHVybl9zaWduYWwgewogICAgIFZFSElDTEVfU0lHTkFMX05PTkUgICAgICAgICA9IDB4MDAsCiAgICAgVkVISUNMRV9TSUdOQUxfUklHSFQgICAgICAgID0gMHgwMSwKQEAgLTEyODksNiArMjEzOSwxNSBAQAogICAgIFZFSElDTEVfU0lHTkFMX0VNRVJHRU5DWSAgICA9IDB4MDQKIH07CiAKK2VudW0gdmVoaWNsZV96b25lX3R5cGUgeworICAgIFZFSElDTEVfWk9ORV9UWVBFX05PTkUgICAgICA9IDB4MDAsCisgICAgVkVISUNMRV9aT05FX1RZUEVfWk9ORSAgICA9IDB4MDEsCisgICAgVkVISUNMRV9aT05FX1RZUEVfU0VBVCAgICAgID0gMHgwMiwKKyAgICBWRUhJQ0xFX1pPTkVfVFlQRV9ET09SICAgICAgPSAweDA0LAorICAgIFZFSElDTEVfWk9ORV9UWVBFX1dJTkRPVyAgICA9IDB4MTAsCisgICAgVkVISUNMRV9aT05FX1RZUEVfTUlSUk9SICAgID0gMHgyMCwKK307CisKIC8qCiAgKiBCb29sZWFuIHR5cGUuCiAgKi8KQEAgLTE0NjgsNiArMjMyNyw3IEBACiAgICAgICAgIHZlaGljbGVfYm9vbGVhbl90IG1heF9kZWZyb3N0X29uOwogICAgICAgICB2ZWhpY2xlX2Jvb2xlYW5fdCByZWNpcmNfb247CiAgICAgICAgIHZlaGljbGVfYm9vbGVhbl90IGR1YWxfb247CisgICAgICAgIHZlaGljbGVfYm9vbGVhbl90IGF1dG9fb247CiAgICAgICAgIHZlaGljbGVfYm9vbGVhbl90IHBvd2VyX29uOwogCiAgICAgICAgIGZsb2F0IHRlbXBlcmF0dXJlX2N1cnJlbnQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhcmR3YXJlL3ZlaGljbGVfY2FtZXJhLmggYi9pbmNsdWRlL2hhcmR3YXJlL3ZlaGljbGVfY2FtZXJhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNzVhZWUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9oYXJkd2FyZS92ZWhpY2xlX2NhbWVyYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfVkVISUNMRV9DQU1FUkFfSU5URVJGQUNFX0gKLSNkZWZpbmUgQU5EUk9JRF9WRUhJQ0xFX0NBTUVSQV9JTlRFUkZBQ0VfSAotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+Ci0KLV9fQkVHSU5fREVDTFMKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFZFSElDTEVfQ0FNRVJBX0hFQURFUl9WRVJTSU9OICAgICAgICAgIDEKLSNkZWZpbmUgVkVISUNMRV9DQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzFfMCAgSEFSRFdBUkVfTU9EVUxFX0FQSV9WRVJTSU9OKDEsIDApCi0jZGVmaW5lIFZFSElDTEVfQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzAgIEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTl8yKDEsIDAsIFZFSElDTEVfQ0FNRVJBX0hFQURFUl9WRVJTSU9OKQotCi0vKioKLSAqIFZlaGljbGUgQ2FtZXJhIHRvIHByb3ZpZGUgaW50ZXJmYWNlcyBmb3IgY29udHJvbGxpbmcgY2FtZXJhcwotICovCi0KLS8qKgotICogVGhlIGlkIG9mIHRoaXMgbW9kdWxlCi0gKi8KLSNkZWZpbmUgVkVISUNMRV9DQU1FUkFfSEFSRFdBUkVfTU9EVUxFX0lEICAidmVoaWNsZV9jYW1lcmEiCi0KLS8qKgotICogIE5hbWUgb2YgdGhlIHZlaGljbGUgZGV2aWNlIHRvIG9wZW4uICBFeHRlbmQgdGhpcyBsaXN0IGFzCi0gKiAgbW9yZSBjYW1lcmFzIGFyZSBhZGRlZC4gIEVhY2ggY2FtZXJhIGRlZmluZWQgaW4gdmVoaWNsZV9jYW1lcmFfdHlwZV90Ci0gKiAgc2hhbGwgaGF2ZSBhIHN0cmluZyBkZWZpbmVkIGZvciBpdC4KLSAqLwotI2RlZmluZSBWRUhJQ0xFX0NBTUVSQV9SVkNfREVWSUNFICAgICAgICJ2ZWhpY2xlX2NhbWVyYV9ydmNfZGV2aWNlIgotCi0vKioKLSAqIEVhY2ggY2FtZXJhIG9uIHRoZSBjYXIgc2hhbGwgYmUgZW51bWVyYXRlZAotICovCi10eXBlZGVmIGVudW0gewotICAgIFZFSElDTEVfQ0FNRVJBX1JWQyA9IDEsCi19IHZlaGljbGVfY2FtZXJhX3R5cGVfdDsKLQotLyoqCi0gKiBEZXNjcmliZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgY2FtZXJhIGRldmljZQotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdWludDMyX3Qgb3ZlcmxheV9vbjsKLSAgICB1aW50MzJfdCBjYW1lcmFfb247Ci19IHZlaGljbGVfY2FtZXJhX3N0YXRlX3Q7Ci0KLS8qKgotICogQml0bWFzayBvZiBmZWF0dXJlcyBzdXBwb3J0ZWQgYnkgYSBjYW1lcmEgbW9kdWxlCi0gKi8KLWVudW0gewotICAgIFZFSElDTEVfQ0FNRVJBX0NPTkZJR19GTEFHX0FORFJPSURfT1ZFUkxBWV9TVVBQT1JUICAgICAgPSAweDEsCi0gICAgVkVISUNMRV9DQU1FUkFfQ09ORklHX0ZMQUdfQ0FNRVJBX0NST1BfU1VQUE9SVCAgICAgICAgICA9IDB4MiwKLSAgICBWRUhJQ0xFX0NBTUVSQV9DT05GSUdfRkxBR19DQU1FUkFfUE9TSVRJT05JTkdfU1VQUE9SVCAgID0gMHg0Ci19IHZlaGljbGVfY2FtZXJhX2NvbmZpZ19mbGFnOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdWludDMyX3QgY2FwYWJpbGl0ZXNfZmxhZ3M7Ci0gICAgdWludDMyX3QgY2FtZXJhX3dpZHRoOwotICAgIHVpbnQzMl90IGNhbWVyYV9oZWlnaHQ7Ci0gICAgdWludDMyX3QgZGlzcGxheV93aWR0aDsKLSAgICB1aW50MzJfdCBkaXNwbGF5X2hlaWdodDsKLX0gdmVoaWNsZV9jYW1lcmFfY2FwX3Q7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRXZlcnkgaGFyZHdhcmUgbW9kdWxlIG11c3QgaGF2ZSBhIGRhdGEgc3RydWN0dXJlIG5hbWVkIEhBTF9NT0RVTEVfSU5GT19TWU0KLSAqIGFuZCB0aGUgZmllbGRzIG9mIHRoaXMgZGF0YSBzdHJ1Y3R1cmUgbXVzdCBiZWdpbiB3aXRoIGh3X21vZHVsZV90Ci0gKiBmb2xsb3dlZCBieSBtb2R1bGUgc3BlY2lmaWMgaW5mb3JtYXRpb24uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBzdHJ1Y3QgaHdfbW9kdWxlX3QgY29tbW9uOwotICAgIC8qKgotICAgICAqIFF1ZXJpZXMgdGhlIEhXIGZvciB0aGUgY2FtZXJhcyBpbnN0YWxsZWQgb24gdGhlIHZlaGljbGUKLSAgICAgKiBAcGFyYW0gbnVtX2NhbWVyYXMgLSBudW1iZXIgb2YgY2FtZXJhIGRldmljZXMgYXZhaWxhYmxlLiAgSWYKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgMCBpcyByZXR1cm5lZCwgYW4gZXJyb3IgaGFzIG9jY3VycmVkIGFuZAotICAgICAqICAgICAgICAgICAgICAgICAgICB0aGUgcmV0dXJuIHBvaW50ZXIgc2hhbGwgYmUgTlVMTC4KLSAgICAgKiBAcmV0dXJuIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdmVoaWNsZV9jYW1lcmFfdHlwZV90IHRvCi0gICAgICogICAgICAgICBkZW5vdGUgd2hpY2ggY2FtZXJhcyBhcmUgaW5zdGFsbGVkLiAgVGhpcyBwb2ludGVyIGlzCi0gICAgICogICAgICAgICBvbmx5IHZhbGlkIHdoaWxlIHRoZSB2ZWhpY2xlIGhhbCBpcyBsb2FkZWQuICBJZiB0aGUKLSAgICAgKiAgICAgICAgIHBvaW50ZXIgaXMgTlVMTCwgdGhlbiBhbiBlcnJvciBoYXMgb2NjdXJyZWQgYW5kCi0gICAgICogICAgICAgICBudW1fY2FtZXJhcyBzaGFsbCBiZSAwLgotICAgICAqLwotICAgIGNvbnN0IHVpbnQzMl90ICogKCpnZXRfY2FtZXJhX2RldmljZV9saXN0KSh1aW50MzJfdCAqbnVtX2NhbWVyYXMpOwotfSB2ZWhpY2xlX2NhbWVyYV9tb2R1bGVfdDsKLQotCi10eXBlZGVmIHN0cnVjdCB2ZWhpY2xlX2NhbWVyYV9kZXZpY2VfdCB7Ci0gICAgc3RydWN0IGh3X2RldmljZV90IGNvbW1vbjsKLQotICAgIGNvbnN0IHVpbnQzMl90IGNhbWVyYV90eXBlOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoaXMgY2FtZXJhLgotICAgICAqIEBwYXJhbSBkZXZpY2UgLSBkZXZpY2UgaGFuZGxlCi0gICAgICogQHBhcmFtIGNhcCAtIHBvaW50ZXIgdG8gY2FwYWJpbGl0aWVzIGZsYWdzIGJlaW5nIHJldHVybmVkCi0gICAgICogQHJldHVybiAwIG9uIHN1Y2Nlc3MKLSAgICAgKiAgICAgICAgICAtRVBFUk0gaWYgZGV2aWNlIGlzIGludmFsaWQgb3Igbm90IGluaXRpYWxpemVkCi0gICAgICovCi0gICAgaW50ICgqZ2V0X2NhcGFiaWxpdGllcykoc3RydWN0IHZlaGljbGVfY2FtZXJhX2RldmljZV90ICpkZXZpY2UsIHZlaGljbGVfY2FtZXJhX2NhcF90ICpjYXApOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY3VycmVudCBjYW1lcmEgY3JvcCBzZXR0aW5ncy4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIC0gZGV2aWNlIGhhbmRsZQotICAgICAqIEBwYXJhbSByZWN0IC0gY3VycmVudCBjYW1lcmEgY3JvcCBzZXR0aW5ncwotICAgICAqIEByZXR1cm4gMCBvbiBzdWNjZXNzCi0gICAgICogICAgICAgICAgLUVQRVJNIGlmIGRldmljZSBpcyBub3QgaW5pdGlhbGl6ZWQKLSAgICAgKiAgICAgICAgICAtZXJybm8gb24gZXJyb3IKLSAgICAgKi8KLSAgICBpbnQgKCpnZXRfY2FtZXJhX2Nyb3ApKHN0cnVjdCB2ZWhpY2xlX2NhbWVyYV9kZXZpY2VfdCAqZGV2aWNlLCBhbmRyb2lkX25hdGl2ZV9yZWN0X3QgKnJlY3QpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY2FtZXJhIGNyb3AuCi0gICAgICogQHBhcmFtIGRldmljZSAtIGRldmljZSBoYW5kbGUKLSAgICAgKiBAcGFyYW0gcmVjdCAtIGFyZWEgb2YgY2FtZXJhIGlucHV0IHRvIGNyb3AuICBNdXN0IGZpdCB3aXRoaW4KLSAgICAgKiAgICAgICAgICAgICBjYW1lcmEgd2lkdGggYW5kIGhlaWdodCBmcm9tIGNhbWVyYSBjYXBhYmlsaXRpZXMuCi0gICAgICogQHJldHVybiAwIG9uIHN1Y2Nlc3MKLSAgICAgKiAgICAgICAgICAtRVBFUk0gaWYgZGV2aWNlIGlzIG5vdCBpbml0aWFsaXplZAotICAgICAqICAgICAgICAgIC1lcnJubyBvbiBlcnJvcgotICAgICAqLwotICAgIGludCAoKnNldF9jYW1lcmFfY3JvcCkoc3RydWN0IHZlaGljbGVfY2FtZXJhX2RldmljZV90ICpkZXZpY2UsIGNvbnN0IGFuZHJvaWRfbmF0aXZlX3JlY3RfdCAqcmVjdCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHBvc2l0aW9uIG9mIHRoZSBjYW1lcmEgb24gdGhlIGRpc3BsYXkuCi0gICAgICogQHBhcmFtIGRldmljZSAtIGRldmljZSBoYW5kbGUKLSAgICAgKiBAcGFyYW0gcmVjdCAtIGFyZWEgb2YgZGlzcGxheSB0aGUgY2FtZXJhIHdpbGwgYXBwZWFyIHdoZW4gb24KLSAgICAgKiBAcmV0dXJuIDAgb24gc3VjY2VzcwotICAgICAqICAgICAgICAgIC1FUEVSTSBpZiBkZXZpY2UgaXMgbm90IGluaXRpYWxpemVkCi0gICAgICogICAgICAgICAgLWVycm5vIG9uIGVycm9yCi0gICAgICovCi0gICAgaW50ICgqZ2V0X2NhbWVyYV9wb3NpdGlvbikoc3RydWN0IHZlaGljbGVfY2FtZXJhX2RldmljZV90ICpkZXZpY2UsIGFuZHJvaWRfbmF0aXZlX3JlY3RfdCAqcmVjdCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHBvc2l0aW9uIG9mIHRoZSBjYW1lcmEgb24gdGhlIGRpc3BsYXkuCi0gICAgICogQHBhcmFtIGRldmljZSAtIGRldmljZSBoYW5kbGUKLSAgICAgKiBAcGFyYW0gcmVjdCAtIGFyZWEgb2YgZGlzcGxheSB0aGUgY2FtZXJhIHdpbGwgYXBwZWFyIHdoZW4gb24uCi0gICAgICogICAgICAgICAgICAgTXVzdCBmaXQgd2l0aGluIGRpc3BsYXkgd2lkdGggYW5kIGhlaWdodCBmcm9tCi0gICAgICogICAgICAgICAgICAgY2FtZXJhIGNhcGFiaWxpdGllcy4KLSAgICAgKiBAcmV0dXJuIDAgb24gc3VjY2VzcwotICAgICAqICAgICAgICAgIC1FUEVSTSBpZiBkZXZpY2UgaXMgbm90IGluaXRpYWxpemVkCi0gICAgICogICAgICAgICAgLWVycm5vIG9uIGVycm9yCi0gICAgICovCi0gICAgaW50ICgqc2V0X2NhbWVyYV9wb3NpdGlvbikoc3RydWN0IHZlaGljbGVfY2FtZXJhX2RldmljZV90ICpkZXZpY2UsIGNvbnN0IGFuZHJvaWRfbmF0aXZlX3JlY3RfdCAqcmVjdCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGNhbWVyYSBzdGF0ZS4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIC0gZGV2aWNlIGhhbmRsZQotICAgICAqIEBwYXJhbSBzdGF0ZSAtIGxhc3Qgc2V0dGluZyBmb3IgdGhlIGNhbWVyYQotICAgICAqIEByZXR1cm4gMCBvbiBzdWNjZXNzCi0gICAgICogICAgICAgICAgLUVQRVJNIGlmIGRldmljZSBpcyBub3QgaW5pdGlhbGl6ZWQKLSAgICAgKi8KLSAgICBpbnQgKCpnZXRfY2FtZXJhX3N0YXRlKShzdHJ1Y3QgdmVoaWNsZV9jYW1lcmFfZGV2aWNlX3QgKmRldmljZSwgdmVoaWNsZV9jYW1lcmFfc3RhdGVfdCAqc3RhdGUpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY2FtZXJhIHN0YXRlLgotICAgICAqIEBwYXJhbSBkZXZpY2UgLSBkZXZpY2UgaGFuZGxlCi0gICAgICogQHBhcmFtIHN0YXRlIC0gZGVzaXJlZCBzZXR0aW5nIGZvciB0aGUgY2FtZXJhCi0gICAgICogQHJldHVybiAwIG9uIHN1Y2Nlc3MKLSAgICAgKiAgICAgICAgICAtRVBFUk0gaWYgZGV2aWNlIGlzIG5vdCBpbml0aWFsaXplZAotICAgICAqICAgICAgICAgIC1lcnJubyBvbiBlcnJvcgotICAgICAqLwotICAgIGludCAoKnNldF9jYW1lcmFfc3RhdGUpKHN0cnVjdCB2ZWhpY2xlX2NhbWVyYV9kZXZpY2VfdCAqZGV2aWNlLCBjb25zdCB2ZWhpY2xlX2NhbWVyYV9zdGF0ZV90ICpzdGF0ZSk7Ci19IHZlaGljbGVfY2FtZXJhX2RldmljZV90OwotCi1fX0VORF9ERUNMUwotCi0jZW5kaWYgIC8vIEFORFJPSURfVkVISUNMRV9DQU1FUkFfSU5URVJGQUNFX0gKZGlmZiAtLWdpdCBhL21vZHVsZXMvUkVBRE1FLmFuZHJvaWQgYi9tb2R1bGVzL1JFQURNRS5hbmRyb2lkCmluZGV4IDU3YWJiNzIuLjdmZmMwZjQgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvUkVBRE1FLmFuZHJvaWQKKysrIGIvbW9kdWxlcy9SRUFETUUuYW5kcm9pZApAQCAtNCwxMyArNCwxMyBAQAogbGliaGFyZHdhcmUuc28gZXZlbnR1YWxseSBzaG91bGQgY29udGFpbiAqanVzdCogdGhlIEhBTCBodWIKIChoYXJkd2FyZS5jKSwgZXZlcnl0aGluZyBpbiBpdCBzaG91bGQgYmUgcmV3cml0dGVuIGFzIG1vZHVsZXMuCiAKLU1vZHVsZXMgYXJlIC5zbyBpbiAvc3lzdGVtL2xpYnMvaHcvIGFuZCBoYXZlIGEgd2VsbCBkZWZpbmVkIG5hbWluZworTW9kdWxlcyBhcmUgLnNvIGluIC92ZW5kb3IvbGliL2h3LyBhbmQgaGF2ZSBhIHdlbGwgZGVmaW5lZCBuYW1pbmcKIGNvbnZlbnRpb246CiAKLSAgICAvc3lzdGVtL2xpYnMvaHcvPCpfSEFSRFdBUkVfTU9EVUxFX0lEPi48cm8ucHJvZHVjdC5ib2FyZD4uc28KLSAgICAvc3lzdGVtL2xpYnMvaHcvPCpfSEFSRFdBUkVfTU9EVUxFX0lEPi48cm8uYm9hcmQucGxhdGZvcm0+LnNvCi0gICAgL3N5c3RlbS9saWJzL2h3LzwqX0hBUkRXQVJFX01PRFVMRV9JRD4uPHJvLmFyY2g+LnNvCi0gICAgL3N5c3RlbS9saWJzL2h3LzwqX0hBUkRXQVJFX01PRFVMRV9JRD4uZGVmYXVsdC5zbworICAgIC92ZW5kb3IvbGliL2h3LzwqX0hBUkRXQVJFX01PRFVMRV9JRD4uPHJvLnByb2R1Y3QuYm9hcmQ+LnNvCisgICAgL3ZlbmRvci9saWIvaHcvPCpfSEFSRFdBUkVfTU9EVUxFX0lEPi48cm8uYm9hcmQucGxhdGZvcm0+LnNvCisgICAgL3ZlbmRvci9saWIvaHcvPCpfSEFSRFdBUkVfTU9EVUxFX0lEPi48cm8uYXJjaD4uc28KKyAgICAvdmVuZG9yL2xpYi9ody88Kl9IQVJEV0FSRV9NT0RVTEVfSUQ+LmRlZmF1bHQuc28KIAogVGhleSBhbHNvIGhhdmUgYSB3ZWxsIGRlZmluZWQgaW50ZXJmYWNlIHdoaWNoIGxpdmVzIGluIGluY2x1ZGUvaGFyZHdhcmUvLgogCmRpZmYgLS1naXQgYS9tb2R1bGVzL2F1ZGlvL0FuZHJvaWQuYnAgYi9tb2R1bGVzL2F1ZGlvL0FuZHJvaWQuYnAKaW5kZXggODBjYWIxOS4uODRkYWVhZCAxMDA2NDQKLS0tIGEvbW9kdWxlcy9hdWRpby9BbmRyb2lkLmJwCisrKyBiL21vZHVsZXMvYXVkaW8vQW5kcm9pZC5icApAQCAtMjEsMTEgKzIxLDEyIEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImF1ZGlvLnByaW1hcnkuZGVmYXVsdCIsCiAgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiaHciLAorICAgIHByb3ByaWV0YXJ5OiB0cnVlLAogICAgIHNyY3M6IFsiYXVkaW9faHcuYyJdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAogICAgIF0sCi0gICAgY2ZsYWdzOiBbIi1Xbm8tdW51c2VkLXBhcmFtZXRlciJdLAorICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIiwgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciJdLAogfQogCiAvLyBUaGUgc3R1YiBhdWRpbyBIQUwgbW9kdWxlLCBpZGVudGljYWwgdG8gdGhlIGRlZmF1bHQgYXVkaW8gaGFsLCBidXQgd2l0aApAQCAtMzcsMTEgKzM4LDEyIEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImF1ZGlvLnN0dWIuZGVmYXVsdCIsCiAgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiaHciLAorICAgIHByb3ByaWV0YXJ5OiB0cnVlLAogICAgIHNyY3M6IFsiYXVkaW9faHcuYyJdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAogICAgIF0sCi0gICAgY2ZsYWdzOiBbIi1Xbm8tdW51c2VkLXBhcmFtZXRlciJdLAorICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIiwgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciJdLAogfQogCiAvLyBUaGUgc3R1YiBhdWRpbyBwb2xpY3kgSEFMIG1vZHVsZSB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgc2tlbGV0b24gZm9yCkBAIC00OSw5ICs1MSwxMCBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJhdWRpb19wb2xpY3kuc3R1YiIsCiAgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiaHciLAorICAgIHByb3ByaWV0YXJ5OiB0cnVlLAogICAgIHNyY3M6IFsiYXVkaW9fcG9saWN5LmMiXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKICAgICBdLAotICAgIGNmbGFnczogWyItV25vLXVudXNlZC1wYXJhbWV0ZXIiXSwKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciIsICItV25vLXVudXNlZC1wYXJhbWV0ZXIiXSwKIH0KZGlmZiAtLWdpdCBhL21vZHVsZXMvYXVkaW8vYXVkaW9faHcuYyBiL21vZHVsZXMvYXVkaW8vYXVkaW9faHcuYwppbmRleCAzYzI4OGNhLi44ZjczZjExIDEwMDY0NAotLS0gYS9tb2R1bGVzL2F1ZGlvL2F1ZGlvX2h3LmMKKysrIGIvbW9kdWxlcy9hdWRpby9hdWRpb19ody5jCkBAIC0zMDAsMTEgKzMwMCw5IEBACiB7CiAgICAgQUxPR1YoImFkZXZfb3Blbl9vdXRwdXRfc3RyZWFtLi4uIik7CiAKLSAgICBzdHJ1Y3Qgc3R1Yl9hdWRpb19kZXZpY2UgKmxhZGV2ID0gKHN0cnVjdCBzdHViX2F1ZGlvX2RldmljZSAqKWRldjsKLSAgICBzdHJ1Y3Qgc3R1Yl9zdHJlYW1fb3V0ICpvdXQ7Ci0gICAgaW50IHJldDsKLQotICAgIG91dCA9IChzdHJ1Y3Qgc3R1Yl9zdHJlYW1fb3V0ICopY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3Qgc3R1Yl9zdHJlYW1fb3V0KSk7CisgICAgKnN0cmVhbV9vdXQgPSBOVUxMOworICAgIHN0cnVjdCBzdHViX3N0cmVhbV9vdXQgKm91dCA9CisgICAgICAgICAgICAoc3RydWN0IHN0dWJfc3RyZWFtX291dCAqKWNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHN0dWJfc3RyZWFtX291dCkpOwogICAgIGlmICghb3V0KQogICAgICAgICByZXR1cm4gLUVOT01FTTsKIApAQCAtMzI4LDExICszMjYsNiBAQAogCiAgICAgKnN0cmVhbV9vdXQgPSAmb3V0LT5zdHJlYW07CiAgICAgcmV0dXJuIDA7Ci0KLWVycl9vcGVuOgotICAgIGZyZWUob3V0KTsKLSAgICAqc3RyZWFtX291dCA9IE5VTEw7Ci0gICAgcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgYWRldl9jbG9zZV9vdXRwdXRfc3RyZWFtKHN0cnVjdCBhdWRpb19od19kZXZpY2UgKmRldiwKQEAgLTQyNywxMSArNDIwLDggQEAKIHsKICAgICBBTE9HVigiYWRldl9vcGVuX2lucHV0X3N0cmVhbS4uLiIpOwogCi0gICAgc3RydWN0IHN0dWJfYXVkaW9fZGV2aWNlICpsYWRldiA9IChzdHJ1Y3Qgc3R1Yl9hdWRpb19kZXZpY2UgKilkZXY7Ci0gICAgc3RydWN0IHN0dWJfc3RyZWFtX2luICppbjsKLSAgICBpbnQgcmV0OwotCi0gICAgaW4gPSAoc3RydWN0IHN0dWJfc3RyZWFtX2luICopY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3Qgc3R1Yl9zdHJlYW1faW4pKTsKKyAgICAqc3RyZWFtX2luID0gTlVMTDsKKyAgICBzdHJ1Y3Qgc3R1Yl9zdHJlYW1faW4gKmluID0gKHN0cnVjdCBzdHViX3N0cmVhbV9pbiAqKWNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHN0dWJfc3RyZWFtX2luKSk7CiAgICAgaWYgKCFpbikKICAgICAgICAgcmV0dXJuIC1FTk9NRU07CiAKQEAgLTQ1MywxMSArNDQzLDYgQEAKIAogICAgICpzdHJlYW1faW4gPSAmaW4tPnN0cmVhbTsKICAgICByZXR1cm4gMDsKLQotZXJyX29wZW46Ci0gICAgZnJlZShpbik7Ci0gICAgKnN0cmVhbV9pbiA9IE5VTEw7Ci0gICAgcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgYWRldl9jbG9zZV9pbnB1dF9zdHJlYW0oc3RydWN0IGF1ZGlvX2h3X2RldmljZSAqZGV2LApAQCAtNDg2LDcgKzQ3MSw2IEBACiAgICAgQUxPR1YoImFkZXZfb3BlbjogJXMiLCBuYW1lKTsKIAogICAgIHN0cnVjdCBzdHViX2F1ZGlvX2RldmljZSAqYWRldjsKLSAgICBpbnQgcmV0OwogCiAgICAgaWYgKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9JTlRFUkZBQ0UpICE9IDApCiAgICAgICAgIHJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9hdWRpby9hdWRpb19wb2xpY3kuYyBiL21vZHVsZXMvYXVkaW8vYXVkaW9fcG9saWN5LmMKaW5kZXggOTMzNTY1NC4uNGY5Y2Q1YSAxMDA2NDQKLS0tIGEvbW9kdWxlcy9hdWRpby9hdWRpb19wb2xpY3kuYworKysgYi9tb2R1bGVzL2F1ZGlvL2F1ZGlvX3BvbGljeS5jCkBAIC0yNDEsOSArMjQxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqc2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvbGljeSAqKmFwKQogewotICAgIHN0cnVjdCBkZWZhdWx0X2FwX2RldmljZSAqZGV2OwogICAgIHN0cnVjdCBkZWZhdWx0X2F1ZGlvX3BvbGljeSAqZGFwOwotICAgIGludCByZXQ7CiAKICAgICAqYXAgPSBOVUxMOwogCmRpZmYgLS1naXQgYS9tb2R1bGVzL2F1ZGlvX3JlbW90ZV9zdWJtaXgvQW5kcm9pZC5tayBiL21vZHVsZXMvYXVkaW9fcmVtb3RlX3N1Ym1peC9BbmRyb2lkLm1rCmluZGV4IDkwZGEzOTYuLmM5ZTg1MWYgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvYXVkaW9fcmVtb3RlX3N1Ym1peC9BbmRyb2lkLm1rCisrKyBiL21vZHVsZXMvYXVkaW9fcmVtb3RlX3N1Ym1peC9BbmRyb2lkLm1rCkBAIC0xOCwxMSArMTgsMTMgQEAKIAogTE9DQUxfTU9EVUxFIDo9IGF1ZGlvLnJfc3VibWl4LmRlZmF1bHQKIExPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IGh3CitMT0NBTF9QUk9QUklFVEFSWV9NT0RVTEUgOj0gdHJ1ZQogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKIAlhdWRpb19ody5jcHAKIExPQ0FMX0NfSU5DTFVERVMgKz0gXAogCWZyYW1ld29ya3MvYXYvaW5jbHVkZS8gXAotCWZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvCisJZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS8gXAorCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlibG9nIGxpYmN1dGlscyBsaWJ1dGlscyBsaWJuYmFpbwogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJtZWRpYV9oZWxwZXIKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCmRpZmYgLS1naXQgYS9tb2R1bGVzL2NhbWVyYS8zXzAvQW5kcm9pZC5tayBiL21vZHVsZXMvY2FtZXJhLzNfMC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNjhlZDUKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL2NhbWVyYS8zXzAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQ1IEBACisjIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gY2FtZXJhLmRlZmF1bHQKK0xPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IGh3CisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorCXN5c3RlbS9jb3JlL2luY2x1ZGUgXAorCXN5c3RlbS9tZWRpYS9jYW1lcmEvaW5jbHVkZSBcCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisJQ2FtZXJhSEFMLmNwcCBcCisJQ2FtZXJhLmNwcCBcCisJRXhhbXBsZUNhbWVyYS5jcHAgXAorCU1ldGFkYXRhLmNwcCBcCisJU3RyZWFtLmNwcCBcCisJVmVuZG9yVGFncy5jcHAgXAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJjYW1lcmFfbWV0YWRhdGEgXAorCWxpYmN1dGlscyBcCisJbGlibG9nIFwKKwlsaWJzeW5jIFwKKwlsaWJ1dGlscyBcCisKK0xPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2V4dHJhIC1mdmlzaWJpbGl0eT1oaWRkZW4KKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9jYW1lcmEvQ2FtZXJhLmNwcCBiL21vZHVsZXMvY2FtZXJhLzNfMC9DYW1lcmEuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtb2R1bGVzL2NhbWVyYS9DYW1lcmEuY3BwCnJlbmFtZSB0byBtb2R1bGVzL2NhbWVyYS8zXzAvQ2FtZXJhLmNwcApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9jYW1lcmEvQ2FtZXJhLmggYi9tb2R1bGVzL2NhbWVyYS8zXzAvQ2FtZXJhLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1vZHVsZXMvY2FtZXJhL0NhbWVyYS5oCnJlbmFtZSB0byBtb2R1bGVzL2NhbWVyYS8zXzAvQ2FtZXJhLmgKZGlmZiAtLWdpdCBhL21vZHVsZXMvY2FtZXJhL0NhbWVyYUhBTC5jcHAgYi9tb2R1bGVzL2NhbWVyYS8zXzAvQ2FtZXJhSEFMLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbW9kdWxlcy9jYW1lcmEvQ2FtZXJhSEFMLmNwcApyZW5hbWUgdG8gbW9kdWxlcy9jYW1lcmEvM18wL0NhbWVyYUhBTC5jcHAKZGlmZiAtLWdpdCBhL21vZHVsZXMvY2FtZXJhL0NhbWVyYUhBTC5oIGIvbW9kdWxlcy9jYW1lcmEvM18wL0NhbWVyYUhBTC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtb2R1bGVzL2NhbWVyYS9DYW1lcmFIQUwuaApyZW5hbWUgdG8gbW9kdWxlcy9jYW1lcmEvM18wL0NhbWVyYUhBTC5oCmRpZmYgLS1naXQgYS9tb2R1bGVzL2NhbWVyYS9FeGFtcGxlQ2FtZXJhLmNwcCBiL21vZHVsZXMvY2FtZXJhLzNfMC9FeGFtcGxlQ2FtZXJhLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbW9kdWxlcy9jYW1lcmEvRXhhbXBsZUNhbWVyYS5jcHAKcmVuYW1lIHRvIG1vZHVsZXMvY2FtZXJhLzNfMC9FeGFtcGxlQ2FtZXJhLmNwcApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9jYW1lcmEvRXhhbXBsZUNhbWVyYS5oIGIvbW9kdWxlcy9jYW1lcmEvM18wL0V4YW1wbGVDYW1lcmEuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbW9kdWxlcy9jYW1lcmEvRXhhbXBsZUNhbWVyYS5oCnJlbmFtZSB0byBtb2R1bGVzL2NhbWVyYS8zXzAvRXhhbXBsZUNhbWVyYS5oCmRpZmYgLS1naXQgYS9tb2R1bGVzL2NhbWVyYS9NZXRhZGF0YS5jcHAgYi9tb2R1bGVzL2NhbWVyYS8zXzAvTWV0YWRhdGEuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtb2R1bGVzL2NhbWVyYS9NZXRhZGF0YS5jcHAKcmVuYW1lIHRvIG1vZHVsZXMvY2FtZXJhLzNfMC9NZXRhZGF0YS5jcHAKZGlmZiAtLWdpdCBhL21vZHVsZXMvY2FtZXJhL01ldGFkYXRhLmggYi9tb2R1bGVzL2NhbWVyYS8zXzAvTWV0YWRhdGEuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbW9kdWxlcy9jYW1lcmEvTWV0YWRhdGEuaApyZW5hbWUgdG8gbW9kdWxlcy9jYW1lcmEvM18wL01ldGFkYXRhLmgKZGlmZiAtLWdpdCBhL21vZHVsZXMvY2FtZXJhL1N0cmVhbS5jcHAgYi9tb2R1bGVzL2NhbWVyYS8zXzAvU3RyZWFtLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbW9kdWxlcy9jYW1lcmEvU3RyZWFtLmNwcApyZW5hbWUgdG8gbW9kdWxlcy9jYW1lcmEvM18wL1N0cmVhbS5jcHAKZGlmZiAtLWdpdCBhL21vZHVsZXMvY2FtZXJhL1N0cmVhbS5oIGIvbW9kdWxlcy9jYW1lcmEvM18wL1N0cmVhbS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtb2R1bGVzL2NhbWVyYS9TdHJlYW0uaApyZW5hbWUgdG8gbW9kdWxlcy9jYW1lcmEvM18wL1N0cmVhbS5oCmRpZmYgLS1naXQgYS9tb2R1bGVzL2NhbWVyYS9WZW5kb3JUYWdzLmNwcCBiL21vZHVsZXMvY2FtZXJhLzNfMC9WZW5kb3JUYWdzLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbW9kdWxlcy9jYW1lcmEvVmVuZG9yVGFncy5jcHAKcmVuYW1lIHRvIG1vZHVsZXMvY2FtZXJhLzNfMC9WZW5kb3JUYWdzLmNwcApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9jYW1lcmEvVmVuZG9yVGFncy5oIGIvbW9kdWxlcy9jYW1lcmEvM18wL1ZlbmRvclRhZ3MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbW9kdWxlcy9jYW1lcmEvVmVuZG9yVGFncy5oCnJlbmFtZSB0byBtb2R1bGVzL2NhbWVyYS8zXzAvVmVuZG9yVGFncy5oCmRpZmYgLS1naXQgYS9tb2R1bGVzL2NhbWVyYS9BbmRyb2lkLm1rIGIvbW9kdWxlcy9jYW1lcmEvQW5kcm9pZC5tawppbmRleCBhZTY4ZWQ1Li43MTM4OGFhIDEwMDY0NAotLS0gYS9tb2R1bGVzL2NhbWVyYS9BbmRyb2lkLm1rCisrKyBiL21vZHVsZXMvY2FtZXJhL0FuZHJvaWQubWsKQEAgLTEsNCArMSw0IEBACi0jIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xMiwzNCArMTIsNCBAQAogIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gY2FtZXJhLmRlZmF1bHQKLUxPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IGh3Ci0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotCXN5c3RlbS9jb3JlL2luY2x1ZGUgXAotCXN5c3RlbS9tZWRpYS9jYW1lcmEvaW5jbHVkZSBcCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0JQ2FtZXJhSEFMLmNwcCBcCi0JQ2FtZXJhLmNwcCBcCi0JRXhhbXBsZUNhbWVyYS5jcHAgXAotCU1ldGFkYXRhLmNwcCBcCi0JU3RyZWFtLmNwcCBcCi0JVmVuZG9yVGFncy5jcHAgXAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjYW1lcmFfbWV0YWRhdGEgXAotCWxpYmN1dGlscyBcCi0JbGlibG9nIFwKLQlsaWJzeW5jIFwKLQlsaWJ1dGlscyBcCi0KLUxPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2V4dHJhIC1mdmlzaWJpbGl0eT1oaWRkZW4KLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQoraW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9tb2R1bGVzL2NvbnN1bWVyaXIvQW5kcm9pZC5icCBiL21vZHVsZXMvY29uc3VtZXJpci9BbmRyb2lkLmJwCmluZGV4IDRlZTVmYjEuLmIxMzk0OTIgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvY29uc3VtZXJpci9BbmRyb2lkLmJwCisrKyBiL21vZHVsZXMvY29uc3VtZXJpci9BbmRyb2lkLmJwCkBAIC0xNSw2ICsxNSw3IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImNvbnN1bWVyaXIuZGVmYXVsdCIsCiAgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiaHciLAorICAgIHByb3ByaWV0YXJ5OiB0cnVlLAogICAgIHNyY3M6IFsiY29uc3VtZXJpci5jIl0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCmRpZmYgLS1naXQgYS9tb2R1bGVzL2ZpbmdlcnByaW50L0FuZHJvaWQuYnAgYi9tb2R1bGVzL2ZpbmdlcnByaW50L0FuZHJvaWQuYnAKaW5kZXggYTY2ZjlmOS4uYmE3NDllNCAxMDA2NDQKLS0tIGEvbW9kdWxlcy9maW5nZXJwcmludC9BbmRyb2lkLmJwCisrKyBiL21vZHVsZXMvZmluZ2VycHJpbnQvQW5kcm9pZC5icApAQCAtMTUsNiArMTUsNyBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJmaW5nZXJwcmludC5kZWZhdWx0IiwKICAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJodyIsCisgICAgcHJvcHJpZXRhcnk6IHRydWUsCiAgICAgc3JjczogWyJmaW5nZXJwcmludC5jIl0sCiAgICAgc2hhcmVkX2xpYnM6IFsibGlibG9nIl0sCiB9CmRpZmYgLS1naXQgYS9tb2R1bGVzL2dyYWxsb2MvQW5kcm9pZC5tayBiL21vZHVsZXMvZ3JhbGxvYy9BbmRyb2lkLm1rCmluZGV4IDZiNmU2MGQuLmZmNTgwOGQgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvZ3JhbGxvYy9BbmRyb2lkLm1rCisrKyBiL21vZHVsZXMvZ3JhbGxvYy9BbmRyb2lkLm1rCkBAIC0yMCw2ICsyMCw3IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gaHcKK0xPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSA6PSB0cnVlCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmxvZyBsaWJjdXRpbHMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9IAlcCmRpZmYgLS1naXQgYS9tb2R1bGVzL2dyYWxsb2MvZ3JhbGxvYy5jcHAgYi9tb2R1bGVzL2dyYWxsb2MvZ3JhbGxvYy5jcHAKaW5kZXggZjhkM2M3OC4uMDdiYmZiYSAxMDA2NDQKLS0tIGEvbW9kdWxlcy9ncmFsbG9jL2dyYWxsb2MuY3BwCisrKyBiL21vZHVsZXMvZ3JhbGxvYy9ncmFsbG9jLmNwcApAQCAtMjA5LDYgKzIwOSw5IEBACiAKICAgICBpbnQgYnl0ZXNQZXJQaXhlbCA9IDA7CiAgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQkFfRlAxNjoKKyAgICAgICAgICAgIGJ5dGVzUGVyUGl4ZWwgPSA4OworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg6CiAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JYXzg4ODg6CiAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODg6CmRpZmYgLS1naXQgYS9tb2R1bGVzL2h3Y29tcG9zZXIvQW5kcm9pZC5tayBiL21vZHVsZXMvaHdjb21wb3Nlci9BbmRyb2lkLm1rCmluZGV4IDM1YzBmYWUuLmRhMGY2ZGIgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvaHdjb21wb3Nlci9BbmRyb2lkLm1rCisrKyBiL21vZHVsZXMvaHdjb21wb3Nlci9BbmRyb2lkLm1rCkBAIC0yMCw2ICsyMCw3IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gaHcKK0xPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSA6PSB0cnVlCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmxvZyBsaWJFR0wKIExPQ0FMX1NSQ19GSUxFUyA6PSBod2NvbXBvc2VyLmNwcAogTE9DQUxfTU9EVUxFIDo9IGh3Y29tcG9zZXIuZGVmYXVsdApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9od2NvbXBvc2VyL2h3Y29tcG9zZXIuY3BwIGIvbW9kdWxlcy9od2NvbXBvc2VyL2h3Y29tcG9zZXIuY3BwCmluZGV4IDI5N2NhZmQuLmZkNGU5MGQgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvaHdjb21wb3Nlci9od2NvbXBvc2VyLmNwcAorKysgYi9tb2R1bGVzL2h3Y29tcG9zZXIvaHdjb21wb3Nlci5jcHAKQEAgLTM3LDE4ICszNywxOCBAQAogICAgICAgICBzdHJ1Y3QgaHdfZGV2aWNlX3QqKiBkZXZpY2UpOwogCiBzdGF0aWMgc3RydWN0IGh3X21vZHVsZV9tZXRob2RzX3QgaHdjX21vZHVsZV9tZXRob2RzID0gewotICAgIG9wZW46IGh3Y19kZXZpY2Vfb3BlbgorICAgIC5vcGVuID0gaHdjX2RldmljZV9vcGVuCiB9OwogCiBod2NfbW9kdWxlX3QgSEFMX01PRFVMRV9JTkZPX1NZTSA9IHsKLSAgICBjb21tb246IHsKLSAgICAgICAgdGFnOiBIQVJEV0FSRV9NT0RVTEVfVEFHLAotICAgICAgICB2ZXJzaW9uX21ham9yOiAxLAotICAgICAgICB2ZXJzaW9uX21pbm9yOiAwLAotICAgICAgICBpZDogSFdDX0hBUkRXQVJFX01PRFVMRV9JRCwKLSAgICAgICAgbmFtZTogIlNhbXBsZSBod2NvbXBvc2VyIG1vZHVsZSIsCi0gICAgICAgIGF1dGhvcjogIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QiLAotICAgICAgICBtZXRob2RzOiAmaHdjX21vZHVsZV9tZXRob2RzLAorICAgIC5jb21tb24gPSB7CisgICAgICAgIC50YWcgPSBIQVJEV0FSRV9NT0RVTEVfVEFHLAorICAgICAgICAudmVyc2lvbl9tYWpvciA9IDEsCisgICAgICAgIC52ZXJzaW9uX21pbm9yID0gMCwKKyAgICAgICAgLmlkID0gSFdDX0hBUkRXQVJFX01PRFVMRV9JRCwKKyAgICAgICAgLm5hbWUgPSAiU2FtcGxlIGh3Y29tcG9zZXIgbW9kdWxlIiwKKyAgICAgICAgLmF1dGhvciA9ICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IiwKKyAgICAgICAgLm1ldGhvZHMgPSAmaHdjX21vZHVsZV9tZXRob2RzLAogICAgIH0KIH07CiAKQEAgLTY3LDggKzY3LDggQEAKICAgICAgICAgICAgIGwtPmRpc3BsYXlGcmFtZS5ib3R0b20pOwogfQogCi1zdGF0aWMgaW50IGh3Y19wcmVwYXJlKGh3Y19jb21wb3Nlcl9kZXZpY2VfMV90ICpkZXYsCi0gICAgICAgIHNpemVfdCBudW1EaXNwbGF5cywgaHdjX2Rpc3BsYXlfY29udGVudHNfMV90KiogZGlzcGxheXMpIHsKK3N0YXRpYyBpbnQgaHdjX3ByZXBhcmUoaHdjX2NvbXBvc2VyX2RldmljZV8xX3QgKiAvKmRldiovLAorICAgICAgICBzaXplX3QgLypudW1EaXNwbGF5cyovLCBod2NfZGlzcGxheV9jb250ZW50c18xX3QqKiBkaXNwbGF5cykgewogICAgIGlmIChkaXNwbGF5cyAmJiAoZGlzcGxheXNbMF0tPmZsYWdzICYgSFdDX0dFT01FVFJZX0NIQU5HRUQpKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8ZGlzcGxheXNbMF0tPm51bUh3TGF5ZXJzIDsgaSsrKSB7CiAgICAgICAgICAgICAvL2R1bXBfbGF5ZXIoJmxpc3QtPmh3TGF5ZXJzW2ldKTsKQEAgLTc4LDE2ICs3OCwxNiBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGh3Y19zZXQoaHdjX2NvbXBvc2VyX2RldmljZV8xX3QgKmRldiwKLSAgICAgICAgc2l6ZV90IG51bURpc3BsYXlzLCBod2NfZGlzcGxheV9jb250ZW50c18xX3QqKiBkaXNwbGF5cykKK3N0YXRpYyBpbnQgaHdjX3NldChod2NfY29tcG9zZXJfZGV2aWNlXzFfdCAqIC8qZGV2Ki8sCisgICAgICAgIHNpemVfdCAvKm51bURpc3BsYXlzKi8sIGh3Y19kaXNwbGF5X2NvbnRlbnRzXzFfdCoqIGRpc3BsYXlzKQogewogICAgIC8vZm9yIChzaXplX3QgaT0wIDsgaTxsaXN0LT5udW1Id0xheWVycyA7IGkrKykgewogICAgIC8vICAgIGR1bXBfbGF5ZXIoJmxpc3QtPmh3TGF5ZXJzW2ldKTsKICAgICAvL30KIAotICAgIEVHTEJvb2xlYW4gc3VjZXNzID0gZWdsU3dhcEJ1ZmZlcnMoKEVHTERpc3BsYXkpZGlzcGxheXNbMF0tPmRweSwKKyAgICBFR0xCb29sZWFuIHN1Y2Nlc3MgPSBlZ2xTd2FwQnVmZmVycygoRUdMRGlzcGxheSlkaXNwbGF5c1swXS0+ZHB5LAogICAgICAgICAgICAgKEVHTFN1cmZhY2UpZGlzcGxheXNbMF0tPnN1cik7Ci0gICAgaWYgKCFzdWNlc3MpIHsKKyAgICBpZiAoIXN1Y2Nlc3MpIHsKICAgICAgICAgcmV0dXJuIEhXQ19FR0xfRVJST1I7CiAgICAgfQogICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9pbnB1dC9ldmRldi9BbmRyb2lkLm1rIGIvbW9kdWxlcy9pbnB1dC9ldmRldi9BbmRyb2lkLm1rCmluZGV4IDlhNWQwOTIuLmJlNGRiNmIgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvaW5wdXQvZXZkZXYvQW5kcm9pZC5taworKysgYi9tb2R1bGVzL2lucHV0L2V2ZGV2L0FuZHJvaWQubWsKQEAgLTQ1LDYgKzQ1LDcgQEAKIAogTE9DQUxfTU9EVUxFIDo9IGlucHV0LmV2ZGV2LmRlZmF1bHQKIExPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IGh3CitMT0NBTF9QUk9QUklFVEFSWV9NT0RVTEUgOj0gdHJ1ZQogCiBMT0NBTF9TUkNfRklMRVMgOj0gXAogICAgIEV2ZGV2TW9kdWxlLmNwcApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9sb2NhbF90aW1lL0FuZHJvaWQuYnAgYi9tb2R1bGVzL2xvY2FsX3RpbWUvQW5kcm9pZC5icAppbmRleCBkZjMyMzI1Li42NDNhZmE1IDEwMDY0NAotLS0gYS9tb2R1bGVzL2xvY2FsX3RpbWUvQW5kcm9pZC5icAorKysgYi9tb2R1bGVzL2xvY2FsX3RpbWUvQW5kcm9pZC5icApAQCAtMjQsNiArMjQsNyBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsb2NhbF90aW1lLmRlZmF1bHQiLAogICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImh3IiwKKyAgICBwcm9wcmlldGFyeTogdHJ1ZSwKICAgICBzcmNzOiBbImxvY2FsX3RpbWVfaHcuYyJdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9sb2NhbF90aW1lL2xvY2FsX3RpbWVfaHcuYyBiL21vZHVsZXMvbG9jYWxfdGltZS9sb2NhbF90aW1lX2h3LmMKaW5kZXggNGIyMTY1Ni4uYjM4ZDhhNSAxMDA2NDQKLS0tIGEvbW9kdWxlcy9sb2NhbF90aW1lL2xvY2FsX3RpbWVfaHcuYworKysgYi9tb2R1bGVzL2xvY2FsX3RpbWUvbG9jYWxfdGltZV9ody5jCkBAIC0yOCw2ICsyOCw5IEBACiAjaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9sb2NhbF90aW1lX2hhbC5oPgogCisvLyBXZSBvbmx5IHN1cHBvcnQgZ2NjIGFuZCBjbGFuZywgYm90aCBvZiB3aGljaCBzdXBwb3J0IHRoaXMgYXR0cmlidXRlLgorI2RlZmluZSBVTlVTRURfQVJHVU1FTlQgX19hdHRyaWJ1dGUoKHVudXNlZCkpCisKIHN0cnVjdCBzdHViX2xvY2FsX3RpbWVfZGV2aWNlIHsKICAgICBzdHJ1Y3QgbG9jYWxfdGltZV9od19kZXZpY2UgZGV2aWNlOwogfTsKQEAgLTUxLDcgKzU0LDggQEAKICAgICByZXR1cm4gKGludDY0X3Qpbm93OwogfQogCi1zdGF0aWMgdWludDY0X3QgbHRkZXZfZ2V0X2xvY2FsX2ZyZXEoc3RydWN0IGxvY2FsX3RpbWVfaHdfZGV2aWNlKiBkZXYpCitzdGF0aWMgdWludDY0X3QgbHRkZXZfZ2V0X2xvY2FsX2ZyZXEoCisgICAgICAgIHN0cnVjdCBsb2NhbF90aW1lX2h3X2RldmljZSogZGV2IFVOVVNFRF9BUkdVTUVOVCkKIHsKICAgICAvLyBGb3IgYmV0dGVyIG9yIHdvcnNlLCBsaW51eCBjbG9ja19nZXR0aW1lIHJvdXRpbmVzIG5vcm1hbGl6ZSBhbGwgY2xvY2sKICAgICAvLyBmcmVxdWVuY2llcyB0byAxR0h6CmRpZmYgLS1naXQgYS9tb2R1bGVzL25mYy1uY2kvQW5kcm9pZC5icCBiL21vZHVsZXMvbmZjLW5jaS9BbmRyb2lkLmJwCmluZGV4IGZjNzM3NjEuLjkwZDJhMjggMTAwNjQ0Ci0tLSBhL21vZHVsZXMvbmZjLW5jaS9BbmRyb2lkLmJwCisrKyBiL21vZHVsZXMvbmZjLW5jaS9BbmRyb2lkLmJwCkBAIC0xNSw2ICsxNSw3IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogIm5mY19uY2kuZGVmYXVsdCIsCiAgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiaHciLAorICAgIHByb3ByaWV0YXJ5OiB0cnVlLAogICAgIHNyY3M6IFsibmZjX25jaV9leGFtcGxlLmMiXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKZGlmZiAtLWdpdCBhL21vZHVsZXMvbmZjLW5jaS9uZmNfbmNpX2V4YW1wbGUuYyBiL21vZHVsZXMvbmZjLW5jaS9uZmNfbmNpX2V4YW1wbGUuYwppbmRleCBjZGZkN2Q3Li5mM2Y2MGY2IDEwMDY0NAotLS0gYS9tb2R1bGVzL25mYy1uY2kvbmZjX25jaV9leGFtcGxlLmMKKysrIGIvbW9kdWxlcy9uZmMtbmNpL25mY19uY2lfZXhhbXBsZS5jCkBAIC0yMyw0NCArMjMsNjEgQEAKICNpbmNsdWRlIDxoYXJkd2FyZS9uZmMuaD4KIAogLyoKKyAqIFdlIHdhbnQgdG8gc2lsZW5jZSB0aGUgInVudXNlZCBhcmd1bWVudCIgdGhhdCBnY2MgYW5kIGNsYW5nIGdpdmUuCisgKiBPdGhlciBjb21waWxlcnMgZ2VuZXJhdGluZyB0aGlzIHdhcm5pbmcgd2lsbCBuZWVkIHRvIHByb3ZpZGUgdGhlaXIKKyAqIGN1c3RvbSBhdHRyaWJ1dGUgdG8gc2lsZW5jZSB0aGlzLgorICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChfX2NsYW5nX18pCisjZGVmaW5lIFVOVVNFRF9BUkdVTUVOVCBfX2F0dHJpYnV0ZSgodW51c2VkKSkKKyNlbHNlCisjZGVmaW5lIFVOVVNFRF9BUkdVTUVOVAorI2VuZGlmCisKKy8qCiAgKiBOQ0kgSEFMIG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMuIFRoZXNlIG11c3QgYmUgb3ZlcnJpZGVuCiAgKi8KLXN0YXRpYyBpbnQgaGFsX29wZW4oY29uc3Qgc3RydWN0IG5mY19uY2lfZGV2aWNlICpkZXYsCi0gICAgICAgIG5mY19zdGFja19jYWxsYmFja190ICpwX2NiYWNrLCBuZmNfc3RhY2tfZGF0YV9jYWxsYmFja190ICpwX2RhdGFfY2JhY2spIHsKK3N0YXRpYyBpbnQgaGFsX29wZW4oY29uc3Qgc3RydWN0IG5mY19uY2lfZGV2aWNlICpkZXYgVU5VU0VEX0FSR1VNRU5ULAorICAgICAgICBuZmNfc3RhY2tfY2FsbGJhY2tfdCAqcF9jYmFjayBVTlVTRURfQVJHVU1FTlQsCisgICAgICAgIG5mY19zdGFja19kYXRhX2NhbGxiYWNrX3QgKnBfZGF0YV9jYmFjayBVTlVTRURfQVJHVU1FTlQpIHsKICAgICBBTE9HRSgiTkZDLU5DSSBIQUw6ICVzIiwgX19GVU5DVElPTl9fKTsKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBoYWxfd3JpdGUoY29uc3Qgc3RydWN0IG5mY19uY2lfZGV2aWNlICpkZXYsCi0gICAgICAgIHVpbnQxNl90IGRhdGFfbGVuLCBjb25zdCB1aW50OF90ICpwX2RhdGEpIHsKK3N0YXRpYyBpbnQgaGFsX3dyaXRlKGNvbnN0IHN0cnVjdCBuZmNfbmNpX2RldmljZSAqZGV2IFVOVVNFRF9BUkdVTUVOVCwKKyAgICAgICAgdWludDE2X3QgZGF0YV9sZW4gVU5VU0VEX0FSR1VNRU5ULAorICAgICAgICBjb25zdCB1aW50OF90ICpwX2RhdGEgVU5VU0VEX0FSR1VNRU5UKSB7CiAgICAgQUxPR0UoIk5GQy1OQ0kgSEFMOiAlcyIsIF9fRlVOQ1RJT05fXyk7CiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaGFsX2NvcmVfaW5pdGlhbGl6ZWQoY29uc3Qgc3RydWN0IG5mY19uY2lfZGV2aWNlICpkZXYsCi0gICAgICAgIHVpbnQ4X3QqIHBfY29yZV9pbml0X3JzcF9wYXJhbXMpIHsKK3N0YXRpYyBpbnQgaGFsX2NvcmVfaW5pdGlhbGl6ZWQoCisgICAgICAgIGNvbnN0IHN0cnVjdCBuZmNfbmNpX2RldmljZSAqZGV2IFVOVVNFRF9BUkdVTUVOVCwKKyAgICAgICAgdWludDhfdCogcF9jb3JlX2luaXRfcnNwX3BhcmFtcyBVTlVTRURfQVJHVU1FTlQpIHsKICAgICBBTE9HRSgiTkZDLU5DSSBIQUw6ICVzIiwgX19GVU5DVElPTl9fKTsKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBoYWxfcHJlX2Rpc2NvdmVyKGNvbnN0IHN0cnVjdCBuZmNfbmNpX2RldmljZSAqZGV2KSB7CitzdGF0aWMgaW50IGhhbF9wcmVfZGlzY292ZXIoCisgICAgICAgIGNvbnN0IHN0cnVjdCBuZmNfbmNpX2RldmljZSAqZGV2IFVOVVNFRF9BUkdVTUVOVCkgewogICAgIEFMT0dFKCJORkMtTkNJIEhBTDogJXMiLCBfX0ZVTkNUSU9OX18pOwogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGhhbF9jbG9zZShjb25zdCBzdHJ1Y3QgbmZjX25jaV9kZXZpY2UgKmRldikgeworc3RhdGljIGludCBoYWxfY2xvc2UoY29uc3Qgc3RydWN0IG5mY19uY2lfZGV2aWNlICpkZXYgVU5VU0VEX0FSR1VNRU5UKSB7CiAgICAgQUxPR0UoIk5GQy1OQ0kgSEFMOiAlcyIsIF9fRlVOQ1RJT05fXyk7CiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaGFsX2NvbnRyb2xfZ3JhbnRlZCAoY29uc3Qgc3RydWN0IG5mY19uY2lfZGV2aWNlICpwX2RldikKK3N0YXRpYyBpbnQgaGFsX2NvbnRyb2xfZ3JhbnRlZCAoCisgICAgICAgIGNvbnN0IHN0cnVjdCBuZmNfbmNpX2RldmljZSAqcF9kZXYgVU5VU0VEX0FSR1VNRU5UKQogewogICAgIEFMT0dFKCJORkMtTkNJIEhBTDogJXMiLCBfX0ZVTkNUSU9OX18pOwogICAgIHJldHVybiAwOwogfQogCiAKLXN0YXRpYyBpbnQgaGFsX3Bvd2VyX2N5Y2xlIChjb25zdCBzdHJ1Y3QgbmZjX25jaV9kZXZpY2UgKnBfZGV2KQorc3RhdGljIGludCBoYWxfcG93ZXJfY3ljbGUgKAorICAgICAgICBjb25zdCBzdHJ1Y3QgbmZjX25jaV9kZXZpY2UgKnBfZGV2IFVOVVNFRF9BUkdVTUVOVCkKIHsKICAgICBBTE9HRSgiTkZDLU5DSSBIQUw6ICVzIiwgX19GVU5DVElPTl9fKTsKICAgICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL21vZHVsZXMvbmZjL0FuZHJvaWQuYnAgYi9tb2R1bGVzL25mYy9BbmRyb2lkLmJwCmluZGV4IDUzYWIzMDkuLjEwZGMyYzEgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvbmZjL0FuZHJvaWQuYnAKKysrIGIvbW9kdWxlcy9uZmMvQW5kcm9pZC5icApAQCAtMTUsNiArMTUsNyBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJuZmMuZGVmYXVsdCIsCiAgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiaHciLAorICAgIHByb3ByaWV0YXJ5OiB0cnVlLAogICAgIHNyY3M6IFsibmZjX3BuNTQ0X2V4YW1wbGUuYyJdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9wb3dlci9BbmRyb2lkLmJwIGIvbW9kdWxlcy9wb3dlci9BbmRyb2lkLmJwCmluZGV4IDJiODZjOGIuLmY0Yzc0Y2UgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvcG93ZXIvQW5kcm9pZC5icAorKysgYi9tb2R1bGVzL3Bvd2VyL0FuZHJvaWQuYnAKQEAgLTE1LDYgKzE1LDcgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAicG93ZXIuZGVmYXVsdCIsCiAgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiaHciLAorICAgIHByb3ByaWV0YXJ5OiB0cnVlLAogICAgIHNyY3M6IFsicG93ZXIuYyJdLAogICAgIHNoYXJlZF9saWJzOiBbImxpYmxvZyJdLAogfQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9yYWRpby9yYWRpb19oYWxfdG9vbC5jIGIvbW9kdWxlcy9yYWRpby9yYWRpb19oYWxfdG9vbC5jCmluZGV4IGJhYTJlZmUuLjAxMTdmMjggMTAwNjQ0Ci0tLSBhL21vZHVsZXMvcmFkaW8vcmFkaW9faGFsX3Rvb2wuYworKysgYi9tb2R1bGVzL3JhZGlvL3JhZGlvX2hhbF90b29sLmMKQEAgLTEzMyw3ICsxMzMsNyBAQAogICAgICAgICByYWRpb19tZXRhZGF0YV9rZXlfdCBrZXk7CiAgICAgICAgIHJhZGlvX21ldGFkYXRhX3R5cGVfdCB0eXBlOwogICAgICAgICB2b2lkICp2YWx1ZTsKLSAgICAgICAgdWludDMyX3Qgc2l6ZTsKKyAgICAgICAgc2l6ZV90IHNpemU7CiAKICAgICAgICAgcmFkaW9fbWV0YWRhdGFfZ2V0X2F0X2luZGV4KGluZm8ubWV0YWRhdGEsIGksICZrZXksICZ0eXBlLCAmdmFsdWUsICZzaXplKTsKIApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9yYWRpby9yYWRpb19ody5jIGIvbW9kdWxlcy9yYWRpby9yYWRpb19ody5jCmluZGV4IGNmNDdlM2MuLjQzNzZiZjAgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvcmFkaW8vcmFkaW9faHcuYworKysgYi9tb2R1bGVzL3JhZGlvL3JhZGlvX2h3LmMKQEAgLTUxLDcgKzUxLDcgQEAKICAgICAuYmFuZHMgPSB7CiAgICAgICAgIHsKICAgICAgICAgICAgIC50eXBlID0gUkFESU9fQkFORF9GTSwKLSAgICAgICAgICAgIC5hbnRlbm5hX2Nvbm5lY3RlZCA9IGZhbHNlLAorICAgICAgICAgICAgLmFudGVubmFfY29ubmVjdGVkID0gdHJ1ZSwKICAgICAgICAgICAgIC5sb3dlcl9saW1pdCA9IDg3OTAwLAogICAgICAgICAgICAgLnVwcGVyX2xpbWl0ID0gMTA3OTAwLAogICAgICAgICAgICAgLm51bV9zcGFjaW5ncyA9IDEsCkBAIC0yMjQsNiArMjI0LDcgQEAKICAgICAqbWV0YWRhdGEgPSBOVUxMOwogCiAgICAgcmV0ID0gcmFkaW9fbWV0YWRhdGFfYWxsb2NhdGUobWV0YWRhdGEsIHR1bmVyLT5wcm9ncmFtLmNoYW5uZWwsIDApOworCiAgICAgaWYgKHJldCAhPSAwKQogICAgICAgICByZXR1cm4gcmV0OwogCkBAIC0yMzUsMTQgKzIzNiwxNCBAQAogICAgICAgICBpZiAocmV0ICE9IDApCiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIHJldCA9IGFkZF9iaXRtYXBfbWV0YWRhdGEobWV0YWRhdGEsIFJBRElPX01FVEFEQVRBX0tFWV9JQ09OLCBCSVRNQVBfRklMRV9QQVRIKTsKLSAgICAgICAgaWYgKHJldCAhPSAwKQorICAgICAgICBpZiAocmV0ICE9IDAgJiYgcmV0ICE9IC1FUElQRSkKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgcmV0ID0gcmFkaW9fbWV0YWRhdGFfYWRkX2Nsb2NrKG1ldGFkYXRhLCBSQURJT19NRVRBREFUQV9LRVlfQ0xPQ0ssICZod19jbG9jayk7CiAgICAgICAgIGlmIChyZXQgIT0gMCkKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9IGVsc2UgewogICAgICAgICByZXQgPSBhZGRfYml0bWFwX21ldGFkYXRhKG1ldGFkYXRhLCBSQURJT19NRVRBREFUQV9LRVlfQVJULCBCSVRNQVBfRklMRV9QQVRIKTsKLSAgICAgICAgaWYgKHJldCAhPSAwKQorICAgICAgICBpZiAocmV0ICE9IDAgJiYgcmV0ICE9IC1FUElQRSkKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAKQEAgLTM3MCw2ICszNzEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgdHVuZXItPnByb2dyYW0uc3RlcmVvID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgIHR1bmVyLT5wcm9ncmFtLnN0ZXJlbyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBwcmVwYXJlX21ldGFkYXRhKHR1bmVyLCAmdHVuZXItPnByb2dyYW0ubWV0YWRhdGEsIHR1bmVyLT5wcm9ncmFtLnR1bmVkKTsKIAogICAgICAgICAgICAgICAgICAgICBldmVudC50eXBlID0gUkFESU9fRVZFTlRfVFVORUQ7CiAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmluZm8gPSB0dW5lci0+cHJvZ3JhbTsKQEAgLTM5Niw2ICszOTgsNyBAQAogICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICB0dW5lci0+cHJvZ3JhbS5zdGVyZW8gPSB0dW5lci0+Y29uZmlnLmFtLnN0ZXJlbzsKICAgICAgICAgICAgICAgICAgICAgdHVuZXItPnByb2dyYW0uc2lnbmFsX3N0cmVuZ3RoID0gNTA7CisgICAgICAgICAgICAgICAgICAgIHByZXBhcmVfbWV0YWRhdGEodHVuZXIsICZ0dW5lci0+cHJvZ3JhbS5tZXRhZGF0YSwgdHVuZXItPnByb2dyYW0udHVuZWQpOwogCiAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnR5cGUgPSBSQURJT19FVkVOVF9UVU5FRDsKICAgICAgICAgICAgICAgICAgICAgZXZlbnQuaW5mbyA9IHR1bmVyLT5wcm9ncmFtOwpAQCAtNDA4LDEyICs0MTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR1bmVyLT5jb25maWcuc3BhY2luZ3NbMF0gKiA1KSkgJSAyOwogCiAgICAgICAgICAgICAgICAgICAgIGlmICh0dW5lci0+cHJvZ3JhbS50dW5lZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGFyZV9tZXRhZGF0YSh0dW5lciwgJnR1bmVyLT5wcm9ncmFtLm1ldGFkYXRhLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfY29tbWFuZF9sKHR1bmVyLCBDTURfQU5OT1VOQ0VNRU5UUywgdGhyZWFkX2NtZF9kZWxheV9tc1tDTURfQU5OT1VOQ0VNRU5UU10sIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR1bmVyLT5wcm9ncmFtLm1ldGFkYXRhICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaW9fbWV0YWRhdGFfZGVhbGxvY2F0ZSh0dW5lci0+cHJvZ3JhbS5tZXRhZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0dW5lci0+cHJvZ3JhbS5tZXRhZGF0YSA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgdHVuZXItPnByb2dyYW0uc2lnbmFsX3N0cmVuZ3RoID0gMTAwOwogICAgICAgICAgICAgICAgICAgICBpZiAodHVuZXItPmNvbmZpZy50eXBlID09IFJBRElPX0JBTkRfRk0pCkBAIC00MjIsNiArNDIwLDggQEAKICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgdHVuZXItPnByb2dyYW0uc3RlcmVvID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dW5lci0+cHJvZ3JhbS50dW5lZCA/IHR1bmVyLT5jb25maWcuYW0uc3RlcmVvIDogZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHByZXBhcmVfbWV0YWRhdGEodHVuZXIsICZ0dW5lci0+cHJvZ3JhbS5tZXRhZGF0YSwgdHVuZXItPnByb2dyYW0udHVuZWQpOworCiAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnR5cGUgPSBSQURJT19FVkVOVF9UVU5FRDsKICAgICAgICAgICAgICAgICAgICAgZXZlbnQuaW5mbyA9IHR1bmVyLT5wcm9ncmFtOwogICAgICAgICAgICAgICAgICAgICBzZW5kX21ldGFfZGF0YSA9IHRydWU7CkBAIC00MzMsNyArNDMzLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnR5cGUgPSBSQURJT19FVkVOVF9NRVRBREFUQTsKICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Lm1ldGFkYXRhID0gbWV0YWRhdGE7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VuZF9tZXRhX2RhdGEgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgICAgICAgICBjYXNlIENNRF9DQU5DRUw6IHsKQEAgLTUxNyw2ICs1MTYsMTAgQEAKICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KKyAgICBpZiAoY29uZmlnLT5sb3dlcl9saW1pdCA+IGNvbmZpZy0+dXBwZXJfbGltaXQpIHsKKyAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBzZW5kX2NvbW1hbmRfbChzdHViX3R1bmVyLCBDTURfQ0FOQ0VMLCB0aHJlYWRfY21kX2RlbGF5X21zW0NNRF9DQU5DRUxdLCBOVUxMKTsKICAgICBzZW5kX2NvbW1hbmRfbChzdHViX3R1bmVyLCBDTURfQ09ORklHLCB0aHJlYWRfY21kX2RlbGF5X21zW0NNRF9DT05GSUddLCAodm9pZCAqKWNvbmZpZyk7CiAKQEAgLTYyOSw3ICs2MzIsMTIgQEAKICAgICBtZXRhZGF0YSA9IGluZm8tPm1ldGFkYXRhOwogICAgICppbmZvID0gc3R1Yl90dW5lci0+cHJvZ3JhbTsKICAgICBpbmZvLT5tZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgIGlmIChtZXRhZGF0YSAhPSBOVUxMICYmIHN0dWJfdHVuZXItPnByb2dyYW0ubWV0YWRhdGEgIT0gTlVMTCkKKyAgICBpZiAobWV0YWRhdGEgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXMgbWV0YWRhdGEgaXMgYSBudWxscHRyIiwgX19mdW5jX18pOworICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorICAgIGlmIChzdHViX3R1bmVyLT5wcm9ncmFtLm1ldGFkYXRhICE9IE5VTEwpCiAgICAgICAgIHJhZGlvX21ldGFkYXRhX2FkZF9tZXRhZGF0YSgmaW5mby0+bWV0YWRhdGEsIHN0dWJfdHVuZXItPnByb2dyYW0ubWV0YWRhdGEpOwogCiBleGl0OgpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL0FuZHJvaWQuYnAgYi9tb2R1bGVzL3NlbnNvcnMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDE1MDY1Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxNSBAQAorY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJtdWx0aWhhbCIsCisgICAgdmVuZG9yOiB0cnVlLAorICAgIHNyY3M6IFsKKyAgICAgICAgIm11bHRpaGFsLmNwcCIsCisgICAgICAgICJTZW5zb3JFdmVudFF1ZXVlLmNwcCIKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmRsIgorICAgIF0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCit9CmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvQW5kcm9pZC5tayBiL21vZHVsZXMvc2Vuc29ycy9BbmRyb2lkLm1rCmluZGV4IDUzNGU2ZTkuLmNhMjc3ZTYgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvc2Vuc29ycy9BbmRyb2lkLm1rCisrKyBiL21vZHVsZXMvc2Vuc29ycy9BbmRyb2lkLm1rCkBAIC0yMyw2ICsyMyw3IEBACiBMT0NBTF9NT0RVTEUgOj0gc2Vuc29ycy4kKFRBUkdFVF9ERVZJQ0UpCiAKIExPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IGh3CitMT0NBTF9QUk9QUklFVEFSWV9NT0RVTEUgOj0gdHJ1ZQogCiBMT0NBTF9DRkxBR1MgOj0gLURMT0dfVEFHPVwiTXVsdGlIYWxcIgogCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvQW5kcm9pZC5tayBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ODU0MmEKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvQW5kcm9pZC5tawpAQCAtMCwwICsxLDEzMCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorQ09NTU9OX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yIC1XZXh0cmEKKworZHluYW1pY19zZW5zb3Jfc3JjIDo9IFwKKyAgICBCYXNlRHluYW1pY1NlbnNvckRhZW1vbi5jcHAgXAorICAgIEJhc2VTZW5zb3JPYmplY3QuY3BwIFwKKyAgICBDb25uZWN0aW9uRGV0ZWN0b3IuY3BwIFwKKyAgICBEdW1teUR5bmFtaWNBY2NlbERhZW1vbi5jcHAgXAorICAgIER5bmFtaWNTZW5zb3JNYW5hZ2VyLmNwcCBcCisgICAgSGlkUmF3RGV2aWNlLmNwcCBcCisgICAgSGlkUmF3U2Vuc29yLmNwcCBcCisgICAgSGlkUmF3U2Vuc29yRGFlbW9uLmNwcCBcCisgICAgSGlkUmF3U2Vuc29yRGV2aWNlLmNwcCBcCisgICAgUmluZ0J1ZmZlci5jcHAKKworZHluYW1pY19zZW5zb3Jfc2hhcmVkX2xpYiA6PSBcCisgICAgbGliYmFzZSBcCisgICAgbGliY3V0aWxzIFwKKyAgICBsaWJoaWRwYXJzZXIgXAorICAgIGxpYmxvZyBcCisgICAgbGlidXRpbHMKKyMKKyMgVGhlcmUgYXJlIHR3byB3YXlzIHRvIHV0aWxpemUgdGhlIGR5bmFtaWMgc2Vuc29yIG1vZHVsZToKKyMgICAxLiBVc2UgYXMgYW4gZXh0ZW5zaW9uIGluIGFuIGV4aXN0aW5nIGhhbDogZGVjbGFyZSBkZXBlbmRlbmN5IG9uIGxpYmR5bmFtaWNfc2Vuc29yX2V4dCBzaGFyZWQKKyMgICAgICBsaWJyYXJ5IGluIGV4aXN0aW5nIHNlbnNvciBoYWwuCisjICAgMi4gVXNlIGFzIGEgc3RhbmRhbG9uZSBzZW5zb3IgSEFMIGFuZCBjb25maWd1cmUgbXVsdGloYWwgdG8gY29tYmluZSBpdCB3aXRoIHNlbnNvciBoYWwgdGhhdAorIyAgICAgIGhvc3RzIG90aGVyIHNlbnNvcnM6IGFkZCBkZXBlbmRlbmN5IG9uIHNlbnNvcnMuZHluYW1pY19zZW5zb3JfaGFsIGluIGRldmljZSBsZXZlbCBtYWtlZmlsZSBhbmQKKyMgICAgICB3cml0ZSBtdWx0aWhhbCBjb25maWd1cmF0aW9uIGZpbGUgYWNjb3JkaW5nbHkuCisjCisjIFBsZWFzZSB0YWtlIG9ubHkgb25lIG9mIHRoZXNlIHR3byBvcHRpb25zIHRvIGF2b2lkIGNvbmZsaWN0IG92ZXIgaGFyZHdhcmUgcmVzb3VyY2UuCisjCisjCisjIE9wdGlvbiAxOiBzZW5zb3IgZXh0ZW5zaW9uIG1vZHVsZQorIworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gbGliZHluYW1pY19zZW5zb3JfZXh0CitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorIyBpbnRlbmRlZCB0byBiZSBpbnRlZ3JhdGVkIGludG8gaGFsLCB0aHVzIHByb3ByaWV0YXJ5CitMT0NBTF9QUk9QUklFVEFSWV9NT0RVTEUgOj0gdHJ1ZQorCitMT0NBTF9DRkxBR1MgKz0gJChDT01NT05fQ0ZMQUdTKSAtRExPR19UQUc9XCJEeW5hbWljU2Vuc29yRXh0XCIKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoZHluYW1pY19zZW5zb3Jfc3JjKQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9ICQoZHluYW1pY19zZW5zb3Jfc2hhcmVkX2xpYikKKworTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTIDo9ICQoTE9DQUxfUEFUSCkKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCisjCisjIE9wdGlvbiAyOiBpbmRlcGVuZGVudCBzZW5zb3IgaGFsCisjCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBzZW5zb3JzLmR5bmFtaWNfc2Vuc29yX2hhbAorTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gaHcKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisjIGhhbCBtb2R1bGUsIHRodXMgcHJvcHJpZXRhcnkKK0xPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSA6PSB0cnVlCisKK0xPQ0FMX0NGTEFHUyArPSAkKENPTU1PTl9DRkxBR1MpIC1ETE9HX1RBRz1cIkR5bmFtaWNTZW5zb3JIYWxcIgorCitMT0NBTF9TUkNfRklMRVMgOj0gJChkeW5hbWljX3NlbnNvcl9zcmMpIHNlbnNvcnMuY3BwCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gJChkeW5hbWljX3NlbnNvcl9zaGFyZWRfbGliKQorCitMT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gJChMT0NBTF9QQVRIKQorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKKyMKKyMgSG9zdCB0ZXN0IGZvciBIaWRSYXdTZW5zb3IuIFRlc3Qgd2l0aCBkdW1teSB0ZXN0IEhJRCBkZXNjcmlwdG9ycy4KKyMKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGhpZHJhd3NlbnNvcl9ob3N0X3Rlc3QKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisjIGhvc3QgdGVzdCBpcyB0YXJnZXRpbmcgbGludXggaG9zdCBvbmx5CitMT0NBTF9NT0RVTEVfSE9TVF9PUyA6PSBsaW51eAorCitMT0NBTF9DRkxBR1MgKz0gJChDT01NT05fQ0ZMQUdTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIEhpZFJhd1NlbnNvci5jcHAgXAorICAgIEJhc2VTZW5zb3JPYmplY3QuY3BwIFwKKyAgICBIaWRVdGlscy90ZXN0L1Rlc3RIaWREZXNjcmlwdG9yLmNwcCBcCisgICAgdGVzdC9IaWRSYXdTZW5zb3JUZXN0LmNwcAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmhpZHBhcnNlcl9ob3N0CisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChMT0NBTF9QQVRIKS90ZXN0ICQoTE9DQUxfUEFUSCkvSGlkVXRpbHMvdGVzdAoraW5jbHVkZSAkKEJVSUxEX0hPU1RfRVhFQ1VUQUJMRSkKKworIworIyBIb3N0IHRlc3QgZm9yIEhpZFJhd0RldmljZSBhbmQgSGlkUmF3U2Vuc29yLiBUZXN0IHdpdGggaGlkcmF3CisjIGRldmljZSBub2RlLgorIworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gaGlkcmF3ZGV2aWNlX2hvc3RfdGVzdAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKyMgaG9zdCB0ZXN0IGlzIHRhcmdldGluZyBsaW51eCBob3N0IG9ubHkKK0xPQ0FMX01PRFVMRV9IT1NUX09TIDo9IGxpbnV4CisKK0xPQ0FMX0NGTEFHUyArPSAkKENPTU1PTl9DRkxBR1MpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgSGlkUmF3RGV2aWNlLmNwcCBcCisgICAgSGlkUmF3U2Vuc29yLmNwcCBcCisgICAgQmFzZVNlbnNvck9iamVjdC5jcHAgXAorICAgIHRlc3QvSGlkUmF3RGV2aWNlVGVzdC5jcHAKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJoaWRwYXJzZXJfaG9zdAorCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvdGVzdCAkKExPQ0FMX1BBVEgpL0hpZFV0aWxzL3Rlc3QKK2luY2x1ZGUgJChCVUlMRF9IT1NUX0VYRUNVVEFCTEUpCisKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS9IaWRVdGlscy9BbmRyb2lkLm1rCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvQmFzZUR5bmFtaWNTZW5zb3JEYWVtb24uY3BwIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0Jhc2VEeW5hbWljU2Vuc29yRGFlbW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTlmMjE3Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0Jhc2VEeW5hbWljU2Vuc29yRGFlbW9uLmNwcApAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkJhc2VEeW5hbWljU2Vuc29yRGFlbW9uLmgiCisjaW5jbHVkZSAiRHluYW1pY1NlbnNvck1hbmFnZXIuaCIKKyNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFNlbnNvckhhbEV4dCB7CisKK2Jvb2wgQmFzZUR5bmFtaWNTZW5zb3JEYWVtb246Om9uQ29ubmVjdGlvbkNoYW5nZShjb25zdCBzdGQ6OnN0cmluZyAmZGV2aWNlS2V5LCBib29sIGNvbm5lY3RlZCkgeworICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgYXV0byBpID0gbURldmljZUtleVNlbnNvck1hcC5maW5kKGRldmljZUtleSk7CisgICAgaWYgKGNvbm5lY3RlZCkgeworICAgICAgICBpZiAoaSA9PSBtRGV2aWNlS2V5U2Vuc29yTWFwLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HVigiZGV2aWNlICVzIGlzIGNvbm5lY3RlZCIsIGRldmljZUtleS5jX3N0cigpKTsKKyAgICAgICAgICAgIC8vIGdldCBzZW5zb3JzIGZyb20gaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgIEJhc2VTZW5zb3JWZWN0b3Igc2Vuc29ycyA9IGNyZWF0ZVNlbnNvcihkZXZpY2VLZXkpOworICAgICAgICAgICAgaWYgKHNlbnNvcnMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dJKCJubyB2YWxpZCBzZW5zb3IgaXMgZGVmaW5lZCBpbiBkZXZpY2UgJXMsIGlnbm9yZSIsIGRldmljZUtleS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImRpc2NvdmVyZWQgJXp1IHNlbnNvcnMgZnJvbSBkZXZpY2UiLCBzZW5zb3JzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgLy8gYnVpbGQgaW50ZXJuYWwgdGFibGUgZmlyc3QKKyAgICAgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IG1EZXZpY2VLZXlTZW5zb3JNYXAuZW1wbGFjZShkZXZpY2VLZXksIHN0ZDo6bW92ZShzZW5zb3JzKSk7CisgICAgICAgICAgICAgICAgLy8gdGhlbiByZWdpc3RlciBzZW5zb3IgdG8gZHluYW1pYyBzZW5zb3IgbWFuYWdlciwgcmVzdWx0LmZpcnN0IGlzIHRoZSBpdGVyYXRvcgorICAgICAgICAgICAgICAgIC8vIG9mIGtleS12YWx1ZSBwYWlyOyByZXN1bHQuZmlyc3QtPnNlY29uZCBpcyB0aGUgdmFsdWUsIHdoaWNoIGlzIHMuCisgICAgICAgICAgICAgICAgZm9yIChhdXRvICZpIDogcmVzdWx0LmZpcnN0LT5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIucmVnaXN0ZXJTZW5zb3IoaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJkZXZpY2UgJXMgaXMgcmVnaXN0ZXJlZCIsIGRldmljZUtleS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0QoImRldmljZSAlcyBhbHJlYWR5IGFkZGVkIGFuZCBpcyBjb25uZWN0ZWQgYWdhaW4sIGlnbm9yZSIsIGRldmljZUtleS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJkZXZpY2UgJXMgaXMgZGlzY29ubmVjdGVkIiwgZGV2aWNlS2V5LmNfc3RyKCkpOworICAgICAgICBpZiAoaSAhPSBtRGV2aWNlS2V5U2Vuc29yTWFwLmVuZCgpKSB7CisgICAgICAgICAgICBCYXNlU2Vuc29yVmVjdG9yIHNlbnNvcnMgPSBpLT5zZWNvbmQ7CisgICAgICAgICAgICBmb3IgKGF1dG8gJnNlbnNvciA6IHNlbnNvcnMpIHsKKyAgICAgICAgICAgICAgICBtTWFuYWdlci51bnJlZ2lzdGVyU2Vuc29yKHNlbnNvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRGV2aWNlS2V5U2Vuc29yTWFwLmVyYXNlKGkpOworICAgICAgICAgICAgLy8gbm90aWZ5IGltcGxlbWVudGF0aW9uCisgICAgICAgICAgICByZW1vdmVTZW5zb3IoZGV2aWNlS2V5KTsKKyAgICAgICAgICAgIEFMT0dWKCJkZXZpY2UgJXMgaXMgdW5yZWdpc3RlcmVkIiwgZGV2aWNlS2V5LmNfc3RyKCkpOworICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJkZXZpY2Ugbm90IGZvdW5kIGluIHJlZ2lzdHJ5Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorfSAvLyBuYW1lc3BhY2UgU2Vuc29ySGFsRXh0Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9CYXNlRHluYW1pY1NlbnNvckRhZW1vbi5oIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0Jhc2VEeW5hbWljU2Vuc29yRGFlbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNlYzk2NQotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9CYXNlRHluYW1pY1NlbnNvckRhZW1vbi5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VOU09SSEFMX0VYVF9CQVNFX0RZTkFNSUNfU0VOU09SX0RBRU1PTl9ICisjZGVmaW5lIEFORFJPSURfU0VOU09SSEFMX0VYVF9CQVNFX0RZTkFNSUNfU0VOU09SX0RBRU1PTl9ICisKKyNpbmNsdWRlICJCYXNlU2Vuc29yT2JqZWN0LmgiCisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBTZW5zb3JIYWxFeHQgeworCitjbGFzcyBEeW5hbWljU2Vuc29yTWFuYWdlcjsKKwordHlwZWRlZiBzdGQ6OnZlY3RvcjxzcDxCYXNlU2Vuc29yT2JqZWN0Pj4gQmFzZVNlbnNvclZlY3RvcjsKKworY2xhc3MgQmFzZUR5bmFtaWNTZW5zb3JEYWVtb24gOiBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisgICAgQmFzZUR5bmFtaWNTZW5zb3JEYWVtb24oRHluYW1pY1NlbnNvck1hbmFnZXImIG1hbmFnZXIpIDogbU1hbmFnZXIobWFuYWdlcikge30KKyAgICB2aXJ0dWFsIH5CYXNlRHluYW1pY1NlbnNvckRhZW1vbigpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgYm9vbCBvbkNvbm5lY3Rpb25DaGFuZ2UoY29uc3Qgc3RkOjpzdHJpbmcgJmRldmljZUtleSwgYm9vbCBjb25uZWN0ZWQpOworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgQmFzZVNlbnNvclZlY3RvciBjcmVhdGVTZW5zb3IoY29uc3Qgc3RkOjpzdHJpbmcgJmRldmljZUtleSkgPSAwOworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVTZW5zb3IoY29uc3Qgc3RkOjpzdHJpbmcgJi8qZGV2aWNlS2V5Ki8pIHt9OworCisgICAgRHluYW1pY1NlbnNvck1hbmFnZXIgJm1NYW5hZ2VyOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgQmFzZVNlbnNvclZlY3Rvcj4gbURldmljZUtleVNlbnNvck1hcDsKK307CisKK30gLy8gbmFtZXNwYWNlIFNlbnNvckhhbEV4dAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9TRU5TT1JIQUxfRVhUX0JBU0VfRFlOQU1JQ19TRU5TT1JfREFFTU9OX0gKKwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0Jhc2VTZW5zb3JPYmplY3QuY3BwIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0Jhc2VTZW5zb3JPYmplY3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYzc2YjIKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvQmFzZVNlbnNvck9iamVjdC5jcHAKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJCYXNlU2Vuc29yT2JqZWN0LmgiCisjaW5jbHVkZSAiU2Vuc29yRXZlbnRDYWxsYmFjay5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCisKKyNpbmNsdWRlIDxjc3RyaW5nPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgU2Vuc29ySGFsRXh0IHsKKworQmFzZVNlbnNvck9iamVjdDo6QmFzZVNlbnNvck9iamVjdCgpIDogbUNhbGxiYWNrKG51bGxwdHIpIHsKK30KKworYm9vbCBCYXNlU2Vuc29yT2JqZWN0OjpzZXRFdmVudENhbGxiYWNrKFNlbnNvckV2ZW50Q2FsbGJhY2sqIGNhbGxiYWNrKSB7CisgICAgaWYgKG1DYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQmFzZVNlbnNvck9iamVjdDo6Z2V0VXVpZCh1aW50OF90KiB1dWlkKSBjb25zdCB7CisgICAgLy8gZGVmYXVsdCB1dWlkIGRlbm90aW5nIHV1aWQgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgc2Vuc29yLgorICAgIG1lbXNldCh1dWlkLCAwLCAxNik7Cit9CisKK2ludCBCYXNlU2Vuc29yT2JqZWN0OjpmbHVzaCgpIHsKKyAgICBzdGF0aWMgY29uc3Qgc2Vuc29yc19ldmVudF90IGV2ZW50ID0geworICAgICAgICAudHlwZSA9IFNFTlNPUl9UWVBFX01FVEFfREFUQSwKKyAgICAgICAgLnRpbWVzdGFtcCA9IFRJTUVTVEFNUF9BVVRPX0ZJTEwgIC8vIHRpbWVzdGFtcCB3aWxsIGJlIGZpbGxlZCBhdCBkaXNwYXRjaGVyCisgICAgfTsKKyAgICBnZW5lcmF0ZUV2ZW50KGV2ZW50KTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBCYXNlU2Vuc29yT2JqZWN0OjpnZW5lcmF0ZUV2ZW50KGNvbnN0IHNlbnNvcnNfZXZlbnRfdCAmZSkgeworICAgIGlmIChtQ2FsbGJhY2spIHsKKyAgICAgICAgbUNhbGxiYWNrLT5zdWJtaXRFdmVudChTUF9USElTLCBlKTsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIFNlbnNvckhhbEV4dAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvQmFzZVNlbnNvck9iamVjdC5oIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0Jhc2VTZW5zb3JPYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGQxYTVkCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0Jhc2VTZW5zb3JPYmplY3QuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFTlNPUkhBTF9CQVNFX1NFTlNPUl9PQkpFQ1RfSAorI2RlZmluZSBBTkRST0lEX1NFTlNPUkhBTF9CQVNFX1NFTlNPUl9PQkpFQ1RfSAorCisjaW5jbHVkZSAiVXRpbHMuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorCitzdHJ1Y3Qgc2Vuc29yX3Q7CitzdHJ1Y3Qgc2Vuc29yc19ldmVudF90OworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgU2Vuc29ySGFsRXh0IHsKKworY2xhc3MgU2Vuc29yRXZlbnRDYWxsYmFjazsKKworY2xhc3MgQmFzZVNlbnNvck9iamVjdCA6IHZpcnR1YWwgcHVibGljIFJFRl9CQVNFKEJhc2VTZW5zb3JPYmplY3QpIHsKK3B1YmxpYzoKKyAgICBCYXNlU2Vuc29yT2JqZWN0KCk7CisgICAgdmlydHVhbCB+QmFzZVNlbnNvck9iamVjdCgpID0gZGVmYXVsdDsKKworICAgIC8vIGFsd2F5cyBjYWxsZWQgYnkgRHluYW1pY1NlbnNvck1hbmFnZXIsIGNhbGxiYWNrIG11c3QgcG9pbnQgdG8KKyAgICAvLyB2YWxpZCBvYmplY3QgdGhyb3VnaG91dCBsaWZlIGN5Y2xlIG9mIEJhc2VTZW5zb3JPYmplY3QKKyAgICBib29sIHNldEV2ZW50Q2FsbGJhY2soU2Vuc29yRXZlbnRDYWxsYmFjayogY2FsbGJhY2spOworCisgICAgLy8gdmlydHVhbCBmdW5jdGlvbnMgdG8gZ2V0IHNlbnNvciBpbmZvcm1hdGlvbiBhbmQgb3BlcmF0ZSBzZW5zb3IKKyAgICB2aXJ0dWFsIGNvbnN0IHNlbnNvcl90KiBnZXRTZW5zb3IoKSBjb25zdCA9IDA7CisKKyAgICAvLyBnZXQgdXVpZCBvZiBzZW5zb3IsIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2V0IGl0IHRvIGFsbCB6ZXJvLCBtZWFucyBkb2VzIG5vdCBoYXZlIGEgdXVpZC4KKyAgICB2aXJ0dWFsIHZvaWQgZ2V0VXVpZCh1aW50OF90KiB1dWlkKSBjb25zdDsKKworICAgIC8vIGVuYWJsZSBzZW5zb3IKKyAgICB2aXJ0dWFsIGludCBlbmFibGUoYm9vbCBlbmFibGUpID0gMDsKKworICAgIC8vIHNldCBzYW1wbGUgcGVyaW9kIGFuZCBiYXRjaGluZyBwZXJpb2Qgb2Ygc2Vuc29yLgorICAgIC8vIGJvdGggc2FtcGxlIHBlcmlvZCBhbmQgYmF0Y2ggcGVyaW9kIGFyZSBpbiBuYW5vLXNlY29uZHMuCisgICAgdmlydHVhbCBpbnQgYmF0Y2goaW50NjRfdCBzYW1wbGVQZXJpb2QsIGludDY0X3QgYmF0Y2hQZXJpb2QpID0gMDsKKworICAgIC8vIGZsdXNoIHNlbnNvciwgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aWxsIHNlbmQgYSBmbHVzaCBjb21wbGV0ZSBldmVudCBiYWNrLgorICAgIHZpcnR1YWwgaW50IGZsdXNoKCk7CisKK3Byb3RlY3RlZDoKKyAgICAvLyB1dGlsaXR5IGZ1bmN0aW9uIGZvciBzdWItY2xhc3MKKyAgICB2b2lkIGdlbmVyYXRlRXZlbnQoY29uc3Qgc2Vuc29yc19ldmVudF90ICZlKTsKK3ByaXZhdGU6CisgICAgU2Vuc29yRXZlbnRDYWxsYmFjayogbUNhbGxiYWNrOworfTsKKworfSAvLyBuYW1lc3BhY2UgU2Vuc29ySGFsRXh0Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1NFTlNPUkhBTF9CQVNFX1NFTlNPUl9PQkpFQ1RfSAorCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvQ29ubmVjdGlvbkRldGVjdG9yLmNwcCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9Db25uZWN0aW9uRGV0ZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MWU5MTIKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvQ29ubmVjdGlvbkRldGVjdG9yLmNwcApAQCAtMCwwICsxLDIzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJDb25uZWN0aW9uRGV0ZWN0b3IuaCIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8c3lzL2lub3RpZnkuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKyNpbmNsdWRlIDxzc3RyZWFtPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgU2Vuc29ySGFsRXh0IHsKKworLy8gU29ja2V0Q29ubmVjdGlvbkRldGVjdG9yIGZ1bmN0aW9ucworU29ja2V0Q29ubmVjdGlvbkRldGVjdG9yOjpTb2NrZXRDb25uZWN0aW9uRGV0ZWN0b3IoQmFzZUR5bmFtaWNTZW5zb3JEYWVtb24gKmQsIGludCBwb3J0KQorICAgICAgICA6IENvbm5lY3Rpb25EZXRlY3RvcihkKSwgVGhyZWFkKGZhbHNlIC8qY2FuQ2FsbEphdmEqLykgeworICAgIC8vIGluaXRpYWxpemUgc29ja2V0IHRoYXQgYWNjZXB0IGNvbm5lY3Rpb24gdG8gbG9jYWxob3N0OnBvcnQKKyAgICBtTGlzdGVuRmQgPSA6OnNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisgICAgaWYgKG1MaXN0ZW5GZCA8IDApIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBvcGVuIHNvY2tldCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RydWN0IHNvY2thZGRyX2luIHNlcnZlckFkZHJlc3MgPSB7CisgICAgICAgIC5zaW5fZmFtaWx5ID0gQUZfSU5FVCwKKyAgICAgICAgLnNpbl9wb3J0ID0gaHRvbnMocG9ydCksCisgICAgICAgIC5zaW5fYWRkciA9IHsKKyAgICAgICAgICAgIC5zX2FkZHIgPSBodG9ubChJTkFERFJfTE9PUEJBQ0spCisgICAgICAgIH0KKyAgICB9OworCisgICAgOjpiaW5kKG1MaXN0ZW5GZCwgKHN0cnVjdCBzb2NrYWRkciopJnNlcnZlckFkZHJlc3MsIHNpemVvZihzZXJ2ZXJBZGRyZXNzKSk7CisgICAgaWYgKDo6bGlzdGVuKG1MaXN0ZW5GZCwgMCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBsaXN0ZW4gdG8gcG9ydCAlZCIsIHBvcnQpOworICAgICAgICBtTGlzdGVuRmQgPSAtMTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzOworICAgIHMgPDwgInNvY2tldDoiIDw8IHBvcnQ7CisgICAgbURldmljZSA9IHMuc3RyKCk7CisKKyAgICBydW4oImRkYWRfc29ja2V0Iik7Cit9CisKK1NvY2tldENvbm5lY3Rpb25EZXRlY3Rvcjo6flNvY2tldENvbm5lY3Rpb25EZXRlY3RvcigpIHsKKyAgICBpZiAobUxpc3RlbkZkID49IDApIHsKKyAgICAgICAgcmVxdWVzdEV4aXRBbmRXYWl0KCk7CisgICAgfQorfQorCitpbnQgU29ja2V0Q29ubmVjdGlvbkRldGVjdG9yOjp3YWl0Rm9yQ29ubmVjdGlvbigpIHsKKyAgICByZXR1cm4gOjphY2NlcHQobUxpc3RlbkZkLCBudWxscHRyLCBudWxscHRyKTsKK30KKwordm9pZCBTb2NrZXRDb25uZWN0aW9uRGV0ZWN0b3I6OndhaXRGb3JEaXNjb25uZWN0aW9uKGludCBjb25uRmQpIHsKKyAgICBjaGFyIGJ1ZmZlclsxNl07CisgICAgd2hpbGUgKDo6cmVhZChjb25uRmQsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpID4gMCkgeworICAgICAgICAvLyBkaXNjYXJkIGRhdGEgYnV0IHJlc3BvbnNlIHNvbWV0aGluZyB0byBkZW5vdGUgdGhyZWFkIGFsaXZlCisgICAgICAgIDo6d3JpdGUoY29ubkZkLCAiLiIsIDEpOworICAgIH0KKyAgICAvLyByZWFkIGZhaWx1cmUgbWVhbnMgZGlzY29ubmVjdGlvbgorICAgIDo6Y2xvc2UoY29ubkZkKTsKK30KKworYm9vbCBTb2NrZXRDb25uZWN0aW9uRGV0ZWN0b3I6OnRocmVhZExvb3AoKSB7CisgICAgd2hpbGUgKCFUaHJlYWQ6OmV4aXRQZW5kaW5nKCkpIHsKKyAgICAgICAgLy8gYmxvY2sgd2FpdGluZyBmb3IgY29ubmVjdGlvbgorICAgICAgICBpbnQgY29ubkZkID0gd2FpdEZvckNvbm5lY3Rpb24oKTsKKworICAgICAgICBpZiAoY29ubkZkIDwgMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigiUmVjZWl2ZWQgY29ubmVjdGlvbiwgcmVnaXN0ZXIgZHluYW1pYyBhY2NlbCBzZW5zb3IiKTsKKyAgICAgICAgbURhZW1vbi0+b25Db25uZWN0aW9uQ2hhbmdlKG1EZXZpY2UsIHRydWUpOworCisgICAgICAgIHdhaXRGb3JEaXNjb25uZWN0aW9uKGNvbm5GZCk7CisgICAgICAgIEFMT0dWKCJDb25uZWN0aW9uIGJyZWFrLCB1bnJlZ2lzdGVyIGR5bmFtaWMgYWNjZWwgc2Vuc29yIik7CisgICAgICAgIG1EYWVtb24tPm9uQ29ubmVjdGlvbkNoYW5nZShtRGV2aWNlLCBmYWxzZSk7CisgICAgfQorICAgIG1EYWVtb24tPm9uQ29ubmVjdGlvbkNoYW5nZShtRGV2aWNlLCBmYWxzZSk7CisgICAgQUxPR0QoIlNvY2tldENvbm5lY3Rpb25EZXRlY3RvciB0aHJlYWQgZXhpdGVkIik7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBGaWxlQ29ubmVjdGlvbkRldGVjdG9yIGZ1bmN0aW9ucworRmlsZUNvbm5lY3Rpb25EZXRlY3Rvcjo6RmlsZUNvbm5lY3Rpb25EZXRlY3RvciAoCisgICAgICAgIEJhc2VEeW5hbWljU2Vuc29yRGFlbW9uICpkLCBjb25zdCBzdGQ6OnN0cmluZyAmcGF0aCwgY29uc3Qgc3RkOjpzdHJpbmcgJnJlZ2V4KQorICAgICAgICAgICAgOiBDb25uZWN0aW9uRGV0ZWN0b3IoZCksIFRocmVhZChmYWxzZSAvKmNhbGxDYWxsSmF2YSovKSwgbVBhdGgocGF0aCksIG1SZWdleChyZWdleCksCisgICAgICAgICAgICAgIG1Mb29wZXIobmV3IExvb3Blcih0cnVlIC8qYWxsb3dOb25DYWxsYmFjayovKSksIG1Jbm90aWZ5RmQoLTEpIHsKKyAgICBpZiAobUxvb3BlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtSW5vdGlmeUZkID0gOjppbm90aWZ5X2luaXQxKElOX05PTkJMT0NLKTsKKyAgICBpZiAobUlub3RpZnlGZCA8IDApIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBpbml0IGlub3RpZnkiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCB3ZCA9IDo6aW5vdGlmeV9hZGRfd2F0Y2gobUlub3RpZnlGZCwgcGF0aC5jX3N0cigpLCBJTl9DUkVBVEUgfCBJTl9ERUxFVEUpOworICAgIGlmICh3ZCA8IDAgfHwgIW1Mb29wZXItPmFkZEZkKG1Jbm90aWZ5RmQsIFBPTExfSURFTlQsIExvb3Blcjo6RVZFTlRfSU5QVVQsIG51bGxwdHIsIG51bGxwdHIpKSB7CisgICAgICAgIDo6Y2xvc2UobUlub3RpZnlGZCk7CisgICAgICAgIG1Jbm90aWZ5RmQgPSAtMTsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBzZXR1cCB3YXRjaCBvbiBkaXIgJXMiLCBwYXRoLmNfc3RyKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gbUxvb3BlciAhPSBudWxsICYmIG1Jbm90aWZ5RmQgYWRkZWQgdG8gbG9vcGVyCisgICAgcnVuKCJkZGFkX2ZpbGUiKTsKK30KKworRmlsZUNvbm5lY3Rpb25EZXRlY3Rvcjo6fkZpbGVDb25uZWN0aW9uRGV0ZWN0b3IoKSB7CisgICAgaWYgKG1Jbm90aWZ5RmQgPiAwKSB7CisgICAgICAgIHJlcXVlc3RFeGl0KCk7CisgICAgICAgIG1Mb29wZXItPndha2UoKTsKKyAgICAgICAgam9pbigpOworICAgICAgICA6OmNsb3NlKG1Jbm90aWZ5RmQpOworICAgIH0KK30KKworYm9vbCBGaWxlQ29ubmVjdGlvbkRldGVjdG9yOjptYXRjaGVzKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6cmVnZXhfbWF0Y2gobmFtZSwgbVJlZ2V4KTsKK30KKworc3RkOjpzdHJpbmcgRmlsZUNvbm5lY3Rpb25EZXRlY3Rvcjo6Z2V0RnVsbE5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgbmFtZSkgY29uc3QgeworICAgIHJldHVybiBtUGF0aCArIG5hbWU7Cit9CisKK3ZvaWQgRmlsZUNvbm5lY3Rpb25EZXRlY3Rvcjo6cHJvY2Vzc0V4aXN0aW5nRmlsZXMoKSBjb25zdCB7CisgICAgYXV0byBkaXJwID0gOjpvcGVuZGlyKG1QYXRoLmNfc3RyKCkpOworICAgIHN0cnVjdCBkaXJlbnQgKmRwOworICAgIHdoaWxlICgoZHAgPSA6OnJlYWRkaXIoZGlycCkpICE9IE5VTEwpIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgbmFtZShkcC0+ZF9uYW1lKTsKKyAgICAgICAgaWYgKG1hdGNoZXMobmFtZSkpIHsKKyAgICAgICAgICAgIG1EYWVtb24tPm9uQ29ubmVjdGlvbkNoYW5nZShnZXRGdWxsTmFtZShuYW1lKSwgdHJ1ZSAvKmNvbm5lY3RlZCovKTsKKyAgICAgICAgfQorICAgIH0KKyAgICA6OmNsb3NlZGlyKGRpcnApOworfQorCit2b2lkIEZpbGVDb25uZWN0aW9uRGV0ZWN0b3I6OmhhbmRsZUlub3RpZnlEYXRhKHNzaXplX3QgbGVuLCBjb25zdCBjaGFyICpkYXRhKSB7CisgICAgY29uc3QgY2hhciAqZGF0YUVuZCA9IGRhdGEgKyBsZW47CisgICAgY29uc3Qgc3RydWN0IGlub3RpZnlfZXZlbnQgKmV2OworCisgICAgLy8gaW5vdGlmeSBhZGRzIHBhZGRpbmdzIHRvIGd1YXJhbnRlZSB0aGUgbmV4dCByZWFkIGlzIGFsaWduZWQKKyAgICBmb3IgKDsgZGF0YSA8IGRhdGFFbmQ7IGRhdGEgKz0gc2l6ZW9mKHN0cnVjdCBpbm90aWZ5X2V2ZW50KSArIGV2LT5sZW4pIHsKKyAgICAgICAgZXYgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHN0cnVjdCBpbm90aWZ5X2V2ZW50Kj4oZGF0YSk7CisgICAgICAgIGlmIChldi0+bWFzayAmIElOX0lTRElSKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG5hbWUoZXYtPm5hbWUpOworICAgICAgICBpZiAobWF0Y2hlcyhuYW1lKSkgeworICAgICAgICAgICAgaWYgKGV2LT5tYXNrICYgSU5fQ1JFQVRFKSB7CisgICAgICAgICAgICAgICAgbURhZW1vbi0+b25Db25uZWN0aW9uQ2hhbmdlKGdldEZ1bGxOYW1lKG5hbWUpLCB0cnVlIC8qY29ubmVjdGVkKi8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGV2LT5tYXNrICYgSU5fREVMRVRFKSB7CisgICAgICAgICAgICAgICAgbURhZW1vbi0+b25Db25uZWN0aW9uQ2hhbmdlKGdldEZ1bGxOYW1lKG5hbWUpLCBmYWxzZSAvKmNvbm5lY3RlZCovKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBGaWxlQ29ubmVjdGlvbkRldGVjdG9yOjpyZWFkSW5vdGlmeURhdGEoKSB7CisgICAgc3RydWN0IHsKKyAgICAgICAgc3RydWN0IGlub3RpZnlfZXZlbnQgZXY7CisgICAgICAgIGNoYXIgcGFkZGluZ1tOQU1FX01BWCArIDFdOworICAgIH0gYnVmZmVyOworCisgICAgYm9vbCByZXQgPSB0cnVlOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHNzaXplX3QgbGVuID0gOjpyZWFkKG1Jbm90aWZ5RmQsICZidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKyAgICAgICAgaWYgKGxlbiA9PSAtMSAmJiBlcnJubyA9PSBFQUdBSU4pIHsKKyAgICAgICAgICAgIC8vIG5vIG1vcmUgZGF0YQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAobGVuID4gc3RhdGljX2Nhc3Q8c3NpemVfdD4oc2l6ZW9mKHN0cnVjdCBpbm90aWZ5X2V2ZW50KSkpIHsKKyAgICAgICAgICAgIGhhbmRsZUlub3RpZnlEYXRhKGxlbiwgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmJ1ZmZlcikpOworICAgICAgICB9IGVsc2UgaWYgKGxlbiA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIGVycm9yOiAlcyIsIDo6c3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIHJldCA9IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyAwIDw9IGxlbiA8PSBzaXplb2Yoc3RydWN0IGlub3RpZnlfZXZlbnQpCisgICAgICAgICAgICBBTE9HRSgicmVhZCByZXR1cm4gJXpkLCBzaG9ydGVyIHRoYW4gaW5vdGlmeV9ldmVudCBzaXplICV6dSIsCisgICAgICAgICAgICAgICAgICBsZW4sIHNpemVvZihzdHJ1Y3QgaW5vdGlmeV9ldmVudCkpOworICAgICAgICAgICAgcmV0ID0gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitib29sIEZpbGVDb25uZWN0aW9uRGV0ZWN0b3I6OnRocmVhZExvb3AoKSB7CisgICAgTG9vcGVyOjpzZXRGb3JUaHJlYWQobUxvb3Blcik7CisgICAgcHJvY2Vzc0V4aXN0aW5nRmlsZXMoKTsKKyAgICB3aGlsZSghVGhyZWFkOjpleGl0UGVuZGluZygpKSB7CisgICAgICAgIGludCByZXQgPSBtTG9vcGVyLT5wb2xsT25jZSgtMSk7CisKKyAgICAgICAgaWYgKHJldCAhPSBMb29wZXI6OlBPTExfV0FLRSAmJiByZXQgIT0gUE9MTF9JREVOVCkgeworICAgICAgICAgICAgQUxPR0UoIlVuZXhwZWN0ZWQgdmFsdWUgJWQgZnJvbSBwb2xsT25jZSwgcXVpdCIsIHJldCk7CisgICAgICAgICAgICByZXF1ZXN0RXhpdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmV0ID09IFBPTExfSURFTlQpIHsKKyAgICAgICAgICAgIGlmICghcmVhZElub3RpZnlEYXRhKCkpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0RXhpdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbUxvb3Blci0+cmVtb3ZlRmQobUlub3RpZnlGZCk7CisgICAgQUxPR0QoIkZpbGVDb25uZWN0aW9uRGV0ZWN0aW9uIHRocmVhZCBleGl0ZWQiKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK30gLy8gbmFtZXNwYWNlIFNlbnNvckhhbEV4dAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0Nvbm5lY3Rpb25EZXRlY3Rvci5oIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0Nvbm5lY3Rpb25EZXRlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZTFkZjIKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvQ29ubmVjdGlvbkRldGVjdG9yLmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRU5TT1JIQUxfRVhUX0NPTk5FQ1RJT05fREVURUNUT1JfSAorI2RlZmluZSBBTkRST0lEX1NFTlNPUkhBTF9FWFRfQ09OTkVDVElPTl9ERVRFQ1RPUl9ICisKKyNpbmNsdWRlICJCYXNlRHluYW1pY1NlbnNvckRhZW1vbi5oIgorI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvb3Blci5oPgorCisjaW5jbHVkZSA8cmVnZXg+CisKKyNpbmNsdWRlIDxwb2xsLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBTZW5zb3JIYWxFeHQgeworCisvLyBBYnN0cmFjdGlvbiBvZiBjb25uZWN0aW9uIGRldGVjdG9yOiBhbiBlbnRpdHkgdGhhdCBjYWxscworLy8gQmFzZUR5bmFtaWNTZW5zb3JEYWVtb246Om9uQ29ubmVjdGlvbkNoYW5nZSgpIHdoZW4gbmVjZXNzYXJ5LgorY2xhc3MgQ29ubmVjdGlvbkRldGVjdG9yIDogdmlydHVhbCBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisgICAgQ29ubmVjdGlvbkRldGVjdG9yKEJhc2VEeW5hbWljU2Vuc29yRGFlbW9uICpkKSA6IG1EYWVtb24oZCkgeyB9CisgICAgdmlydHVhbCB+Q29ubmVjdGlvbkRldGVjdG9yKCkgPSBkZWZhdWx0OworcHJvdGVjdGVkOgorICAgIEJhc2VEeW5hbWljU2Vuc29yRGFlbW9uKiBtRGFlbW9uOworfTsKKworLy8gT3BlbiBhIHNvY2tldCB0aGF0IGxpc3RlbiB0byBsb2NhbGhvc3Q6cG9ydCBhbmQgbm90aWZ5IHNlbnNvciBkYWVtb24gb2YgY29ubmVjdGlvbiBhbmQKKy8vIGRpc2Nvbm5lY3Rpb24gZXZlbnQgd2hlbiBzb2NrZXQgaXMgY29ubmVjdGVkIG9yIGRpc2Nvbm5lY3RlZCwgcmVzcGVjdGl2ZWx5LiBPbmx5IG9uZSBjb25jdXJyZW50CisvLyBjbGllbnQgaXMgYWNjZXB0ZWQuCitjbGFzcyBTb2NrZXRDb25uZWN0aW9uRGV0ZWN0b3IgOiBwdWJsaWMgQ29ubmVjdGlvbkRldGVjdG9yLCBwdWJsaWMgVGhyZWFkIHsKK3B1YmxpYzoKKyAgICBTb2NrZXRDb25uZWN0aW9uRGV0ZWN0b3IoQmFzZUR5bmFtaWNTZW5zb3JEYWVtb24gKmQsIGludCBwb3J0KTsKKyAgICB2aXJ0dWFsIH5Tb2NrZXRDb25uZWN0aW9uRGV0ZWN0b3IoKTsKK3ByaXZhdGU6CisgICAgLy8gaW1wbGVtZW50IHZpcnR1YWwgb2YgVGhyZWFkCisgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKTsKKyAgICBpbnQgd2FpdEZvckNvbm5lY3Rpb24oKTsKKyAgICBzdGF0aWMgdm9pZCB3YWl0Rm9yRGlzY29ubmVjdGlvbihpbnQgY29ubkZkKTsKKworICAgIGludCBtTGlzdGVuRmQ7CisgICAgc3RkOjpzdHJpbmcgbURldmljZTsKK307CisKKy8vIERldGVjdCBmaWxlIGNoYW5nZSB1bmRlciBwYXRoIGFuZCBub3RpZnkgc2Vuc29yIGRhZW1vbiBvZiBjb25uZWN0aW9uIGFuZCBkaXNjb25uZWN0aW9uIGV2ZW50IHdoZW4KKy8vIGZpbGUgaXMgY3JlYXRlZCBpbiBvciByZW1vdmVkIGZyb20gdGhlIGRpcmVjdG9yeSwgcmVzcGVjdGl2ZWx5LgorY2xhc3MgRmlsZUNvbm5lY3Rpb25EZXRlY3RvciA6IHB1YmxpYyBDb25uZWN0aW9uRGV0ZWN0b3IsIHB1YmxpYyBUaHJlYWQgeworcHVibGljOgorICAgIEZpbGVDb25uZWN0aW9uRGV0ZWN0b3IoCisgICAgICAgICAgICBCYXNlRHluYW1pY1NlbnNvckRhZW1vbiAqZCwgY29uc3Qgc3RkOjpzdHJpbmcgJnBhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nICZyZWdleCk7CisgICAgdmlydHVhbCB+RmlsZUNvbm5lY3Rpb25EZXRlY3RvcigpOworcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3RleHByIGludCBQT0xMX0lERU5UID0gMTsKKyAgICAvLyBpbXBsZW1lbnQgdmlydHVhbCBvZiBUaHJlYWQKKyAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpOworCisgICAgYm9vbCBtYXRjaGVzKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSBjb25zdDsKKyAgICB2b2lkIHByb2Nlc3NFeGlzdGluZ0ZpbGVzKCkgY29uc3Q7CisgICAgdm9pZCBoYW5kbGVJbm90aWZ5RGF0YShzc2l6ZV90IGxlbiwgY29uc3QgY2hhciAqZGF0YSk7CisgICAgYm9vbCByZWFkSW5vdGlmeURhdGEoKTsKKyAgICBzdGQ6OnN0cmluZyBnZXRGdWxsTmFtZShjb25zdCBzdGQ6OnN0cmluZyBuYW1lKSBjb25zdDsKKworICAgIHN0ZDo6c3RyaW5nIG1QYXRoOworICAgIHN0ZDo6cmVnZXggbVJlZ2V4OworICAgIHNwPExvb3Blcj4gbUxvb3BlcjsKKyAgICBpbnQgbUlub3RpZnlGZDsKK307CisKK30gLy8gbmFtZXNwYWNlIFNlbnNvckhhbEV4dAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9TRU5TT1JIQUxfRVhUX0RZTkFNSUNfU0VOU09SX0RBRU1PTl9ICmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvRHVtbXlEeW5hbWljQWNjZWxEYWVtb24uY3BwIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0R1bW15RHluYW1pY0FjY2VsRGFlbW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWE0N2U4Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0R1bW15RHluYW1pY0FjY2VsRGFlbW9uLmNwcApAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJCYXNlU2Vuc29yT2JqZWN0LmgiCisjaW5jbHVkZSAiQ29ubmVjdGlvbkRldGVjdG9yLmgiCisjaW5jbHVkZSAiRHVtbXlEeW5hbWljQWNjZWxEYWVtb24uaCIKKyNpbmNsdWRlICJEeW5hbWljU2Vuc29yTWFuYWdlci5oIgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TeXN0ZW1DbG9jay5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YWxnb3JpdGhtPiAgICAgICAgICAgIC8vc3RkOjptYXgKKworI2RlZmluZSBTWVNQUk9QX1BSRUZJWCAgICAgICAgICAgICAgICAgICJkeW5hbWljX3NlbnNvci5kdW1teSIKKyNkZWZpbmUgRklMRV9OQU1FX0JBU0UgICAgICAgICAgICAgICAgICAiZHVtbXlfYWNjZWxfZmlsZSIKKyNkZWZpbmUgRklMRV9OQU1FX1JFR0VYICAgICAgICAgICAgICAgICAoIl4iIEZJTEVfTkFNRV9CQVNFICJbMC05XSQiKQorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgU2Vuc29ySGFsRXh0IHsKKworRHVtbXlEeW5hbWljQWNjZWxEYWVtb246OkR1bW15RHluYW1pY0FjY2VsRGFlbW9uKER5bmFtaWNTZW5zb3JNYW5hZ2VyJiBtYW5hZ2VyKQorICAgICAgICA6IEJhc2VEeW5hbWljU2Vuc29yRGFlbW9uKG1hbmFnZXIpIHsKKyAgICBjaGFyIHByb3BlcnR5W1BST1BFUlRZX1ZBTFVFX01BWCsxXTsKKworICAgIHByb3BlcnR5X2dldChTWVNQUk9QX1BSRUZJWCAiLmZpbGUiLCBwcm9wZXJ0eSwgIiIpOworICAgIGlmIChzdHJjbXAocHJvcGVydHksICIiKSAhPSAwKSB7CisgICAgICAgIG1GaWxlRGV0ZWN0b3IgPSBuZXcgRmlsZUNvbm5lY3Rpb25EZXRlY3RvcigKKyAgICAgICAgICAgICAgICB0aGlzLCBzdGQ6OnN0cmluZyhwcm9wZXJ0eSksIHN0ZDo6c3RyaW5nKEZJTEVfTkFNRV9SRUdFWCkpOworICAgIH0KKworICAgIHByb3BlcnR5X2dldChTWVNQUk9QX1BSRUZJWCAiLnNvY2tldCIsIHByb3BlcnR5LCAiIik7CisgICAgaWYgKHN0cmNtcChwcm9wZXJ0eSwgIiIpICE9IDApIHsKKyAgICAgICAgbVNvY2tldERldGVjdG9yID0gbmV3IFNvY2tldENvbm5lY3Rpb25EZXRlY3Rvcih0aGlzLCBhdG9pKHByb3BlcnR5KSk7CisgICAgfQorfQorCitCYXNlU2Vuc29yVmVjdG9yIER1bW15RHluYW1pY0FjY2VsRGFlbW9uOjpjcmVhdGVTZW5zb3IoY29uc3Qgc3RkOjpzdHJpbmcgJmRldmljZUtleSkgeworICAgIEJhc2VTZW5zb3JWZWN0b3IgcmV0OworICAgIGlmIChkZXZpY2VLZXkuY29tcGFyZSgwLCAxLCAiLyIpID09IDApIHsKKyAgICAgICAgLy8gZmlsZSBkZXRlY3RvciByZXN1bHQsIGRldmljZUtleSBpcyBmaWxlIGFic29sdXRlIHBhdGgKKyAgICAgICAgY29uc3Qgc2l6ZV90IGxlbiA9IDo6c3RybGVuKEZJTEVfTkFNRV9CQVNFKSArIDE7IC8vICsxIGZvciBudW1iZXIKKyAgICAgICAgaWYgKGRldmljZUtleS5sZW5ndGgoKSA8IGxlbikgeworICAgICAgICAgICAgQUxPR0UoImlsbGVnYWwgZmlsZSBkZXZpY2Uga2V5ICVzIiwgZGV2aWNlS2V5LmNfc3RyKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2l6ZV90IHN0YXJ0ID0gZGV2aWNlS2V5Lmxlbmd0aCgpIC0gbGVuOworICAgICAgICAgICAgcmV0LmVtcGxhY2VfYmFjayhuZXcgRHVtbXlTZW5zb3IoZGV2aWNlS2V5LnN1YnN0cihzdGFydCkpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZGV2aWNlS2V5LmNvbXBhcmUoMCwgOjpzdHJsZW4oInNvY2tldDoiKSwgInNvY2tldDoiKSA9PSAwKSB7CisgICAgICAgIHJldC5lbXBsYWNlX2JhY2sobmV3IER1bW15U2Vuc29yKGRldmljZUtleSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHVua25vd24gZGV2aWNlS2V5CisgICAgICAgIEFMT0dFKCJ1bmtub3duIGRldmljZUtleTogJXMiLCBkZXZpY2VLZXkuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK0R1bW15RHluYW1pY0FjY2VsRGFlbW9uOjpEdW1teVNlbnNvcjo6RHVtbXlTZW5zb3IoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpCisgICAgICAgIDogVGhyZWFkKGZhbHNlIC8qY2FuQ2FsbEphdmEqLyksIG1SdW5TdGF0ZShmYWxzZSkgeworICAgIG1TZW5zb3JOYW1lID0gIkR1bW15IEFjY2VsIC0gIiArIG5hbWU7CisgICAgLy8gZmFrZSBzZW5zb3IgaW5mb3JtYXRpb24gZm9yIGR1bW15IHNlbnNvcgorICAgIG1TZW5zb3IgPSAoc3RydWN0IHNlbnNvcl90KSB7CisgICAgICAgIG1TZW5zb3JOYW1lLmNfc3RyKCksCisgICAgICAgICJEZW1vU2Vuc2UsIEluYy4iLAorICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmVyc2lvbgorICAgICAgICAtMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlLCBkdW1teSBudW1iZXIgaGVyZQorICAgICAgICBTRU5TT1JfVFlQRV9BQ0NFTEVST01FVEVSLAorICAgICAgICA5LjggKiA4LjBmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF4UmFuZ2UKKyAgICAgICAgOS44ICogOC4wZiAvIDMyNzY4LjBmLCAgICAgICAgICAgICAgICAgICAgIC8vIHJlc29sdXRpb24KKyAgICAgICAgMC41ZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvd2VyCisgICAgICAgIChpbnQzMl90KSgxLjBFNmYgLyA1MCksICAgICAgICAgICAgICAgICAgICAvLyBtaW5EZWxheQorICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlmb1Jlc2VydmVkRXZlbnRDb3VudAorICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlmb01heEV2ZW50Q291bnQKKyAgICAgICAgU0VOU09SX1NUUklOR19UWVBFX0FDQ0VMRVJPTUVURVIsCisgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlZFBlcm1pc3Npb24KKyAgICAgICAgKGxvbmcpKDEuMEU2ZiAvIDUwKSwgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heERlbGF5CisgICAgICAgIFNFTlNPUl9GTEFHX0NPTlRJTlVPVVNfTU9ERSwKKyAgICAgICAgeyBOVUxMLCBOVUxMIH0KKyAgICB9OworICAgIG1SdW5Mb2NrLmxvY2soKTsKKyAgICBydW4oIkR1bW15U2Vuc29yIik7Cit9CisKK0R1bW15RHluYW1pY0FjY2VsRGFlbW9uOjpEdW1teVNlbnNvcjo6fkR1bW15U2Vuc29yKCkgeworICAgIHJlcXVlc3RFeGl0QW5kV2FpdCgpOworICAgIC8vIHVubG9jayBtUnVuTG9jayBzbyB0aHJlYWQgY2FuIGJlIHVuYmxvY2tlZAorICAgIG1SdW5Mb2NrLnVubG9jaygpOworfQorCitjb25zdCBzZW5zb3JfdCogRHVtbXlEeW5hbWljQWNjZWxEYWVtb246OkR1bW15U2Vuc29yOjpnZXRTZW5zb3IoKSBjb25zdCB7CisgICAgcmV0dXJuICZtU2Vuc29yOworfQorCit2b2lkIER1bW15RHluYW1pY0FjY2VsRGFlbW9uOjpEdW1teVNlbnNvcjo6Z2V0VXVpZCh1aW50OF90KiB1dWlkKSBjb25zdCB7CisgICAgLy8gYXQgbWF4aW11bSwgdGhlcmUgd2lsbCBiZSBhbHdheXMgb25lIGluc3RhbmNlLCBzbyB3ZSBjYW4gaGFyZGNvZGUKKyAgICBzaXplX3QgaGFzaCA9IHN0ZDo6aGFzaDxzdGQ6OnN0cmluZz4oKShtU2Vuc29yTmFtZSk7CisgICAgbWVtc2V0KHV1aWQsICd4JywgMTYpOworICAgIG1lbWNweSh1dWlkLCAmaGFzaCwgc2l6ZW9mKGhhc2gpKTsKK30KKworaW50IER1bW15RHluYW1pY0FjY2VsRGFlbW9uOjpEdW1teVNlbnNvcjo6ZW5hYmxlKGJvb2wgZW5hYmxlKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxrKG1Mb2NrKTsKKyAgICBpZiAobVJ1blN0YXRlICE9IGVuYWJsZSkgeworICAgICAgICBpZiAoZW5hYmxlKSB7CisgICAgICAgICAgICBtUnVuTG9jay51bmxvY2soKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1SdW5Mb2NrLmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICBtUnVuU3RhdGUgPSBlbmFibGU7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgRHVtbXlEeW5hbWljQWNjZWxEYWVtb246OkR1bW15U2Vuc29yOjpiYXRjaChpbnQ2NF90IC8qc2FtcGxlUGVyaW9kKi8sIGludDY0X3QgLypiYXRjaFBlcmlvZCovKSB7CisgICAgLy8gRHVtbXkgc2Vuc29yIGRvZXMgbm90IHN1cHBvcnQgY2hhbmdpbmcgcmF0ZSBhbmQgYmF0Y2hpbmcuIEJ1dCByZXR1cm4gc3VjY2Vzc2Z1bCBhbnl3YXkuCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgRHVtbXlEeW5hbWljQWNjZWxEYWVtb246OkR1bW15U2Vuc29yOjp3YWl0VW50aWxOZXh0U2FtcGxlKCkgeworICAgIC8vIGJsb2NrIHdoZW4gZGlzYWJsZWQgKG1SdW5Mb2NrIGxvY2tlZCkKKyAgICBtUnVuTG9jay5sb2NrKCk7CisgICAgbVJ1bkxvY2sudW5sb2NrKCk7CisKKyAgICBpZiAoIVRocmVhZDo6ZXhpdFBlbmRpbmcoKSkgeworICAgICAgICAvLyBzbGVlcCAyMCBtcyAoNTBIeikKKyAgICAgICAgdXNsZWVwKDIwMDAwKTsKKyAgICB9Cit9CisKK2Jvb2wgRHVtbXlEeW5hbWljQWNjZWxEYWVtb246OkR1bW15U2Vuc29yOjp0aHJlYWRMb29wKCkgeworICAgIC8vIGRlc2lnbmF0ZWQgaW50aWFsaXphdGlvbiB3aWxsIGxlYXZlIHRoZSB1bnNwZWNpZmllZCBmaWVsZHMgemVyb2VkCisgICAgc2Vuc29yc19ldmVudF90IGV2ZW50ID0geworICAgICAgICAudmVyc2lvbiA9IHNpemVvZihldmVudCksCisgICAgICAgIC5zZW5zb3IgPSAtMSwKKyAgICAgICAgLnR5cGUgPSBTRU5TT1JfVFlQRV9BQ0NFTEVST01FVEVSLAorICAgIH07CisKKyAgICBpbnQ2NF90IHN0YXJ0VGltZU5zID0gZWxhcHNlZFJlYWx0aW1lTmFubygpOworCisgICAgQUxPR0koIkR5bmFtaWMgRHVtbXkgQWNjZWwgc3RhcnRlZCBmb3Igc2Vuc29yICVzIiwgbVNlbnNvck5hbWUuY19zdHIoKSk7CisgICAgd2hpbGUgKCFUaHJlYWQ6OmV4aXRQZW5kaW5nKCkpIHsKKyAgICAgICAgd2FpdFVudGlsTmV4dFNhbXBsZSgpOworCisgICAgICAgIGlmIChUaHJlYWQ6OmV4aXRQZW5kaW5nKCkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGludDY0X3Qgbm93VGltZU5zID0gZWxhcHNlZFJlYWx0aW1lTmFubygpOworICAgICAgICBmbG9hdCB0ID0gKG5vd1RpbWVOcyAtIHN0YXJ0VGltZU5zKSAvIDFlOWY7CisKKyAgICAgICAgZXZlbnQuZGF0YVswXSA9IDIgKiA6OnNpbigzICogTV9QSSAqIHQpOworICAgICAgICBldmVudC5kYXRhWzFdID0gMyAqIDo6Y29zKDMgKiBNX1BJICogdCk7CisgICAgICAgIGV2ZW50LmRhdGFbMl0gPSAxLjUgKiA6OnNpbig2ICogTV9QSSAqIHQpOworICAgICAgICBldmVudC50aW1lc3RhbXAgPSBub3dUaW1lTnM7CisgICAgICAgIGdlbmVyYXRlRXZlbnQoZXZlbnQpOworICAgIH0KKworICAgIEFMT0dJKCJEeW5hbWljIER1bW15IEFjY2VsIHRocmVhZCBlbmRlZCBmb3Igc2Vuc29yICVzIiwgbVNlbnNvck5hbWUuY19zdHIoKSk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit9IC8vIG5hbWVzcGFjZSBTZW5zb3JIYWxFeHQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0R1bW15RHluYW1pY0FjY2VsRGFlbW9uLmggYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvRHVtbXlEeW5hbWljQWNjZWxEYWVtb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWE1NzMwCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0R1bW15RHluYW1pY0FjY2VsRGFlbW9uLmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRU5TT1JIQUxfRVhUX0RVTU1ZX0RZTkFNSUNfQUNDRUxfREFFTU9OX0gKKyNkZWZpbmUgQU5EUk9JRF9TRU5TT1JIQUxfRVhUX0RVTU1ZX0RZTkFNSUNfQUNDRUxfREFFTU9OX0gKKworI2luY2x1ZGUgIkJhc2VEeW5hbWljU2Vuc29yRGFlbW9uLmgiCisjaW5jbHVkZSAiQmFzZVNlbnNvck9iamVjdC5oIgorCisjaW5jbHVkZSA8aGFyZHdhcmUvc2Vuc29ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBTZW5zb3JIYWxFeHQgeworCitjbGFzcyBDb25uZWN0aW9uRGV0ZWN0b3I7CisKKy8qKgorICogVGhpcyBkYWVtb24gc2ltdWxhdGVzIGR5bmFtaWMgc2Vuc29yIGNvbm5lY3Rpb24gd2l0aG91dCB0aGUgbmVlZCBvZiBhY3R1YWxseSBjb25uZWN0IHBlcmlwaGVyYWwKKyAqIHRvIEFuZHJvaWQuIEl0IGlzIGZvciBkZWJ1Z2dpbmcgYW5kIHRlc3RpbmcuIEl0IGNhbiBoYW5kbGUgb25lIGNvbmN1cnJlbnQgY29ubmVjdGlvbnMgYXQgbWF4aW11bS4KKyAqLworY2xhc3MgRHVtbXlEeW5hbWljQWNjZWxEYWVtb24gOiBwdWJsaWMgQmFzZUR5bmFtaWNTZW5zb3JEYWVtb24geworcHVibGljOgorICAgIER1bW15RHluYW1pY0FjY2VsRGFlbW9uKER5bmFtaWNTZW5zb3JNYW5hZ2VyJiBtYW5hZ2VyKTsKKyAgICB2aXJ0dWFsIH5EdW1teUR5bmFtaWNBY2NlbERhZW1vbigpID0gZGVmYXVsdDsKK3ByaXZhdGU6CisgICAgY2xhc3MgRHVtbXlTZW5zb3IgOiBwdWJsaWMgQmFzZVNlbnNvck9iamVjdCwgcHVibGljIFRocmVhZCB7CisgICAgcHVibGljOgorICAgICAgICBEdW1teVNlbnNvcihjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSk7CisgICAgICAgIH5EdW1teVNlbnNvcigpOworICAgICAgICB2aXJ0dWFsIGNvbnN0IHNlbnNvcl90KiBnZXRTZW5zb3IoKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCB2b2lkIGdldFV1aWQodWludDhfdCogdXVpZCkgY29uc3Q7CisgICAgICAgIHZpcnR1YWwgaW50IGVuYWJsZShib29sIGVuYWJsZSk7CisgICAgICAgIHZpcnR1YWwgaW50IGJhdGNoKG5zZWNzX3Qgc2FtcGxlX3BlcmlvZCwgbnNlY3NfdCBiYXRjaF9wZXJpb2QpOworICAgIHByaXZhdGU6CisgICAgICAgIC8vIGltcGxlbWVudCBUaHJlYWQgZnVuY3Rpb24KKyAgICAgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKSBvdmVycmlkZTsKKworICAgICAgICB2b2lkIHdhaXRVbnRpbE5leHRTYW1wbGUoKTsKKworICAgICAgICBzZW5zb3JfdCBtU2Vuc29yOworICAgICAgICBzdGQ6OnN0cmluZyBtU2Vuc29yTmFtZTsKKworICAgICAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICBzdGQ6Om11dGV4IG1SdW5Mb2NrOworICAgICAgICBib29sIG1SdW5TdGF0ZTsKKyAgICB9OworICAgIC8vIGltcGxlbWVudCBCYXNlRHluYW1pY1NlbnNvckRhZW1vbiBmdW5jdGlvbgorICAgIHZpcnR1YWwgQmFzZVNlbnNvclZlY3RvciBjcmVhdGVTZW5zb3IoY29uc3Qgc3RkOjpzdHJpbmcgJmRldmljZUtleSkgb3ZlcnJpZGU7CisKKyAgICBzcDxDb25uZWN0aW9uRGV0ZWN0b3I+IG1GaWxlRGV0ZWN0b3I7CisgICAgc3A8Q29ubmVjdGlvbkRldGVjdG9yPiBtU29ja2V0RGV0ZWN0b3I7Cit9OworfSAvLyBuYW1lc3BhY2UgU2Vuc29ySGFsRXh0Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1NFTlNPUkhBTF9FWFRfRFlOQU1JQ19TRU5TT1JfREFFTU9OX0gKKwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0R5bmFtaWNTZW5zb3JNYW5hZ2VyLmNwcCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9EeW5hbWljU2Vuc29yTWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYzNDA1MgotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9EeW5hbWljU2Vuc29yTWFuYWdlci5jcHAKQEAgLTAsMCArMSwyODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQmFzZUR5bmFtaWNTZW5zb3JEYWVtb24uaCIKKyNpbmNsdWRlICJCYXNlU2Vuc29yT2JqZWN0LmgiCisjaW5jbHVkZSAiRHVtbXlEeW5hbWljQWNjZWxEYWVtb24uaCIKKyNpbmNsdWRlICJIaWRSYXdTZW5zb3JEYWVtb24uaCIKKyNpbmNsdWRlICJEeW5hbWljU2Vuc29yTWFuYWdlci5oIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3lzdGVtQ2xvY2suaD4KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBTZW5zb3JIYWxFeHQgeworCitEeW5hbWljU2Vuc29yTWFuYWdlciogRHluYW1pY1NlbnNvck1hbmFnZXI6OmNyZWF0ZUluc3RhbmNlKAorICAgICAgICBpbnQgaGFuZGxlQmFzZSwgaW50IGhhbmRsZUNvdW50LCBTZW5zb3JFdmVudENhbGxiYWNrICpjYWxsYmFjaykgeworICAgIGF1dG8gbSA9IG5ldyBEeW5hbWljU2Vuc29yTWFuYWdlcihoYW5kbGVCYXNlLCBoYW5kbGVCYXNlICsgaGFuZGxlQ291bnQgLSAxLCBjYWxsYmFjayk7CisgICAgbS0+bURhZW1vblZlY3Rvci5wdXNoX2JhY2sobmV3IER1bW15RHluYW1pY0FjY2VsRGFlbW9uKCptKSk7CisgICAgbS0+bURhZW1vblZlY3Rvci5wdXNoX2JhY2sobmV3IEhpZFJhd1NlbnNvckRhZW1vbigqbSkpOworICAgIHJldHVybiBtOworfQorCitEeW5hbWljU2Vuc29yTWFuYWdlcjo6RHluYW1pY1NlbnNvck1hbmFnZXIoCisgICAgICAgIGludCBoYW5kbGVCYXNlLCBpbnQgaGFuZGxlTWF4LCBTZW5zb3JFdmVudENhbGxiYWNrKiBjYWxsYmFjaykgOgorICAgICAgICBtSGFuZGxlUmFuZ2UoaGFuZGxlQmFzZSwgaGFuZGxlTWF4KSwKKyAgICAgICAgbUNhbGxiYWNrKGNhbGxiYWNrKSwKKyAgICAgICAgbUZpZm8oY2FsbGJhY2sgPyAwIDoga0ZpZm9TaXplKSwKKyAgICAgICAgbU5leHRIYW5kbGUoaGFuZGxlQmFzZSsxKSB7CisgICAgYXNzZXJ0KGhhbmRsZUJhc2UgPiAwICYmIGhhbmRsZU1heCA+IGhhbmRsZUJhc2UgKyAxKTsgLy8gaGFuZGxlQmFzZSBpcyByZXNlcnZlZAorCisgICAgbU1ldGFTZW5zb3IgPSAoY29uc3Qgc2Vuc29yX3QpIHsKKyAgICAgICAgIkR5bmFtaWMgU2Vuc29yIE1hbmFnZXIiLAorICAgICAgICAiR29vZ2xlIiwKKyAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2ZXJzaW9uCisgICAgICAgIGhhbmRsZUJhc2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlCisgICAgICAgIFNFTlNPUl9UWVBFX0RZTkFNSUNfU0VOU09SX01FVEEsCisgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF4UmFuZ2UKKyAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNvbHV0aW9uCisgICAgICAgIDFlLTZmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG93ZXIsIHZlcnkgc21hbGwgbnVtYmVyIGluc3RlYWQgb2YgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGF2b2lkIHNpZ3VsYXJpdHkgaW4gYXBwCisgICAgICAgIChpbnQzMl90KSgxMDAwKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWluRGVsYXkKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWZvUmVzZXJ2ZWRFdmVudENvdW50CisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlmb01heEV2ZW50Q291bnQKKyAgICAgICAgU0VOU09SX1NUUklOR19UWVBFX0RZTkFNSUNfU0VOU09SX01FVEEsCisgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZWRQZXJtaXNzaW9uCisgICAgICAgIChsb25nKSgxMDAwKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF4RGVsYXkKKyAgICAgICAgU0VOU09SX0ZMQUdfU1BFQ0lBTF9SRVBPUlRJTkdfTU9ERSB8IFNFTlNPUl9GTEFHX1dBS0VfVVAsCisgICAgICAgIHsgTlVMTCwgTlVMTCB9CisgICAgfTsKK30KKworRHluYW1pY1NlbnNvck1hbmFnZXI6On5EeW5hbWljU2Vuc29yTWFuYWdlcigpIHsKKyAgICAvLyBmcmVlIGFsbCBkYWVtb25zIGZpcnN0CisgICAgbURhZW1vblZlY3Rvci5jbGVhcigpOworfQorCitib29sIER5bmFtaWNTZW5zb3JNYW5hZ2VyOjpvd25zKGludCBoYW5kbGUpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFuZGxlID49IG1IYW5kbGVSYW5nZS5maXJzdCAmJiBoYW5kbGUgPCBtSGFuZGxlUmFuZ2Uuc2Vjb25kOworfQorCitpbnQgRHluYW1pY1NlbnNvck1hbmFnZXI6OmFjdGl2YXRlKGludCBoYW5kbGUsIGJvb2wgZW5hYmxlKSB7CisgICAgaWYgKGhhbmRsZSA9PSBtSGFuZGxlUmFuZ2UuZmlyc3QpIHsKKyAgICAgICAgLy8gaWdub3JlZAorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBpbiBjYXNlIHRoZXJlIGlzIGEgcGVuZGluZyByZXBvcnQsIG5vdyBpdCBpcyB0aW1lIHRvIHJlbW92ZSBpdCBhcyBpdCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5LgorICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxrKG1Mb2NrKTsKKyAgICAgICAgbVBlbmRpbmdSZXBvcnQuZXJhc2UoaGFuZGxlKTsKKyAgICB9CisKKyAgICByZXR1cm4gb3BlcmF0ZVNlbnNvcihoYW5kbGUsCisgICAgICAgICAgICBbJmVuYWJsZV0gKHNwPEJhc2VTZW5zb3JPYmplY3Q+IHMpLT5pbnQgeworICAgICAgICAgICAgICAgIHJldHVybiBzLT5lbmFibGUoZW5hYmxlKTsKKyAgICAgICAgICAgIH0pOworfQorCitpbnQgRHluYW1pY1NlbnNvck1hbmFnZXI6OmJhdGNoKGludCBoYW5kbGUsIG5zZWNzX3Qgc2FtcGxlX3BlcmlvZCwgbnNlY3NfdCBiYXRjaF9wZXJpb2QpIHsKKyAgICBpZiAoaGFuZGxlID09IG1IYW5kbGVSYW5nZS5maXJzdCkgeworICAgICAgICAvLyBpZ25vcmVkCisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gb3BlcmF0ZVNlbnNvcihoYW5kbGUsCisgICAgICAgICAgICBbJnNhbXBsZV9wZXJpb2QsICZiYXRjaF9wZXJpb2RdIChzcDxCYXNlU2Vuc29yT2JqZWN0PiBzKS0+aW50IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcy0+YmF0Y2goc2FtcGxlX3BlcmlvZCwgYmF0Y2hfcGVyaW9kKTsKKyAgICAgICAgICAgIH0pOworfQorCitpbnQgRHluYW1pY1NlbnNvck1hbmFnZXI6OnNldERlbGF5KGludCBoYW5kbGUsIG5zZWNzX3Qgc2FtcGxlX3BlcmlvZCkgeworICAgIHJldHVybiBiYXRjaChoYW5kbGUsIHNhbXBsZV9wZXJpb2QsIDApOworfQorCitpbnQgRHluYW1pY1NlbnNvck1hbmFnZXI6OmZsdXNoKGludCBoYW5kbGUpIHsKKyAgICBpZiAoaGFuZGxlID09IG1IYW5kbGVSYW5nZS5maXJzdCkgeworICAgICAgICAvLyBzdWJtaXQgYSBmbHVzaCBjb21wbGV0ZSBoZXJlCisgICAgICAgIHN0YXRpYyBjb25zdCBzZW5zb3JzX2V2ZW50X3QgZXZlbnQgPSB7CisgICAgICAgICAgICAudHlwZSA9IFNFTlNPUl9UWVBFX01FVEFfREFUQSwKKyAgICAgICAgICAgIC5zZW5zb3IgPSBtSGFuZGxlUmFuZ2UuZmlyc3QsCisgICAgICAgICAgICAudGltZXN0YW1wID0gVElNRVNUQU1QX0FVVE9fRklMTCwgIC8vIHRpbWVzdGFtcCB3aWxsIGJlIGZpbGxlZCBhdCBkaXNwYXRjaGVyCisgICAgICAgIH07CisgICAgICAgIHN1Ym1pdEV2ZW50KG51bGxwdHIsIGV2ZW50KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBvcGVyYXRlU2Vuc29yKGhhbmRsZSwgW10gKHNwPEJhc2VTZW5zb3JPYmplY3Q+IHMpLT5pbnQge3JldHVybiBzLT5mbHVzaCgpO30pOworfQorCitpbnQgRHluYW1pY1NlbnNvck1hbmFnZXI6OnBvbGwoc2Vuc29yc19ldmVudF90ICogZGF0YSwgaW50IGNvdW50KSB7CisgICAgYXNzZXJ0KG1DYWxsYmFjayA9PSBudWxscHRyKTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbGsobUZpZm9Mb2NrKTsKKyAgICByZXR1cm4gbUZpZm8ucmVhZChkYXRhLCBjb3VudCk7Cit9CisKK2Jvb2wgRHluYW1pY1NlbnNvck1hbmFnZXI6OnJlZ2lzdGVyU2Vuc29yKHNwPEJhc2VTZW5zb3JPYmplY3Q+IHNlbnNvcikgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsayhtTG9jayk7CisgICAgaWYgKG1SZXZlcnNlTWFwLmZpbmQoc2Vuc29yLmdldCgpKSAhPSBtUmV2ZXJzZU1hcC5lbmQoKSkgeworICAgICAgICBBTE9HRSgidHJ5aW5nIHRvIGFkZCB0aGUgc2FtZSBzZW5zb3IgdHdpY2UsIGlnbm9yZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGludCBoYW5kbGUgPSBnZXROZXh0QXZhaWxhYmxlSGFuZGxlKCk7CisgICAgaWYgKGhhbmRsZSA8IDApIHsKKyAgICAgICAgQUxPR0UoIlJ1bm5pbmcgb3V0IG9mIGhhbmRsZSwgcXVpdC4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIHRoZXNlIGVtcGxhY2Ugd2lsbCBhbHdheXMgYmUgc3VjY2Vzc2Z1bAorICAgIG1NYXAuZW1wbGFjZShoYW5kbGUsIHNlbnNvcik7CisgICAgbVJldmVyc2VNYXAuZW1wbGFjZShzZW5zb3IuZ2V0KCksIGhhbmRsZSk7CisgICAgc2Vuc29yLT5zZXRFdmVudENhbGxiYWNrKHRoaXMpOworCisgICAgYXV0byBlbnRyeSA9IG1QZW5kaW5nUmVwb3J0LmVtcGxhY2UoCisgICAgICAgICAgICBzdGQ6OnBpZWNld2lzZV9jb25zdHJ1Y3QsCisgICAgICAgICAgICBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoaGFuZGxlKSwKKyAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZShoYW5kbGUsIHNlbnNvcikpOworICAgIGlmIChlbnRyeS5zZWNvbmQpIHsKKyAgICAgICAgc3VibWl0RXZlbnQobnVsbHB0ciwgZW50cnkuZmlyc3QtPnNlY29uZC5nZW5lcmF0ZUNvbm5lY3Rpb25FdmVudChtSGFuZGxlUmFuZ2UuZmlyc3QpKTsKKyAgICB9CisgICAgcmV0dXJuIGVudHJ5LnNlY29uZDsKK30KKwordm9pZCBEeW5hbWljU2Vuc29yTWFuYWdlcjo6dW5yZWdpc3RlclNlbnNvcihzcDxCYXNlU2Vuc29yT2JqZWN0PiBzZW5zb3IpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbGsobUxvY2spOworICAgIGF1dG8gaSA9IG1SZXZlcnNlTWFwLmZpbmQoc2Vuc29yLmdldCgpKTsKKyAgICBpZiAoaSA9PSBtUmV2ZXJzZU1hcC5lbmQoKSkgeworICAgICAgICBBTE9HRSgiY2Fubm90IHJlbW92ZSBhIG5vbi1leGlzdCBzZW5zb3IiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQgaGFuZGxlID0gaS0+c2Vjb25kOworICAgIG1SZXZlcnNlTWFwLmVyYXNlKGkpOworICAgIG1NYXAuZXJhc2UoaGFuZGxlKTsKKworICAgIC8vIHdpbGwgbm90IGNsZWFuIHVwIG1QZW5kaW5nUmVwb3J0IGhlcmUsIGl0IHdpbGwgYmUgY2xlYW5lZCB1cCB3aGVuIGF0IGZpcnN0IGFjdGl2YXRlIGNhbGwuCisgICAgLy8gc2Vuc29yc2VydmljZSBpcyBndXJhbnRlZWQgdG8gY2FsbCBhY3RpdmF0ZSB1cG9uIGFycml2YWwgb2YgZHluYW1pYyBzZW5zb3IgbWV0YSBjb25uZWN0aW9uCisgICAgLy8gZXZlbnQuCisKKyAgICAvLyBzZW5kIGRpc2Nvbm5lY3Rpb24gZXZlbnQKKyAgICBzZW5zb3JzX2V2ZW50X3QgZXZlbnQ7CisgICAgQ29ubmVjdGlvblJlcG9ydDo6ZmlsbERpc2Nvbm5lY3Rpb25FdmVudCgmZXZlbnQsIG1IYW5kbGVSYW5nZS5maXJzdCwgaGFuZGxlKTsKKyAgICBzdWJtaXRFdmVudChudWxscHRyLCBldmVudCk7Cit9CisKK2ludCBEeW5hbWljU2Vuc29yTWFuYWdlcjo6c3VibWl0RXZlbnQoc3A8QmFzZVNlbnNvck9iamVjdD4gc291cmNlLCBjb25zdCBzZW5zb3JzX2V2ZW50X3QgJmUpIHsKKyAgICBpbnQgaGFuZGxlOworICAgIGlmIChzb3VyY2UgPT0gbnVsbHB0cikgeworICAgICAgICBoYW5kbGUgPSBtSGFuZGxlUmFuZ2UuZmlyc3Q7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxrKG1Mb2NrKTsKKyAgICAgICAgYXV0byBpID0gbVJldmVyc2VNYXAuZmluZChzb3VyY2UuZ2V0KCkpOworICAgICAgICBpZiAoaSA9PSBtUmV2ZXJzZU1hcC5lbmQoKSkgeworICAgICAgICAgICAgQUxPR0UoImNhbm5vdCBzdWJtaXQgZXZlbnQgZm9yIHNlbnNvciB0aGF0IGhhcyBub3QgYmVlbiByZWdpc3RlcmVkIik7CisgICAgICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgaGFuZGxlID0gaS0+c2Vjb25kOworICAgIH0KKworICAgIC8vIG1ha2luZyBhIGNvcHkgb2YgZXZlbnRzLCBwcmVwYXJlIGZvciBlZGl0aW5nCisgICAgc2Vuc29yc19ldmVudF90IGV2ZW50ID0gZTsKKyAgICBldmVudC52ZXJzaW9uID0gc2l6ZW9mKGV2ZW50KTsKKworICAgIC8vIHNwZWNpYWwgY2FzZSBvZiBmbHVzaCBjb21wbGV0ZQorICAgIGlmIChldmVudC50eXBlID09IFNFTlNPUl9UWVBFX01FVEFfREFUQSkgeworICAgICAgICBldmVudC5zZW5zb3IgPSAwOworICAgICAgICBldmVudC5tZXRhX2RhdGEuc2Vuc29yID0gaGFuZGxlOworICAgIH0gZWxzZSB7CisgICAgICAgIGV2ZW50LnNlbnNvciA9IGhhbmRsZTsKKyAgICB9CisKKyAgICAvLyBzZXQgdGltZXN0YW1wIGlmIGl0IGlzIGRlZmF1bHQgdmFsdWUKKyAgICBpZiAoZXZlbnQudGltZXN0YW1wID09IFRJTUVTVEFNUF9BVVRPX0ZJTEwpIHsKKyAgICAgICAgZXZlbnQudGltZXN0YW1wID0gZWxhcHNlZFJlYWx0aW1lTmFubygpOworICAgIH0KKworICAgIGlmIChtQ2FsbGJhY2spIHsKKyAgICAgICAgLy8gZXh0ZW50aW9uIG1vZGUsIGNhbGxpbmcgY2FsbGJhY2sgZGlyZWN0bHkKKyAgICAgICAgaW50IHJldDsKKworICAgICAgICByZXQgPSBtQ2FsbGJhY2stPnN1Ym1pdEV2ZW50KG51bGxwdHIsIGV2ZW50KTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJEeW5hbWljU2Vuc29yTWFuYWdlciBjYWxsYmFjayBmYWlsZWQsIHJldDogJWQiLCByZXQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gc3RhbmRhbG9uZSBtb2RlLCBhZGQgZXZlbnQgdG8gaW50ZXJuYWwgYnVmZmVyIGZvciBwb2xsKCkgdG8gcGljayB1cAorICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbGsobUZpZm9Mb2NrKTsKKyAgICAgICAgaWYgKG1GaWZvLndyaXRlKCZldmVudCwgMSkgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiRHluYW1pY1NlbnNvck1hbmFnZXIgZmlmbyBmdWxsIik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBEeW5hbWljU2Vuc29yTWFuYWdlcjo6Z2V0TmV4dEF2YWlsYWJsZUhhbmRsZSgpIHsKKyAgICBpZiAobU5leHRIYW5kbGUgPT0gbUhhbmRsZVJhbmdlLnNlY29uZCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBtTmV4dEhhbmRsZSsrOworfQorCitjb25zdCBzZW5zb3JfdCYgRHluYW1pY1NlbnNvck1hbmFnZXI6OmdldER5bmFtaWNNZXRhU2Vuc29yKCkgY29uc3QgeworICAgIHJldHVybiBtTWV0YVNlbnNvcjsKK30KKworRHluYW1pY1NlbnNvck1hbmFnZXI6OkNvbm5lY3Rpb25SZXBvcnQ6OkNvbm5lY3Rpb25SZXBvcnQoCisgICAgICAgIGludCBoYW5kbGUsIHNwPEJhc2VTZW5zb3JPYmplY3Q+IHNlbnNvcikgOgorICAgICAgICBtU2Vuc29yKCooc2Vuc29yLT5nZXRTZW5zb3IoKSkpLAorICAgICAgICBtTmFtZShtU2Vuc29yLm5hbWUpLAorICAgICAgICBtVmVuZG9yKG1TZW5zb3IudmVuZG9yKSwKKyAgICAgICAgbVBlcm1pc3Npb24obVNlbnNvci5yZXF1aXJlZFBlcm1pc3Npb24pLAorICAgICAgICBtU3RyaW5nVHlwZShtU2Vuc29yLnN0cmluZ1R5cGUpLAorICAgICAgICBtR2VuZXJhdGVkKGZhbHNlKSB7CisgICAgbVNlbnNvci5uYW1lID0gbU5hbWUuY19zdHIoKTsKKyAgICBtU2Vuc29yLnZlbmRvciA9IG1WZW5kb3IuY19zdHIoKTsKKyAgICBtU2Vuc29yLnJlcXVpcmVkUGVybWlzc2lvbiA9IG1QZXJtaXNzaW9uLmNfc3RyKCk7CisgICAgbVNlbnNvci5zdHJpbmdUeXBlID0gbVN0cmluZ1R5cGUuY19zdHIoKTsKKyAgICBtU2Vuc29yLmhhbmRsZSA9IGhhbmRsZTsKKyAgICBtZW1zZXQoJm1FdmVudCwgMCwgc2l6ZW9mKG1FdmVudCkpOworICAgIG1FdmVudC52ZXJzaW9uID0gc2l6ZW9mKG1FdmVudCk7CisgICAgc2Vuc29yLT5nZXRVdWlkKG1VdWlkKTsKKyAgICBBTE9HVigiQ29ubmVjdGlvbiByZXBvcnQgaW5pdDogbmFtZSA9ICVzLCBoYW5kbGUgPSAlZCIsIG1TZW5zb3IubmFtZSwgbVNlbnNvci5oYW5kbGUpOworfQorCitEeW5hbWljU2Vuc29yTWFuYWdlcjo6Q29ubmVjdGlvblJlcG9ydDo6fkNvbm5lY3Rpb25SZXBvcnQoKSB7CisgICAgQUxPR1YoIkNvbm5lY3Rpb24gcmVwb3J0IGR0b3I6IG5hbWUgPSAlcywgaGFuZGxlID0gJWQiLCBtU2Vuc29yLm5hbWUsIG1TZW5zb3IuaGFuZGxlKTsKK30KKworY29uc3Qgc2Vuc29yc19ldmVudF90JiBEeW5hbWljU2Vuc29yTWFuYWdlcjo6Q29ubmVjdGlvblJlcG9ydDo6CisgICAgICAgIGdlbmVyYXRlQ29ubmVjdGlvbkV2ZW50KGludCBtZXRhSGFuZGxlKSB7CisgICAgaWYgKCFtR2VuZXJhdGVkKSB7CisgICAgICAgIG1FdmVudC5zZW5zb3IgPSBtZXRhSGFuZGxlOworICAgICAgICBtRXZlbnQudHlwZSA9IFNFTlNPUl9UWVBFX0RZTkFNSUNfU0VOU09SX01FVEE7CisgICAgICAgIG1FdmVudC50aW1lc3RhbXAgPSBlbGFwc2VkUmVhbHRpbWVOYW5vKCk7CisgICAgICAgIG1FdmVudC5keW5hbWljX3NlbnNvcl9tZXRhID0KKyAgICAgICAgICAgICAgICAoZHluYW1pY19zZW5zb3JfbWV0YV9ldmVudF90KSB7dHJ1ZSwgbVNlbnNvci5oYW5kbGUsICZtU2Vuc29yLCB7MH19OworICAgICAgICBtZW1jcHkoJm1FdmVudC5keW5hbWljX3NlbnNvcl9tZXRhLnV1aWQsICZtVXVpZCwgc2l6ZW9mKG1FdmVudC5keW5hbWljX3NlbnNvcl9tZXRhLnV1aWQpKTsKKyAgICAgICAgbUdlbmVyYXRlZCA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBtRXZlbnQ7Cit9CisKK3ZvaWQgRHluYW1pY1NlbnNvck1hbmFnZXI6OkNvbm5lY3Rpb25SZXBvcnQ6OgorICAgICAgICBmaWxsRGlzY29ubmVjdGlvbkV2ZW50KHNlbnNvcnNfZXZlbnRfdCogZXZlbnQsIGludCBtZXRhSGFuZGxlLCBpbnQgaGFuZGxlKSB7CisgICAgbWVtc2V0KGV2ZW50LCAwLCBzaXplb2Yoc2Vuc29yc19ldmVudF90KSk7CisgICAgZXZlbnQtPnZlcnNpb24gPSBzaXplb2Yoc2Vuc29yc19ldmVudF90KTsKKyAgICBldmVudC0+c2Vuc29yID0gbWV0YUhhbmRsZTsKKyAgICBldmVudC0+dHlwZSA9IFNFTlNPUl9UWVBFX0RZTkFNSUNfU0VOU09SX01FVEE7CisgICAgZXZlbnQtPnRpbWVzdGFtcCA9IGVsYXBzZWRSZWFsdGltZU5hbm8oKTsKKyAgICBldmVudC0+ZHluYW1pY19zZW5zb3JfbWV0YS5jb25uZWN0ZWQgPSBmYWxzZTsKKyAgICBldmVudC0+ZHluYW1pY19zZW5zb3JfbWV0YS5oYW5kbGUgPSBoYW5kbGU7Cit9CisKK30gLy8gbmFtZXNwYWNlIFNlbnNvckhhbEV4dAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0R5bmFtaWNTZW5zb3JNYW5hZ2VyLmggYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvRHluYW1pY1NlbnNvck1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmYzOWRhCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0R5bmFtaWNTZW5zb3JNYW5hZ2VyLmgKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VOU09SSEFMX0VYVF9EWU5BTUlDX1NFTlNPUl9NQU5BR0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9TRU5TT1JIQUxfRVhUX0RZTkFNSUNfU0VOU09SX01BTkFHRVJfSAorCisjaW5jbHVkZSAiU2Vuc29yRXZlbnRDYWxsYmFjay5oIgorI2luY2x1ZGUgIlJpbmdCdWZmZXIuaCIKKyNpbmNsdWRlIDxoYXJkd2FyZS9zZW5zb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgU2Vuc29ySGFsRXh0IHsKKworY2xhc3MgQmFzZUR5bmFtaWNTZW5zb3JEYWVtb247CisKK2NsYXNzIER5bmFtaWNTZW5zb3JNYW5hZ2VyIDogcHVibGljIFNlbnNvckV2ZW50Q2FsbGJhY2sgeworcHVibGljOgorICAgIC8vIGhhbmRsZUJhc2UgaXMgcmVzZXJ2ZWQgZm9yIHRoZSBkeW5hbWljIHNlbnNvciBtZXRhIHNlbnNvci4KKyAgICAvLyBoYW5kbGVNYXggbXVzdCBiZSBncmVhdGVyIHRoYW4gaGFuZGxlQmFzZSArIDEuCisgICAgLy8gVGhpcyBjbGFzcyBoYXMgdHdvIG9wZXJhdGlvbiBtb2RlIGRlcGVuZGluZyBvbiBjYWxsYmFjazogMSkgZXh0ZW5zaW9uLCAyKSBzdGFuZC1hbG9uZS4KKyAgICAvLyBJbiBleHRlbnNpb24gbW9kZSwgY2FsbGJhY2sgbXVzdCBub3QgYmUgbnVsbHB0ci4gU2Vuc29yIGV2ZW50IGdlbmVyYXRlZCB3aWxsIGJlIHN1Ym1pdHRlZCB0bworICAgIC8vIGJ1ZmZlciBvZiBwcmltYXJ5IHNlbnNvciBIQUwgaW1wbGVtZW50YXRpb24uIEluIHN0YW5kLWFsb25lIG1vZGUsIGNhbGxiYWNrIG11c3QgYmUgbnVsbHB0ci4KKyAgICAvLyBHZW5lcmF0ZWQgc2Vuc29yIGV2ZW50cyB3aWxsIGJlIGFkZGVkIGludG8gaW50ZXJuYWwgYnVmZmVyIHdhaXRpbmcgZm9yIHBvbGwoKSBmdW5jdGlvbiB0bworICAgIC8vIHBpY2sgdXAuCisgICAgLy8KKyAgICBzdGF0aWMgRHluYW1pY1NlbnNvck1hbmFnZXIqIGNyZWF0ZUluc3RhbmNlKAorICAgICAgICAgICAgaW50IGhhbmRsZUJhc2UsIGludCBoYW5kbGVDb3VudCwgU2Vuc29yRXZlbnRDYWxsYmFjayAqY2FsbGJhY2spOworICAgIHZpcnR1YWwgfkR5bmFtaWNTZW5zb3JNYW5hZ2VyKCk7CisKKyAgICAvLyBjYWxscyB0byBhZGQgb3IgcmVtb3ZlIHNlbnNvciwgY2FsbGVkIGZyb20gc2Vuc29yIGRhZW1vbgorICAgIGJvb2wgcmVnaXN0ZXJTZW5zb3Ioc3A8QmFzZVNlbnNvck9iamVjdD4gc2Vuc29yKTsKKyAgICB2b2lkIHVucmVnaXN0ZXJTZW5zb3Ioc3A8QmFzZVNlbnNvck9iamVjdD4gc2Vuc29yKTsKKworICAgIC8vIERldGVybWluZSBpZiBhIHNlbnNvciBoYW5kbGUgaXMgaW4gdGhlIHJhbmdlIGRlZmluZWQgaW4gY29uc3RydWN0b3IuCisgICAgLy8gSXQgZG9lcyBub3QgdGVzdCBpZiBzZW5zb3IgaGFuZGxlIGlzIHZhbGlkLgorICAgIGJvb2wgb3ducyhpbnQgaGFuZGxlKSBjb25zdDsKKworICAgIC8vIGhhbmRsZXMgc2Vuc29yIGhhbCByZXF1ZXN0cy4KKyAgICBpbnQgYWN0aXZhdGUoaW50IGhhbmRsZSwgYm9vbCBlbmFibGUpOworICAgIGludCBiYXRjaChpbnQgaGFuZGxlLCBuc2Vjc190IHNhbXBsZV9wZXJpb2QsIG5zZWNzX3QgYmF0Y2hfcGVyaW9kKTsKKyAgICBpbnQgc2V0RGVsYXkoaW50IGhhbmRsZSwgbnNlY3NfdCBzYW1wbGVfcGVyaW9kKTsKKyAgICBpbnQgZmx1c2goaW50IGhhbmRsZSk7CisgICAgaW50IHBvbGwoc2Vuc29yc19ldmVudF90ICogZGF0YSwgaW50IGNvdW50KTsKKworICAgIC8vIFNlbnNvckV2ZW50Q2FsbGJhY2sKKyAgICB2aXJ0dWFsIGludCBzdWJtaXRFdmVudChzcDxCYXNlU2Vuc29yT2JqZWN0PiwgY29uc3Qgc2Vuc29yc19ldmVudF90ICZlKSBvdmVycmlkZTsKKworICAgIC8vIGdldCBtZXRhIHNlbnNvciBzdHJ1Y3QKKyAgICBjb25zdCBzZW5zb3JfdCYgZ2V0RHluYW1pY01ldGFTZW5zb3IoKSBjb25zdDsKK3Byb3RlY3RlZDoKKyAgICBEeW5hbWljU2Vuc29yTWFuYWdlcihpbnQgaGFuZGxlQmFzZSwgaW50IGhhbmRsZU1heCwgU2Vuc29yRXZlbnRDYWxsYmFjayogY2FsbGJhY2spOworcHJpdmF0ZToKKyAgICAvLyBhIGhlbHBlciBjbGFzcyB1c2VkIGZvciBnZW5lcmF0ZSBjb25uZWN0aW9uIGFuZCBkaXNjb25uZWN0aW9uIHJlcG9ydAorICAgIGNsYXNzIENvbm5lY3Rpb25SZXBvcnQgeworICAgIHB1YmxpYzoKKyAgICAgICAgQ29ubmVjdGlvblJlcG9ydCgpIHt9CisgICAgICAgIENvbm5lY3Rpb25SZXBvcnQoaW50IGhhbmRsZSwgc3A8QmFzZVNlbnNvck9iamVjdD4gc2Vuc29yKTsKKyAgICAgICAgfkNvbm5lY3Rpb25SZXBvcnQoKTsKKyAgICAgICAgY29uc3Qgc2Vuc29yc19ldmVudF90JiBnZW5lcmF0ZUNvbm5lY3Rpb25FdmVudChpbnQgbWV0YUhhbmRsZSk7CisgICAgICAgIHN0YXRpYyB2b2lkIGZpbGxEaXNjb25uZWN0aW9uRXZlbnQoc2Vuc29yc19ldmVudF90KiBldmVudCwgaW50IG1ldGFIYW5kbGUsIGludCBoYW5kbGUpOworICAgIHByaXZhdGU6CisgICAgICAgIHNlbnNvcl90IG1TZW5zb3I7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1OYW1lOworICAgICAgICBzdGQ6OnN0cmluZyBtVmVuZG9yOworICAgICAgICBzdGQ6OnN0cmluZyBtUGVybWlzc2lvbjsKKyAgICAgICAgc3RkOjpzdHJpbmcgbVN0cmluZ1R5cGU7CisgICAgICAgIHNlbnNvcnNfZXZlbnRfdCBtRXZlbnQ7CisgICAgICAgIHVpbnQ4X3QgbVV1aWRbMTZdOworICAgICAgICBib29sIG1HZW5lcmF0ZWQ7CisgICAgICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENvbm5lY3Rpb25SZXBvcnQpOworICAgIH07CisKKyAgICAvLyByZXR1cm5zIG5leHQgYXZhaWxhYmxlIGhhbmRsZSB0byB1c2UgdXBvbiBhIG5ldyBzZW5zb3IgY29ubmVjdGlvbiwgb3IgLTEgaWYgd2UgcnVuIG91dC4KKyAgICBpbnQgZ2V0TmV4dEF2YWlsYWJsZUhhbmRsZSgpOworCisgICAgLy8gVEY6ICBpbnQgZm9vKHNwPEJhc2VTZW5zb3JPYmplY3Q+IG9iaik7CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRGPgorICAgIGludCBvcGVyYXRlU2Vuc29yKGludCBoYW5kbGUsIFRGIGYpIGNvbnN0IHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxrKG1Mb2NrKTsKKyAgICAgICAgY29uc3QgYXV0byBpID0gbU1hcC5maW5kKGhhbmRsZSk7CisgICAgICAgIGlmIChpID09IG1NYXAuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgc3A8QmFzZVNlbnNvck9iamVjdD4gcyA9IGktPnNlY29uZC5wcm9tb3RlKCk7CisgICAgICAgIGlmIChzID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vIHNlbnNvciBvYmplY3QgaXMgYWxyZWFkeSBnb25lCisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmKHMpOworICAgIH0KKworICAgIC8vIGF2YWlsYWJsZSBzZW5zb3IgaGFuZGxlIHNwYWNlCisgICAgY29uc3Qgc3RkOjpwYWlyPGludCwgaW50PiBtSGFuZGxlUmFuZ2U7CisgICAgc2Vuc29yX3QgbU1ldGFTZW5zb3I7CisKKyAgICAvLyBpbW11dGFibGUgcG9pbnRlciB0byBldmVudCBjYWxsYmFjaywgdXNlZCBpbiBleHRlbnRpb24gbW9kZS4KKyAgICBTZW5zb3JFdmVudENhbGxiYWNrICogY29uc3QgbUNhbGxiYWNrOworCisgICAgLy8gUmluZ0J1ZmZlciB1c2VkIGluIHN0YW5kYWxvbmUgbW9kZQorICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtGaWZvU2l6ZSA9IDQwOTY7IC8vNEsgZXZlbnRzCisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1GaWZvTG9jazsKKyAgICBSaW5nQnVmZmVyIG1GaWZvOworCisgICAgLy8gbWFwcGluZyBiZXR3ZWVuIGhhbmRsZSBhbmQgU2Vuc29yT2JqZWN0cworICAgIG11dGFibGUgc3RkOjptdXRleCBtTG9jazsKKyAgICBpbnQgbU5leHRIYW5kbGU7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludCwgd3A8QmFzZVNlbnNvck9iamVjdD4+IG1NYXA7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHZvaWQgKiwgaW50PiBtUmV2ZXJzZU1hcDsKKyAgICBtdXRhYmxlIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIENvbm5lY3Rpb25SZXBvcnQ+IG1QZW5kaW5nUmVwb3J0OworCisgICAgLy8gZGFlbW9ucworICAgIHN0ZDo6dmVjdG9yPHNwPEJhc2VEeW5hbWljU2Vuc29yRGFlbW9uPj4gbURhZW1vblZlY3RvcjsKK307CisKK30gLy8gbmFtZXNwYWNlIFNlbnNvckhhbEV4dAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9TRU5TT1JIQUxfRVhUX0RZTkFNSUNfU0VOU09SX01BTkFHRVJfSApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZERldmljZS5oIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZERldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwODM1OTMKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkRGV2aWNlLmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRU5TT1JIQUxfRVhUX0hJRF9ERVZJQ0VfSAorI2RlZmluZSBBTkRST0lEX1NFTlNPUkhBTF9FWFRfSElEX0RFVklDRV9ICisjaW5jbHVkZSAiVXRpbHMuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBTZW5zb3JIYWxFeHQgeworCitjbGFzcyBIaWREZXZpY2UgOiB2aXJ0dWFsIHB1YmxpYyBSRUZfQkFTRShIaWREZXZpY2UpIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5IaWREZXZpY2UoKSA9IGRlZmF1bHQ7CisKKyAgICBzdHJ1Y3QgSGlkRGV2aWNlSW5mbyB7CisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgICAgIHN0ZDo6c3RyaW5nIHBoeXNpY2FsUGF0aDsKKyAgICAgICAgc3RkOjpzdHJpbmcgYnVzVHlwZTsKKyAgICAgICAgdWludDE2X3QgdmVuZG9ySWQ7CisgICAgICAgIHVpbnQxNl90IHByb2R1Y3RJZDsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGVzY3JpcHRvcjsKKyAgICB9OworCisgICAgdmlydHVhbCBjb25zdCBIaWREZXZpY2VJbmZvJiBnZXREZXZpY2VJbmZvKCkgPSAwOworCisgICAgLy8gZ2V0IGZlYXR1cmUgZnJvbSBkZXZpY2UKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0RmVhdHVyZSh1aW50OF90IGlkLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqb3V0KSA9IDA7CisKKyAgICAvLyB3cml0ZSBmZWF0dXJlIHRvIGRldmljZQorICAgIHZpcnR1YWwgYm9vbCBzZXRGZWF0dXJlKHVpbnQ4X3QgaWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZpbikgPSAwOworCisgICAgLy8gc2VuZCByZXBvcnQgdG8gZGVmYXVsdCBvdXRwdXQgZW5kcG9pbnQKKyAgICB2aXJ0dWFsIGJvb2wgc2VuZFJlcG9ydCh1aW50OF90IGlkLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmZGF0YSkgPSAwOworCisgICAgLy8gcmVjZWl2ZSBmcm9tIGRlZmF1bHQgaW5wdXQgZW5kcG9pbnQKKyAgICB2aXJ0dWFsIGJvb2wgcmVjZWl2ZVJlcG9ydCh1aW50OF90ICppZCwgc3RkOjp2ZWN0b3I8dWludDhfdD4gKmRhdGEpID0gMDsKK307CisKK30gLy8gbmFtZXNwYWNlIFNlbnNvckhhbEV4dAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2VuZGlmIC8vIEFORFJPSURfU0VOU09SSEFMX0VYVF9ISURfREVWSUNFX0gKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRSYXdEZXZpY2UuY3BwIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFJhd0RldmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4ODQ4MwotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRSYXdEZXZpY2UuY3BwCkBAIC0wLDAgKzEsMzMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlICJIaWRSYXdEZXZpY2UuaCIKKyNpbmNsdWRlICJIaWRMb2cuaCIKKyNpbmNsdWRlICJVdGlscy5oIgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZHJhdy5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZGRldi5oPiAgLy8gSElEX1NUUklOR19TSVpFCisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzZXQ+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBTZW5zb3JIYWxFeHQgeworCit1c2luZyBIaWRVdGlsOjpIaWRJdGVtOworCitIaWRSYXdEZXZpY2U6OkhpZFJhd0RldmljZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmRldk5hbWUsIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDx1bnNpZ25lZCBpbnQ+ICZ1c2FnZVNldCkKKyAgICAgICAgOiBtRGV2RmQoLTEpLCBtTXVsdGlJZERldmljZShmYWxzZSksIG1WYWxpZChmYWxzZSkgeworICAgIC8vIG9wZW4gZGV2aWNlCisgICAgbURldkZkID0gOjpvcGVuKGRldk5hbWUuY19zdHIoKSwgT19SRFdSKTsgLy8gcmVhZCB3cml0ZT8KKyAgICBpZiAobURldkZkIDwgMCkgeworICAgICAgICBMT0dfRSA8PCAiRXJyb3IgaW4gb3BlbiBkZXZpY2Ugbm9kZTogIiA8PCBlcnJubyA8PCAiICgiIDw8IDo6c3RyZXJyb3IoZXJybm8pIDw8ICIpIgorICAgICAgICAgICAgICA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGdldCBkZXZpY2UgaW5mb3JtYXRpb24sIGluY2x1ZGluZyBoaWQgZGVzY3JpcHRvcgorICAgIGlmICghcG9wdWxhdGVEZXZpY2VJbmZvKCkpIHsKKyAgICAgICAgTE9HX0UgPDwgIkVycm9yIG9idGFpbmluZyBIaWRSYXcgZGV2aWNlIGluZm9ybWF0aW9uIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghZ2VuZXJhdGVEaWdlc3QodXNhZ2VTZXQpKSB7CisgICAgICAgIExPR19FIDw8ICJDYW5ub3QgcGFyc2UgaGlkIGRlc2NyaXB0b3IiIDw8IExPR19FTkRMOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gZGlnZXN0IGVycm9yIGNoZWNraW5nCisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVuc2lnbmVkIGludD4gcmVwb3J0SWRTZXQ7CisgICAgZm9yIChhdXRvIGNvbnN0ICZkaWdlc3QgOiBtRGlnZXN0VmVjdG9yKSB7CisgICAgICAgIGZvciAoYXV0byBjb25zdCAmcGFja2V0IDogZGlnZXN0LnBhY2tldHMpIHsKKyAgICAgICAgICAgIGlmIChtUmVwb3J0VHlwZUlkTWFwLmVtcGxhY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihwYWNrZXQudHlwZSwgcGFja2V0LmlkKSwgJnBhY2tldCkuc2Vjb25kID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgTE9HX0UgPDwgIlNhbWUgdHlwZSAtIHJlcG9ydCBpZCBwYWlyICgiIDw8IHBhY2tldC50eXBlIDw8ICIsICIgPDwgcGFja2V0LmlkIDw8ICIpIgorICAgICAgICAgICAgICAgICAgICAgIDw8ICJpcyB1c2VkIGJ5IG1vcmUgdGhhbiBvbmUgdXNhZ2UgY29sbGVjdGlvbiIgPDwgTE9HX0VOREw7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwb3J0SWRTZXQuaW5zZXJ0KHBhY2tldC5pZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1SZXBvcnRUeXBlSWRNYXAuZW1wdHkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHJlcG9ydElkU2V0LnNpemUoKSA+IDEpIHsKKyAgICAgICAgaWYgKHJlcG9ydElkU2V0LmZpbmQoMCkgIT0gcmVwb3J0SWRTZXQuZW5kKCkpIHsKKyAgICAgICAgICAgIExPR19FIDw8ICJEZWZhdWx0IHJlcG9ydCBpZCAwIGlzIG5vdCBleHBlY3RlZCB3aGVuIG1vcmUgdGhhbiBvbmUgcmVwb3J0IGlkIGlzIGZvdW5kLiIKKyAgICAgICAgICAgICAgICAgIDw8IExPR19FTkRMOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1NdWx0aUlkRGV2aWNlID0gdHJ1ZTsKKyAgICB9IGVsc2UgeyAvLyByZXBvcnRJZFNldC5zaXplKCkgPT0gMQorICAgICAgICBtTXVsdGlJZERldmljZSA9ICEocmVwb3J0SWRTZXQuZmluZCgwKSAhPSByZXBvcnRJZFNldC5lbmQoKSk7CisgICAgfQorICAgIG1WYWxpZCA9IHRydWU7Cit9CisKK0hpZFJhd0RldmljZTo6fkhpZFJhd0RldmljZSgpIHsKKyAgICBpZiAobURldkZkID4gMCkgeworICAgICAgICA6OmNsb3NlKG1EZXZGZCk7CisgICAgICAgIG1EZXZGZCA9IC0xOworICAgIH0KK30KKworYm9vbCBIaWRSYXdEZXZpY2U6OnBvcHVsYXRlRGV2aWNlSW5mbygpIHsKKyAgICBIaWREZXZpY2VJbmZvIGluZm87CisgICAgY2hhciBidWZmZXJbSElEX1NUUklOR19TSVpFICsgMV07CisKKyAgICBpZiAobURldkZkIDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gbmFtZQorICAgIGlmIChpb2N0bChtRGV2RmQsIEhJRElPQ0dSQVdOQU1FKHNpemVvZihidWZmZXIpIC0gMSksIGJ1ZmZlcikgPCAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYnVmZmVyW3NpemVvZihidWZmZXIpIC0gMV0gPSAnXDAnOworICAgIGluZm8ubmFtZSA9IGJ1ZmZlcjsKKworICAgIC8vIHBoeXNpY2FsIHBhdGgKKyAgICBpZiAoaW9jdGwobURldkZkLCBISURJT0NHUkFXUEhZUyhzaXplb2YoYnVmZmVyKSAtIDEpLCBidWZmZXIpIDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGJ1ZmZlcltzaXplb2YoYnVmZmVyKSAtIDFdID0gJ1wwJzsKKyAgICBpbmZvLnBoeXNpY2FsUGF0aCA9IGJ1ZmZlcjsKKworICAgIC8vIHJhdyBkZXZpY2UgaW5mbworICAgIGhpZHJhd19kZXZpbmZvIGRldkluZm87CisgICAgaWYgKGlvY3RsKG1EZXZGZCwgSElESU9DR1JBV0lORk8sICZkZXZJbmZvKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN3aXRjaCAoZGV2SW5mby5idXN0eXBlKSB7CisgICAgY2FzZSBCVVNfVVNCOgorICAgICAgICBpbmZvLmJ1c1R5cGUgPSAiVVNCIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCVVNfSElMOgorICAgICAgICBpbmZvLmJ1c1R5cGUgPSAiSElMIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCVVNfQkxVRVRPT1RIOgorICAgICAgICBpbmZvLmJ1c1R5cGUgPSAiQmx1ZXRvb3RoIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCVVNfVklSVFVBTDoKKyAgICAgICAgaW5mby5idXNUeXBlID0gIlZpcnR1YWwiOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBpbmZvLmJ1c1R5cGUgPSAiT3RoZXIiOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpbmZvLnZlbmRvcklkID0gZGV2SW5mby52ZW5kb3I7CisgICAgaW5mby5wcm9kdWN0SWQgPSBkZXZJbmZvLnZlbmRvcjsKKworICAgIHVpbnQzMl90IGRlc2NyaXB0b3JTaXplOworICAgIC8qIEdldCBSZXBvcnQgRGVzY3JpcHRvciBTaXplICovCisgICAgaWYgKGlvY3RsKG1EZXZGZCwgSElESU9DR1JERVNDU0laRSwgJmRlc2NyaXB0b3JTaXplKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0cnVjdCBoaWRyYXdfcmVwb3J0X2Rlc2NyaXB0b3IgcmVwb3J0RGVzY3JpcHRvcjsKKyAgICBtZW1zZXQoJnJlcG9ydERlc2NyaXB0b3IsIDAsIHNpemVvZihyZXBvcnREZXNjcmlwdG9yKSk7CisgICAgaW5mby5kZXNjcmlwdG9yLnJlc2l6ZShkZXNjcmlwdG9yU2l6ZSk7CisgICAgcmVwb3J0RGVzY3JpcHRvci5zaXplID0gZGVzY3JpcHRvclNpemU7CisgICAgaWYgKGlvY3RsKG1EZXZGZCwgSElESU9DR1JERVNDLCAmcmVwb3J0RGVzY3JpcHRvcikgPCAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc3RkOjpjb3B5KHJlcG9ydERlc2NyaXB0b3IudmFsdWUsIHJlcG9ydERlc2NyaXB0b3IudmFsdWUgKyBkZXNjcmlwdG9yU2l6ZSwKKyAgICAgICAgICAgICAgaW5mby5kZXNjcmlwdG9yLmJlZ2luKCkpOworICAgIG1EZXZpY2VJbmZvID0gaW5mbzsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBIaWRSYXdEZXZpY2U6OmdlbmVyYXRlRGlnZXN0KGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDx1bnNpZ25lZCBpbnQ+ICZ1c2FnZSkgeworICAgIGlmIChtRGV2aWNlSW5mby5kZXNjcmlwdG9yLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPEhpZEl0ZW0+IHRva2VucyA9IEhpZEl0ZW06OnRva2VuaXplKG1EZXZpY2VJbmZvLmRlc2NyaXB0b3IpOworICAgIEhpZFBhcnNlciBwYXJzZXI7CisgICAgaWYgKCFwYXJzZXIucGFyc2UodG9rZW5zKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcGFyc2VyLmZpbHRlclRyZWUoKTsKKyAgICBtRGlnZXN0VmVjdG9yID0gcGFyc2VyLmdlbmVyYXRlRGlnZXN0KHVzYWdlKTsKKworICAgIHJldHVybiBtRGlnZXN0VmVjdG9yLnNpemUoKSA+IDA7Cit9CisKK2Jvb2wgSGlkUmF3RGV2aWNlOjppc1ZhbGlkKCkgeworICAgIHJldHVybiBtVmFsaWQ7Cit9CisKK2Jvb2wgSGlkUmF3RGV2aWNlOjpnZXRGZWF0dXJlKHVpbnQ4X3QgaWQsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpvdXQpIHsKKyAgICBpZiAobURldkZkIDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG91dCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBIaWRQYXJzZXI6OlJlcG9ydFBhY2tldCAqcGFja2V0ID0gZ2V0UmVwb3J0UGFja2V0KEhpZFBhcnNlcjo6UkVQT1JUX1RZUEVfRkVBVFVSRSwgaWQpOworICAgIGlmIChwYWNrZXQgPT0gbnVsbHB0cikgeworICAgICAgICBMT0dfRSA8PCAiSGlkUmF3RGV2aWNlOjpnZXRGZWF0dXJlOiB1bmtub3duIGZlYXR1cmUgIiA8PCBpZCA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNpemVfdCBzaXplID0gcGFja2V0LT5nZXRCeXRlU2l6ZSgpICsgMTsgLy8gcmVwb3J0IGlkIHNpemUKKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsKG1Jb0J1ZmZlckxvY2spOworICAgIGlmIChtSW9CdWZmZXIuc2l6ZSgpIDwgc2l6ZSkgeworICAgICAgICBtSW9CdWZmZXIucmVzaXplKHNpemUpOworICAgIH0KKyAgICBtSW9CdWZmZXJbMF0gPSBpZDsKKyAgICBpbnQgcmVzID0gOjppb2N0bChtRGV2RmQsIEhJRElPQ0dGRUFUVVJFKHNpemUpLCBtSW9CdWZmZXIuZGF0YSgpKTsKKyAgICBpZiAocmVzIDwgMCkgeworICAgICAgICBMT0dfRSA8PCAiSGlkUmF3RGV2aWNlOjpnZXRGZWF0dXJlOiBmZWF0dXJlICIgPDwgc3RhdGljX2Nhc3Q8aW50PihpZCkKKyAgICAgICAgICAgICAgPDwgIiBpb2N0bCByZXR1cm5zICIgPDwgcmVzIDw8ICIgKCIgPDwgOjpzdHJlcnJvcihyZXMpIDw8ICIpIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KHJlcykgIT0gc2l6ZSkgeworICAgICAgICBMT0dfRSA8PCAiSGlkUmF3RGV2aWNlOjpnZXRGZWF0dXJlOiBnZXQgZmVhdHVyZSAiIDw8IHN0YXRpY19jYXN0PGludD4oaWQpCisgICAgICAgICAgICAgIDw8ICIgcmV0dXJuZWQgIiA8PCByZXMgPDwgIiBieXRlcywgZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgIiA8PCBzaXplIDw8IExPR19FTkRMOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChtSW9CdWZmZXIuZnJvbnQoKSAhPSBpZCkgeworICAgICAgICBMT0dfRSA8PCAiSGlkUmF3RGV2aWNlOjpnZXRGZWF0dXJlOiBnZXQgZmVhdHVyZSAiIDw8IHN0YXRpY19jYXN0PGludD4oaWQpCisgICAgICAgICAgICAgIDw8ICIgcmVzdWx0IGhhcyBoZWFkZXIgIiA8PCBtSW9CdWZmZXIuZnJvbnQoKSA8PCBMT0dfRU5ETDsKKyAgICB9CisgICAgb3V0LT5yZXNpemUoc2l6ZSAtIDEpOworICAgIHN0ZDo6Y29weShtSW9CdWZmZXIuYmVnaW4oKSArIDEsIG1Jb0J1ZmZlci5iZWdpbigpICsgc2l6ZSwgb3V0LT5iZWdpbigpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBIaWRSYXdEZXZpY2U6OnNldEZlYXR1cmUodWludDhfdCBpZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmluKSB7CisgICAgaWYgKG1EZXZGZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IEhpZFBhcnNlcjo6UmVwb3J0UGFja2V0ICpwYWNrZXQgPSBnZXRSZXBvcnRQYWNrZXQoSGlkUGFyc2VyOjpSRVBPUlRfVFlQRV9GRUFUVVJFLCBpZCk7CisgICAgaWYgKHBhY2tldCA9PSBudWxscHRyKSB7CisgICAgICAgIExPR19FIDw8ICJIaWRSYXdEZXZpY2U6OnNldEZlYXR1cmU6IFVua25vd24gZmVhdHVyZSAiIDw8IGlkIDw8IExPR19FTkRMOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc2l6ZV90IHNpemUgPSBwYWNrZXQtPmdldEJ5dGVTaXplKCk7CisgICAgaWYgKHNpemUgIT0gaW4uc2l6ZSgpKSB7CisgICAgICAgIExPR19FIDw8ICJIaWRSYXdEZXZpY2U6OnNldEZlYXR1cmU6IHNldCBmZWF0dXJlICIgPDwgaWQgPDwgIiBzaXplIG1pc21hdGNoLCBuZWVkICIKKyAgICAgICAgICAgICAgPDwgc2l6ZSA8PCAiIGJ5dGVzLCBoYXZlICIgPDwgaW4uc2l6ZSgpIDw8ICIgYnl0ZXMiIDw8IExPR19FTkRMOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKytzaXplOyAvLyByZXBvcnQgaWQgYnl0ZQorICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsKG1Jb0J1ZmZlckxvY2spOworICAgIGlmIChtSW9CdWZmZXIuc2l6ZSgpIDwgc2l6ZSkgeworICAgICAgICBtSW9CdWZmZXIucmVzaXplKHNpemUpOworICAgIH0KKyAgICBtSW9CdWZmZXJbMF0gPSBpZDsKKyAgICBzdGQ6OmNvcHkoaW4uYmVnaW4oKSwgaW4uZW5kKCksICZtSW9CdWZmZXJbMV0pOworICAgIGludCByZXMgPSA6OmlvY3RsKG1EZXZGZCwgSElESU9DU0ZFQVRVUkUoc2l6ZSksIG1Jb0J1ZmZlci5kYXRhKCkpOworICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgIExPR19FIDw8ICJIaWRSYXdEZXZpY2U6OnNldEZlYXR1cmU6IGZlYXR1cmUgIiA8PCBpZCA8PCAiIGlvY3RsIHJldHVybnMgIiA8PCByZXMKKyAgICAgICAgICAgICAgPDwgIiAoIiA8PCA6OnN0cmVycm9yKHJlcykgPDwgIikiIDw8IExPR19FTkRMOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEhpZFJhd0RldmljZTo6c2VuZFJlcG9ydCh1aW50OF90IGlkLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmZGF0YSkgeworICAgIGlmIChtRGV2RmQgPCAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBIaWRQYXJzZXI6OlJlcG9ydFBhY2tldCAqcGFja2V0ID0gZ2V0UmVwb3J0UGFja2V0KEhpZFBhcnNlcjo6UkVQT1JUX1RZUEVfT1VUUFVULCBpZCk7CisgICAgaWYgKHBhY2tldCA9PSBudWxscHRyKSB7CisgICAgICAgIExPR19FIDw8ICJIaWRSYXdEZXZpY2U6OnNlbmRSZXBvcnQ6IHVua25vd24gb3V0cHV0ICIgPDwgaWQgPDwgTE9HX0VOREw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzaXplX3Qgc2l6ZSA9IHBhY2tldC0+Z2V0Qnl0ZVNpemUoKTsKKyAgICBpZiAoc2l6ZSAhPSBkYXRhLnNpemUoKSkgeworICAgICAgICBMT0dfRSA8PCAiSGlkUmF3RGV2aWNlOjpzZW5kUmVwb3J0OiBzZW5kIHJlcG9ydCAiIDw8IGlkIDw8ICIgc2l6ZSBtaXNtYXRjaCwgbmVlZCAiCisgICAgICAgICAgICAgIDw8IHNpemUgPDwgIiBieXRlcywgaGF2ZSAiIDw8IGRhdGEuc2l6ZSgpIDw8ICIgYnl0ZXMiIDw8IExPR19FTkRMOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGludCByZXM7CisgICAgaWYgKG1NdWx0aUlkRGV2aWNlKSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsKG1Jb0J1ZmZlckxvY2spOworICAgICAgICArK3NpemU7CisgICAgICAgIGlmIChtSW9CdWZmZXIuc2l6ZSgpIDwgc2l6ZSkgeworICAgICAgICAgICAgbUlvQnVmZmVyLnJlc2l6ZShzaXplKTsKKyAgICAgICAgfQorICAgICAgICBtSW9CdWZmZXJbMF0gPSBpZDsKKyAgICAgICAgc3RkOjpjb3B5KG1Jb0J1ZmZlci5iZWdpbigpICsgMSwgbUlvQnVmZmVyLmVuZCgpLCBkYXRhLmJlZ2luKCkpOworICAgICAgICByZXMgPSA6OndyaXRlKG1EZXZGZCwgbUlvQnVmZmVyLmRhdGEoKSwgc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzID0gOjp3cml0ZShtRGV2RmQsIGRhdGEuZGF0YSgpLCBzaXplKTsKKyAgICB9CisgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgTE9HX0UgPDwgIkhpZFJhd0RldmljZTo6c2VuZFJlcG9ydDogb3V0cHV0ICIgPDwgaWQgPDwgIiB3cml0ZSByZXR1cm5zICIgPDwgcmVzCisgICAgICAgICAgICAgIDw8ICIgKCIgPDwgOjpzdHJlcnJvcihyZXMpIDw8ICIpIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBIaWRSYXdEZXZpY2U6OnJlY2VpdmVSZXBvcnQodWludDhfdCAqaWQsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpkYXRhKSB7CisgICAgaWYgKG1EZXZGZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQ4X3QgYnVmZmVyWzI1Nl07CisgICAgaW50IHJlcyA9IDo6cmVhZChtRGV2RmQsIGJ1ZmZlciwgMjU2KTsKKyAgICBpZiAocmVzIDwgMCkgeworICAgICAgICBMT0dfRSA8PCAiSGlkUmF3RGV2aWNlOjpyZWNlaXZlUmVwb3J0OiByZWFkIHJldHVybnMgIiA8PCByZXMKKyAgICAgICAgICAgICAgPDwgIiAoIiA8PCA6OnN0cmVycm9yKHJlcykgPDwgIikiIDw8IExPR19FTkRMOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1NdWx0aUlkRGV2aWNlKSB7CisgICAgICAgIGlmICghKHJlcyA+IDEpKSB7CisgICAgICAgICAgICBMT0dfRSA8PCAicmVhZCBoaWRyYXcgcmV0dXJucyBkYXRhIHRvbyBzaG9ydCwgbGVuOiAiIDw8IHJlcyA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBkYXRhLT5yZXNpemUoc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXMgLSAxKSk7CisgICAgICAgIHN0ZDo6Y29weShidWZmZXIgKyAxLCBidWZmZXIgKyByZXMsIGRhdGEtPmJlZ2luKCkpOworICAgICAgICAqaWQgPSBidWZmZXJbMF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGF0YS0+cmVzaXplKHN0YXRpY19jYXN0PHNpemVfdD4ocmVzKSk7CisgICAgICAgIHN0ZDo6Y29weShidWZmZXIsIGJ1ZmZlciArIHJlcywgZGF0YS0+YmVnaW4oKSk7CisgICAgICAgICppZCA9IDA7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitjb25zdCBIaWRQYXJzZXI6OlJlcG9ydFBhY2tldCAqSGlkUmF3RGV2aWNlOjpnZXRSZXBvcnRQYWNrZXQodW5zaWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBpZCkgeworICAgIGF1dG8gaSA9IG1SZXBvcnRUeXBlSWRNYXAuZmluZChzdGQ6Om1ha2VfcGFpcih0eXBlLCBpZCkpOworICAgIHJldHVybiAoaSA9PSBtUmVwb3J0VHlwZUlkTWFwLmVuZCgpKSA/IG51bGxwdHIgOiBpLT5zZWNvbmQ7Cit9CisKK30gLy8gbmFtZXNwYWNlIFNlbnNvckhhbEV4dAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFJhd0RldmljZS5oIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFJhd0RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwN2RmZmYKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkUmF3RGV2aWNlLmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIEFORFJPSURfU0VOU09SSEFMX0VYVF9ISURSQVdfREVWSUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9TRU5TT1JIQUxfRVhUX0hJRFJBV19ERVZJQ0VfSAorCisjaW5jbHVkZSAiSGlkRGV2aWNlLmgiCisKKyNpbmNsdWRlIDxIaWRQYXJzZXIuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFNlbnNvckhhbEV4dCB7CisKK3VzaW5nIEhpZFV0aWw6OkhpZFBhcnNlcjsKK3VzaW5nIEhpZFV0aWw6OkhpZFJlcG9ydDsKKworY2xhc3MgSGlkUmF3RGV2aWNlIDogcHVibGljIEhpZERldmljZSB7CisgICAgZnJpZW5kIGNsYXNzIEhpZFJhd0RldmljZVRlc3Q7CitwdWJsaWM6CisgICAgSGlkUmF3RGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nICZkZXZOYW1lLCBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8dW5zaWduZWQgaW50PiAmdXNhZ2VTZXQpOworICAgIHZpcnR1YWwgfkhpZFJhd0RldmljZSgpOworCisgICAgLy8gdGVzdCBpZiB0aGUgZGV2aWNlIGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseQorICAgIGJvb2wgaXNWYWxpZCgpOworCisgICAgLy8gaW1wbGVtZW50IEhpZERldmljZSBwdXJlIHZpcnR1YWxzCisgICAgdmlydHVhbCBIaWREZXZpY2VJbmZvJiBnZXREZXZpY2VJbmZvKCkgb3ZlcnJpZGUgeyByZXR1cm4gbURldmljZUluZm87IH0KKyAgICB2aXJ0dWFsIGJvb2wgZ2V0RmVhdHVyZSh1aW50OF90IGlkLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqb3V0KSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wgc2V0RmVhdHVyZSh1aW50OF90IGlkLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmaW4pIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBzZW5kUmVwb3J0KHVpbnQ4X3QgaWQsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZkYXRhKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wgcmVjZWl2ZVJlcG9ydCh1aW50OF90ICppZCwgc3RkOjp2ZWN0b3I8dWludDhfdD4gKmRhdGEpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgYm9vbCBwb3B1bGF0ZURldmljZUluZm8oKTsKKyAgICBzaXplX3QgZ2V0UmVwb3J0U2l6ZShpbnQgdHlwZSwgdWludDhfdCBpZCk7CisgICAgYm9vbCBnZW5lcmF0ZURpZ2VzdChjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8dWludDMyX3Q+ICZ1c2FnZSk7CisgICAgc2l6ZV90IGNhbGN1bGF0ZVJlcG9ydEJpdFNpemUoY29uc3Qgc3RkOjp2ZWN0b3I8SGlkUmVwb3J0PiAmcmVwb3J0SXRlbXMpOworICAgIGNvbnN0IEhpZFBhcnNlcjo6UmVwb3J0UGFja2V0ICpnZXRSZXBvcnRQYWNrZXQodW5zaWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBpZCk7CisKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjx1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludD4gUmVwb3J0VHlwZUlkUGFpcjsKKyAgICBzdHJ1Y3QgVW5zaWduZWRJbnRQYWlySGFzaCB7CisgICAgICAgIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IFJlcG9ydFR5cGVJZFBhaXImIHYpIGNvbnN0IHsKKyAgICAgICAgICAgIHN0ZDo6aGFzaDx1bnNpZ25lZCBpbnQ+IGhhc2g7CisgICAgICAgICAgICByZXR1cm4gaGFzaCh2LmZpcnN0KSBeIGhhc2godi5zZWNvbmQpOworICAgICAgICB9CisgICAgfTsKKworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxSZXBvcnRUeXBlSWRQYWlyLCBjb25zdCBIaWRQYXJzZXI6OlJlcG9ydFBhY2tldCAqLCBVbnNpZ25lZEludFBhaXJIYXNoPgorICAgICAgICAgICAgbVJlcG9ydFR5cGVJZE1hcDsKKworICAgIEhpZFBhcnNlcjo6RGlnZXN0VmVjdG9yIG1EaWdlc3RWZWN0b3I7Citwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbUlvQnVmZmVyTG9jazsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtSW9CdWZmZXI7CisKKyAgICBpbnQgbURldkZkOworICAgIEhpZERldmljZUluZm8gbURldmljZUluZm87CisgICAgYm9vbCBtTXVsdGlJZERldmljZTsKKyAgICBpbnQgbVZhbGlkOworCisgICAgSGlkUmF3RGV2aWNlKGNvbnN0IEhpZFJhd0RldmljZSAmKSA9IGRlbGV0ZTsKKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBIaWRSYXdEZXZpY2UgJikgPSBkZWxldGU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBTZW5zb3JIYWxFeHQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfU0VOU09SSEFMX0VYVF9ISURSQVdfREVWSUNFX0gKKwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFJhd1NlbnNvci5jcHAgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkUmF3U2Vuc29yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjRkN2E2Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFJhd1NlbnNvci5jcHAKQEAgLTAsMCArMSwxMDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlICJIaWRSYXdTZW5zb3IuaCIKKyNpbmNsdWRlICJIaWRTZW5zb3JEZWYuaCIKKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgIkhpZExvZy5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNmbG9hdD4KKyNpbmNsdWRlIDxjb2RlY3Z0PgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFNlbnNvckhhbEV4dCB7CisKK25hbWVzcGFjZSB7Citjb25zdCBzdGQ6OnN0cmluZyBDVVNUT01fVFlQRV9QUkVGSVgoImNvbS5nb29nbGUuaGFyZHdhcmUuc2Vuc29yLmhpZF9keW5hbWljLiIpOworfQorCitIaWRSYXdTZW5zb3I6OkhpZFJhd1NlbnNvcigKKyAgICAgICAgU1AoSGlkRGV2aWNlKSBkZXZpY2UsIHVpbnQzMl90IHVzYWdlLCBjb25zdCBzdGQ6OnZlY3RvcjxIaWRQYXJzZXI6OlJlcG9ydFBhY2tldD4gJnBhY2tldHMpCisgICAgICAgIDogbVJlcG9ydGluZ1N0YXRlSWQoLTEpLCBtUG93ZXJTdGF0ZUlkKC0xKSwgbVJlcG9ydEludGVydmFsSWQoLTEpLCBtSW5wdXRSZXBvcnRJZCgtMSksCisgICAgICAgIG1FbmFibGVkKGZhbHNlKSwgbVNhbXBsaW5nUGVyaW9kKDEwMDBsbCoxMDAwKjEwMDApLCBtQmF0Y2hpbmdQZXJpb2QoMCksCisgICAgICAgIG1EZXZpY2UoZGV2aWNlKSwgbVZhbGlkKGZhbHNlKSB7CisgICAgaWYgKGRldmljZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbWVtc2V0KCZtU2Vuc29yLCAwLCBzaXplb2YobVNlbnNvcikpOworCisgICAgY29uc3QgSGlkRGV2aWNlOjpIaWREZXZpY2VJbmZvICZpbmZvID0gIGRldmljZS0+Z2V0RGV2aWNlSW5mbygpOworICAgIGluaXRGZWF0dXJlVmFsdWVGcm9tSGlkRGV2aWNlSW5mbygmbUZlYXR1cmVJbmZvLCBpbmZvKTsKKworICAgIGlmICghcG9wdWxhdGVGZWF0dXJlVmFsdWVGcm9tRmVhdHVyZVJlcG9ydCgmbUZlYXR1cmVJbmZvLCBwYWNrZXRzKSkgeworICAgICAgICBMT0dfRSA8PCAicG9wdWxhdGUgZmVhdHVyZSBmcm9tIGZlYXR1cmUgcmVwb3J0IGZhaWxlZCIgPDwgTE9HX0VOREw7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIWZpbmRTZW5zb3JDb250cm9sVXNhZ2UocGFja2V0cykpIHsKKyAgICAgICAgTE9HX0UgPDwgImZpbmRpbmcgc2Vuc29yIGNvbnRyb2wgdXNhZ2UgZmFpbGVkIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGJ1aWxkIHRyYW5zbGF0aW9uIHRhYmxlCisgICAgYm9vbCB0cmFuc2xhdGlvblRhYmxlVmFsaWQgPSBmYWxzZTsKKyAgICBzd2l0Y2ggKHVzYWdlKSB7CisgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBIaWQ6OlNlbnNvcjo6U2Vuc29yVHlwZVVzYWdlOworICAgICAgICB1c2luZyBuYW1lc3BhY2UgSGlkOjpTZW5zb3I6OlJlcG9ydFVzYWdlOworICAgICAgICBjYXNlIEFDQ0VMRVJPTUVURVJfM0Q6CisgICAgICAgICAgICAvLyBIaWQgdW5pdCBkZWZhdWx0IGcKKyAgICAgICAgICAgIC8vIEFuZHJvaWQgdW5pdCBtL3NeMgorICAgICAgICAgICAgLy8gMWcgPSA5LjgxIG0vc14yCisgICAgICAgICAgICBtRmVhdHVyZUluZm8udHlwZVN0cmluZyA9IFNFTlNPUl9TVFJJTkdfVFlQRV9BQ0NFTEVST01FVEVSOworICAgICAgICAgICAgbUZlYXR1cmVJbmZvLnR5cGUgPSBTRU5TT1JfVFlQRV9BQ0NFTEVST01FVEVSOworICAgICAgICAgICAgbUZlYXR1cmVJbmZvLmlzV2FrZVVwID0gZmFsc2U7CisKKyAgICAgICAgICAgIHRyYW5zbGF0aW9uVGFibGVWYWxpZCA9IHByb2Nlc3NUcmlBeGlzVXNhZ2UocGFja2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNDRUxFUkFUSU9OX1hfQVhJUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNDRUxFUkFUSU9OX1lfQVhJUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNDRUxFUkFUSU9OX1pfQVhJUywgOS44MSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHWVJPTUVURVJfM0Q6CisgICAgICAgICAgICAvLyBIaWQgdW5pdCBkZWZhdWx0IGRlZ3JlZS9zCisgICAgICAgICAgICAvLyBBbmRyb2lkIHVuaXQgcmFkL3MKKyAgICAgICAgICAgIC8vIDEgZGVncmVlL3MgPSBwaS8xODAgcmFkL3MKKyAgICAgICAgICAgIG1GZWF0dXJlSW5mby50eXBlU3RyaW5nID0gU0VOU09SX1NUUklOR19UWVBFX0dZUk9TQ09QRTsKKyAgICAgICAgICAgIG1GZWF0dXJlSW5mby50eXBlID0gU0VOU09SX1RZUEVfR1lST1NDT1BFOworICAgICAgICAgICAgbUZlYXR1cmVJbmZvLmlzV2FrZVVwID0gZmFsc2U7CisKKyAgICAgICAgICAgIHRyYW5zbGF0aW9uVGFibGVWYWxpZCA9IHByb2Nlc3NUcmlBeGlzVXNhZ2UocGFja2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5HVUxBUl9WRUxPQ0lUWV9YX0FYSVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOR1VMQVJfVkVMT0NJVFlfWV9BWElTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTkdVTEFSX1ZFTE9DSVRZX1pfQVhJUywgTV9QSS8xODApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ09NUEFTU18zRDogeworICAgICAgICAgICAgLy8gSGlkIHVuaXQgZGVmYXVsdCBtR2F1c3MKKyAgICAgICAgICAgIC8vIEFuZHJvaWQgdW5pdCB1VAorICAgICAgICAgICAgLy8gMXVUICA9IDAuMSBuR2F1c3MKKyAgICAgICAgICAgIG1GZWF0dXJlSW5mby50eXBlU3RyaW5nID0gU0VOU09SX1NUUklOR19UWVBFX01BR05FVElDX0ZJRUxEOworICAgICAgICAgICAgbUZlYXR1cmVJbmZvLnR5cGUgPSBTRU5TT1JfVFlQRV9NQUdORVRJQ19GSUVMRDsKKworICAgICAgICAgICAgaWYgKCFwcm9jZXNzVHJpQXhpc1VzYWdlKHBhY2tldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFHTkVUSUNfRkxVWF9YX0FYSVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFHTkVUSUNfRkxVWF9ZX0FYSVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFHTkVUSUNfRkxVWF9aX0FYSVMsIDAuMSkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IEhpZFBhcnNlcjo6UmVwb3J0SXRlbSAqcFJlcG9ydEFjY3VyYWN5ID0gZmluZChwYWNrZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFHTkVUT01FVEVSX0FDQ1VSQUNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlkUGFyc2VyOjpSRVBPUlRfVFlQRV9JTlBVVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dFJlcG9ydElkKTsKKworICAgICAgICAgICAgaWYgKHBSZXBvcnRBY2N1cmFjeSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgTE9HX0UgPDwgIkNhbm5vdCBmaW5kIGFjY3VyYWN5IGZpZWxkIGluIHVzYWdlICIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmhleCA8PCB1c2FnZSA8PCBzdGQ6OmRlYyA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghcFJlcG9ydEFjY3VyYWN5LT5pc0J5dGVBbGlnbmVkKCkpIHsKKyAgICAgICAgICAgICAgICBMT0dfRSA8PCAiQWNjdXJhY3kgZmllbGQgbXVzdCBhbGlnbiB0byBieXRlIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwUmVwb3J0QWNjdXJhY3ktPm1pblJhdyAhPSAwIHx8IHBSZXBvcnRBY2N1cmFjeS0+bWF4UmF3ICE9IDIpIHsKKyAgICAgICAgICAgICAgICBMT0dfRSA8PCAiQWNjdXJhY3kgZmllbGQgdmFsdWUgcmFuZ2UgbXVzdCBiZSBbMCwgMl0iIDw8IExPR19FTkRMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUmVwb3J0VHJhbnNsYXRlUmVjb3JkIGFjY3VyYWN5UmVjb3JkID0geworICAgICAgICAgICAgICAgIC50eXBlID0gVFlQRV9BQ0NVUkFDWSwKKyAgICAgICAgICAgICAgICAubWF4VmFsdWUgPSAyLAorICAgICAgICAgICAgICAgIC5taW5WYWx1ZSA9IDAsCisgICAgICAgICAgICAgICAgLmJ5dGVPZmZzZXQgPSBwUmVwb3J0QWNjdXJhY3ktPmJpdE9mZnNldCAvIDgsCisgICAgICAgICAgICAgICAgLmJ5dGVTaXplID0gcFJlcG9ydEFjY3VyYWN5LT5iaXRTaXplIC8gOCwKKyAgICAgICAgICAgICAgICAuYSA9IDEsCisgICAgICAgICAgICAgICAgLmIgPSAxfTsKKyAgICAgICAgICAgIG1UcmFuc2xhdGVUYWJsZS5wdXNoX2JhY2soYWNjdXJhY3lSZWNvcmQpOworICAgICAgICAgICAgdHJhbnNsYXRpb25UYWJsZVZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgREVWSUNFX09SSUVOVEFUSU9OOgorICAgICAgICAgICAgdHJhbnNsYXRpb25UYWJsZVZhbGlkID0gcHJvY2Vzc1F1YXRlcm5pb25Vc2FnZShwYWNrZXRzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENVU1RPTTogeworICAgICAgICAgICAgaWYgKCFtRmVhdHVyZUluZm8uaXNBbmRyb2lkQ3VzdG9tKSB7CisgICAgICAgICAgICAgICAgTE9HX0UgPDwgIkludmFsaWQgYW5kcm9pZCBjdXN0b20gc2Vuc29yIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IEhpZFBhcnNlcjo6UmVwb3J0UGFja2V0ICpwUGFja2V0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHVzYWdlc1tdID0geworICAgICAgICAgICAgICAgIENVU1RPTV9WQUxVRV8xLCBDVVNUT01fVkFMVUVfMiwgQ1VTVE9NX1ZBTFVFXzMsCisgICAgICAgICAgICAgICAgQ1VTVE9NX1ZBTFVFXzQsIENVU1RPTV9WQUxVRV81LCBDVVNUT01fVkFMVUVfNgorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmcGFja2V0IDogcGFja2V0cykgeworICAgICAgICAgICAgICAgIGlmIChwYWNrZXQudHlwZSA9PSBIaWRQYXJzZXI6OlJFUE9SVF9UWVBFX0lOUFVUICYmIHN0ZDo6YW55X29mKAorICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0LnJlcG9ydHMuYmVnaW4oKSwgcGFja2V0LnJlcG9ydHMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICBbJnVzYWdlc10gKGNvbnN0IEhpZFBhcnNlcjo6UmVwb3J0SXRlbSAmZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OmZpbmQoc3RkOjpiZWdpbih1c2FnZXMpLCBzdGQ6OmVuZCh1c2FnZXMpLCBkLnVzYWdlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gc3RkOjplbmQodXNhZ2VzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pKSB7CisgICAgICAgICAgICAgICAgICAgIHBQYWNrZXQgPSAmcGFja2V0OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwUGFja2V0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBMT0dfRSA8PCAiQ2Fubm90IGZpbmQgQ1VTVE9NX1ZBTFVFX1ggaW4gY3VzdG9tIHNlbnNvciIgPDwgTE9HX0VOREw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRvdWJsZSByYW5nZSA9IDA7CisgICAgICAgICAgICBkb3VibGUgcmVzb2x1dGlvbiA9IDE7CisKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmZGlnZXN0IDogcFBhY2tldC0+cmVwb3J0cykgeworICAgICAgICAgICAgICAgIGlmIChkaWdlc3QubWluUmF3ID49IGRpZ2VzdC5tYXhSYXcpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HX0UgPDwgIkN1c3RvbWUgdXNhZ2UgIiA8PCBkaWdlc3QudXNhZ2UgPDwgIiwgbWluIG11c3QgPCBtYXgiIDw8IExPR19FTkRMOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFkaWdlc3QuaXNCeXRlQWxpZ25lZCgpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoZGlnZXN0LmJpdFNpemUgIT0gOCAmJiBkaWdlc3QuYml0U2l6ZSAhPSAxNiAmJiBkaWdlc3QuYml0U2l6ZSAhPSAzMikpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HX0UgPDwgIkN1c3RvbWUgdXNhZ2UgIiA8PCBzdGQ6OmhleCA8PCBkaWdlc3QudXNhZ2UgPDwgc3RkOjpoZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgZWFjaCBpbnB1dCBtdXN0IGJlIDgvMTYvMzIgYml0cyBhbmQgbXVzdCBhbGlnbiB0byBieXRlIGJvdW5kYXJ5IgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFJlcG9ydFRyYW5zbGF0ZVJlY29yZCByZWNvcmQgPSB7CisgICAgICAgICAgICAgICAgICAgIC5taW5WYWx1ZSA9IGRpZ2VzdC5taW5SYXcsCisgICAgICAgICAgICAgICAgICAgIC5tYXhWYWx1ZSA9IGRpZ2VzdC5tYXhSYXcsCisgICAgICAgICAgICAgICAgICAgIC5ieXRlT2Zmc2V0ID0gZGlnZXN0LmJpdE9mZnNldCAvIDgsCisgICAgICAgICAgICAgICAgICAgIC5ieXRlU2l6ZSA9IGRpZ2VzdC5iaXRTaXplIC8gOCwKKyAgICAgICAgICAgICAgICAgICAgLmEgPSBkaWdlc3QuYSwKKyAgICAgICAgICAgICAgICAgICAgLmIgPSBkaWdlc3QuYiwKKyAgICAgICAgICAgICAgICAgICAgLnR5cGUgPSBUWVBFX0ZMT0FUCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIHJhbmdlIGFuZCByZXNvbHV0aW9uCisgICAgICAgICAgICAgICAgcmFuZ2UgPSBzdGQ6Om1heChzdGQ6Om1heChzdGQ6OmFicygoZGlnZXN0Lm1heFJhdyArIGRpZ2VzdC5iKSAqIGRpZ2VzdC5hKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YWJzKChkaWdlc3QubWluUmF3ICsgZGlnZXN0LmIpICogZGlnZXN0LmEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlKTsKKyAgICAgICAgICAgICAgICByZXNvbHV0aW9uID0gc3RkOjptaW4oZGlnZXN0LmEsIHJlc29sdXRpb24pOworCisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkaWdlc3QuY291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobVRyYW5zbGF0ZVRhYmxlLnNpemUoKSA9PSAxNikgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HX0kgPDwgIkN1c3RvbSB1c2FnZSBoYXMgbW9yZSB0aGFuIDE2IGlucHV0cywgaWdub3JlIHRoZSByZXN0IiA8PCBMT0dfRU5ETDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlY29yZC5pbmRleCA9IG1UcmFuc2xhdGVUYWJsZS5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIG1UcmFuc2xhdGVUYWJsZS5wdXNoX2JhY2socmVjb3JkKTsKKyAgICAgICAgICAgICAgICAgICAgcmVjb3JkLmJ5dGVPZmZzZXQgKz0gZGlnZXN0LmJpdFNpemUgLyA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobVRyYW5zbGF0ZVRhYmxlLnNpemUoKSA9PSAxNikgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRmVhdHVyZUluZm8ubWF4UmFuZ2UgPSByYW5nZTsKKyAgICAgICAgICAgIG1GZWF0dXJlSW5mby5yZXNvbHV0aW9uID0gcmVzb2x1dGlvbjsKKyAgICAgICAgICAgIG1JbnB1dFJlcG9ydElkID0gcFBhY2tldC0+aWQ7CisgICAgICAgICAgICB0cmFuc2xhdGlvblRhYmxlVmFsaWQgPSAhbVRyYW5zbGF0ZVRhYmxlLmVtcHR5KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0kgPDwgInVuc3VwcG9ydGVkIHNlbnNvciB1c2FnZSAiIDw8IHVzYWdlIDw8IExPR19FTkRMOworICAgIH0KKworICAgIGJvb2wgc2Vuc29yVmFsaWQgPSB2YWxpZGF0ZUZlYXR1cmVWYWx1ZUFuZEJ1aWxkU2Vuc29yKCk7CisgICAgbVZhbGlkID0gdHJhbnNsYXRpb25UYWJsZVZhbGlkICYmIHNlbnNvclZhbGlkOworICAgIExPR19WIDw8ICJIaWRSYXdTZW5zb3IgaW5pdCwgdHJhbnNsYXRpb25UYWJsZVZhbGlkOiAiIDw8IHRyYW5zbGF0aW9uVGFibGVWYWxpZAorICAgICAgICAgIDw8ICIsIHNlbnNvclZhbGlkOiAiIDw8IHNlbnNvclZhbGlkIDw8IExPR19FTkRMOworfQorCitib29sIEhpZFJhd1NlbnNvcjo6cHJvY2Vzc1F1YXRlcm5pb25Vc2FnZShjb25zdCBzdGQ6OnZlY3RvcjxIaWRQYXJzZXI6OlJlcG9ydFBhY2tldD4gJnBhY2tldHMpIHsKKyAgICBjb25zdCBIaWRQYXJzZXI6OlJlcG9ydEl0ZW0gKnBSZXBvcnRRdWF0ZXJuaW9uCisgICAgICAgICAgICA9IGZpbmQocGFja2V0cywKKyAgICAgICAgICAgICAgICAgICBIaWQ6OlNlbnNvcjo6UmVwb3J0VXNhZ2U6Ok9SSUVOVEFUSU9OX1FVQVRFUk5JT04sCisgICAgICAgICAgICAgICAgICAgSGlkUGFyc2VyOjpSRVBPUlRfVFlQRV9JTlBVVCk7CisKKyAgICBpZiAocFJlcG9ydFF1YXRlcm5pb24gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgSGlkUGFyc2VyOjpSZXBvcnRJdGVtICZxdWF0ID0gKnBSZXBvcnRRdWF0ZXJuaW9uOworICAgIGlmICgocXVhdC5iaXRTaXplICE9IDE2ICYmIHF1YXQuYml0U2l6ZSAhPSAzMikgfHwgIXF1YXQuaXNCeXRlQWxpZ25lZCgpKSB7CisgICAgICAgIExPR19FIDw8ICJRdWF0ZXJuaW9uIHVzYWdlIGlucHV0IG11c3QgYmUgMTYgb3IgMzIgYml0cyBhbmQgYWxpZ25lZCBhdCBieXRlIGJvdW5kYXJ5IiA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGRvdWJsZSBtaW4sIG1heDsKKyAgICBxdWF0LmRlY29kZShxdWF0Lm1hc2socXVhdC5taW5SYXcpLCAmbWluKTsKKyAgICBxdWF0LmRlY29kZShxdWF0Lm1hc2socXVhdC5tYXhSYXcpLCAmbWF4KTsKKyAgICBpZiAocXVhdC5jb3VudCAhPSA0IHx8IG1pbiA+IC0xIHx8IG1heCA8IDEpIHsKKyAgICAgICAgTE9HX0UgPDwgIlF1YXRlcm5pb24gdXNhZ2UgbmVlZCA0IGlucHV0cyB3aXRoIHJhbmdlIFstMSwgMV0iIDw8IExPR19FTkRMOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHF1YXQubWluUmF3ID4gcXVhdC5tYXhSYXcpIHsKKyAgICAgICAgTE9HX0UgPDwgIlF1YXRlcm5pb24gdXNhZ2UgbWluIG11c3QgPD0gbWF4IiA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFJlcG9ydFRyYW5zbGF0ZVJlY29yZCByZWNvcmQgPSB7CisgICAgICAgIC5taW5WYWx1ZSA9IHF1YXQubWluUmF3LAorICAgICAgICAubWF4VmFsdWUgPSBxdWF0Lm1heFJhdywKKyAgICAgICAgLmJ5dGVPZmZzZXQgPSBxdWF0LmJpdE9mZnNldCAvIDgsCisgICAgICAgIC5ieXRlU2l6ZSA9IHF1YXQuYml0U2l6ZSAvIDgsCisgICAgICAgIC5iID0gcXVhdC5iLAorICAgICAgICAudHlwZSA9IFRZUEVfRkxPQVQsCisgICAgfTsKKworICAgIC8vIEFuZHJvaWQgWCBZIFogbWFwcyB0byBISUQgWCAtWiBZCisgICAgLy8gQW5kcm9pZCBvcmRlciB4eXp3LCBISUQgb3JkZXIgd3h5egorICAgIC8vIFgKKyAgICByZWNvcmQuaW5kZXggPSAwOworICAgIHJlY29yZC5hID0gcXVhdC5hOworICAgIHJlY29yZC5ieXRlT2Zmc2V0ID0gKHF1YXQuYml0T2Zmc2V0ICsgcXVhdC5iaXRTaXplKSAvIDg7CisgICAgbVRyYW5zbGF0ZVRhYmxlLnB1c2hfYmFjayhyZWNvcmQpOworICAgIC8vIFkKKyAgICByZWNvcmQuaW5kZXggPSAxOworICAgIHJlY29yZC5hID0gLXF1YXQuYTsKKyAgICByZWNvcmQuYnl0ZU9mZnNldCA9IChxdWF0LmJpdE9mZnNldCArIDMgKiBxdWF0LmJpdFNpemUpIC8gODsKKyAgICBtVHJhbnNsYXRlVGFibGUucHVzaF9iYWNrKHJlY29yZCk7CisgICAgLy8gWgorICAgIHJlY29yZC5pbmRleCA9IDI7CisgICAgcmVjb3JkLmEgPSBxdWF0LmE7CisgICAgcmVjb3JkLmJ5dGVPZmZzZXQgPSAocXVhdC5iaXRPZmZzZXQgKyAyICogcXVhdC5iaXRTaXplKSAvIDg7CisgICAgbVRyYW5zbGF0ZVRhYmxlLnB1c2hfYmFjayhyZWNvcmQpOworICAgIC8vIFcKKyAgICByZWNvcmQuaW5kZXggPSAzOworICAgIHJlY29yZC5hID0gcXVhdC5hOworICAgIHJlY29yZC5ieXRlT2Zmc2V0ID0gcXVhdC5iaXRPZmZzZXQgLyA4OworICAgIG1UcmFuc2xhdGVUYWJsZS5wdXNoX2JhY2socmVjb3JkKTsKKworICAgIG1GZWF0dXJlSW5mby50eXBlU3RyaW5nID0gU0VOU09SX1NUUklOR19UWVBFX1JPVEFUSU9OX1ZFQ1RPUjsKKyAgICBtRmVhdHVyZUluZm8udHlwZSA9IFNFTlNPUl9UWVBFX1JPVEFUSU9OX1ZFQ1RPUjsKKyAgICBtRmVhdHVyZUluZm8ubWF4UmFuZ2UgPSAxOworICAgIG1GZWF0dXJlSW5mby5yZXNvbHV0aW9uID0gcXVhdC5hOworICAgIG1GZWF0dXJlSW5mby5yZXBvcnRNb2RlRmxhZyA9IFNFTlNPUl9GTEFHX0NPTlRJTlVPVVNfTU9ERTsKKworICAgIG1JbnB1dFJlcG9ydElkID0gcXVhdC5pZDsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEhpZFJhd1NlbnNvcjo6cHJvY2Vzc1RyaUF4aXNVc2FnZShjb25zdCBzdGQ6OnZlY3RvcjxIaWRQYXJzZXI6OlJlcG9ydFBhY2tldD4gJnBhY2tldHMsCisgICAgICAgIHVpbnQzMl90IHVzYWdlWCwgdWludDMyX3QgdXNhZ2VZLCB1aW50MzJfdCB1c2FnZVosIGRvdWJsZSBkZWZhdWx0U2NhbGluZykgeworICAgIGNvbnN0IEhpZFBhcnNlcjo6UmVwb3J0SXRlbSAqcFJlcG9ydFggPSBmaW5kKHBhY2tldHMsIHVzYWdlWCwgSGlkUGFyc2VyOjpSRVBPUlRfVFlQRV9JTlBVVCk7CisgICAgY29uc3QgSGlkUGFyc2VyOjpSZXBvcnRJdGVtICpwUmVwb3J0WSA9IGZpbmQocGFja2V0cywgdXNhZ2VZLCBIaWRQYXJzZXI6OlJFUE9SVF9UWVBFX0lOUFVUKTsKKyAgICBjb25zdCBIaWRQYXJzZXI6OlJlcG9ydEl0ZW0gKnBSZXBvcnRaID0gZmluZChwYWNrZXRzLCB1c2FnZVosIEhpZFBhcnNlcjo6UkVQT1JUX1RZUEVfSU5QVVQpOworCisgICAgaWYgKHBSZXBvcnRYID09IG51bGxwdHIgfHwgcFJlcG9ydFkgPT0gbnVsbHB0cnx8IHBSZXBvcnRaID09IG51bGxwdHIpIHsKKyAgICAgICAgTE9HX0UgPDwgIlRocmVlIGF4aXMgc2Vuc29yIGRvZXMgbm90IGZpbmQgYWxsIDMgYXhpcyIgPDwgTE9HX0VOREw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBIaWRQYXJzZXI6OlJlcG9ydEl0ZW0gJnJlcG9ydFggPSAqcFJlcG9ydFg7CisgICAgY29uc3QgSGlkUGFyc2VyOjpSZXBvcnRJdGVtICZyZXBvcnRZID0gKnBSZXBvcnRZOworICAgIGNvbnN0IEhpZFBhcnNlcjo6UmVwb3J0SXRlbSAmcmVwb3J0WiA9ICpwUmVwb3J0WjsKKyAgICBpZiAocmVwb3J0WC5pZCAhPSByZXBvcnRZLmlkIHx8IHJlcG9ydFkuaWQgIT0gcmVwb3J0Wi5pZCkgeworICAgICAgICBMT0dfRSA8PCAiQWxsIDMgYXhpcyBzaG91bGQgYmUgaW4gdGhlIHNhbWUgcmVwb3J0IiA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAocmVwb3J0WC5taW5SYXcgPj0gcmVwb3J0WC5tYXhSYXcKKyAgICAgICAgICAgIHx8IHJlcG9ydFgubWluUmF3ICE9IHJlcG9ydFkubWluUmF3CisgICAgICAgICAgICB8fCByZXBvcnRYLm1heFJhdyAhPSByZXBvcnRZLm1heFJhdworICAgICAgICAgICAgfHwgcmVwb3J0WS5taW5SYXcgIT0gcmVwb3J0Wi5taW5SYXcKKyAgICAgICAgICAgIHx8IHJlcG9ydFkubWF4UmF3ICE9IHJlcG9ydFoubWF4UmF3KSB7CisgICAgICAgIExPR19FIDw8ICJBbGwgMyBheGlzIHNob3VsZCBoYXZlIHNhbWUgbWluIGFuZCBtYXggdmFsdWUgYW5kIG1pbiBtdXN0IDwgbWF4IiA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAocmVwb3J0WC5hICE9IHJlcG9ydFkuYSB8fCByZXBvcnRZLmEgIT0gcmVwb3J0WS5hKSB7CisgICAgICAgIExPR19FIDw8ICJBbGwgMyBheGlzIHNob3VsZCBoYXZlIHNhbWUgcmVzb2x1dGlvbiIgPDwgTE9HX0VOREw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHJlcG9ydFguY291bnQgIT0gMSB8fCByZXBvcnRZLmNvdW50ICE9IDEgfHwgcmVwb3J0Wi5jb3VudCAhPSAxCisgICAgICAgICAgICB8fCAocmVwb3J0WC5iaXRTaXplICE9IDE2ICYmIHJlcG9ydFguYml0U2l6ZSAhPSAzMikKKyAgICAgICAgICAgIHx8IHJlcG9ydFguYml0U2l6ZSAhPSByZXBvcnRZLmJpdFNpemUgfHwgcmVwb3J0WS5iaXRTaXplICE9IHJlcG9ydFouYml0U2l6ZQorICAgICAgICAgICAgfHwgIXJlcG9ydFguaXNCeXRlQWxpZ25lZCgpCisgICAgICAgICAgICB8fCAhcmVwb3J0WS5pc0J5dGVBbGlnbmVkKCkKKyAgICAgICAgICAgIHx8ICFyZXBvcnRaLmlzQnl0ZUFsaWduZWQoKSApIHsKKyAgICAgICAgTE9HX0UgPDwgIkFsbCAzIGF4aXMgc2hvdWxkIGhhdmUgY291bnQgPT0gMSwgc2FtZSBzaXplID09IDE2IG9yIDMyICIKKyAgICAgICAgICAgICAgImFuZCBhbGlnbiBhdCBieXRlIGJvdW5kYXJ5IiA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChyZXBvcnRYLnVuaXQgIT0gMCB8fCByZXBvcnRZLnVuaXQgIT0gMCB8fCByZXBvcnRaLnVuaXQgIT0gMCkgeworICAgICAgICBMT0dfRSA8PCAiU3BlY2lmaWVkIHVuaXQgZm9yIHVzYWdlIGlzIG5vdCBzdXBwb3J0ZWQiIDw8IExPR19FTkRMOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHJlcG9ydFguYSAhPSByZXBvcnRZLmEgfHwgcmVwb3J0WS5hICE9IHJlcG9ydFouYQorICAgICAgICB8fCByZXBvcnRYLmIgIT0gcmVwb3J0WS5iIHx8IHJlcG9ydFkuYiAhPSByZXBvcnRaLmIpIHsKKyAgICAgICAgTE9HX1cgPDwgIlNjYWxpbmcgZm9yIDMgYXhpcyBhcmUgZGlmZmVyZW50LiBJdCBpcyByZWNvbW1lbmRlZCB0byBrZWVwIHRoZW0gdGhlIHNhbWUiIDw8IExPR19FTkRMOworICAgIH0KKworICAgIC8vIHNldCBmZWF0dXJlcworICAgIG1GZWF0dXJlSW5mby5tYXhSYW5nZSA9IHN0ZDo6bWF4KAorICAgICAgICBzdGQ6OmFicygocmVwb3J0WC5tYXhSYXcgKyByZXBvcnRYLmIpICogcmVwb3J0WC5hKSwKKyAgICAgICAgc3RkOjphYnMoKHJlcG9ydFgubWluUmF3ICsgcmVwb3J0WC5iKSAqIHJlcG9ydFguYSkpOworICAgIG1GZWF0dXJlSW5mby5yZXNvbHV0aW9uID0gcmVwb3J0WC5hICogZGVmYXVsdFNjYWxpbmc7CisgICAgbUZlYXR1cmVJbmZvLnJlcG9ydE1vZGVGbGFnID0gU0VOU09SX0ZMQUdfQ09OVElOVU9VU19NT0RFOworCisgICAgUmVwb3J0VHJhbnNsYXRlUmVjb3JkIHJlY29yZCA9IHsKKyAgICAgICAgLm1pblZhbHVlID0gcmVwb3J0WC5taW5SYXcsCisgICAgICAgIC5tYXhWYWx1ZSA9IHJlcG9ydFgubWF4UmF3LAorICAgICAgICAuYnl0ZVNpemUgPSByZXBvcnRYLmJpdFNpemUgLyA4LAorICAgICAgICAudHlwZSA9IFRZUEVfRkxPQVQKKyAgICB9OworCisgICAgLy8gUmVvcmRlciBhbmQgc3dhcCBheGlzCisgICAgLy8KKyAgICAvLyBISUQgY2xhc3MgZGV2aWNlcyBhcmUgZW5jb3VyYWdlZCwgd2hlcmUgcG9zc2libGUsIHRvIHVzZSBhIHJpZ2h0LWhhbmRlZAorICAgIC8vIGNvb3JkaW5hdGUgc3lzdGVtLiBJZiBhIHVzZXIgaXMgZmFjaW5nIGEgZGV2aWNlLCByZXBvcnQgdmFsdWVzIHNob3VsZCBpbmNyZWFzZSBhcworICAgIC8vIGNvbnRyb2xzIGFyZSBtb3ZlZCBmcm9tIGxlZnQgdG8gcmlnaHQgKFgpLCBmcm9tIGZhciB0byBuZWFyIChZKSBhbmQgZnJvbSBoaWdoIHRvCisgICAgLy8gbG93IChaKS4KKyAgICAvLworCisgICAgLy8gQW5kcm9pZCBYIGF4aXMgPSBIaWQgWCBheGlzCisgICAgcmVjb3JkLmluZGV4ID0gMDsKKyAgICByZWNvcmQuYSA9IHJlcG9ydFguYSAqIGRlZmF1bHRTY2FsaW5nOworICAgIHJlY29yZC5iID0gcmVwb3J0WC5iOworICAgIHJlY29yZC5ieXRlT2Zmc2V0ID0gcmVwb3J0WC5iaXRPZmZzZXQgLyA4OworICAgIG1UcmFuc2xhdGVUYWJsZS5wdXNoX2JhY2socmVjb3JkKTsKKworICAgIC8vIEFuZHJvaWQgWSBheGlzID0gLSBIaWQgWiBheGlzCisgICAgcmVjb3JkLmluZGV4ID0gMTsKKyAgICByZWNvcmQuYSA9IC1yZXBvcnRaLmEgKiBkZWZhdWx0U2NhbGluZzsKKyAgICByZWNvcmQuYiA9IHJlcG9ydFouYjsKKyAgICByZWNvcmQuYnl0ZU9mZnNldCA9IHJlcG9ydFouYml0T2Zmc2V0IC8gODsKKyAgICBtVHJhbnNsYXRlVGFibGUucHVzaF9iYWNrKHJlY29yZCk7CisKKyAgICAvLyBBbmRyb2lkIFogYXhpcyA9IEhpZCBZIGF4aXMKKyAgICByZWNvcmQuaW5kZXggPSAyOworICAgIHJlY29yZC5hID0gcmVwb3J0WS5hICogZGVmYXVsdFNjYWxpbmc7CisgICAgcmVjb3JkLmIgPSByZXBvcnRZLmI7CisgICAgcmVjb3JkLmJ5dGVPZmZzZXQgPSByZXBvcnRZLmJpdE9mZnNldCAvIDg7CisgICAgbVRyYW5zbGF0ZVRhYmxlLnB1c2hfYmFjayhyZWNvcmQpOworCisgICAgbUlucHV0UmVwb3J0SWQgPSByZXBvcnRYLmlkOworICAgIHJldHVybiB0cnVlOworfQorCitjb25zdCBIaWRQYXJzZXI6OlJlcG9ydEl0ZW0gKkhpZFJhd1NlbnNvcjo6ZmluZCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8SGlkUGFyc2VyOjpSZXBvcnRQYWNrZXQ+ICZwYWNrZXRzLAorICAgICAgICB1bnNpZ25lZCBpbnQgdXNhZ2UsIGludCB0eXBlLCBpbnQgaWQpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnBhY2tldCA6IHBhY2tldHMpIHsKKyAgICAgICAgaWYgKHBhY2tldC50eXBlICE9IHR5cGUpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGF1dG8gaSA9IHN0ZDo6ZmluZF9pZigKKyAgICAgICAgICAgICAgICBwYWNrZXQucmVwb3J0cy5iZWdpbigpLCBwYWNrZXQucmVwb3J0cy5lbmQoKSwKKyAgICAgICAgICAgICAgICBbdXNhZ2UsIGlkXShjb25zdCBIaWRQYXJzZXI6OlJlcG9ydEl0ZW0gJnApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHAudXNhZ2UgPT0gdXNhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoaWQgPT0gLTEgfHwgcC5pZCA9PSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGlkKSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmIChpICE9IHBhY2tldC5yZXBvcnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gJigqaSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9OworCit2b2lkIEhpZFJhd1NlbnNvcjo6aW5pdEZlYXR1cmVWYWx1ZUZyb21IaWREZXZpY2VJbmZvKAorICAgICAgICBGZWF0dXJlVmFsdWUgKmZlYXR1cmVWYWx1ZSwgY29uc3QgSGlkRGV2aWNlOjpIaWREZXZpY2VJbmZvICZpbmZvKSB7CisgICAgZmVhdHVyZVZhbHVlLT5uYW1lID0gaW5mby5uYW1lOworCisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHNzOworICAgIHNzIDw8IGluZm8uYnVzVHlwZSA8PCAiICIKKyAgICAgICA8PCBzdGQ6OmhleCA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OnNldHcoNCkgPDwgaW5mby52ZW5kb3JJZAorICAgICAgIDw8ICI6IiA8PCBzdGQ6OnNldHcoNCkgPDwgaW5mby5wcm9kdWN0SWQ7CisgICAgZmVhdHVyZVZhbHVlLT52ZW5kb3IgPSBzcy5zdHIoKTsKKworICAgIGZlYXR1cmVWYWx1ZS0+cGVybWlzc2lvbiA9ICIiOworICAgIGZlYXR1cmVWYWx1ZS0+dHlwZVN0cmluZyA9ICIiOworICAgIGZlYXR1cmVWYWx1ZS0+dHlwZSA9IC0xOyAvLyBpbnZhbGlkIHR5cGUKKyAgICBmZWF0dXJlVmFsdWUtPnZlcnNpb24gPSAxOworCisgICAgZmVhdHVyZVZhbHVlLT5tYXhSYW5nZSA9IC0xLmY7CisgICAgZmVhdHVyZVZhbHVlLT5yZXNvbHV0aW9uID0gRkxUX01BWDsKKyAgICBmZWF0dXJlVmFsdWUtPnBvd2VyID0gMS5mOyAvLyBkZWZhdWx0IHZhbHVlLCBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgc291cmNlIHlldAorCisgICAgZmVhdHVyZVZhbHVlLT5taW5EZWxheSA9IDA7CisgICAgZmVhdHVyZVZhbHVlLT5tYXhEZWxheSA9IDA7CisKKyAgICBmZWF0dXJlVmFsdWUtPmZpZm9TaXplID0gMDsKKyAgICBmZWF0dXJlVmFsdWUtPmZpZm9NYXhTaXplID0gMDsKKworICAgIGZlYXR1cmVWYWx1ZS0+cmVwb3J0TW9kZUZsYWcgPSBTRU5TT1JfRkxBR19TUEVDSUFMX1JFUE9SVElOR19NT0RFOworICAgIGZlYXR1cmVWYWx1ZS0+aXNXYWtlVXAgPSBmYWxzZTsKKyAgICBtZW1zZXQoZmVhdHVyZVZhbHVlLT51dWlkLCAwLCBzaXplb2YoZmVhdHVyZVZhbHVlLT51dWlkKSk7CisgICAgZmVhdHVyZVZhbHVlLT5pc0FuZHJvaWRDdXN0b20gPSBmYWxzZTsKK30KKworYm9vbCBIaWRSYXdTZW5zb3I6OnBvcHVsYXRlRmVhdHVyZVZhbHVlRnJvbUZlYXR1cmVSZXBvcnQoCisgICAgICAgIEZlYXR1cmVWYWx1ZSAqZmVhdHVyZVZhbHVlLCBjb25zdCBzdGQ6OnZlY3RvcjxIaWRQYXJzZXI6OlJlcG9ydFBhY2tldD4gJnBhY2tldHMpIHsKKyAgICBTUChIaWREZXZpY2UpIGRldmljZSA9IFBST01PVEUobURldmljZSk7CisgICAgaWYgKGRldmljZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWZmZXI7CisgICAgZm9yIChjb25zdCBhdXRvICZwYWNrZXQgOiBwYWNrZXRzKSB7CisgICAgICAgIGlmIChwYWNrZXQudHlwZSAhPSBIaWRQYXJzZXI6OlJFUE9SVF9UWVBFX0ZFQVRVUkUpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFkZXZpY2UtPmdldEZlYXR1cmUocGFja2V0LmlkLCAmYnVmZmVyKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnN0cmluZyBzdHI7CisgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBIaWQ6OlNlbnNvcjo6UHJvcGVydHlVc2FnZTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICYgciA6IHBhY2tldC5yZXBvcnRzKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHIudXNhZ2UpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEZSSUVORExZX05BTUU6CisgICAgICAgICAgICAgICAgICAgIGlmICghci5pc0J5dGVBbGlnbmVkKCkgfHwgci5iaXRTaXplICE9IDE2IHx8IHIuY291bnQgPCAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZhbGlkIGZyaWVuZGx5IG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWNvZGVTdHJpbmcociwgYnVmZmVyLCAmc3RyKSAmJiAhc3RyLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVWYWx1ZS0+bmFtZSA9IHN0cjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNFTlNPUl9NQU5VRkFDVFVSRVI6CisgICAgICAgICAgICAgICAgICAgIGlmICghci5pc0J5dGVBbGlnbmVkKCkgfHwgci5iaXRTaXplICE9IDE2IHx8IHIuY291bnQgPCAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZhbGlkIG1hbnVmYWN0dXJlcgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29kZVN0cmluZyhyLCBidWZmZXIsICZzdHIpICYmICFzdHIuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZVZhbHVlLT52ZW5kb3IgPSBzdHI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQRVJTSVNURU5UX1VOSVFVRV9JRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFyLmlzQnl0ZUFsaWduZWQoKSB8fCByLmJpdFNpemUgIT0gMTYgfHwgci5jb3VudCA8IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludmFsaWQgdW5pcXVlIGlkIHN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29kZVN0cmluZyhyLCBidWZmZXIsICZzdHIpICYmICFzdHIuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZVZhbHVlLT51bmlxdWVJZCA9IHN0cjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNFTlNPUl9ERVNDUklQVElPTjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFyLmlzQnl0ZUFsaWduZWQoKSB8fCByLmJpdFNpemUgIT0gMTYgfHwgci5jb3VudCA8IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoci5iaXRPZmZzZXQgLyA4ICsgci5jb3VudCAqIDIpID4gYnVmZmVyLnNpemUoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludmFsaWQgZGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWNvZGVTdHJpbmcociwgYnVmZmVyLCAmc3RyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUZlYXR1cmVJbmZvLmlzQW5kcm9pZEN1c3RvbSA9IGRldGVjdEFuZHJvaWRDdXN0b21TZW5zb3Ioc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgY2FyZSBhYm91dCBvdGhlcnMKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSGlkUmF3U2Vuc29yOjp2YWxpZGF0ZUZlYXR1cmVWYWx1ZUFuZEJ1aWxkU2Vuc29yKCkgeworICAgIGlmIChtRmVhdHVyZUluZm8ubmFtZS5lbXB0eSgpIHx8IG1GZWF0dXJlSW5mby52ZW5kb3IuZW1wdHkoKSB8fCBtRmVhdHVyZUluZm8udHlwZVN0cmluZy5lbXB0eSgpCisgICAgICAgICAgICB8fCBtRmVhdHVyZUluZm8udHlwZSA8PSAwIHx8IG1GZWF0dXJlSW5mby5tYXhSYW5nZSA8PSAwCisgICAgICAgICAgICB8fCBtRmVhdHVyZUluZm8ucmVzb2x1dGlvbiA8PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1GZWF0dXJlSW5mby5yZXBvcnRNb2RlRmxhZykgeworICAgICAgICBjYXNlIFNFTlNPUl9GTEFHX0NPTlRJTlVPVVNfTU9ERToKKyAgICAgICAgY2FzZSBTRU5TT1JfRkxBR19PTl9DSEFOR0VfTU9ERToKKyAgICAgICAgICAgIGlmIChtRmVhdHVyZUluZm8ubWluRGVsYXkgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1GZWF0dXJlSW5mby5tYXhEZWxheSAhPSAwICYmIG1GZWF0dXJlSW5mby5tYXhEZWxheSA8IG1GZWF0dXJlSW5mby5taW5EZWxheSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNFTlNPUl9GTEFHX09ORV9TSE9UX01PREU6CisgICAgICAgICAgICBpZiAobUZlYXR1cmVJbmZvLm1pbkRlbGF5ICE9IC0xICYmIG1GZWF0dXJlSW5mby5tYXhEZWxheSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0VOU09SX0ZMQUdfU1BFQ0lBTF9SRVBPUlRJTkdfTU9ERToKKyAgICAgICAgICAgIGlmIChtRmVhdHVyZUluZm8ubWluRGVsYXkgIT0gLTEgJiYgbUZlYXR1cmVJbmZvLm1heERlbGF5ICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChtRmVhdHVyZUluZm8uZmlmb01heFNpemUgPCBtRmVhdHVyZUluZm8uZmlmb1NpemUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIGluaXRpYWxpemUgdXVpZCBmaWVsZCwgdXNlIG5hbWUsIHZlbmRvciBhbmQgdW5pcXVlSWQKKyAgICBpZiAobUZlYXR1cmVJbmZvLm5hbWUuc2l6ZSgpID49IDQKKyAgICAgICAgICAgICYmIG1GZWF0dXJlSW5mby52ZW5kb3Iuc2l6ZSgpID49IDQKKyAgICAgICAgICAgICYmIG1GZWF0dXJlSW5mby50eXBlU3RyaW5nLnNpemUoKSA+PSA0CisgICAgICAgICAgICAmJiBtRmVhdHVyZUluZm8udW5pcXVlSWQuc2l6ZSgpID49IDQpIHsKKyAgICAgICAgdWludDMyX3QgdG1wWzRdLCBoOworICAgICAgICBzdGQ6Omhhc2g8c3RkOjpzdHJpbmc+IHN0cmluZ0hhc2g7CisgICAgICAgIGggPSBzdHJpbmdIYXNoKG1GZWF0dXJlSW5mby51bmlxdWVJZCk7CisgICAgICAgIHRtcFswXSA9IHN0cmluZ0hhc2gobUZlYXR1cmVJbmZvLm5hbWUpIF4gaDsKKyAgICAgICAgdG1wWzFdID0gc3RyaW5nSGFzaChtRmVhdHVyZUluZm8udmVuZG9yKSBeIGg7CisgICAgICAgIHRtcFsyXSA9IHN0cmluZ0hhc2gobUZlYXR1cmVJbmZvLnR5cGVTdHJpbmcpIF4gaDsKKyAgICAgICAgdG1wWzNdID0gdG1wWzBdIF4gdG1wWzFdIF4gdG1wWzJdOworICAgICAgICBtZW1jcHkobUZlYXR1cmVJbmZvLnV1aWQsIHRtcCwgc2l6ZW9mKG1GZWF0dXJlSW5mby51dWlkKSk7CisgICAgfQorCisgICAgbVNlbnNvciA9IChzZW5zb3JfdCkgeworICAgICAgICBtRmVhdHVyZUluZm8ubmFtZS5jX3N0cigpLCAgICAgICAgICAgICAgICAgLy8gbmFtZQorICAgICAgICBtRmVhdHVyZUluZm8udmVuZG9yLmNfc3RyKCksICAgICAgICAgICAgICAgLy8gdmVuZG9yCisgICAgICAgIG1GZWF0dXJlSW5mby52ZXJzaW9uLCAgICAgICAgICAgICAgICAgICAgICAvLyB2ZXJzaW9uCisgICAgICAgIC0xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUsIGR1bW15IG51bWJlciBoZXJlCisgICAgICAgIG1GZWF0dXJlSW5mby50eXBlLAorICAgICAgICBtRmVhdHVyZUluZm8ubWF4UmFuZ2UsICAgICAgICAgICAgICAgICAgICAgLy8gbWF4UmFuZ2UKKyAgICAgICAgbUZlYXR1cmVJbmZvLnJlc29sdXRpb24sICAgICAgICAgICAgICAgICAgIC8vIHJlc29sdXRpb24KKyAgICAgICAgbUZlYXR1cmVJbmZvLnBvd2VyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvd2VyCisgICAgICAgIG1GZWF0dXJlSW5mby5taW5EZWxheSwgICAgICAgICAgICAgICAgICAgICAvLyBtaW5EZWxheQorICAgICAgICAodWludDMyX3QpbUZlYXR1cmVJbmZvLmZpZm9TaXplLCAgICAgICAgICAgLy8gZmlmb1Jlc2VydmVkRXZlbnRDb3VudAorICAgICAgICAodWludDMyX3QpbUZlYXR1cmVJbmZvLmZpZm9NYXhTaXplLCAgICAgICAgLy8gZmlmb01heEV2ZW50Q291bnQKKyAgICAgICAgbUZlYXR1cmVJbmZvLnR5cGVTdHJpbmcuY19zdHIoKSwgICAgICAgICAgIC8vIHR5cGUgc3RyaW5nCisgICAgICAgIG1GZWF0dXJlSW5mby5wZXJtaXNzaW9uLmNfc3RyKCksICAgICAgICAgICAvLyByZXF1aXJlZFBlcm1pc3Npb24KKyAgICAgICAgKGxvbmcpbUZlYXR1cmVJbmZvLm1heERlbGF5LCAgICAgICAgICAgICAgIC8vIG1heERlbGF5CisgICAgICAgIG1GZWF0dXJlSW5mby5yZXBvcnRNb2RlRmxhZyB8IChtRmVhdHVyZUluZm8uaXNXYWtlVXAgPyAxIDogMCksCisgICAgICAgIHsgTlVMTCwgTlVMTCB9CisgICAgfTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBIaWRSYXdTZW5zb3I6OmRlY29kZVN0cmluZygKKyAgICAgICAgY29uc3QgSGlkUGFyc2VyOjpSZXBvcnRJdGVtICZyZXBvcnQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZidWZmZXIsIHN0ZDo6c3RyaW5nICpkKSB7CisgICAgaWYgKCFyZXBvcnQuaXNCeXRlQWxpZ25lZCgpIHx8IHJlcG9ydC5iaXRTaXplICE9IDE2IHx8IHJlcG9ydC5jb3VudCA8IDEpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNpemVfdCBvZmZzZXQgPSByZXBvcnQuYml0T2Zmc2V0IC8gODsKKyAgICBpZiAob2Zmc2V0ICsgcmVwb3J0LmNvdW50ICogMiA+IGJ1ZmZlci5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBkYXRhKHJlcG9ydC5jb3VudCk7CisgICAgYXV0byBpID0gZGF0YS5iZWdpbigpOworICAgIGF1dG8gaiA9IGJ1ZmZlci5iZWdpbigpICsgb2Zmc2V0OworICAgIGZvciAoIDsgaSAhPSBkYXRhLmVuZCgpOyArK2ksIGogKz0gc2l6ZW9mKHVpbnQxNl90KSkgeworICAgICAgICAvLyBoaWQgc3BlY2lmaWVkIGxpdHRsZSBlbmRpYW4KKyAgICAgICAgKmkgPSAqaiArICgqKGogKyAxKSA8PCA4KTsKKyAgICB9CisgICAgc3RkOjp3c3RyaW5nIHdzdHIoZGF0YS5iZWdpbigpLCBkYXRhLmVuZCgpKTsKKworICAgIHN0ZDo6d3N0cmluZ19jb252ZXJ0PHN0ZDo6Y29kZWN2dF91dGY4PHdjaGFyX3Q+LCB3Y2hhcl90PiBjb252ZXJ0ZXI7CisgICAgKmQgPSBjb252ZXJ0ZXIudG9fYnl0ZXMod3N0cik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzcGxpdChjb25zdCBzdGQ6OnN0cmluZyAmdGV4dCwgY2hhciBzZXApIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdG9rZW5zOworICAgIHNpemVfdCBzdGFydCA9IDAsIGVuZCA9IDA7CisgICAgd2hpbGUgKChlbmQgPSB0ZXh0LmZpbmQoc2VwLCBzdGFydCkpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIGlmIChlbmQgIT0gc3RhcnQpIHsKKyAgICAgICAgICAgIHRva2Vucy5wdXNoX2JhY2sodGV4dC5zdWJzdHIoc3RhcnQsIGVuZCAtIHN0YXJ0KSk7CisgICAgICAgIH0KKyAgICAgICAgc3RhcnQgPSBlbmQgKyAxOworICAgIH0KKyAgICBpZiAoZW5kICE9IHN0YXJ0KSB7CisgICAgICAgIHRva2Vucy5wdXNoX2JhY2sodGV4dC5zdWJzdHIoc3RhcnQpKTsKKyAgICB9CisgICAgcmV0dXJuIHRva2VuczsKK30KKworYm9vbCBIaWRSYXdTZW5zb3I6OmRldGVjdEFuZHJvaWRDdXN0b21TZW5zb3IoY29uc3Qgc3RkOjpzdHJpbmcgJmRlc2NyaXB0aW9uKSB7CisgICAgc2l6ZV90IG51bGxQb3NpdGlvbiA9IGRlc2NyaXB0aW9uLmZpbmQoJ1wwJyk7CisgICAgaWYgKG51bGxQb3NpdGlvbiA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHByZWZpeCgiI0FORFJPSUQjIik7CisgICAgaWYgKGRlc2NyaXB0aW9uLmZpbmQocHJlZml4LCBudWxsUG9zaXRpb24gKyAxKSAhPSBudWxsUG9zaXRpb24gKyAxKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBzdHIoZGVzY3JpcHRpb24uY19zdHIoKSArIG51bGxQb3NpdGlvbiArIDEgKyBwcmVmaXguc2l6ZSgpKTsKKworICAgIC8vIEZvcm1hdCBmb3IgcHJlZGVmaW5lZCBzZW5zb3IgdHlwZXM6CisgICAgLy8gI0FORFJPSUQjbm4sW0N8WHxUfFNdLFtCfDBdLFtXfE5dCisgICAgLy8gRm9ybWF0IGZvciB2ZW5kb3IgdHlwZSBzZW5zb3IKKyAgICAvLyAjQU5EUk9JRCN4eHgueXl5Lnp6eixbQ3xYfFR8U10sW0J8MF0sW1d8Tl0KKyAgICAvLworICAgIC8vIEM6IGNvbnRpbnVvdXMKKyAgICAvLyBYOiBvbi1jaGFuZ2UKKyAgICAvLyBUOiBvbmUtc2hvdAorICAgIC8vIFM6IHNwZWNpYWwgdHJpZ2dlcgorICAgIC8vCisgICAgLy8gQjogYm9keSBwZXJtaXNzaW9uCisgICAgLy8gMDogbm8gcGVybWlzc2lvbiByZXF1aXJlZAorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzZWdtZW50czsKKyAgICBzaXplX3Qgc3RhcnQgPSAwLCBlbmQgPSAwOworICAgIHdoaWxlICgoZW5kID0gc3RyLmZpbmQoJywnLCBzdGFydCkpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIGlmIChlbmQgIT0gc3RhcnQpIHsKKyAgICAgICAgICAgIHNlZ21lbnRzLnB1c2hfYmFjayhzdHIuc3Vic3RyKHN0YXJ0LCBlbmQgLSBzdGFydCkpOworICAgICAgICB9CisgICAgICAgIHN0YXJ0ID0gZW5kICsgMTsKKyAgICB9CisgICAgaWYgKGVuZCAhPSBzdGFydCkgeworICAgICAgICBzZWdtZW50cy5wdXNoX2JhY2soc3RyLnN1YnN0cihzdGFydCkpOworICAgIH0KKworICAgIGlmIChzZWdtZW50cy5zaXplKCkgPCA0KSB7CisgICAgICAgIExPR19FIDw8ICJOb3QgZW5vdWdoIHNlZ21lbnRzIGluIGFuZHJvaWQgY3VzdG9tIGRlc2NyaXB0aW9uIiA8PCBMT0dfRU5ETDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIHR5cGUKKyAgICBib29sIHR5cGVQYXJzZWQgPSBmYWxzZTsKKyAgICBpZiAoIXNlZ21lbnRzWzBdLmVtcHR5KCkpIHsKKyAgICAgICAgaWYgKDo6aXNkaWdpdChzZWdtZW50c1swXVswXSkpIHsKKyAgICAgICAgICAgIGludCB0eXBlID0gOjphdG9pKHNlZ21lbnRzWzBdLmNfc3RyKCkpOworICAgICAgICAgICAgLy8gYWxsIHN1cHBvcnRlZCB0eXBlcyBoZXJlCisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNFTlNPUl9UWVBFX0hFQVJUX1JBVEU6CisgICAgICAgICAgICAgICAgICAgIG1GZWF0dXJlSW5mby50eXBlID0gU0VOU09SX1RZUEVfSEVBUlRfUkFURTsKKyAgICAgICAgICAgICAgICAgICAgbUZlYXR1cmVJbmZvLnR5cGVTdHJpbmcgPSBTRU5TT1JfU1RSSU5HX1RZUEVfSEVBUlRfUkFURTsKKyAgICAgICAgICAgICAgICAgICAgdHlwZVBhcnNlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU0VOU09SX1RZUEVfQU1CSUVOVF9URU1QRVJBVFVSRToKKyAgICAgICAgICAgICAgICAgICAgbUZlYXR1cmVJbmZvLnR5cGUgPSBTRU5TT1JfVFlQRV9BTUJJRU5UX1RFTVBFUkFUVVJFOworICAgICAgICAgICAgICAgICAgICBtRmVhdHVyZUluZm8udHlwZVN0cmluZyA9IFNFTlNPUl9TVFJJTkdfVFlQRV9BTUJJRU5UX1RFTVBFUkFUVVJFOworICAgICAgICAgICAgICAgICAgICB0eXBlUGFyc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjYXNlIFNFTlNPUl9UWVBFX0xJR0hUOgorICAgICAgICAgICAgICAgICAgICBtRmVhdHVyZUluZm8udHlwZSA9IFNFTlNPUl9UWVBFX0xJR0hUOworICAgICAgICAgICAgICAgICAgICBtRmVhdHVyZUluZm8udHlwZVN0cmluZyA9IFNFTlNPUl9TVFJJTkdfVFlQRV9MSUdIVDsKKyAgICAgICAgICAgICAgICAgICAgdHlwZVBhcnNlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU0VOU09SX1RZUEVfUFJFU1NVUkU6CisgICAgICAgICAgICAgICAgICAgIG1GZWF0dXJlSW5mby50eXBlID0gU0VOU09SX1RZUEVfUFJFU1NVUkU7CisgICAgICAgICAgICAgICAgICAgIG1GZWF0dXJlSW5mby50eXBlU3RyaW5nID0gU0VOU09SX1NUUklOR19UWVBFX1BSRVNTVVJFOworICAgICAgICAgICAgICAgICAgICB0eXBlUGFyc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTE9HX1cgPDwgIkFuZHJvaWQgdHlwZSAiIDw8IHR5cGUgPDwgIiBoYXMgbm90IGJlZW4gc3VwcG9ydGVkIHlldCIgPDwgTE9HX0VOREw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gYXNzdW1lIGEgeHh4Lnl5eS56enogZm9ybWF0CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gczsKKyAgICAgICAgICAgIGJvb2wgbGFzdElzRG90ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAoYXV0byBjIDogc2VnbWVudHNbMF0pIHsKKyAgICAgICAgICAgICAgICBpZiAoOjppc2FscGhhKGMpKSB7CisgICAgICAgICAgICAgICAgICAgIHMgPDwgc3RhdGljX2Nhc3Q8Y2hhcj4oYyk7CisgICAgICAgICAgICAgICAgICAgIGxhc3RJc0RvdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWxhc3RJc0RvdCAmJiBjID09ICcuJykgeworICAgICAgICAgICAgICAgICAgICBzIDw8IHN0YXRpY19jYXN0PGNoYXI+KGMpOworICAgICAgICAgICAgICAgICAgICBsYXN0SXNEb3QgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzLnN0cigpID09IHNlZ21lbnRzWzBdKSB7CisgICAgICAgICAgICAgICAgbUZlYXR1cmVJbmZvLnR5cGUgPSBTRU5TT1JfVFlQRV9ERVZJQ0VfUFJJVkFURV9CQVNFOworICAgICAgICAgICAgICAgIG1GZWF0dXJlSW5mby50eXBlU3RyaW5nID0gQ1VTVE9NX1RZUEVfUFJFRklYICsgcy5zdHIoKTsKKyAgICAgICAgICAgICAgICB0eXBlUGFyc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHJlcG9ydGluZyB0eXBlCisgICAgYm9vbCByZXBvcnRpbmdNb2RlUGFyc2VkID0gZmFsc2U7CisgICAgaWYgKHNlZ21lbnRzWzFdLnNpemUoKSA9PSAxKSB7CisgICAgICAgIHN3aXRjaCAoc2VnbWVudHNbMV1bMF0pIHsKKyAgICAgICAgICAgIGNhc2UgJ0MnOgorICAgICAgICAgICAgICAgIG1GZWF0dXJlSW5mby5yZXBvcnRNb2RlRmxhZyA9IFNFTlNPUl9GTEFHX0NPTlRJTlVPVVNfTU9ERTsKKyAgICAgICAgICAgICAgICByZXBvcnRpbmdNb2RlUGFyc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1gnOgorICAgICAgICAgICAgICAgIG1GZWF0dXJlSW5mby5yZXBvcnRNb2RlRmxhZyA9IFNFTlNPUl9GTEFHX09OX0NIQU5HRV9NT0RFOworICAgICAgICAgICAgICAgIHJlcG9ydGluZ01vZGVQYXJzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnVCc6CisgICAgICAgICAgICAgICAgbUZlYXR1cmVJbmZvLnJlcG9ydE1vZGVGbGFnID0gU0VOU09SX0ZMQUdfT05FX1NIT1RfTU9ERTsKKyAgICAgICAgICAgICAgICByZXBvcnRpbmdNb2RlUGFyc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1MnOgorICAgICAgICAgICAgICAgIG1GZWF0dXJlSW5mby5yZXBvcnRNb2RlRmxhZyA9IFNFTlNPUl9GTEFHX1NQRUNJQUxfUkVQT1JUSU5HX01PREU7CisgICAgICAgICAgICAgICAgcmVwb3J0aW5nTW9kZVBhcnNlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR19FIDw8ICJVbmRlZmluZWQgcmVwb3J0aW5nIG1vZGUgZGVzaWduYXRpb24gIiA8PCBzZWdtZW50c1sxXSA8PCBMT0dfRU5ETDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHBlcm1pc3Npb24gcGFyc2VkCisgICAgYm9vbCBwZXJtaXNzaW9uUGFyc2VkID0gZmFsc2U7CisgICAgaWYgKHNlZ21lbnRzWzJdLnNpemUoKSA9PSAxKSB7CisgICAgICAgIHN3aXRjaCAoc2VnbWVudHNbMl1bMF0pIHsKKyAgICAgICAgICAgIGNhc2UgJ0InOgorICAgICAgICAgICAgICAgIG1GZWF0dXJlSW5mby5wZXJtaXNzaW9uID0gU0VOU09SX1BFUk1JU1NJT05fQk9EWV9TRU5TT1JTOworICAgICAgICAgICAgICAgIHBlcm1pc3Npb25QYXJzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnMCc6CisgICAgICAgICAgICAgICAgbUZlYXR1cmVJbmZvLnBlcm1pc3Npb24gPSAiIjsKKyAgICAgICAgICAgICAgICBwZXJtaXNzaW9uUGFyc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HX0UgPDwgIlVuZGVmaW5lZCBwZXJtaXNzaW9uIGRlc2lnbmF0aW9uICIgPDwgc2VnbWVudHNbMl0gPDwgTE9HX0VOREw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB3YWtlIHVwCisgICAgYm9vbCB3YWtlVXBQYXJzZWQgPSBmYWxzZTsKKyAgICBpZiAoc2VnbWVudHNbM10uc2l6ZSgpID09IDEpIHsKKyAgICAgICAgc3dpdGNoIChzZWdtZW50c1szXVswXSkgeworICAgICAgICAgICAgY2FzZSAnVyc6CisgICAgICAgICAgICAgICAgbUZlYXR1cmVJbmZvLmlzV2FrZVVwID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3YWtlVXBQYXJzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnTic6CisgICAgICAgICAgICAgICAgbUZlYXR1cmVJbmZvLmlzV2FrZVVwID0gZmFsc2U7CisgICAgICAgICAgICAgICAgd2FrZVVwUGFyc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HX0UgPDwgIlVuZGVmaW5lZCB3YWtlIHVwIGRlc2lnbmF0aW9uICIgPDwgc2VnbWVudHNbM10gPDwgTE9HX0VOREw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQgcmV0ID0gdHlwZVBhcnNlZCAmJiByZXBvcnRpbmdNb2RlUGFyc2VkICYmIHBlcm1pc3Npb25QYXJzZWQgJiYgd2FrZVVwUGFyc2VkOworICAgIGlmICghcmV0KSB7CisgICAgICAgIExPR19EIDw8ICJkZXRlY3RBbmRyb2lkQ3VzdG9tU2Vuc29yIHR5cGVQYXJzZWQ6ICIgPDwgdHlwZVBhcnNlZAorICAgICAgICAgICAgICA8PCAiIHJlcG9ydGluZ01vZGVQYXJzZWQ6ICIgIDw8IHJlcG9ydGluZ01vZGVQYXJzZWQKKyAgICAgICAgICAgICAgPDwgIiBwZXJtaXNzaW9uUGFyc2VkOiAiIDw8IHBlcm1pc3Npb25QYXJzZWQKKyAgICAgICAgICAgICAgPDwgIiB3YWtlVXBQYXJzZWQ6ICIgPDwgd2FrZVVwUGFyc2VkIDw8IExPR19FTkRMOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitib29sIEhpZFJhd1NlbnNvcjo6ZmluZFNlbnNvckNvbnRyb2xVc2FnZShjb25zdCBzdGQ6OnZlY3RvcjxIaWRQYXJzZXI6OlJlcG9ydFBhY2tldD4gJnBhY2tldHMpIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgSGlkOjpTZW5zb3I6OlByb3BlcnR5VXNhZ2U7CisgICAgdXNpbmcgbmFtZXNwYWNlIEhpZDo6U2Vuc29yOjpSYXdNaW5NYXg7CisKKyAgICAvL1JFUE9SVElOR19TVEFURQorICAgIGNvbnN0IEhpZFBhcnNlcjo6UmVwb3J0SXRlbSAqcmVwb3J0aW5nU3RhdGUKKyAgICAgICAgICAgID0gZmluZChwYWNrZXRzLCBSRVBPUlRJTkdfU1RBVEUsIEhpZFBhcnNlcjo6UkVQT1JUX1RZUEVfRkVBVFVSRSk7CisKKyAgICBpZiAocmVwb3J0aW5nU3RhdGUgPT0gbnVsbHB0cgorICAgICAgICAgICAgfHwgIXJlcG9ydGluZ1N0YXRlLT5pc0J5dGVBbGlnbmVkKCkKKyAgICAgICAgICAgIHx8IHJlcG9ydGluZ1N0YXRlLT5iaXRTaXplICE9IDgKKyAgICAgICAgICAgIHx8IHJlcG9ydGluZ1N0YXRlLT5taW5SYXcgIT0gUkVQT1JUSU5HX1NUQVRFX01JTgorICAgICAgICAgICAgfHwgcmVwb3J0aW5nU3RhdGUtPm1heFJhdyAhPSBSRVBPUlRJTkdfU1RBVEVfTUFYKSB7CisgICAgICAgIExPR19XIDw8ICJDYW5ub3QgZmluZCB2YWxpZCByZXBvcnRpbmcgc3RhdGUgZmVhdHVyZSIgPDwgTE9HX0VOREw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVJlcG9ydGluZ1N0YXRlSWQgPSByZXBvcnRpbmdTdGF0ZS0+aWQ7CisgICAgICAgIG1SZXBvcnRpbmdTdGF0ZU9mZnNldCA9IHJlcG9ydGluZ1N0YXRlLT5iaXRPZmZzZXQgLyA4OworICAgIH0KKworICAgIC8vUE9XRVJfU1RBVEUKKyAgICBjb25zdCBIaWRQYXJzZXI6OlJlcG9ydEl0ZW0gKnBvd2VyU3RhdGUKKyAgICAgICAgICAgID0gZmluZChwYWNrZXRzLCBQT1dFUl9TVEFURSwgSGlkUGFyc2VyOjpSRVBPUlRfVFlQRV9GRUFUVVJFKTsKKyAgICBpZiAocG93ZXJTdGF0ZSA9PSBudWxscHRyCisgICAgICAgICAgICB8fCAhcG93ZXJTdGF0ZS0+aXNCeXRlQWxpZ25lZCgpCisgICAgICAgICAgICB8fCBwb3dlclN0YXRlLT5iaXRTaXplICE9IDgKKyAgICAgICAgICAgIHx8IHBvd2VyU3RhdGUtPm1pblJhdyAhPSBQT1dFUl9TVEFURV9NSU4KKyAgICAgICAgICAgIHx8IHBvd2VyU3RhdGUtPm1heFJhdyAhPSBQT1dFUl9TVEFURV9NQVgpIHsKKyAgICAgICAgTE9HX1cgPDwgIkNhbm5vdCBmaW5kIHZhbGlkIHBvd2VyIHN0YXRlIGZlYXR1cmUiIDw8IExPR19FTkRMOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Qb3dlclN0YXRlSWQgPSBwb3dlclN0YXRlLT5pZDsKKyAgICAgICAgbVBvd2VyU3RhdGVPZmZzZXQgPSBwb3dlclN0YXRlLT5iaXRPZmZzZXQgLyA4OworICAgIH0KKworICAgIC8vUkVQT1JUX0lOVEVSVkFMCisgICAgY29uc3QgSGlkUGFyc2VyOjpSZXBvcnRJdGVtICpyZXBvcnRJbnRlcnZhbAorICAgICAgICAgICAgPSBmaW5kKHBhY2tldHMsIFJFUE9SVF9JTlRFUlZBTCwgSGlkUGFyc2VyOjpSRVBPUlRfVFlQRV9GRUFUVVJFKTsKKyAgICBpZiAocmVwb3J0SW50ZXJ2YWwgPT0gbnVsbHB0cgorICAgICAgICAgICAgfHwgIXJlcG9ydEludGVydmFsLT5pc0J5dGVBbGlnbmVkKCkKKyAgICAgICAgICAgIHx8IHJlcG9ydEludGVydmFsLT5taW5SYXcgPCAwCisgICAgICAgICAgICB8fCAocmVwb3J0SW50ZXJ2YWwtPmJpdFNpemUgIT0gMTYgJiYgcmVwb3J0SW50ZXJ2YWwtPmJpdFNpemUgIT0gMzIpKSB7CisgICAgICAgIExPR19XIDw8ICJDYW5ub3QgZmluZCB2YWxpZCByZXBvcnQgaW50ZXJ2YWwgZmVhdHVyZSIgPDwgTE9HX0VOREw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVJlcG9ydEludGVydmFsSWQgPSByZXBvcnRJbnRlcnZhbC0+aWQ7CisgICAgICAgIG1SZXBvcnRJbnRlcnZhbE9mZnNldCA9IHJlcG9ydEludGVydmFsLT5iaXRPZmZzZXQgLyA4OworICAgICAgICBtUmVwb3J0SW50ZXJ2YWxTaXplID0gcmVwb3J0SW50ZXJ2YWwtPmJpdFNpemUgLyA4OworCisgICAgICAgIG1GZWF0dXJlSW5mby5taW5EZWxheSA9IHN0ZDo6bWF4KHN0YXRpY19jYXN0PGludDY0X3Q+KDEpLCByZXBvcnRJbnRlcnZhbC0+bWluUmF3KSAqIDEwMDA7CisgICAgICAgIG1GZWF0dXJlSW5mby5tYXhEZWxheSA9IHN0ZDo6bWluKHN0YXRpY19jYXN0PGludDY0X3Q+KDEwMDAwMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0SW50ZXJ2YWwtPm1heFJhdykgKiAxMDAwOyAvLyBtYXhpbXVtIDEwMDAgc2Vjb25kCisgICAgfQorICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiAobVBvd2VyU3RhdGVJZCA+PSAwIHx8IG1SZXBvcnRpbmdTdGF0ZUlkID49IDApICYmIG1SZXBvcnRJbnRlcnZhbElkID49IDA7Cit9CisKK2NvbnN0IHNlbnNvcl90KiBIaWRSYXdTZW5zb3I6OmdldFNlbnNvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gJm1TZW5zb3I7Cit9CisKK3ZvaWQgSGlkUmF3U2Vuc29yOjpnZXRVdWlkKHVpbnQ4X3QqIHV1aWQpIGNvbnN0IHsKKyAgICBtZW1jcHkodXVpZCwgbUZlYXR1cmVJbmZvLnV1aWQsIHNpemVvZihtRmVhdHVyZUluZm8udXVpZCkpOworfQorCitpbnQgSGlkUmF3U2Vuc29yOjplbmFibGUoYm9vbCBlbmFibGUpIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgSGlkOjpTZW5zb3I6OlN0YXRlVmFsdWU7CisgICAgU1AoSGlkRGV2aWNlKSBkZXZpY2UgPSBQUk9NT1RFKG1EZXZpY2UpOworCisgICAgaWYgKGRldmljZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGlmIChlbmFibGUgPT0gbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZmZlcjsKKyAgICBib29sIHNldFBvd2VyT2sgPSB0cnVlOworICAgIGlmIChtUG93ZXJTdGF0ZUlkID49IDApIHsKKyAgICAgICAgc2V0UG93ZXJPayA9IGZhbHNlOworICAgICAgICB1aW50OF90IGlkID0gc3RhdGljX2Nhc3Q8dWludDhfdD4obVBvd2VyU3RhdGVJZCk7CisgICAgICAgIGlmIChkZXZpY2UtPmdldEZlYXR1cmUoaWQsICZidWZmZXIpCisgICAgICAgICAgICAgICAgJiYgYnVmZmVyLnNpemUoKSA+IG1Qb3dlclN0YXRlT2Zmc2V0KSB7CisgICAgICAgICAgICBidWZmZXJbbVBvd2VyU3RhdGVPZmZzZXRdID0gZW5hYmxlID8gUE9XRVJfU1RBVEVfRlVMTF9QT1dFUiA6IFBPV0VSX1NUQVRFX1BPV0VSX09GRjsKKyAgICAgICAgICAgIHNldFBvd2VyT2sgPSBkZXZpY2UtPnNldEZlYXR1cmUoaWQsIGJ1ZmZlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dfRSA8PCAiZW5hYmxlOiBjaGFuZ2luZyBQT1dFUiBTVEFURSBmYWlsZWQiIDw8IExPR19FTkRMOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBzZXRSZXBvcnRpbmdPayA9IHRydWU7CisgICAgaWYgKG1SZXBvcnRpbmdTdGF0ZUlkID49IDApIHsKKyAgICAgICAgc2V0UmVwb3J0aW5nT2sgPSBmYWxzZTsKKyAgICAgICAgdWludDhfdCBpZCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KG1SZXBvcnRpbmdTdGF0ZUlkKTsKKyAgICAgICAgaWYgKGRldmljZS0+Z2V0RmVhdHVyZShpZCwgJmJ1ZmZlcikKKyAgICAgICAgICAgICAgICAmJiBidWZmZXIuc2l6ZSgpID4gbVJlcG9ydGluZ1N0YXRlT2Zmc2V0KSB7CisgICAgICAgICAgICBidWZmZXJbbVJlcG9ydGluZ1N0YXRlT2Zmc2V0XQorICAgICAgICAgICAgICAgICAgICA9IGVuYWJsZSA/IFJFUE9SVElOR19TVEFURV9BTExfRVZFTlQgOiBSRVBPUlRJTkdfU1RBVEVfTk9fRVZFTlQ7CisgICAgICAgICAgICBzZXRSZXBvcnRpbmdPayA9IGRldmljZS0+c2V0RmVhdHVyZShpZCwgYnVmZmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR19FIDw8ICJlbmFibGU6IGNoYW5naW5nIFJFUE9SVElORyBTVEFURSBmYWlsZWQiIDw8IExPR19FTkRMOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNldFBvd2VyT2sgJiYgc2V0UmVwb3J0aW5nT2spIHsKKyAgICAgICAgbUVuYWJsZWQgPSBlbmFibGU7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorfQorCitpbnQgSGlkUmF3U2Vuc29yOjpiYXRjaChpbnQ2NF90IHNhbXBsaW5nUGVyaW9kLCBpbnQ2NF90IGJhdGNoaW5nUGVyaW9kKSB7CisgICAgU1AoSGlkRGV2aWNlKSBkZXZpY2UgPSBQUk9NT1RFKG1EZXZpY2UpOworICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBpZiAoc2FtcGxpbmdQZXJpb2QgPCAwIHx8IGJhdGNoaW5nUGVyaW9kIDwgMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGJvb2wgbmVlZFJlZnJlc2ggPSBtU2FtcGxpbmdQZXJpb2QgIT0gc2FtcGxpbmdQZXJpb2QgfHwgbUJhdGNoaW5nUGVyaW9kICE9IGJhdGNoaW5nUGVyaW9kOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZmZlcjsKKworICAgIGJvb2wgb2sgPSB0cnVlOworICAgIGlmIChuZWVkUmVmcmVzaCAmJiBtUmVwb3J0SW50ZXJ2YWxJZCA+PSAwKSB7CisgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgIHVpbnQ4X3QgaWQgPSBzdGF0aWNfY2FzdDx1aW50OF90PihtUmVwb3J0SW50ZXJ2YWxJZCk7CisgICAgICAgIGlmIChkZXZpY2UtPmdldEZlYXR1cmUoaWQsICZidWZmZXIpCisgICAgICAgICAgICAgICAgJiYgYnVmZmVyLnNpemUoKSA+PSBtUmVwb3J0SW50ZXJ2YWxPZmZzZXQgKyBtUmVwb3J0SW50ZXJ2YWxTaXplKSB7CisgICAgICAgICAgICBpbnQ2NF90IHBlcmlvZE1zID0gc2FtcGxpbmdQZXJpb2QgLyAxMDAwMDAwOyAvL25zIC0+IG1zCisgICAgICAgICAgICBzd2l0Y2ggKG1SZXBvcnRJbnRlcnZhbFNpemUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIHNpemVvZih1aW50MTZfdCk6CisgICAgICAgICAgICAgICAgICAgIHBlcmlvZE1zID0gc3RkOjptaW4ocGVyaW9kTXMsIHN0YXRpY19jYXN0PGludDY0X3Q+KFVJTlQxNl9NQVgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyW21SZXBvcnRJbnRlcnZhbE9mZnNldF0gPSBwZXJpb2RNcyAmIDB4RkY7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclttUmVwb3J0SW50ZXJ2YWxPZmZzZXQgKyAxXSA9IChwZXJpb2RNcyA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgY2FzZSBzaXplb2YodWludDMyX3QpOgorICAgICAgICAgICAgICAgICAgICBwZXJpb2RNcyA9IHN0ZDo6bWluKHBlcmlvZE1zLCBzdGF0aWNfY2FzdDxpbnQ2NF90PihVSU5UMzJfTUFYKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclttUmVwb3J0SW50ZXJ2YWxPZmZzZXRdID0gcGVyaW9kTXMgJiAweEZGOworICAgICAgICAgICAgICAgICAgICBidWZmZXJbbVJlcG9ydEludGVydmFsT2Zmc2V0ICsgMV0gPSAocGVyaW9kTXMgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgICAgICAgICBidWZmZXJbbVJlcG9ydEludGVydmFsT2Zmc2V0ICsgMl0gPSAocGVyaW9kTXMgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyW21SZXBvcnRJbnRlcnZhbE9mZnNldCArIDNdID0gKHBlcmlvZE1zID4+IDI0KSAmIDB4RkY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvayA9IGRldmljZS0+c2V0RmVhdHVyZShpZCwgYnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvaykgeworICAgICAgICBtU2FtcGxpbmdQZXJpb2QgPSBzYW1wbGluZ1BlcmlvZDsKKyAgICAgICAgbUJhdGNoaW5nUGVyaW9kID0gYmF0Y2hpbmdQZXJpb2Q7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorfQorCit2b2lkIEhpZFJhd1NlbnNvcjo6aGFuZGxlSW5wdXQodWludDhfdCBpZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm1lc3NhZ2UpIHsKKyAgICBpZiAoaWQgIT0gbUlucHV0UmVwb3J0SWQgfHwgbUVuYWJsZWQgPT0gZmFsc2UpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzZW5zb3JzX2V2ZW50X3QgZXZlbnQgPSB7CisgICAgICAgIC52ZXJzaW9uID0gc2l6ZW9mKGV2ZW50KSwKKyAgICAgICAgLnNlbnNvciA9IC0xLAorICAgICAgICAudHlwZSA9IG1TZW5zb3IudHlwZQorICAgIH07CisgICAgYm9vbCB2YWxpZCA9IHRydWU7CisgICAgZm9yIChjb25zdCBhdXRvICZyZWMgOiBtVHJhbnNsYXRlVGFibGUpIHsKKyAgICAgICAgaW50NjRfdCB2ID0gKG1lc3NhZ2VbcmVjLmJ5dGVPZmZzZXQgKyByZWMuYnl0ZVNpemUgLSAxXSAmIDB4ODApID8gLTEgOiAwOworICAgICAgICBmb3IgKGludCBpID0gc3RhdGljX2Nhc3Q8aW50PihyZWMuYnl0ZVNpemUpIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgICAgIHYgPSAodiA8PCA4KSB8IG1lc3NhZ2VbcmVjLmJ5dGVPZmZzZXQgKyBpXTsgLy8gSElEIGlzIGxpdHRsZSBlbmRpYW4KKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAocmVjLnR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9GTE9BVDoKKyAgICAgICAgICAgICAgICBpZiAodiA+IHJlYy5tYXhWYWx1ZSB8fCB2IDwgcmVjLm1pblZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGV2ZW50LmRhdGFbcmVjLmluZGV4XSA9IHJlYy5hICogKHYgKyByZWMuYik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFRZUEVfSU5UNjQ6CisgICAgICAgICAgICAgICAgaWYgKHYgPiByZWMubWF4VmFsdWUgfHwgdiA8IHJlYy5taW5WYWx1ZSkgeworICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBldmVudC51NjQuZGF0YVtyZWMuaW5kZXhdID0gdiArIHJlYy5iOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUWVBFX0FDQ1VSQUNZOgorICAgICAgICAgICAgICAgIGV2ZW50Lm1hZ25ldGljLnN0YXR1cyA9ICh2ICYgMHhGRikgKyByZWMuYjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIXZhbGlkKSB7CisgICAgICAgIExPR19WIDw8ICJSYW5nZSBlcnJvciBvYnNlcnZlZCBpbiBkZWNvZGluZywgZGlzY2FyZCIgPDwgTE9HX0VOREw7CisgICAgfQorICAgIGV2ZW50LnRpbWVzdGFtcCA9IC0xOworICAgIGdlbmVyYXRlRXZlbnQoZXZlbnQpOworfQorCitzdGQ6OnN0cmluZyBIaWRSYXdTZW5zb3I6OmR1bXAoKSBjb25zdCB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHNzOworICAgIHNzIDw8ICJGZWF0dXJlIFZhbHVlcyAiIDw8IExPR19FTkRMCisgICAgICAgICAgPDwgIiAgbmFtZTogIiA8PCBtRmVhdHVyZUluZm8ubmFtZSA8PCBMT0dfRU5ETAorICAgICAgICAgIDw8ICIgIHZlbmRvcjogIiA8PCBtRmVhdHVyZUluZm8udmVuZG9yIDw8IExPR19FTkRMCisgICAgICAgICAgPDwgIiAgcGVybWlzc2lvbjogIiA8PCBtRmVhdHVyZUluZm8ucGVybWlzc2lvbiA8PCBMT0dfRU5ETAorICAgICAgICAgIDw8ICIgIHR5cGVTdHJpbmc6ICIgPDwgbUZlYXR1cmVJbmZvLnR5cGVTdHJpbmcgPDwgTE9HX0VOREwKKyAgICAgICAgICA8PCAiICB0eXBlOiAiIDw8IG1GZWF0dXJlSW5mby50eXBlIDw8IExPR19FTkRMCisgICAgICAgICAgPDwgIiAgbWF4UmFuZ2U6ICIgPDwgbUZlYXR1cmVJbmZvLm1heFJhbmdlIDw8IExPR19FTkRMCisgICAgICAgICAgPDwgIiAgcmVzb2x1dGlvbjogIiA8PCBtRmVhdHVyZUluZm8ucmVzb2x1dGlvbiA8PCBMT0dfRU5ETAorICAgICAgICAgIDw8ICIgIHBvd2VyOiAiIDw8IG1GZWF0dXJlSW5mby5wb3dlciA8PCBMT0dfRU5ETAorICAgICAgICAgIDw8ICIgIG1pbkRlbGF5OiAiIDw8IG1GZWF0dXJlSW5mby5taW5EZWxheSA8PCBMT0dfRU5ETAorICAgICAgICAgIDw8ICIgIG1heERlbGF5OiAiIDw8IG1GZWF0dXJlSW5mby5tYXhEZWxheSA8PCBMT0dfRU5ETAorICAgICAgICAgIDw8ICIgIGZpZm9TaXplOiAiIDw8IG1GZWF0dXJlSW5mby5maWZvU2l6ZSA8PCBMT0dfRU5ETAorICAgICAgICAgIDw8ICIgIGZpZm9NYXhTaXplOiAiIDw8IG1GZWF0dXJlSW5mby5maWZvTWF4U2l6ZSA8PCBMT0dfRU5ETAorICAgICAgICAgIDw8ICIgIHJlcG9ydE1vZGVGbGFnOiAiIDw8IG1GZWF0dXJlSW5mby5yZXBvcnRNb2RlRmxhZyA8PCBMT0dfRU5ETAorICAgICAgICAgIDw8ICIgIGlzV2FrZVVwOiAiIDw8IChtRmVhdHVyZUluZm8uaXNXYWtlVXAgPyAidHJ1ZSIgOiAiZmFsc2UiKSA8PCBMT0dfRU5ETAorICAgICAgICAgIDw8ICIgIHVuaXF1ZUlkOiAiIDw8IG1GZWF0dXJlSW5mby51bmlxdWVJZCA8PCBMT0dfRU5ETAorICAgICAgICAgIDw8ICIgIHV1aWQ6ICI7CisKKyAgICBzcyA8PCBzdGQ6OmhleCA8PCBzdGQ6OnNldGZpbGwoJzAnKTsKKyAgICBmb3IgKGF1dG8gZCA6IG1GZWF0dXJlSW5mby51dWlkKSB7CisgICAgICAgICAgc3MgPDwgc3RkOjpzZXR3KDIpIDw8IHN0YXRpY19jYXN0PGludD4oZCkgPDwgIiAiOworICAgIH0KKyAgICBzcyA8PCBzdGQ6OmRlYyA8PCBzdGQ6OnNldGZpbGwoJyAnKSA8PCBMT0dfRU5ETDsKKworICAgIHNzIDw8ICJJbnB1dCByZXBvcnQgaWQ6ICIgPDwgbUlucHV0UmVwb3J0SWQgPDwgTE9HX0VOREw7CisgICAgZm9yIChjb25zdCBhdXRvICZ0IDogbVRyYW5zbGF0ZVRhYmxlKSB7CisgICAgICAgIHNzIDw8ICIgIHR5cGUsIGluZGV4OiAiIDw8IHQudHlwZSA8PCAiLCAiIDw8IHQuaW5kZXgKKyAgICAgICAgICAgICAgPDwgIjsgbWluLG1heDogIiA8PCB0Lm1pblZhbHVlIDw8ICIsICIgPDwgdC5tYXhWYWx1ZQorICAgICAgICAgICAgICA8PCAiOyBieXRlLW9mZnNldCxzaXplOiAiIDw8IHQuYnl0ZU9mZnNldCA8PCAiLCAiIDw8IHQuYnl0ZVNpemUKKyAgICAgICAgICAgICAgPDwgIjsgc2NhbGluZyxiaWFzOiAiIDw8IHQuYSA8PCAiLCAiIDw8IHQuYiA8PCBMT0dfRU5ETDsKKyAgICB9CisKKyAgICBzcyA8PCAiQ29udHJvbCBmZWF0dXJlczogIiA8PCBMT0dfRU5ETDsKKyAgICBzcyA8PCAiICBQb3dlciBzdGF0ZSAiOworICAgIGlmIChtUG93ZXJTdGF0ZUlkID49IDApIHsKKyAgICAgICAgc3MgPDwgImZvdW5kLCBpZDogIiA8PCBtUG93ZXJTdGF0ZUlkCisgICAgICAgICAgICAgIDw8ICIgb2Zmc2V0OiAiIDw8IG1Qb3dlclN0YXRlT2Zmc2V0IDw8IExPR19FTkRMOworICAgIH0gZWxzZSB7CisgICAgICAgIHNzIDw8ICJub3QgZm91bmQiIDw8IExPR19FTkRMOworICAgIH0KKworICAgIHNzIDw8ICIgIFJlcG9ydGluZyBzdGF0ZSAiOworICAgIGlmIChtUmVwb3J0aW5nU3RhdGVJZCA+PSAwKSB7CisgICAgICAgIHNzIDw8ICJmb3VuZCwgaWQ6ICIgPDwgbVJlcG9ydGluZ1N0YXRlSWQKKyAgICAgICAgICAgICAgPDwgIiBvZmZzZXQ6ICIgPDwgbVJlcG9ydGluZ1N0YXRlT2Zmc2V0IDw8IExPR19FTkRMOworICAgIH0gZWxzZSB7CisgICAgICAgIHNzIDw8ICJub3QgZm91bmQiIDw8IExPR19FTkRMOworICAgIH0KKworICAgIHNzIDw8ICIgIFJlcG9ydCBpbnRlcnZhbCAiOworICAgIGlmIChtUmVwb3J0SW50ZXJ2YWxJZCA+PSAwKSB7CisgICAgICAgIHNzIDw8ICJmb3VuZCwgaWQ6ICIgPDwgbVJlcG9ydEludGVydmFsSWQKKyAgICAgICAgICAgICAgPDwgIiBvZmZzZXQ6ICIgPDwgbVJlcG9ydEludGVydmFsT2Zmc2V0CisgICAgICAgICAgICAgIDw8ICIgc2l6ZTogIiA8PCBtUmVwb3J0SW50ZXJ2YWxTaXplIDw8IExPR19FTkRMOworICAgIH0gZWxzZSB7CisgICAgICAgIHNzIDw8ICJub3QgZm91bmQiIDw8IExPR19FTkRMOworICAgIH0KKyAgICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFNlbnNvckhhbEV4dAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFJhd1NlbnNvci5oIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFJhd1NlbnNvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZDMyYjYKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkUmF3U2Vuc29yLmgKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBBTkRST0lEX1NFTlNPUkhBTF9FWFRfSElEUkFXX1NFTlNPUl9ICisjZGVmaW5lIEFORFJPSURfU0VOU09SSEFMX0VYVF9ISURSQVdfU0VOU09SX0gKKworI2luY2x1ZGUgIkJhc2VTZW5zb3JPYmplY3QuaCIKKyNpbmNsdWRlICJIaWREZXZpY2UuaCIKKyNpbmNsdWRlICJVdGlscy5oIgorCisjaW5jbHVkZSA8SGlkUGFyc2VyLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvc2Vuc29ycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgU2Vuc29ySGFsRXh0IHsKKwordXNpbmcgSGlkVXRpbDo6SGlkUGFyc2VyOwordXNpbmcgUmVwb3J0UGFja2V0ID0gSGlkUGFyc2VyOjpSZXBvcnRQYWNrZXQ7Cit1c2luZyBSZXBvcnRJdGVtID0gSGlkUGFyc2VyOjpSZXBvcnRJdGVtOworCitjbGFzcyBIaWRSYXdTZW5zb3IgOiBwdWJsaWMgQmFzZVNlbnNvck9iamVjdCB7CisgICAgZnJpZW5kIGNsYXNzIEhpZFJhd1NlbnNvclRlc3Q7CisgICAgZnJpZW5kIGNsYXNzIEhpZFJhd0RldmljZVRlc3Q7CitwdWJsaWM6CisgICAgSGlkUmF3U2Vuc29yKFNQKEhpZERldmljZSkgZGV2aWNlLCB1aW50MzJfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8SGlkUGFyc2VyOjpSZXBvcnRQYWNrZXQ+ICZyZXBvcnQpOworCisgICAgLy8gaW1wbGVtZW50cyBCYXNlU2Vuc29yT2JqZWN0CisgICAgdmlydHVhbCBjb25zdCBzZW5zb3JfdCogZ2V0U2Vuc29yKCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIGdldFV1aWQodWludDhfdCogdXVpZCkgY29uc3Q7CisgICAgdmlydHVhbCBpbnQgZW5hYmxlKGJvb2wgZW5hYmxlKTsKKyAgICB2aXJ0dWFsIGludCBiYXRjaChpbnQ2NF90IHNhbXBsZVBlcmlvZCwgaW50NjRfdCBiYXRjaFBlcmlvZCk7IC8vIHVuaXQgbmFuby1zZWNvbmRzCisKKyAgICAvLyBoYW5kbGUgaW5wdXQgcmVwb3J0IHJlY2VpdmVkCisgICAgdm9pZCBoYW5kbGVJbnB1dCh1aW50OF90IGlkLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmbWVzc2FnZSk7CisKKyAgICAvLyBpbmRpY2F0ZSBpZiB0aGUgSGlkUmF3U2Vuc29yIGlzIGEgdmFsaWQgb25lCisgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gbVZhbGlkOyB9OworCitwcml2YXRlOgorCisgICAgLy8gc3RydWN0dXJlIHVzZWQgZm9yIGhvbGRpbmcgZGVzY3JpcHRvciBwYXJzZSByZXN1bHQgZm9yIGVhY2ggcmVwb3J0IGZpZWxkCisgICAgZW51bSB7CisgICAgICAgIFRZUEVfRkxPQVQsCisgICAgICAgIFRZUEVfSU5UNjQsCisgICAgICAgIFRZUEVfQUNDVVJBQ1kKKyAgICB9OworICAgIHN0cnVjdCBSZXBvcnRUcmFuc2xhdGVSZWNvcmQgeworICAgICAgICBpbnQgdHlwZTsKKyAgICAgICAgaW50IGluZGV4OworICAgICAgICBpbnQ2NF90IG1heFZhbHVlOworICAgICAgICBpbnQ2NF90IG1pblZhbHVlOworICAgICAgICBzaXplX3QgYnl0ZU9mZnNldDsKKyAgICAgICAgc2l6ZV90IGJ5dGVTaXplOworICAgICAgICBkb3VibGUgYTsKKyAgICAgICAgaW50NjRfdCBiOworICAgIH07CisKKyAgICAvLyBzZW5zb3IgcmVsYXRlZCBpbmZvcm1hdGlvbiBwYXJzZWQgZnJvbSBISUQgZGVzY3JpcHRvcgorICAgIHN0cnVjdCBGZWF0dXJlVmFsdWUgeworICAgICAgICAvLyBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gZnVybmlzaCBzZW5zb3JfdCBzdHJ1Y3R1cmUgKHNlZSBoYXJkd2FyZS9zZW5zb3JzLmgpCisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgICAgIHN0ZDo6c3RyaW5nIHZlbmRvcjsKKyAgICAgICAgc3RkOjpzdHJpbmcgcGVybWlzc2lvbjsKKyAgICAgICAgc3RkOjpzdHJpbmcgdHlwZVN0cmluZzsKKyAgICAgICAgaW50MzJfdCB0eXBlOworICAgICAgICBpbnQgdmVyc2lvbjsKKyAgICAgICAgZmxvYXQgbWF4UmFuZ2U7CisgICAgICAgIGZsb2F0IHJlc29sdXRpb247CisgICAgICAgIGZsb2F0IHBvd2VyOworICAgICAgICBpbnQzMl90IG1pbkRlbGF5OworICAgICAgICBpbnQ2NF90IG1heERlbGF5OworICAgICAgICBzaXplX3QgZmlmb1NpemU7CisgICAgICAgIHNpemVfdCBmaWZvTWF4U2l6ZTsKKyAgICAgICAgdWludDMyX3QgcmVwb3J0TW9kZUZsYWc7CisgICAgICAgIGJvb2wgaXNXYWtlVXA7CisKKyAgICAgICAgLy8gZHluYW1pYyBzZW5zb3Igc3BlY2lmaWMKKyAgICAgICAgc3RkOjpzdHJpbmcgdW5pcXVlSWQ7CisgICAgICAgIHVpbnQ4X3QgdXVpZFsxNl07CisKKyAgICAgICAgLy8gaWYgdGhlIGRldmljZSBpcyBjdXN0b20gc2Vuc29yIEhJRCBkZXZpY2UgdGhhdCBmdXJuaXNoZWQgYW5kcm9pZCBzcGVjaWZpYyBkZXNjcmlwdG9ycworICAgICAgICBib29sIGlzQW5kcm9pZEN1c3RvbTsKKyAgICB9OworCisgICAgLy8gaGVscGVyIGZ1bmN0aW9uIHRvIGZpbmQgdGhlIGZpcnN0IHJlcG9ydCBpdGVtIHdpdGggc3BlY2lmaWVkIHVzYWdlLCB0eXBlIGFuZCBpZC4KKyAgICAvLyBpZiBwYXJhbWV0ZXIgaWQgaXMgb21pdHRlZCwgdGhpcyBmdW5jdGlvbiBsb29rcyBmb3IgdXNhZ2Ugd2l0aCBhbGwgaWRzLgorICAgIC8vIHJldHVybiBudWxscHRyIGlmIG5vdGhpbmcgaXMgZm91bmQuCisgICAgc3RhdGljIGNvbnN0IEhpZFBhcnNlcjo6UmVwb3J0SXRlbSogZmluZAorICAgICAgICAgICAgKGNvbnN0IHN0ZDo6dmVjdG9yPEhpZFBhcnNlcjo6UmVwb3J0UGFja2V0PiAmcGFja2V0cywKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB1c2FnZSwgaW50IHR5cGUsIGludCBpZCA9IC0xKTsKKworICAgIC8vIGhlbHBlciBmdW5jdGlvbiB0byBkZWNvZGUgc3RkOjpzdHJpbmcgZnJvbSBISUQgZmVhdHVyZSByZXBvcnQgYnVmZmVyLgorICAgIHN0YXRpYyBib29sIGRlY29kZVN0cmluZygKKyAgICAgICAgICAgIGNvbnN0IEhpZFBhcnNlcjo6UmVwb3J0SXRlbSAmcmVwb3J0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmJ1ZmZlciwgc3RkOjpzdHJpbmcgKmQpOworCisgICAgLy8gaW5pdGlhbGl6ZSBkZWZhdWx0IGZlYXR1cmUgdmFsdWVzIGRlZmF1bHQgYmFzZWQgb24gaGlkIGRldmljZSBpbmZvCisgICAgc3RhdGljIHZvaWQgaW5pdEZlYXR1cmVWYWx1ZUZyb21IaWREZXZpY2VJbmZvKAorICAgICAgICAgICAgRmVhdHVyZVZhbHVlICpmZWF0dXJlVmFsdWUsIGNvbnN0IEhpZERldmljZTo6SGlkRGV2aWNlSW5mbyAmaW5mbyk7CisKKyAgICAvLyBwb3B1bGF0ZXMgZmVhdHVyZSB2YWx1ZXMgZnJvbSBkZXNjcmlwaXRvcnMgYW5kIGhpZCBmZWF0dXJlIHJlcG9ydHMKKyAgICBib29sIHBvcHVsYXRlRmVhdHVyZVZhbHVlRnJvbUZlYXR1cmVSZXBvcnQoCisgICAgICAgICAgICBGZWF0dXJlVmFsdWUgKmZlYXR1cmVWYWx1ZSwgY29uc3Qgc3RkOjp2ZWN0b3I8SGlkUGFyc2VyOjpSZXBvcnRQYWNrZXQ+ICZwYWNrZXRzKTsKKworICAgIC8vIHZhbGlkYXRlIGZlYXR1cmUgdmFsdWVzIGFuZCBjb25zdHJ1Y3Qgc2Vuc29yX3Qgc3RydWN0dXJlIGlmIHZhbHVlcyBhcmUgb2suCisgICAgYm9vbCB2YWxpZGF0ZUZlYXR1cmVWYWx1ZUFuZEJ1aWxkU2Vuc29yKCk7CisKKyAgICAvLyBoZWxwZXIgZnVuY3Rpb24gdG8gZmluZCBzZW5zb3IgY29udHJvbCBmZWF0dXJlIHVzYWdlIGZyb20gcGFja2V0cworICAgIGJvb2wgZmluZFNlbnNvckNvbnRyb2xVc2FnZShjb25zdCBzdGQ6OnZlY3RvcjxIaWRQYXJzZXI6OlJlcG9ydFBhY2tldD4gJnBhY2tldHMpOworCisgICAgLy8gdHJ5IHRvIHBhcnNlIHNlbnNvciBkZXNjcmlwdGlvbiBmZWF0dXJlIHZhbHVlIHRvIHNlZSBpZiBpdCBtYXRjaGVzCisgICAgLy8gYW5kcm9pZCBzcGVjaWZpZWQgY3VzdG9tIHNlbnNvciBkZWZpbml0aW9uLgorICAgIGJvb2wgZGV0ZWN0QW5kcm9pZEN1c3RvbVNlbnNvcihjb25zdCBzdGQ6OnN0cmluZyAmZGVzY3JpcHRpb24pOworCisgICAgLy8gcHJvY2VzcyBISUQgc2Vuc29yIHNwZWMgZGVmaW5lZCB0aHJlZSBheGlzIHNlbnNvcnMgdXNhZ2VzOiBhY2NlbCwgZ3lybywgbWFnLgorICAgIGJvb2wgcHJvY2Vzc1RyaUF4aXNVc2FnZShjb25zdCBzdGQ6OnZlY3RvcjxIaWRQYXJzZXI6OlJlcG9ydFBhY2tldD4gJnBhY2tldHMsCisgICAgICAgICAgICB1aW50MzJfdCB1c2FnZVgsIHVpbnQzMl90IHVzYWdlWSwgdWludDMyX3QgdXNhZ2VaLCBkb3VibGUgZGVmYXVsdFNjYWxpbmcgPSAxKTsKKworICAgIC8vIHByb2Nlc3MgSElEIHNuZXNvciBzcGVjIGRlZmluZWQgb3JpZW50YXRpb24ocXVhdGVybmlvbikgc2Vuc29yIHVzYWdlcy4KKyAgICBib29sIHByb2Nlc3NRdWF0ZXJuaW9uVXNhZ2UoY29uc3Qgc3RkOjp2ZWN0b3I8SGlkUGFyc2VyOjpSZXBvcnRQYWNrZXQ+ICZwYWNrZXRzKTsKKworICAgIC8vIGR1bXAgZGF0YSBmb3IgdGVzdC9kZWJ1ZyBwdXJwb3NlCisgICAgc3RkOjpzdHJpbmcgZHVtcCgpIGNvbnN0OworCisgICAgLy8gRmVhdHVyZXMgZm9yIGNvbnRyb2wgc2Vuc29yCisgICAgaW50IG1SZXBvcnRpbmdTdGF0ZUlkOworICAgIHVuc2lnbmVkIGludCBtUmVwb3J0aW5nU3RhdGVPZmZzZXQ7CisKKyAgICBpbnQgbVBvd2VyU3RhdGVJZDsKKyAgICB1bnNpZ25lZCBpbnQgbVBvd2VyU3RhdGVPZmZzZXQ7CisKKyAgICBpbnQgbVJlcG9ydEludGVydmFsSWQ7CisgICAgdW5zaWduZWQgaW50IG1SZXBvcnRJbnRlcnZhbE9mZnNldDsKKyAgICB1bnNpZ25lZCBpbnQgbVJlcG9ydEludGVydmFsU2l6ZTsKKworICAgIC8vIElucHV0IHJlcG9ydCB0cmFuc2xhdGUgdGFibGUKKyAgICBzdGQ6OnZlY3RvcjxSZXBvcnRUcmFuc2xhdGVSZWNvcmQ+IG1UcmFuc2xhdGVUYWJsZTsKKyAgICB1bnNpZ25lZCBtSW5wdXRSZXBvcnRJZDsKKworICAgIEZlYXR1cmVWYWx1ZSBtRmVhdHVyZUluZm87CisgICAgc2Vuc29yX3QgbVNlbnNvcjsKKworICAgIC8vIHJ1bnRpbWUgc3RhdGVzIHZhcmlhYmxlCisgICAgYm9vbCBtRW5hYmxlZDsKKyAgICBpbnQ2NF90IG1TYW1wbGluZ1BlcmlvZDsgICAgLy8gbnMKKyAgICBpbnQ2NF90IG1CYXRjaGluZ1BlcmlvZDsgICAgLy8gbnMKKworICAgIFdQKEhpZERldmljZSkgbURldmljZTsKKyAgICBib29sIG1WYWxpZDsKK307CisKK30gLy8gbmFtZXNwYWNlIFNlbnNvckhhbEV4dAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2VuZGlmIC8vIEFORFJPSURfU0VOU09SSEFMX0VYVF9ISURSQVdfU0VOU09SX0gKKwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFJhd1NlbnNvckRhZW1vbi5jcHAgYi9tb2R1bGVzL3NlbnNvcnMvZHluYW1pY19zZW5zb3IvSGlkUmF3U2Vuc29yRGFlbW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmYzNGJjCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFJhd1NlbnNvckRhZW1vbi5jcHAKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiSGlkUmF3U2Vuc29yRGFlbW9uLmgiCisjaW5jbHVkZSAiQ29ubmVjdGlvbkRldGVjdG9yLmgiCisjaW5jbHVkZSAiRHluYW1pY1NlbnNvck1hbmFnZXIuaCIKKyNpbmNsdWRlICJIaWRSYXdTZW5zb3JEZXZpY2UuaCIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N5c3RlbUNsb2NrLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNkZWZpbmUgREVWX1BBVEggICAgICAgICAgICAgICAgIi9kZXYvIgorI2RlZmluZSBERVZfTkFNRV9SRUdFWCAgICAgICAgICAiXmhpZHJhd1swLTldKyQiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBTZW5zb3JIYWxFeHQgeworCitIaWRSYXdTZW5zb3JEYWVtb246OkhpZFJhd1NlbnNvckRhZW1vbihEeW5hbWljU2Vuc29yTWFuYWdlciYgbWFuYWdlcikKKyAgICAgICAgOiBCYXNlRHluYW1pY1NlbnNvckRhZW1vbihtYW5hZ2VyKSB7CisgICAgbURldGVjdG9yID0gbmV3IEZpbGVDb25uZWN0aW9uRGV0ZWN0b3IoCisgICAgICAgICAgICB0aGlzLCBzdGQ6OnN0cmluZyhERVZfUEFUSCksIHN0ZDo6c3RyaW5nKERFVl9OQU1FX1JFR0VYKSk7Cit9CisKK0Jhc2VTZW5zb3JWZWN0b3IgSGlkUmF3U2Vuc29yRGFlbW9uOjpjcmVhdGVTZW5zb3IoY29uc3Qgc3RkOjpzdHJpbmcgJmRldmljZUtleSkgeworICAgIEJhc2VTZW5zb3JWZWN0b3IgcmV0OworICAgIHNwPEhpZFJhd1NlbnNvckRldmljZT4gZGV2aWNlKEhpZFJhd1NlbnNvckRldmljZTo6Y3JlYXRlKGRldmljZUtleSkpOworCisgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dWKCJjcmVhdGVkIEhpZFJhd1NlbnNvckRldmljZSglcCkgc3VjY2Vzc2Z1bGx5IG9uIGRldmljZSAlcyBjb250YWlucyAlenUgc2Vuc29ycyIsCisgICAgICAgICAgICAgIGRldmljZS5nZXQoKSwgZGV2aWNlS2V5LmNfc3RyKCksIGRldmljZS0+Z2V0U2Vuc29ycygpLnNpemUoKSk7CisKKyAgICAgICAgLy8gY29udmVydCB0eXBlCisgICAgICAgIGZvciAoYXV0byAmaSA6IGRldmljZS0+Z2V0U2Vuc29ycygpKSB7CisgICAgICAgICAgICByZXQucHVzaF9iYWNrKGkpOworICAgICAgICB9CisgICAgICAgIG1IaWRSYXdTZW5zb3JEZXZpY2VzLmVtcGxhY2UoZGV2aWNlS2V5LCBkZXZpY2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gY3JlYXRlIEhpZFJhd1NlbnNvckRldmljZSBvYmplY3QiKTsKKyAgICB9CisKKyAgICBBTE9HRSgicmV0dXJuICV6dSBzZW5zb3JzIiwgcmV0LnNpemUoKSk7CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBIaWRSYXdTZW5zb3JEYWVtb246OnJlbW92ZVNlbnNvcihjb25zdCBzdGQ6OnN0cmluZyAmZGV2aWNlS2V5KSB7CisgICAgbUhpZFJhd1NlbnNvckRldmljZXMuZXJhc2UoZGV2aWNlS2V5KTsKK30KKworfSAvLyBuYW1lc3BhY2UgU2Vuc29ySGFsRXh0Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRSYXdTZW5zb3JEYWVtb24uaCBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRSYXdTZW5zb3JEYWVtb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzRiMmEyCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFJhd1NlbnNvckRhZW1vbi5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VOU09SSEFMX0VYVF9ISURSQVdfU0VOU09SX0RBRU1PTl9ICisjZGVmaW5lIEFORFJPSURfU0VOU09SSEFMX0VYVF9ISURSQVdfU0VOU09SX0RBRU1PTl9ICisKKyNpbmNsdWRlICJCYXNlRHluYW1pY1NlbnNvckRhZW1vbi5oIgorCisjaW5jbHVkZSA8SGlkUGFyc2VyLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvc2Vuc29ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCisKK3VzaW5nIEhpZFV0aWw6OkhpZFBhcnNlcjsKK3VzaW5nIEhpZFV0aWw6OkhpZFJlcG9ydDsKK3VzaW5nIEhpZFV0aWw6OkhpZEl0ZW07CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBTZW5zb3JIYWxFeHQgeworCitjbGFzcyBIaWRSYXdTZW5zb3JEZXZpY2U7CitjbGFzcyBDb25uZWN0aW9uRGV0ZWN0b3I7CisKK2NsYXNzIEhpZFJhd1NlbnNvckRhZW1vbiA6IHB1YmxpYyBCYXNlRHluYW1pY1NlbnNvckRhZW1vbiB7CisgICAgZnJpZW5kIGNsYXNzIEhpZFJhd1NlbnNvckRhZW1vblRlc3Q7CitwdWJsaWM6CisgICAgSGlkUmF3U2Vuc29yRGFlbW9uKER5bmFtaWNTZW5zb3JNYW5hZ2VyJiBtYW5hZ2VyKTsKKyAgICB2aXJ0dWFsIH5IaWRSYXdTZW5zb3JEYWVtb24oKSA9IGRlZmF1bHQ7Citwcml2YXRlOgorICAgIHZpcnR1YWwgQmFzZVNlbnNvclZlY3RvciBjcmVhdGVTZW5zb3IoY29uc3Qgc3RkOjpzdHJpbmcgJmRldmljZUtleSk7CisgICAgdmlydHVhbCB2b2lkIHJlbW92ZVNlbnNvcihjb25zdCBzdGQ6OnN0cmluZyAmZGV2aWNlS2V5KTsKKworICAgIGNsYXNzIEhpZFJhd1NlbnNvcjsKKyAgICB2b2lkIHJlZ2lzdGVyRXhpc3RpbmcoKTsKKworICAgIHNwPENvbm5lY3Rpb25EZXRlY3Rvcj4gbURldGVjdG9yOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3A8SGlkUmF3U2Vuc29yRGV2aWNlPj4gbUhpZFJhd1NlbnNvckRldmljZXM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBTZW5zb3JIYWxFeHQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfU0VOU09SSEFMX0VYVF9ISURSQVdfU0VOU09SX0RBRU1PTl9ICisKZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRSYXdTZW5zb3JEZXZpY2UuY3BwIGIvbW9kdWxlcy9zZW5zb3JzL2R5bmFtaWNfc2Vuc29yL0hpZFJhd1NlbnNvckRldmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFhNGNmOQotLS0gL2Rldi9udWxsCisrKyBiL21vZHVsZXMvc2Vuc29ycy9keW5hbWljX3NlbnNvci9IaWRSYXdTZW5zb3JEZXZpY2UuY3BwCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkhpZFJhd1NlbnNvckRldmljZS5oIgorI2luY2x1ZGUgIkhpZFJhd1NlbnNvci5oIgorI2luY2x1ZGUgIkhpZFNlbnNvckRlZi5oIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZHJhdy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisjaW5jbHVkZSA8c2V0PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgU2Vuc29ySGFsRXh0IHsKKwordXNpbmcgbmFtZXNwYWNlIEhpZDo6U2Vuc29yOjpTZW5zb3JUeXBlVXNhZ2U7Cit1c2luZyBuYW1lc3BhY2UgSGlkOjpTZW5zb3I6OlByb3BlcnR5VXNhZ2U7CisKK2NvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDx1bnNpZ25lZCBpbnQ+IEhpZFJhd1NlbnNvckRldmljZTo6c0ludGVyZXN0ZWR7CisgICAgICAgIEFDQ0VMRVJPTUVURVJfM0QsIEdZUk9NRVRFUl8zRCwgQ09NUEFTU18zRCwgQ1VTVE9NfTsKKworc3A8SGlkUmF3U2Vuc29yRGV2aWNlPiBIaWRSYXdTZW5zb3JEZXZpY2U6OmNyZWF0ZShjb25zdCBzdGQ6OnN0cmluZyAmZGV2TmFtZSkgeworICAgIHNwPEhpZFJhd1NlbnNvckRldmljZT4gZGV2aWNlKG5ldyBIaWRSYXdTZW5zb3JEZXZpY2UoZGV2TmFtZSkpOworICAgIC8vIG9mZnNldCArMSBzdHJvbmcgY291bnQgYWRkZWQgYnkgY29uc3RydWN0b3IKKyAgICBkZXZpY2UtPmRlY1N0cm9uZyhkZXZpY2UuZ2V0KCkpOworCisgICAgaWYgKGRldmljZS0+bVZhbGlkKSB7CisgICAgICAgIHJldHVybiBkZXZpY2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorfQorCitIaWRSYXdTZW5zb3JEZXZpY2U6OkhpZFJhd1NlbnNvckRldmljZShjb25zdCBzdGQ6OnN0cmluZyAmZGV2TmFtZSkKKyAgICAgICAgOiBSZWZCYXNlKCksIEhpZFJhd0RldmljZShkZXZOYW1lLCBzSW50ZXJlc3RlZCksCisgICAgICAgICAgVGhyZWFkKGZhbHNlIC8qY2FuQ2FsbEphdmEqLyksIG1WYWxpZChmYWxzZSkgeworICAgIC8vIGNyZWF0ZSBIaWRSYXdTZW5zb3Igb2JqZWN0cyBmcm9tIGRpZ2VzdAorICAgIC8vIEhpZFJhd1NlbnNvciBvYmplY3Qgd2lsbCB0YWtlIHNwPEhpZFJhd1NlbnNvckRldmljZT4gYXMgcGFyYW1ldGVyLCBzbyBpbmNyZW1lbnQgc3Ryb25nIGNvdW50CisgICAgLy8gdG8gcHJldmVudCAidGhpcyIgYmVpbmcgZGVzdHJ1Y3RlZC4KKyAgICB0aGlzLT5pbmNTdHJvbmcodGhpcyk7CisKKyAgICBpZiAoIUhpZFJhd0RldmljZTo6aXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmRpZ2VzdCA6IG1EaWdlc3RWZWN0b3IpIHsgLy8gZm9yIGVhY2ggdXNhZ2UgLSB2ZWM8UmVwb3J0UGFja2V0PiBwYWlyCisgICAgICAgIHVpbnQzMl90IHVzYWdlID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+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+bVZhbGlkKSB7CisgICAgICAgICAgICAgICAgICAgIExPR19WIDw8ICJVc2FnZSAiIDw8IHN0ZDo6aGV4IDw8IGRpZ2VzdC5mdWxsVXNhZ2UgPDwgc3RkOjpkZWMgPDwgTE9HX0VOREw7CisgICAgICAgICAgICAgICAgICAgIExPR19WIDw8IHMtPmR1bXAoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMT0dfViA8PCAiU2Vuc29yIG9mIHVzYWdlICIgPDwgc3RkOjpoZXggPDwgZGlnZXN0LmZ1bGxVc2FnZSA8PCBzdGQ6OmRlYworICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIG5vdCB2YWxpZCEiIDw8IExPR19FTkRMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExPR19WIDw8IExPR19FTkRMOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorfTsKKworfS8vIG5hbWVzcGFjZSBTZW5zb3JIYWxFeHQKK30vLyBuYW1lc3BhY2UgYW5kcm9pZAorCitpbnQgbWFpbigpIHsKKyAgICByZXR1cm4gYW5kcm9pZDo6U2Vuc29ySGFsRXh0OjpIaWRSYXdTZW5zb3JUZXN0Ojp0ZXN0KCkgPyAwIDogMTsKK30KZGlmZiAtLWdpdCBhL21vZHVsZXMvc2Vuc29ycy9tdWx0aWhhbC5jcHAgYi9tb2R1bGVzL3NlbnNvcnMvbXVsdGloYWwuY3BwCmluZGV4IGYzOGQ5MGQuLjg4N2E0YmEgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvc2Vuc29ycy9tdWx0aWhhbC5jcHAKKysrIGIvbW9kdWxlcy9zZW5zb3JzL211bHRpaGFsLmNwcApAQCAtMTQsMzMgKzE0LDMwIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8aGFyZHdhcmUvc2Vuc29ycy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxkaXJlbnQuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8cG9sbC5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CisjaW5jbHVkZSAiU2Vuc29yRXZlbnRRdWV1ZS5oIgorI2luY2x1ZGUgIm11bHRpaGFsLmgiCiAKICNkZWZpbmUgTE9HX05ERUJVRyAxCiAjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9zZW5zb3JzLmg+CiAKICNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPGZzdHJlYW0+CiAjaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KIAotI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CiAjaW5jbHVkZSA8ZGxmY24uaD4KLSNpbmNsdWRlIDxTZW5zb3JFdmVudFF1ZXVlLmg+Ci0KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHBvbGwuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KIAotc3RhdGljIGNvbnN0IGNoYXIqIENPTkZJR19GSUxFTkFNRSA9ICIvc3lzdGVtL2V0Yy9zZW5zb3JzL2hhbHMuY29uZiI7Ci1zdGF0aWMgY29uc3QgaW50IE1BWF9DT05GX0xJTkVfTEVOR1RIID0gMTAyNDsKIAogc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBpbml0X21vZHVsZXNfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwogc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBpbml0X3NlbnNvcnNfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwpAQCAtMjU4LDkgKzI1NSw5IEBACiAgICAgfQogfQogCi0vLyBBbmRyb2lkIEwgcmVxdWlyZXMgc2Vuc29yIEhBTHMgdG8gYmUgZWl0aGVyIDFfMCBvciAxXzMgY29tcGxpYW50CisvLyBBbmRyb2lkIE4gYW5kIGhpcmUgcmVxdWlyZSBzZW5zb3IgSEFMcyB0byBiZSBhdCBsZWFzdCAxXzMgY29tcGxpYW50CiAjZGVmaW5lIEhBTF9WRVJTSU9OX0lTX0NPTVBMSUFOVCh2ZXJzaW9uKSAgXAotICAgICh2ZXJzaW9uID09IFNFTlNPUlNfREVWSUNFX0FQSV9WRVJTSU9OXzFfMCB8fCB2ZXJzaW9uID49IFNFTlNPUlNfREVWSUNFX0FQSV9WRVJTSU9OXzFfMykKKyAgICAodmVyc2lvbiA+PSBTRU5TT1JTX0RFVklDRV9BUElfVkVSU0lPTl8xXzMpCiAKIC8vIFJldHVybnMgdHJ1ZSBpZiBIQUwgaXMgY29tcGxpYW50LCBmYWxzZSBpZiBIQUwgaXMgbm90IGNvbXBsaWFudCBvciBpZiBoYW5kbGUgaXMgaW52YWxpZAogc3RhdGljIGJvb2wgaGFsSXNDb21wbGlhbnQoc2Vuc29yc19wb2xsX2NvbnRleHRfdCAqY3R4LCBpbnQgaGFuZGxlKSB7CkBAIC01MDMsMTUgKzUwMCwzMiBAQAogICogVGhlIHZlY3RvciBtdXN0IG5vdCBiZSBudWxsLgogICovCiBzdGF0aWMgdm9pZCBnZXRfc29fcGF0aHMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICpzb19wYXRocykgewotICAgIHN0ZDo6c3RyaW5nIGxpbmU7Ci0gICAgc3RkOjppZnN0cmVhbSBjb25mX2ZpbGUoQ09ORklHX0ZJTEVOQU1FKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyICo+IGNvbmZpZ19wYXRoX2xpc3QoCisgICAgICAgICAgICB7IE1VTFRJX0hBTF9DT05GSUdfRklMRV9QQVRILCBERVBSRUNBVEVEX01VTFRJX0hBTF9DT05GSUdfRklMRV9QQVRIIH0pOwogCi0gICAgaWYoIWNvbmZfZmlsZSkgewotICAgICAgICBBTE9HVygiTm8gbXVsdGloYWwgY29uZmlnIGZpbGUgZm91bmQgYXQgJXMiLCBDT05GSUdfRklMRU5BTUUpOworICAgIHN0ZDo6aWZzdHJlYW0gc3RyZWFtOworICAgIGNvbnN0IGNoYXIgKnBhdGggPSBudWxscHRyOworICAgIGZvciAoYXV0byBpIDogY29uZmlnX3BhdGhfbGlzdCkgeworICAgICAgICBzdGQ6Omlmc3RyZWFtIGYoaSk7CisgICAgICAgIGlmIChmKSB7CisgICAgICAgICAgICBzdHJlYW0gPSBzdGQ6Om1vdmUoZik7CisgICAgICAgICAgICBwYXRoID0gaTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmKCFzdHJlYW0pIHsKKyAgICAgICAgQUxPR1coIk5vIG11bHRpaGFsIGNvbmZpZyBmaWxlIGZvdW5kIik7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgQUxPR1YoIk11bHRpaGFsIGNvbmZpZyBmaWxlIGZvdW5kIGF0ICVzIiwgQ09ORklHX0ZJTEVOQU1FKTsKLSAgICB3aGlsZSAoc3RkOjpnZXRsaW5lKGNvbmZfZmlsZSwgbGluZSkpIHsKKworICAgIEFMT0dFX0lGKHN0cmNtcChwYXRoLCBERVBSRUNBVEVEX01VTFRJX0hBTF9DT05GSUdfRklMRV9QQVRIKSA9PSAwLAorICAgICAgICAgICAgIk11bHRpaGFsIGNvbmZpZ3VyYXRpb24gZmlsZSBwYXRoICVzIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggVHJlYmxlICIKKyAgICAgICAgICAgICJyZXF1aXJlbWVudHMuIFBsZWFzZSBtb3ZlIGl0IHRvICVzLiIsCisgICAgICAgICAgICBwYXRoLCBNVUxUSV9IQUxfQ09ORklHX0ZJTEVfUEFUSCk7CisKKyAgICBBTE9HVigiTXVsdGloYWwgY29uZmlnIGZpbGUgZm91bmQgYXQgJXMiLCBwYXRoKTsKKyAgICBzdGQ6OnN0cmluZyBsaW5lOworICAgIHdoaWxlIChzdGQ6OmdldGxpbmUoc3RyZWFtLCBsaW5lKSkgewogICAgICAgICBBTE9HVigiY29uZmlnIGZpbGUgbGluZTogJyVzJyIsIGxpbmUuY19zdHIoKSk7CiAgICAgICAgIHNvX3BhdGhzLT5wdXNoX2JhY2sobGluZSk7CiAgICAgfQpAQCAtNjYwLDYgKzY3NCwxMCBAQAogICAgIC5nZXRfc2Vuc29yc19saXN0ID0gbW9kdWxlX19nZXRfc2Vuc29yc19saXN0CiB9OwogCitzdHJ1Y3Qgc2Vuc29yc19tb2R1bGVfdCAqZ2V0X211bHRpX2hhbF9tb2R1bGVfaW5mbygpIHsKKyAgICByZXR1cm4gKCZIQUxfTU9EVUxFX0lORk9fU1lNKTsKK30KKwogc3RhdGljIGludCBvcGVuX3NlbnNvcnMoY29uc3Qgc3RydWN0IGh3X21vZHVsZV90KiBod19tb2R1bGUsIGNvbnN0IGNoYXIqIG5hbWUsCiAgICAgICAgIHN0cnVjdCBod19kZXZpY2VfdCoqIGh3X2RldmljZV9vdXQpIHsKICAgICBBTE9HVigib3Blbl9zZW5zb3JzIGJlZ2luLi4uIik7CmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvbXVsdGloYWwuaCBiL21vZHVsZXMvc2Vuc29ycy9tdWx0aWhhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNGYyZjAKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1bGVzL3NlbnNvcnMvbXVsdGloYWwuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgSEFSRFdBUkVfTElCSEFSRFdBUkVfTU9EVUxFU19TRU5TT1JTX01VTFRJSEFMX0hfCisjZGVmaW5lIEhBUkRXQVJFX0xJQkhBUkRXQVJFX01PRFVMRVNfU0VOU09SU19NVUxUSUhBTF9IXworCisjaW5jbHVkZSA8aGFyZHdhcmUvc2Vuc29ycy5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CisKK3N0YXRpYyBjb25zdCBjaGFyKiBNVUxUSV9IQUxfQ09ORklHX0ZJTEVfUEFUSCA9ICIvdmVuZG9yL2V0Yy9zZW5zb3JzL2hhbHMuY29uZiI7CisKKy8vIERlcHJhY2F0ZWQgYmVjYXVzZSBzeXN0ZW0gcGFydGl0aW9uIEhBTCBjb25maWcgZmlsZSBkb2VzIG5vdCBzYXRpc2Z5IHRyZWJsZSByZXF1aXJlbWVudHMuCitzdGF0aWMgY29uc3QgY2hhciogREVQUkVDQVRFRF9NVUxUSV9IQUxfQ09ORklHX0ZJTEVfUEFUSCA9ICIvc3lzdGVtL2V0Yy9zZW5zb3JzL2hhbHMuY29uZiI7CisKK3N0cnVjdCBzZW5zb3JzX21vZHVsZV90ICpnZXRfbXVsdGlfaGFsX21vZHVsZV9pbmZvKHZvaWQpOworCisjZW5kaWYgLy8gSEFSRFdBUkVfTElCSEFSRFdBUkVfTU9EVUxFU19TRU5TT1JTX01VTFRJSEFMX0hfCmRpZmYgLS1naXQgYS9tb2R1bGVzL3NlbnNvcnMvdGVzdHMvU2Vuc29yRXZlbnRRdWV1ZV90ZXN0LmNwcCBiL21vZHVsZXMvc2Vuc29ycy90ZXN0cy9TZW5zb3JFdmVudFF1ZXVlX3Rlc3QuY3BwCmluZGV4IDMyMThiYjkuLmQzZDc1ZWUgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvc2Vuc29ycy90ZXN0cy9TZW5zb3JFdmVudFF1ZXVlX3Rlc3QuY3BwCisrKyBiL21vZHVsZXMvc2Vuc29ycy90ZXN0cy9TZW5zb3JFdmVudFF1ZXVlX3Rlc3QuY3BwCkBAIC0zMiw3ICszMiw3IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgY2hlY2tJbnQoY2hhciogbXNnLCBpbnQgZXhwZWN0ZWQsIGludCBhY3R1YWwpIHsKK2Jvb2wgY2hlY2tJbnQoY29uc3QgY2hhciogbXNnLCBpbnQgZXhwZWN0ZWQsIGludCBhY3R1YWwpIHsKICAgICBpZiAoYWN0dWFsICE9IGV4cGVjdGVkKSB7CiAgICAgICAgIHByaW50ZigiJXM7IGV4cGVjdGVkICVkOyBhY3R1YWwgd2FzICVkXG4iLCBtc2csIGV4cGVjdGVkLCBhY3R1YWwpOwogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xODcsNyArMTg3LDcgQEAKIH0KIAogCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKK2ludCBtYWluKGludCBhcmdjIF9fYXR0cmlidXRlKCh1bnVzZWQpKSwgY2hhciAqKmFyZ3YgX19hdHRyaWJ1dGUoKHVudXNlZCkpKSB7CiAgICAgaWYgKHRlc3RTaW1wbGVXcml0ZVNpemVDb3VudHMoKSAmJgogICAgICAgICAgICAgdGVzdFdyYXBwaW5nV3JpdGVTaXplQ291bnRzKCkgJiYKICAgICAgICAgICAgIHRlc3RGdWxsUXVldWVJbygpKSB7CmRpZmYgLS1naXQgYS9tb2R1bGVzL3NvdW5kdHJpZ2dlci9BbmRyb2lkLm1rIGIvbW9kdWxlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5tawppbmRleCBiYjU4MDUzLi44MjUwZjliIDEwMDY0NAotLS0gYS9tb2R1bGVzL3NvdW5kdHJpZ2dlci9BbmRyb2lkLm1rCisrKyBiL21vZHVsZXMvc291bmR0cmlnZ2VyL0FuZHJvaWQubWsKQEAgLTE5LDYgKzE5LDcgQEAKIAogTE9DQUxfTU9EVUxFIDo9IHNvdW5kX3RyaWdnZXIuc3R1Yi5kZWZhdWx0CiBMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBodworTE9DQUxfUFJPUFJJRVRBUllfTU9EVUxFIDo9IHRydWUKIExPQ0FMX1NSQ19GSUxFUyA6PSBzb3VuZF90cmlnZ2VyX2h3LmMKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlibG9nIGxpYmN1dGlscwogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKZGlmZiAtLWdpdCBhL21vZHVsZXMvdGhlcm1hbC9BbmRyb2lkLm1rIGIvbW9kdWxlcy90aGVybWFsL0FuZHJvaWQubWsKaW5kZXggODBhZDc4YS4uZmY1MTE0NSAxMDA2NDQKLS0tIGEvbW9kdWxlcy90aGVybWFsL0FuZHJvaWQubWsKKysrIGIvbW9kdWxlcy90aGVybWFsL0FuZHJvaWQubWsKQEAgLTE4LDYgKzE4LDcgQEAKIAogTE9DQUxfTU9EVUxFIDo9IHRoZXJtYWwuZGVmYXVsdAogTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gaHcKK0xPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSA6PSB0cnVlCiBMT0NBTF9TUkNfRklMRVMgOj0gdGhlcm1hbC5jCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmxvZyBsaWJjdXRpbHMKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCmRpZmYgLS1naXQgYS9tb2R1bGVzL3R2X2lucHV0L0FuZHJvaWQuYnAgYi9tb2R1bGVzL3R2X2lucHV0L0FuZHJvaWQuYnAKaW5kZXggYmVhYzEzMi4uNTA5MTk4ZCAxMDA2NDQKLS0tIGEvbW9kdWxlcy90dl9pbnB1dC9BbmRyb2lkLmJwCisrKyBiL21vZHVsZXMvdHZfaW5wdXQvQW5kcm9pZC5icApAQCAtMTUsNiArMTUsNyBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJ0dl9pbnB1dC5kZWZhdWx0IiwKICAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJodyIsCisgICAgcHJvcHJpZXRhcnk6IHRydWUsCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLApkaWZmIC0tZ2l0IGEvbW9kdWxlcy90dl9pbnB1dC90dl9pbnB1dC5jcHAgYi9tb2R1bGVzL3R2X2lucHV0L3R2X2lucHV0LmNwcAppbmRleCBmOTNjYjIwLi40YzQyNTE4IDEwMDY0NAotLS0gYS9tb2R1bGVzL3R2X2lucHV0L3R2X2lucHV0LmNwcAorKysgYi9tb2R1bGVzL3R2X2lucHV0L3R2X2lucHV0LmNwcApAQCAtMzcsMTggKzM3LDE4IEBACiAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUsIHN0cnVjdCBod19kZXZpY2VfdCoqIGRldmljZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgaHdfbW9kdWxlX21ldGhvZHNfdCB0dl9pbnB1dF9tb2R1bGVfbWV0aG9kcyA9IHsKLSAgICBvcGVuOiB0dl9pbnB1dF9kZXZpY2Vfb3BlbgorICAgIC5vcGVuID0gdHZfaW5wdXRfZGV2aWNlX29wZW4KIH07CiAKIHR2X2lucHV0X21vZHVsZV90IEhBTF9NT0RVTEVfSU5GT19TWU0gPSB7Ci0gICAgY29tbW9uOiB7Ci0gICAgICAgIHRhZzogSEFSRFdBUkVfTU9EVUxFX1RBRywKLSAgICAgICAgdmVyc2lvbl9tYWpvcjogMCwKLSAgICAgICAgdmVyc2lvbl9taW5vcjogMSwKLSAgICAgICAgaWQ6IFRWX0lOUFVUX0hBUkRXQVJFX01PRFVMRV9JRCwKLSAgICAgICAgbmFtZTogIlNhbXBsZSBUViBpbnB1dCBtb2R1bGUiLAotICAgICAgICBhdXRob3I6ICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IiwKLSAgICAgICAgbWV0aG9kczogJnR2X2lucHV0X21vZHVsZV9tZXRob2RzLAorICAgIC5jb21tb24gPSB7CisgICAgICAgIC50YWcgPSBIQVJEV0FSRV9NT0RVTEVfVEFHLAorICAgICAgICAudmVyc2lvbl9tYWpvciA9IDAsCisgICAgICAgIC52ZXJzaW9uX21pbm9yID0gMSwKKyAgICAgICAgLmlkID0gVFZfSU5QVVRfSEFSRFdBUkVfTU9EVUxFX0lELAorICAgICAgICAubmFtZSA9ICJTYW1wbGUgVFYgaW5wdXQgbW9kdWxlIiwKKyAgICAgICAgLmF1dGhvciA9ICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IiwKKyAgICAgICAgLm1ldGhvZHMgPSAmdHZfaW5wdXRfbW9kdWxlX21ldGhvZHMsCiAgICAgfQogfTsKIApkaWZmIC0tZ2l0IGEvbW9kdWxlcy91c2JhdWRpby9BbmRyb2lkLm1rIGIvbW9kdWxlcy91c2JhdWRpby9BbmRyb2lkLm1rCmluZGV4IDlkZjFlNzkuLmIzNmJmOWYgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvdXNiYXVkaW8vQW5kcm9pZC5taworKysgYi9tb2R1bGVzL3VzYmF1ZGlvL0FuZHJvaWQubWsKQEAgLTE4LDYgKzE4LDcgQEAKIAogTE9DQUxfTU9EVUxFIDo9IGF1ZGlvLnVzYi5kZWZhdWx0CiBMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBodworTE9DQUxfUFJPUFJJRVRBUllfTU9EVUxFIDo9IHRydWUKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCiAJYXVkaW9faGFsLmMKIExPQ0FMX0NfSU5DTFVERVMgKz0gXApkaWZmIC0tZ2l0IGEvbW9kdWxlcy91c2JhdWRpby9hdWRpb19oYWwuYyBiL21vZHVsZXMvdXNiYXVkaW8vYXVkaW9faGFsLmMKaW5kZXggNmEzYzVkYS4uZGY0YmMwZiAxMDA2NDQKLS0tIGEvbW9kdWxlcy91c2JhdWRpby9hdWRpb19oYWwuYworKysgYi9tb2R1bGVzL3VzYmF1ZGlvL2F1ZGlvX2hhbC5jCkBAIC05MzMsNyArOTMzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqKnN0cmVhbV9pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzIF9fdW51c2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MgLypfX3VudXNlZCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlIF9fdW51c2VkKQogewogICAgIEFMT0dWKCJhZGV2X29wZW5faW5wdXRfc3RyZWFtKCkgcmF0ZTolIiBQUkl1MzIgIiwgY2hhbk1hc2s6MHglIiBQUklYMzIgIiwgZm10OiUiIFBSSXU4LApAQCAtOTg5LDcgKzk4OSw3IEBACiAgICAgICAgIHJldCA9IGNvbmZpZy0+c2FtcGxlX3JhdGUgIT0gaW4tPmFkZXYtPmRldmljZV9zYW1wbGVfcmF0ZSA/IC1FSU5WQUwgOiAwOwogICAgICAgICBwcm94eV9jb25maWcucmF0ZSA9IGNvbmZpZy0+c2FtcGxlX3JhdGUgPSBpbi0+YWRldi0+ZGV2aWNlX3NhbXBsZV9yYXRlOwogICAgIH0gZWxzZSBpZiAocHJvZmlsZV9pc19zYW1wbGVfcmF0ZV92YWxpZChpbi0+cHJvZmlsZSwgY29uZmlnLT5zYW1wbGVfcmF0ZSkpIHsKLSAgICAgICAgaW4tPmFkZXYtPmRldmljZV9zYW1wbGVfcmF0ZSA9IHByb3h5X2NvbmZpZy5yYXRlID0gY29uZmlnLT5zYW1wbGVfcmF0ZTsKKyAgICAgICAgcHJveHlfY29uZmlnLnJhdGUgPSBjb25maWctPnNhbXBsZV9yYXRlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHByb3h5X2NvbmZpZy5yYXRlID0gY29uZmlnLT5zYW1wbGVfcmF0ZSA9IHByb2ZpbGVfZ2V0X2RlZmF1bHRfc2FtcGxlX3JhdGUoaW4tPnByb2ZpbGUpOwogICAgICAgICByZXQgPSAtRUlOVkFMOwpAQCAtMTA1MywxOCArMTA1MywyOSBAQAogICAgICAgICAvLyBhbmQgc3RvcmUgVEhBVCBpbiBwcm94eV9jb25maWcuY2hhbm5lbHMKICAgICAgICAgcHJveHlfY29uZmlnLmNoYW5uZWxzID0KICAgICAgICAgICAgICAgICBwcm9maWxlX2dldF9jbG9zZXN0X2NoYW5uZWxfY291bnQoaW4tPnByb2ZpbGUsIGluLT5oYWxfY2hhbm5lbF9jb3VudCk7Ci0gICAgICAgIHByb3h5X3ByZXBhcmUoJmluLT5wcm94eSwgaW4tPnByb2ZpbGUsICZwcm94eV9jb25maWcpOworICAgICAgICByZXQgPSBwcm94eV9wcmVwYXJlKCZpbi0+cHJveHksIGluLT5wcm9maWxlLCAmcHJveHlfY29uZmlnKTsKKyAgICAgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgICAgICBpbi0+c3RhbmRieSA9IHRydWU7CiAKLSAgICAgICAgaW4tPnN0YW5kYnkgPSB0cnVlOworICAgICAgICAgICAgaW4tPmNvbnZlcnNpb25fYnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIGluLT5jb252ZXJzaW9uX2J1ZmZlcl9zaXplID0gMDsKIAotICAgICAgICBpbi0+Y29udmVyc2lvbl9idWZmZXIgPSBOVUxMOwotICAgICAgICBpbi0+Y29udmVyc2lvbl9idWZmZXJfc2l6ZSA9IDA7CisgICAgICAgICAgICAqc3RyZWFtX2luID0gJmluLT5zdHJlYW07CiAKLSAgICAgICAgKnN0cmVhbV9pbiA9ICZpbi0+c3RyZWFtOworICAgICAgICAgICAgLyogU2F2ZSB0aGlzIGZvciBhZGV2X2R1bXAoKSAqLworICAgICAgICAgICAgYWRldl9hZGRfc3RyZWFtX3RvX2xpc3QoaW4tPmFkZXYsICZpbi0+YWRldi0+aW5wdXRfc3RyZWFtX2xpc3QsICZpbi0+bGlzdF9ub2RlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCJwcm94eV9wcmVwYXJlIGVycm9yICVkIiwgcmV0KTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY291bnQgPSBwcm94eV9nZXRfY2hhbm5lbF9jb3VudCgmaW4tPnByb3h5KTsKKyAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrID0gY2hhbm5lbF9jb3VudCA8PSBGQ0NfMgorICAgICAgICAgICAgICAgID8gYXVkaW9fY2hhbm5lbF9pbl9tYXNrX2Zyb21fY291bnQoY2hhbm5lbF9jb3VudCkKKyAgICAgICAgICAgICAgICA6IGF1ZGlvX2NoYW5uZWxfbWFza19mb3JfaW5kZXhfYXNzaWdubWVudF9mcm9tX2NvdW50KGNoYW5uZWxfY291bnQpOworICAgICAgICAgICAgY29uZmlnLT5mb3JtYXQgPSBhdWRpb19mb3JtYXRfZnJvbV9wY21fZm9ybWF0KHByb3h5X2dldF9mb3JtYXQoJmluLT5wcm94eSkpOworICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSA9IHByb3h5X2dldF9zYW1wbGVfcmF0ZSgmaW4tPnByb3h5KTsKKyAgICAgICAgfQorICAgIH0KIAotICAgICAgICAvKiBTYXZlIHRoaXMgZm9yIGFkZXZfZHVtcCgpICovCi0gICAgICAgIGFkZXZfYWRkX3N0cmVhbV90b19saXN0KGluLT5hZGV2LCAmaW4tPmFkZXYtPmlucHV0X3N0cmVhbV9saXN0LCAmaW4tPmxpc3Rfbm9kZSk7Ci0gICAgfSBlbHNlIHsKKyAgICBpZiAocmV0ICE9IDApIHsKICAgICAgICAgLy8gRGVhbGxvY2F0ZSB0aGlzIHN0cmVhbSBvbiBlcnJvciwgYmVjYXVzZSBBdWRpb0ZsaW5nZXIgd29uJ3QgY2FsbAogICAgICAgICAvLyBhZGV2X2Nsb3NlX2lucHV0X3N0cmVhbSgpIGluIHRoaXMgY2FzZS4KICAgICAgICAgKnN0cmVhbV9pbiA9IE5VTEw7CmRpZmYgLS1naXQgYS9tb2R1bGVzL3VzYmNhbWVyYS9DYW1lcmEuY3BwIGIvbW9kdWxlcy91c2JjYW1lcmEvQ2FtZXJhLmNwcAppbmRleCA1MDBhOTgyLi4wMzI0ZGE4IDEwMDY0NAotLS0gYS9tb2R1bGVzL3VzYmNhbWVyYS9DYW1lcmEuY3BwCisrKyBiL21vZHVsZXMvdXNiY2FtZXJhL0NhbWVyYS5jcHAKQEAgLTQ5MSw5ICs0OTEsOSBAQAogICAgIC8vIFRPRE86IGR1bXAgYWxsIHNldHRpbmdzCiAgICAgZHByaW50ZihmZCwgIk1vc3QgUmVjZW50IFNldHRpbmdzOiAoJXApXG4iLCBtU2V0dGluZ3MpOwogCi0gICAgZHByaW50ZihmZCwgIk51bWJlciBvZiBzdHJlYW1zOiAlZFxuIiwgbVN0cmVhbXMuc2l6ZSgpKTsKKyAgICBkcHJpbnRmKGZkLCAiTnVtYmVyIG9mIHN0cmVhbXM6ICV6dVxuIiwgbVN0cmVhbXMuc2l6ZSgpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdHJlYW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGRwcmludGYoZmQsICJTdHJlYW0gJWQvJWQ6XG4iLCBpLCBtU3RyZWFtcy5zaXplKCkpOworICAgICAgICBkcHJpbnRmKGZkLCAiU3RyZWFtICV6dS8lenU6XG4iLCBpLCBtU3RyZWFtcy5zaXplKCkpOwogICAgICAgICBtU3RyZWFtc1tpXS0+ZHVtcChmZCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy91c2JjYW1lcmEvQ2FtZXJhSEFMLmNwcCBiL21vZHVsZXMvdXNiY2FtZXJhL0NhbWVyYUhBTC5jcHAKaW5kZXggZWVjMTA0NC4uMWE1ZWIzYSAxMDA2NDQKLS0tIGEvbW9kdWxlcy91c2JjYW1lcmEvQ2FtZXJhSEFMLmNwcAorKysgYi9tb2R1bGVzL3VzYmNhbWVyYS9DYW1lcmFIQUwuY3BwCkBAIC02OSw3ICs2OSw3IEBACiAKIGludCBDYW1lcmFIQUw6OmdldE51bWJlck9mQ2FtZXJhcygpIHsKICAgICBhbmRyb2lkOjpNdXRleDo6QXV0b2xvY2sgYWwobU1vZHVsZUxvY2spOwotICAgIEFMT0dWKCIlczogJWQiLCBfX2Z1bmNfXywgbUNhbWVyYXMuc2l6ZSgpKTsKKyAgICBBTE9HVigiJXM6ICV6dSIsIF9fZnVuY19fLCBtQ2FtZXJhcy5zaXplKCkpOwogICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KG1DYW1lcmFzLnNpemUoKSk7CiB9CiAKQEAgLTEzMCwyOSArMTMwLDI5IEBACiB9CiAKIHN0YXRpYyBod19tb2R1bGVfbWV0aG9kc190IGdDYW1lcmFNb2R1bGVNZXRob2RzID0gewotICAgIG9wZW4gOiBvcGVuX2RldgorICAgIC5vcGVuID0gb3Blbl9kZXYKIH07CiAKIGNhbWVyYV9tb2R1bGVfdCBIQUxfTU9EVUxFX0lORk9fU1lNIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKSA9IHsKLSAgICBjb21tb24gOiB7Ci0gICAgICAgIHRhZyAgICAgICAgICAgICAgICA6IEhBUkRXQVJFX01PRFVMRV9UQUcsCi0gICAgICAgIG1vZHVsZV9hcGlfdmVyc2lvbiA6IENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl80LAotICAgICAgICBoYWxfYXBpX3ZlcnNpb24gICAgOiBIQVJEV0FSRV9IQUxfQVBJX1ZFUlNJT04sCi0gICAgICAgIGlkICAgICAgICAgICAgICAgICA6IENBTUVSQV9IQVJEV0FSRV9NT0RVTEVfSUQsCi0gICAgICAgIG5hbWUgICAgICAgICAgICAgICA6ICJEZWZhdWx0IFVTQiBDYW1lcmEgSEFMIiwKLSAgICAgICAgYXV0aG9yICAgICAgICAgICAgIDogIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QiLAotICAgICAgICBtZXRob2RzICAgICAgICAgICAgOiAmZ0NhbWVyYU1vZHVsZU1ldGhvZHMsCi0gICAgICAgIGRzbyAgICAgICAgICAgICAgICA6IE5VTEwsCi0gICAgICAgIHJlc2VydmVkICAgICAgICAgICA6IHswfSwKKyAgICAuY29tbW9uID0geworICAgICAgICAudGFnICAgICAgICAgICAgICAgID0gSEFSRFdBUkVfTU9EVUxFX1RBRywKKyAgICAgICAgLm1vZHVsZV9hcGlfdmVyc2lvbiA9IENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl80LAorICAgICAgICAuaGFsX2FwaV92ZXJzaW9uICAgID0gSEFSRFdBUkVfSEFMX0FQSV9WRVJTSU9OLAorICAgICAgICAuaWQgICAgICAgICAgICAgICAgID0gQ0FNRVJBX0hBUkRXQVJFX01PRFVMRV9JRCwKKyAgICAgICAgLm5hbWUgICAgICAgICAgICAgICA9ICJEZWZhdWx0IFVTQiBDYW1lcmEgSEFMIiwKKyAgICAgICAgLmF1dGhvciAgICAgICAgICAgICA9ICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IiwKKyAgICAgICAgLm1ldGhvZHMgICAgICAgICAgICA9ICZnQ2FtZXJhTW9kdWxlTWV0aG9kcywKKyAgICAgICAgLmRzbyAgICAgICAgICAgICAgICA9IE5VTEwsCisgICAgICAgIC5yZXNlcnZlZCAgICAgICAgICAgPSB7MH0sCiAgICAgfSwKLSAgICBnZXRfbnVtYmVyX29mX2NhbWVyYXMgOiBnZXRfbnVtYmVyX29mX2NhbWVyYXMsCi0gICAgZ2V0X2NhbWVyYV9pbmZvICAgICAgIDogZ2V0X2NhbWVyYV9pbmZvLAotICAgIHNldF9jYWxsYmFja3MgICAgICAgICA6IHNldF9jYWxsYmFja3MsCi0gICAgZ2V0X3ZlbmRvcl90YWdfb3BzICAgIDogTlVMTCwKLSAgICBvcGVuX2xlZ2FjeSAgICAgICAgICAgOiBOVUxMLAotICAgIHNldF90b3JjaF9tb2RlICAgICAgICA6IE5VTEwsCi0gICAgaW5pdCAgICAgICAgICAgICAgICAgIDogTlVMTCwKLSAgICByZXNlcnZlZCAgICAgICAgICAgICAgOiB7MH0sCisgICAgLmdldF9udW1iZXJfb2ZfY2FtZXJhcyA9IGdldF9udW1iZXJfb2ZfY2FtZXJhcywKKyAgICAuZ2V0X2NhbWVyYV9pbmZvICAgICAgID0gZ2V0X2NhbWVyYV9pbmZvLAorICAgIC5zZXRfY2FsbGJhY2tzICAgICAgICAgPSBzZXRfY2FsbGJhY2tzLAorICAgIC5nZXRfdmVuZG9yX3RhZ19vcHMgICAgPSBOVUxMLAorICAgIC5vcGVuX2xlZ2FjeSAgICAgICAgICAgPSBOVUxMLAorICAgIC5zZXRfdG9yY2hfbW9kZSAgICAgICAgPSBOVUxMLAorICAgIC5pbml0ICAgICAgICAgICAgICAgICAgPSBOVUxMLAorICAgIC5yZXNlcnZlZCAgICAgICAgICAgICAgPSB7MH0sCiB9OwogfSAvLyBleHRlcm4gIkMiCiAKZGlmZiAtLWdpdCBhL21vZHVsZXMvdXNiY2FtZXJhL0hvdHBsdWdUaHJlYWQuY3BwIGIvbW9kdWxlcy91c2JjYW1lcmEvSG90cGx1Z1RocmVhZC5jcHAKaW5kZXggODBmMThjOC4uNjE4OGVkZSAxMDA2NDQKLS0tIGEvbW9kdWxlcy91c2JjYW1lcmEvSG90cGx1Z1RocmVhZC5jcHAKKysrIGIvbW9kdWxlcy91c2JjYW1lcmEvSG90cGx1Z1RocmVhZC5jcHAKQEAgLTQwLDYgKzQwLDcgQEAKIH0KIAogYm9vbCBIb3RwbHVnVGhyZWFkOjp0aHJlYWRMb29wKCkgeworICAgICh2b2lkKW1Nb2R1bGU7ICAvLyBzaWxlbmNlIHdhcm5pbmcgYWJvdXQgdW51c2VkIG1lbWJlci4KIAogICAgIC8qKgogICAgICAqIENoZWNrIGNhbWVyYSBjb25uZWN0aW9uIHN0YXR1cyBjaGFuZ2UsIGlmIGNvbm5lY3RlZCwgZG8gYmVsb3c6CmRpZmYgLS1naXQgYS9tb2R1bGVzL3VzYmNhbWVyYS9TdHJlYW0uY3BwIGIvbW9kdWxlcy91c2JjYW1lcmEvU3RyZWFtLmNwcAppbmRleCA0NWU3ZmMyLi5kNDE4Nzk4IDEwMDY0NAotLS0gYS9tb2R1bGVzL3VzYmNhbWVyYS9TdHJlYW0uY3BwCisrKyBiL21vZHVsZXMvdXNiY2FtZXJhL1N0cmVhbS5jcHAKQEAgLTE3MiwxMCArMTcyLDkgQEAKICAgICAvLyBUb0RvOiBwcmV0dHlwcmludCB1c2FnZSBtYXNrIGZsYWdzCiAgICAgZHByaW50ZihmZCwgIkdyYWxsb2MgVXNhZ2UgTWFzazogJSMiIFBSSXgzMiAiXG4iLCBtU3RyZWFtLT51c2FnZSk7CiAgICAgZHByaW50ZihmZCwgIk1heCBCdWZmZXIgQ291bnQ6ICUiIFBSSXUzMiAiXG4iLCBtU3RyZWFtLT5tYXhfYnVmZmVycyk7Ci0gICAgZHByaW50ZihmZCwgIk51bWJlciBvZiBCdWZmZXJzIGluIHVzZSBieSBIQUw6ICUiIFBSSXUzMiAiXG4iLCBtQnVmZmVycy5zaXplKCkpOworICAgIGRwcmludGYoZmQsICJOdW1iZXIgb2YgQnVmZmVycyBpbiB1c2UgYnkgSEFMOiAlenVcbiIsIG1CdWZmZXJzLnNpemUoKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVycy5zaXplKCk7IGkrKykgewotICAgICAgICBkcHJpbnRmKGZkLCAiQnVmZmVyICUiIFBSSXUzMiAiLyUiIFBSSXUzMiAiOiAlcFxuIiwgaSwgbUJ1ZmZlcnMuc2l6ZSgpLAotICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldKTsKKyAgICAgICAgZHByaW50ZihmZCwgIkJ1ZmZlciAlenUvJXp1OiAlcFxuIiwgaSwgbUJ1ZmZlcnMuc2l6ZSgpLCBtQnVmZmVyc1tpXSk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9tb2R1bGVzL3VzYmNhbWVyYS9Vc2JDYW1lcmEuY3BwIGIvbW9kdWxlcy91c2JjYW1lcmEvVXNiQ2FtZXJhLmNwcAppbmRleCBlYzk0OWFlLi42NWNiZWM5IDEwMDY0NAotLS0gYS9tb2R1bGVzL3VzYmNhbWVyYS9Vc2JDYW1lcmEuY3BwCisrKyBiL21vZHVsZXMvdXNiY2FtZXJhL1VzYkNhbWVyYS5jcHAKQEAgLTMxNiw3ICszMTYsNyBAQAogICAgIHJldHVybiBzZXRUZW1wbGF0ZShDQU1FUkEzX1RFTVBMQVRFX01BTlVBTCwgbS5nZXQoKSk7CiB9CiAKLWJvb2wgVXNiQ2FtZXJhOjppc1ZhbGlkQ2FwdHVyZVNldHRpbmdzKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90KiBzZXR0aW5ncykgeworYm9vbCBVc2JDYW1lcmE6OmlzVmFsaWRDYXB0dXJlU2V0dGluZ3MoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QqIC8qc2V0dGluZ3MqLykgewogICAgIC8vIFRPRE86IHJlamVjdCBzZXR0aW5ncyB0aGF0IGNhbm5vdCBiZSBjYXB0dXJlZAogICAgIHJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy92ZWhpY2xlL0FuZHJvaWQubWsgYi9tb2R1bGVzL3ZlaGljbGUvQW5kcm9pZC5tawppbmRleCBhNjY2YmM2Li45ZmQ0OWRhIDEwMDY0NAotLS0gYS9tb2R1bGVzL3ZlaGljbGUvQW5kcm9pZC5taworKysgYi9tb2R1bGVzL3ZlaGljbGUvQW5kcm9pZC5tawpAQCAtMTksNiArMTksNyBAQAogTE9DQUxfTU9EVUxFIDo9IHZlaGljbGUuZGVmYXVsdAogCiBMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBodworTE9DQUxfUFJPUFJJRVRBUllfTU9EVUxFIDo9IHRydWUKIExPQ0FMX0NfSU5DTFVERVMgOj0gaGFyZHdhcmUvbGliaGFyZHdhcmUKIExPQ0FMX1NSQ19GSUxFUyA6PSB2ZWhpY2xlLmMgdGltZVV0aWwuY3BwCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmxvZyBsaWJjdXRpbHMgbGlidXRpbHMKZGlmZiAtLWdpdCBhL21vZHVsZXMvdmVoaWNsZS92ZWhpY2xlLmMgYi9tb2R1bGVzL3ZlaGljbGUvdmVoaWNsZS5jCmluZGV4IDc4NTQ1YWYuLjY2ZTI5YzAgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvdmVoaWNsZS92ZWhpY2xlLmMKKysrIGIvbW9kdWxlcy92ZWhpY2xlL3ZlaGljbGUuYwpAQCAtMjc5LDEwICsyNzksMTAgQEAKICAgICAgICAgICAgIEFMT0dEKCJWYWx1ZSB0eXBlOiBGTE9BVFxuVmFsdWU6ICVmXG4iLCBkYXRhLT52YWx1ZS5mbG9hdF92YWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfSU5UMzI6Ci0gICAgICAgICAgICBBTE9HRCgiVmFsdWUgdHlwZTogSU5UMzJcblZhbHVlOiAlZFxuIiwgZGF0YS0+dmFsdWUuaW50MzJfdmFsdWUpOworICAgICAgICAgICAgQUxPR0QoIlZhbHVlIHR5cGU6IElOVDMyXG5WYWx1ZTogJSIgUFJJZDMyICJcbiIsIGRhdGEtPnZhbHVlLmludDMyX3ZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFZFSElDTEVfVkFMVUVfVFlQRV9JTlQ2NDoKLSAgICAgICAgICAgIEFMT0dEKCJWYWx1ZSB0eXBlOiBJTlQ2NFxuVmFsdWU6ICVsbGRcbiIsIGRhdGEtPnZhbHVlLmludDY0X3ZhbHVlKTsKKyAgICAgICAgICAgIEFMT0dEKCJWYWx1ZSB0eXBlOiBJTlQ2NFxuVmFsdWU6ICUiIFBSSWQ2NCAiXG4iLCBkYXRhLT52YWx1ZS5pbnQ2NF92YWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBWRUhJQ0xFX1ZBTFVFX1RZUEVfQk9PTEVBTjoKICAgICAgICAgICAgIEFMT0dEKCJWYWx1ZSB0eXBlOiBCT09MRUFOXG5WYWx1ZTogJWRcbiIsIGRhdGEtPnZhbHVlLmJvb2xlYW5fdmFsdWUpOwpAQCAtMzMxLDIyICszMzEsNiBAQAogICAgICAgICBldmVudC5wcm9wID0gc3ViLT5wcm9wOwogICAgICAgICBldmVudC50aW1lc3RhbXAgPSBlbGFwc2VkUmVhbHRpbWVOYW5vKCk7CiAgICAgICAgIHN3aXRjaCAoc3ViLT5wcm9wKSB7Ci0gICAgICAgICAgICBjYXNlIFZFSElDTEVfUFJPUEVSVFlfRFJJVklOR19TVEFUVVM6Ci0gICAgICAgICAgICAgICAgZXZlbnQudmFsdWVfdHlwZSA9IFZFSElDTEVfVkFMVUVfVFlQRV9JTlQzMjsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKChldmVudC50aW1lc3RhbXAgJiAweDMwMDAwMDAwKT4+MjgpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQudmFsdWUuZHJpdmluZ19zdGF0dXMgPSBWRUhJQ0xFX0RSSVZJTkdfU1RBVFVTX1VOUkVTVFJJQ1RFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudC52YWx1ZS5kcml2aW5nX3N0YXR1cyA9IFZFSElDTEVfRFJJVklOR19TVEFUVVNfTk9fVklERU87Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQudmFsdWUuZHJpdmluZ19zdGF0dXMgPSBWRUhJQ0xFX0RSSVZJTkdfU1RBVFVTX05PX0tFWUJPQVJEX0lOUFVUOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudC52YWx1ZS5kcml2aW5nX3N0YXR1cyA9IFZFSElDTEVfRFJJVklOR19TVEFUVVNfTk9fQ09ORklHOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgVkVISUNMRV9QUk9QRVJUWV9HRUFSX1NFTEVDVElPTjoKICAgICAgICAgICAgICAgICBldmVudC52YWx1ZV90eXBlID0gVkVISUNMRV9WQUxVRV9UWVBFX0lOVDMyOwogICAgICAgICAgICAgICAgIHN3aXRjaCAoKGV2ZW50LnRpbWVzdGFtcCAmIDB4MzAwMDAwMDApPj4yOCkgewpkaWZmIC0tZ2l0IGEvbW9kdWxlcy92aWJyYXRvci9BbmRyb2lkLmJwIGIvbW9kdWxlcy92aWJyYXRvci9BbmRyb2lkLmJwCmluZGV4IGY5YWZkNDUuLjNjNGFlYmYgMTAwNjQ0Ci0tLSBhL21vZHVsZXMvdmlicmF0b3IvQW5kcm9pZC5icAorKysgYi9tb2R1bGVzL3ZpYnJhdG9yL0FuZHJvaWQuYnAKQEAgLTE4LDYgKzE4LDcgQEAKICAgICAvLyBIQUwgbW9kdWxlIGltcGxlbWVudGF0aW9uIHN0b3JlZCBpbgogICAgIC8vIGh3LzxWSUJSQVRPUl9IQVJEV0FSRV9NT0RVTEVfSUQ+LmRlZmF1bHQuc28KICAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJodyIsCisgICAgcHJvcHJpZXRhcnk6IHRydWUsCiAgICAgaW5jbHVkZV9kaXJzOiBbImhhcmR3YXJlL2xpYmhhcmR3YXJlIl0sCiAgICAgc3JjczogWyJ2aWJyYXRvci5jIl0sCiAgICAgc2hhcmVkX2xpYnM6IFsibGlibG9nIl0sCmRpZmYgLS1naXQgYS9tb2R1bGVzL3ZyL0FuZHJvaWQubWsgYi9tb2R1bGVzL3ZyL0FuZHJvaWQubWsKaW5kZXggNDNjOGU5Mi4uZTA0YzBkYSAxMDA2NDQKLS0tIGEvbW9kdWxlcy92ci9BbmRyb2lkLm1rCisrKyBiL21vZHVsZXMvdnIvQW5kcm9pZC5tawpAQCAtMTgsNiArMTgsNyBAQAogCiBMT0NBTF9NT0RVTEUgOj0gdnIuZGVmYXVsdAogTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gaHcKK0xPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSA6PSB0cnVlCiBMT0NBTF9TUkNfRklMRVMgOj0gdnIuYwogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdXRpbHMKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEyL0FuZHJvaWQubWsgYi90ZXN0cy9jYW1lcmEyL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NWY0NjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY2FtZXJhMi9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCWNhbWVyYTJfdXRpbHMuY3BwIFwKLQltYWluLmNwcCBcCi0JQ2FtZXJhTWV0YWRhdGFUZXN0cy5jcHAgXAotCUNhbWVyYU1vZHVsZVRlc3RzLmNwcCBcCi0JQ2FtZXJhU3RyZWFtVGVzdHMuY3BwIFwKLQlDYW1lcmFGcmFtZVRlc3RzLmNwcCBcCi0JQ2FtZXJhQnVyc3RUZXN0cy5jcHAgXAotCUNhbWVyYU11bHRpU3RyZWFtVGVzdHMuY3BwXAotCUZvcmtlZFRlc3RzLmNwcCBcCi0JVGVzdEZvcmtlckV2ZW50TGlzdGVuZXIuY3BwIFwKLQlUZXN0U2V0dGluZ3MuY3BwIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGlibG9nIFwKLQlsaWJ1dGlscyBcCi0JbGliY3V0aWxzIFwKLQlsaWJoYXJkd2FyZSBcCi0JbGliY2FtZXJhX21ldGFkYXRhIFwKLQlsaWJjYW1lcmFzZXJ2aWNlIFwKLQlsaWJjYW1lcmFfY2xpZW50IFwKLQlsaWJndWkgXAotCWxpYnN5bmMgXAotCWxpYnVpIFwKLQlsaWJkbAotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLQlzeXN0ZW0vbWVkaWEvY2FtZXJhL2luY2x1ZGUgXAotCWZyYW1ld29ya3MvYXYvaW5jbHVkZS8gXAotCWZyYW1ld29ya3MvYXYvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UgXAotCWZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUgXAotCi1MT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdleHRyYQotTE9DQUxfTU9EVUxFOj0gY2FtZXJhMl90ZXN0Ci1MT0NBTF9NT0RVTEVfU1RFTV8zMiA6PSBjYW1lcmEyX3Rlc3QKLUxPQ0FMX01PRFVMRV9TVEVNXzY0IDo9IGNhbWVyYTJfdGVzdDY0Ci1MT0NBTF9NVUxUSUxJQiA6PSBib3RoCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1pbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEyL0NhbWVyYUJ1cnN0VGVzdHMuY3BwIGIvdGVzdHMvY2FtZXJhMi9DYW1lcmFCdXJzdFRlc3RzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk4YzBjMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9jYW1lcmEyL0NhbWVyYUJ1cnN0VGVzdHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotCi0jZGVmaW5lIExPR19UQUcgIkNhbWVyYUJ1cnN0VGVzdCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLQotI2luY2x1ZGUgPGNtYXRoPgotCi0jaW5jbHVkZSAiQ2FtZXJhU3RyZWFtRml4dHVyZS5oIgotI2luY2x1ZGUgIlRlc3RFeHRlbnNpb25zLmgiCi0KLSNkZWZpbmUgQ0FNRVJBX0ZSQU1FX1RJTUVPVVQgICAgMTAwMDAwMDAwMExMIC8vbnNlY3MgKDEgc2VjcykKLSNkZWZpbmUgQ0FNRVJBX0hFQVBfQ09VTlQgICAgICAgMiAvL0hBTEJVRzogMSBtZWFucyByZWdpc3RlckJ1ZmZlcnMgZmFpbHMKLSNkZWZpbmUgQ0FNRVJBX0JVUlNUX0RFQlVHR0lORyAgMAotI2RlZmluZSBDQU1FUkFfRlJBTUVfQlVSU1RfQ09VTlQgMTAKLQotLyogY29uc3RhbnRzIGZvciB0aGUgZXhwb3N1cmUgdGVzdCAqLwotI2RlZmluZSBDQU1FUkFfRVhQT1NVUkVfRE9VQkxFICAyCi0jZGVmaW5lIENBTUVSQV9FWFBPU1VSRV9ET1VCTElOR19USFJFU0hPTEQgMS4wZgotI2RlZmluZSBDQU1FUkFfRVhQT1NVUkVfRE9VQkxJTkdfQ09VTlQgNAotI2RlZmluZSBDQU1FUkFfRVhQT1NVUkVfRk9STUFUIENBTUVSQV9TVFJFQU1fQVVUT19DUFVfRk9STUFUCi0jZGVmaW5lIENBTUVSQV9FWFBPU1VSRV9TVEFSVElORyAxMDAwMDAgLy8gMS8xMG1zLCB1cCB0byA1MS4ybXMgd2l0aCAxMCBzdGVwcwotCi0jZGVmaW5lIFVTRUMgMTAwMExMICAgICAgICAvLyBpbiBucwotI2RlZmluZSBNU0VDIDEwMDAwMDBMTCAgICAgLy8gaW4gbnMKLSNkZWZpbmUgU0VDICAxMDAwMDAwMDAwTEwgIC8vIGluIG5zCi0KLSNpZiBDQU1FUkFfQlVSU1RfREVCVUdHSU5HCi0jZGVmaW5lIGRvdXQgc3RkOjpjb3V0Ci0jZWxzZQotI2RlZmluZSBkb3V0IGlmICgwKSBzdGQ6OmNvdXQKLSNlbmRpZgotCi0jZGVmaW5lIFdBUk5fVU5MRVNTKGNvbmRpdGlvbikgaWYoIShjb25kaXRpb24pKSBzdGQ6OmNlcnIgPDwgIldhcm5pbmc6ICIKLSNkZWZpbmUgV0FSTl9MRShleHAsIGFjdCkgV0FSTl9VTkxFU1MoKGV4cCkgPD0gKGFjdCkpCi0jZGVmaW5lIFdBUk5fTFQoZXhwLCBhY3QpIFdBUk5fVU5MRVNTKChleHApIDwgKGFjdCkpCi0jZGVmaW5lIFdBUk5fR1QoZXhwLCBhY3QpIFdBUk5fVU5MRVNTKChleHApID4gKGFjdCkpCi0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmNhbWVyYTI7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBjYW1lcmEyIHsKLW5hbWVzcGFjZSB0ZXN0cyB7Ci0KLXN0YXRpYyBDYW1lcmFTdHJlYW1QYXJhbXMgU1RSRUFNX1BBUkFNRVRFUlMgPSB7Ci0gICAgLyptRm9ybWF0Ki8gICAgIENBTUVSQV9FWFBPU1VSRV9GT1JNQVQsCi0gICAgLyptSGVhcENvdW50Ki8gIENBTUVSQV9IRUFQX0NPVU5UCi19OwotCi1jbGFzcyBDYW1lcmFCdXJzdFRlc3QKLSAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QsCi0gICAgICBwdWJsaWMgQ2FtZXJhU3RyZWFtRml4dHVyZSB7Ci0KLXB1YmxpYzoKLSAgICBDYW1lcmFCdXJzdFRlc3QoKSA6IENhbWVyYVN0cmVhbUZpeHR1cmUoU1RSRUFNX1BBUkFNRVRFUlMpIHsKLSAgICAgICAgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19DT05TVFJVQ1RPUjsKLQotICAgICAgICBpZiAoSGFzRmF0YWxGYWlsdXJlKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIENyZWF0ZVN0cmVhbSgpOwotICAgIH0KLQotICAgIH5DYW1lcmFCdXJzdFRlc3QoKSB7Ci0gICAgICAgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfREVTVFJVQ1RPUjsKLQotICAgICAgICBpZiAobURldmljZS5nZXQoKSkgewotICAgICAgICAgICAgbURldmljZS0+d2FpdFVudGlsRHJhaW5lZCgpOwotICAgICAgICB9Ci0gICAgICAgIERlbGV0ZVN0cmVhbSgpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICAgICAgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19TRVRfVVA7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICAgICAgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19URUFSX0RPV047Ci0gICAgfQotCi0gICAgLyogdGhpcyBhc3N1bWVzIHRoZSBmb3JtYXQgaXMgWVVWNDIwc3Agb3IgZmxleGlibGUgWVVWICovCi0gICAgbG9uZyBsb25nIFRvdGFsQnJpZ2h0bmVzcyhjb25zdCBDcHVDb25zdW1lcjo6TG9ja2VkQnVmZmVyJiBpbWdCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnVuZGVyZXhwb3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqb3ZlcmV4cG9zZWQpIGNvbnN0IHsKLQotICAgICAgICBjb25zdCB1aW50OF90KiBidWYgPSBpbWdCdWZmZXIuZGF0YTsKLSAgICAgICAgc2l6ZV90IHN0cmlkZSA9IGltZ0J1ZmZlci5zdHJpZGU7Ci0KLSAgICAgICAgLyogaXRlcmF0ZSBvdmVyIHRoZSBZIHBsYW5lIG9ubHkgKi8KLSAgICAgICAgbG9uZyBsb25nIGFjYyA9IDA7Ci0KLSAgICAgICAgKnVuZGVyZXhwb3NlZCA9IDA7Ci0gICAgICAgICpvdmVyZXhwb3NlZCA9IDA7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBpbWdCdWZmZXIuaGVpZ2h0OyArK3kpIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgaW1nQnVmZmVyLndpZHRoOyArK3gpIHsKLSAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHAgPSBidWZbeSAqIHN0cmlkZSArIHhdOwotCi0gICAgICAgICAgICAgICAgaWYgKHAgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAodW5kZXJleHBvc2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICArKyp1bmRlcmV4cG9zZWQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwID09IDI1NSkgewotICAgICAgICAgICAgICAgICAgICBpZiAob3ZlcmV4cG9zZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICsrKm92ZXJleHBvc2VkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGFjYyArPSBwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGFjYzsKLSAgICB9Ci0KLSAgICAvLyBQYXJzZXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nIGxpc3QgaW50byBhIFZlY3RvcgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgdm9pZCBQYXJzZUxpc3QoY29uc3QgY2hhciAqc3JjLCBWZWN0b3I8VD4gJmxpc3QpIHsKLSAgICAgICAgc3RkOjppc3RyaW5nc3RyZWFtIHMoc3JjKTsKLSAgICAgICAgd2hpbGUgKCFzLmVvZigpKSB7Ci0gICAgICAgICAgICBjaGFyIGMgPSBzLnBlZWsoKTsKLSAgICAgICAgICAgIGlmIChjID09ICcsJyB8fCBjID09ICcgJykgewotICAgICAgICAgICAgICAgIHMuaWdub3JlKDEsIEVPRik7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUIHZhbDsKLSAgICAgICAgICAgIHMgPj4gdmFsOwotICAgICAgICAgICAgbGlzdC5wdXNoX2JhY2sodmFsKTsKLSAgICAgICAgfQotICAgIH0KLQotfTsKLQotVEVTVF9GKENhbWVyYUJ1cnN0VGVzdCwgTWFudWFsRXhwb3N1cmVDb250cm9sKSB7Ci0KLSAgICBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX0lOSVQ7Ci0KLSAgICAvLyBSYW5nZSBvZiB2YWxpZCBleHBvc3VyZSB0aW1lcywgaW4gbmFub3NlY29uZHMKLSAgICBpbnQ2NF90IG1pbkV4cCwgbWF4RXhwOwotICAgIHsKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGV4cG9zdXJlVGltZVJhbmdlID0KLSAgICAgICAgICAgIEdldFN0YXRpY0VudHJ5KEFORFJPSURfU0VOU09SX0lORk9fRVhQT1NVUkVfVElNRV9SQU5HRSk7Ci0KLSAgICAgICAgQVNTRVJUX0VRKDJ1LCBleHBvc3VyZVRpbWVSYW5nZS5jb3VudCk7Ci0gICAgICAgIG1pbkV4cCA9IGV4cG9zdXJlVGltZVJhbmdlLmRhdGEuaTY0WzBdOwotICAgICAgICBtYXhFeHAgPSBleHBvc3VyZVRpbWVSYW5nZS5kYXRhLmk2NFsxXTsKLSAgICB9Ci0KLSAgICBkb3V0IDw8ICJNaW4gZXhwb3N1cmUgaXMgIiA8PCBtaW5FeHA7Ci0gICAgZG91dCA8PCAiIG1heCBleHBvc3VyZSBpcyAiIDw8IG1heEV4cCA8PCBzdGQ6OmVuZGw7Ci0KLSAgICAvLyBDYWxjdWxhdGUgc29tZSBzZXQgb2YgdmFsaWQgZXhwb3N1cmUgdGltZXMgZm9yIGVhY2ggcmVxdWVzdAotICAgIGludDY0X3QgZXhwb3N1cmVzW0NBTUVSQV9GUkFNRV9CVVJTVF9DT1VOVF07Ci0gICAgZXhwb3N1cmVzWzBdID0gQ0FNRVJBX0VYUE9TVVJFX1NUQVJUSU5HOwotICAgIGZvciAoaW50IGkgPSAxOyBpIDwgQ0FNRVJBX0ZSQU1FX0JVUlNUX0NPVU5UOyArK2kpIHsKLSAgICAgICAgZXhwb3N1cmVzW2ldID0gZXhwb3N1cmVzW2ktMV0gKiBDQU1FUkFfRVhQT1NVUkVfRE9VQkxFOwotICAgIH0KLSAgICAvLyBPdXIgY2FsY3VsYXRlZCBleHBvc3VyZSB0aW1lcyBzaG91bGQgYmUgaW4gW21pbkV4cCwgbWF4RXhwXQotICAgIEVYUEVDVF9MRShtaW5FeHAsIGV4cG9zdXJlc1swXSkKLSAgICAgICAgPDwgIk1pbmltdW0gZXhwb3N1cmUgcmFuZ2UgaXMgdG9vIGhpZ2gsIHdhbnRlZCBhdCBtb3N0ICIKLSAgICAgICAgPDwgZXhwb3N1cmVzWzBdIDw8ICJucyI7Ci0gICAgRVhQRUNUX0dFKG1heEV4cCwgZXhwb3N1cmVzW0NBTUVSQV9GUkFNRV9CVVJTVF9DT1VOVC0xXSkKLSAgICAgICAgPDwgIk1heGltdW0gZXhwb3N1cmUgcmFuZ2UgaXMgdG9vIGxvdywgd2FudGVkIGF0IGxlYXN0ICIKLSAgICAgICAgPDwgZXhwb3N1cmVzW0NBTUVSQV9GUkFNRV9CVVJTVF9DT1VOVC0xXSA8PCAibnMiOwotCi0gICAgLy8gQ3JlYXRlIGEgcHJldmlldyByZXF1ZXN0LCB0dXJuaW5nIG9mZiBhbGwgM0EKLSAgICBDYW1lcmFNZXRhZGF0YSBwcmV2aWV3UmVxdWVzdDsKLSAgICBBU1NFUlRfRVEoT0ssIG1EZXZpY2UtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KENBTUVSQTJfVEVNUExBVEVfUFJFVklFVywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmV2aWV3UmVxdWVzdCkpOwotICAgIHsKLSAgICAgICAgVmVjdG9yPGludDMyX3Q+IG91dHB1dFN0cmVhbUlkczsKLSAgICAgICAgb3V0cHV0U3RyZWFtSWRzLnB1c2gobVN0cmVhbUlkKTsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCBwcmV2aWV3UmVxdWVzdC51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX09VVFBVVF9TVFJFQU1TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW1JZHMpKTsKLQotICAgICAgICAvLyBEaXNhYmxlIGFsbCAzQSByb3V0aW5lcwotICAgICAgICB1aW50OF90IGNtT2ZmID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oQU5EUk9JRF9DT05UUk9MX01PREVfT0ZGKTsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCBwcmV2aWV3UmVxdWVzdC51cGRhdGUoQU5EUk9JRF9DT05UUk9MX01PREUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbU9mZiwgMSkpOwotCi0gICAgICAgIGludCByZXF1ZXN0SWQgPSAxOwotICAgICAgICBBU1NFUlRfRVEoT0ssIHByZXZpZXdSZXF1ZXN0LnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXF1ZXN0SWQsIDEpKTsKLQotICAgICAgICBpZiAoQ0FNRVJBX0JVUlNUX0RFQlVHR0lORykgewotICAgICAgICAgICAgaW50IGZyYW1lQ291bnQgPSAwOwotICAgICAgICAgICAgQVNTRVJUX0VRKE9LLCBwcmV2aWV3UmVxdWVzdC51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0ZSQU1FX0NPVU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lQ291bnQsIDEpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChDQU1FUkFfQlVSU1RfREVCVUdHSU5HKSB7Ci0gICAgICAgIHByZXZpZXdSZXF1ZXN0LmR1bXAoU1RET1VUX0ZJTEVOTyk7Ci0gICAgfQotCi0gICAgLy8gU3VibWl0IGNhcHR1cmUgcmVxdWVzdHMKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IENBTUVSQV9GUkFNRV9CVVJTVF9DT1VOVDsgKytpKSB7Ci0gICAgICAgIENhbWVyYU1ldGFkYXRhIHRtcFJlcXVlc3QgPSBwcmV2aWV3UmVxdWVzdDsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCB0bXBSZXF1ZXN0LnVwZGF0ZShBTkRST0lEX1NFTlNPUl9FWFBPU1VSRV9USU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHBvc3VyZXNbaV0sIDEpKTsKLSAgICAgICAgQUxPR1YoIlN1Ym1pdHRpbmcgY2FwdHVyZSByZXF1ZXN0ICVkIHdpdGggZXhwb3N1cmUgJSIgUFJJZDY0LCBpLAotICAgICAgICAgICAgZXhwb3N1cmVzW2ldKTsKLSAgICAgICAgZG91dCA8PCAiQ2FwdHVyZSByZXF1ZXN0ICIgPDwgaSA8PCAiIGV4cG9zdXJlIGlzICIKLSAgICAgICAgICAgICA8PCAoZXhwb3N1cmVzW2ldLzFlNmYpIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCBtRGV2aWNlLT5jYXB0dXJlKHRtcFJlcXVlc3QpKTsKLSAgICB9Ci0KLSAgICBkb3V0IDw8ICJCdWZmZXIgZGltZW5zaW9ucyAiIDw8IG1XaWR0aCA8PCAieCIgPDwgbUhlaWdodCA8PCBzdGQ6OmVuZGw7Ci0KLSAgICBmbG9hdCBicmlnaHRuZXNzZXNbQ0FNRVJBX0ZSQU1FX0JVUlNUX0NPVU5UXTsKLSAgICAvLyBHZXQgZWFjaCBmcmFtZSAobWV0YWRhdGEpIGFuZCB0aGVuIHRoZSBidWZmZXIuIENhbGN1bGF0ZSBicmlnaHRuZXNzLgotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQ0FNRVJBX0ZSQU1FX0JVUlNUX0NPVU5UOyArK2kpIHsKLSAgICAgICAgQUxPR1YoIlJlYWRpbmcgY2FwdHVyZSByZXF1ZXN0ICVkIHdpdGggZXhwb3N1cmUgJSIgUFJJZDY0LCBpLCBleHBvc3VyZXNbaV0pOwotICAgICAgICBBU1NFUlRfRVEoT0ssIG1EZXZpY2UtPndhaXRGb3JOZXh0RnJhbWUoQ0FNRVJBX0ZSQU1FX1RJTUVPVVQpKTsKLSAgICAgICAgQUxPR1YoIlJlYWRpbmcgY2FwdHVyZSByZXF1ZXN0LTEgJWQiLCBpKTsKLSAgICAgICAgQ2FwdHVyZVJlc3VsdCByZXN1bHQ7Ci0gICAgICAgIEFTU0VSVF9FUShPSywgbURldmljZS0+Z2V0TmV4dFJlc3VsdCgmcmVzdWx0KSk7Ci0gICAgICAgIEFMT0dWKCJSZWFkaW5nIGNhcHR1cmUgcmVxdWVzdC0yICVkIiwgaSk7Ci0KLSAgICAgICAgQVNTRVJUX0VRKE9LLCBtRnJhbWVMaXN0ZW5lci0+d2FpdEZvckZyYW1lKENBTUVSQV9GUkFNRV9USU1FT1VUKSk7Ci0gICAgICAgIEFMT0dWKCJXZSBnb3QgdGhlIGZyYW1lIG5vdyIpOwotCi0gICAgICAgIENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXIgaW1nQnVmZmVyOwotICAgICAgICBBU1NFUlRfRVEoT0ssIG1DcHVDb25zdW1lci0+bG9ja05leHRCdWZmZXIoJmltZ0J1ZmZlcikpOwotCi0gICAgICAgIGludCB1bmRlcmV4cG9zZWQsIG92ZXJleHBvc2VkOwotICAgICAgICBsb25nIGxvbmcgYnJpZ2h0bmVzcyA9IFRvdGFsQnJpZ2h0bmVzcyhpbWdCdWZmZXIsICZ1bmRlcmV4cG9zZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdmVyZXhwb3NlZCk7Ci0gICAgICAgIGZsb2F0IGF2Z0JyaWdodG5lc3MgPSBicmlnaHRuZXNzICogMS4wZiAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVdpZHRoICogbUhlaWdodCAtICh1bmRlcmV4cG9zZWQgKyBvdmVyZXhwb3NlZCkpOwotICAgICAgICBBTE9HVigiVG90YWwgYnJpZ2h0bmVzcyBmb3IgZnJhbWUgJWQgd2FzICVsbGQgKHVuZGVyZXhwb3NlZCAlZCwgIgotICAgICAgICAgICAgICAib3ZlcmV4cG9zZWQgJWQpLCBhdmcgJWYiLCBpLCBicmlnaHRuZXNzLCB1bmRlcmV4cG9zZWQsCi0gICAgICAgICAgICAgIG92ZXJleHBvc2VkLCBhdmdCcmlnaHRuZXNzKTsKLSAgICAgICAgZG91dCA8PCAiQXZlcmFnZSBicmlnaHRuZXNzIChmcmFtZSAiIDw8IGkgPDwgIikgd2FzICIgPDwgYXZnQnJpZ2h0bmVzcwotICAgICAgICAgICAgIDw8ICIgKHVuZGVyZXhwb3NlZCAiIDw8IHVuZGVyZXhwb3NlZCA8PCAiLCBvdmVyZXhwb3NlZCAiCi0gICAgICAgICAgICAgPDwgb3ZlcmV4cG9zZWQgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKLQotICAgICAgICBBU1NFUlRfRVEoT0ssIG1DcHVDb25zdW1lci0+dW5sb2NrQnVmZmVyKGltZ0J1ZmZlcikpOwotCi0gICAgICAgIGJyaWdodG5lc3Nlc1tpXSA9IGF2Z0JyaWdodG5lc3M7Ci0gICAgfQotCi0gICAgLy8gQ2FsY3VsYXRlIG1heCBjb25zZWN1dGl2ZSBmcmFtZSBleHBvc3VyZSBkb3VibGluZwotICAgIGZsb2F0IHByZXYgPSBicmlnaHRuZXNzZXNbMF07Ci0gICAgaW50IGRvdWJsaW5nX2NvdW50ID0gMTsKLSAgICBpbnQgbWF4X2RvdWJsaW5nX2NvdW50ID0gMDsKLSAgICBmb3IgKGludCBpID0gMTsgaSA8IENBTUVSQV9GUkFNRV9CVVJTVF9DT1VOVDsgKytpKSB7Ci0gICAgICAgIGlmIChmYWJzKGJyaWdodG5lc3Nlc1tpXSAtIHByZXYqQ0FNRVJBX0VYUE9TVVJFX0RPVUJMRSkKLSAgICAgICAgICAgIDw9IENBTUVSQV9FWFBPU1VSRV9ET1VCTElOR19USFJFU0hPTEQpIHsKLSAgICAgICAgICAgIGRvdWJsaW5nX2NvdW50Kys7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBtYXhfZG91YmxpbmdfY291bnQgPSBzdGQ6Om1heChtYXhfZG91YmxpbmdfY291bnQsIGRvdWJsaW5nX2NvdW50KTsKLSAgICAgICAgICAgIGRvdWJsaW5nX2NvdW50ID0gMTsKLSAgICAgICAgfQotICAgICAgICBwcmV2ID0gYnJpZ2h0bmVzc2VzW2ldOwotICAgIH0KLQotICAgIGRvdXQgPDwgIm1heCBkb3VibGluZyBjb3VudDogIiA8PCBtYXhfZG91YmxpbmdfY291bnQgPDwgc3RkOjplbmRsOwotCi0gICAgLyoqCi0gICAgICogTWFrZSB0aGlzIGNoZWNrIHdhcm5pbmcgb25seSwgc2luY2UgdGhlIGJyaWdodG5lc3MgY2FsY3VsYXRpb24gaXMgbm90IHJlbGlhYmxlCi0gICAgICogYW5kIHdlIGhhdmUgc2VwYXJhdGUgdGVzdCB0byBjb3ZlciB0aGlzIGNhc2UuIFBsdXMgaXQgaXMgcHJldHR5IHN1YnRsZSB0byBtYWtlCi0gICAgICogaXQgcmlnaHQgd2l0aG91dCBjb21wbGljYXRpbmcgdGhlIHRlc3QgdG9vIG11Y2guCi0gICAgICovCi0gICAgV0FSTl9MRShDQU1FUkFfRVhQT1NVUkVfRE9VQkxJTkdfQ09VTlQsIG1heF9kb3VibGluZ19jb3VudCkKLSAgICAgICAgICAgIDw8ICJhdmVyYWdlIGJyaWdodG5lc3Mgc2hvdWxkIGRvdWJsZSBhdCBsZWFzdCAiCi0gICAgICAgICAgICA8PCBDQU1FUkFfRVhQT1NVUkVfRE9VQkxJTkdfQ09VTlQKLSAgICAgICAgICAgIDw8ICIgdGltZXMgb3ZlciBlYWNoIGNvbnNlY3V0aXZlIGZyYW1lIGFzIHRoZSBleHBvc3VyZSBpcyBkb3VibGVkIgotICAgICAgICAgICAgPDwgc3RkOjplbmRsOwotfQotCi0vKioKLSAqIFRoaXMgdGVzdCB2YXJpZXMgZXhwb3N1cmUgdGltZSwgZnJhbWUgZHVyYXRpb24sIGFuZCBzZW5zaXRpdml0eSBmb3IgYQotICogYnVyc3Qgb2YgY2FwdHVyZXMuIEl0IHBpY2tzIHZhbHVlcyBieSBkZWZhdWx0LCBidXQgdGhlIHNlbGVjdGlvbiBjYW4gYmUKLSAqIG92ZXJyaWRkZW4gd2l0aCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzCi0gKiAgIENBTUVSQTJfVEVTVF9WQVJJQUJMRV9CVVJTVF9FWFBPU1VSRV9USU1FUwotICogICBDQU1FUkEyX1RFU1RfVkFSSUFCTEVfQlVSU1RfRlJBTUVfRFVSQVRJT05TCi0gKiAgIENBTUVSQTJfVEVTVF9WQVJJQUJMRV9CVVJTVF9TRU5TSVRJVklUSUVTCi0gKiB3aGljaCBtdXN0IGFsbCBiZSBhIGxpc3Qgb2YgY29tbWEtc2VwYXJhdGVkIHZhbHVlcywgYW5kIGVhY2ggbGlzdCBtdXN0IGJlCi0gKiB0aGUgc2FtZSBsZW5ndGguICBJbiBhZGRpdGlvbiwgaWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi0gKiAgIENBTUVSQTJfVEVTVF9WQVJJQUJMRV9CVVJTVF9EVU1QX0ZSQU1FUwotICogaXMgc2V0IHRvIDEsIHRoZW4gdGhlIFlVViBidWZmZXJzIGFyZSBkdW1wZWQgaW50byBmaWxlcyBuYW1lZAotICogICAiY2FtZXJhMl90ZXN0X3ZhcmlhYmxlX2J1cnN0X2ZyYW1lX05OTi55dXYiCi0gKgotICogRm9yIGV4YW1wbGU6Ci0gKiAgICQgc2V0ZW52IENBTUVSQTJfVEVTVF9WQVJJQUJMRV9CVVJTVF9FWFBPU1VSRV9USU1FUyAxMDAwMDAwMCwyMDAwMDAwMAotICogICAkIHNldGVudiBDQU1FUkEyX1RFU1RfVkFSSUFCTEVfQlVSU1RfRlJBTUVfRFVSQVRJT05TIDQwMDAwMDAwLDQwMDAwMDAwCi0gKiAgICQgc2V0ZW52IENBTUVSQTJfVEVTVF9WQVJJQUJMRV9CVVJTVF9TRU5TSVRJVklUSUVTIDIwMCwxMDAKLSAqICAgJCBzZXRlbnYgQ0FNRVJBMl9URVNUX1ZBUklBQkxFX0JVUlNUX0RVTVBfRlJBTUVTIDEKLSAqICAgJCAvZGF0YS9uYXRpdmV0ZXN0L2NhbWVyYTJfdGVzdC9jYW1lcmEyX3Rlc3QgLS1ndGVzdF9maWx0ZXI9IipWYXJpYWJsZUJ1cnN0IgotICovCi1URVNUX0YoQ2FtZXJhQnVyc3RUZXN0LCBWYXJpYWJsZUJ1cnN0KSB7Ci0KLSAgICBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX0lOSVQ7Ci0KLSAgICAvLyBCb3VuZHMgZm9yIGNoZWNraW5nIGZyYW1lIGR1cmF0aW9uIGlzIHdpdGhpbiByYW5nZQotICAgIGNvbnN0IG5zZWNzX3QgRFVSQVRJT05fVVBQRVJfQk9VTkQgPSAxMCAqIE1TRUM7Ci0gICAgY29uc3QgbnNlY3NfdCBEVVJBVElPTl9MT1dFUl9CT1VORCA9IDIwICogTVNFQzsKLQotICAgIC8vIFRocmVzaG9sZCBmb3IgY29uc2lkZXJpbmcgdHdvIGNhcHR1cmVzIHRvIGhhdmUgZXF1aXZhbGVudCBleHBvc3VyZSB2YWx1ZSwKLSAgICAvLyBhcyBhIHJhdGlvIG9mIHRoZSBzbWFsbGVyIEVWIHRvIHRoZSBsYXJnZXIgRVYuCi0gICAgY29uc3QgZmxvYXQgICBFVl9NQVRDSF9CT1VORCA9IDAuOTU7Ci0gICAgLy8gQm91bmQgZm9yIHR3byBjYXB0dXJlcyB3aXRoIGVxdWl2YWxlbnQgZXhwIHZhbHVlcyB0byBoYXZlIHRoZSBzYW1lCi0gICAgLy8gbWVhc3VyZWQgYnJpZ2h0bmVzcywgaW4gMC0yNTUgbHVtaW5hbmNlLgotICAgIGNvbnN0IGZsb2F0ICAgQlJJR0hUTkVTU19NQVRDSF9CT1VORCA9IDU7Ci0KLSAgICAvLyBFbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gbG9vayBmb3IgdG8gb3ZlcnJpZGUgdGVzdCBzZXR0aW5ncwotICAgIGNvbnN0IGNoYXIgKmV4cEVudiAgICAgICAgID0gIkNBTUVSQTJfVEVTVF9WQVJJQUJMRV9CVVJTVF9FWFBPU1VSRV9USU1FUyI7Ci0gICAgY29uc3QgY2hhciAqZHVyYXRpb25FbnYgICAgPSAiQ0FNRVJBMl9URVNUX1ZBUklBQkxFX0JVUlNUX0ZSQU1FX0RVUkFUSU9OUyI7Ci0gICAgY29uc3QgY2hhciAqc2Vuc2l0aXZpdHlFbnYgPSAiQ0FNRVJBMl9URVNUX1ZBUklBQkxFX0JVUlNUX1NFTlNJVElWSVRJRVMiOwotICAgIGNvbnN0IGNoYXIgKmR1bXBGcmFtZUVudiAgID0gIkNBTUVSQTJfVEVTVF9WQVJJQUJMRV9CVVJTVF9EVU1QX0ZSQU1FUyI7Ci0KLSAgICAvLyBSYW5nZSBvZiB2YWxpZCBleHBvc3VyZSB0aW1lcywgaW4gbmFub3NlY29uZHMKLSAgICBpbnQ2NF90IG1pbkV4cCA9IDAsIG1heEV4cCA9IDA7Ci0gICAgLy8gTGlzdCBvZiB2YWxpZCBzZW5zb3Igc2Vuc2l0aXZpdGllcwotICAgIFZlY3RvcjxpbnQzMl90PiBzZW5zaXRpdml0aWVzOwotICAgIC8vIFJhbmdlIG9mIHZhbGlkIGZyYW1lIGR1cmF0aW9ucywgaW4gbmFub3NlY29uZHMKLSAgICBpbnQ2NF90IG1pbkR1cmF0aW9uID0gMCwgbWF4RHVyYXRpb24gPSAwOwotCi0gICAgewotICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgZXhwb3N1cmVUaW1lUmFuZ2UgPQotICAgICAgICAgICAgR2V0U3RhdGljRW50cnkoQU5EUk9JRF9TRU5TT1JfSU5GT19FWFBPU1VSRV9USU1FX1JBTkdFKTsKLQotICAgICAgICBFWFBFQ1RfRVEoMnUsIGV4cG9zdXJlVGltZVJhbmdlLmNvdW50KSA8PCAiQmFkIGV4cG9zdXJlIHRpbWUgcmFuZ2UgdGFnLiIKLSAgICAgICAgICAgICAgICAiVXNpbmcgZGVmYXVsdCB2YWx1ZXMiOwotICAgICAgICBpZiAoZXhwb3N1cmVUaW1lUmFuZ2UuY291bnQgPT0gMikgewotICAgICAgICAgICAgbWluRXhwID0gZXhwb3N1cmVUaW1lUmFuZ2UuZGF0YS5pNjRbMF07Ci0gICAgICAgICAgICBtYXhFeHAgPSBleHBvc3VyZVRpbWVSYW5nZS5kYXRhLmk2NFsxXTsKLSAgICAgICAgfQotCi0gICAgICAgIEVYUEVDVF9MVCgwLCBtaW5FeHApIDw8ICJNaW5pbXVtIGV4cG9zdXJlIHRpbWUgaXMgMCI7Ci0gICAgICAgIEVYUEVDVF9MVCgwLCBtYXhFeHApIDw8ICJNYXhpbXVtIGV4cG9zdXJlIHRpbWUgaXMgMCI7Ci0gICAgICAgIEVYUEVDVF9MRShtaW5FeHAsIG1heEV4cCkgPDwgIk1pbmltdW0gZXhwb3N1cmUgaXMgZ3JlYXRlciB0aGFuIG1heGltdW0iOwotCi0gICAgICAgIGlmIChtaW5FeHAgPT0gMCkgewotICAgICAgICAgICAgbWluRXhwID0gMSAqIE1TRUM7IC8vIEZhbGxiYWNrIG1pbmltdW0gZXhwb3N1cmUgdGltZQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1heEV4cCA9PSAwKSB7Ci0gICAgICAgICAgICBtYXhFeHAgPSAxMCAqIFNFQzsgLy8gRmFsbGJhY2sgbWF4aW11bSBleHBvc3VyZSB0aW1lCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgaGFyZHdhcmVMZXZlbCA9Ci0gICAgICAgIEdldFN0YXRpY0VudHJ5KEFORFJPSURfSU5GT19TVVBQT1JURURfSEFSRFdBUkVfTEVWRUwpOwotICAgIEFTU0VSVF9FUSgxdSwgaGFyZHdhcmVMZXZlbC5jb3VudCk7Ci0gICAgdWludDhfdCBsZXZlbCA9IGhhcmR3YXJlTGV2ZWwuZGF0YS51OFswXTsKLSAgICBBU1NFUlRfR0UobGV2ZWwsIEFORFJPSURfSU5GT19TVVBQT1JURURfSEFSRFdBUkVfTEVWRUxfTElNSVRFRCk7Ci0gICAgQVNTRVJUX0xFKGxldmVsLCBBTkRST0lEX0lORk9fU1VQUE9SVEVEX0hBUkRXQVJFX0xFVkVMX0ZVTEwpOwotICAgIGlmIChsZXZlbCA9PSBBTkRST0lEX0lORk9fU1VQUE9SVEVEX0hBUkRXQVJFX0xFVkVMX0xJTUlURUQpIHsKLSAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjpUZXN0SW5mbyogY29uc3QgdGVzdF9pbmZvID0KLSAgICAgICAgICAgIDo6dGVzdGluZzo6VW5pdFRlc3Q6OkdldEluc3RhbmNlKCktPmN1cnJlbnRfdGVzdF9pbmZvKCk7Ci0gICAgICAgIHN0ZDo6Y2VyciA8PCAiU2tpcHBpbmcgdGVzdCAiCi0gICAgICAgICAgICAgICAgICA8PCB0ZXN0X2luZm8tPnRlc3RfY2FzZV9uYW1lKCkgPDwgIi4iCi0gICAgICAgICAgICAgICAgICA8PCB0ZXN0X2luZm8tPm5hbWUoKQotICAgICAgICAgICAgICAgICAgPDwgIiBiZWNhdXNlIEhBTCBoYXJkd2FyZSBzdXBwb3J0ZWQgbGV2ZWwgaXMgbGltaXRlZCAiCi0gICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBkb3V0IDw8ICJTdHJlYW0gc2l6ZSBpcyAiIDw8IG1XaWR0aCA8PCAiIHggIiA8PCBtSGVpZ2h0IDw8IHN0ZDo6ZW5kbDsKLSAgICBkb3V0IDw8ICJWYWxpZCBleHBvc3VyZSByYW5nZSBpczogIiA8PAotICAgICAgICAgICAgbWluRXhwIDw8ICIgLSAiIDw8IG1heEV4cCA8PCAiIG5zICIgPDwgc3RkOjplbmRsOwotCi0gICAgewotICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgc2Vuc2l2aXR5UmFuZ2UgPQotICAgICAgICAgICAgR2V0U3RhdGljRW50cnkoQU5EUk9JRF9TRU5TT1JfSU5GT19TRU5TSVRJVklUWV9SQU5HRSk7Ci0gICAgICAgIEVYUEVDVF9FUSgydSwgc2Vuc2l2aXR5UmFuZ2UuY291bnQpIDw8ICJObyBzZW5zaXRpdml0eSByYW5nZSBsaXN0ZWQuIgotICAgICAgICAgICAgICAgICJGYWxsaW5nIGJhY2sgdG8gZGVmYXVsdCBzZXQuIjsKLSAgICAgICAgaW50MzJfdCBtaW5TZW5zaXRpdml0eSA9IDEwMDsKLSAgICAgICAgaW50MzJfdCBtYXhTZW5zaXRpdml0eSA9IDgwMDsKLSAgICAgICAgaWYgKHNlbnNpdml0eVJhbmdlLmNvdW50ID09IDIpIHsKLSAgICAgICAgICAgIEFTU0VSVF9HVChzZW5zaXZpdHlSYW5nZS5kYXRhLmkzMlswXSwgMCk7Ci0gICAgICAgICAgICBBU1NFUlRfR1Qoc2Vuc2l2aXR5UmFuZ2UuZGF0YS5pMzJbMV0sIDApOwotICAgICAgICAgICAgbWluU2Vuc2l0aXZpdHkgPSBzZW5zaXZpdHlSYW5nZS5kYXRhLmkzMlswXTsKLSAgICAgICAgICAgIG1heFNlbnNpdGl2aXR5ID0gc2Vuc2l2aXR5UmFuZ2UuZGF0YS5pMzJbMV07Ci0gICAgICAgIH0KLSAgICAgICAgaW50MzJfdCBjb3VudCA9IChtYXhTZW5zaXRpdml0eSAtIG1pblNlbnNpdGl2aXR5ICsgOTkpIC8gMTAwOwotICAgICAgICBzZW5zaXRpdml0aWVzLnB1c2hfYmFjayhtaW5TZW5zaXRpdml0eSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgc2Vuc2l0aXZpdGllcy5wdXNoX2JhY2sobWluU2Vuc2l0aXZpdHkgKyBpICogMTAwKTsKLSAgICAgICAgfQotICAgICAgICBzZW5zaXRpdml0aWVzLnB1c2hfYmFjayhtYXhTZW5zaXRpdml0eSk7Ci0gICAgfQotCi0gICAgZG91dCA8PCAiQXZhaWxhYmxlIHNlbnNpdGl2aXRpZXM6ICI7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzZW5zaXRpdml0aWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGRvdXQgPDwgc2Vuc2l0aXZpdGllc1tpXSA8PCAiICI7Ci0gICAgfQotICAgIGRvdXQgPDwgc3RkOjplbmRsOwotCi0gICAgewotICAgICAgICBpZiAoZ2V0RGV2aWNlVmVyc2lvbigpIDwgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKLSAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBhdmFpbGFibGVQcm9jZXNzZWRTaXplcyA9Ci0gICAgICAgICAgICAgICAgICAgIEdldFN0YXRpY0VudHJ5KEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9QUk9DRVNTRURfU0laRVMpOwotCi0gICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgYXZhaWxhYmxlUHJvY2Vzc2VkTWluRnJhbWVEdXJhdGlvbnMgPQotICAgICAgICAgICAgICAgICAgICBHZXRTdGF0aWNFbnRyeShBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfUFJPQ0VTU0VEX01JTl9EVVJBVElPTlMpOwotCi0gICAgICAgICAgICBFWFBFQ1RfRVEoYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMuY291bnQsCi0gICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZVByb2Nlc3NlZE1pbkZyYW1lRHVyYXRpb25zLmNvdW50ICogMikgPDwKLSAgICAgICAgICAgICAgICAgICAgIlRoZSBudW1iZXIgb2YgbWluaW11bSBmcmFtZSBkdXJhdGlvbnMgZG9lc24ndCBtYXRjaCB0aGUgbnVtYmVyIG9mICIKLSAgICAgICAgICAgICAgICAgICAgImF2YWlsYWJsZSBzaXplcy4gVXNpbmcgZmFsbGJhY2sgdmFsdWVzIjsKLQotICAgICAgICAgICAgaWYgKGF2YWlsYWJsZVByb2Nlc3NlZFNpemVzLmNvdW50ID09Ci0gICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZVByb2Nlc3NlZE1pbkZyYW1lRHVyYXRpb25zLmNvdW50ICogMikgewotICAgICAgICAgICAgICAgIGJvb2wgZ290U2l6ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMuY291bnQ7IGkgKz0gMikgewotICAgICAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMuZGF0YS5pMzJbaV0gPT0gbVdpZHRoICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMuZGF0YS5pMzJbaSsxXSA9PSBtSGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RTaXplID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbkR1cmF0aW9uID0gYXZhaWxhYmxlUHJvY2Vzc2VkTWluRnJhbWVEdXJhdGlvbnMuZGF0YS5pNjRbaS8yXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBFWFBFQ1RfVFJVRShnb3RTaXplKSA8PCAiQ2FuJ3QgZmluZCBzdHJlYW0gc2l6ZSBpbiBsaXN0IG9mICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJhdmFpbGFibGUgc2l6ZXM6ICIgPDwgbVdpZHRoIDw8ICIsICIgPDwgbUhlaWdodDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtaW5EdXJhdGlvbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbWluRHVyYXRpb24gPSAxICogU0VDIC8gMzA7IC8vIEZhbGwgYmFjayB0byAzMCBmcHMgYXMgbWluaW11bSBkdXJhdGlvbgotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWluRHVyYXRpb24gPSBnZXRNaW5GcmFtZUR1cmF0aW9uRm9yKAotICAgICAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQsIG1XaWR0aCwgbUhlaWdodCk7Ci0gICAgICAgIH0KLSAgICAgICAgQVNTRVJUX0xUKDAsIG1pbkR1cmF0aW9uKTsKLQotICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgbWF4RnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgR2V0U3RhdGljRW50cnkoQU5EUk9JRF9TRU5TT1JfSU5GT19NQVhfRlJBTUVfRFVSQVRJT04pOwotCi0gICAgICAgIEVYUEVDVF9FUSgxdSwgbWF4RnJhbWVEdXJhdGlvbi5jb3VudCkgPDwgIk5vIHZhbGlkIG1heGltdW0gZnJhbWUgZHVyYXRpb24iOwotCi0gICAgICAgIGlmIChtYXhGcmFtZUR1cmF0aW9uLmNvdW50ID09IDEpIHsKLSAgICAgICAgICAgIG1heER1cmF0aW9uID0gbWF4RnJhbWVEdXJhdGlvbi5kYXRhLmk2NFswXTsKLSAgICAgICAgfQotCi0gICAgICAgIEVYUEVDVF9HVChtYXhEdXJhdGlvbiwgMCkgPDwgIk1heCBkdXJhdGlvbiBpcyAwIG9yIG5vdCBnaXZlbiwgdXNpbmcgZmFsbGJhY2siOwotCi0gICAgICAgIGlmIChtYXhEdXJhdGlvbiA9PSAwKSB7Ci0gICAgICAgICAgICBtYXhEdXJhdGlvbiA9IDEwICogU0VDOyAvLyBGYWxsIGJhY2sgdG8gMTAgc2Vjb25kcyBhcyBtYXggZHVyYXRpb24KLSAgICAgICAgfQotCi0gICAgfQotICAgIGRvdXQgPDwgIkF2YWlsYWJsZSBmcmFtZSBkdXJhdGlvbiByYW5nZSBmb3IgY29uZmlndXJlZCBzdHJlYW0gc2l6ZTogIgotICAgICAgICAgPDwgbWluRHVyYXRpb24gPDwgIiAtICIgPDwgbWF4RHVyYXRpb24gPDwgIiBucyIgPDwgc3RkOjplbmRsOwotCi0gICAgLy8gR2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBpZiBzZXQKLSAgICBjb25zdCBjaGFyICpleHBWYWwgPSBnZXRlbnYoZXhwRW52KTsKLSAgICBjb25zdCBjaGFyICpkdXJhdGlvblZhbCA9IGdldGVudihkdXJhdGlvbkVudik7Ci0gICAgY29uc3QgY2hhciAqc2Vuc2l0aXZpdHlWYWwgPSBnZXRlbnYoc2Vuc2l0aXZpdHlFbnYpOwotCi0gICAgYm9vbCBnb3RFeHAgPSAoZXhwVmFsICE9IE5VTEwpOwotICAgIGJvb2wgZ290RHVyYXRpb24gPSAoZHVyYXRpb25WYWwgIT0gTlVMTCk7Ci0gICAgYm9vbCBnb3RTZW5zaXRpdml0eSA9IChzZW5zaXRpdml0eVZhbCAhPSBOVUxMKTsKLQotICAgIC8vIEFsbCBvciBub25lIG11c3QgYmUgcHJvdmlkZWQgaWYgdXNpbmcgb3ZlcnJpZGUgZW52cwotICAgIEFTU0VSVF9UUlVFKCAoZ290RHVyYXRpb24gJiYgZ290RXhwICYmIGdvdFNlbnNpdGl2aXR5KSB8fAotICAgICAgICAgICAgKCFnb3REdXJhdGlvbiAmJiAhZ290RXhwICYmICFnb3RTZW5zaXRpdml0eSkgKSA8PAotICAgICAgICAgICAgIkluY29tcGxldGUgc2V0IG9mIGVudmlyb25tZW50IHZhcmlhYmxlIG92ZXJyaWRlcyBwcm92aWRlZCI7Ci0KLSAgICBWZWN0b3I8aW50NjRfdD4gZXhwTGlzdCwgZHVyYXRpb25MaXN0OwotICAgIFZlY3RvcjxpbnQzMl90PiBzZW5zaXRpdml0eUxpc3Q7Ci0gICAgaWYgKGdvdEV4cCkgewotICAgICAgICBQYXJzZUxpc3QoZXhwVmFsLCBleHBMaXN0KTsKLSAgICAgICAgUGFyc2VMaXN0KGR1cmF0aW9uVmFsLCBkdXJhdGlvbkxpc3QpOwotICAgICAgICBQYXJzZUxpc3Qoc2Vuc2l0aXZpdHlWYWwsIHNlbnNpdGl2aXR5TGlzdCk7Ci0KLSAgICAgICAgQVNTRVJUX1RSVUUoCi0gICAgICAgICAgICAoZXhwTGlzdC5zaXplKCkgPT0gZHVyYXRpb25MaXN0LnNpemUoKSkgJiYKLSAgICAgICAgICAgIChkdXJhdGlvbkxpc3Quc2l6ZSgpID09IHNlbnNpdGl2aXR5TGlzdC5zaXplKCkpKSA8PAotICAgICAgICAgICAgICAgICJNaXNtYXRjaGVkIHNpemVzIGluIGVudiBsaXN0cywgb3IgcGFyc2UgZXJyb3IiOwotCi0gICAgICAgIGRvdXQgPDwgIlVzaW5nIGJ1cnN0IGxpc3QgZnJvbSBlbnZpcm9ubWVudCB3aXRoICIgPDwgZXhwTGlzdC5zaXplKCkgPDwKLSAgICAgICAgICAgICAgICAiIGNhcHR1cmVzIiA8PCBzdGQ6OmVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gQ3JlYXRlIGEgZGVmYXVsdCBzZXQgb2YgY29udHJvbHMgYmFzZWQgb24gdGhlIGF2YWlsYWJsZSByYW5nZXMKLQotICAgICAgICBpbnQ2NF90IGU7Ci0gICAgICAgIGludDY0X3QgZDsKLSAgICAgICAgaW50MzJfdCBzOwotCi0gICAgICAgIC8vIEV4cG9zdXJlIHJhbXAKLQotICAgICAgICBlID0gbWluRXhwOwotICAgICAgICBkID0gbWluRHVyYXRpb247Ci0gICAgICAgIHMgPSBzZW5zaXRpdml0aWVzWzBdOwotICAgICAgICB3aGlsZSAoZSA8IG1heEV4cCkgewotICAgICAgICAgICAgZXhwTGlzdC5wdXNoX2JhY2soZSk7Ci0gICAgICAgICAgICBkdXJhdGlvbkxpc3QucHVzaF9iYWNrKGQpOwotICAgICAgICAgICAgc2Vuc2l0aXZpdHlMaXN0LnB1c2hfYmFjayhzKTsKLSAgICAgICAgICAgIGUgPSBlICogMjsKLSAgICAgICAgfQotICAgICAgICBlID0gbWF4RXhwOwotICAgICAgICBleHBMaXN0LnB1c2hfYmFjayhlKTsKLSAgICAgICAgZHVyYXRpb25MaXN0LnB1c2hfYmFjayhkKTsKLSAgICAgICAgc2Vuc2l0aXZpdHlMaXN0LnB1c2hfYmFjayhzKTsKLQotICAgICAgICAvLyBEdXJhdGlvbiByYW1wCi0KLSAgICAgICAgZSA9IDMwICogTVNFQzsKLSAgICAgICAgZCA9IG1pbkR1cmF0aW9uOwotICAgICAgICBzID0gc2Vuc2l0aXZpdGllc1swXTsKLSAgICAgICAgd2hpbGUgKGQgPCBtYXhEdXJhdGlvbikgewotICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGV4cG9zdXJlIDw9IGZyYW1lIGR1cmF0aW9uCi0gICAgICAgICAgICBleHBMaXN0LnB1c2hfYmFjayhlID4gZCA/IGQgOiBlKTsKLSAgICAgICAgICAgIGR1cmF0aW9uTGlzdC5wdXNoX2JhY2soZCk7Ci0gICAgICAgICAgICBzZW5zaXRpdml0eUxpc3QucHVzaF9iYWNrKHMpOwotICAgICAgICAgICAgZCA9IGQgKiAyOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2Vuc2l0aXZpdHkgcmFtcAotCi0gICAgICAgIGUgPSAzMCAqIE1TRUM7Ci0gICAgICAgIGQgPSAzMCAqIE1TRUM7Ci0gICAgICAgIGQgPSBkID4gbWluRHVyYXRpb24gPyBkIDogbWluRHVyYXRpb247Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2Vuc2l0aXZpdGllcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZXhwTGlzdC5wdXNoX2JhY2soZSk7Ci0gICAgICAgICAgICBkdXJhdGlvbkxpc3QucHVzaF9iYWNrKGQpOwotICAgICAgICAgICAgc2Vuc2l0aXZpdHlMaXN0LnB1c2hfYmFjayhzZW5zaXRpdml0aWVzW2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENvbnN0YW50LUVWIHJhbXAsIGR1cmF0aW9uID09IGV4cG9zdXJlCi0KLSAgICAgICAgZSA9IDMwICogTVNFQzsgLy8gYXQgSVNPIDEwMAotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNlbnNpdGl2aXRpZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGludDY0X3QgZV9hZGogPSBlICogMTAwIC8gc2Vuc2l0aXZpdGllc1tpXTsKLSAgICAgICAgICAgIGV4cExpc3QucHVzaF9iYWNrKGVfYWRqKTsKLSAgICAgICAgICAgIGR1cmF0aW9uTGlzdC5wdXNoX2JhY2soZV9hZGogPiBtaW5EdXJhdGlvbiA/IGVfYWRqIDogbWluRHVyYXRpb24pOwotICAgICAgICAgICAgc2Vuc2l0aXZpdHlMaXN0LnB1c2hfYmFjayhzZW5zaXRpdml0aWVzW2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIGRvdXQgPDwgIkRlZmF1bHQgYnVyc3Qgc2VxdWVuY2UgY3JlYXRlZCB3aXRoICIgPDwgZXhwTGlzdC5zaXplKCkgPDwKLSAgICAgICAgICAgICAgICAiIGVudHJpZXMiIDw8IHN0ZDo6ZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBWYWxpZGF0ZSB0aGUgbGlzdCwgYnV0IHdhcm4gb25seQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXhwTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICBFWFBFQ1RfR0UobWF4RXhwLCBleHBMaXN0W2ldKQotICAgICAgICAgICAgICAgIDw8ICJDYXB0dXJlICIgPDwgaSA8PCAiIGV4cG9zdXJlIHRvbyBsb25nOiAiIDw8IGV4cExpc3RbaV07Ci0gICAgICAgIEVYUEVDVF9MRShtaW5FeHAsIGV4cExpc3RbaV0pCi0gICAgICAgICAgICAgICAgPDwgIkNhcHR1cmUgIiA8PCBpIDw8ICIgZXhwb3N1cmUgdG9vIHNob3J0OiAiIDw8IGV4cExpc3RbaV07Ci0gICAgICAgIEVYUEVDVF9HRShtYXhEdXJhdGlvbiwgZHVyYXRpb25MaXN0W2ldKQotICAgICAgICAgICAgICAgIDw8ICJDYXB0dXJlICIgPDwgaSA8PCAiIGR1cmF0aW9uIHRvbyBsb25nOiAiIDw8IGR1cmF0aW9uTGlzdFtpXTsKLSAgICAgICAgRVhQRUNUX0xFKG1pbkR1cmF0aW9uLCBkdXJhdGlvbkxpc3RbaV0pCi0gICAgICAgICAgICAgICAgIDw8ICJDYXB0dXJlICIgPDwgaSA8PCAiIGR1cmF0aW9uIHRvbyBzaG9ydDogIiAgPDwgZHVyYXRpb25MaXN0W2ldOwotICAgICAgICBib29sIHZhbGlkU2Vuc2l0aXZpdHkgPSBmYWxzZTsKLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzZW5zaXRpdml0aWVzLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICBpZiAoc2Vuc2l0aXZpdHlMaXN0W2ldID09IHNlbnNpdGl2aXRpZXNbal0pIHsKLSAgICAgICAgICAgICAgICB2YWxpZFNlbnNpdGl2aXR5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBFWFBFQ1RfVFJVRSh2YWxpZFNlbnNpdGl2aXR5KQotICAgICAgICAgICAgICAgIDw8ICJDYXB0dXJlICIgPDwgaSA8PCAiIHNlbnNpdGl2aXR5IG5vdCBpbiBsaXN0OiAiIDw8IHNlbnNpdGl2aXR5TGlzdFtpXTsKLSAgICB9Ci0KLSAgICAvLyBDaGVjayBpZiBkZWJ1ZyB5dXYgZHVtcHMgYXJlIHJlcXVlc3RlZAotCi0gICAgYm9vbCBkdW1wRnJhbWVzID0gZmFsc2U7Ci0gICAgewotICAgICAgICBjb25zdCBjaGFyICpmcmFtZUR1bXBWYWwgPSBnZXRlbnYoZHVtcEZyYW1lRW52KTsKLSAgICAgICAgaWYgKGZyYW1lRHVtcFZhbCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAoZnJhbWVEdW1wVmFsWzBdID09ICcxJykgZHVtcEZyYW1lcyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBkb3V0IDw8ICJEdW1waW5nIFlVViBmcmFtZXMgIiA8PAotICAgICAgICAgICAgKGR1bXBGcmFtZXMgPyAiZW5hYmxlZCwgbm90IGNoZWNraW5nIHRpbWluZyIgOiAiZGlzYWJsZWQiKSA8PCBzdGQ6OmVuZGw7Ci0KLSAgICAvLyBDcmVhdGUgYSBiYXNlIHByZXZpZXcgcmVxdWVzdCwgdHVybmluZyBvZmYgYWxsIDNBCi0gICAgQ2FtZXJhTWV0YWRhdGEgcHJldmlld1JlcXVlc3Q7Ci0gICAgQVNTRVJUX0VRKE9LLCBtRGV2aWNlLT5jcmVhdGVEZWZhdWx0UmVxdWVzdChDQU1FUkEyX1RFTVBMQVRFX1BSRVZJRVcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJldmlld1JlcXVlc3QpKTsKLSAgICB7Ci0gICAgICAgIFZlY3RvcjxpbnQzMl90PiBvdXRwdXRTdHJlYW1JZHM7Ci0gICAgICAgIG91dHB1dFN0cmVhbUlkcy5wdXNoKG1TdHJlYW1JZCk7Ci0gICAgICAgIEFTU0VSVF9FUShPSywgcHJldmlld1JlcXVlc3QudXBkYXRlKEFORFJPSURfUkVRVUVTVF9PVVRQVVRfU1RSRUFNUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtSWRzKSk7Ci0KLSAgICAgICAgLy8gRGlzYWJsZSBhbGwgM0Egcm91dGluZXMKLSAgICAgICAgdWludDhfdCBjbU9mZiA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KEFORFJPSURfQ09OVFJPTF9NT0RFX09GRik7Ci0gICAgICAgIEFTU0VSVF9FUShPSywgcHJldmlld1JlcXVlc3QudXBkYXRlKEFORFJPSURfQ09OVFJPTF9NT0RFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY21PZmYsIDEpKTsKLQotICAgICAgICBpbnQgcmVxdWVzdElkID0gMTsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCBwcmV2aWV3UmVxdWVzdC51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVxdWVzdElkLCAxKSk7Ci0gICAgfQotCi0gICAgLy8gU3VibWl0IGNhcHR1cmUgcmVxdWVzdHMKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXhwTGlzdC5zaXplKCk7ICsraSkgewotICAgICAgICBDYW1lcmFNZXRhZGF0YSB0bXBSZXF1ZXN0ID0gcHJldmlld1JlcXVlc3Q7Ci0gICAgICAgIEFTU0VSVF9FUShPSywgdG1wUmVxdWVzdC51cGRhdGUoQU5EUk9JRF9TRU5TT1JfRVhQT1NVUkVfVElNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXhwTGlzdFtpXSwgMSkpOwotICAgICAgICBBU1NFUlRfRVEoT0ssIHRtcFJlcXVlc3QudXBkYXRlKEFORFJPSURfU0VOU09SX0ZSQU1FX0RVUkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbkxpc3RbaV0sIDEpKTsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCB0bXBSZXF1ZXN0LnVwZGF0ZShBTkRST0lEX1NFTlNPUl9TRU5TSVRJVklUWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2Vuc2l0aXZpdHlMaXN0W2ldLCAxKSk7Ci0gICAgICAgIEFMT0dWKCJTdWJtaXR0aW5nIGNhcHR1cmUgJXp1IHdpdGggZXhwb3N1cmUgJSIgUFJJZDY0ICIsIGZyYW1lIGR1cmF0aW9uICUiIFBSSWQ2NCAiLCBzZW5zaXRpdml0eSAlZCIsCi0gICAgICAgICAgICAgICAgaSwgZXhwTGlzdFtpXSwgZHVyYXRpb25MaXN0W2ldLCBzZW5zaXRpdml0eUxpc3RbaV0pOwotICAgICAgICBkb3V0IDw8ICJDYXB0dXJlIHJlcXVlc3QgIiA8PCBpIDw8Ci0gICAgICAgICAgICAgICAgIjogZXhwb3N1cmUgaXMgIiA8PCAoZXhwTGlzdFtpXS8xZTZmKSA8PCAiIG1zIiA8PAotICAgICAgICAgICAgICAgICIsIGZyYW1lIGR1cmF0aW9uIGlzICIgPDwgKGR1cmF0aW9uTGlzdFtpXS8xZTZmKSA8PCAiIG1zIiA8PAotICAgICAgICAgICAgICAgICIsIHNlbnNpdGl2aXR5IGlzICIgPDwgc2Vuc2l0aXZpdHlMaXN0W2ldIDw8Ci0gICAgICAgICAgICAgICAgc3RkOjplbmRsOwotICAgICAgICBBU1NFUlRfRVEoT0ssIG1EZXZpY2UtPmNhcHR1cmUodG1wUmVxdWVzdCkpOwotICAgIH0KLQotICAgIFZlY3RvcjxmbG9hdD4gYnJpZ2h0bmVzc2VzOwotICAgIFZlY3Rvcjxuc2Vjc190PiBjYXB0dXJlVGltZXM7Ci0gICAgYnJpZ2h0bmVzc2VzLnNldENhcGFjaXR5KGV4cExpc3Quc2l6ZSgpKTsKLSAgICBjYXB0dXJlVGltZXMuc2V0Q2FwYWNpdHkoZXhwTGlzdC5zaXplKCkpOwotCi0gICAgLy8gR2V0IGVhY2ggZnJhbWUgKG1ldGFkYXRhKSBhbmQgdGhlbiB0aGUgYnVmZmVyLiBDYWxjdWxhdGUgYnJpZ2h0bmVzcy4KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGV4cExpc3Quc2l6ZSgpOyArK2kpIHsKLQotICAgICAgICBBTE9HVigiUmVhZGluZyByZXF1ZXN0ICV6dSIsIGkpOwotICAgICAgICBkb3V0IDw8ICJXYWl0aW5nIGZvciBjYXB0dXJlICIgPDwgaSA8PCAiOiAiIDw8Ci0gICAgICAgICAgICAgICAgIiBleHBvc3VyZSAiIDw8IChleHBMaXN0W2ldLzFlNmYpIDw8ICIgbXMsIiA8PAotICAgICAgICAgICAgICAgICIgZnJhbWUgZHVyYXRpb24gIiA8PCAoZHVyYXRpb25MaXN0W2ldLzFlNmYpIDw8ICIgbXMsIiA8PAotICAgICAgICAgICAgICAgICIgc2Vuc2l0aXZpdHkgIiA8PCBzZW5zaXRpdml0eUxpc3RbaV0gPDwKLSAgICAgICAgICAgICAgICBzdGQ6OmVuZGw7Ci0KLSAgICAgICAgLy8gU2V0IHdhaXQgbGltaXQgYmFzZWQgb24gZXhwZWN0ZWQgZnJhbWUgZHVyYXRpb24sIG9yIG1pbmltdW0gdGltZW91dAotICAgICAgICBpbnQ2NF90IHdhaXRMaW1pdCA9IENBTUVSQV9GUkFNRV9USU1FT1VUOwotICAgICAgICBpZiAoZXhwTGlzdFtpXSAqIDIgPiB3YWl0TGltaXQpIHdhaXRMaW1pdCA9IGV4cExpc3RbaV0gKiAyOwotICAgICAgICBpZiAoZHVyYXRpb25MaXN0W2ldICogMiA+IHdhaXRMaW1pdCkgd2FpdExpbWl0ID0gZHVyYXRpb25MaXN0W2ldICogMjsKLQotICAgICAgICBBU1NFUlRfRVEoT0ssIG1EZXZpY2UtPndhaXRGb3JOZXh0RnJhbWUod2FpdExpbWl0KSk7Ci0gICAgICAgIEFMT0dWKCJSZWFkaW5nIGNhcHR1cmUgcmVxdWVzdC0xICV6dSIsIGkpOwotICAgICAgICBDYXB0dXJlUmVzdWx0IHJlc3VsdDsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCBtRGV2aWNlLT5nZXROZXh0UmVzdWx0KCZyZXN1bHQpKTsKLSAgICAgICAgQUxPR1YoIlJlYWRpbmcgY2FwdHVyZSByZXF1ZXN0LTIgJXp1IiwgaSk7Ci0KLSAgICAgICAgQVNTRVJUX0VRKE9LLCBtRnJhbWVMaXN0ZW5lci0+d2FpdEZvckZyYW1lKENBTUVSQV9GUkFNRV9USU1FT1VUKSk7Ci0gICAgICAgIEFMT0dWKCJXZSBnb3QgdGhlIGZyYW1lIG5vdyIpOwotCi0gICAgICAgIGNhcHR1cmVUaW1lcy5wdXNoX2JhY2soc3lzdGVtVGltZSgpKTsKLQotICAgICAgICBDcHVDb25zdW1lcjo6TG9ja2VkQnVmZmVyIGltZ0J1ZmZlcjsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCBtQ3B1Q29uc3VtZXItPmxvY2tOZXh0QnVmZmVyKCZpbWdCdWZmZXIpKTsKLQotICAgICAgICBpbnQgdW5kZXJleHBvc2VkLCBvdmVyZXhwb3NlZDsKLSAgICAgICAgZmxvYXQgYXZnQnJpZ2h0bmVzcyA9IDA7Ci0gICAgICAgIGxvbmcgbG9uZyBicmlnaHRuZXNzID0gVG90YWxCcmlnaHRuZXNzKGltZ0J1ZmZlciwgJnVuZGVyZXhwb3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm92ZXJleHBvc2VkKTsKLSAgICAgICAgaW50IG51bVZhbGlkUGl4ZWxzID0gbVdpZHRoICogbUhlaWdodCAtICh1bmRlcmV4cG9zZWQgKyBvdmVyZXhwb3NlZCk7Ci0gICAgICAgIGlmIChudW1WYWxpZFBpeGVscyAhPSAwKSB7Ci0gICAgICAgICAgICBhdmdCcmlnaHRuZXNzID0gYnJpZ2h0bmVzcyAqIDEuMGYgLyBudW1WYWxpZFBpeGVsczsKLSAgICAgICAgfSBlbHNlIGlmICh1bmRlcmV4cG9zZWQgPCBvdmVyZXhwb3NlZCkgewotICAgICAgICAgICAgYXZnQnJpZ2h0bmVzcyA9IDI1NTsKLSAgICAgICAgfQotCi0gICAgICAgIEFMT0dWKCJUb3RhbCBicmlnaHRuZXNzIGZvciBmcmFtZSAlenUgd2FzICVsbGQgKHVuZGVyZXhwb3NlZCAlZCwgIgotICAgICAgICAgICAgICAib3ZlcmV4cG9zZWQgJWQpLCBhdmcgJWYiLCBpLCBicmlnaHRuZXNzLCB1bmRlcmV4cG9zZWQsCi0gICAgICAgICAgICAgIG92ZXJleHBvc2VkLCBhdmdCcmlnaHRuZXNzKTsKLSAgICAgICAgZG91dCA8PCAiQXZlcmFnZSBicmlnaHRuZXNzIChmcmFtZSAiIDw8IGkgPDwgIikgd2FzICIgPDwgYXZnQnJpZ2h0bmVzcwotICAgICAgICAgICAgIDw8ICIgKHVuZGVyZXhwb3NlZCAiIDw8IHVuZGVyZXhwb3NlZCA8PCAiLCBvdmVyZXhwb3NlZCAiCi0gICAgICAgICAgICAgPDwgb3ZlcmV4cG9zZWQgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgYnJpZ2h0bmVzc2VzLnB1c2hfYmFjayhhdmdCcmlnaHRuZXNzKTsKLQotICAgICAgICBpZiAoaSAhPSAwKSB7Ci0gICAgICAgICAgICBmbG9hdCBwcmV2RXYgPSBzdGF0aWNfY2FzdDxmbG9hdD4oZXhwTGlzdFtpIC0gMV0pICogc2Vuc2l0aXZpdHlMaXN0W2kgLSAxXTsKLSAgICAgICAgICAgIGZsb2F0IGN1cnJlbnRFdiA9IHN0YXRpY19jYXN0PGZsb2F0PihleHBMaXN0W2ldKSAqIHNlbnNpdGl2aXR5TGlzdFtpXTsKLSAgICAgICAgICAgIGZsb2F0IGV2UmF0aW8gPSAocHJldkV2ID4gY3VycmVudEV2KSA/IChjdXJyZW50RXYgLyBwcmV2RXYpIDoKLSAgICAgICAgICAgICAgICAgICAgKHByZXZFdiAvIGN1cnJlbnRFdik7Ci0gICAgICAgICAgICBpZiAoIGV2UmF0aW8gPiBFVl9NQVRDSF9CT1VORCApIHsKLSAgICAgICAgICAgICAgICBXQVJOX0xUKGZhYnMoYnJpZ2h0bmVzc2VzW2ldIC0gYnJpZ2h0bmVzc2VzW2kgLSAxXSksCi0gICAgICAgICAgICAgICAgICAgICAgICBCUklHSFRORVNTX01BVENIX0JPVU5EKSA8PAotICAgICAgICAgICAgICAgICAgICAgICAgIkNhcHR1cmUgYnJpZ2h0bmVzcyBkaWZmZXJlbnQgZnJvbSBwcmV2aW91cywgZXZlbiB0aG91Z2ggIgotICAgICAgICAgICAgICAgICAgICAgICAgInRoZXkgaGF2ZSB0aGUgc2FtZSBFViB2YWx1ZS4gRXYgbm93OiAiIDw8IGN1cnJlbnRFdiA8PAotICAgICAgICAgICAgICAgICAgICAgICAgIiwgcHJldmlvdXM6ICIgPDwgcHJldkV2IDw8ICIuIEJyaWdodG5lc3Mgbm93OiAiIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzZXNbaV0gPDwgIiwgcHJldmlvdXM6ICIgPDwgYnJpZ2h0bmVzc2VzW2ktMV0gPDwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZW5kbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIE9ubHkgY2hlY2sgdGltaW5nIGlmIG5vdCBzYXZpbmcgdG8gZGlzaywgc2luY2UgdGhhdCBzbG93cyB0aGluZ3MKLSAgICAgICAgICAgIC8vIGRvd24gc3Vic3RhbnRpYWxseQotICAgICAgICAgICAgaWYgKCFkdW1wRnJhbWVzKSB7Ci0gICAgICAgICAgICAgICAgbnNlY3NfdCB0aW1lRGVsdGEgPSBjYXB0dXJlVGltZXNbaV0gLSBjYXB0dXJlVGltZXNbaS0xXTsKLSAgICAgICAgICAgICAgICBuc2Vjc190IGV4cGVjdGVkRGVsdGEgPSBleHBMaXN0W2ldID4gZHVyYXRpb25MaXN0W2ldID8KLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cExpc3RbaV0gOiBkdXJhdGlvbkxpc3RbaV07Ci0gICAgICAgICAgICAgICAgV0FSTl9MVCh0aW1lRGVsdGEsIGV4cGVjdGVkRGVsdGEgKyBEVVJBVElPTl9VUFBFUl9CT1VORCkgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYXB0dXJlIHRvb2sgIiA8PCB0aW1lRGVsdGEgPDwgIiBucyB0byByZWNlaXZlLCBidXQgZXhwZWN0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGZyYW1lIGR1cmF0aW9uIHdhcyAiIDw8IGV4cGVjdGVkRGVsdGEgPDwgIiBucy4iIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmVuZGw7Ci0gICAgICAgICAgICAgICAgV0FSTl9HVCh0aW1lRGVsdGEsIGV4cGVjdGVkRGVsdGEgLSBEVVJBVElPTl9MT1dFUl9CT1VORCkgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYXB0dXJlIHRvb2sgIiA8PCB0aW1lRGVsdGEgPDwgIiBucyB0byByZWNlaXZlLCBidXQgZXhwZWN0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGZyYW1lIGR1cmF0aW9uIHdhcyAiIDw8IGV4cGVjdGVkRGVsdGEgPDwgIiBucy4iIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmVuZGw7Ci0gICAgICAgICAgICAgICAgZG91dCA8PCAiVGltZSBkZWx0YSBmcm9tIHByZXZpb3VzIGZyYW1lOiAiIDw8IHRpbWVEZWx0YSAvIDFlNiA8PAotICAgICAgICAgICAgICAgICAgICAgICAgIiBtcy4gIEV4cGVjdGVkICIgPDwgZXhwZWN0ZWREZWx0YSAvIDFlNiA8PCAiIG1zIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZHVtcEZyYW1lcykgewotICAgICAgICAgICAgU3RyaW5nOCBkdW1wTmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZzg6OmZvcm1hdCgiL2RhdGEvbG9jYWwvdG1wL2NhbWVyYTJfdGVzdF92YXJpYWJsZV9idXJzdF9mcmFtZV8lMDN6dS55dXYiLCBpKTsKLSAgICAgICAgICAgIGRvdXQgPDwgIiAgV3JpdGluZyBZVVYgZHVtcCB0byAiIDw8IGR1bXBOYW1lIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgICAgIER1bXBZdXZUb0ZpbGUoZHVtcE5hbWUsIGltZ0J1ZmZlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBBU1NFUlRfRVEoT0ssIG1DcHVDb25zdW1lci0+dW5sb2NrQnVmZmVyKGltZ0J1ZmZlcikpOwotICAgIH0KLQotfQotCi19Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEyL0NhbWVyYUZyYW1lVGVzdHMuY3BwIGIvdGVzdHMvY2FtZXJhMi9DYW1lcmFGcmFtZVRlc3RzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M1YWJmNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9jYW1lcmEyL0NhbWVyYUZyYW1lVGVzdHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2RlZmluZSBMT0dfVEFHICJDYW1lcmFGcmFtZVRlc3QiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJoYXJkd2FyZS9oYXJkd2FyZS5oIgotI2luY2x1ZGUgImhhcmR3YXJlL2NhbWVyYTIuaCIKLQotI2luY2x1ZGUgPGNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgotI2luY2x1ZGUgPGd1aS9DcHVDb25zdW1lci5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgIkNhbWVyYVN0cmVhbUZpeHR1cmUuaCIKLSNpbmNsdWRlICJUZXN0RXh0ZW5zaW9ucy5oIgotCi0jZGVmaW5lIENBTUVSQV9GUkFNRV9USU1FT1VUICAgIDEwMDAwMDAwMDAgLy9uc2VjcyAoMSBzZWNzKQotI2RlZmluZSBDQU1FUkFfSEVBUF9DT1VOVCAgICAgICAyIC8vSEFMQlVHOiAxIG1lYW5zIHJlZ2lzdGVyQnVmZmVycyBmYWlscwotI2RlZmluZSBDQU1FUkFfRlJBTUVfREVCVUdHSU5HICAwCi0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmNhbWVyYTI7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBjYW1lcmEyIHsKLW5hbWVzcGFjZSB0ZXN0cyB7Ci0KLXN0YXRpYyBDYW1lcmFTdHJlYW1QYXJhbXMgU1RSRUFNX1BBUkFNRVRFUlMgPSB7Ci0gICAgLyptRm9ybWF0Ki8gICAgIENBTUVSQV9TVFJFQU1fQVVUT19DUFVfRk9STUFULAotICAgIC8qbUhlYXBDb3VudCovICBDQU1FUkFfSEVBUF9DT1VOVAotfTsKLQotY2xhc3MgQ2FtZXJhRnJhbWVUZXN0Ci0gICAgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGludD4sCi0gICAgICBwdWJsaWMgQ2FtZXJhU3RyZWFtRml4dHVyZSB7Ci0KLXB1YmxpYzoKLSAgICBDYW1lcmFGcmFtZVRlc3QoKSA6IENhbWVyYVN0cmVhbUZpeHR1cmUoU1RSRUFNX1BBUkFNRVRFUlMpIHsKLSAgICAgICAgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19DT05TVFJVQ1RPUjsKLQotICAgICAgICBpZiAoIUhhc0ZhdGFsRmFpbHVyZSgpKSB7Ci0gICAgICAgICAgICBDcmVhdGVTdHJlYW0oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIH5DYW1lcmFGcmFtZVRlc3QoKSB7Ci0gICAgICAgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfREVTVFJVQ1RPUjsKLQotICAgICAgICBpZiAobURldmljZS5nZXQoKSkgewotICAgICAgICAgICAgbURldmljZS0+d2FpdFVudGlsRHJhaW5lZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgICAgICBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX1NFVF9VUDsKLSAgICB9Ci0gICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgICAgICBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX1RFQVJfRE9XTjsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLQotfTsKLQotVEVTVF9QKENhbWVyYUZyYW1lVGVzdCwgR2V0RnJhbWUpIHsKLQotICAgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfSU5JVDsKLQotICAgIC8qIFN1Ym1pdCBhIFBSRVZJRVcgdHlwZSByZXF1ZXN0LCB0aGVuIHdhaXQgdW50aWwgd2UgZ2V0IHRoZSBmcmFtZSBiYWNrICovCi0gICAgQ2FtZXJhTWV0YWRhdGEgcHJldmlld1JlcXVlc3Q7Ci0gICAgQVNTRVJUX0VRKE9LLCBtRGV2aWNlLT5jcmVhdGVEZWZhdWx0UmVxdWVzdChDQU1FUkEyX1RFTVBMQVRFX1BSRVZJRVcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJldmlld1JlcXVlc3QpKTsKLSAgICB7Ci0gICAgICAgIFZlY3RvcjxpbnQzMl90PiBvdXRwdXRTdHJlYW1JZHM7Ci0gICAgICAgIG91dHB1dFN0cmVhbUlkcy5wdXNoKG1TdHJlYW1JZCk7Ci0gICAgICAgIEFTU0VSVF9FUShPSywgcHJldmlld1JlcXVlc3QudXBkYXRlKEFORFJPSURfUkVRVUVTVF9PVVRQVVRfU1RSRUFNUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtSWRzKSk7Ci0gICAgICAgIGlmIChDQU1FUkFfRlJBTUVfREVCVUdHSU5HKSB7Ci0gICAgICAgICAgICBpbnQgZnJhbWVDb3VudCA9IDA7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoT0ssIHByZXZpZXdSZXF1ZXN0LnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfRlJBTUVfQ09VTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWVDb3VudCwgMSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKENBTUVSQV9GUkFNRV9ERUJVR0dJTkcpIHsKLSAgICAgICAgcHJldmlld1JlcXVlc3QuZHVtcChTVERPVVRfRklMRU5PKTsKLSAgICB9Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IEdldFBhcmFtKCk7ICsraSkgewotICAgICAgICBBTE9HVigiU3VibWl0dGluZyBjYXB0dXJlIHJlcXVlc3QgJWQiLCBpKTsKLSAgICAgICAgQ2FtZXJhTWV0YWRhdGEgdG1wUmVxdWVzdCA9IHByZXZpZXdSZXF1ZXN0OwotICAgICAgICBBU1NFUlRfRVEoT0ssIG1EZXZpY2UtPmNhcHR1cmUodG1wUmVxdWVzdCkpOwotICAgIH0KLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgR2V0UGFyYW0oKTsgKytpKSB7Ci0gICAgICAgIEFMT0dWKCJSZWFkaW5nIGNhcHR1cmUgcmVxdWVzdCAlZCIsIGkpOwotICAgICAgICBBU1NFUlRfRVEoT0ssIG1EZXZpY2UtPndhaXRGb3JOZXh0RnJhbWUoQ0FNRVJBX0ZSQU1FX1RJTUVPVVQpKTsKLQotICAgICAgICBDYXB0dXJlUmVzdWx0IHJlc3VsdDsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCBtRGV2aWNlLT5nZXROZXh0UmVzdWx0KCZyZXN1bHQpKTsKLQotICAgICAgICAvLyB3YWl0IGZvciBidWZmZXIgdG8gYmUgYXZhaWxhYmxlCi0gICAgICAgIEFTU0VSVF9FUShPSywgbUZyYW1lTGlzdGVuZXItPndhaXRGb3JGcmFtZShDQU1FUkFfRlJBTUVfVElNRU9VVCkpOwotICAgICAgICBBTE9HVigiV2UgZ290IHRoZSBmcmFtZSBub3ciKTsKLQotICAgICAgICAvLyBtYXJrIGJ1ZmZlciBjb25zdW1lZCBzbyBwcm9kdWNlciBjYW4gcmUtZGVxdWV1ZSBpdAotICAgICAgICBDcHVDb25zdW1lcjo6TG9ja2VkQnVmZmVyIGltZ0J1ZmZlcjsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCBtQ3B1Q29uc3VtZXItPmxvY2tOZXh0QnVmZmVyKCZpbWdCdWZmZXIpKTsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCBtQ3B1Q29uc3VtZXItPnVubG9ja0J1ZmZlcihpbWdCdWZmZXIpKTsKLSAgICB9Ci0KLX0KLQotLy9GSVhNRTogZG9udCBoYXJkY29kZSBzdHJlYW0gcGFyYW1zLCBhbmQgYWxzbyB0ZXN0IG11bHRpc3RyZWFtCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChGcmFtZVBhcmFtZXRlckNvbWJpbmF0aW9ucywgQ2FtZXJhRnJhbWVUZXN0LAotICAgIHRlc3Rpbmc6OlJhbmdlKDEsIDEwKSk7Ci0KLQotfQotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhMi9DYW1lcmFNZXRhZGF0YVRlc3RzLmNwcCBiL3Rlc3RzL2NhbWVyYTIvQ2FtZXJhTWV0YWRhdGFUZXN0cy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YjJkZDkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY2FtZXJhMi9DYW1lcmFNZXRhZGF0YVRlc3RzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhTWV0YWRhdGFUZXN0RnVuY3Rpb25hbCIKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAiY3V0aWxzL3Byb3BlcnRpZXMuaCIKLSNpbmNsdWRlICJsb2cvbG9nLmgiCi0jaW5jbHVkZSAidXRpbHMvRXJyb3JzLmgiCi0KLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotI2luY2x1ZGUgInN5c3RlbS9jYW1lcmFfbWV0YWRhdGEuaCIKLSNpbmNsdWRlICJoYXJkd2FyZS9oYXJkd2FyZS5oIgotI2luY2x1ZGUgImhhcmR3YXJlL2NhbWVyYTIuaCIKLQotI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgiCi0jaW5jbHVkZSAidXRpbHMvU3Ryb25nUG9pbnRlci5oIgotCi0jaW5jbHVkZSA8Z3VpL0NwdUNvbnN1bWVyLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KLQotI2luY2x1ZGUgIkNhbWVyYVN0cmVhbUZpeHR1cmUuaCIKLSNpbmNsdWRlICJUZXN0RXh0ZW5zaW9ucy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgY2FtZXJhMiB7Ci1uYW1lc3BhY2UgdGVzdHMgewotCi0vL0ZJWE1FOiBkb250IGhhcmRjb2RlCi1zdGF0aWMgQ2FtZXJhU3RyZWFtUGFyYW1zIE1FVEFEQVRBX1NUUkVBTV9QQVJBTUVURVJTID0gewotICAgIC8qbUZvcm1hdCovICAgICBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUCwKLSAgICAvKm1IZWFwQ291bnQqLyAgMgotfTsKLQotY2xhc3MgQ2FtZXJhTWV0YWRhdGFUZXN0Ci0gICAgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0LAotICAgICAgcHVibGljIENhbWVyYVN0cmVhbUZpeHR1cmUgewotCi1wdWJsaWM6Ci0gICAgQ2FtZXJhTWV0YWRhdGFUZXN0KCkKLSAgICA6IENhbWVyYVN0cmVhbUZpeHR1cmUoTUVUQURBVEFfU1RSRUFNX1BBUkFNRVRFUlMpIHsKLSAgICAgICAgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19DT05TVFJVQ1RPUjsKLSAgICB9Ci0KLSAgICB+Q2FtZXJhTWV0YWRhdGFUZXN0KCkgewotICAgICAgICBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX0RFU1RSVUNUT1I7Ci0gICAgfQotCi0gICAgaW50IEdldFR5cGVGcm9tVGFnKHVpbnQzMl90IHRhZykgY29uc3QgewotICAgICAgICByZXR1cm4gZ2V0X2NhbWVyYV9tZXRhZGF0YV90YWdfdHlwZSh0YWcpOwotICAgIH0KLQotICAgIGludCBHZXRUeXBlRnJvbVN0YXRpY1RhZyh1aW50MzJfdCB0YWcpIGNvbnN0IHsKLSAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHN0YXRpY0luZm8gPSBtRGV2aWNlLT5pbmZvKCk7Ci0gICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBlbnRyeSA9IHN0YXRpY0luZm8uZmluZCh0YWcpOwotICAgICAgICByZXR1cm4gZW50cnkudHlwZTsKLSAgICB9Ci0KLSAgICBpbnQgR2V0RW50cnlDb3VudEZyb21TdGF0aWNUYWcodWludDMyX3QgdGFnKSBjb25zdCB7Ci0gICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNJbmZvID0gbURldmljZS0+aW5mbygpOwotICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQodGFnKTsKLSAgICAgICAgcmV0dXJuIGVudHJ5LmNvdW50OwotICAgIH0KLQotICAgIGJvb2wgSGFzRWxlbWVudEluQXJyYXlGcm9tU3RhdGljVGFnKHVpbnQzMl90IHRhZywgaW50MzJfdCBlbGVtZW50KSBjb25zdCB7Ci0gICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNJbmZvID0gbURldmljZS0+aW5mbygpOwotICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQodGFnKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoZW50cnkuZGF0YS5pMzJbaV0gPT0gZWxlbWVudCkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0KLX07Ci0KLVRFU1RfRihDYW1lcmFNZXRhZGF0YVRlc3QsIHR5cGVzKSB7Ci0KLSAgICBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX0lOSVQ7Ci0KLSAgICAvL0ZJWE1FOiBzZXQgdGhpcyB1cCBpbiBhbiBleHRlcm5hbCBmaWxlIG9mIHNvbWUgc29ydCAoeG1sPykKLSAgICB7Ci0gICAgICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICAgICAgcHJvcGVydHlfZ2V0KCJyby5idWlsZC5pZCIsIHZhbHVlLCAiIik7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHN0cl92YWx1ZSh2YWx1ZSk7Ci0KLSAgICAgICAgaWYgKHN0cl92YWx1ZSA9PSAibWFudGEiKQotICAgICAgICB7Ci0gICAgICAgICAgICBFWFBFQ1RfRVEoVFlQRV9CWVRFLAotICAgICAgICAgICAgICAgIEdldFR5cGVGcm9tU3RhdGljVGFnKEFORFJPSURfUVVJUktTX1RSSUdHRVJfQUZfV0lUSF9BVVRPKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRVEoVFlQRV9CWVRFLAotICAgICAgICAgICAgICAgIEdldFR5cGVGcm9tU3RhdGljVGFnKEFORFJPSURfUVVJUktTX1VTRV9aU0xfRk9STUFUKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRVEoVFlQRV9CWVRFLAotICAgICAgICAgICAgICAgIEdldFR5cGVGcm9tU3RhdGljVGFnKEFORFJPSURfUVVJUktTX01FVEVSSU5HX0NST1BfUkVHSU9OKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgIFRPRE86Ci0gICAgZ28gdGhyb3VnaCBhbGwgc3RhdGljIG1ldGFkYXRhIGFuZCBtYWtlIHN1cmUgYWxsIGZpZWxkcyB3ZSBleHBlY3QKLSAgICB0aGF0IGFyZSB0aGVyZSwgQVJFIHRoZXJlLgotCi0gICAgZG9udCB3b3JyeSBhYm91dCB0aGUgdHlwZSBhcyBpdHMgZW5mb3JjZWQgYnkgdGhlIG1ldGFkYXRhIGFwaQotICAgIHdlIGNhbiBwcm9iYWJseSBjaGVjayB0aGUgcmFuZ2UgdmFsaWRpdHkgdGhvdWdoCi0gICAgKi8KLQotICAgIGlmICgwKSB7Ci0gICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBlbnRyeTsKLSAgICAgICAgRVhQRUNUX0VRKFRZUEVfQllURSwgICAgIGVudHJ5LnR5cGUpOwotICAgICAgICBFWFBFQ1RfRVEoVFlQRV9JTlQzMiwgICAgZW50cnkudHlwZSk7Ci0gICAgICAgIEVYUEVDVF9FUShUWVBFX0ZMT0FULCAgICBlbnRyeS50eXBlKTsKLSAgICAgICAgRVhQRUNUX0VRKFRZUEVfSU5UNjQsICAgIGVudHJ5LnR5cGUpOwotICAgICAgICBFWFBFQ1RfRVEoVFlQRV9ET1VCTEUsICAgZW50cnkudHlwZSk7Ci0gICAgICAgIEVYUEVDVF9FUShUWVBFX1JBVElPTkFMLCBlbnRyeS50eXBlKTsKLSAgICB9Ci19Ci0KLVRFU1RfRihDYW1lcmFNZXRhZGF0YVRlc3QsIFJlcXVpcmVkRm9ybWF0cykgewotICAgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfSU5JVDsKLQotICAgIEVYUEVDVF9UUlVFKAotICAgICAgICBIYXNFbGVtZW50SW5BcnJheUZyb21TdGF0aWNUYWcoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0ZPUk1BVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0JMT0IpKTsgLy8gSlBFRwotCi0gICAgaWYgKGdldERldmljZVZlcnNpb24oKSA8IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7Ci0gICAgICAgIC8vIEhBTDIgY2FuIHN1cHBvcnQgZWl0aGVyIGZsZXhpYmxlIFlVViBvciBZVjEyICsgTlYyMQotICAgICAgICBpZiAoIUhhc0VsZW1lbnRJbkFycmF5RnJvbVN0YXRpY1RhZyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfRk9STUFUUywKLSAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwXzg4OCkpIHsKLQotICAgICAgICAgICAgRVhQRUNUX1RSVUUoCi0gICAgICAgICAgICAgICAgSGFzRWxlbWVudEluQXJyYXlGcm9tU3RhdGljVGFnKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9GT1JNQVRTLAotICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1ApKTsgLy8gTlYyMQotCi0gICAgICAgICAgICBFWFBFQ1RfVFJVRSgKLSAgICAgICAgICAgICAgICBIYXNFbGVtZW50SW5BcnJheUZyb21TdGF0aWNUYWcoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0ZPUk1BVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lWMTIpKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEhBTDMgbXVzdCBzdXBwb3J0IGZsZXhpYmxlIFlVVgotICAgICAgICBFWFBFQ1RfVFJVRShIYXNFbGVtZW50SW5BcnJheUZyb21TdGF0aWNUYWcoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0ZPUk1BVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF84ODgpKTsKLSAgICB9Ci0KLX0KLQotVEVTVF9GKENhbWVyYU1ldGFkYXRhVGVzdCwgU2FuZVJlc29sdXRpb25zKSB7Ci0gICAgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19JTklUOwotCi0gICAgaWYgKGdldERldmljZVZlcnNpb24oKSA8IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7Ci0gICAgICAgIC8vIElmZiB0aGVyZSBhcmUgbGlzdGVkIHJhdyByZXNvbHV0aW9ucywgdGhlIGZvcm1hdCBzaG91bGQgYmUgYXZhaWxhYmxlCi0gICAgICAgIGludCByYXdSZXNvbHV0aW9uc0NvdW50ID0KLSAgICAgICAgICAgICAgICBHZXRFbnRyeUNvdW50RnJvbVN0YXRpY1RhZyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfUkFXX1NJWkVTKTsKLSAgICAgICAgaWYgKHJhd1Jlc29sdXRpb25zQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRSgKLSAgICAgICAgICAgICAgICBIYXNFbGVtZW50SW5BcnJheUZyb21TdGF0aWNUYWcoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0ZPUk1BVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1JBVzE2KSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZXF1aXJlZCBwcm9jZXNzZWQgc2l6ZXMuCi0gICAgICAgIGludCBwcm9jZXNzZWRTaXplQ291bnQgPQotICAgICAgICAgICAgICAgR2V0RW50cnlDb3VudEZyb21TdGF0aWNUYWcoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1BST0NFU1NFRF9TSVpFUyk7Ci0gICAgICAgIEVYUEVDVF9ORSgwLCBwcm9jZXNzZWRTaXplQ291bnQpOwotICAgICAgICBFWFBFQ1RfRVEoMCwgcHJvY2Vzc2VkU2l6ZUNvdW50ICUgMik7IC8vIG11bHRpcGxlIG9mIDIgKHcsaCkKLQotICAgICAgICAvLyBSZXF1aXJlZCBKUEVHIHNpemVzCi0gICAgICAgIGludCBqcGVnU2l6ZUNvdW50ID0KLSAgICAgICAgICAgICAgICBHZXRFbnRyeUNvdW50RnJvbVN0YXRpY1RhZyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfSlBFR19TSVpFUyk7Ci0gICAgICAgIEVYUEVDVF9ORSgwLCBqcGVnU2l6ZUNvdW50KTsKLSAgICAgICAgRVhQRUNUX0VRKDAsIGpwZWdTaXplQ291bnQgJSAyKTsgLy8gbXVsdGlwbGUgb2YgMiAodyxoKQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBzdHJtQ29uZmlnQ291bnQgPQotICAgICAgICAgICAgICAgIEdldEVudHJ5Q291bnRGcm9tU3RhdGljVGFnKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMpOwotICAgICAgICBFWFBFQ1RfTkUoMCwgc3RybUNvbmZpZ0NvdW50KTsKLSAgICAgICAgRVhQRUNUX0VRKDAsIHN0cm1Db25maWdDb3VudCAlIDQpOyAvLyBtdWx0aXBsZSBvZiA0IChmb3JtYXQsdyxoLG91dHB1dD8pCi0gICAgfQotCi19Ci0KLX0KLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL2NhbWVyYTIvQ2FtZXJhTW9kdWxlRml4dHVyZS5oIGIvdGVzdHMvY2FtZXJhMi9DYW1lcmFNb2R1bGVGaXh0dXJlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NTEzYWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY2FtZXJhMi9DYW1lcmFNb2R1bGVGaXh0dXJlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19BTkRST0lEX0hBTF9DQU1FUkEyX1RFU1RTX01PRFVMRV9GSVhUVVJFX18KLSNkZWZpbmUgX19BTkRST0lEX0hBTF9DQU1FUkEyX1RFU1RTX01PRFVMRV9GSVhUVVJFX18KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNpbmNsdWRlICJoYXJkd2FyZS9oYXJkd2FyZS5oIgotI2luY2x1ZGUgImhhcmR3YXJlL2NhbWVyYTIuaCIKLQotI2luY2x1ZGUgPGNvbW1vbi9DYW1lcmFNb2R1bGUuaD4KLSNpbmNsdWRlIDxkZXZpY2UzL0NhbWVyYTNEZXZpY2UuaD4KLQotI2luY2x1ZGUgImNhbWVyYTJfdXRpbHMuaCIKLSNpbmNsdWRlICJUZXN0RXh0ZW5zaW9ucy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgY2FtZXJhMiB7Ci1uYW1lc3BhY2UgdGVzdHMgewotCi10ZW1wbGF0ZSA8Ym9vbCBJbmZvUXVpcmsgPSBmYWxzZT4KLXN0cnVjdCBDYW1lcmFNb2R1bGVGaXh0dXJlIHsKLQotICAgIGV4cGxpY2l0IENhbWVyYU1vZHVsZUZpeHR1cmUoaW50IENhbWVyYUlEID0gLTEpIHsKLSAgICAgICAgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19DT05TVFJVQ1RPUjsKLQotICAgICAgICBtQ2FtZXJhSUQgPSBDYW1lcmFJRDsKLSAgICB9Ci0KLSAgICB+Q2FtZXJhTW9kdWxlRml4dHVyZSgpIHsKLSAgICAgICAgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19ERVNUUlVDVE9SOwotICAgIH0KLQotICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBHZXRTdGF0aWNFbnRyeSh1aW50MzJfdCB0YWcpIGNvbnN0IHsKLSAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHN0YXRpY0luZm8gPSBtRGV2aWNlLT5pbmZvKCk7Ci0gICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBlbnRyeSA9IHN0YXRpY0luZm8uZmluZCh0YWcpOwotICAgICAgICByZXR1cm4gZW50cnk7Ci0gICAgfQotCi0gICAgdm9pZCBTZXRVcCgpIHsKLSAgICAgICAgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19TRVRfVVA7Ci0KLSAgICAgICAgY2FtZXJhX21vZHVsZV90ICpyYXdNb2R1bGU7Ci0gICAgICAgIEFTU0VSVF9MRSgwLCBod19nZXRfbW9kdWxlKENBTUVSQV9IQVJEV0FSRV9NT0RVTEVfSUQsCi0gICAgICAgICAgICAoY29uc3QgaHdfbW9kdWxlX3QgKiopJnJhd01vZHVsZSkpIDw8ICJDb3VsZCBub3QgbG9hZCBjYW1lcmEgbW9kdWxlIjsKLSAgICAgICAgQVNTRVJUX05FKCh2b2lkKikwLCByYXdNb2R1bGUpOwotICAgICAgICBtTW9kdWxlID0gbmV3IENhbWVyYU1vZHVsZShyYXdNb2R1bGUpOwotCi0gICAgICAgIG1OdW1iZXJPZkNhbWVyYXMgPSBtTW9kdWxlLT5nZXROdW1iZXJPZkNhbWVyYXMoKTsKLSAgICAgICAgQVNTRVJUX0xFKDAsIG1OdW1iZXJPZkNhbWVyYXMpOwotCi0gICAgICAgIEFTU0VSVF9MRSgKLSAgICAgICAgICAgIENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl8wLCBtTW9kdWxlLT5nZXRNb2R1bGVBcGlWZXJzaW9uKCkpCi0gICAgICAgICAgICA8PCAiV3JvbmcgbW9kdWxlIEFQSSB2ZXJzaW9uIjsKLQotICAgICAgICAvKiBGb3IgdXNpbmcgdGhpcyBmaXh0dXJlIGluIG90aGVyIHRlc3RzIG9ubHkgKi8KLSAgICAgICAgU2V0VXBNaXhpbigpOwotICAgIH0KLQotICAgIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgICAgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfVEVBUl9ET1dOOwotCi0gICAgICAgIGRlbGV0ZSBtTW9kdWxlOwotICAgICAgICBUZWFyRG93bk1peGluKCk7Ci0KLSAgICAgICAgLyogaW1wb3J0YW50OiBkZXZpY2UgbXVzdCBiZSBkZXN0cnVjdGVkIGJlZm9yZSBjbG9zaW5nIG1vZHVsZSwKLSAgICAgICAgICAgc2luY2UgaXQgY2FsbHMgYmFjayBpbnRvIEhBTCAqLwotICAgICAgICBtRGV2aWNlLmNsZWFyKCk7Ci0KLSAgICAgICAgaWYgKCFURVNUX0VYVEVOU0lPTl9GT1JLSU5HX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBIV01vZHVsZUhlbHBlcnM6OmNsb3NlTW9kdWxlKG1Nb2R1bGUtPmdldERzbygpKSkKLSAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGNsb3NlIGNhbWVyYSBIQUwgbW9kdWxlIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgQ3JlYXRlQ2FtZXJhKGludCBjYW1lcmFJRCwgLypvdXQqLyBzcDxDYW1lcmFEZXZpY2VCYXNlPiAqZGV2aWNlKSB7Ci0gICAgICAgIHN0cnVjdCBjYW1lcmFfaW5mbyBpbmZvOwotICAgICAgICBBU1NFUlRfRVEoT0ssIG1Nb2R1bGUtPmdldENhbWVyYUluZm8oY2FtZXJhSUQsICZpbmZvKSk7Ci0KLSAgICAgICAgQVNTRVJUX0dFKChpbnQpaW5mby5kZXZpY2VfdmVyc2lvbiwgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIDw8Ci0gICAgICAgICAgICAgICAgIkRldmljZSB2ZXJzaW9uIHRvbyBvbGQgZm9yIGNhbWVyYSAiIDw8IGNhbWVyYUlEIDw8ICIuIFZlcnNpb246ICIgPDwKLSAgICAgICAgICAgICAgICBpbmZvLmRldmljZV92ZXJzaW9uOwotICAgICAgICBzd2l0Y2goaW5mby5kZXZpY2VfdmVyc2lvbikgewotICAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDoKLSAgICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzE6Ci0gICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgotICAgICAgICAgICAgICAgICpkZXZpY2UgPSBuZXcgQ2FtZXJhM0RldmljZShjYW1lcmFJRCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGRldmljZS0+Y2xlYXIoKTsKLSAgICAgICAgICAgICAgICBGQUlMKCkgPDwgIkRldmljZSB2ZXJzaW9uIHVua25vd24gZm9yIGNhbWVyYSAiIDw8IGNhbWVyYUlEIDw8ICIuIFZlcnNpb246ICIgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgaW5mby5kZXZpY2VfdmVyc2lvbjsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgaW50IGdldERldmljZVZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBnZXREZXZpY2VWZXJzaW9uKG1DYW1lcmFJRCk7Ci0gICAgfQotCi0gICAgaW50IGdldERldmljZVZlcnNpb24oaW50IGNhbWVyYUlkLCBzdGF0dXNfdCogc3RhdHVzID0gTlVMTCkgewotICAgICAgICBjYW1lcmFfaW5mbyBpbmZvOwotICAgICAgICBzdGF0dXNfdCByZXM7Ci0gICAgICAgIHJlcyA9IG1Nb2R1bGUtPmdldENhbWVyYUluZm8oY2FtZXJhSWQsICZpbmZvKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOVUxMKSAqc3RhdHVzID0gcmVzOwotCi0gICAgICAgIHJldHVybiBpbmZvLmRldmljZV92ZXJzaW9uOwotICAgIH0KLQotcHJpdmF0ZToKLQotICAgIHZvaWQgU2V0VXBNaXhpbigpIHsKLSAgICAgICAgLyogRm9yIHVzaW5nIHRoaXMgZml4dHVyZSBpbiBvdGhlciB0ZXN0cyBvbmx5ICovCi0gICAgICAgIGlmIChtQ2FtZXJhSUQgIT0gLTEpIHsKLSAgICAgICAgICAgIEVYUEVDVF9MRSgwLCBtQ2FtZXJhSUQpOwotICAgICAgICAgICAgRVhQRUNUX0xUKG1DYW1lcmFJRCwgbU51bWJlck9mQ2FtZXJhcyk7Ci0KLSAgICAgICAgICAgIC8qIEhBTEJVRyAoRXh5bm9zNSk7IGNyYXNoZXMgaWYgd2Ugc2tpcCBjYWxsaW5nIGdldF9jYW1lcmFfaW5mbwotICAgICAgICAgICAgICAgYmVmb3JlIGluaXRpYWxpemluZy4gTmVlZCBpbmZvIGFueXdheSBub3cuICovCi0KLSAgICAgICAgICAgIENyZWF0ZUNhbWVyYShtQ2FtZXJhSUQsICZtRGV2aWNlKTsKLQotICAgICAgICAgICAgQVNTRVJUX1RSVUUobURldmljZSAhPSBOVUxMKSA8PCAiRmFpbGVkIHRvIG9wZW4gZGV2aWNlICIgPDwgbUNhbWVyYUlEOwotICAgICAgICAgICAgQVNTRVJUX0VRKE9LLCBtRGV2aWNlLT5pbml0aWFsaXplKG1Nb2R1bGUpKQotICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBkZXZpY2UgIiA8PCBtQ2FtZXJhSUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIFRlYXJEb3duTWl4aW4oKSB7Ci0KLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICBpbnQgbU51bWJlck9mQ2FtZXJhczsKLSAgICBDYW1lcmFNb2R1bGUgKm1Nb2R1bGU7Ci0gICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gbURldmljZTsKLQotcHJpdmF0ZToKLSAgICBpbnQgbUNhbWVyYUlEOwotfTsKLQotCi19Ci19Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhMi9DYW1lcmFNb2R1bGVUZXN0cy5jcHAgYi90ZXN0cy9jYW1lcmEyL0NhbWVyYU1vZHVsZVRlc3RzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI2Yzc1Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9jYW1lcmEyL0NhbWVyYU1vZHVsZVRlc3RzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLSNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhTW9kdWxlVGVzdCIKLSNkZWZpbmUgTE9HX05ERUJVRyAwCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgotI2luY2x1ZGUgPGNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmg+Ci0KLSNpbmNsdWRlICJoYXJkd2FyZS9oYXJkd2FyZS5oIgotI2luY2x1ZGUgImhhcmR3YXJlL2NhbWVyYTIuaCIKLQotI2luY2x1ZGUgIkNhbWVyYU1vZHVsZUZpeHR1cmUuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGNhbWVyYTIgewotbmFtZXNwYWNlIHRlc3RzIHsKLQotY2xhc3MgQ2FtZXJhTW9kdWxlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIENhbWVyYU1vZHVsZUZpeHR1cmU8PiB7Ci0KLXB1YmxpYzoKLSAgICBDYW1lcmFNb2R1bGVUZXN0KCkgewotICAgICAgICBDYW1lcmFNb2R1bGVGaXh0dXJlOjpTZXRVcCgpOwotICAgIH0KLQotICAgIH5DYW1lcmFNb2R1bGVUZXN0KCkgewotICAgICAgICBDYW1lcmFNb2R1bGVGaXh0dXJlOjpUZWFyRG93bigpOwotICAgIH0KLQotICAgIHN0YXR1c190IGluaXRpYWxpemVEZXZpY2UoaW50IGNhbWVyYUlkKSB7Ci0KLSAgICAgICAgLy8gaWdub3JlIEhBTDFzLiBjb3VudCBhcyB0ZXN0IHBhc3MKLSAgICAgICAgc3RhdHVzX3Qgc3RhdDsKLSAgICAgICAgaWYgKGlzRGV2aWNlVmVyc2lvbkhhbDIoY2FtZXJhSWQsICZzdGF0KSAmJiBzdGF0ID09IE9LKSB7Ci0gICAgICAgICAgICBzdGF0ID0gbURldmljZS0+aW5pdGlhbGl6ZShtTW9kdWxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdGF0OwotICAgIH0KLQotICAgIGJvb2wgaXNEZXZpY2VWZXJzaW9uSGFsMihpbnQgY2FtZXJhSWQsIHN0YXR1c190KiBzdGF0dXMpIHsKLSAgICAgICAgcmV0dXJuIGdldERldmljZVZlcnNpb24oY2FtZXJhSWQsIHN0YXR1cykKLSAgICAgICAgICAgICAgID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8wOwotICAgIH0KLX07Ci0KLVRFU1RfRihDYW1lcmFNb2R1bGVUZXN0LCBMb2FkTW9kdWxlKSB7Ci0KLSAgICBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX0lOSVQ7Ci0KLSAgICBzdGF0dXNfdCBzdGF0OwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bWJlck9mQ2FtZXJhczsgKytpKSB7Ci0gICAgICAgIGlmIChpc0RldmljZVZlcnNpb25IYWwyKGksICZzdGF0KSAmJiBzdGF0ID09IE9LKSB7Ci0gICAgICAgICAgICBDcmVhdGVDYW1lcmEoaSwgJm1EZXZpY2UpOwotICAgICAgICAgICAgQVNTRVJUX0VRKE9LLCBpbml0aWFsaXplRGV2aWNlKGkpKQotICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBkZXZpY2UgIiA8PCBpOwotICAgICAgICAgICAgbURldmljZS5jbGVhcigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29uc3QgOjp0ZXN0aW5nOjpUZXN0SW5mbyogY29uc3QgdGVzdF9pbmZvID0KLSAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOwotICAgICAgICAgICAgc3RkOjpjZXJyIDw8ICJTa2lwcGluZyB0ZXN0ICIKLSAgICAgICAgICAgICAgICAgICAgICA8PCB0ZXN0X2luZm8tPnRlc3RfY2FzZV9uYW1lKCkgPDwgIi4iCi0gICAgICAgICAgICAgICAgICAgICAgPDwgdGVzdF9pbmZvLT5uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICA8PCAiIGJlY2F1c2UgSEFMIGRldmljZSB2ZXJzaW9uIGlzIFYxIgotICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgfQotICAgIH0KLQotfQotCi1URVNUX0YoQ2FtZXJhTW9kdWxlVGVzdCwgTG9hZE1vZHVsZUJhZEluZGljZXMpIHsKLQotICAgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfSU5JVDsKLQotICAgIGludCBpZHhbXSA9IHsgLTEsIG1OdW1iZXJPZkNhbWVyYXMsIG1OdW1iZXJPZkNhbWVyYXMgKyAxIH07Ci0gICAgaHdfZGV2aWNlX3QgKmRldmljZSA9IE5VTEw7Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZW9mKGlkeCkvc2l6ZW9mKGlkeFswXSk7ICsraSkgewotICAgICAgICBTdHJpbmc4IGRldmljZU5hbWUgPSBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgaWR4W2ldKTsKLSAgICAgICAgc3RhdHVzX3QgcmVzID0gbU1vZHVsZS0+b3BlbihkZXZpY2VOYW1lLCAmZGV2aWNlKTsKLSAgICAgICAgRVhQRUNUX05FKE9LLCByZXMpOwotICAgICAgICBFWFBFQ1RfRVEoLUVOT0RFViwgcmVzKQotICAgICAgICAgICAgPDwgIkluY29ycmVjdCBlcnJvciBjb2RlIHdoZW4gdHJ5aW5nIHRvIG9wZW4gY2FtZXJhIHdpdGggaW52YWxpZCBpZCAiCi0gICAgICAgICAgICA8PCBkZXZpY2VOYW1lOwotICAgIH0KLX0KLQotVEVTVF9GKENhbWVyYU1vZHVsZVRlc3QsIEdldENhbWVyYUluZm8pIHsKLQotICAgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfSU5JVDsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bWJlck9mQ2FtZXJhczsgKytpKSB7Ci0gICAgICAgIHN0cnVjdCBjYW1lcmFfaW5mbyBpbmZvOwotICAgICAgICBBU1NFUlRfRVEoT0ssIG1Nb2R1bGUtPmdldENhbWVyYUluZm8oaSwgJmluZm8pKTsKLSAgICB9Ci0KLX0KLQotVEVTVF9GKENhbWVyYU1vZHVsZVRlc3QsIEdldENhbWVyYUluZm9CYWRJbmRpY2VzKSB7Ci0KLSAgICBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX0lOSVQ7Ci0KLSAgICBpbnQgaWR4W10gPSB7IC0xLCBtTnVtYmVyT2ZDYW1lcmFzLCBtTnVtYmVyT2ZDYW1lcmFzICsgMSB9OwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplb2YoaWR4KS9zaXplb2YoaWR4WzBdKTsgKytpKSB7Ci0gICAgICAgIHN0cnVjdCBjYW1lcmFfaW5mbyBpbmZvOwotICAgICAgICBFWFBFQ1RfTkUoT0ssIG1Nb2R1bGUtPmdldENhbWVyYUluZm8oaWR4W2ldLCAmaW5mbykpOwotICAgICAgICBFWFBFQ1RfRVEoLUVJTlZBTCwgbU1vZHVsZS0+Z2V0Q2FtZXJhSW5mbyhpZHhbaV0sICZpbmZvKSkKLSAgICAgICAgICAgIDw8ICJJbmNvcnJlY3QgZXJyb3IgY29kZSBmb3IgZ2V0X2NhbWVyYV9pbmZvIGlkeD0gIgotICAgICAgICAgICAgPDwgaWR4W2ldOwotICAgIH0KLX0KLQotLyoqCi0gKiBUT0RPOiBBZGRpdGlvbmFsIHRlc3QgdG8gYWRkOiBvcGVuIHR3byBjYW1lcmFzIGF0IG9uY2UuCi0gKiAgICAgICAoaXMgYWxsb3dlZCB0byBmYWlsLCBhdCBsZWFzdCBmb3Igbm93LCBidXQgc2hvdWxkIG5vdCBibG93IHVwKQotICogICAgIC0gb3BlbiBzYW1lIGRldmljZSBtdWx0aXBsZSB0aW1lcwotICogICAgIC0gY2xvc2Ugc2FtZSBkZXZpY2UgbXVsdGlwbGUgdGltZXMKLSAqLwotCi0KLQotCi19Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEyL0NhbWVyYU11bHRpU3RyZWFtVGVzdHMuY3BwIGIvdGVzdHMvY2FtZXJhMi9DYW1lcmFNdWx0aVN0cmVhbVRlc3RzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRhZWFiNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9jYW1lcmEyL0NhbWVyYU11bHRpU3RyZWFtVGVzdHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhTXVsdGlTdHJlYW1UZXN0IgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2luY2x1ZGUgIkNhbWVyYVN0cmVhbUZpeHR1cmUuaCIKLSNpbmNsdWRlICJUZXN0RXh0ZW5zaW9ucy5oIgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+Ci0jaW5jbHVkZSA8Y29tbW9uL0NhbWVyYURldmljZUJhc2UuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYTIuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZUNvbXBvc2VyQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KLQotI2RlZmluZSBERUZBVUxUX0ZSQU1FX0RVUkFUSU9OIDMzMDAwMDAwTEwgLy8gMzNtcwotI2RlZmluZSBDQU1FUkFfSEVBUF9DT1VOVCAgICAgICAxCi0jZGVmaW5lIENBTUVSQV9FWFBPU1VSRV9GT1JNQVQgQ0FNRVJBX1NUUkVBTV9BVVRPX0NQVV9GT1JNQVQKLSNkZWZpbmUgQ0FNRVJBX0RJU1BMQVlfRk9STUFUIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRAotI2RlZmluZSBDQU1FUkFfTVVMVElfU1RSRUFNX0RFQlVHR0lORyAgMAotI2RlZmluZSBDQU1FUkFfRlJBTUVfVElNRU9VVCAgICAxMDAwMDAwMDAwTEwgLy8gbnNlY3MgKDEgc2VjcykKLSNkZWZpbmUgUFJFVklFV19SRU5ERVJJTkdfVElNRV9JTlRFUlZBTCAyMDAwMDAgLy8gaW4gdW5pdCBvZiB1cywgMjAwbXMKLS8vIDElIHRvbGVyYW5jZSBtYXJnaW4gZm9yIGV4cG9zdXJlIHNhbml0eSBjaGVjayBhZ2FpbnN0IG1ldGFkYXRhCi0jZGVmaW5lIFRPTEVSQU5DRV9NQVJHSU5fTUVUQURBVEEgMC4wMQotLy8gNSUgdG9sZXJhbmNlIG1hcmdpbiBmb3IgZXhwb3N1cmUgc2FuaXR5IGNoZWNrIGFnYWluc3QgY2FwdHVyZSB0aW1lcwotI2RlZmluZSBUT0xFUkFOQ0VfTUFSR0lOX0NBUFRVUkUgMC4wNQotLyogY29uc3RhbnRzIGZvciBkaXNwbGF5ICovCi0jZGVmaW5lIERJU1BMQVlfQlVGRkVSX0hFSUdIVCAxMDI0Ci0jZGVmaW5lIERJU1BMQVlfQlVGRkVSX1dJRFRIIDEwMjQKLSNkZWZpbmUgRElTUExBWV9CVUZGRVJfRk9STUFUIFBJWEVMX0ZPUk1BVF9SR0JfODg4Ci0KLS8vIFRoaXMgdGVzdCBpbnRlbmRzIHRvIHRlc3QgbGFyZ2UgcHJldmlldyBzaXplIGJ1dCBsZXNzIHRoYW4gMTA4MHAuCi0jZGVmaW5lIFBSRVZJRVdfV0lEVEhfQ0FQICAgMTkyMAotI2RlZmluZSBQUkVWSUVXX0hFSUdIVF9DQVAgIDEwODAKLS8vIFRoaXMgdGVzdCBpbnRlbmRzIHRvIHRlc3Qgc21hbGwgbWV0ZXJpbmcgYnVyc3Qgc2l6ZSB0aGF0IGlzIGxlc3MgdGhhbiA2NDB4NDgwCi0jZGVmaW5lIE1FVEVSSU5HX1dJRFRIX0NBUCAgNjQwCi0jZGVmaW5lIE1FVEVSSU5HX0hFSUdIVF9DQVAgNDgwCi0KLSNkZWZpbmUgRVhQX1dBSVRfTVVMVElQTElFUiAyCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBjYW1lcmEyIHsKLW5hbWVzcGFjZSB0ZXN0cyB7Ci0KLXN0YXRpYyBjb25zdCBDYW1lcmFTdHJlYW1QYXJhbXMgREVGQVVMVF9TVFJFQU1fUEFSQU1FVEVSUyA9IHsKLSAgICAvKm1Gb3JtYXQqLyAgICAgQ0FNRVJBX0VYUE9TVVJFX0ZPUk1BVCwKLSAgICAvKm1IZWFwQ291bnQqLyAgQ0FNRVJBX0hFQVBfQ09VTlQKLX07Ci0KLXN0YXRpYyBjb25zdCBDYW1lcmFTdHJlYW1QYXJhbXMgRElTUExBWV9TVFJFQU1fUEFSQU1FVEVSUyA9IHsKLSAgICAvKm1Gb3JtYXQqLyAgICAgQ0FNRVJBX0RJU1BMQVlfRk9STUFULAotICAgIC8qbUhlYXBDb3VudCovICBDQU1FUkFfSEVBUF9DT1VOVAotfTsKLQotY2xhc3MgQ2FtZXJhTXVsdGlTdHJlYW1UZXN0Ci0gICAgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0LAotICAgICAgcHVibGljIENhbWVyYVN0cmVhbUZpeHR1cmUgewotCi1wdWJsaWM6Ci0gICAgQ2FtZXJhTXVsdGlTdHJlYW1UZXN0KCkgOiBDYW1lcmFTdHJlYW1GaXh0dXJlKERFRkFVTFRfU1RSRUFNX1BBUkFNRVRFUlMpIHsKLSAgICAgICAgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19DT05TVFJVQ1RPUjsKLQotICAgICAgICBpZiAoSGFzRmF0YWxGYWlsdXJlKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogRG9uJ3QgY3JlYXRlIGRlZmF1bHQgc3RyZWFtLCBlYWNoIHRlc3QgaXMgaW4gY2hhcmdlIG9mIGNyZWF0aW5nCi0gICAgICAgICAqIGl0cyBvd24gc3RyZWFtcy4KLSAgICAgICAgICovCi0gICAgfQotCi0gICAgfkNhbWVyYU11bHRpU3RyZWFtVGVzdCgpIHsKLSAgICAgICAgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19ERVNUUlVDVE9SOwotICAgIH0KLQotICAgIHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4gbUNvbXBvc2VyQ2xpZW50OwotICAgIHNwPFN1cmZhY2VDb250cm9sPiBtU3VyZmFjZUNvbnRyb2w7Ci0KLSAgICB2b2lkIENyZWF0ZU9uU2NyZWVuU3VyZmFjZShzcDxTdXJmYWNlPiYgc3VyZmFjZSkgewotICAgICAgICBtQ29tcG9zZXJDbGllbnQgPSBuZXcgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OwotICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1Db21wb3NlckNsaWVudC0+aW5pdENoZWNrKCkpOwotCi0gICAgICAgIG1TdXJmYWNlQ29udHJvbCA9IG1Db21wb3NlckNsaWVudC0+Y3JlYXRlU3VyZmFjZSgKLSAgICAgICAgICAgICAgICBTdHJpbmc4KCJDYW1lcmFNdWx0aVN0cmVhbVRlc3QgU3RyZWFtaW5nSW1hZ2UgU3VyZmFjZSIpLAotICAgICAgICAgICAgICAgIERJU1BMQVlfQlVGRkVSX0hFSUdIVCwgRElTUExBWV9CVUZGRVJfV0lEVEgsCi0gICAgICAgICAgICAgICAgRElTUExBWV9CVUZGRVJfRk9STUFULCAwKTsKLQotICAgICAgICBBU1NFUlRfTkUoKHZvaWQqKU5VTEwsIG1TdXJmYWNlQ29udHJvbC5nZXQoKSk7Ci0gICAgICAgIEFTU0VSVF9UUlVFKG1TdXJmYWNlQ29udHJvbC0+aXNWYWxpZCgpKTsKLQotICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6Om9wZW5HbG9iYWxUcmFuc2FjdGlvbigpOwotICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1TdXJmYWNlQ29udHJvbC0+c2V0TGF5ZXIoMHg3RkZGRkZGRikpOwotICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1TdXJmYWNlQ29udHJvbC0+c2hvdygpKTsKLSAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpjbG9zZUdsb2JhbFRyYW5zYWN0aW9uKCk7Ci0KLSAgICAgICAgc3VyZmFjZSA9IG1TdXJmYWNlQ29udHJvbC0+Z2V0U3VyZmFjZSgpOwotCi0gICAgICAgIEFTU0VSVF9ORSgodm9pZCopTlVMTCwgc3VyZmFjZS5nZXQoKSk7Ci0gICAgfQotCi0gICAgc3RydWN0IFNpemUgewotICAgICAgICBpbnQzMl90IHdpZHRoOwotICAgICAgICBpbnQzMl90IGhlaWdodDsKLSAgICB9OwotCi0gICAgLy8gU2VsZWN0IG1pbmltYWwgc2l6ZSBieSBudW1iZXIgb2YgcGl4ZWxzLgotICAgIHZvaWQgR2V0TWluU2l6ZShjb25zdCBpbnQzMl90KiBkYXRhLCBzaXplX3QgY291bnQsCi0gICAgICAgICAgICBTaXplKiBtaW4sIGludDMyX3QqIGlkeCkgewotICAgICAgICBBU1NFUlRfTkUoKGludDMyX3QqKU5VTEwsIGRhdGEpOwotICAgICAgICBpbnQzMl90IG1pbklkeCA9IDA7Ci0gICAgICAgIGludDMyX3QgbWluU2l6ZSA9IElOVF9NQVgsIHRlbXBTaXplOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKz0yKSB7Ci0gICAgICAgICAgICB0ZW1wU2l6ZSA9IGRhdGFbaV0gKiBkYXRhW2krMV07Ci0gICAgICAgICAgICBpZiAobWluU2l6ZSA+IHRlbXBTaXplKSB7Ci0gICAgICAgICAgICAgICAgbWluU2l6ZSA9IHRlbXBTaXplOwotICAgICAgICAgICAgICAgIG1pbklkeCA9IGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbWluLT53aWR0aCA9IGRhdGFbbWluSWR4XTsKLSAgICAgICAgbWluLT5oZWlnaHQgPSBkYXRhW21pbklkeCArIDFdOwotICAgICAgICAqaWR4ID0gbWluSWR4OwotICAgIH0KLQotICAgIC8vIFNlbGVjdCBtYXhpbWFsIHNpemUgYnkgbnVtYmVyIG9mIHBpeGVscy4KLSAgICB2b2lkIEdldE1heFNpemUoY29uc3QgaW50MzJfdCogZGF0YSwgc2l6ZV90IGNvdW50LAotICAgICAgICAgICAgU2l6ZSogbWF4LCBpbnQzMl90KiBpZHgpIHsKLSAgICAgICAgQVNTRVJUX05FKChpbnQzMl90KilOVUxMLCBkYXRhKTsKLSAgICAgICAgaW50MzJfdCBtYXhJZHggPSAwOwotICAgICAgICBpbnQzMl90IG1heFNpemUgPSBJTlRfTUlOLCB0ZW1wU2l6ZTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSs9MikgewotICAgICAgICAgICAgdGVtcFNpemUgPSBkYXRhW2ldICogZGF0YVtpKzFdOwotICAgICAgICAgICAgaWYgKG1heFNpemUgPCB0ZW1wU2l6ZSkgewotICAgICAgICAgICAgICAgIG1heFNpemUgPSB0ZW1wU2l6ZTsKLSAgICAgICAgICAgICAgICBtYXhJZHggPSBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1heC0+d2lkdGggPSBkYXRhW21heElkeF07Ci0gICAgICAgIG1heC0+aGVpZ2h0ID0gZGF0YVttYXhJZHggKyAxXTsKLSAgICAgICAgKmlkeCA9IG1heElkeDsKLSAgICB9Ci0KLSAgICAvLyBDYXAgc2l6ZSBieSBudW1iZXIgb2YgcGl4ZWxzLgotICAgIFNpemUgQ2FwU2l6ZShTaXplIGNhcCwgU2l6ZSBpbnB1dCkgewotICAgICAgICBpZiAoaW5wdXQud2lkdGggKiBpbnB1dC5oZWlnaHQgPiBjYXAud2lkdGggKiBjYXAuaGVpZ2h0KSB7Ci0gICAgICAgICAgICByZXR1cm4gY2FwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbnB1dDsKLSAgICB9Ci0KLSAgICBzdHJ1Y3QgQ2FtZXJhU3RyZWFtIDogcHVibGljIFJlZkJhc2UgewotCi0gICAgcHVibGljOgotICAgICAgICAvKioKLSAgICAgICAgICogT25seSBpbml0aWFsaXplIHRoZSB2YXJpYWJsZXMgaGVyZSwgZG8gdGhlIEFTU0VSVCBjaGVjayBpbgotICAgICAgICAgKiBTZXRVcCBmdW5jdGlvbi4gVG8gbWFrZSB0aGlzIHN0cmVhbSB1c2VmdWwsIHRoZSBTZXRVcCBtdXN0Ci0gICAgICAgICAqIGJlIGNhbGxlZCBiZWZvcmUgdXNpbmcgaXQuCi0gICAgICAgICAqLwotICAgICAgICBDYW1lcmFTdHJlYW0oCi0gICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4mIGRldmljZSwKLSAgICAgICAgICAgICAgICBDYW1lcmFTdHJlYW1QYXJhbXMgcGFyYW0sIHNwPFN1cmZhY2U+IHN1cmZhY2UsCi0gICAgICAgICAgICAgICAgYm9vbCB1c2VDcHVDb25zdW1lcikKLSAgICAgICAgICAgIDogbURldmljZShkZXZpY2UpLAotICAgICAgICAgICAgICBtV2lkdGgod2lkdGgpLAotICAgICAgICAgICAgICBtSGVpZ2h0KGhlaWdodCkgewotICAgICAgICAgICAgbUZvcm1hdCA9IHBhcmFtLm1Gb3JtYXQ7Ci0gICAgICAgICAgICBpZiAodXNlQ3B1Q29uc3VtZXIpIHsKLSAgICAgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBwcm9kdWNlcjsKLSAgICAgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lcjsKLSAgICAgICAgICAgICAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJnByb2R1Y2VyLCAmY29uc3VtZXIpOwotICAgICAgICAgICAgICAgIG1DcHVDb25zdW1lciA9IG5ldyBDcHVDb25zdW1lcihjb25zdW1lciwgcGFyYW0ubUhlYXBDb3VudCk7Ci0gICAgICAgICAgICAgICAgbUNwdUNvbnN1bWVyLT5zZXROYW1lKFN0cmluZzgoCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhTXVsdGlTdHJlYW1UZXN0OjptQ3B1Q29uc3VtZXIiKSk7Ci0gICAgICAgICAgICAgICAgbVN1cmZhY2UgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFJlbmRlciB0aGUgc3RyZWFtIHRvIHNjcmVlbi4KLSAgICAgICAgICAgICAgICBtQ3B1Q29uc3VtZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIG1TdXJmYWNlID0gc3VyZmFjZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUZyYW1lTGlzdGVuZXIgPSBuZXcgRnJhbWVMaXN0ZW5lcigpOwotICAgICAgICAgICAgaWYgKG1DcHVDb25zdW1lciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbUNwdUNvbnN1bWVyLT5zZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKG1GcmFtZUxpc3RlbmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGaW5hbGx5IGNyZWF0ZSBjYW1lcmEgc3RyZWFtLCBhbmQgZG8gdGhlIEFTU0VSVCBjaGVjaywgc2luY2Ugd2UKLSAgICAgICAgICogY2FuIG5vdCBkbyBpdCBpbiBjdG9yLgotICAgICAgICAgKi8KLSAgICAgICAgdm9pZCBTZXRVcCgpIHsKLSAgICAgICAgICAgIEFTU0VSVF9FUShPSywKLSAgICAgICAgICAgICAgICBtRGV2aWNlLT5jcmVhdGVTdHJlYW0obVN1cmZhY2UsCi0gICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCwgbUZvcm1hdCwgSEFMX0RBVEFTUEFDRV9VTktOT1dOLAotICAgICAgICAgICAgICAgICAgICBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wLCAmbVN0cmVhbUlkKSk7Ci0KLSAgICAgICAgICAgIEFTU0VSVF9ORSgtMSwgbVN0cmVhbUlkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBHZXRTdHJlYW1JZCgpIHsgcmV0dXJuIG1TdHJlYW1JZDsgfQotICAgICAgICBzcDxDcHVDb25zdW1lcj4gR2V0Q29uc3VtZXIoKSB7IHJldHVybiBtQ3B1Q29uc3VtZXI7IH0KLSAgICAgICAgc3A8RnJhbWVMaXN0ZW5lcj4gR2V0RnJhbWVMaXN0ZW5lcigpIHsgcmV0dXJuIG1GcmFtZUxpc3RlbmVyOyB9Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIH5DYW1lcmFTdHJlYW0oKSB7Ci0gICAgICAgICAgICBpZiAobURldmljZS5nZXQoKSkgewotICAgICAgICAgICAgICAgIG1EZXZpY2UtPndhaXRVbnRpbERyYWluZWQoKTsKLSAgICAgICAgICAgICAgICBtRGV2aWNlLT5kZWxldGVTdHJlYW0obVN0cmVhbUlkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIENsZWFyIHByb2R1Y2VyIGJlZm9yZSBjb25zdW1lci4KLSAgICAgICAgICAgIG1TdXJmYWNlLmNsZWFyKCk7Ci0gICAgICAgICAgICBtQ3B1Q29uc3VtZXIuY2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgc3A8RnJhbWVMaXN0ZW5lcj4gICAgICAgbUZyYW1lTGlzdGVuZXI7Ci0gICAgICAgIHNwPENwdUNvbnN1bWVyPiAgICAgICAgIG1DcHVDb25zdW1lcjsKLSAgICAgICAgc3A8U3VyZmFjZT4gICAgICAgICAgICAgbVN1cmZhY2U7Ci0gICAgICAgIHNwPENhbWVyYURldmljZUJhc2U+ICAgIG1EZXZpY2U7Ci0gICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1JZDsKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbVdpZHRoOwotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtSGVpZ2h0OwotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0OwotICAgIH07Ci0KLSAgICBpbnQ2NF90IEdldEV4cG9zdXJlVmFsdWUoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFEYXRhKSB7Ci0gICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5ID0KLSAgICAgICAgICAgICAgICBtZXRhRGF0YS5maW5kKEFORFJPSURfU0VOU09SX0VYUE9TVVJFX1RJTUUpOwotICAgICAgICBFWFBFQ1RfRVEoMXUsIGVudHJ5LmNvdW50KTsKLSAgICAgICAgaWYgKGVudHJ5LmNvdW50ID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBlbnRyeS5kYXRhLmk2NFswXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaW50MzJfdCBHZXRTZW5zaXRpdml0eShjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YURhdGEpIHsKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnkgPQotICAgICAgICAgICAgICAgIG1ldGFEYXRhLmZpbmQoQU5EUk9JRF9TRU5TT1JfU0VOU0lUSVZJVFkpOwotICAgICAgICBFWFBFQ1RfRVEoMXUsIGVudHJ5LmNvdW50KTsKLSAgICAgICAgaWYgKGVudHJ5LmNvdW50ID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBlbnRyeS5kYXRhLmkzMlswXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaW50NjRfdCBHZXRGcmFtZUR1cmF0aW9uKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhRGF0YSkgewotICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeSA9Ci0gICAgICAgICAgICAgICAgbWV0YURhdGEuZmluZChBTkRST0lEX1NFTlNPUl9GUkFNRV9EVVJBVElPTik7Ci0gICAgICAgIEVYUEVDVF9FUSgxdSwgZW50cnkuY291bnQpOwotICAgICAgICBpZiAoZW50cnkuY291bnQgPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmRhdGEuaTY0WzBdOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICB2b2lkIENyZWF0ZVJlcXVlc3RzKENhbWVyYU1ldGFkYXRhJiBwcmV2aWV3UmVxdWVzdCwKLSAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhJiBtZXRlcmluZ1JlcXVlc3QsCi0gICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSYgY2FwdHVyZVJlcXVlc3QsCi0gICAgICAgICAgICBpbnQgcHJldmlld1N0cmVhbUlkLAotICAgICAgICAgICAgaW50IG1ldGVyaW5nU3RyZWFtSWQsCi0gICAgICAgICAgICBpbnQgY2FwdHVyZVN0cmVhbUlkKSB7Ci0gICAgICAgIGludDMyX3QgcmVxdWVzdElkID0gMDsKLSAgICAgICAgVmVjdG9yPGludDMyX3Q+IHByZXZpZXdTdHJlYW1JZHM7Ci0gICAgICAgIHByZXZpZXdTdHJlYW1JZHMucHVzaChwcmV2aWV3U3RyZWFtSWQpOwotICAgICAgICBBU1NFUlRfRVEoT0ssIG1EZXZpY2UtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KENBTUVSQTJfVEVNUExBVEVfUFJFVklFVywKLSAgICAgICAgICAgICAgICAmcHJldmlld1JlcXVlc3QpKTsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCBwcmV2aWV3UmVxdWVzdC51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX09VVFBVVF9TVFJFQU1TLAotICAgICAgICAgICAgICAgIHByZXZpZXdTdHJlYW1JZHMpKTsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCBwcmV2aWV3UmVxdWVzdC51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0lELAotICAgICAgICAgICAgICAgICZyZXF1ZXN0SWQsIDEpKTsKLQotICAgICAgICAvLyBDcmVhdGUgbWV0ZXJpbmcgcmVxdWVzdCwgbWFudWFsIHNldHRpbmdzCi0gICAgICAgIC8vIE1hbnVhbCBjb250cm9sOiBEaXNhYmxlIDNBLCBub2lzZSByZWR1Y3Rpb24sIGVkZ2Ugc2hhcnBpbmcKLSAgICAgICAgdWludDhfdCBjbU9mZiA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KEFORFJPSURfQ09OVFJPTF9NT0RFX09GRik7Ci0gICAgICAgIHVpbnQ4X3QgbnJPZmYgPSBzdGF0aWNfY2FzdDx1aW50OF90PihBTkRST0lEX05PSVNFX1JFRFVDVElPTl9NT0RFX09GRik7Ci0gICAgICAgIHVpbnQ4X3Qgc2hhcnBPZmYgPSBzdGF0aWNfY2FzdDx1aW50OF90PihBTkRST0lEX0VER0VfTU9ERV9PRkYpOwotICAgICAgICBWZWN0b3I8aW50MzJfdD4gbWV0ZXJpbmdTdHJlYW1JZHM7Ci0gICAgICAgIG1ldGVyaW5nU3RyZWFtSWRzLnB1c2gobWV0ZXJpbmdTdHJlYW1JZCk7Ci0gICAgICAgIEFTU0VSVF9FUShPSywgbURldmljZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoCi0gICAgICAgICAgICAgICAgQ0FNRVJBMl9URU1QTEFURV9QUkVWSUVXLAotICAgICAgICAgICAgICAgICZtZXRlcmluZ1JlcXVlc3QpKTsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCBtZXRlcmluZ1JlcXVlc3QudXBkYXRlKAotICAgICAgICAgICAgICAgIEFORFJPSURfUkVRVUVTVF9PVVRQVVRfU1RSRUFNUywKLSAgICAgICAgICAgICAgICBtZXRlcmluZ1N0cmVhbUlkcykpOwotICAgICAgICBBU1NFUlRfRVEoT0ssIG1ldGVyaW5nUmVxdWVzdC51cGRhdGUoCi0gICAgICAgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX01PREUsCi0gICAgICAgICAgICAgICAgJmNtT2ZmLCAxKSk7Ci0gICAgICAgIEFTU0VSVF9FUShPSywgbWV0ZXJpbmdSZXF1ZXN0LnVwZGF0ZSgKLSAgICAgICAgICAgICAgICBBTkRST0lEX05PSVNFX1JFRFVDVElPTl9NT0RFLAotICAgICAgICAgICAgICAgICZuck9mZiwgMSkpOwotICAgICAgICBBU1NFUlRfRVEoT0ssIG1ldGVyaW5nUmVxdWVzdC51cGRhdGUoCi0gICAgICAgICAgICAgICAgQU5EUk9JRF9FREdFX01PREUsCi0gICAgICAgICAgICAgICAgJnNoYXJwT2ZmLCAxKSk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGNhcHR1cmUgcmVxdWVzdCwgbWFudWFsIHNldHRpbmdzCi0gICAgICAgIFZlY3RvcjxpbnQzMl90PiBjYXB0dXJlU3RyZWFtSWRzOwotICAgICAgICBjYXB0dXJlU3RyZWFtSWRzLnB1c2goY2FwdHVyZVN0cmVhbUlkKTsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCBtRGV2aWNlLT5jcmVhdGVEZWZhdWx0UmVxdWVzdCgKLSAgICAgICAgICAgICAgICBDQU1FUkEyX1RFTVBMQVRFX1BSRVZJRVcsCi0gICAgICAgICAgICAgICAgJmNhcHR1cmVSZXF1ZXN0KSk7Ci0gICAgICAgIEFTU0VSVF9FUShPSywgY2FwdHVyZVJlcXVlc3QudXBkYXRlKAotICAgICAgICAgICAgICAgIEFORFJPSURfUkVRVUVTVF9PVVRQVVRfU1RSRUFNUywKLSAgICAgICAgICAgICAgICBjYXB0dXJlU3RyZWFtSWRzKSk7Ci0gICAgICAgIEFTU0VSVF9FUShPSywgY2FwdHVyZVJlcXVlc3QudXBkYXRlKAotICAgICAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9NT0RFLAotICAgICAgICAgICAgICAgICZjbU9mZiwgMSkpOwotICAgICAgICBBU1NFUlRfRVEoT0ssIGNhcHR1cmVSZXF1ZXN0LnVwZGF0ZSgKLSAgICAgICAgICAgICAgICBBTkRST0lEX05PSVNFX1JFRFVDVElPTl9NT0RFLAotICAgICAgICAgICAgICAgICZuck9mZiwgMSkpOwotICAgICAgICBBU1NFUlRfRVEoT0ssIGNhcHR1cmVSZXF1ZXN0LnVwZGF0ZSgKLSAgICAgICAgICAgICAgICBBTkRST0lEX0VER0VfTU9ERSwKLSAgICAgICAgICAgICAgICAmc2hhcnBPZmYsIDEpKTsKLSAgICB9Ci0KLSAgICBzcDxDYW1lcmFTdHJlYW0+IENyZWF0ZVN0cmVhbSgKLSAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiYgZGV2aWNlLAotICAgICAgICAgICAgQ2FtZXJhU3RyZWFtUGFyYW1zIHBhcmFtID0gREVGQVVMVF9TVFJFQU1fUEFSQU1FVEVSUywKLSAgICAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlID0gTlVMTCwKLSAgICAgICAgICAgIGJvb2wgdXNlQ3B1Q29uc3VtZXIgPSB0cnVlKSB7Ci0gICAgICAgIHBhcmFtLm1Gb3JtYXQgPSBNYXBBdXRvRm9ybWF0KHBhcmFtLm1Gb3JtYXQpOwotICAgICAgICByZXR1cm4gbmV3IENhbWVyYVN0cmVhbSh3aWR0aCwgaGVpZ2h0LCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgcGFyYW0sIHN1cmZhY2UsIHVzZUNwdUNvbnN1bWVyKTsKLSAgICB9Ci0KLSAgICB2b2lkIENhcHR1cmVCdXJzdChDYW1lcmFNZXRhZGF0YSYgcmVxdWVzdCwgc2l6ZV90IHJlcXVlc3RDb3VudCwKLSAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxpbnQ2NF90PiYgZXhwb3N1cmVzLAotICAgICAgICAgICAgY29uc3QgVmVjdG9yPGludDMyX3Q+JiBzZW5zaXRpdml0aWVzLAotICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhU3RyZWFtPiYgc3RyZWFtLAotICAgICAgICAgICAgaW50NjRfdCBtaW5GcmFtZUR1cmF0aW9uLAotICAgICAgICAgICAgaW50MzJfdCogcmVxdWVzdElkU3RhcnQpIHsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCByZXF1ZXN0LnVwZGF0ZShBTkRST0lEX1NFTlNPUl9GUkFNRV9EVVJBVElPTiwKLSAgICAgICAgICAgICAgICAmbWluRnJhbWVEdXJhdGlvbiwgMSkpOwotICAgICAgICAvLyBTdWJtaXQgYSBzZXJpZXMgb2YgcmVxdWVzdHMgd2l0aCB0aGUgc3BlY2lmaWVkIGV4cG9zdXJlL2dhaW4gdmFsdWVzLgotICAgICAgICBpbnQzMl90IHRhcmdldFJlcXVlc3RJZCA9ICpyZXF1ZXN0SWRTdGFydDsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXF1ZXN0Q291bnQ7IGkrKykgewotICAgICAgICAgICAgQVNTRVJUX0VRKE9LLCByZXF1ZXN0LnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfSUQsIHJlcXVlc3RJZFN0YXJ0LCAxKSk7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoT0ssIHJlcXVlc3QudXBkYXRlKEFORFJPSURfU0VOU09SX0VYUE9TVVJFX1RJTUUsICZleHBvc3VyZXNbaV0sIDEpKTsKLSAgICAgICAgICAgIEFTU0VSVF9FUShPSywgcmVxdWVzdC51cGRhdGUoQU5EUk9JRF9TRU5TT1JfU0VOU0lUSVZJVFksICZzZW5zaXRpdml0aWVzW2ldLCAxKSk7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoT0ssIG1EZXZpY2UtPmNhcHR1cmUocmVxdWVzdCkpOwotICAgICAgICAgICAgQUxPR1YoIlN1Ym1pdHRpbmcgcmVxdWVzdCB3aXRoOiBpZCAlZCB3aXRoIGV4cG9zdXJlICUiIFBSSWQ2NCAiLCBzZW5zaXRpdml0eSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICpyZXF1ZXN0SWRTdGFydCwgZXhwb3N1cmVzW2ldLCBzZW5zaXRpdml0aWVzW2ldKTsKLSAgICAgICAgICAgIGlmIChDQU1FUkFfTVVMVElfU1RSRUFNX0RFQlVHR0lORykgewotICAgICAgICAgICAgICAgIHJlcXVlc3QuZHVtcChTVERPVVRfRklMRU5PKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICgqcmVxdWVzdElkU3RhcnQpKys7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gR2V0IGNhcHR1cmUgYnVyc3QgcmVzdWx0cy4KLSAgICAgICAgVmVjdG9yPG5zZWNzX3Q+IGNhcHR1cmVCdXJzdFRpbWVzOwotICAgICAgICBzcDxDcHVDb25zdW1lcj4gY29uc3VtZXIgPSBzdHJlYW0tPkdldENvbnN1bWVyKCk7Ci0gICAgICAgIHNwPEZyYW1lTGlzdGVuZXI+IGxpc3RlbmVyID0gc3RyZWFtLT5HZXRGcmFtZUxpc3RlbmVyKCk7Ci0KLSAgICAgICAgLy8gU2V0IHdhaXQgbGltaXQgYmFzZWQgb24gZXhwZWN0ZWQgZnJhbWUgZHVyYXRpb24uCi0gICAgICAgIGludDY0X3Qgd2FpdExpbWl0ID0gQ0FNRVJBX0ZSQU1FX1RJTUVPVVQ7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVxdWVzdENvdW50OyBpKyspIHsKLSAgICAgICAgICAgIEFMT0dWKCJSZWFkaW5nIHJlcXVlc3QgcmVzdWx0ICV6dSIsIGkpOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFJhaXNlIHRoZSB0aW1lb3V0IHRvIGJlIGF0IGxlYXN0IHR3aWNlIGFzIGxvbmcgYXMgdGhlIGV4cG9zdXJlCi0gICAgICAgICAgICAgKiB0aW1lLiB0byBhdm9pZCBhIGZhbHNlIHBvc2l0aXZlIHdoZW4gdGhlIHRpbWVvdXQgaXMgdG9vIHNob3J0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoKGV4cG9zdXJlc1tpXSAqIEVYUF9XQUlUX01VTFRJUExJRVIpID4gd2FpdExpbWl0KSB7Ci0gICAgICAgICAgICAgICAgd2FpdExpbWl0ID0gZXhwb3N1cmVzW2ldICogRVhQX1dBSVRfTVVMVElQTElFUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdCByZXN1bHQ7Ci0gICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBmcmFtZU1ldGFkYXRhOwotICAgICAgICAgICAgaW50MzJfdCByZXN1bHRSZXF1ZXN0SWQ7Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX0VRKE9LLCBtRGV2aWNlLT53YWl0Rm9yTmV4dEZyYW1lKHdhaXRMaW1pdCkpOwotICAgICAgICAgICAgICAgIEFTU0VSVF9FUShPSywgbURldmljZS0+Z2V0TmV4dFJlc3VsdCgmcmVzdWx0KSk7Ci0gICAgICAgICAgICAgICAgZnJhbWVNZXRhZGF0YSA9IHJlc3VsdC5tTWV0YWRhdGE7Ci0KLSAgICAgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCByZXN1bHRFbnRyeSA9IGZyYW1lTWV0YWRhdGEuZmluZChBTkRST0lEX1JFUVVFU1RfSUQpOwotICAgICAgICAgICAgICAgIEFTU0VSVF9FUSgxdSwgcmVzdWx0RW50cnkuY291bnQpOwotICAgICAgICAgICAgICAgIHJlc3VsdFJlcXVlc3RJZCA9IHJlc3VsdEVudHJ5LmRhdGEuaTMyWzBdOwotICAgICAgICAgICAgICAgIGlmIChDQU1FUkFfTVVMVElfU1RSRUFNX0RFQlVHR0lORykgewotICAgICAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgImNhcHR1cmUgcmVzdWx0IHJlcSBpZDogIiA8PCByZXN1bHRSZXF1ZXN0SWQgPDwgc3RkOjplbmRsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gd2hpbGUgKHJlc3VsdFJlcXVlc3RJZCAhPSB0YXJnZXRSZXF1ZXN0SWQpOwotICAgICAgICAgICAgdGFyZ2V0UmVxdWVzdElkKys7Ci0gICAgICAgICAgICBBTE9HVigiR290IGNhcHR1cmUgYnVyc3QgcmVzdWx0IGZvciByZXF1ZXN0ICV6dSIsIGkpOwotCi0gICAgICAgICAgICAvLyBWYWxpZGF0ZSBjYXB0dXJlIHJlc3VsdAotICAgICAgICAgICAgaWYgKENBTUVSQV9NVUxUSV9TVFJFQU1fREVCVUdHSU5HKSB7Ci0gICAgICAgICAgICAgICAgZnJhbWVNZXRhZGF0YS5kdW1wKFNURE9VVF9GSUxFTk8pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBUT0RPOiBOZWVkIHJldmlzaXQgaXQgdG8gZmlndXJlIG91dCBhbiBhY2N1cmF0ZSBtYXJnaW4uCi0gICAgICAgICAgICBpbnQ2NF90IHJlc3VsdEV4cG9zdXJlID0gR2V0RXhwb3N1cmVWYWx1ZShmcmFtZU1ldGFkYXRhKTsKLSAgICAgICAgICAgIGludDMyX3QgcmVzdWx0U2Vuc2l0aXZpdHkgPSBHZXRTZW5zaXRpdml0eShmcmFtZU1ldGFkYXRhKTsKLSAgICAgICAgICAgIEVYUEVDVF9MRShzZW5zaXRpdml0aWVzW2ldICogKDEuMCAtIFRPTEVSQU5DRV9NQVJHSU5fTUVUQURBVEEpLCByZXN1bHRTZW5zaXRpdml0eSk7Ci0gICAgICAgICAgICBFWFBFQ1RfR0Uoc2Vuc2l0aXZpdGllc1tpXSAqICgxLjAgKyBUT0xFUkFOQ0VfTUFSR0lOX01FVEFEQVRBKSwgcmVzdWx0U2Vuc2l0aXZpdHkpOwotICAgICAgICAgICAgRVhQRUNUX0xFKGV4cG9zdXJlc1tpXSAqICgxLjAgLSBUT0xFUkFOQ0VfTUFSR0lOX01FVEFEQVRBKSwgcmVzdWx0RXhwb3N1cmUpOwotICAgICAgICAgICAgRVhQRUNUX0dFKGV4cG9zdXJlc1tpXSAqICgxLjAgKyBUT0xFUkFOQ0VfTUFSR0lOX01FVEFEQVRBKSwgcmVzdWx0RXhwb3N1cmUpOwotCi0gICAgICAgICAgICBBU1NFUlRfRVEoT0ssIGxpc3RlbmVyLT53YWl0Rm9yRnJhbWUod2FpdExpbWl0KSk7Ci0gICAgICAgICAgICBjYXB0dXJlQnVyc3RUaW1lcy5wdXNoX2JhY2soc3lzdGVtVGltZSgpKTsKLSAgICAgICAgICAgIENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXIgaW1nQnVmZmVyOwotICAgICAgICAgICAgQVNTRVJUX0VRKE9LLCBjb25zdW1lci0+bG9ja05leHRCdWZmZXIoJmltZ0J1ZmZlcikpOwotICAgICAgICAgICAgQUxPR1YoIkdvdCBjYXB0dXJlIGJ1ZmZlciBmb3IgcmVxdWVzdCAlenUiLCBpKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBUT0RPOiBWYWxpZGF0ZSBjYXB0dXJlIGJ1ZmZlci4gQ3VycmVudCBicmlnaHRuZXNzIGNhbGN1bGF0aW9uCi0gICAgICAgICAgICAgKiBpcyB0b28gc2xvdywgaXQgYWxzbyBkb2Vzbid0IGFjY291bnQgZm9yIHNhdHVyYXRpb24gZWZmZWN0cywKLSAgICAgICAgICAgICAqIHdoaWNoIGlzIHF1aXRlIGNvbW1vbiBzaW5jZSB3ZSBhcmUgZ29pbmcgb3ZlciBhIHNpZ25pZmljYW50Ci0gICAgICAgICAgICAgKiByYW5nZSBvZiBFVnMuIHdlIG5lZWQgZmlndXJlIG91dCBzb21lIHJlbGlhYmxlIHdheSB0byB2YWxpZGF0ZQotICAgICAgICAgICAgICogYnVmZmVyIGRhdGEuCi0gICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgQVNTRVJUX0VRKE9LLCBjb25zdW1lci0+dW5sb2NrQnVmZmVyKGltZ0J1ZmZlcikpOwotICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbnNlY3NfdCB0aW1lRGVsdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZUJ1cnN0VGltZXNbaV0gLSBjYXB0dXJlQnVyc3RUaW1lc1tpLTFdOwotICAgICAgICAgICAgICAgIEVYUEVDVF9HRSh0aW1lRGVsdGEgKiAoIDEgKyBUT0xFUkFOQ0VfTUFSR0lOX0NBUFRVUkUpLCBleHBvc3VyZXNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW50ZW50aW9uYWxseSBzaGFkb3cgZGVmYXVsdCBDcmVhdGVTdHJlYW0gZnVuY3Rpb24gZnJvbSBiYXNlIGNsYXNzLAotICAgICAqIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCBhbnkgdGVzdCBpbiB0aGlzIGNsYXNzIHRvIHVzZSB0aGUgZGVmYXVsdAotICAgICAqIHN0cmVhbSBjcmVhdGlvbiBmdW5jdGlvbi4KLSAgICAgKi8KLSAgICB2b2lkIENyZWF0ZVN0cmVhbSgpIHsKLSAgICB9Ci19OwotCi0vKioKLSAqIFRoaXMgdGVzdCBhZGRzIG11bHRpcGxlIHN0cmVhbSB1c2UgY2FzZSB0ZXN0LCBiYXNpY2FsbHksIHRlc3QgMwotICogc3RyZWFtczoKLSAqCi0gKiAxLiBQcmV2aWV3IHN0cmVhbSwgd2l0aCBsYXJnZSBzaXplIHRoYXQgaXMgbm8gYmlnZ2VyIHRoYW4gMTA4MHAKLSAqIHdlIHJlbmRlciB0aGlzIHN0cmVhbSB0byBkaXNwbGF5IGFuZCB2YXJ5IHRoZSBleHBvc3VyZSB0aW1lIGZvcgotICogZm9yIGNlcnRhaW4gYW1vdW50IG9mIHRpbWUgZm9yIHZpc3VhbGl6YXRpb24gcHVycG9zZS4KLSAqCi0gKiAyLiBNZXRlcmluZyBzdHJlYW0sIHdpdGggc21hbGwgc2l6ZSB0aGF0IGlzIG5vIGJpZ2dlciB0aGFuIFZHQSBzaXplLgotICogYSBidXJzdCBpcyBpc3N1ZWQgZm9yIGRpZmZlcmVudCBleHBvc3VyZSB0aW1lcyBhbmQgYW5hbG9nIGdhaW5zCi0gKiAob3IgYW5hbG9nIGdhaW4gaW1wbGVtZW50ZWQgc2Vuc2l0aXZpdGllcykgdGhlbiBjaGVjayBpZiB0aGUgY2FwdHVyZQotICogcmVzdWx0IG1ldGFkYXRhIG1hdGNoZXMgdGhlIHJlcXVlc3QuCi0gKgotICogMy4gQ2FwdHVyZSBzdHJlYW0sIHRoaXMgaXMgYmFzaWNhbGx5IHNpbWlsYXIgYXMgbWV0ZXJ0aW5nIHN0cmVhbSwgYnV0Ci0gKiBoYXMgbGFyZ2Ugc2l6ZSwgd2hpY2ggaXMgdGhlIGxhcmdlc3Qgc3VwcG9ydGVkIEpQRUcgY2FwdHVyZSBzaXplLgotICoKLSAqIFRoaXMgbXVsdGlwbGUgc3RyZWFtIHRlc3QgaXMgdG8gdGVzdCBpZiBIQUwgc3VwcG9ydHM6Ci0gKgotICogMS4gTXVsdGlwbGUgc3RyZWFtcyBsaWtlIGFib3ZlLCBIQUwgc2hvdWxkIHN1cHBvcnQgYXQgbGVhc3QgMyBzdHJlYW1zCi0gKiBjb25jdXJyZW50bHk6IG9uZSBwcmV2aWV3IHN0cmVhbSwgMiBvdGhlciBZVVYgc3RyZWFtLgotICoKLSAqIDIuIE1hbnVhbCBjb250cm9sKGdhaW4vZXhwb3N1cmUpIG9mIG11dGlwbGUgYnVyc3QgY2FwdHVyZS4KLSAqLwotLy8gRGlzYWJsZSB0aGlzIHRlc3QgZm9yIG5vdywgYXMgd2UgbmVlZCBjbGVhbnVwIHRoZSB1c2FnZSBvZiB0aGUgZGVwcmVjYXRlZCB0YWcgcXVpdGUgYSBiaXQuCi1URVNUX0YoQ2FtZXJhTXVsdGlTdHJlYW1UZXN0LCBESVNBQkxFRF9NdWx0aUJ1cnN0KSB7Ci0KLSAgICBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX0lOSVQ7Ci0KLSAgICBjb25zdCBpbnQzMl90KiBpbXBsRGVmRGF0YTsKLSAgICBzaXplX3QgaW1wbERlZkNvdW50OwotICAgIGNvbnN0IGludDMyX3QqIGpwZWdEYXRhOwotICAgIHNpemVfdCBqcGVnQ291bnQ7Ci0gICAgaWYgKGdldERldmljZVZlcnNpb24oKSA8IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7Ci0gICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBhdmFpbGFibGVQcm9jZXNzZWRTaXplcyA9Ci0gICAgICAgICAgICBHZXRTdGF0aWNFbnRyeShBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfUFJPQ0VTU0VEX1NJWkVTKTsKLSAgICAgICAgQVNTRVJUX0VRKDB1LCBhdmFpbGFibGVQcm9jZXNzZWRTaXplcy5jb3VudCAlIDIpOwotICAgICAgICBBU1NFUlRfR0UoYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMuY291bnQsIDJ1KTsKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGF2YWlsYWJsZVByb2Nlc3NlZE1pbkZyYW1lRHVyYXRpb25zID0KLSAgICAgICAgICAgIEdldFN0YXRpY0VudHJ5KEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9QUk9DRVNTRURfTUlOX0RVUkFUSU9OUyk7Ci0gICAgICAgIEVYUEVDVF9FUShhdmFpbGFibGVQcm9jZXNzZWRTaXplcy5jb3VudCwKLSAgICAgICAgICAgIGF2YWlsYWJsZVByb2Nlc3NlZE1pbkZyYW1lRHVyYXRpb25zLmNvdW50ICogMik7Ci0KLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGF2YWlsYWJsZUpwZWdTaXplcyA9Ci0gICAgICAgICAgICBHZXRTdGF0aWNFbnRyeShBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfSlBFR19TSVpFUyk7Ci0gICAgICAgIEFTU0VSVF9FUSgwdSwgYXZhaWxhYmxlSnBlZ1NpemVzLmNvdW50ICUgMik7Ci0gICAgICAgIEFTU0VSVF9HRShhdmFpbGFibGVKcGVnU2l6ZXMuY291bnQsIDJ1KTsKLSAgICAgICAgaW1wbERlZkRhdGEgPSBhdmFpbGFibGVQcm9jZXNzZWRTaXplcy5kYXRhLmkzMjsKLSAgICAgICAgaW1wbERlZkNvdW50ID0gYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMuY291bnQ7Ci0gICAgICAgIGpwZWdEYXRhID0gYXZhaWxhYmxlSnBlZ1NpemVzLmRhdGEuaTMyOwotICAgICAgICBqcGVnQ291bnQgPSBhdmFpbGFibGVKcGVnU2l6ZXMuY291bnQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZ2V0UmVzb2x1dGlvbkxpc3QoSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVELCAmaW1wbERlZkRhdGEsICZpbXBsRGVmQ291bnQpOwotICAgICAgICBBU1NFUlRfTkUoMHUsIGltcGxEZWZDb3VudCkKLSAgICAgICAgICAgIDw8ICJNaXNzaW5nIGltcGxlbWVudGF0aW9uIGRlZmluZWQgc2l6ZXMiOwotICAgICAgICBBU1NFUlRfRVEoMHUsIGltcGxEZWZDb3VudCAlIDIpOwotICAgICAgICBBU1NFUlRfR0UoaW1wbERlZkNvdW50LCAydSk7Ci0KLSAgICAgICAgZ2V0UmVzb2x1dGlvbkxpc3QoSEFMX1BJWEVMX0ZPUk1BVF9CTE9CLCAmanBlZ0RhdGEsICZqcGVnQ291bnQpOwotICAgICAgICBBU1NFUlRfRVEoMHUsIGpwZWdDb3VudCAlIDIpOwotICAgICAgICBBU1NFUlRfR0UoanBlZ0NvdW50LCAydSk7Ci0gICAgfQotCi0gICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGhhcmR3YXJlTGV2ZWwgPQotICAgICAgICBHZXRTdGF0aWNFbnRyeShBTkRST0lEX0lORk9fU1VQUE9SVEVEX0hBUkRXQVJFX0xFVkVMKTsKLSAgICBBU1NFUlRfRVEoMXUsIGhhcmR3YXJlTGV2ZWwuY291bnQpOwotICAgIHVpbnQ4X3QgbGV2ZWwgPSBoYXJkd2FyZUxldmVsLmRhdGEudThbMF07Ci0gICAgQVNTRVJUX0dFKGxldmVsLCBBTkRST0lEX0lORk9fU1VQUE9SVEVEX0hBUkRXQVJFX0xFVkVMX0xJTUlURUQpOwotICAgIEFTU0VSVF9MRShsZXZlbCwgQU5EUk9JRF9JTkZPX1NVUFBPUlRFRF9IQVJEV0FSRV9MRVZFTF9GVUxMKTsKLSAgICBpZiAobGV2ZWwgPT0gQU5EUk9JRF9JTkZPX1NVUFBPUlRFRF9IQVJEV0FSRV9MRVZFTF9MSU1JVEVEKSB7Ci0gICAgICAgIGNvbnN0IDo6dGVzdGluZzo6VGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9Ci0gICAgICAgICAgICA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5jdXJyZW50X3Rlc3RfaW5mbygpOwotICAgICAgICBzdGQ6OmNlcnIgPDwgIlNraXBwaW5nIHRlc3QgIgotICAgICAgICAgICAgICAgICAgPDwgdGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpIDw8ICIuIgotICAgICAgICAgICAgICAgICAgPDwgdGVzdF9pbmZvLT5uYW1lKCkKLSAgICAgICAgICAgICAgICAgIDw8ICIgYmVjYXVzZSBIQUwgaGFyZHdhcmUgc3VwcG9ydGVkIGxldmVsIGlzIGxpbWl0ZWQgIgotICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gRmluZCB0aGUgcmlnaHQgc2l6ZXMgZm9yIHByZXZpZXcsIG1ldGVyaW5nLCBhbmQgY2FwdHVyZSBzdHJlYW1zCi0gICAgaW50NjRfdCBtaW5GcmFtZUR1cmF0aW9uID0gREVGQVVMVF9GUkFNRV9EVVJBVElPTjsKLSAgICBTaXplIHByb2Nlc3NlZE1pblNpemUgPSB7MCwgMH0sIHByb2Nlc3NlZE1heFNpemUgPSB7MCwgMH07Ci0gICAgU2l6ZSBqcGVnTWF4U2l6ZSA9IHswLCAwfTsKLQotICAgIGludDMyX3QgbWluSWR4LCBtYXhJZHg7Ci0gICAgR2V0TWluU2l6ZShpbXBsRGVmRGF0YSwgaW1wbERlZkNvdW50LCAmcHJvY2Vzc2VkTWluU2l6ZSwgJm1pbklkeCk7Ci0gICAgR2V0TWF4U2l6ZShpbXBsRGVmRGF0YSwgaW1wbERlZkNvdW50LCAmcHJvY2Vzc2VkTWF4U2l6ZSwgJm1heElkeCk7Ci0gICAgQUxPR1YoIkZvdW5kIHByb2Nlc3NlZCBtYXggc2l6ZTogJWR4JWQsIG1pbiBzaXplID0gJWR4JWQiLAotICAgICAgICAgICAgcHJvY2Vzc2VkTWF4U2l6ZS53aWR0aCwgcHJvY2Vzc2VkTWF4U2l6ZS5oZWlnaHQsCi0gICAgICAgICAgICBwcm9jZXNzZWRNaW5TaXplLndpZHRoLCBwcm9jZXNzZWRNaW5TaXplLmhlaWdodCk7Ci0KLSAgICBpZiAoZ2V0RGV2aWNlVmVyc2lvbigpIDwgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGF2YWlsYWJsZVByb2Nlc3NlZE1pbkZyYW1lRHVyYXRpb25zID0KLSAgICAgICAgICAgIEdldFN0YXRpY0VudHJ5KEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9QUk9DRVNTRURfTUlOX0RVUkFUSU9OUyk7Ci0gICAgICAgIG1pbkZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgYXZhaWxhYmxlUHJvY2Vzc2VkTWluRnJhbWVEdXJhdGlvbnMuZGF0YS5pNjRbbWF4SWR4IC8gMl07Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbWluRnJhbWVEdXJhdGlvbiA9IGdldE1pbkZyYW1lRHVyYXRpb25Gb3IoCi0gICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVELAotICAgICAgICAgICAgICAgIHByb2Nlc3NlZE1heFNpemUud2lkdGgsIHByb2Nlc3NlZE1heFNpemUuaGVpZ2h0KTsKLSAgICB9Ci0KLSAgICBFWFBFQ1RfR1QobWluRnJhbWVEdXJhdGlvbiwgMCk7Ci0KLSAgICBpZiAobWluRnJhbWVEdXJhdGlvbiA8PSAwKSB7Ci0gICAgICAgIG1pbkZyYW1lRHVyYXRpb24gPSBERUZBVUxUX0ZSQU1FX0RVUkFUSU9OOwotICAgIH0KLQotICAgIEFMT0dWKCJ0YXJnZXRlZCBtaW5pbWFsIGZyYW1lIGR1cmF0aW9uIGlzOiAlIiBQUklkNjQgIm5zIiwgbWluRnJhbWVEdXJhdGlvbik7Ci0KLSAgICBHZXRNYXhTaXplKGpwZWdEYXRhLCBqcGVnQ291bnQsICZqcGVnTWF4U2l6ZSwgJm1heElkeCk7Ci0gICAgQUxPR1YoIkZvdW5kIEpwZWcgc2l6ZSBtYXggaWR4ID0gJWQiLCBtYXhJZHgpOwotCi0gICAgLy8gTWF4IEpwZWcgc2l6ZSBzaG91bGQgYmUgYXZhaWxhYmxlIGluIHByb2Nlc3NlZCBzaXplcy4gVXNlIGl0IGZvcgotICAgIC8vIFlVViBjYXB0dXJlIGFueXdheS4KLSAgICBFWFBFQ1RfRVEocHJvY2Vzc2VkTWF4U2l6ZS53aWR0aCwganBlZ01heFNpemUud2lkdGgpOwotICAgIEVYUEVDVF9FUShwcm9jZXNzZWRNYXhTaXplLmhlaWdodCwganBlZ01heFNpemUuaGVpZ2h0KTsKLQotICAgIC8vIENhcCBwcmV2aWV3IHNpemUuCi0gICAgU2l6ZSBwcmV2aWV3TGltaXQgPSB7IFBSRVZJRVdfV0lEVEhfQ0FQLCBQUkVWSUVXX0hFSUdIVF9DQVAgfTsKLSAgICAvLyBGSVhNRTogbmVlZCBtYWtlIHN1cmUgdGhlIHByZXZpZXdMaW1pdCBpcyBzdXBwb3J0ZWQgYnkgSEFMLgotICAgIFNpemUgcHJldmlld1NpemUgPSBDYXBTaXplKHByZXZpZXdMaW1pdCwgcHJvY2Vzc2VkTWF4U2l6ZSk7Ci0gICAgLy8gQ2FwIE1ldGVyaW5nIHNpemUuCi0gICAgU2l6ZSBtZXRlcmluZ0xpbWl0ID0geyBNRVRFUklOR19XSURUSF9DQVAsIE1FVEVSSU5HX0hFSUdIVF9DQVAgfTsKLSAgICAvLyBDYXAgbWV0ZXJpbmcgc2l6ZSB0byBWR0EgKFZHQSBpcyBtYW5kYXRvcnkgYnkgQ0REKQotICAgIFNpemUgbWV0ZXJpbmdTaXplID0gQ2FwU2l6ZShtZXRlcmluZ0xpbWl0LCBwcm9jZXNzZWRNaW5TaXplKTsKLSAgICAvLyBDYXB0dXJlIHN0cmVhbSBzaG91bGQgYmUgdGhlIG1heCBzaXplIG9mIGpwZWcgc2l6ZXMuCi0gICAgQUxPR1YoInByZXZpZXcgc2l6ZTogJWR4JWQsIG1ldGVyaW5nIHNpemU6ICVkeCVkLCBjYXB0dXJlIHNpemU6ICVkeCVkIiwKLSAgICAgICAgICAgIHByZXZpZXdTaXplLndpZHRoLCBwcmV2aWV3U2l6ZS5oZWlnaHQsCi0gICAgICAgICAgICBtZXRlcmluZ1NpemUud2lkdGgsIG1ldGVyaW5nU2l6ZS5oZWlnaHQsCi0gICAgICAgICAgICBqcGVnTWF4U2l6ZS53aWR0aCwganBlZ01heFNpemUuaGVpZ2h0KTsKLQotICAgIC8vIENyZWF0ZSBzdHJlYW1zCi0gICAgLy8gUHJldmlldyBzdHJlYW06IHNtYWxsIHJlc29sdXRpb24sIHJlbmRlciBvbiB0aGUgc2NyZWVuLgotICAgIHNwPENhbWVyYVN0cmVhbT4gcHJldmlld1N0cmVhbTsKLSAgICB7Ci0gICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2U7Ci0gICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKENyZWF0ZU9uU2NyZWVuU3VyZmFjZSgvKm91dCovc3VyZmFjZSkpOwotICAgICAgICBwcmV2aWV3U3RyZWFtID0gQ3JlYXRlU3RyZWFtKAotICAgICAgICAgICAgICAgIHByZXZpZXdTaXplLndpZHRoLAotICAgICAgICAgICAgICAgIHByZXZpZXdTaXplLmhlaWdodCwKLSAgICAgICAgICAgICAgICBtRGV2aWNlLAotICAgICAgICAgICAgICAgIERJU1BMQVlfU1RSRUFNX1BBUkFNRVRFUlMsCi0gICAgICAgICAgICAgICAgc3VyZmFjZSwKLSAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgIEFTU0VSVF9ORSgodm9pZCopTlVMTCwgcHJldmlld1N0cmVhbS5nZXQoKSk7Ci0gICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHByZXZpZXdTdHJlYW0tPlNldFVwKCkpOwotICAgIH0KLSAgICAvLyBNZXRlcmluZyBidXJzdCBzdHJlYW06IHNtYWxsIHJlc29sdXRpb24geXV2IHN0cmVhbQotICAgIHNwPENhbWVyYVN0cmVhbT4gbWV0ZXJpbmdTdHJlYW0gPQotICAgICAgICAgICAgQ3JlYXRlU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICBtZXRlcmluZ1NpemUud2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIG1ldGVyaW5nU2l6ZS5oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgIG1EZXZpY2UpOwotICAgIEFTU0VSVF9ORSgodm9pZCopTlVMTCwgbWV0ZXJpbmdTdHJlYW0uZ2V0KCkpOwotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKG1ldGVyaW5nU3RyZWFtLT5TZXRVcCgpKTsKLSAgICAvLyBDYXB0dXJlIGJ1cnN0IHN0cmVhbTogZnVsbCByZXNvbHV0aW9uIHl1diBzdHJlYW0KLSAgICBzcDxDYW1lcmFTdHJlYW0+IGNhcHR1cmVTdHJlYW0gPQotICAgICAgICAgICAgQ3JlYXRlU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICBqcGVnTWF4U2l6ZS53aWR0aCwKLSAgICAgICAgICAgICAgICAgICAganBlZ01heFNpemUuaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBtRGV2aWNlKTsKLSAgICBBU1NFUlRfTkUoKHZvaWQqKU5VTEwsIGNhcHR1cmVTdHJlYW0uZ2V0KCkpOwotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGNhcHR1cmVTdHJlYW0tPlNldFVwKCkpOwotCi0gICAgLy8gQ3JlYXRlIFByZXZpZXcgcmVxdWVzdC4KLSAgICBDYW1lcmFNZXRhZGF0YSBwcmV2aWV3UmVxdWVzdCwgbWV0ZXJpbmdSZXF1ZXN0LCBjYXB0dXJlUmVxdWVzdDsKLSAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShDcmVhdGVSZXF1ZXN0cyhwcmV2aWV3UmVxdWVzdCwgbWV0ZXJpbmdSZXF1ZXN0LAotICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QsIHByZXZpZXdTdHJlYW0tPkdldFN0cmVhbUlkKCksCi0gICAgICAgICAgICBtZXRlcmluZ1N0cmVhbS0+R2V0U3RyZWFtSWQoKSwgY2FwdHVyZVN0cmVhbS0+R2V0U3RyZWFtSWQoKSkpOwotCi0gICAgLy8gU3RhcnQgcHJldmlldwotICAgIGlmIChDQU1FUkFfTVVMVElfU1RSRUFNX0RFQlVHR0lORykgewotICAgICAgICBwcmV2aWV3UmVxdWVzdC5kdW1wKFNURE9VVF9GSUxFTk8pOwotICAgIH0KLQotICAgIC8vIEdlbmVyYXRlIGV4cG9zdXJlIGFuZCBzZW5zaXRpdml0eSBsaXN0cwotICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBleHBvc3VyZVRpbWVSYW5nZSA9Ci0gICAgICAgIEdldFN0YXRpY0VudHJ5KEFORFJPSURfU0VOU09SX0lORk9fRVhQT1NVUkVfVElNRV9SQU5HRSk7Ci0gICAgQVNTRVJUX0VRKGV4cG9zdXJlVGltZVJhbmdlLmNvdW50LCAydSk7Ci0gICAgaW50NjRfdCBtaW5FeHAgPSBleHBvc3VyZVRpbWVSYW5nZS5kYXRhLmk2NFswXTsKLSAgICBpbnQ2NF90IG1heEV4cCA9IGV4cG9zdXJlVGltZVJhbmdlLmRhdGEuaTY0WzFdOwotICAgIEFTU0VSVF9HVChtYXhFeHAsIG1pbkV4cCk7Ci0KLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgc2Vuc2l2aXR5UmFuZ2UgPQotICAgICAgICBHZXRTdGF0aWNFbnRyeShBTkRST0lEX1NFTlNPUl9JTkZPX1NFTlNJVElWSVRZX1JBTkdFKTsKLSAgICBBU1NFUlRfRVEoMnUsIHNlbnNpdml0eVJhbmdlLmNvdW50KTsKLSAgICBpbnQzMl90IG1pblNlbnNpdGl2aXR5ID0gc2Vuc2l2aXR5UmFuZ2UuZGF0YS5pMzJbMF07Ci0gICAgaW50MzJfdCBtYXhTZW5zaXRpdml0eSA9IHNlbnNpdml0eVJhbmdlLmRhdGEuaTMyWzFdOwotICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBtYXhBbmFsb2dTZW5FbnRyeSA9Ci0gICAgICAgICAgICBHZXRTdGF0aWNFbnRyeShBTkRST0lEX1NFTlNPUl9NQVhfQU5BTE9HX1NFTlNJVElWSVRZKTsKLSAgICBFWFBFQ1RfRVEoMXUsIG1heEFuYWxvZ1NlbkVudHJ5LmNvdW50KTsKLSAgICBpbnQzMl90IG1heEFuYWxvZ1NlbnNpdGl2aXR5ID0gbWF4QW5hbG9nU2VuRW50cnkuZGF0YS5pMzJbMF07Ci0gICAgRVhQRUNUX0xFKG1heEFuYWxvZ1NlbnNpdGl2aXR5LCBtYXhTZW5zaXRpdml0eSk7Ci0gICAgLy8gT25seSB0ZXN0IHRoZSBzZW5zaXRpdml0eSBpbXBsZW1lbnRlZCBieSBhbmFsb2cgZ2Fpbi4KLSAgICBpZiAobWF4QW5hbG9nU2Vuc2l0aXZpdHkgPiBtYXhTZW5zaXRpdml0eSkgewotICAgICAgICAvLyBGYWxsYmFjayB0byBtYXhTZW5zaXRpdHkKLSAgICAgICAgbWF4QW5hbG9nU2Vuc2l0aXZpdHkgPSBtYXhTZW5zaXRpdml0eTsKLSAgICB9Ci0KLSAgICAvLyBzZW5zaXRpdml0eSBsaXN0LCBvbmx5IGluY2x1ZGUgdGhlIHNlbnNpdGl2aXRpZXMgdGhhdCBhcmUgaW1wbGVtZW50ZWQKLSAgICAvLyBwdXJlbHkgYnkgYW5hbG9nIGdhaW4gaWYgcG9zc2libGUuCi0gICAgVmVjdG9yPGludDMyX3Q+IHNlbnNpdGl2aXRpZXM7Ci0gICAgVmVjdG9yPGludDY0X3Q+IGV4cG9zdXJlczsKLSAgICBzaXplX3QgY291bnQgPSAobWF4QW5hbG9nU2Vuc2l0aXZpdHkgLSBtaW5TZW5zaXRpdml0eSArIDk5KSAvIDEwMDsKLSAgICBzZW5zaXRpdml0aWVzLnB1c2hfYmFjayhtaW5TZW5zaXRpdml0eSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIHNlbnNpdGl2aXRpZXMucHVzaF9iYWNrKG1pblNlbnNpdGl2aXR5ICsgaSAqIDEwMCk7Ci0gICAgfQotICAgIHNlbnNpdGl2aXRpZXMucHVzaF9iYWNrKG1heEFuYWxvZ1NlbnNpdGl2aXR5KTsKLSAgICBBTE9HVigiU2Vuc2l0aXZpdHkgUmFuZ2U6IG1pbj0lZCwgbWF4PSVkIiwgbWluU2Vuc2l0aXZpdHksCi0gICAgICAgICAgICBtYXhBbmFsb2dTZW5zaXRpdml0eSk7Ci0gICAgaW50NjRfdCBleHAgPSBtaW5FeHA7Ci0gICAgd2hpbGUgKGV4cCA8IG1heEV4cCkgewotICAgICAgICBleHBvc3VyZXMucHVzaF9iYWNrKGV4cCk7Ci0gICAgICAgIGV4cCAqPSAyOwotICAgIH0KLSAgICAvLyBTd2VlcCB0aGUgZXhwb3N1cmUgdmFsdWUgZm9yIHByZXZpZXcsIGp1c3QgZm9yIHZpc3VhbCBpbnNwZWN0aW9uIHB1cnBvc2UuCi0gICAgdWludDhfdCBjbU9mZiA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KEFORFJPSURfQ09OVFJPTF9NT0RFX09GRik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBleHBvc3VyZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCBwcmV2aWV3UmVxdWVzdC51cGRhdGUoCi0gICAgICAgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX01PREUsCi0gICAgICAgICAgICAgICAgJmNtT2ZmLCAxKSk7Ci0gICAgICAgIEFTU0VSVF9FUShPSywgcHJldmlld1JlcXVlc3QudXBkYXRlKAotICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0VYUE9TVVJFX1RJTUUsCi0gICAgICAgICAgICAgICAgJmV4cG9zdXJlc1tpXSwgMSkpOwotICAgICAgICBBTE9HVigiU3VibWl0dGluZyBwcmV2aWV3IHJlcXVlc3QgJXp1IHdpdGggZXhwb3N1cmUgJSIgUFJJZDY0LAotICAgICAgICAgICAgICAgIGksIGV4cG9zdXJlc1tpXSk7Ci0KLSAgICAgICAgQVNTRVJUX0VRKE9LLCBtRGV2aWNlLT5zZXRTdHJlYW1pbmdSZXF1ZXN0KHByZXZpZXdSZXF1ZXN0KSk7Ci0KLSAgICAgICAgLy8gTGV0IHByZXZpZXcgcnVuIDIwMG1zIG9uIHNjcmVlbiBmb3IgZWFjaCBleHBvc3VyZSB0aW1lLgotICAgICAgICB1c2xlZXAoUFJFVklFV19SRU5ERVJJTkdfVElNRV9JTlRFUlZBTCk7Ci0gICAgfQotCi0gICAgc2l6ZV90IHJlcXVlc3RDb3VudCA9IHNlbnNpdGl2aXRpZXMuc2l6ZSgpOwotICAgIGlmIChyZXF1ZXN0Q291bnQgPiBleHBvc3VyZXMuc2l6ZSgpKSB7Ci0gICAgICAgIHJlcXVlc3RDb3VudCA9IGV4cG9zdXJlcy5zaXplKCk7Ci0gICAgfQotCi0gICAgLy8gVG8gbWFpbnRhaW4gdGhlIHJlcXVlc3QgaWQgdW5pcXVlbmVzcyAocHJldmlldyByZXF1ZXN0IGlkIGlzIDApLCBtYWtlIGJ1cnN0IGNhcHR1cmUgc3RhcnQKLSAgICAvLyByZXF1ZXN0IGlkIDEgaGVyZS4KLSAgICBpbnQzMl90IHJlcXVlc3RJZFN0YXJ0ID0gMTsKLSAgICAvKioKLSAgICAgKiBTdWJtaXQgbWV0ZXJpbmcgcmVxdWVzdCwgc2V0IGRlZmF1bHQgZnJhbWUgZHVyYXRpb24gdG8gbWluaW1hbCBwb3NzaWJsZQotICAgICAqIHZhbHVlLCB3ZSB3YW50IHRoZSBjYXB0dXJlIHRvIHJ1biBhcyBmYXN0IGFzIHBvc3NpYmxlLiBIQUwgc2hvdWxkIGFkanVzdAotICAgICAqIHRoZSBmcmFtZSBkdXJhdGlvbiB0byBtaW5pbWFsIG5lY2Vzc2FyeSB2YWx1ZSB0byBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQKLSAgICAgKiBleHBvc3VyZSB2YWx1ZSBpZiBleHBvc3VyZSBpcyBsYXJnZXIgdGhhbiBmcmFtZSBkdXJhdGlvbi4KLSAgICAgKi8KLSAgICBDYXB0dXJlQnVyc3QobWV0ZXJpbmdSZXF1ZXN0LCByZXF1ZXN0Q291bnQsIGV4cG9zdXJlcywgc2Vuc2l0aXZpdGllcywKLSAgICAgICAgICAgIG1ldGVyaW5nU3RyZWFtLCBtaW5GcmFtZUR1cmF0aW9uLCAmcmVxdWVzdElkU3RhcnQpOwotCi0gICAgLyoqCi0gICAgICogU3VibWl0IGNhcHR1cmUgcmVxdWVzdCwgc2V0IGRlZmF1bHQgZnJhbWUgZHVyYXRpb24gdG8gbWluaW1hbCBwb3NzaWJsZQotICAgICAqIHZhbHVlLCB3ZSB3YW50IHRoZSBjYXB0dXJlIHRvIHJ1biBhcyBmYXN0IGFzIHBvc3NpYmxlLiBIQUwgc2hvdWxkIGFkanVzdAotICAgICAqIHRoZSBmcmFtZSBkdXJhdGlvbiB0byBtaW5pbWFsIG5lY2Vzc2FyeSB2YWx1ZSB0byBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQKLSAgICAgKiBleHBvc3VyZSB2YWx1ZSBpZiBleHBvc3VyZSBpcyBsYXJnZXIgdGhhbiBmcmFtZSBkdXJhdGlvbi4KLSAgICAgKi8KLSAgICBDYXB0dXJlQnVyc3QoY2FwdHVyZVJlcXVlc3QsIHJlcXVlc3RDb3VudCwgZXhwb3N1cmVzLCBzZW5zaXRpdml0aWVzLAotICAgICAgICAgICAgY2FwdHVyZVN0cmVhbSwgbWluRnJhbWVEdXJhdGlvbiwgJnJlcXVlc3RJZFN0YXJ0KTsKLQotICAgIEFTU0VSVF9FUShPSywgbURldmljZS0+Y2xlYXJTdHJlYW1pbmdSZXF1ZXN0KCkpOwotfQotCi19Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEyL0NhbWVyYVN0cmVhbUZpeHR1cmUuaCBiL3Rlc3RzL2NhbWVyYTIvQ2FtZXJhU3RyZWFtRml4dHVyZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmZmMDViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NhbWVyYTIvQ2FtZXJhU3RyZWFtRml4dHVyZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fQU5EUk9JRF9IQUxfQ0FNRVJBMl9URVNUU19TVFJFQU1fRklYVFVSRV9fCi0jZGVmaW5lIF9fQU5EUk9JRF9IQUxfQ0FNRVJBMl9URVNUU19TVFJFQU1fRklYVFVSRV9fCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0KLSNpbmNsdWRlIDxndWkvQ3B1Q29uc3VtZXIuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgotI2luY2x1ZGUgPHV0aWxzL0NvbmRpdGlvbi5oPgotI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2NhbWVyYV9tZXRhZGF0YS5oPgotCi0jaW5jbHVkZSAiQ2FtZXJhTW9kdWxlRml4dHVyZS5oIgotI2luY2x1ZGUgIlRlc3RFeHRlbnNpb25zLmgiCi0KLSNkZWZpbmUgQUxJR04oeCwgbWFzaykgKCAoKHgpICsgKG1hc2spIC0gMSkgJiB+KChtYXNrKSAtIDEpICkKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGNhbWVyYTIgewotbmFtZXNwYWNlIHRlc3RzIHsKLQotLy8gRm9ybWF0IHNwZWNpZmllciBmb3IgcGlja2luZyB0aGUgYmVzdCBmb3JtYXQgZm9yIENQVSByZWFkaW5nIHRoZSBnaXZlbiBkZXZpY2UKLS8vIHZlcnNpb24KLSNkZWZpbmUgQ0FNRVJBX1NUUkVBTV9BVVRPX0NQVV9GT1JNQVQgKC0xKQotCi1zdHJ1Y3QgQ2FtZXJhU3RyZWFtUGFyYW1zOwotCi12b2lkIFByaW50VG8oY29uc3QgQ2FtZXJhU3RyZWFtUGFyYW1zJiBwLCA6OnN0ZDo6b3N0cmVhbSogb3MpOwotCi1zdHJ1Y3QgQ2FtZXJhU3RyZWFtUGFyYW1zIHsKLSAgICBpbnQgbUZvcm1hdDsKLSAgICBpbnQgbUhlYXBDb3VudDsKLQotfTsKLQotaW5saW5lIDo6c3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KDo6c3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQ2FtZXJhU3RyZWFtUGFyYW1zICZwKSB7Ci0gICAgUHJpbnRUbyhwLCAmb3MpOwotICAgIHJldHVybiBvczsKLX0KLQotaW5saW5lIHZvaWQgUHJpbnRUbyhjb25zdCBDYW1lcmFTdHJlYW1QYXJhbXMmIHAsIDo6c3RkOjpvc3RyZWFtKiBvcykgewotICAgIGNoYXIgZm10WzEwMF07Ci0gICAgY2FtZXJhX21ldGFkYXRhX2VudW1fc25wcmludCgKLSAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0ZPUk1BVFMsIHAubUZvcm1hdCwgZm10LCBzaXplb2YoZm10KSk7Ci0KLSAgICAqb3MgPDwgICJ7ICI7Ci0gICAgKm9zIDw8ICAiRm9ybWF0OiAweCIgIDw8IHN0ZDo6aGV4IDw8IHAubUZvcm1hdCAgICA8PCAiLCAiOwotICAgICpvcyA8PCAgIkZvcm1hdCBuYW1lOiAiIDw8IGZtdCA8PCAiLCAiOwotICAgICpvcyA8PCAgIkhlYXBDb3VudDogIiA8PCAgICAgICAgICAgICBwLm1IZWFwQ291bnQ7Ci0gICAgKm9zIDw8ICIgfSI7Ci19Ci0KLWNsYXNzIENhbWVyYVN0cmVhbUZpeHR1cmUKLSAgICA6IHB1YmxpYyBDYW1lcmFNb2R1bGVGaXh0dXJlPC8qSW5mb1F1aXJrKi90cnVlPiB7Ci0KLXB1YmxpYzoKLSAgICBleHBsaWNpdCBDYW1lcmFTdHJlYW1GaXh0dXJlKENhbWVyYVN0cmVhbVBhcmFtcyBwKQotICAgIDogQ2FtZXJhTW9kdWxlRml4dHVyZShUZXN0U2V0dGluZ3M6OkRldmljZUlkKCkpIHsKLSAgICAgICAgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19DT05TVFJVQ1RPUjsKLQotICAgICAgICBtUGFyYW0gPSBwOwotCi0gICAgICAgIFNldFVwKCk7Ci0gICAgfQotCi0gICAgfkNhbWVyYVN0cmVhbUZpeHR1cmUoKSB7Ci0gICAgICAgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfREVTVFJVQ1RPUjsKLQotICAgICAgICBUZWFyRG93bigpOwotICAgIH0KLQotcHJpdmF0ZToKLQotICAgIHZvaWQgU2V0VXAoKSB7Ci0gICAgICAgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfU0VUX1VQOwotCi0gICAgICAgIENhbWVyYU1vZHVsZUZpeHR1cmU6OlNldFVwKCk7Ci0KLSAgICAgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlID0gbURldmljZTsKLQotICAgICAgICAvKiB1c2UgYW4gYXJiaXRyYXJ5IHcsaCAqLwotICAgICAgICBpZiAoZ2V0RGV2aWNlVmVyc2lvbigpIDwgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKLSAgICAgICAgICAgIGNvbnN0IGludCB0YWcgPSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfUFJPQ0VTU0VEX1NJWkVTOwotCi0gICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc3RhdGljSW5mbyA9IGRldmljZS0+aW5mbygpOwotICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGVudHJ5ID0gc3RhdGljSW5mby5maW5kKHRhZyk7Ci0gICAgICAgICAgICBBU1NFUlRfTkUoMHUsIGVudHJ5LmNvdW50KQotICAgICAgICAgICAgICAgIDw8ICJNaXNzaW5nIHRhZyBhbmRyb2lkLnNjYWxlci5hdmFpbGFibGVQcm9jZXNzZWRTaXplcyI7Ci0KLSAgICAgICAgICAgIEFTU0VSVF9MRSgydSwgZW50cnkuY291bnQpOwotICAgICAgICAgICAgLyogdGhpcyBzZWVtcyBsaWtlIGl0IHdvdWxkIGFsd2F5cyBiZSB0aGUgc21hbGxlc3QgdyxoCi0gICAgICAgICAgICAgICBidXQgd2UgYWN0dWFsbHkgbWFrZSBubyBjb250cmFjdCB0aGF0IGl0J3Mgc29ydGVkIGFzYyAqLwotICAgICAgICAgICAgbVdpZHRoID0gZW50cnkuZGF0YS5pMzJbMF07Ci0gICAgICAgICAgICBtSGVpZ2h0ID0gZW50cnkuZGF0YS5pMzJbMV07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBidWlsZE91dHB1dFJlc29sdXRpb25zKCk7Ci0gICAgICAgICAgICBjb25zdCBpbnQzMl90ICppbXBsRGVmUmVzb2x1dGlvbnMgPSBOVUxMOwotICAgICAgICAgICAgc2l6ZV90ICAgaW1wbERlZlJlc29sdXRpb25zQ291bnQ7Ci0KLSAgICAgICAgICAgIGludCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ7Ci0KLSAgICAgICAgICAgIGdldFJlc29sdXRpb25MaXN0KGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgJmltcGxEZWZSZXNvbHV0aW9ucywgJmltcGxEZWZSZXNvbHV0aW9uc0NvdW50KTsKLSAgICAgICAgICAgIEFTU0VSVF9ORSgwdSwgaW1wbERlZlJlc29sdXRpb25zQ291bnQpCi0gICAgICAgICAgICAgICAgPDwgIk1pc3NpbmcgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBzaXplcyI7Ci0gICAgICAgICAgICBtV2lkdGggPSBpbXBsRGVmUmVzb2x1dGlvbnNbMF07Ci0gICAgICAgICAgICBtSGVpZ2h0ID0gaW1wbERlZlJlc29sdXRpb25zWzFdOwotICAgICAgICB9Ci0gICAgfQotICAgIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgICAgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfVEVBUl9ET1dOOwotCi0gICAgICAgIC8vIGltcG9ydGFudDogc2h1dCBkb3duIEhBTCBiZWZvcmUgcmVsZWFzaW5nIHN0cmVhbXMKLSAgICAgICAgQ2FtZXJhTW9kdWxlRml4dHVyZTo6VGVhckRvd24oKTsKLQotICAgICAgICBkZWxldGVPdXRwdXRSZXNvbHV0aW9ucygpOwotICAgICAgICBtU3VyZmFjZS5jbGVhcigpOwotICAgICAgICBtQ3B1Q29uc3VtZXIuY2xlYXIoKTsKLSAgICAgICAgbUZyYW1lTGlzdGVuZXIuY2xlYXIoKTsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLQotICAgIGludDY0X3QgZ2V0TWluRnJhbWVEdXJhdGlvbkZvcihpbnQzMl90IGZvcm1hdCwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKLSAgICAgICAgaW50NjRfdCBtaW5GcmFtZUR1cmF0aW9uID0gLTFMOwotICAgICAgICBjb25zdCBpbnQgdGFnID0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlM7Ci0gICAgICAgIHNwPENhbWVyYURldmljZUJhc2U+IGRldmljZSA9IG1EZXZpY2U7Ci0gICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNJbmZvID0gZGV2aWNlLT5pbmZvKCk7Ci0gICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZU1pbkR1cmF0aW9ucyA9IHN0YXRpY0luZm8uZmluZCh0YWcpOwotICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgYXZhaWxhYmxlTWluRHVyYXRpb25zLmNvdW50OyBpICs9IDQpIHsKLSAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gYXZhaWxhYmxlTWluRHVyYXRpb25zLmRhdGEuaTY0W2ldICYmCi0gICAgICAgICAgICAgICAgICAgIHdpZHRoID09IGF2YWlsYWJsZU1pbkR1cmF0aW9ucy5kYXRhLmk2NFtpICsgMV0gJiYKLSAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID09IGF2YWlsYWJsZU1pbkR1cmF0aW9ucy5kYXRhLmk2NFtpICsgMl0pIHsKLSAgICAgICAgICAgICAgICBtaW5GcmFtZUR1cmF0aW9uID0gYXZhaWxhYmxlTWluRHVyYXRpb25zLmRhdGEuaTY0W2kgKyAzXTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWluRnJhbWVEdXJhdGlvbjsKLSAgICB9Ci0KLSAgICB2b2lkIGJ1aWxkT3V0cHV0UmVzb2x1dGlvbnMoKSB7Ci0gICAgICAgIGlmIChnZXREZXZpY2VWZXJzaW9uKCkgPCBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtT3V0cHV0UmVzb2x1dGlvbnMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQgdGFnID0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUzsKLSAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNJbmZvID0gbURldmljZS0+aW5mbygpOwotICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlU3RybUNvbmZpZ3MgPSBzdGF0aWNJbmZvLmZpbmQodGFnKTsKLSAgICAgICAgICAgIEFTU0VSVF9FUSgwdSwgYXZhaWxhYmxlU3RybUNvbmZpZ3MuY291bnQgJSA0KTsKLSAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBhdmFpbGFibGVTdHJtQ29uZmlncy5jb3VudDsgaSArPSA0KSB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBmb3JtYXQgPSBhdmFpbGFibGVTdHJtQ29uZmlncy5kYXRhLmkzMltpXTsKLSAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoID0gYXZhaWxhYmxlU3RybUNvbmZpZ3MuZGF0YS5pMzJbaSArIDFdOwotICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0ID0gYXZhaWxhYmxlU3RybUNvbmZpZ3MuZGF0YS5pMzJbaSArIDJdOwotICAgICAgICAgICAgICAgIGludDMyX3QgaW5Pck91dCA9IGF2YWlsYWJsZVN0cm1Db25maWdzLmRhdGEuaTMyW2kgKyAzXTsKLSAgICAgICAgICAgICAgICBpZiAoaW5Pck91dCA9PSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX09VVFBVVCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBtT3V0cHV0UmVzb2x1dGlvbnMuaW5kZXhPZktleShmb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IG1PdXRwdXRSZXNvbHV0aW9ucy5hZGQoZm9ybWF0LCBuZXcgVmVjdG9yPGludDMyX3Q+KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUoaW5kZXggPj0gMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgVmVjdG9yPGludDMyX3Q+ICpyZXNvbHV0aW9ucyA9IG1PdXRwdXRSZXNvbHV0aW9ucy5lZGl0VmFsdWVBdChpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb25zLT5hZGQod2lkdGgpOwotICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9ucy0+YWRkKGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBnZXRSZXNvbHV0aW9uTGlzdChpbnQzMl90IGZvcm1hdCwKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgKipsaXN0LAotICAgICAgICAgICAgc2l6ZV90ICpjb3VudCkgewotICAgICAgICBBTE9HVigiR2V0dGluZyByZXNvbHV0aW9ucyBmb3IgZm9ybWF0ICV4IiwgZm9ybWF0KTsKLSAgICAgICAgaWYgKGdldERldmljZVZlcnNpb24oKSA8IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGluZGV4ID0gbU91dHB1dFJlc29sdXRpb25zLmluZGV4T2ZLZXkoZm9ybWF0KTsKLSAgICAgICAgQVNTRVJUX1RSVUUoaW5kZXggPj0gMCk7Ci0gICAgICAgIFZlY3RvcjxpbnQzMl90PiogcmVzb2x1dGlvbnMgPSBtT3V0cHV0UmVzb2x1dGlvbnMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgICpsaXN0ID0gcmVzb2x1dGlvbnMtPmFycmF5KCk7Ci0gICAgICAgICpjb3VudCA9IHJlc29sdXRpb25zLT5zaXplKCk7Ci0gICAgfQotCi0gICAgdm9pZCBkZWxldGVPdXRwdXRSZXNvbHV0aW9ucygpIHsKLSAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1PdXRwdXRSZXNvbHV0aW9ucy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgVmVjdG9yPGludDMyX3Q+KiByZXNvbHV0aW9ucyA9IG1PdXRwdXRSZXNvbHV0aW9ucy5lZGl0VmFsdWVBdChpKTsKLSAgICAgICAgICAgIGRlbGV0ZSByZXNvbHV0aW9uczsKLSAgICAgICAgfQotICAgICAgICBtT3V0cHV0UmVzb2x1dGlvbnMuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBzdHJ1Y3QgRnJhbWVMaXN0ZW5lciA6IHB1YmxpYyBDb25zdW1lckJhc2U6OkZyYW1lQXZhaWxhYmxlTGlzdGVuZXIgewotCi0gICAgICAgIEZyYW1lTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBtUGVuZGluZ0ZyYW1lcyA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDcHVDb25zdW1lcjo6RnJhbWVBdmFpbGFibGVMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbgotICAgICAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiAvKiBpdGVtICovKSB7Ci0gICAgICAgICAgICBBTE9HVigiRnJhbWUgbm93IGF2YWlsYWJsZSAoc3RhcnQpIik7Ci0KLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgICAgICAgICBtUGVuZGluZ0ZyYW1lcysrOwotICAgICAgICAgICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKLQotICAgICAgICAgICAgQUxPR1YoIkZyYW1lIG5vdyBhdmFpbGFibGUgKGVuZCkiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXR1c190IHdhaXRGb3JGcmFtZShuc2Vjc190IHRpbWVvdXQpIHsKLSAgICAgICAgICAgIHN0YXR1c190IHJlczsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgICAgICAgICB3aGlsZSAobVBlbmRpbmdGcmFtZXMgPT0gMCkgewotICAgICAgICAgICAgICAgIHJlcyA9IG1Db25kaXRpb24ud2FpdFJlbGF0aXZlKG1NdXRleCwgdGltZW91dCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1QZW5kaW5nRnJhbWVzLS07Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIE11dGV4IG1NdXRleDsKLSAgICAgICAgQ29uZGl0aW9uIG1Db25kaXRpb247Ci0gICAgICAgIGludCBtUGVuZGluZ0ZyYW1lczsKLSAgICB9OwotCi0gICAgdm9pZCBDcmVhdGVTdHJlYW0oKSB7Ci0gICAgICAgIHNwPENhbWVyYURldmljZUJhc2U+IGRldmljZSA9IG1EZXZpY2U7Ci0gICAgICAgIENhbWVyYVN0cmVhbVBhcmFtcyBwID0gbVBhcmFtOwotCi0gICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHByb2R1Y2VyOwotICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lcjsKLSAgICAgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKLSAgICAgICAgbUNwdUNvbnN1bWVyID0gbmV3IENwdUNvbnN1bWVyKGNvbnN1bWVyLCBwLm1IZWFwQ291bnQpOwotICAgICAgICBtQ3B1Q29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhU3RyZWFtVGVzdDo6bUNwdUNvbnN1bWVyIikpOwotCi0gICAgICAgIG1TdXJmYWNlID0gbmV3IFN1cmZhY2UocHJvZHVjZXIpOwotCi0gICAgICAgIGludCBmb3JtYXQgPSBNYXBBdXRvRm9ybWF0KHAubUZvcm1hdCk7Ci0KLSAgICAgICAgQVNTRVJUX0VRKE9LLAotICAgICAgICAgICAgZGV2aWNlLT5jcmVhdGVTdHJlYW0obVN1cmZhY2UsCi0gICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0LCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9VTktOT1dOLAotICAgICAgICAgICAgICAgIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzAsCi0gICAgICAgICAgICAgICAgJm1TdHJlYW1JZCkpOwotCi0gICAgICAgIEFTU0VSVF9ORSgtMSwgbVN0cmVhbUlkKTsKLQotICAgICAgICAvLyBkbyBub3QgbWFrZSAndGhpcycgYSBGcmFtZUxpc3RlbmVyIG9yIHRoZSBsaWZldGltZSBwb2xpY3kgd2lsbCBjbGFzaAotICAgICAgICBtRnJhbWVMaXN0ZW5lciA9IG5ldyBGcmFtZUxpc3RlbmVyKCk7Ci0gICAgICAgIG1DcHVDb25zdW1lci0+c2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcihtRnJhbWVMaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgdm9pZCBEZWxldGVTdHJlYW0oKSB7Ci0gICAgICAgIEFTU0VSVF9FUShPSywgbURldmljZS0+ZGVsZXRlU3RyZWFtKG1TdHJlYW1JZCkpOwotICAgIH0KLQotICAgIGludCBNYXBBdXRvRm9ybWF0KGludCBmb3JtYXQpIHsKLSAgICAgICAgaWYgKGZvcm1hdCA9PSBDQU1FUkFfU1RSRUFNX0FVVE9fQ1BVX0ZPUk1BVCkgewotICAgICAgICAgICAgaWYgKGdldERldmljZVZlcnNpb24oKSA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgewotICAgICAgICAgICAgICAgIGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwXzg4ODsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1A7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZvcm1hdDsKLSAgICB9Ci0KLSAgICB2b2lkIER1bXBZdXZUb0ZpbGUoY29uc3QgU3RyaW5nOCAmZmlsZU5hbWUsIGNvbnN0IENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXIgJmltZykgewotICAgICAgICB1aW50OF90ICpkYXRhQ2IsICpkYXRhQ3I7Ci0gICAgICAgIHVpbnQzMl90IHN0cmlkZTsKLSAgICAgICAgdWludDMyX3QgY2hyb21hU3RyaWRlOwotICAgICAgICB1aW50MzJfdCBjaHJvbWFTdGVwOwotCi0gICAgICAgIHN3aXRjaCAoaW1nLmZvcm1hdCkgewotICAgICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF84ODg6Ci0gICAgICAgICAgICAgICAgc3RyaWRlID0gaW1nLnN0cmlkZTsKLSAgICAgICAgICAgICAgICBjaHJvbWFTdHJpZGUgPSBpbWcuY2hyb21hU3RyaWRlOwotICAgICAgICAgICAgICAgIGNocm9tYVN0ZXAgPSBpbWcuY2hyb21hU3RlcDsKLSAgICAgICAgICAgICAgICBkYXRhQ2IgPSBpbWcuZGF0YUNiOwotICAgICAgICAgICAgICAgIGRhdGFDciA9IGltZy5kYXRhQ3I7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQOgotICAgICAgICAgICAgICAgIHN0cmlkZSA9IGltZy53aWR0aDsKLSAgICAgICAgICAgICAgICBjaHJvbWFTdHJpZGUgPSBpbWcud2lkdGg7Ci0gICAgICAgICAgICAgICAgY2hyb21hU3RlcCA9IDI7Ci0gICAgICAgICAgICAgICAgZGF0YUNyID0gaW1nLmRhdGEgKyBpbWcud2lkdGggKiBpbWcuaGVpZ2h0OwotICAgICAgICAgICAgICAgIGRhdGFDYiA9IGRhdGFDciArIDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWVYxMjoKLSAgICAgICAgICAgICAgICBzdHJpZGUgPSBpbWcuc3RyaWRlOwotICAgICAgICAgICAgICAgIGNocm9tYVN0cmlkZSA9IEFMSUdOKGltZy53aWR0aCAvIDIsIDE2KTsKLSAgICAgICAgICAgICAgICBjaHJvbWFTdGVwID0gMTsKLSAgICAgICAgICAgICAgICBkYXRhQ3IgPSBpbWcuZGF0YSArIGltZy5zdHJpZGUgKiBpbWcuaGVpZ2h0OwotICAgICAgICAgICAgICAgIGRhdGFDYiA9IGRhdGFDciArIGNocm9tYVN0cmlkZSAqIGltZy5oZWlnaHQvMjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgQUxPR0UoIlVua25vd24gZm9ybWF0ICVkLCBub3QgZHVtcGluZyIsIGltZy5mb3JtYXQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdyaXRlIFkKLSAgICAgICAgRklMRSAqeXV2RmlsZSA9IGZvcGVuKGZpbGVOYW1lLnN0cmluZygpLCAidyIpOwotCi0gICAgICAgIHNpemVfdCBieXRlczsKLQotICAgICAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGltZy5oZWlnaHQ7ICsreSkgewotICAgICAgICAgICAgYnl0ZXMgPSBmd3JpdGUoCi0gICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oaW1nLmRhdGEgKyBzdHJpZGUgKiB5KSwKLSAgICAgICAgICAgICAgICAxLCBpbWcud2lkdGgsIHl1dkZpbGUpOwotICAgICAgICAgICAgaWYgKGJ5dGVzICE9IGltZy53aWR0aCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gd3JpdGUgdG8gZmlsZSAlcyIsIGZpbGVOYW1lLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICBmY2xvc2UoeXV2RmlsZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV3JpdGUgQ2IvQ3IKLSAgICAgICAgdWludDhfdCAqc3JjID0gZGF0YUNiOwotICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IDI7ICsrYykgewotICAgICAgICAgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBpbWcuaGVpZ2h0IC8gMjsgKyt5KSB7Ci0gICAgICAgICAgICAgICAgdWludDhfdCAqcHggPSBzcmMgKyB5ICogY2hyb21hU3RyaWRlOwotICAgICAgICAgICAgICAgIGlmIChjaHJvbWFTdGVwICE9IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCBpbWcud2lkdGggLyAyOyArK3gpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwdXRjKCpweCwgeXV2RmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBweCArPSBjaHJvbWFTdGVwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSBmd3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocHgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIGltZy53aWR0aCAvIDIsIHl1dkZpbGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXMgIT0gaW1nLndpZHRoIC8gMikgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byB3cml0ZSB0byBmaWxlICVzIiwgZmlsZU5hbWUuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmNsb3NlKHl1dkZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3JjID0gZGF0YUNyOwotICAgICAgICB9Ci0gICAgICAgIGZjbG9zZSh5dXZGaWxlKTsKLSAgICB9Ci0KLSAgICBpbnQgbVdpZHRoOwotICAgIGludCBtSGVpZ2h0OwotCi0gICAgaW50IG1TdHJlYW1JZDsKLQotICAgIGFuZHJvaWQ6OnNwPEZyYW1lTGlzdGVuZXI+ICAgICAgIG1GcmFtZUxpc3RlbmVyOwotICAgIGFuZHJvaWQ6OnNwPENwdUNvbnN1bWVyPiAgICAgICAgIG1DcHVDb25zdW1lcjsKLSAgICBhbmRyb2lkOjpzcDxTdXJmYWNlPiAgICAgICAgICAgICBtU3VyZmFjZTsKLSAgICBLZXllZFZlY3RvcjxpbnQzMl90LCBWZWN0b3I8aW50MzJfdD4qID4gbU91dHB1dFJlc29sdXRpb25zOwotCi1wcml2YXRlOgotICAgIENhbWVyYVN0cmVhbVBhcmFtcyBtUGFyYW07Ci19OwotCi19Ci19Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdHMvY2FtZXJhMi9DYW1lcmFTdHJlYW1UZXN0cy5jcHAgYi90ZXN0cy9jYW1lcmEyL0NhbWVyYVN0cmVhbVRlc3RzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU5YWU4YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9jYW1lcmEyL0NhbWVyYVN0cmVhbVRlc3RzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPGlvbWFuaXA+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2RlZmluZSBMT0dfVEFHICJDYW1lcmFTdHJlYW1UZXN0IgotI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgImhhcmR3YXJlL2hhcmR3YXJlLmgiCi0jaW5jbHVkZSAiaGFyZHdhcmUvY2FtZXJhMi5oIgotCi0jaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgotI2luY2x1ZGUgPGd1aS9DcHVDb25zdW1lci5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0KLSNpbmNsdWRlICJDYW1lcmFTdHJlYW1GaXh0dXJlLmgiCi0jaW5jbHVkZSAiVGVzdEV4dGVuc2lvbnMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y2FtZXJhMjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGNhbWVyYTIgewotbmFtZXNwYWNlIHRlc3RzIHsKLQotY2xhc3MgQ2FtZXJhU3RyZWFtVGVzdAotICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxDYW1lcmFTdHJlYW1QYXJhbXM+LAotICAgICAgcHVibGljIENhbWVyYVN0cmVhbUZpeHR1cmUgewotCi1wdWJsaWM6Ci0gICAgQ2FtZXJhU3RyZWFtVGVzdCgpIDogQ2FtZXJhU3RyZWFtRml4dHVyZShHZXRQYXJhbSgpKSB7Ci0gICAgICAgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfQ09OU1RSVUNUT1I7Ci0gICAgfQotCi0gICAgfkNhbWVyYVN0cmVhbVRlc3QoKSB7Ci0gICAgICAgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfREVTVFJVQ1RPUjsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgICAgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfU0VUX1VQOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgICAgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfVEVBUl9ET1dOOwotICAgIH0KLQotcHJvdGVjdGVkOgotCi19OwotCi1URVNUX1AoQ2FtZXJhU3RyZWFtVGVzdCwgQ3JlYXRlU3RyZWFtKSB7Ci0KLSAgICBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX0lOSVQ7Ci0KLSAgICAvKiogTWFrZSBzdXJlIHRoZSBmb3JtYXQgcmVxdWVzdGVkIGlzIHN1cHBvcnRlZC4gUEFTUyB0aGlzIHRlc3QgaWYgaXQncyBub3QKLSAgICAgICogbm90IHN1cHBvcnRlZC4KLSAgICAgICoKLSAgICAgICogVE9ETzogd291bGQgYmUgbmljZSBvZiBub3QgcnVubmluZyB0aGlzIHRlc3QgaW4gdGhlIGZpcnN0IHBsYWNlCi0gICAgICAqICAgICAgIHNvbWVob3cuCi0gICAgICAqLwotICAgIHsKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGF2YWlsYWJsZUZvcm1hdHMgPQotICAgICAgICAgICAgR2V0U3RhdGljRW50cnkoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0ZPUk1BVFMpOwotCi0gICAgICAgIGJvb2wgaGFzRm9ybWF0ID0gZmFsc2U7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlRm9ybWF0cy5jb3VudDsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoYXZhaWxhYmxlRm9ybWF0cy5kYXRhLmkzMltpXSA9PSBHZXRQYXJhbSgpLm1Gb3JtYXQpIHsKLSAgICAgICAgICAgICAgICBoYXNGb3JtYXQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFoYXNGb3JtYXQpIHsKLSAgICAgICAgICAgIGNvbnN0IDo6dGVzdGluZzo6VGVzdEluZm8qIGNvbnN0IHRlc3RfaW5mbyA9Ci0gICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Y3VycmVudF90ZXN0X2luZm8oKTsKLSAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiU2tpcHBpbmcgdGVzdCAiCi0gICAgICAgICAgICAgICAgICAgICAgPDwgdGVzdF9pbmZvLT50ZXN0X2Nhc2VfbmFtZSgpIDw8ICIuIgotICAgICAgICAgICAgICAgICAgICAgIDw8IHRlc3RfaW5mby0+bmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgPDwgIiBiZWNhdXNlIHRoZSBmb3JtYXQgd2FzIG5vdCBhdmFpbGFibGU6ICIKLSAgICAgICAgICAgICAgICAgICAgICA8PCBHZXRQYXJhbSgpIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKENyZWF0ZVN0cmVhbSgpKTsKLSAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShEZWxldGVTdHJlYW0oKSk7Ci19Ci0KLS8vVE9ETzogdXNlIGEgY29tYmluYXRvcmljIGdlbmVyYXRvcgotc3RhdGljIENhbWVyYVN0cmVhbVBhcmFtcyBUZXN0UGFyYW1ldGVyc1tdID0gewotICAgIHsKLSAgICAgICAgLyptRm9ybWF0Ki8gICAgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVELAotICAgICAgICAvKm1IZWFwQ291bnQqLyAxCi0gICAgfSwKLSAgICB7Ci0gICAgICAgIC8qbUZvcm1hdCovICAgIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCwKLSAgICAgICAgLyptSGVhcENvdW50Ki8gMgotICAgIH0sCi0gICAgewotICAgICAgICAvKm1Gb3JtYXQqLyAgICBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQsCi0gICAgICAgIC8qbUhlYXBDb3VudCovIDMKLSAgICB9LAotICAgIHsKLSAgICAgICAgLyptRm9ybWF0Ki8gICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1AsIC8vIE5WMjEKLSAgICAgICAgLyptSGVhcENvdW50Ki8gMQotICAgIH0sCi0gICAgewotICAgICAgICAvKm1Gb3JtYXQqLyAgICBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUCwKLSAgICAgICAgLyptSGVhcENvdW50Ki8gMgotICAgIH0sCi0gICAgewotICAgICAgICAvKm1Gb3JtYXQqLyAgICBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUCwKLSAgICAgICAgLyptSGVhcENvdW50Ki8gMwotICAgIH0sCi0gICAgewotICAgICAgICAvKm1Gb3JtYXQqLyAgICBIQUxfUElYRUxfRk9STUFUX1lWMTIsCi0gICAgICAgIC8qbUhlYXBDb3VudCovIDEKLSAgICB9LAotICAgIHsKLSAgICAgICAgLyptRm9ybWF0Ki8gICAgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyLAotICAgICAgICAvKm1IZWFwQ291bnQqLyAyCi0gICAgfSwKLSAgICB7Ci0gICAgICAgIC8qbUZvcm1hdCovICAgIEhBTF9QSVhFTF9GT1JNQVRfWVYxMiwKLSAgICAgICAgLyptSGVhcENvdW50Ki8gMwotICAgIH0sCi0gICAgewotICAgICAgICAvKm1Gb3JtYXQqLyAgICBIQUxfUElYRUxfRk9STUFUX1k4LAotICAgICAgICAvKm1IZWFwQ291bnQqLyAxCi0gICAgfSwKLSAgICB7Ci0gICAgICAgIC8qbUZvcm1hdCovICAgIEhBTF9QSVhFTF9GT1JNQVRfWTgsCi0gICAgICAgIC8qbUhlYXBDb3VudCovIDIKLSAgICB9LAotICAgIHsKLSAgICAgICAgLyptRm9ybWF0Ki8gICAgSEFMX1BJWEVMX0ZPUk1BVF9ZOCwKLSAgICAgICAgLyptSGVhcENvdW50Ki8gMwotICAgIH0sCi0gICAgewotICAgICAgICAvKm1Gb3JtYXQqLyAgICBIQUxfUElYRUxfRk9STUFUX1kxNiwKLSAgICAgICAgLyptSGVhcENvdW50Ki8gMQotICAgIH0sCi0gICAgewotICAgICAgICAvKm1Gb3JtYXQqLyAgICBIQUxfUElYRUxfRk9STUFUX1kxNiwKLSAgICAgICAgLyptSGVhcENvdW50Ki8gMgotICAgIH0sCi0gICAgewotICAgICAgICAvKm1Gb3JtYXQqLyAgICBIQUxfUElYRUxfRk9STUFUX1kxNiwKLSAgICAgICAgLyptSGVhcENvdW50Ki8gMwotICAgIH0sCi0gICAgewotICAgICAgICAvKm1Gb3JtYXQqLyAgICBIQUxfUElYRUxfRk9STUFUX1JBVzE2LAotICAgICAgICAvKm1IZWFwQ291bnQqLyAxCi0gICAgfSwKLSAgICB7Ci0gICAgICAgIC8qbUZvcm1hdCovICAgIEhBTF9QSVhFTF9GT1JNQVRfUkFXMTYsCi0gICAgICAgIC8qbUhlYXBDb3VudCovIDIKLSAgICB9LAotICAgIHsKLSAgICAgICAgLyptRm9ybWF0Ki8gICAgSEFMX1BJWEVMX0ZPUk1BVF9SQVcxNiwKLSAgICAgICAgLyptSGVhcENvdW50Ki8gMwotICAgIH0sCi19OwotCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChTdHJlYW1QYXJhbWV0ZXJDb21iaW5hdGlvbnMsIENhbWVyYVN0cmVhbVRlc3QsCi0gICAgdGVzdGluZzo6VmFsdWVzSW4oVGVzdFBhcmFtZXRlcnMpKTsKLQotCi19Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEyL0ZvcmtlZFRlc3RzLmNwcCBiL3Rlc3RzL2NhbWVyYTIvRm9ya2VkVGVzdHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTU5OWRhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NhbWVyYTIvRm9ya2VkVGVzdHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJUZXN0RXh0ZW5zaW9ucy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgY2FtZXJhMiB7Ci1uYW1lc3BhY2UgdGVzdHMgewotCi0vLyBJbnRlbnRpb25hbGx5IGRpc2FibGVkIHNpbmNlIDIgb2YgdGhlc2UgdGVzdHMgYXJlIHN1cHBvc2VkIHRvIGZhaWwKLWNsYXNzIERJU0FCTEVEX0ZvcmtlZFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLQotICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICAgICAgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19TRVRfVVA7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgICAgICBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX1RFQVJfRE9XTjsKLSAgICB9Ci19OwotCi0vLyBpbnRlbnRpb25hbGx5IGZhaWwKLVRFU1RfRihESVNBQkxFRF9Gb3JrZWRUZXN0LCBGYWlsQ3Jhc2gpIHsKLSAgICBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX0lOSVQ7Ci0gICAgYWJvcnQoKTsKLX0KLQotVEVTVF9GKERJU0FCTEVEX0ZvcmtlZFRlc3QsIFN1Y2NlZWROb3JtYWwpIHsKLSAgICBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX0lOSVQ7Ci0KLSAgICBFWFBFQ1RfVFJVRSh0cnVlKTsKLX0KLQotLy8gaW50ZW50aW9uYWxseSBmYWlsCi1URVNUX0YoRElTQUJMRURfRm9ya2VkVGVzdCwgRmFpbE5vcm1hbCkgewotICAgIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfSU5JVDsKLQotICAgIEVYUEVDVF9UUlVFKGZhbHNlKTsKLX0KLQotfQotfQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEyL1Rlc3RFeHRlbnNpb25zLmggYi90ZXN0cy9jYW1lcmEyL1Rlc3RFeHRlbnNpb25zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZjU4N2QuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY2FtZXJhMi9UZXN0RXh0ZW5zaW9ucy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19BTkRST0lEX0hBTF9DQU1FUkEyX1RFU1RTX0VYVEVOU0lPTlNfXwotI2RlZmluZSBfX0FORFJPSURfSEFMX0NBTUVSQTJfVEVTVFNfRVhURU5TSU9OU19fCi0KLSNpbmNsdWRlICJUZXN0Rm9ya2VyRXZlbnRMaXN0ZW5lci5oIgotI2luY2x1ZGUgIlRlc3RTZXR0aW5ncy5oIgotCi0vLyBVc2UgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIFRlc3Q6OlNldFVwKCkgaW1wbAotI2RlZmluZSBURVNUX0VYVEVOU0lPTl9GT1JLSU5HX1NFVF9VUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChURVNUX0VYVEVOU0lPTl9GT1JLSU5HX0VOQUJMRUQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgaWYgKCFUZXN0Rm9ya2VyRXZlbnRMaXN0ZW5lcjo6bUlzRm9ya2VkKSB7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9IHdoaWxlIChmYWxzZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0KLS8vIFVzZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggVGVzdDo6VGVhckRvd24oKSBpbXBsCi0jZGVmaW5lIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfVEVBUl9ET1dOICAgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19TRVRfVVAKLQotLy8gVXNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBUZXN0OjpUZXN0IGNvbnN0cnVjdG9yCi0jZGVmaW5lIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfQ09OU1RSVUNUT1IgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19TRVRfVVAKLQotLy8gVXNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBUZXN0Ojp+VGVzdCBkZXN0cnVjdG9yCi0jZGVmaW5lIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfREVTVFJVQ1RPUiAgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19URUFSX0RPV04KLQotLy8gVXNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCB0ZXN0IGJvZHksIGUuZy4gVEVTVCh4LHkpLCBURVNUX0YoeCx5KSwgZXRjCi0jZGVmaW5lIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfSU5JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgVEVTVF9FWFRFTlNJT05fRk9SS0lOR19TRVRfVVA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChIYXNGYXRhbEZhaWx1cmUoKSkgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gd2hpbGUoZmFsc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQotLy8gQXJlIHdlIHJ1bm5pbmcgZWFjaCB0ZXN0IGJ5IGZvcmtpbmcgaXQ/Ci0jZGVmaW5lIFRFU1RfRVhURU5TSU9OX0ZPUktJTkdfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChhbmRyb2lkOjpjYW1lcmEyOjp0ZXN0czo6VGVzdFNldHRpbmdzOjpGb3JraW5nRW5hYmxlZCgpKQotCi0KLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL2NhbWVyYTIvVGVzdEZvcmtlckV2ZW50TGlzdGVuZXIuY3BwIGIvdGVzdHMvY2FtZXJhMi9UZXN0Rm9ya2VyRXZlbnRMaXN0ZW5lci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MTZkYjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY2FtZXJhMi9UZXN0Rm9ya2VyRXZlbnRMaXN0ZW5lci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgIlRlc3RGb3JrZXJFdmVudExpc3RlbmVyLmgiCi0jaW5jbHVkZSAiVGVzdEV4dGVuc2lvbnMuaCIKLQotI2RlZmluZSBERUJVR19URVNUX0ZPUktFUl9FVkVOVF9MSVNURU5FUiAwCi0KLSNkZWZpbmUgUkVUVVJOX0NPREVfUEFTU0VEIDAKLSNkZWZpbmUgUkVUVVJOX0NPREVfRkFJTEVEIDEKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGNhbWVyYTIgewotbmFtZXNwYWNlIHRlc3RzIHsKLQotYm9vbCBUZXN0Rm9ya2VyRXZlbnRMaXN0ZW5lcjo6bUlzRm9ya2VkICAgICAgICAgPSBmYWxzZTsKLQotVGVzdEZvcmtlckV2ZW50TGlzdGVuZXI6OlRlc3RGb3JrZXJFdmVudExpc3RlbmVyKCkgewotICAgIG1Jc0ZvcmtlZCA9IGZhbHNlOwotICAgIG1IYXNTdWNjZWVkZWQgPSB0cnVlOwotICAgIG1UZXJtU2lnbmFsID0gMDsKLX0KLQotLy8gQ2FsbGVkIGJlZm9yZSBhIHRlc3Qgc3RhcnRzLgotdm9pZCBUZXN0Rm9ya2VyRXZlbnRMaXN0ZW5lcjo6T25UZXN0U3RhcnQoY29uc3QgOjp0ZXN0aW5nOjpUZXN0SW5mbyYpIHsKLQotICAgIGlmICghVEVTVF9FWFRFTlNJT05fRk9SS0lOR19FTkFCTEVEKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBwaWRfdCBjaGlsZFBpZCA9IGZvcmsoKTsKLSAgICBpZiAoY2hpbGRQaWQgIT0gMCkgewotICAgICAgICBpbnQgc3RhdHVzOwotICAgICAgICB3YWl0cGlkKGNoaWxkUGlkLCAmc3RhdHVzLCAvKm9wdGlvbnMqLzApOwotCi0gICAgICAgIC8vIHRlcm1pbmF0ZWQgbm9ybWFsbHk/Ci0gICAgICAgIG1IYXNTdWNjZWVkZWQgPSBXSUZFWElURUQoc3RhdHVzKTsKLSAgICAgICAgLy8gdGVybWluYXRlIHdpdGggcmV0dXJuIGNvZGUgMCA9IHRlc3QgcGFzc2VkLCAxID0gdGVzdCBmYWlsZWQKLSAgICAgICAgaWYgKG1IYXNTdWNjZWVkZWQpIHsKLSAgICAgICAgICBtSGFzU3VjY2VlZGVkID0gV0VYSVRTVEFUVVMoc3RhdHVzKSA9PSBSRVRVUk5fQ09ERV9QQVNTRUQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoV0lGU0lHTkFMRUQoc3RhdHVzKSkgewotICAgICAgICAgIG1UZXJtU2lnbmFsID0gV1RFUk1TSUcoc3RhdHVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHRoZSB0ZXN0IGlzIHRoZW4gc2tpcHBlZCBieSBpbnNlcnRpbmcgdGhlIHZhcmlvdXMKLSAgICAgICAgVEVTVF9FWFRFTlNJT05fIG1hY3JvcyBpbiBUZXN0RXh0ZW5zaW9ucy5oICovCi0KLSAgICB9IGVsc2UgewotICAgICAgICBtSXNGb3JrZWQgPSB0cnVlOwotICAgIH0KLX0KLQotLy8gQ2FsbGVkIGFmdGVyIGEgZmFpbGVkIGFzc2VydGlvbiBvciBhIFNVQ0NFRUQoKSBpbnZvY2F0aW9uLgotdm9pZCBUZXN0Rm9ya2VyRXZlbnRMaXN0ZW5lcjo6T25UZXN0UGFydFJlc3VsdCgKLSAgICBjb25zdCA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KSB7Ci0KLSAgICBpZiAoREVCVUdfVEVTVF9GT1JLRVJfRVZFTlRfTElTVEVORVIpIHsKLSAgICAgICAgcHJpbnRmKCIlcyBpbiAlczolZFxuJXNcbiIsCi0gICAgICAgICAgICAgdGVzdF9wYXJ0X3Jlc3VsdC5mYWlsZWQoKSA/ICIqKiogRmFpbHVyZSIgOiAiU3VjY2VzcyIsCi0gICAgICAgICAgICAgdGVzdF9wYXJ0X3Jlc3VsdC5maWxlX25hbWUoKSwKLSAgICAgICAgICAgICB0ZXN0X3BhcnRfcmVzdWx0LmxpbmVfbnVtYmVyKCksCi0gICAgICAgICAgICAgdGVzdF9wYXJ0X3Jlc3VsdC5zdW1tYXJ5KCkpOwotICAgIH0KLX0KLQotLy8gQ2FsbGVkIGFmdGVyIGEgdGVzdCBlbmRzLgotdm9pZCBUZXN0Rm9ya2VyRXZlbnRMaXN0ZW5lcjo6T25UZXN0RW5kKGNvbnN0IDo6dGVzdGluZzo6VGVzdEluZm8mIHRlc3RfaW5mbykgewotCi0gICAgaWYgKCFURVNUX0VYVEVOU0lPTl9GT1JLSU5HX0VOQUJMRUQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtSXNGb3JrZWQpIHsKLSAgICAgICAgZXhpdCh0ZXN0X2luZm8ucmVzdWx0KCktPlBhc3NlZCgpCi0gICAgICAgICAgICA/IFJFVFVSTl9DT0RFX1BBU1NFRCA6IFJFVFVSTl9DT0RFX0ZBSUxFRCk7Ci0gICAgfSBlbHNlIGlmICghbUhhc1N1Y2NlZWRlZCAmJiBtVGVybVNpZ25hbCAhPSAwKSB7Ci0KLSAgICAgIHByaW50ZigiKioqIFRlc3QgJXMuJXMgY3Jhc2hlZCB3aXRoIHNpZ25hbCA9ICVzXG4iLAotICAgICAgICAgICAgIHRlc3RfaW5mby50ZXN0X2Nhc2VfbmFtZSgpLCB0ZXN0X2luZm8ubmFtZSgpLAotICAgICAgICAgICAgIHN0cnNpZ25hbChtVGVybVNpZ25hbCkpOwotICAgIH0KLQotICAgIC8vVE9ETzogb3ZlcmxvYWQgdGhlIGRlZmF1bHQgZXZlbnQgbGlzdGVuZXIgdG8gc3VwcHJlc3MgdGhpcyBtZXNzYWdlCi0gICAgLy8gZHluYW1pY2FsbHkgKGUuZy4gYnkgc2tpcHBpbmcgT25UZXN0UGFydFJlc3VsdCBhZnRlciBPblRlc3RFbmQgKQotCi0gICAgLy8gdHJpZ2dlciBhIHRlc3QgZmFpbHVyZSBpZiB0aGUgY2hpbGQgaGFzIGZhaWxlZAotICAgIGlmICghbUhhc1N1Y2NlZWRlZCkgewotICAgICAgICBBRERfRkFJTFVSRSgpOwotICAgIH0KLSAgICBtVGVybVNpZ25hbCA9IDA7Ci19Ci0KLQotfQotfQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEyL1Rlc3RGb3JrZXJFdmVudExpc3RlbmVyLmggYi90ZXN0cy9jYW1lcmEyL1Rlc3RGb3JrZXJFdmVudExpc3RlbmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0N2EwNmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY2FtZXJhMi9UZXN0Rm9ya2VyRXZlbnRMaXN0ZW5lci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19BTkRST0lEX0hBTF9DQU1FUkEyX1RFU1RTX0ZPUktFUl9FVkVOVF9MSVNURU5FUl9fCi0jZGVmaW5lIF9fQU5EUk9JRF9IQUxfQ0FNRVJBMl9URVNUU19GT1JLRVJfRVZFTlRfTElTVEVORVJfXwotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGNhbWVyYTIgewotbmFtZXNwYWNlIHRlc3RzIHsKLQotLy8gRm9yayBiZWZvcmUgZWFjaCB0ZXN0IHJ1bnMuCi1jbGFzcyBUZXN0Rm9ya2VyRXZlbnRMaXN0ZW5lciA6IHB1YmxpYyA6OnRlc3Rpbmc6OkVtcHR5VGVzdEV2ZW50TGlzdGVuZXIgewotCi1wdWJsaWM6Ci0KLSAgICBUZXN0Rm9ya2VyRXZlbnRMaXN0ZW5lcigpOwotCi1wcml2YXRlOgotCi0gICAgLy8gQ2FsbGVkIGJlZm9yZSBhIHRlc3Qgc3RhcnRzLgotICAgIHZpcnR1YWwgdm9pZCBPblRlc3RTdGFydChjb25zdCA6OnRlc3Rpbmc6OlRlc3RJbmZvJiB0ZXN0X2luZm8pOwotCi0gICAgLy8gQ2FsbGVkIGFmdGVyIGEgZmFpbGVkIGFzc2VydGlvbiBvciBhIFNVQ0NFRUQoKSBpbnZvY2F0aW9uLgotICAgIHZpcnR1YWwgdm9pZCBPblRlc3RQYXJ0UmVzdWx0KAotICAgICAgICBjb25zdCA6OnRlc3Rpbmc6OlRlc3RQYXJ0UmVzdWx0JiB0ZXN0X3BhcnRfcmVzdWx0KTsKLQotICAgIC8vIENhbGxlZCBhZnRlciBhIHRlc3QgZW5kcy4KLSAgICB2aXJ0dWFsIHZvaWQgT25UZXN0RW5kKGNvbnN0IDo6dGVzdGluZzo6VGVzdEluZm8mIHRlc3RfaW5mbyk7Ci0KLSAgICBib29sIG1IYXNTdWNjZWVkZWQ7Ci0gICAgaW50IG1UZXJtU2lnbmFsOwotCi1wdWJsaWM6Ci0gICAgLy8gZG8gbm90IHJlYWQgZGlyZWN0bHkuIHVzZSBURVNUX0VYVEVOU0lPTiBtYWNyb3MgaW5zdGVhZAotICAgIHN0YXRpYyBib29sIG1Jc0ZvcmtlZDsKLX07Ci0KLX0KLX0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEyL1Rlc3RTZXR0aW5ncy5jcHAgYi90ZXN0cy9jYW1lcmEyL1Rlc3RTZXR0aW5ncy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwN2FkYzguLjAwMDAwMDAKLS0tIGEvdGVzdHMvY2FtZXJhMi9UZXN0U2V0dGluZ3MuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y3N0ZGxpYj4KLSNpbmNsdWRlIDxnZXRvcHQuaD4KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0jaW5jbHVkZSAiVGVzdFNldHRpbmdzLmgiCi0KLSNpbmNsdWRlICJUZXN0Rm9ya2VyRXZlbnRMaXN0ZW5lci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgY2FtZXJhMiB7Ci1uYW1lc3BhY2UgdGVzdHMgewotCi1ib29sIFRlc3RTZXR0aW5nczo6bUZvcmtpbmdEaXNhYmxlZCAgICAgPSBmYWxzZTsKLWludCAgVGVzdFNldHRpbmdzOjptRGV2aWNlSWQgICAgICAgICAgICA9IDA7Ci1jaGFyKiBjb25zdCogVGVzdFNldHRpbmdzOjptQXJndjsKLQotLy8gLS1mb3JraW5nLWRpc2FibGVkLCBmYWxzZSBieSBkZWZhdWx0Ci1ib29sIFRlc3RTZXR0aW5nczo6Rm9ya2luZ0Rpc2FibGVkKCkgewotICAgIHJldHVybiBtRm9ya2luZ0Rpc2FibGVkOwotfQotCi0vLyByZXZlcnNlIG9mIC0tZm9ya2luZy1kaXNhYmxlZCAobm90IGEgZmxhZyksIHRydWUgYnkgZGVmYXVsdAotYm9vbCBUZXN0U2V0dGluZ3M6OkZvcmtpbmdFbmFibGVkKCkgewotICAgIHJldHVybiAhRm9ya2luZ0Rpc2FibGVkKCk7Ci19Ci0KLS8vIC0tZGV2aWNlLWlkLCAwIGJ5IGRlZmF1bHQKLWludCBUZXN0U2V0dGluZ3M6OkRldmljZUlkKCkgewotICAgIHJldHVybiBtRGV2aWNlSWQ7Ci19Ci0KLS8vIHJldHVybnMgZmFsc2UgaWYgdXNhZ2Ugc2hvdWxkIGJlIHByaW50ZWQgYW5kIHdlIHNob3VsZCBleGl0IGVhcmx5Ci1ib29sIFRlc3RTZXR0aW5nczo6UGFyc2VBcmdzKGludCBhcmdjLCBjaGFyKiBjb25zdCBhcmd2W10pCi17Ci0gICAgewotICAgICAgICBjaGFyICplbnYgPSBnZXRlbnYoIkNBTUVSQTJfVEVTVF9GT1JLSU5HX0RJU0FCTEVEIik7Ci0gICAgICAgIGlmIChlbnYpIHsKLSAgICAgICAgICAgIG1Gb3JraW5nRGlzYWJsZWQgPSBhdG9pKGVudik7Ci0gICAgICAgIH0KLQotICAgICAgICBlbnYgPSBnZXRlbnYoIkNBTUVSQTJfVEVTVF9ERVZJQ0VfSUQiKTsKLSAgICAgICAgaWYgKGVudikgewotICAgICAgICAgICAgbURldmljZUlkID0gYXRvaShlbnYpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9vbCBwcmludEhlbHAgPSBmYWxzZTsKLSAgICBib29sIHVua25vd25BcmdzID0gZmFsc2U7Ci0KLSAgICBvcHRlcnIgPSAwOyAvLyBkbyBub3QgcHJpbnQgZXJyb3JzIGZvciB1bmtub3duIGFyZ3VtZW50cwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIGludCBjOwotICAgICAgICBpbnQgb3B0aW9uX2luZGV4ID0gMDsKLQotICAgICAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKLSAgICAgICAgICAgIC8qIG5hbWUgICAgICAgICAgICAgIGhhc19hcmcgICAgICAgICAgZmxhZyB2YWwgKi8KLSAgICAgICAgICAgIHsiZm9ya2luZy1kaXNhYmxlZCIsIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCAgMCAgfSwKLSAgICAgICAgICAgIHsiZGV2aWNlLWlkIiwgICAgICAgIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAgMCAgfSwKLSAgICAgICAgICAgIHsiaGVscCIsICAgICAgICAgICAgIG5vX2FyZ3VtZW50LCAgICAgICAwLCAnaCcgfSwKLSAgICAgICAgICAgIHswLCAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAwLCAgMCAgfQotICAgICAgICB9OwotCi0gICAgICAgIC8vIE5vdGU6ICcrJyBpbiBvcHRzdHJpbmcgbWVhbnMgZG8gbm90IG11dGF0ZSBhcmd2Ci0gICAgICAgIGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiK2giLCBsb25nX29wdGlvbnMsICZvcHRpb25faW5kZXgpOwotCi0gICAgICAgIGlmIChjID09IC0xKSB7IC8vIEFsbCBhcmd1bWVudHMgZXhoYXVzdGVkCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoYyA9PSAnPycpIHsgLy8gQXJndW1lbnQgbm90IGluIG9wdGlvbiBsaXN0cwotICAgICAgICAgICAgY29uc3QgY2hhciAqYXJnID0gYXJndltvcHRpbmQtMV07Ci0gICAgICAgICAgICAvLyBBbnl0aGluZyBiZWdpbm5pbmcgd2l0aCBndGVzdF8gd2lsbCBnZXQgaGFuZGxlZCBieSBndGVzdAotICAgICAgICAgICAgaWYgKHN0cnN0cihhcmcsICItLWd0ZXN0XyIpICE9IGFyZykgewotICAgICAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiVW5rbm93biBhcmd1bWVudDogIiA8PCBhcmcgPDwgc3RkOjplbmRsOwotICAgICAgICAgICAgICAgIHVua25vd25BcmdzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChjKSB7Ci0gICAgICAgIGNhc2UgMDogLy8gbG9uZyBvcHRpb24KLSAgICAgICAgICAgIHN3aXRjaCAob3B0aW9uX2luZGV4KSB7Ci0gICAgICAgICAgICBjYXNlIDA6IHsKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphcmcgPSBvcHRhcmcgPzogIjEiOwotICAgICAgICAgICAgICAgIG1Gb3JraW5nRGlzYWJsZWQgPSBhdG9pKGFyZyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIDE6IHsKLSAgICAgICAgICAgICAgICBtRGV2aWNlSWQgPSBhdG9pKG9wdGFyZyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiVW5rbm93biBsb25nIG9wdGlvbjogIiA8PCBvcHRpb25faW5kZXggPDwgc3RkOjplbmRsOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7IC8vIGNhc2UgMAotICAgICAgICBjYXNlICdoJzogLy8gaGVscAotICAgICAgICAgICAgcHJpbnRIZWxwID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAvLyBjYXNlICc/JwotICAgICAgICAgICAgc3RkOjpjZXJyIDw8ICJVbmtub3duIG9wdGlvbjogIiA8PCBvcHRhcmcgPDwgc3RkOjplbmRsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHVua25vd25BcmdzKSB7Ci0gICAgICAgIHN0ZDo6Y2VyciA8PCBzdGQ6OmVuZGw7Ci0gICAgfQotCi0gICAgbUFyZ3YgPSBhcmd2OwotCi0gICAgaWYgKHByaW50SGVscCB8fCB1bmtub3duQXJncykgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc3RkOjpjZXJyIDw8ICJGb3JraW5nIERpc2FibGVkOiAiCi0gICAgICAgICAgICAgIDw8IChtRm9ya2luZ0Rpc2FibGVkID8gInllcyIgOiAibm8iKSA8PCBzdGQ6OmVuZGw7Ci0KLSAgICBzdGQ6OmNlcnIgPDwgIkRldmljZSBJRDogIiA8PCBtRGV2aWNlSWQgPDwgc3RkOjplbmRsOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIHByaW50IHVzYWdlL2hlbHAgbGlzdCBvZiBjb21tYW5kcyAobm9uLWd0ZXN0KQotdm9pZCBUZXN0U2V0dGluZ3M6OlByaW50VXNhZ2UoKSB7Ci0gICAgc3RkOjpjZXJyIDw8ICJVc2FnZTogIiA8PCBtQXJndlswXSA8PCAiIFtPUFRJT05TXSIgPDwgc3RkOjplbmRsOwotICAgIHN0ZDo6Y2VyciA8PCBzdGQ6OmVuZGw7Ci0KLSAgICBzdGQ6OmNlcnIgPDwgIk1haW4gbW9kZXMgb2Ygb3BlcmF0aW9uOiIKLSAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOwotICAgIHN0ZDo6Y2VyciA8PCAiICAgLS1mb3JraW5nLWRpc2FibGVkWz0xXSAgZG9uJ3QgZm9yayBwcm9jZXNzIGJlZm9yZSAiCi0gICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbAotICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyBhIG5ldyB0ZXN0LiIKLSAgICAgICAgICAgICAgPDwgc3RkOjplbmRsCi0gICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCBlbmFibGVkKSIKLSAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOwotICAgIHN0ZDo6Y2VyciA8PCAiICAgLS1kZXZpY2UtaWQ9SUQgICAgICAgICAgc3BlY2lmeSBhIGRpZmZlcmVudCBjYW1lcmEgSUQiCi0gICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbAotICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgMCkiCi0gICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKLQotICAgIHN0ZDo6Y2VyciA8PCAiICAgLWgsIC0taGVscCAgICAgICAgICAgICAgcHJpbnQgdGhpcyBoZWxwIGxpc3RpbmciCi0gICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKLQotCi0gICAgc3RkOjpjZXJyIDw8IHN0ZDo6ZW5kbDsKLX0KLQotfQotfQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEyL1Rlc3RTZXR0aW5ncy5oIGIvdGVzdHMvY2FtZXJhMi9UZXN0U2V0dGluZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE2NGRlNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9jYW1lcmEyL1Rlc3RTZXR0aW5ncy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLTpxYQotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX0FORFJPSURfSEFMX0NBTUVSQTJfVEVTVFNfU0VUVElOR1NfXwotI2RlZmluZSBfX0FORFJPSURfSEFMX0NBTUVSQTJfVEVTVFNfU0VUVElOR1NfXwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgY2FtZXJhMiB7Ci1uYW1lc3BhY2UgdGVzdHMgewotCi1jbGFzcyBUZXN0U2V0dGluZ3MgewotCi1wdWJsaWM6Ci0gICAgLy8gLS1mb3JraW5nLWRpc2FibGVkLCBmYWxzZSBieSBkZWZhdWx0Ci0gICAgc3RhdGljIGJvb2wgRm9ya2luZ0Rpc2FibGVkKCk7Ci0KLSAgICAvLyByZXZlcnNlIG9mIC0tZm9ya2luZy1kaXNhYmxlZCAobm90IGEgZmxhZyksIHRydWUgYnkgZGVmYXVsdAotICAgIHN0YXRpYyBib29sIEZvcmtpbmdFbmFibGVkKCk7Ci0KLSAgICAvLyAtLWRldmljZS1pZCwgMCBieSBkZWZhdWx0Ci0gICAgc3RhdGljIGludCBEZXZpY2VJZCgpOwotCi0gICAgLy8gcmV0dXJucyBmYWxzZSBpZiB1c2FnZSBzaG91bGQgYmUgcHJpbnRlZCBhbmQgd2Ugc2hvdWxkIGV4aXQgZWFybHkKLSAgICBzdGF0aWMgYm9vbCBQYXJzZUFyZ3MoaW50IGFyZ2MsIGNoYXIqIGNvbnN0IGFyZ3ZbXSk7Ci0KLSAgICAvLyBwcmludCB1c2FnZS9oZWxwIGxpc3Qgb2YgY29tbWFuZHMgKG5vbi1ndGVzdCkKLSAgICBzdGF0aWMgdm9pZCBQcmludFVzYWdlKCk7Ci0KLXByaXZhdGU6Ci0gICAgVGVzdFNldHRpbmdzKCk7Ci0gICAgflRlc3RTZXR0aW5ncygpOwotCi0gICAgc3RhdGljIGJvb2wgbUZvcmtpbmdEaXNhYmxlZDsKLSAgICBzdGF0aWMgaW50ICBtRGV2aWNlSWQ7Ci0gICAgc3RhdGljIGNoYXIqIGNvbnN0KiBtQXJndjsKLX07Ci0KLX0KLX0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEyL2NhbWVyYTJfdXRpbHMuY3BwIGIvdGVzdHMvY2FtZXJhMi9jYW1lcmEyX3V0aWxzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFiMGFlOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9jYW1lcmEyL2NhbWVyYTJfdXRpbHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjA5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBVdGlsaXR5IGNsYXNzZXMgZm9yIGNhbWVyYTIgSEFMIHRlc3RpbmcKLQotI2RlZmluZSBMT0dfVEFHICJDYW1lcmEyX3Rlc3RfdXRpbHMiCi0jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0jaW5jbHVkZSAiY2FtZXJhMl91dGlscy5oIgotI2luY2x1ZGUgPGRsZmNuLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBjYW1lcmEyIHsKLW5hbWVzcGFjZSB0ZXN0cyB7Ci0KLS8qKgotICogTWV0YWRhdGFRdWV1ZQotICovCi0KLU1ldGFkYXRhUXVldWU6Ok1ldGFkYXRhUXVldWUoKToKLSAgICAgICAgICAgIG1EZXZpY2UoTlVMTCksCi0gICAgICAgICAgICBtRnJhbWVDb3VudCgwKSwKLSAgICAgICAgICAgIG1Db3VudCgwKSwKLSAgICAgICAgICAgIG1TdHJlYW1TbG90Q291bnQoMCksCi0gICAgICAgICAgICBtU2lnbmFsQ29uc3VtZXIodHJ1ZSkKLXsKLSAgICBjYW1lcmEyX3JlcXVlc3RfcXVldWVfc3JjX29wczo6ZGVxdWV1ZV9yZXF1ZXN0ID0gY29uc3VtZXJfZGVxdWV1ZTsKLSAgICBjYW1lcmEyX3JlcXVlc3RfcXVldWVfc3JjX29wczo6cmVxdWVzdF9jb3VudCA9IGNvbnN1bWVyX2J1ZmZlcl9jb3VudDsKLSAgICBjYW1lcmEyX3JlcXVlc3RfcXVldWVfc3JjX29wczo6ZnJlZV9yZXF1ZXN0ID0gY29uc3VtZXJfZnJlZTsKLQotICAgIGNhbWVyYTJfZnJhbWVfcXVldWVfZHN0X29wczo6ZGVxdWV1ZV9mcmFtZSA9IHByb2R1Y2VyX2RlcXVldWU7Ci0gICAgY2FtZXJhMl9mcmFtZV9xdWV1ZV9kc3Rfb3BzOjpjYW5jZWxfZnJhbWUgPSBwcm9kdWNlcl9jYW5jZWw7Ci0gICAgY2FtZXJhMl9mcmFtZV9xdWV1ZV9kc3Rfb3BzOjplbnF1ZXVlX2ZyYW1lID0gcHJvZHVjZXJfZW5xdWV1ZTsKLX0KLQotTWV0YWRhdGFRdWV1ZTo6fk1ldGFkYXRhUXVldWUoKSB7Ci0gICAgZnJlZUJ1ZmZlcnMobUVudHJpZXMuYmVnaW4oKSwgbUVudHJpZXMuZW5kKCkpOwotICAgIGZyZWVCdWZmZXJzKG1TdHJlYW1TbG90LmJlZ2luKCksIG1TdHJlYW1TbG90LmVuZCgpKTsKLX0KLQotLy8gSW50ZXJmYWNlIHRvIGNhbWVyYTIgSEFMIGFzIGNvbnN1bWVyIChpbnB1dCByZXF1ZXN0cy9yZXByb2Nlc3NpbmcpCi1jb25zdCBjYW1lcmEyX3JlcXVlc3RfcXVldWVfc3JjX29wc190KiBNZXRhZGF0YVF1ZXVlOjpnZXRUb0NvbnN1bWVySW50ZXJmYWNlKCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxjYW1lcmEyX3JlcXVlc3RfcXVldWVfc3JjX29wc190Kj4odGhpcyk7Ci19Ci0KLXZvaWQgTWV0YWRhdGFRdWV1ZTo6c2V0RnJvbUNvbnN1bWVySW50ZXJmYWNlKGNhbWVyYTJfZGV2aWNlX3QgKmQpIHsKLSAgICBtRGV2aWNlID0gZDsKLX0KLQotY29uc3QgY2FtZXJhMl9mcmFtZV9xdWV1ZV9kc3Rfb3BzX3QqIE1ldGFkYXRhUXVldWU6OmdldFRvUHJvZHVjZXJJbnRlcmZhY2UoKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGNhbWVyYTJfZnJhbWVfcXVldWVfZHN0X29wc190Kj4odGhpcyk7Ci19Ci0KLS8vIFJlYWwgaW50ZXJmYWNlcwotc3RhdHVzX3QgTWV0YWRhdGFRdWV1ZTo6ZW5xdWV1ZShjYW1lcmFfbWV0YWRhdGFfdCAqYnVmKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKLQotICAgIG1Db3VudCsrOwotICAgIG1FbnRyaWVzLnB1c2hfYmFjayhidWYpOwotICAgIG5vdEVtcHR5LnNpZ25hbCgpOwotCi0gICAgaWYgKG1TaWduYWxDb25zdW1lciAmJiBtRGV2aWNlICE9IE5VTEwpIHsKLSAgICAgICAgbVNpZ25hbENvbnN1bWVyID0gZmFsc2U7Ci0KLSAgICAgICAgbU11dGV4LnVubG9jaygpOwotICAgICAgICBBTE9HVigiJXM6IFNpZ25hbGluZyBjb25zdW1lciIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIG1EZXZpY2UtPm9wcy0+bm90aWZ5X3JlcXVlc3RfcXVldWVfbm90X2VtcHR5KG1EZXZpY2UpOwotICAgICAgICBtTXV0ZXgubG9jaygpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLWludCBNZXRhZGF0YVF1ZXVlOjpnZXRCdWZmZXJDb3VudCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOwotICAgIGlmIChtU3RyZWFtU2xvdENvdW50ID4gMCkgewotICAgICAgICByZXR1cm4gQ0FNRVJBMl9SRVFVRVNUX1FVRVVFX0lTX0JPVFRPTUxFU1M7Ci0gICAgfQotICAgIHJldHVybiBtQ291bnQ7Ci19Ci0KLXN0YXR1c190IE1ldGFkYXRhUXVldWU6OmRlcXVldWUoY2FtZXJhX21ldGFkYXRhX3QgKipidWYsIGJvb2wgaW5jcmVtZW50Q291bnQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOwotCi0gICAgaWYgKG1Db3VudCA9PSAwKSB7Ci0gICAgICAgIGlmIChtU3RyZWFtU2xvdENvdW50ID09IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCIlczogRW1wdHkiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgKmJ1ZiA9IE5VTEw7Ci0gICAgICAgICAgICBtU2lnbmFsQ29uc3VtZXIgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCIlczogU3RyZWFtaW5nICVkIGZyYW1lcyB0byBxdWV1ZSIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgbVN0cmVhbVNsb3RDb3VudCk7Ci0KLSAgICAgICAgZm9yIChMaXN0PGNhbWVyYV9tZXRhZGF0YV90Kj46Oml0ZXJhdG9yIHNsb3RFbnRyeSA9IG1TdHJlYW1TbG90LmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgc2xvdEVudHJ5ICE9IG1TdHJlYW1TbG90LmVuZCgpOwotICAgICAgICAgICAgICAgIHNsb3RFbnRyeSsrICkgewotICAgICAgICAgICAgc2l6ZV90IGVudHJpZXMgPSBnZXRfY2FtZXJhX21ldGFkYXRhX2VudHJ5X2NvdW50KCpzbG90RW50cnkpOwotICAgICAgICAgICAgc2l6ZV90IGRhdGFCeXRlcyA9IGdldF9jYW1lcmFfbWV0YWRhdGFfZGF0YV9jb3VudCgqc2xvdEVudHJ5KTsKLQotICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QgKmNvcHkgPSBhbGxvY2F0ZV9jYW1lcmFfbWV0YWRhdGEoZW50cmllcywgZGF0YUJ5dGVzKTsKLSAgICAgICAgICAgIGFwcGVuZF9jYW1lcmFfbWV0YWRhdGEoY29weSwgKnNsb3RFbnRyeSk7Ci0gICAgICAgICAgICBtRW50cmllcy5wdXNoX2JhY2soY29weSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUNvdW50ID0gbVN0cmVhbVNsb3RDb3VudDsKLSAgICB9Ci0gICAgQUxPR1YoIk1ldGFkYXRhUXVldWU6IGRlcXVlICglZCBidWZmZXJzKSIsIG1Db3VudCk7Ci0gICAgY2FtZXJhX21ldGFkYXRhX3QgKmIgPSAqKG1FbnRyaWVzLmJlZ2luKCkpOwotICAgIG1FbnRyaWVzLmVyYXNlKG1FbnRyaWVzLmJlZ2luKCkpOwotCi0gICAgaWYgKGluY3JlbWVudENvdW50KSB7Ci0gICAgICAgIGFkZF9jYW1lcmFfbWV0YWRhdGFfZW50cnkoYiwKLSAgICAgICAgICAgICAgICBBTkRST0lEX1JFUVVFU1RfRlJBTUVfQ09VTlQsCi0gICAgICAgICAgICAgICAgKHZvaWQqKikmbUZyYW1lQ291bnQsIDEpOwotICAgICAgICBtRnJhbWVDb3VudCsrOwotICAgIH0KLQotICAgICpidWYgPSBiOwotICAgIG1Db3VudC0tOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNZXRhZGF0YVF1ZXVlOjp3YWl0Rm9yQnVmZmVyKG5zZWNzX3QgdGltZW91dCkgewotICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7Ci0gICAgc3RhdHVzX3QgcmVzOwotICAgIHdoaWxlIChtQ291bnQgPT0gMCkgewotICAgICAgICByZXMgPSBub3RFbXB0eS53YWl0UmVsYXRpdmUobU11dGV4LHRpbWVvdXQpOwotICAgICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE1ldGFkYXRhUXVldWU6OnNldFN0cmVhbVNsb3QoY2FtZXJhX21ldGFkYXRhX3QgKmJ1ZikgewotICAgIGlmIChidWYgPT0gTlVMTCkgewotICAgICAgICBmcmVlQnVmZmVycyhtU3RyZWFtU2xvdC5iZWdpbigpLCBtU3RyZWFtU2xvdC5lbmQoKSk7Ci0gICAgICAgIG1TdHJlYW1TbG90Q291bnQgPSAwOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotICAgIGlmIChtU3RyZWFtU2xvdENvdW50ID4gMSkgewotICAgICAgICBMaXN0PGNhbWVyYV9tZXRhZGF0YV90Kj46Oml0ZXJhdG9yIGRlbGV0ZXIgPSArK21TdHJlYW1TbG90LmJlZ2luKCk7Ci0gICAgICAgIGZyZWVCdWZmZXJzKCsrbVN0cmVhbVNsb3QuYmVnaW4oKSwgbVN0cmVhbVNsb3QuZW5kKCkpOwotICAgICAgICBtU3RyZWFtU2xvdENvdW50ID0gMTsKLSAgICB9Ci0gICAgaWYgKG1TdHJlYW1TbG90Q291bnQgPT0gMSkgewotICAgICAgICBmcmVlX2NhbWVyYV9tZXRhZGF0YSggKihtU3RyZWFtU2xvdC5iZWdpbigpKSApOwotICAgICAgICAqKG1TdHJlYW1TbG90LmJlZ2luKCkpID0gYnVmOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1TdHJlYW1TbG90LnB1c2hfZnJvbnQoYnVmKTsKLSAgICAgICAgbVN0cmVhbVNsb3RDb3VudCA9IDE7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTWV0YWRhdGFRdWV1ZTo6c2V0U3RyZWFtU2xvdChjb25zdCBMaXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4gJmJ1ZnMpIHsKLSAgICBpZiAobVN0cmVhbVNsb3RDb3VudCA+IDApIHsKLSAgICAgICAgZnJlZUJ1ZmZlcnMobVN0cmVhbVNsb3QuYmVnaW4oKSwgbVN0cmVhbVNsb3QuZW5kKCkpOwotICAgIH0KLSAgICBtU3RyZWFtU2xvdCA9IGJ1ZnM7Ci0gICAgbVN0cmVhbVNsb3RDb3VudCA9IG1TdHJlYW1TbG90LnNpemUoKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTWV0YWRhdGFRdWV1ZTo6ZnJlZUJ1ZmZlcnMoTGlzdDxjYW1lcmFfbWV0YWRhdGFfdCo+OjppdGVyYXRvciBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExpc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPjo6aXRlcmF0b3ImIGVuZCkgewotICAgIHdoaWxlIChzdGFydCAhPSBlbmQpIHsKLSAgICAgICAgZnJlZV9jYW1lcmFfbWV0YWRhdGEoKnN0YXJ0KTsKLSAgICAgICAgc3RhcnQgPSBtU3RyZWFtU2xvdC5lcmFzZShzdGFydCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotTWV0YWRhdGFRdWV1ZSogTWV0YWRhdGFRdWV1ZTo6Z2V0SW5zdGFuY2UoCi0gICAgICAgIGNvbnN0IGNhbWVyYTJfcmVxdWVzdF9xdWV1ZV9zcmNfb3BzX3QgKnEpIHsKLSAgICBjb25zdCBNZXRhZGF0YVF1ZXVlKiBjbXEgPSBzdGF0aWNfY2FzdDxjb25zdCBNZXRhZGF0YVF1ZXVlKj4ocSk7Ci0gICAgcmV0dXJuIGNvbnN0X2Nhc3Q8TWV0YWRhdGFRdWV1ZSo+KGNtcSk7Ci19Ci0KLU1ldGFkYXRhUXVldWUqIE1ldGFkYXRhUXVldWU6OmdldEluc3RhbmNlKAotICAgICAgICBjb25zdCBjYW1lcmEyX2ZyYW1lX3F1ZXVlX2RzdF9vcHNfdCAqcSkgewotICAgIGNvbnN0IE1ldGFkYXRhUXVldWUqIGNtcSA9IHN0YXRpY19jYXN0PGNvbnN0IE1ldGFkYXRhUXVldWUqPihxKTsKLSAgICByZXR1cm4gY29uc3RfY2FzdDxNZXRhZGF0YVF1ZXVlKj4oY21xKTsKLX0KLQotaW50IE1ldGFkYXRhUXVldWU6OmNvbnN1bWVyX2J1ZmZlcl9jb3VudCgKLSAgICAgICAgY29uc3QgY2FtZXJhMl9yZXF1ZXN0X3F1ZXVlX3NyY19vcHNfdCAqcSkgewotICAgIE1ldGFkYXRhUXVldWUgKnF1ZXVlID0gZ2V0SW5zdGFuY2UocSk7Ci0gICAgcmV0dXJuIHF1ZXVlLT5nZXRCdWZmZXJDb3VudCgpOwotfQotCi1pbnQgTWV0YWRhdGFRdWV1ZTo6Y29uc3VtZXJfZGVxdWV1ZShjb25zdCBjYW1lcmEyX3JlcXVlc3RfcXVldWVfc3JjX29wc190ICpxLAotICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCAqKmJ1ZmZlcikgewotICAgIE1ldGFkYXRhUXVldWUgKnF1ZXVlID0gZ2V0SW5zdGFuY2UocSk7Ci0gICAgcmV0dXJuIHF1ZXVlLT5kZXF1ZXVlKGJ1ZmZlciwgdHJ1ZSk7Ci19Ci0KLWludCBNZXRhZGF0YVF1ZXVlOjpjb25zdW1lcl9mcmVlKGNvbnN0IGNhbWVyYTJfcmVxdWVzdF9xdWV1ZV9zcmNfb3BzX3QgKiAvKiBxICovLAotICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCAqb2xkX2J1ZmZlcikgewotICAgIGZyZWVfY2FtZXJhX21ldGFkYXRhKG9sZF9idWZmZXIpOwotICAgIHJldHVybiBPSzsKLX0KLQotaW50IE1ldGFkYXRhUXVldWU6OnByb2R1Y2VyX2RlcXVldWUoY29uc3QgY2FtZXJhMl9mcmFtZV9xdWV1ZV9kc3Rfb3BzX3QgKiAvKiBxICovLAotICAgICAgICBzaXplX3QgZW50cmllcywgc2l6ZV90IGJ5dGVzLAotICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCAqKmJ1ZmZlcikgewotICAgIGNhbWVyYV9tZXRhZGF0YV90ICpuZXdfYnVmZmVyID0KLSAgICAgICAgICAgIGFsbG9jYXRlX2NhbWVyYV9tZXRhZGF0YShlbnRyaWVzLCBieXRlcyk7Ci0gICAgaWYgKG5ld19idWZmZXIgPT0gTlVMTCkgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAqYnVmZmVyID0gbmV3X2J1ZmZlcjsKLSAgICAgICAgcmV0dXJuIE9LOwotfQotCi1pbnQgTWV0YWRhdGFRdWV1ZTo6cHJvZHVjZXJfY2FuY2VsKGNvbnN0IGNhbWVyYTJfZnJhbWVfcXVldWVfZHN0X29wc190ICogLyogcSAqLywKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QgKm9sZF9idWZmZXIpIHsKLSAgICBmcmVlX2NhbWVyYV9tZXRhZGF0YShvbGRfYnVmZmVyKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLWludCBNZXRhZGF0YVF1ZXVlOjpwcm9kdWNlcl9lbnF1ZXVlKGNvbnN0IGNhbWVyYTJfZnJhbWVfcXVldWVfZHN0X29wc190ICpxLAotICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCAqZmlsbGVkX2J1ZmZlcikgewotICAgIE1ldGFkYXRhUXVldWUgKnF1ZXVlID0gZ2V0SW5zdGFuY2UocSk7Ci0gICAgcmV0dXJuIHF1ZXVlLT5lbnF1ZXVlKGZpbGxlZF9idWZmZXIpOwotfQotCi0vKioKLSAqIE5vdGlmaWVyTGlzdGVuZXIKLSAqLwotCi1Ob3RpZmllckxpc3RlbmVyOjpOb3RpZmllckxpc3RlbmVyKCkgewotfQotCi1zdGF0dXNfdCBOb3RpZmllckxpc3RlbmVyOjpnZXROb3RpZmljYXRpb25zRnJvbShjYW1lcmEyX2RldmljZSAqZGV2KSB7Ci0gICAgaWYgKCFkZXYpIHJldHVybiBCQURfVkFMVUU7Ci0gICAgc3RhdHVzX3QgZXJyOwotICAgIGVyciA9IGRldi0+b3BzLT5zZXRfbm90aWZ5X2NhbGxiYWNrKGRldiwKLSAgICAgICAgICAgIG5vdGlmeV9jYWxsYmFja19kaXNwYXRjaCwKLSAgICAgICAgICAgICh2b2lkKil0aGlzKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBOb3RpZmllckxpc3RlbmVyOjpnZXROZXh0Tm90aWZpY2F0aW9uKGludDMyX3QgKm1zZ190eXBlLAotICAgICAgICBpbnQzMl90ICpleHQxLAotICAgICAgICBpbnQzMl90ICpleHQyLAotICAgICAgICBpbnQzMl90ICpleHQzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKLSAgICBpZiAobU5vdGlmaWNhdGlvbnMuc2l6ZSgpID09IDApIHJldHVybiBCQURfVkFMVUU7Ci0gICAgcmV0dXJuIGdldE5leHROb3RpZmljYXRpb25Mb2NrZWQobXNnX3R5cGUsIGV4dDEsIGV4dDIsIGV4dDMpOwotfQotCi1zdGF0dXNfdCBOb3RpZmllckxpc3RlbmVyOjp3YWl0Rm9yTm90aWZpY2F0aW9uKGludDMyX3QgKm1zZ190eXBlLAotICAgICAgICBpbnQzMl90ICpleHQxLAotICAgICAgICBpbnQzMl90ICpleHQyLAotICAgICAgICBpbnQzMl90ICpleHQzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKLSAgICB3aGlsZSAobU5vdGlmaWNhdGlvbnMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgbU5ld05vdGlmaWNhdGlvbi53YWl0KG1NdXRleCk7Ci0gICAgfQotICAgIHJldHVybiBnZXROZXh0Tm90aWZpY2F0aW9uTG9ja2VkKG1zZ190eXBlLCBleHQxLCBleHQyLCBleHQzKTsKLX0KLQotaW50IE5vdGlmaWVyTGlzdGVuZXI6Om51bU5vdGlmaWNhdGlvbnMoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKLSAgICByZXR1cm4gbU5vdGlmaWNhdGlvbnMuc2l6ZSgpOwotfQotCi1zdGF0dXNfdCBOb3RpZmllckxpc3RlbmVyOjpnZXROZXh0Tm90aWZpY2F0aW9uTG9ja2VkKGludDMyX3QgKm1zZ190eXBlLAotICAgICAgICBpbnQzMl90ICpleHQxLAotICAgICAgICBpbnQzMl90ICpleHQyLAotICAgICAgICBpbnQzMl90ICpleHQzKSB7Ci0gICAgKm1zZ190eXBlID0gbU5vdGlmaWNhdGlvbnMuYmVnaW4oKS0+bXNnX3R5cGU7Ci0gICAgKmV4dDEgPSBtTm90aWZpY2F0aW9ucy5iZWdpbigpLT5leHQxOwotICAgICpleHQyID0gbU5vdGlmaWNhdGlvbnMuYmVnaW4oKS0+ZXh0MjsKLSAgICAqZXh0MyA9IG1Ob3RpZmljYXRpb25zLmJlZ2luKCktPmV4dDM7Ci0gICAgbU5vdGlmaWNhdGlvbnMuZXJhc2UobU5vdGlmaWNhdGlvbnMuYmVnaW4oKSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIE5vdGlmaWVyTGlzdGVuZXI6Om9uTm90aWZ5KGludDMyX3QgbXNnX3R5cGUsCi0gICAgICAgIGludDMyX3QgZXh0MSwKLSAgICAgICAgaW50MzJfdCBleHQyLAotICAgICAgICBpbnQzMl90IGV4dDMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOwotICAgIG1Ob3RpZmljYXRpb25zLnB1c2hfYmFjayhOb3RpZmljYXRpb24obXNnX3R5cGUsIGV4dDEsIGV4dDIsIGV4dDMpKTsKLSAgICBtTmV3Tm90aWZpY2F0aW9uLnNpZ25hbCgpOwotfQotCi12b2lkIE5vdGlmaWVyTGlzdGVuZXI6Om5vdGlmeV9jYWxsYmFja19kaXNwYXRjaChpbnQzMl90IG1zZ190eXBlLAotICAgICAgICBpbnQzMl90IGV4dDEsCi0gICAgICAgIGludDMyX3QgZXh0MiwKLSAgICAgICAgaW50MzJfdCBleHQzLAotICAgICAgICB2b2lkICp1c2VyKSB7Ci0gICAgTm90aWZpZXJMaXN0ZW5lciAqbWUgPSByZWludGVycHJldF9jYXN0PE5vdGlmaWVyTGlzdGVuZXIqPih1c2VyKTsKLSAgICBtZS0+b25Ob3RpZnkobXNnX3R5cGUsIGV4dDEsIGV4dDIsIGV4dDMpOwotfQotCi0vKioKLSAqIFN0cmVhbUFkYXB0ZXIKLSAqLwotCi0jaWZuZGVmIGNvbnRhaW5lcl9vZgotI2RlZmluZSBjb250YWluZXJfb2YocHRyLCB0eXBlLCBtZW1iZXIpIFwKLSAgICAodHlwZSAqKSgoY2hhciopKHB0cikgLSBvZmZzZXRvZih0eXBlLCBtZW1iZXIpKQotI2VuZGlmCi0KLVN0cmVhbUFkYXB0ZXI6OlN0cmVhbUFkYXB0ZXIoc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gY29uc3VtZXIpOgotICAgICAgICBtU3RhdGUoVU5JTklUSUFMSVpFRCksIG1EZXZpY2UoTlVMTCksCi0gICAgICAgIG1JZCgtMSksCi0gICAgICAgIG1XaWR0aCgwKSwgbUhlaWdodCgwKSwgbUZvcm1hdCgwKQotewotICAgIG1Db25zdW1lckludGVyZmFjZSA9IG5ldyBTdXJmYWNlKGNvbnN1bWVyKTsKLSAgICBjYW1lcmEyX3N0cmVhbV9vcHM6OmRlcXVldWVfYnVmZmVyID0gZGVxdWV1ZV9idWZmZXI7Ci0gICAgY2FtZXJhMl9zdHJlYW1fb3BzOjplbnF1ZXVlX2J1ZmZlciA9IGVucXVldWVfYnVmZmVyOwotICAgIGNhbWVyYTJfc3RyZWFtX29wczo6Y2FuY2VsX2J1ZmZlciA9IGNhbmNlbF9idWZmZXI7Ci0gICAgY2FtZXJhMl9zdHJlYW1fb3BzOjpzZXRfY3JvcCA9IHNldF9jcm9wOwotfQotCi1TdHJlYW1BZGFwdGVyOjp+U3RyZWFtQWRhcHRlcigpIHsKLSAgICBkaXNjb25uZWN0KCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUFkYXB0ZXI6OmNvbm5lY3RUb0RldmljZShjYW1lcmEyX2RldmljZV90ICpkLAotICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0KSB7Ci0gICAgaWYgKG1TdGF0ZSAhPSBVTklOSVRJQUxJWkVEKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgaWYgKGQgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXM6IE51bGwgZGV2aWNlIHBhc3NlZCB0byBzdHJlYW0gYWRhcHRlciIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgcmVzOwotCi0gICAgbVdpZHRoID0gd2lkdGg7Ci0gICAgbUhlaWdodCA9IGhlaWdodDsKLSAgICBtRm9ybWF0ID0gZm9ybWF0OwotCi0gICAgLy8gQWxsb2NhdGUgZGV2aWNlLXNpZGUgc3RyZWFtIGludGVyZmFjZQotCi0gICAgdWludDMyX3QgaWQ7Ci0gICAgdWludDMyX3QgZm9ybWF0QWN0dWFsOyAvLyBpZ25vcmVkCi0gICAgdWludDMyX3QgdXNhZ2U7Ci0gICAgdWludDMyX3QgbWF4QnVmZmVycyA9IDI7Ci0gICAgcmVzID0gZC0+b3BzLT5hbGxvY2F0ZV9zdHJlYW0oZCwKLSAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCwgbUZvcm1hdCwgZ2V0U3RyZWFtT3BzKCksCi0gICAgICAgICAgICAmaWQsICZmb3JtYXRBY3R1YWwsICZ1c2FnZSwgJm1heEJ1ZmZlcnMpOwotICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBEZXZpY2Ugc3RyZWFtIGFsbG9jYXRpb24gZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICBtU3RhdGUgPSBVTklOSVRJQUxJWkVEOwotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLSAgICBtRGV2aWNlID0gZDsKLQotICAgIG1JZCA9IGlkOwotICAgIG1Vc2FnZSA9IHVzYWdlOwotICAgIG1NYXhQcm9kdWNlckJ1ZmZlcnMgPSBtYXhCdWZmZXJzOwotCi0gICAgLy8gQ29uZmlndXJlIGNvbnN1bWVyLXNpZGUgQU5hdGl2ZVdpbmRvdyBpbnRlcmZhY2UKLQotICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfYXBpX2Nvbm5lY3QobUNvbnN1bWVySW50ZXJmYWNlLmdldCgpLAotICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19BUElfQ0FNRVJBKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbm5lY3QgdG8gbmF0aXZlIHdpbmRvdyBmb3Igc3RyZWFtICVkIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCk7Ci0gICAgICAgIG1TdGF0ZSA9IEFMTE9DQVRFRDsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF91c2FnZShtQ29uc3VtZXJJbnRlcmZhY2UuZ2V0KCksIG1Vc2FnZSk7Ci0gICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgdXNhZ2UgJTA4eCBmb3Igc3RyZWFtICVkIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Vc2FnZSwgbUlkKTsKLSAgICAgICAgbVN0YXRlID0gQ09OTkVDVEVEOwotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGltZW5zaW9ucyhtQ29uc3VtZXJJbnRlcmZhY2UuZ2V0KCksCi0gICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOwotICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29uZmlndXJlIGJ1ZmZlciBkaW1lbnNpb25zIgotICAgICAgICAgICAgICAgICIgJWQgeCAlZCBmb3Igc3RyZWFtICVkIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1XaWR0aCwgbUhlaWdodCwgbUlkKTsKLSAgICAgICAgbVN0YXRlID0gQ09OTkVDVEVEOwotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLSAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2Zvcm1hdChtQ29uc3VtZXJJbnRlcmZhY2UuZ2V0KCksCi0gICAgICAgICAgICBtRm9ybWF0KTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbmZpZ3VyZSBidWZmZXIgZm9ybWF0IgotICAgICAgICAgICAgICAgICIgMHgleCBmb3Igc3RyZWFtICVkIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Gb3JtYXQsIG1JZCk7Ci0gICAgICAgIG1TdGF0ZSA9IENPTk5FQ1RFRDsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICBpbnQgbWF4Q29uc3VtZXJCdWZmZXJzOwotICAgIHJlcyA9IG1Db25zdW1lckludGVyZmFjZS0+cXVlcnkobUNvbnN1bWVySW50ZXJmYWNlLmdldCgpLAotICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19NSU5fVU5ERVFVRVVFRF9CVUZGRVJTLCAmbWF4Q29uc3VtZXJCdWZmZXJzKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHF1ZXJ5IGNvbnN1bWVyIHVuZGVxdWV1ZWQiCi0gICAgICAgICAgICAgICAgIiBidWZmZXIgY291bnQgZm9yIHN0cmVhbSAlZCIsIF9fRlVOQ1RJT05fXywgbUlkKTsKLSAgICAgICAgbVN0YXRlID0gQ09OTkVDVEVEOwotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLSAgICBtTWF4Q29uc3VtZXJCdWZmZXJzID0gbWF4Q29uc3VtZXJCdWZmZXJzOwotCi0gICAgQUxPR1YoIiVzOiBQcm9kdWNlciB3YW50cyAlZCBidWZmZXJzLCBjb25zdW1lciB3YW50cyAlZCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgIG1NYXhQcm9kdWNlckJ1ZmZlcnMsIG1NYXhDb25zdW1lckJ1ZmZlcnMpOwotCi0gICAgaW50IHRvdGFsQnVmZmVycyA9IG1NYXhDb25zdW1lckJ1ZmZlcnMgKyBtTWF4UHJvZHVjZXJCdWZmZXJzOwotCi0gICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KG1Db25zdW1lckludGVyZmFjZS5nZXQoKSwKLSAgICAgICAgICAgIHRvdGFsQnVmZmVycyk7Ci0gICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBzZXQgYnVmZmVyIGNvdW50IGZvciBzdHJlYW0gJWQiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkKTsKLSAgICAgICAgbVN0YXRlID0gQ09OTkVDVEVEOwotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIC8vIFJlZ2lzdGVyIGFsbG9jYXRlZCBidWZmZXJzIHdpdGggSEFMIGRldmljZQotICAgIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVycyA9IG5ldyBidWZmZXJfaGFuZGxlX3RbdG90YWxCdWZmZXJzXTsKLSAgICBBTmF0aXZlV2luZG93QnVmZmVyICoqYW53QnVmZmVycyA9IG5ldyBBTmF0aXZlV2luZG93QnVmZmVyKlt0b3RhbEJ1ZmZlcnNdOwotICAgIGludCBidWZmZXJJZHggPSAwOwotICAgIGZvciAoOyBidWZmZXJJZHggPCB0b3RhbEJ1ZmZlcnM7IGJ1ZmZlcklkeCsrKSB7Ci0gICAgICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfZGVxdWV1ZV9idWZmZXJfYW5kX3dhaXQobUNvbnN1bWVySW50ZXJmYWNlLmdldCgpLAotICAgICAgICAgICAgICAgICZhbndCdWZmZXJzW2J1ZmZlcklkeF0pOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBkZXF1ZXVlIGJ1ZmZlciAlZCBmb3IgaW5pdGlhbCByZWdpc3RyYXRpb24gZm9yIgotICAgICAgICAgICAgICAgICAgICAic3RyZWFtICVkIiwgX19GVU5DVElPTl9fLCBidWZmZXJJZHgsIG1JZCk7Ci0gICAgICAgICAgICBtU3RhdGUgPSBDT05ORUNURUQ7Ci0gICAgICAgICAgICBnb3RvIGNsZWFuVXBCdWZmZXJzOwotICAgICAgICB9Ci0gICAgICAgIGJ1ZmZlcnNbYnVmZmVySWR4XSA9IGFud0J1ZmZlcnNbYnVmZmVySWR4XS0+aGFuZGxlOwotICAgIH0KLQotICAgIHJlcyA9IG1EZXZpY2UtPm9wcy0+cmVnaXN0ZXJfc3RyZWFtX2J1ZmZlcnMobURldmljZSwKLSAgICAgICAgICAgIG1JZCwKLSAgICAgICAgICAgIHRvdGFsQnVmZmVycywKLSAgICAgICAgICAgIGJ1ZmZlcnMpOwotICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gcmVnaXN0ZXIgYnVmZmVycyB3aXRoIEhBTCBkZXZpY2UgZm9yIHN0cmVhbSAlZCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQpOwotICAgICAgICBtU3RhdGUgPSBDT05ORUNURUQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbVN0YXRlID0gQUNUSVZFOwotICAgIH0KLQotY2xlYW5VcEJ1ZmZlcnM6Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWZmZXJJZHg7IGkrKykgewotICAgICAgICByZXMgPSBtQ29uc3VtZXJJbnRlcmZhY2UtPmNhbmNlbEJ1ZmZlcihtQ29uc3VtZXJJbnRlcmZhY2UuZ2V0KCksCi0gICAgICAgICAgICAgICAgYW53QnVmZmVyc1tpXSwgLTEpOwotICAgIH0KLSAgICBkZWxldGVbXSBhbndCdWZmZXJzOwotICAgIGRlbGV0ZVtdIGJ1ZmZlcnM7Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1BZGFwdGVyOjpkaXNjb25uZWN0KCkgewotICAgIHN0YXR1c190IHJlczsKLSAgICBpZiAobVN0YXRlID49IEFMTE9DQVRFRCkgewotICAgICAgICByZXMgPSBtRGV2aWNlLT5vcHMtPnJlbGVhc2Vfc3RyZWFtKG1EZXZpY2UsIG1JZCk7Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHJlbGVhc2Ugc3RyZWFtICVkIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQpOwotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobVN0YXRlID49IENPTk5FQ1RFRCkgewotICAgICAgICByZXMgPSBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KG1Db25zdW1lckludGVyZmFjZS5nZXQoKSwKLSAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX0FQSV9DQU1FUkEpOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBkaXNjb25uZWN0IHN0cmVhbSAlZCBmcm9tIG5hdGl2ZSB3aW5kb3ciLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9Ci0gICAgfQotICAgIG1JZCA9IC0xOwotICAgIG1TdGF0ZSA9IERJU0NPTk5FQ1RFRDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLWludCBTdHJlYW1BZGFwdGVyOjpnZXRJZCgpIHsKLSAgICByZXR1cm4gbUlkOwotfQotCi1jb25zdCBjYW1lcmEyX3N0cmVhbV9vcHMgKlN0cmVhbUFkYXB0ZXI6OmdldFN0cmVhbU9wcygpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y2FtZXJhMl9zdHJlYW1fb3BzICo+KHRoaXMpOwotfQotCi1BTmF0aXZlV2luZG93KiBTdHJlYW1BZGFwdGVyOjp0b0FOVyhjb25zdCBjYW1lcmEyX3N0cmVhbV9vcHNfdCAqdykgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBTdHJlYW1BZGFwdGVyKj4odyktPm1Db25zdW1lckludGVyZmFjZS5nZXQoKTsKLX0KLQotaW50IFN0cmVhbUFkYXB0ZXI6OmRlcXVldWVfYnVmZmVyKGNvbnN0IGNhbWVyYTJfc3RyZWFtX29wc190ICp3LAotICAgICAgICBidWZmZXJfaGFuZGxlX3QqKiBidWZmZXIpIHsKLSAgICBpbnQgcmVzOwotICAgIGludCBzdGF0ZSA9IHN0YXRpY19jYXN0PGNvbnN0IFN0cmVhbUFkYXB0ZXIqPih3KS0+bVN0YXRlOwotICAgIGlmIChzdGF0ZSAhPSBBQ1RJVkUpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDYWxsZWQgd2hlbiBpbiBiYWQgc3RhdGU6ICVkIiwgX19GVU5DVElPTl9fLCBzdGF0ZSk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBBTmF0aXZlV2luZG93ICphID0gdG9BTlcodyk7Ci0gICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW5iOwotICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfZGVxdWV1ZV9idWZmZXJfYW5kX3dhaXQoYSwgJmFuYik7Ci0gICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKLQotICAgICpidWZmZXIgPSAmKGFuYi0+aGFuZGxlKTsKLQotICAgIHJldHVybiByZXM7Ci19Ci0KLWludCBTdHJlYW1BZGFwdGVyOjplbnF1ZXVlX2J1ZmZlcihjb25zdCBjYW1lcmEyX3N0cmVhbV9vcHNfdCogdywKLSAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAsCi0gICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCogYnVmZmVyKSB7Ci0gICAgaW50IHN0YXRlID0gc3RhdGljX2Nhc3Q8Y29uc3QgU3RyZWFtQWRhcHRlcio+KHcpLT5tU3RhdGU7Ci0gICAgaWYgKHN0YXRlICE9IEFDVElWRSkgewotICAgICAgICBBTE9HRSgiJXM6IENhbGxlZCB3aGVuIGluIGJhZCBzdGF0ZTogJWQiLCBfX0ZVTkNUSU9OX18sIHN0YXRlKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBBTmF0aXZlV2luZG93ICphID0gdG9BTlcodyk7Ci0gICAgc3RhdHVzX3QgZXJyOwotICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdGltZXN0YW1wKGEsIHRpbWVzdGFtcCk7Ci0gICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKLSAgICByZXR1cm4gYS0+cXVldWVCdWZmZXIoYSwKLSAgICAgICAgICAgIGNvbnRhaW5lcl9vZihidWZmZXIsIEFOYXRpdmVXaW5kb3dCdWZmZXIsIGhhbmRsZSksIC0xKTsKLX0KLQotaW50IFN0cmVhbUFkYXB0ZXI6OmNhbmNlbF9idWZmZXIoY29uc3QgY2FtZXJhMl9zdHJlYW1fb3BzX3QqIHcsCi0gICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCogYnVmZmVyKSB7Ci0gICAgaW50IHN0YXRlID0gc3RhdGljX2Nhc3Q8Y29uc3QgU3RyZWFtQWRhcHRlcio+KHcpLT5tU3RhdGU7Ci0gICAgaWYgKHN0YXRlICE9IEFDVElWRSkgewotICAgICAgICBBTE9HRSgiJXM6IENhbGxlZCB3aGVuIGluIGJhZCBzdGF0ZTogJWQiLCBfX0ZVTkNUSU9OX18sIHN0YXRlKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBBTmF0aXZlV2luZG93ICphID0gdG9BTlcodyk7Ci0gICAgcmV0dXJuIGEtPmNhbmNlbEJ1ZmZlcihhLAotICAgICAgICAgICAgY29udGFpbmVyX29mKGJ1ZmZlciwgQU5hdGl2ZVdpbmRvd0J1ZmZlciwgaGFuZGxlKSwgLTEpOwotfQotCi1pbnQgU3RyZWFtQWRhcHRlcjo6c2V0X2Nyb3AoY29uc3QgY2FtZXJhMl9zdHJlYW1fb3BzX3QqIHcsCi0gICAgICAgIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKLSAgICBpbnQgc3RhdGUgPSBzdGF0aWNfY2FzdDxjb25zdCBTdHJlYW1BZGFwdGVyKj4odyktPm1TdGF0ZTsKLSAgICBpZiAoc3RhdGUgIT0gQUNUSVZFKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FsbGVkIHdoZW4gaW4gYmFkIHN0YXRlOiAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdGUpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIEFOYXRpdmVXaW5kb3cgKmEgPSB0b0FOVyh3KTsKLSAgICBhbmRyb2lkX25hdGl2ZV9yZWN0X3QgY3JvcCA9IHsgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tIH07Ci0gICAgcmV0dXJuIG5hdGl2ZV93aW5kb3dfc2V0X2Nyb3AoYSwgJmNyb3ApOwotfQotCi0vKioKLSAqIEZyYW1lV2FpdGVyCi0gKi8KLQotRnJhbWVXYWl0ZXI6OkZyYW1lV2FpdGVyKCk6Ci0gICAgICAgIG1QZW5kaW5nRnJhbWVzKDApIHsKLX0KLQotc3RhdHVzX3QgRnJhbWVXYWl0ZXI6OndhaXRGb3JGcmFtZShuc2Vjc190IHRpbWVvdXQpIHsKLSAgICBzdGF0dXNfdCByZXM7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICB3aGlsZSAobVBlbmRpbmdGcmFtZXMgPT0gMCkgewotICAgICAgICByZXMgPSBtQ29uZGl0aW9uLndhaXRSZWxhdGl2ZShtTXV0ZXgsIHRpbWVvdXQpOwotICAgICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwotICAgIH0KLSAgICBtUGVuZGluZ0ZyYW1lcy0tOwotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBGcmFtZVdhaXRlcjo6b25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiAvKiBpdGVtICovKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICBtUGVuZGluZ0ZyYW1lcysrOwotICAgIG1Db25kaXRpb24uc2lnbmFsKCk7Ci19Ci0KLWludCBIV01vZHVsZUhlbHBlcnM6OmNsb3NlTW9kdWxlKHZvaWQgKmRzbykgewotICAgIGludCBzdGF0dXM7Ci0gICAgaWYgKCFkc28pIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgc3RhdHVzID0gZGxjbG9zZShkc28pOwotICAgIGlmIChzdGF0dXMgIT0gMCkgewotICAgICAgICBjaGFyIGNvbnN0ICplcnJfc3RyID0gZGxlcnJvcigpOwotICAgICAgICBBTE9HRSgiJXMgZGxjbG9zZSBmYWlsZWQsIGVycm9yOiAlcyIsIF9fZnVuY19fLCBlcnJfc3RyID86ICJ1bmtub3duIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotfSAvLyBuYW1lc3BhY2UgdGVzdHMKLX0gLy8gbmFtZXNwYWNlIGNhbWVyYTIKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2NhbWVyYTIvY2FtZXJhMl91dGlscy5oIGIvdGVzdHMvY2FtZXJhMi9jYW1lcmEyX3V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NGVlNzYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvY2FtZXJhMi9jYW1lcmEyX3V0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19BTkRST0lEX0hBTF9DQU1FUkEyX1RFU1RTX1VUSUxTX18KLSNkZWZpbmUgX19BTkRST0lEX0hBTF9DQU1FUkEyX1RFU1RTX1VUSUxTX18KLQotLy8gVXRpbGl0eSBjbGFzc2VzIGZvciBjYW1lcmEyIEhBTCB0ZXN0aW5nCi0KLSNpbmNsdWRlIDxzeXN0ZW0vY2FtZXJhX21ldGFkYXRhLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhMi5oPgotCi0jaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KLSNpbmNsdWRlIDxndWkvQ3B1Q29uc3VtZXIuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KLSNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgotI2luY2x1ZGUgPHV0aWxzL0NvbmRpdGlvbi5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgY2FtZXJhMiB7Ci1uYW1lc3BhY2UgdGVzdHMgewotCi0vKioKLSAqIFF1ZXVlIGNsYXNzIGZvciBib3RoIHNlbmRpbmcgcmVxdWVzdHMgdG8gYSBjYW1lcmEyIGRldmljZSwgYW5kIGZvciByZWNlaXZpbmcKLSAqIGZyYW1lcyBmcm9tIGEgY2FtZXJhMiBkZXZpY2UuCi0gKi8KLWNsYXNzIE1ldGFkYXRhUXVldWU6IHB1YmxpYyBjYW1lcmEyX3JlcXVlc3RfcXVldWVfc3JjX29wc190LAotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgY2FtZXJhMl9mcmFtZV9xdWV1ZV9kc3Rfb3BzX3QgewotICBwdWJsaWM6Ci0gICAgTWV0YWRhdGFRdWV1ZSgpOwotICAgIH5NZXRhZGF0YVF1ZXVlKCk7Ci0KLSAgICAvLyBJbnRlcmZhY2UgdG8gY2FtZXJhMiBIQUwgZGV2aWNlLCBlaXRoZXIgZm9yIHJlcXVlc3RzIChkZXZpY2UgaXMgY29uc3VtZXIpCi0gICAgLy8gb3IgZm9yIGZyYW1lcyAoZGV2aWNlIGlzIHByb2R1Y2VyKQotICAgIGNvbnN0IGNhbWVyYTJfcmVxdWVzdF9xdWV1ZV9zcmNfb3BzX3QqICAgZ2V0VG9Db25zdW1lckludGVyZmFjZSgpOwotICAgIHZvaWQgc2V0RnJvbUNvbnN1bWVySW50ZXJmYWNlKGNhbWVyYTJfZGV2aWNlX3QgKmQpOwotCi0gICAgY29uc3QgY2FtZXJhMl9mcmFtZV9xdWV1ZV9kc3Rfb3BzX3QqIGdldFRvUHJvZHVjZXJJbnRlcmZhY2UoKTsKLQotICAgIC8vIFJlYWwgaW50ZXJmYWNlcy4gT24gZW5xdWV1ZSwgcXVldWUgdGFrZXMgb3duZXJzaGlwIG9mIGJ1ZmZlciBwb2ludGVyCi0gICAgLy8gT24gZGVxdWV1ZSwgdXNlciB0YWtlcyBvd25lcnNoaXAgb2YgYnVmZmVyIHBvaW50ZXIuCi0gICAgc3RhdHVzX3QgZW5xdWV1ZShjYW1lcmFfbWV0YWRhdGFfdCAqYnVmKTsKLSAgICBzdGF0dXNfdCBkZXF1ZXVlKGNhbWVyYV9tZXRhZGF0YV90ICoqYnVmLCBib29sIGluY3JlbWVudENvdW50ID0gdHJ1ZSk7Ci0gICAgaW50ICAgICAgZ2V0QnVmZmVyQ291bnQoKTsKLSAgICBzdGF0dXNfdCB3YWl0Rm9yQnVmZmVyKG5zZWNzX3QgdGltZW91dCk7Ci0KLSAgICAvLyBTZXQgcmVwZWF0aW5nIGJ1ZmZlcihzKTsgaWYgdGhlIHF1ZXVlIGlzIGVtcHR5IG9uIGEgZGVxdWV1ZSBjYWxsLCB0aGUKLSAgICAvLyBxdWV1ZSBjb3BpZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJlYW0gc2xvdCBpbnRvIHRoZSBxdWV1ZSwgYW5kIHRoZW4KLSAgICAvLyBkZXF1ZXVlcyB0aGUgZmlyc3QgbmV3IGVudHJ5LgotICAgIHN0YXR1c190IHNldFN0cmVhbVNsb3QoY2FtZXJhX21ldGFkYXRhX3QgKmJ1Zik7Ci0gICAgc3RhdHVzX3Qgc2V0U3RyZWFtU2xvdChjb25zdCBMaXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4gJmJ1ZnMpOwotCi0gIHByaXZhdGU6Ci0gICAgc3RhdHVzX3QgZnJlZUJ1ZmZlcnMoTGlzdDxjYW1lcmFfbWV0YWRhdGFfdCo+OjppdGVyYXRvciBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMaXN0PGNhbWVyYV9tZXRhZGF0YV90Kj46Oml0ZXJhdG9yJiBlbmQpOwotCi0gICAgY2FtZXJhMl9kZXZpY2VfdCAqbURldmljZTsKLQotICAgIE11dGV4IG1NdXRleDsKLSAgICBDb25kaXRpb24gbm90RW1wdHk7Ci0KLSAgICBpbnQgbUZyYW1lQ291bnQ7Ci0KLSAgICBpbnQgbUNvdW50OwotICAgIExpc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPiBtRW50cmllczsKLSAgICBpbnQgbVN0cmVhbVNsb3RDb3VudDsKLSAgICBMaXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4gbVN0cmVhbVNsb3Q7Ci0KLSAgICBib29sIG1TaWduYWxDb25zdW1lcjsKLQotICAgIHN0YXRpYyBNZXRhZGF0YVF1ZXVlKiBnZXRJbnN0YW5jZShjb25zdCBjYW1lcmEyX2ZyYW1lX3F1ZXVlX2RzdF9vcHNfdCAqcSk7Ci0gICAgc3RhdGljIE1ldGFkYXRhUXVldWUqIGdldEluc3RhbmNlKGNvbnN0IGNhbWVyYTJfcmVxdWVzdF9xdWV1ZV9zcmNfb3BzX3QgKnEpOwotCi0gICAgc3RhdGljIGludCBjb25zdW1lcl9idWZmZXJfY291bnQoY29uc3QgY2FtZXJhMl9yZXF1ZXN0X3F1ZXVlX3NyY19vcHNfdCAqcSk7Ci0KLSAgICBzdGF0aWMgaW50IGNvbnN1bWVyX2RlcXVldWUoY29uc3QgY2FtZXJhMl9yZXF1ZXN0X3F1ZXVlX3NyY19vcHNfdCAqcSwKLSAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90ICoqYnVmZmVyKTsKLQotICAgIHN0YXRpYyBpbnQgY29uc3VtZXJfZnJlZShjb25zdCBjYW1lcmEyX3JlcXVlc3RfcXVldWVfc3JjX29wc190ICpxLAotICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QgKm9sZF9idWZmZXIpOwotCi0gICAgc3RhdGljIGludCBwcm9kdWNlcl9kZXF1ZXVlKGNvbnN0IGNhbWVyYTJfZnJhbWVfcXVldWVfZHN0X29wc190ICpxLAotICAgICAgICAgICAgc2l6ZV90IGVudHJpZXMsIHNpemVfdCBieXRlcywKLSAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90ICoqYnVmZmVyKTsKLQotICAgIHN0YXRpYyBpbnQgcHJvZHVjZXJfY2FuY2VsKGNvbnN0IGNhbWVyYTJfZnJhbWVfcXVldWVfZHN0X29wc190ICpxLAotICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QgKm9sZF9idWZmZXIpOwotCi0gICAgc3RhdGljIGludCBwcm9kdWNlcl9lbnF1ZXVlKGNvbnN0IGNhbWVyYTJfZnJhbWVfcXVldWVfZHN0X29wc190ICpxLAotICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QgKmZpbGxlZF9idWZmZXIpOwotCi19OwotCi0vKioKLSAqIEJhc2ljIGNsYXNzIHRvIHJlY2VpdmUgYW5kIHF1ZXVlIHVwIG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgY2FtZXJhIGRldmljZQotICovCi0KLWNsYXNzIE5vdGlmaWVyTGlzdGVuZXIgewotICBwdWJsaWM6Ci0KLSAgICBOb3RpZmllckxpc3RlbmVyKCk7Ci0KLSAgICBzdGF0dXNfdCBnZXROb3RpZmljYXRpb25zRnJvbShjYW1lcmEyX2RldmljZSAqZGV2KTsKLQotICAgIHN0YXR1c190IGdldE5leHROb3RpZmljYXRpb24oaW50MzJfdCAqbXNnX3R5cGUsIGludDMyX3QgKmV4dDEsCi0gICAgICAgICAgICBpbnQzMl90ICpleHQyLCBpbnQzMl90ICpleHQzKTsKLQotICAgIHN0YXR1c190IHdhaXRGb3JOb3RpZmljYXRpb24oaW50MzJfdCAqbXNnX3R5cGUsIGludDMyX3QgKmV4dDEsCi0gICAgICAgICAgICBpbnQzMl90ICpleHQyLCBpbnQzMl90ICpleHQzKTsKLQotICAgIGludCBudW1Ob3RpZmljYXRpb25zKCk7Ci0KLSAgcHJpdmF0ZToKLQotICAgIHN0YXR1c190IGdldE5leHROb3RpZmljYXRpb25Mb2NrZWQoaW50MzJfdCAqbXNnX3R5cGUsCi0gICAgICAgICAgICBpbnQzMl90ICpleHQxLCBpbnQzMl90ICpleHQyLCBpbnQzMl90ICpleHQzKTsKLQotICAgIHN0cnVjdCBOb3RpZmljYXRpb24gewotICAgICAgICBOb3RpZmljYXRpb24oaW50MzJfdCB0eXBlLCBpbnQzMl90IGUxLCBpbnQzMl90IGUyLCBpbnQzMl90IGUzKToKLSAgICAgICAgICAgICAgICBtc2dfdHlwZSh0eXBlKSwKLSAgICAgICAgICAgICAgICBleHQxKGUxKSwKLSAgICAgICAgICAgICAgICBleHQyKGUyKSwKLSAgICAgICAgICAgICAgICBleHQzKGUzKQotICAgICAgICB7fQotCi0gICAgICAgIGludDMyX3QgbXNnX3R5cGU7Ci0gICAgICAgIGludDMyX3QgZXh0MTsKLSAgICAgICAgaW50MzJfdCBleHQyOwotICAgICAgICBpbnQzMl90IGV4dDM7Ci0gICAgfTsKLQotICAgIExpc3Q8Tm90aWZpY2F0aW9uPiBtTm90aWZpY2F0aW9uczsKLQotICAgIE11dGV4IG1NdXRleDsKLSAgICBDb25kaXRpb24gbU5ld05vdGlmaWNhdGlvbjsKLQotICAgIHZvaWQgb25Ob3RpZnkoaW50MzJfdCBtc2dfdHlwZSwKLSAgICAgICAgICAgIGludDMyX3QgZXh0MSwKLSAgICAgICAgICAgIGludDMyX3QgZXh0MiwKLSAgICAgICAgICAgIGludDMyX3QgZXh0Myk7Ci0KLSAgICBzdGF0aWMgdm9pZCBub3RpZnlfY2FsbGJhY2tfZGlzcGF0Y2goaW50MzJfdCBtc2dfdHlwZSwKLSAgICAgICAgICAgIGludDMyX3QgZXh0MSwKLSAgICAgICAgICAgIGludDMyX3QgZXh0MiwKLSAgICAgICAgICAgIGludDMyX3QgZXh0MywKLSAgICAgICAgICAgIHZvaWQgKnVzZXIpOwotCi19OwotCi0vKioKLSAqIEFkYXB0ZXIgZnJvbSBhbiBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGludGVyZmFjZSB0byBjYW1lcmEyIGRldmljZSBzdHJlYW0gb3BzLgotICogQWxzbyB0YWtlcyBjYXJlIG9mIGFsbG9jYXRpbmcvZGVhbGxvY2F0aW5nIHN0cmVhbSBpbiBkZXZpY2UgaW50ZXJmYWNlCi0gKi8KLWNsYXNzIFN0cmVhbUFkYXB0ZXI6IHB1YmxpYyBjYW1lcmEyX3N0cmVhbV9vcHMgewotICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgU3RyZWFtQWRhcHRlcihzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBjb25zdW1lcik7Ci0KLSAgICB+U3RyZWFtQWRhcHRlcigpOwotCi0gICAgc3RhdHVzX3QgY29ubmVjdFRvRGV2aWNlKGNhbWVyYTJfZGV2aWNlX3QgKmQsCi0gICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0KTsKLQotICAgIHN0YXR1c190IGRpc2Nvbm5lY3QoKTsKLQotICAgIC8vIEdldCBzdHJlYW0gSUQuIE9ubHkgdmFsaWQgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNvbm5lY3RUb0RldmljZSBjYWxsLgotICAgIGludCAgICAgIGdldElkKCk7Ci0KLSAgcHJpdmF0ZToKLSAgICBlbnVtIHsKLSAgICAgICAgRVJST1IgPSAtMSwKLSAgICAgICAgRElTQ09OTkVDVEVEID0gMCwKLSAgICAgICAgVU5JTklUSUFMSVpFRCwKLSAgICAgICAgQUxMT0NBVEVELAotICAgICAgICBDT05ORUNURUQsCi0gICAgICAgIEFDVElWRQotICAgIH0gbVN0YXRlOwotCi0gICAgc3A8QU5hdGl2ZVdpbmRvdz4gbUNvbnN1bWVySW50ZXJmYWNlOwotICAgIGNhbWVyYTJfZGV2aWNlX3QgKm1EZXZpY2U7Ci0KLSAgICB1aW50MzJfdCBtSWQ7Ci0gICAgdWludDMyX3QgbVdpZHRoOwotICAgIHVpbnQzMl90IG1IZWlnaHQ7Ci0gICAgdWludDMyX3QgbUZvcm1hdDsKLSAgICB1aW50MzJfdCBtVXNhZ2U7Ci0gICAgdWludDMyX3QgbU1heFByb2R1Y2VyQnVmZmVyczsKLSAgICB1aW50MzJfdCBtTWF4Q29uc3VtZXJCdWZmZXJzOwotCi0gICAgY29uc3QgY2FtZXJhMl9zdHJlYW1fb3BzICpnZXRTdHJlYW1PcHMoKTsKLQotICAgIHN0YXRpYyBBTmF0aXZlV2luZG93KiB0b0FOVyhjb25zdCBjYW1lcmEyX3N0cmVhbV9vcHNfdCAqdyk7Ci0KLSAgICBzdGF0aWMgaW50IGRlcXVldWVfYnVmZmVyKGNvbnN0IGNhbWVyYTJfc3RyZWFtX29wc190ICp3LAotICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90KiogYnVmZmVyKTsKLQotICAgIHN0YXRpYyBpbnQgZW5xdWV1ZV9idWZmZXIoY29uc3QgY2FtZXJhMl9zdHJlYW1fb3BzX3QqIHcsCi0gICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCwKLSAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCogYnVmZmVyKTsKLQotICAgIHN0YXRpYyBpbnQgY2FuY2VsX2J1ZmZlcihjb25zdCBjYW1lcmEyX3N0cmVhbV9vcHNfdCogdywKLSAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCogYnVmZmVyKTsKLQotICAgIHN0YXRpYyBpbnQgc2V0X2Nyb3AoY29uc3QgY2FtZXJhMl9zdHJlYW1fb3BzX3QqIHcsCi0gICAgICAgICAgICBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKTsKLQotfTsKLQotLyoqCi0gKiBTaW1wbGUgY2xhc3MgdG8gd2FpdCBvbiB0aGUgQ3B1Q29uc3VtZXIgdG8gaGF2ZSBhIGZyYW1lIGF2YWlsYWJsZQotICovCi1jbGFzcyBGcmFtZVdhaXRlciA6IHB1YmxpYyBDcHVDb25zdW1lcjo6RnJhbWVBdmFpbGFibGVMaXN0ZW5lciB7Ci0gIHB1YmxpYzoKLSAgICBGcmFtZVdhaXRlcigpOwotCi0gICAgLyoqCi0gICAgICogV2FpdCBmb3IgbWF4IHRpbWVvdXQgbmFub3NlY29uZHMgZm9yIGEgbmV3IGZyYW1lLiBSZXR1cm5zCi0gICAgICogT0sgaWYgYSBmcmFtZSBpcyBhdmFpbGFibGUsIFRJTUVEX09VVCBpZiB0aGUgdGltZW91dCB3YXMgcmVhY2hlZC4KLSAgICAgKi8KLSAgICBzdGF0dXNfdCB3YWl0Rm9yRnJhbWUobnNlY3NfdCB0aW1lb3V0KTsKLQotICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pOwotCi0gICAgaW50IG1QZW5kaW5nRnJhbWVzOwotICAgIE11dGV4IG1NdXRleDsKLSAgICBDb25kaXRpb24gbUNvbmRpdGlvbjsKLX07Ci0KLXN0cnVjdCBIV01vZHVsZUhlbHBlcnMgewotICAgIC8qIGF0dGVtcHQgdG8gdW5sb2FkIHRoZSBsaWJyYXJ5IHdpdGggZGxjbG9zZSAqLwotICAgIHN0YXRpYyBpbnQgY2xvc2VNb2R1bGUodm9pZCogZHNvKTsKLX07Ci0KLX0KLX0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0cy9jYW1lcmEyL21haW4uY3BwIGIvdGVzdHMvY2FtZXJhMi9tYWluLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBlYmJlOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9jYW1lcmEyL21haW4uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgIlRlc3RGb3JrZXJFdmVudExpc3RlbmVyLmgiCi0jaW5jbHVkZSAiVGVzdFNldHRpbmdzLmgiCi0KLXVzaW5nIGFuZHJvaWQ6OmNhbWVyYTI6OnRlc3RzOjpUZXN0Rm9ya2VyRXZlbnRMaXN0ZW5lcjsKLXVzaW5nIGFuZHJvaWQ6OmNhbWVyYTI6OnRlc3RzOjpUZXN0U2V0dGluZ3M7Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewotCi0gICAgYm9vbCBwcmludFVzYWdlID0gIVRlc3RTZXR0aW5nczo6UGFyc2VBcmdzKGFyZ2MsIGFyZ3YpOwotCi0gICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7Ci0KLSAgICBpZiAocHJpbnRVc2FnZSkgewotICAgICAgICBUZXN0U2V0dGluZ3M6OlByaW50VXNhZ2UoKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLy8gR2V0cyBob2xkIG9mIHRoZSBldmVudCBsaXN0ZW5lciBsaXN0LgotICAgIDo6dGVzdGluZzo6VGVzdEV2ZW50TGlzdGVuZXJzJiBsaXN0ZW5lcnMgPQotICAgICAgICA6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5saXN0ZW5lcnMoKTsKLSAgICAvLyBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIGVuZC4gIEdvb2dsZSBUZXN0IHRha2VzIHRoZSBvd25lcnNoaXAuCi0gICAgbGlzdGVuZXJzLkFwcGVuZChuZXcgVGVzdEZvcmtlckV2ZW50TGlzdGVuZXIoKSk7Ci0KLSAgICBpbnQgcmV0ID0gUlVOX0FMTF9URVNUUygpOwotCi0gICAgcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL2hhcmR3YXJlL0FuZHJvaWQuYnAgYi90ZXN0cy9oYXJkd2FyZS9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjhlMjhmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2hhcmR3YXJlL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogInN0YXRpYy1oYWwtY2hlY2siLAotICAgIHNyY3M6IFsKLSAgICAgICAgInN0cnVjdC1zaXplLmNwcCIsCi0gICAgICAgICJzdHJ1Y3Qtb2Zmc2V0LmNwcCIsCi0gICAgICAgICJzdHJ1Y3QtbGFzdC5jcHAiLAotICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsibGliaGFyZHdhcmUiXSwKLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1zdGQ9Z251KysxMSIsCi0gICAgICAgICItTzAiLAotICAgIF0sCi0KLSAgICBpbmNsdWRlX2RpcnM6IFsic3lzdGVtL21lZGlhL2NhbWVyYS9pbmNsdWRlIl0sCi19CmRpZmYgLS1naXQgYS90ZXN0cy9oYXJkd2FyZS9BbmRyb2lkLm1rIGIvdGVzdHMvaGFyZHdhcmUvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjU0MGM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaGFyZHdhcmUvQW5kcm9pZC5tawpAQCAtMCwwICsxLDEyIEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gc3RhdGljLWhhbC1jaGVjaworTE9DQUxfU1JDX0ZJTEVTIDo9IHN0cnVjdC1zaXplLmNwcCBzdHJ1Y3Qtb2Zmc2V0LmNwcCBzdHJ1Y3QtbGFzdC5jcHAKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliaGFyZHdhcmUKK0xPQ0FMX0NGTEFHUyA6PSAtc3RkPWdudSsrMTEgLU8wCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgIHN5c3RlbS9tZWRpYS9jYW1lcmEvaW5jbHVkZQorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS90ZXN0cy9oYXJkd2FyZS9zdHJ1Y3Qtb2Zmc2V0LmNwcCBiL3Rlc3RzL2hhcmR3YXJlL3N0cnVjdC1vZmZzZXQuY3BwCmluZGV4IDEwYzA4OTUuLjdmN2YyZTAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2hhcmR3YXJlL3N0cnVjdC1vZmZzZXQuY3BwCisrKyBiL3Rlc3RzL2hhcmR3YXJlL3N0cnVjdC1vZmZzZXQuY3BwCkBAIC0xMTYsNyArMTE2LDkgQEAKICAgICBDSEVDS19NRU1CRVJfQVQoc2Vuc29yc19wb2xsX2RldmljZV8xX3QsIGJhdGNoLCA3NiwgMTQ0KTsKICAgICBDSEVDS19NRU1CRVJfQVQoc2Vuc29yc19wb2xsX2RldmljZV8xX3QsIGZsdXNoLCA4MCwgMTUyKTsKICAgICBDSEVDS19NRU1CRVJfQVQoc2Vuc29yc19wb2xsX2RldmljZV8xX3QsIGluamVjdF9zZW5zb3JfZGF0YSwgODQsIDE2MCk7Ci0gICAgQ0hFQ0tfTUVNQkVSX0FUKHNlbnNvcnNfcG9sbF9kZXZpY2VfMV90LCByZXNlcnZlZF9wcm9jcywgODgsIDE2OCk7CisgICAgQ0hFQ0tfTUVNQkVSX0FUKHNlbnNvcnNfcG9sbF9kZXZpY2VfMV90LCByZWdpc3Rlcl9kaXJlY3RfY2hhbm5lbCwgODgsIDE2OCk7CisgICAgQ0hFQ0tfTUVNQkVSX0FUKHNlbnNvcnNfcG9sbF9kZXZpY2VfMV90LCBjb25maWdfZGlyZWN0X3JlcG9ydCwgOTIsIDE3Nik7CisgICAgQ0hFQ0tfTUVNQkVSX0FUKHNlbnNvcnNfcG9sbF9kZXZpY2VfMV90LCByZXNlcnZlZF9wcm9jcywgOTYsIDE4NCk7CiAKICAgICAvL1R5cGVzIGRlZmluZWQgaW4gZmIuaAogICAgIENIRUNLX01FTUJFUl9BVChmcmFtZWJ1ZmZlcl9kZXZpY2VfdCwgY29tbW9uLCAwLCAwKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL3ZlaGljbGUvUkVBRE1FIGIvdGVzdHMvdmVoaWNsZS9SRUFETUUKaW5kZXggYjhmYzdkNC4uNDJkMjIxMCAxMDA2NDQKLS0tIGEvdGVzdHMvdmVoaWNsZS9SRUFETUUKKysrIGIvdGVzdHMvdmVoaWNsZS9SRUFETUUKQEAgLTQ5LDEzICs0OSwxMyBAQAogJCBtbW0gaGFyZHdhcmUvbGliaGFyZHdhcmUKIAogVGhpcyB3aWxsIGdlbmVyYXRlIHRoZSBmb2xsb3dpbmcgYmluYXJpZXMgdGhhdCB3ZSBjYXJlIGFib3V0OgotaSkgb3V0L3RhcmdldC9wcm9kdWN0L1hYWC9zeXN0ZW0vbGliL2h3L3ZlaGljbGUuZGVmYXVsdC5zbworaSkgb3V0L3RhcmdldC9wcm9kdWN0L1hYWC92ZW5kb3IvbGliL2h3L3ZlaGljbGUuZGVmYXVsdC5zbwogaWkpIG91dC90YXJnZXQvcHJvZHVjdC9YWFgvZGF0YS9uYXRpdmV0ZXN0L3ZlaGljbGVfdGVzdHMKIGlpaSkgb3V0L3RhcmdldC9wcm9kdWN0L1hYWC9zeXN0ZW0vYmluL3ZlaGljbGUtaGFsLXRvb2wKIAogVGhlIGxvY2F0aW9uIGZvciB0aGUgZmlyc3Qgc2hhcmVkIGxpYnJhcnkgd291bGQgYmU6Ci0kIGFkYiBwdXNoIG91dC90YXJnZXQvcHJvZHVjdC9YWFgvc3lzdGVtL2xpYi9ody92ZWhpY2xlLmRlZmF1bHQuc28KLS9zeXN0ZW0vbGliL2h3CiskIGFkYiBwdXNoIG91dC90YXJnZXQvcHJvZHVjdC9YWFgvdmVuZG9yL2xpYi9ody92ZWhpY2xlLmRlZmF1bHQuc28KKy92ZW5kb3IvbGliL2h3CiBZb3UgY2FuIGFsc28gdXNlICdhZGIgc3luYycgaWYgeW91IGxpa2UsIGFsdGhvdWdoIHRoaXMgaXMgdGhlIGVhc2llc3QgbGVhc3QKIGhhc3NsZSB3YXkgb2YgcHV0dGluZyBpdCBpbiBwbGFjZS4KIApkaWZmIC0tZ2l0IGEvdGVzdHMvdmVoaWNsZS92ZWhpY2xlLWhhbC10b29sLmMgYi90ZXN0cy92ZWhpY2xlL3ZlaGljbGUtaGFsLXRvb2wuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0Cg==