ZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvdGVrcmFtLXNpci5jIGIvZHJpdmVycy9uZXQvaXJkYS90ZWtyYW0tc2lyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRkNmJjNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvdGVrcmFtLXNpci5jCkBAIC0wLDAgKzEsMjMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIHRla3JhbS5jCisgKiBWZXJzaW9uOiAgICAgICAxLjMKKyAqIERlc2NyaXB0aW9uOiAgIEltcGxlbWVudGF0aW9uIG9mIHRoZSBUZWtyYW0gSXJNYXRlIElSLTIxMEIgZG9uZ2xlCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBXZWQgT2N0IDIxIDIwOjAyOjM1IDE5OTgKKyAqIE1vZGlmaWVkIGF0OiAgIFN1biBPY3QgMjcgMjI6MDI6MzggMjAwMgorICogTW9kaWZpZWQgYnk6ICAgTWFydGluIERpZWhsIDxtYWRAbWRpZWhsLmRlPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgRGFnIEJyYXR0bGksCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAyIE1hcnRpbiBEaWVobCwKKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogIAorICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKworI2luY2x1ZGUgInNpci1kZXYuaCIKKworc3RhdGljIGludCB0ZWtyYW1fZGVsYXkgPSAxNTA7CQkvKiBkZWZhdWx0IGlzIDE1MCBtcyAqLworbW9kdWxlX3BhcmFtKHRla3JhbV9kZWxheSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModGVrcmFtX2RlbGF5LCAidGVrcmFtIGRvbmdsZSB3cml0ZSBjb21wbGV0ZSBkZWxheSIpOworCitzdGF0aWMgaW50IHRla3JhbV9vcGVuKHN0cnVjdCBzaXJfZGV2ICopOworc3RhdGljIGludCB0ZWtyYW1fY2xvc2Uoc3RydWN0IHNpcl9kZXYgKik7CitzdGF0aWMgaW50IHRla3JhbV9jaGFuZ2Vfc3BlZWQoc3RydWN0IHNpcl9kZXYgKiwgdW5zaWduZWQpOworc3RhdGljIGludCB0ZWtyYW1fcmVzZXQoc3RydWN0IHNpcl9kZXYgKik7CisKKyNkZWZpbmUgVEVLUkFNXzExNTIwMCAweDAwCisjZGVmaW5lIFRFS1JBTV81NzYwMCAgMHgwMQorI2RlZmluZSBURUtSQU1fMzg0MDAgIDB4MDIKKyNkZWZpbmUgVEVLUkFNXzE5MjAwICAweDAzCisjZGVmaW5lIFRFS1JBTV85NjAwICAgMHgwNAorCisjZGVmaW5lIFRFS1JBTV9QVyAgICAgMHgxMCAvKiBQdWxzZSBzZWxlY3QgYml0ICovCisKK3N0YXRpYyBzdHJ1Y3QgZG9uZ2xlX2RyaXZlciB0ZWtyYW0gPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcml2ZXJfbmFtZQk9ICJUZWtyYW0gSVItMjEwQiIsCisJLnR5cGUJCT0gSVJEQV9URUtSQU1fRE9OR0xFLAorCS5vcGVuCQk9IHRla3JhbV9vcGVuLAorCS5jbG9zZQkJPSB0ZWtyYW1fY2xvc2UsCisJLnJlc2V0CQk9IHRla3JhbV9yZXNldCwKKwkuc2V0X3NwZWVkCT0gdGVrcmFtX2NoYW5nZV9zcGVlZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHRla3JhbV9zaXJfaW5pdCh2b2lkKQoreworCWlmICh0ZWtyYW1fZGVsYXkgPCAxICB8fCAgdGVrcmFtX2RlbGF5ID4gNTAwKQorCQl0ZWtyYW1fZGVsYXkgPSAyMDA7CisJSVJEQV9ERUJVRygxLCAiJXMgLSB1c2luZyAlZCBtcyBkZWxheVxuIiwKKwkJdGVrcmFtLmRyaXZlcl9uYW1lLCB0ZWtyYW1fZGVsYXkpOworCXJldHVybiBpcmRhX3JlZ2lzdGVyX2RvbmdsZSgmdGVrcmFtKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRla3JhbV9zaXJfY2xlYW51cCh2b2lkKQoreworCWlyZGFfdW5yZWdpc3Rlcl9kb25nbGUoJnRla3JhbSk7Cit9CisKK3N0YXRpYyBpbnQgdGVrcmFtX29wZW4oc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcW9zX2luZm8gKnFvcyA9ICZkZXYtPnFvczsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBUUlVFLCBUUlVFKTsKKworCXFvcy0+YmF1ZF9yYXRlLmJpdHMgJj0gSVJfOTYwMHxJUl8xOTIwMHxJUl8zODQwMHxJUl81NzYwMHxJUl8xMTUyMDA7CisJcW9zLT5taW5fdHVybl90aW1lLmJpdHMgPSAweDAxOyAvKiBOZWVkcyBhdCBsZWFzdCAxMCBtcyAqLwkKKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKHFvcyk7CisKKwkvKiBpcmRhIHRocmVhZCB3YWl0cyA1MCBtc2VjIGZvciBwb3dlciBzZXR0bGluZyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVrcmFtX2Nsb3NlKHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIFBvd2VyIG9mZiBkb25nbGUgKi8KKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBGQUxTRSwgRkFMU0UpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB0ZWtyYW1fY2hhbmdlX3NwZWVkIChkZXYsIHN0YXRlLCBzcGVlZCkKKyAqCisgKiAgICBTZXQgdGhlIHNwZWVkIGZvciB0aGUgVGVrcmFtIElSTWF0ZSAyMTAgdHlwZSBkb25nbGUuIFdhcm5pbmcsIHRoaXMgCisgKiAgICBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aXRoIGEgcHJvY2VzcyBjb250ZXh0IQorICoKKyAqICAgIEFsZ29yaXRobQorICogICAgMS4gY2xlYXIgRFRSIAorICogICAgMi4gc2V0IFJUUywgYW5kIHdhaXQgYXQgbGVhc3QgNyB1cworICogICAgMy4gc2VuZCBDb250cm9sIEJ5dGUgdG8gdGhlIElSLTIxMCB0aHJvdWdoIFRYRCB0byBzZXQgbmV3IGJhdWQgcmF0ZQorICogICAgICAgd2FpdCB1bnRpbCB0aGUgc3RvcCBiaXQgb2YgQ29udHJvbCBCeXRlIGlzIHNlbnQgKGZvciA5NjAwIGJhdWQgcmF0ZSwgCisgKiAgICAgICBpdCB0YWtlcyBhYm91dCAxMDAgbXNlYykKKyAqCisgKglbb29wcywgd2h5IDEwMCBtc2VjPyBzZW5kaW5nIDEgYnl0ZSAoMTAgYml0cykgdGFrZXMgMS4wNSBtc2VjCisgKgkgLSBpcyB0aGlzIHByb2JhYmx5IHRvIGNvbXBlbnNhdGUgZm9yIGRlbGF5cyBpbiB0dHkgbGF5ZXI/XQorICoKKyAqICAgIDUuIGNsZWFyIFJUUyAocmV0dXJuIHRvIE5PUk1BTCBPcGVyYXRpb24pCisgKiAgICA2LiB3YWl0IGF0IGxlYXN0IDUwIHVzLCBuZXcgc2V0dGluZyAoYmF1ZCByYXRlLCBldGMpIHRha2VzIGVmZmVjdCBoZXJlIAorICogICAgICAgYWZ0ZXIKKyAqLworCisjZGVmaW5lIFRFS1JBTV9TVEFURV9XQUlUX1NQRUVECShTSVJERVZfU1RBVEVfRE9OR0xFX1NQRUVEICsgMSkKKworc3RhdGljIGludCB0ZWtyYW1fY2hhbmdlX3NwZWVkKHN0cnVjdCBzaXJfZGV2ICpkZXYsIHVuc2lnbmVkIHNwZWVkKQoreworCXVuc2lnbmVkIHN0YXRlID0gZGV2LT5mc20uc3Vic3RhdGU7CisJdW5zaWduZWQgZGVsYXkgPSAwOworCXU4IGJ5dGU7CisJc3RhdGljIGludCByZXQgPSAwOworCQorCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlzd2l0Y2goc3RhdGUpIHsKKwljYXNlIFNJUkRFVl9TVEFURV9ET05HTEVfU1BFRUQ6CisKKwkJc3dpdGNoIChzcGVlZCkgeworCQlkZWZhdWx0OgorCQkJc3BlZWQgPSA5NjAwOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCS8qIGZhbGwgdGhydSAqLworCQljYXNlIDk2MDA6CisJCQlieXRlID0gVEVLUkFNX1BXfFRFS1JBTV85NjAwOworCQkJYnJlYWs7CisJCWNhc2UgMTkyMDA6CisJCQlieXRlID0gVEVLUkFNX1BXfFRFS1JBTV8xOTIwMDsKKwkJCWJyZWFrOworCQljYXNlIDM4NDAwOgorCQkJYnl0ZSA9IFRFS1JBTV9QV3xURUtSQU1fMzg0MDA7CisJCQlicmVhazsKKwkJY2FzZSA1NzYwMDoKKwkJCWJ5dGUgPSBURUtSQU1fUFd8VEVLUkFNXzU3NjAwOworCQkJYnJlYWs7CisJCWNhc2UgMTE1MjAwOgorCQkJYnl0ZSA9IFRFS1JBTV8xMTUyMDA7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFNldCBEVFIsIENsZWFyIFJUUyAqLworCQlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBUUlVFLCBGQUxTRSk7CisJCisJCS8qIFdhaXQgYXQgbGVhc3QgN3VzICovCisJCXVkZWxheSgxNCk7CisKKwkJLyogV3JpdGUgY29udHJvbCBieXRlICovCisJCXNpcmRldl9yYXdfd3JpdGUoZGV2LCAmYnl0ZSwgMSk7CisJCQorCQlkZXYtPnNwZWVkID0gc3BlZWQ7CisKKwkJc3RhdGUgPSBURUtSQU1fU1RBVEVfV0FJVF9TUEVFRDsKKwkJZGVsYXkgPSB0ZWtyYW1fZGVsYXk7CisJCWJyZWFrOworCisJY2FzZSBURUtSQU1fU1RBVEVfV0FJVF9TUEVFRDoKKwkJLyogU2V0IERUUiwgU2V0IFJUUyAqLworCQlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBUUlVFLCBUUlVFKTsKKwkJdWRlbGF5KDUwKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlJUkRBX0VSUk9SKCIlcyAtIHVuZGVmaW5lZCBzdGF0ZSAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0ZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCWRldi0+ZnNtLnN1YnN0YXRlID0gc3RhdGU7CisJcmV0dXJuIChkZWxheSA+IDApID8gZGVsYXkgOiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB0ZWtyYW1fcmVzZXQgKGRyaXZlcikKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gcmVzZXRzIHRoZSB0ZWtyYW0gZG9uZ2xlLiBXYXJuaW5nLCB0aGlzIGZ1bmN0aW9uIAorICogICAgICBtdXN0IGJlIGNhbGxlZCB3aXRoIGEgcHJvY2VzcyBjb250ZXh0ISEgCisgKgorICogICAgICBBbGdvcml0aG06CisgKiAgICAJICAwLiBDbGVhciBSVFMgYW5kIERUUiwgYW5kIHdhaXQgNTAgbXMgKHBvd2VyIG9mZiB0aGUgSVItMjEwICkKKyAqICAgICAgICAxLiBjbGVhciBSVFMgCisgKiAgICAgICAgMi4gc2V0IERUUiwgYW5kIHdhaXQgYXQgbGVhc3QgMSBtcyAKKyAqICAgICAgICAzLiBjbGVhciBEVFIgdG8gU1BBQ0Ugc3RhdGUsIHdhaXQgYXQgbGVhc3QgNTAgdXMgZm9yIGZ1cnRoZXIgCisgKiAgICAgICAgIG9wZXJhdGlvbgorICovCisKK3N0YXRpYyBpbnQgdGVrcmFtX3Jlc2V0KHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIENsZWFyIERUUiwgU2V0IFJUUyAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIEZBTFNFLCBUUlVFKTsgCisKKwkvKiBTaG91bGQgc2xlZXAgMSBtcyAqLworCW1zbGVlcCgxKTsKKworCS8qIFNldCBEVFIsIFNldCBSVFMgKi8KKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBUUlVFLCBUUlVFKTsKKwkKKwkvKiBXYWl0IGF0IGxlYXN0IDUwIHVzICovCisJdWRlbGF5KDc1KTsKKworCWRldi0+c3BlZWQgPSA5NjAwOworCisJcmV0dXJuIDA7Cit9CisKK01PRFVMRV9BVVRIT1IoIkRhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVGVrcmFtIElyTWF0ZSBJUi0yMTBCIGRvbmdsZSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXJkYS1kb25nbGUtMCIpOyAvKiBJUkRBX1RFS1JBTV9ET05HTEUgKi8KKwkJCittb2R1bGVfaW5pdCh0ZWtyYW1fc2lyX2luaXQpOworbW9kdWxlX2V4aXQodGVrcmFtX3Npcl9jbGVhbnVwKTsK