IC8qKg0KICogQGZpbGUgYmRJTUFEcGouaA0KICogQGJyaWVmIGJkU291bmQgSU1wcm92ZWQgQXVkaW8gRGV2aWNlIGZvciBQSlNJUC4NCiAqLw0KIA0KLyoqDQogKiBAZGVmZ3JvdXAgYmRfSU1BRCBiZElNQURwaiBiZFNvdW5kIElNcHJvdmVkIEF1ZGlvIERldmljZSBmb3IgUEpTSVAuDQogKiBAaW5ncm91cCBhdWRpb19kZXZpY2VfYXBpDQogKiANCiAqIDxiPmJkU291bmQgSU1wcm92ZWQgQXVkaW8gRGV2aWNlPC9iPiBpcyBhIG11bHRpcGxhdGZvcm0gYXVkaW8gaW50ZXJmYWNlDQogKiBjcmVhdGVkIHRvIGludGVncmF0ZSBpbiA8Yj5QSlNJUDwvYj4gbGlicmFyeSB3aXRoIG5vIGVmZm9ydC4NCiAqIFxuIFBvcnRpbmcgPGI+YmRJTUFEcGo8L2I+IGFjcm9zcyB0aGUgbWFpbiBvcGVyYXRpbmcgc3lzdGVtcyBpcw0KICogc3RyYWlnaHRmb3J3YXJkLCB3aXRob3V0IHRoZSBuZWVkIG9mIGNoYW5nZSBhIHNpbmdsZSBsaW5lIG9mIGNvZGUuDQogKg0KICogICAgLSA8Yj5GZWF0dXJlczwvYj4NCiAqICAgICAgIC0gRWNobyBjYW5jZWxsYXRpb24gKEZ1bGwgRHVwbGV4KQ0KICogICAgICAgLSBOb2lzZSByZWR1Y3Rpb24NCiAqICAgICAgIC0gQXV0b21hdGljIEdhaW4gQ29udHJvbA0KICogICAgICAgLSBBdWRpbyBFbmhhbmNlbWVudA0KICoNCiAqICAgIC0gPGI+U3VwcG9ydGVkIG9wZXJhdGluZyBzeXN0ZW1zPC9iPg0KICogICAgICAgLSBXaW5kb3dzDQogKiAgICAgICAtIEFuZHJvaWQNCiAqICAgICAgIC0gTWFjT1MgWA0KICogICAgICAgLSBpT1MNCiAqICAgICAgIC0gTGludXggLyBBbHNhDQogKg0KICogICAgLSA8Yj5TdXBwb3J0ZWQgcGxhdGZvcm1zPC9iPg0KICogICAgICAgLSB4ODYNCiAqICAgICAgIC0geDY0DQogKiAgICAgICAtIEFSTSBDb3J0ZXgtQTgvQTkvQTE1IHdpdGggTkVPTg0KICogDQogKiBWaXNpdCA8YSBocmVmPSJodHRwOi93d3cuYmRzb3VuZC5jb20iIHRhcmdldD0ibmV3Ij5iZFNvdW5kPC9hPiBmb3IgdXBkYXRlZA0KICogZmVhdHVyZXMsIHN1cHBvcnRlZCBvcGVyYXRpbmcgc3lzdGVtcyBhbmQgcGxhdGZvcm1zLg0KICogDQogKiA8Yj5Vc2luZyBQSlNJUCB3aXRoIGJkSU1BRCBhdWRpbyBkZXZpY2U8L2I+DQogKiANCiAqICAgIC0gPGI+SW50ZWdyYXRpb248L2I+DQogKiAgICBcbiBVc2luZyA8Yj5iZElNQUQ8L2I+IHdpdGhpbiA8Yj5QSlNJUDwvYj4gaXMgc2ltcGxlOg0KICogICAgICAgLSMgUmVxdWVzdCBmb3IgYmRJTUFEcGogbGlicmFyeSB0bw0KICogICAgICAgPGEgaHJlZj0iaHR0cDovd3d3LmJkc291bmQuY29tIiB0YXJnZXQ9Im5ldyI+YmRTb3VuZDwvYT46DQogKiAgICAgICAgYmRTb3VuZCB3aWxsIHByb3ZpZGUgaW5zdHJ1Y3Rpb24gdG8gaW50ZWdyYXRlIHRoZSBsaWJyYXJ5IGRlcGVuZGluZyBvbg0KICogICAgICAgIHRoZSBwbGF0Zm9ybSAvIE8uUy4gLyB0b29sY2hhaW47DQogKiAgICAgICAtIyBBZGQgdGhlIDxjb2RlPmJkaW1hZF9kZXYuYzwvY29kZT4gZmlsZSB0bw0KICogICAgICAgPGNvZGU+cGptZWRpYS9zcmMvcGptZWRpYS1hdWRpb2RldjwvY29kZT4gZm9sZGVyOw0KICogICAgICAgLSMgRW5hYmxlIHRoZSBiZElNQUQgYXVkaW8gZGV2aWNlIGRlZmluaW5nIHRoZSBwZXJpZmVyYWwgaW4gdGhlDQogKiAgICAgICA8Y29kZT5wai9jb25maWdfc2l0ZS5oPC9jb2RlPiBhbmQgZGlzYWJsaW5nIGFsbCBvdGhlciBkZXZpY2VzOg0KICogICAgICAgPHByZT4NCiAqICAgICAgICNkZWZpbmUgUEpNRURJQV9BVURJT19ERVZfSEFTX0JESU1BRCAxDQogKiAgICAgICA8L3ByZT4NCiAqDQogKiAgICAtIDxiPlVzYWdlPC9iPg0KICogICAgXG4gVGhlcmUgYXJlIG9ubHkgYSBjb3VwbGUgb2YgdGhpbmdzIHRoZSBjdXN0b21lciBoYXZlIHRvIHBheSBhdHRlbnRpb24gb24NCiAqICAgIKd3aGVuIHVzaW5nIGJkSU1BRCBsaWJyYXJ5Lg0KICoNCiAqICAgICAgIC0gPGI+SW5pdGlhbGl6YXRpb248L2I+DQogKiAgICAgICBcbiBTaW5jZSB0aGUgYmRJTUFEIGxpYnJhcnkgcHJvdmlkZSBpdHNlbGYgdGhlIGVjaG8gY2FuY2VsbGF0aW9uDQogKiAgICAgICBhbmQgdGhlIGxhdGVuY3kgbWFuYWdlbWVudCwgaXMgbmVjZXNzYXJ5IHRvIGRpc2FibGUgdGhlc2UgZmVhdHVyZXMNCiAqICAgICAgIGluIHRoZSBQSlNJUCBsaWJyYXJpeSBhcHBsaWNhdGlvbnMuDQogKiAgICAgICBcbiBGb3IgZXhhbXBsZSBpbiBQSlNVQSBzYW1wbGUgYXBwbGljYXRpb24gdGhlcmUgaXMgdGhlIG5lZWQNCiAqICAgICAgIHRvIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBjb21tYW5kczoNCiAqICAgICAgIDxwcmU+DQogKiAgICAgICAtLWVjLXRhaWw9MA0KICogICAgICAgLS1uby12YWQNCiAqICAgICAgIC0tY2FwdHVyZS1sYXQ9MA0KICogICAgICAgLS1wbGF5YmFjay1sYXQ9MA0KICogICAgICAgPC9wcmU+DQogKiANCiAqICAgICAgIC0gPGI+U3VwcG9ydGVkIHNldCBjYXBhYmlsaXR5PC9iPg0KICogICAgICAgICAgLSA8Y29kZT5QSk1FRElBX0FVRF9ERVZfQ0FQX09VVFBVVF9WT0xVTUVfU0VUVElORzwvY29kZT4NCiAqICAgICAgICAgIFxuIFNldHRpbmcgc3BlYWtlciB2b2x1bWUuDQogKiAgICAgICAgICAtIDxjb2RlPlBKTUVESUFfQVVEX0RFVl9DQVBfSU5QVVRfVk9MVU1FX1NFVFRJTkc8L2NvZGU+DQogKiAgICAgICAgICBcbiBTZXR0aW5nIG1pY2hyb3Bob25lIHZvbHVtZS4NCiAqICAgICAgICAgIC0gPGNvZGU+UEpNRURJQV9BVURfREVWX0NBUF9FQzwvY29kZT4NCiAqICAgICAgICAgIFxuIEVuYWJsZS9kaXNhYmxlIGVjaG8gY2FuY2VsbGF0aW9uLg0KICoNCiAqIEZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHZpc2l0DQogKiA8YSBocmVmPSJodHRwOi93d3cuYmRzb3VuZC5jb20iIHRhcmdldD0ibmV3Ij53d3cuYmRzb3VuZC5jb208L2E+DQogKiBvciB3cml0ZSB0byBpbmZvQGJkc291bmQuY29tDQogKg0KICogQGF1dGhvciBiZFNvdW5kDQogKiBAdmVyc2lvbiAgIDEuMC4xDQogKiBAY29weXJpZ2h0IDIwMTIgYmRTb3VuZCBzcmwuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQogKg0KICovDQoNCi8qKiAgICAgICAgDQogKiBAZGVmZ3JvdXAgZ3JvdXBGdW5jdGlvbiBGdW5jdGlvbnMgICAgICANCiAqIEBpbmdyb3VwIGJkX0lNQUQgIA0KICogDQogKiBGdW5jdGlvbnMgZGVmaW5lZCBpbiBiZElNQUQuDQogKi8NCg0KLyoqICAgICAgICANCiAqIEBkZWZncm91cCBncm91cENhbGxiYWNrIENhbGxiYWNrcyAgICAgIA0KICogQGluZ3JvdXAgYmRfSU1BRCAgICANCiAqIA0KICogQ2FsbGJhY2tzIGRlZmluZWQgaW4gYmRJTUFELg0KICovDQogDQovKiogICAgICAgIA0KICogQGRlZmdyb3VwIGdyb3VwU3RydWN0RW51bSBTdHJ1Y3RzIGFuZCBFbnVtcyAgICAgICANCiAqIEBpbmdyb3VwIGJkX0lNQUQgICANCiAqIA0KICogU3RydWN0IGFuZCBFbnVtIGRlZmluZWQgaW4gYmRJTUFELg0KICovDQoNCiNpZm5kZWYgQkRfSU1BRF9QSl9IX18NCiNkZWZpbmUgQkRfSU1BRF9QSl9IX18NCiAgDQovKioNCiAqIEBicmllZiBNYWNybyBmb3IgV2luZG93cyBETEwgU3VwcG9ydC4NCiAqLw0KIA0KI2lmZGVmIF9CRElNQURQSl9FWFBPUlRETEwNCgkjaWZkZWYgV0lOMzINCgkJI2RlZmluZSBCRElNQURQSl9BUEkgX19kZWNsc3BlYyhkbGxleHBvcnQpDQoJI2Vsc2UNCgkJI2RlZmluZSBCRElNQURQSl9BUEkgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkJDQoJI2VuZGlmDQojZWxzZQ0KCSNkZWZpbmUgQkRJTUFEUEpfQVBJDQojZW5kaWYNCg0KI2RlZmluZSBCRF9JTUFEX0NBUFRVUkVfREVWSUNFUyAgICAgIDENCiNkZWZpbmUgQkRfSU1BRF9QTEFZQkFDS19ERVZJQ0VTICAgICAwDQojZGVmaW5lIEJEX0lNQURfRElBR05PU1RJQ19FTkFCTEUgICAgMQ0KI2RlZmluZSBCRF9JTUFEX0RJQUdOT1NUSUNfRElTQUJMRSAgIDANCg0KI2RlZmluZSBCRF9JTUFEX0JJVFNfWF9TQU1QTEUJICAgICAxNiAgICAgICAgICAgICAgICAgIC8qKjwgQml0cyBwZXIgc2FtcGxlICovDQoNCnR5cGVkZWYgdm9pZCogYmRJTUFEcGo7DQoNCi8qKg0KICogQGFkZHRvZ3JvdXAgZ3JvdXBDYWxsYmFjaw0KICogQHsNCiAqLw0KDQovKioNCiAqIEBicmllZiBDYWxsYmFjayB1c2VkIHRvIGZpbGwgdGhlIHBsYXliYWNrIGJ1ZmZlciBvZiBiZElNQUQuDQogKiBUaGUgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGJkSU1BRCBlYWNoIHRpbWUgYXJlIHJlcXVpcmVkIHNhbXBsZSB0byBiZSBwbGF5ZWQuDQogKiBAcGFyYW1baW5dICpidWZmZXIgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBidWZmZXIgd2l0aCB0aGUgYXVkaW8NCiAqIAkJCQkgICAgICAgc2FtcGxlcyB0byBiZSBwbGF5ZWQoc2hvcnQgdHlwZSkuDQogKiBAcGFyYW1baW5dIG5TYW1wbGVzICAgICAgICAgICAgICAgICBudW1iZXIgb2Ygc2FtcGxlcyByZXF1aXJlZC4NCiAqIEBwYXJhbVtpbl0gdXNlcl9kYXRhICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHVzZXIgZGF0YSBzdHJ1Y3R1cmUNCiAqIAkJCQkgICAgICAgZGVmaW5lZCBpbiB0aGUgYmRJTUFEcGpfU2V0dGluZ190DQogKiAJCQkJICAgICAgIHN0cnVjdHVyZS4NCiAqIEByZXR1cm4gbm9uZS4NCiAqLw0KDQp0eXBlZGVmIGludCAoKiBjYl9maWxsUGxheUJhY2tCX3QpICh2b2lkICpidWZmZXIsIGludCBuU2FtcGxlcywNCgkJCQkgICAgdm9pZCAqdXNlcl9kYXRhKTsNCg0KLyoqDQogKiBAYnJpZWYgQ2FsbGJhY2sgdXNlZCB0byByZXRyaXZlIHRoZSBjYXB1dHJlIGJ1ZmZlciBvZiBiZElNQUQuIFRoZSBmdW5jdGlvbg0KICogaXMgY2FsbGVkIGJ5IGJkSU1BRCBlYWNoIHRpbWUgcHJvY2Vzc2VkIG1pYyBzYW1wbGVzIGFyZSBhdmFpbGFibGUuDQogKiBAcGFyYW1bb3V0XSAqYnVmZmVyICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBidWZmZXIgd2l0aCB0aGUgYXVkaW8NCiAqIAkJCQkgICAgICAgc2FtcGxlcyB0byBkb3dubG9hZChzaG9ydCB0eXBlKS4NCiAqIEBwYXJhbVtpbl0gblNhbXBsZXMgICAgICAgICAgICAgICAgIG51bWJlciBvZiBzYW1wbGVzIHByb2Nlc3NlZCB0byBkb3dubG9hZC4NCiAqIEBwYXJhbVtpbl0gdXNlcl9kYXRhICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHVzZXIgZGF0YSBzdHJ1Y3R1cmUNCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQgaW4gdGhlIE1haW5TZXQgc3RydWN0dXJlLg0KICogQHJldHVybiBub25lLg0KICovDQoNCnR5cGVkZWYgdm9pZCAoKiBjYl9lbXB0eUNhcHR1cmVCX3QpICh2b2lkICpidWZmZXIsIGludCBuU2FtcGxlcywNCgkJCQkgICAgIHZvaWQgKnVzZXJfZGF0YSk7DQovKioNCiAqIEB9DQogKi8NCg0KLyoqDQogKiBAYWRkdG9ncm91cCBncm91cFN0cnVjdEVudW0NCiAqIEB7DQogKi8NCiANCi8qKg0KICogQGJyaWVmIEVycm9yIHN0YXR1cyByZXR1cm5lZCBieSBzb21lIGZ1bmN0aW9ucyBpbiB0aGUgbGlicmFyeS4NCiAqLw0KDQp0eXBlZGVmIGVudW0gYmRJTUFEcGpfU3RhdHVzew0KICAgIC8qKjwgTm8gZXJyb3IuICovDQogICAgQkRfUEpfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLA0KICAgIC8qKjwgV2F0Y2ggYmRJTUFEcGpfV2FybmluZ3NfdCBzdHJ1Y3R1cmUgdG8gZmluZCB0aGUgd2FybmluZ3MuICovDQogICAgQkRfUEpfV0FSTl9CRElNQURfV0FSTklOR19BU1NFUlRFRCAgICAgICAgICAgPSAxLA0KICAgIC8qKjwgRXJyb3Igbm90IGlkZW50aWZpZWQuICovDQogICAgQkRfUEpfRVJST1JfR0VORVJJQyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLA0KICAgIC8qKjwgVGhlIHBvaW50ZXIgcGFzc2VkIGlzIE5VTEwuICovDQogICAgQkRfUEpfRVJST1JfTlVMTF9QT0lOVEVSICAgICAgICAgICAgICAgICAgICAgPSAzLA0KICAgIC8qKjwgQWxsb2NhdGlvbiBwcm9jZWR1cmUgZmFpbGVkLiAqLw0KICAgIEJEX1BKX0VSUk9SX0FMTE9DQVRJT04gICAgICAgICAgICAgICAgICAgICAgID0gNCwNCiAgICAvKio8IFRoZSBwYXJhbWV0ZXIgaXMgbm90IGV4aXN0ZW50IG9yIHRoZSBzZXQvZ2V0IGZ1bmN0aW9uIGlzIG5vdCBhY3RpdmUuICovDQogICAgQkRfUEpfRVJST1JfUEFSQU1FVEVSX05PVF9GT1VORCAgICAgICAgICAgICAgPSA1LA0KICAgIC8qKjwgTm8gY2FwdHVyZSBkZXZpY2UgZm91bmQuICovDQogICAgQkRfUEpfRVJST1JfSU1BRF9OT05FX0NBUFRVUkVfREVWICAgICAgICAgICAgPSAxMCwNCiAgICAvKio8IE5vIHBsYXkgZGV2aWNlIGZvdW5kLiAqLw0KICAgIEJEX1BKX0VSUk9SX0lNQURfTk9ORV9QTEFZX0RFViAgICAgICAgICAgICAgID0gMTEsDQogICAgLyoqPCBGcmFtZSBzaXplIG5vdCBhbGxvd2VkLiAqLw0KICAgIEJEX1BKX0VSUk9SX0lNQURfRlJBTUVfU0laRSAgICAgICAgICAgICAgICAgID0gMTIsDQogICAgLyoqPCBTYW1wbGUgZnJlcXVlbmN5IG5vdCBhbGxvd2VkLiAqLw0KICAgIEJEX1BKX0VSUk9SX0lNQURfU0FNUExFX0ZSRVEgICAgICAgICAgICAgICAgID0gMTMsDQogICAgLyoqPCBTYW1wbGVzIG1pc3NpbmcuICovDQogICAgQkRfUEpfRVJST1JfSU1BRF9NSVNTSU5HX1NBTVBMRVMgICAgICAgICAgICAgPSAxNCwNCiAgICAvKio8IERldmljZSBsaXN0IGlzIGVtcHR5LiAqLw0KICAgIEJEX1BKX0VSUk9SX0lNQURfREVWSUNFX0xJU1RfRU1QVFkgICAgICAgICAgID0gMTUsDQogICAgLyoqPCBMaWJyYXJ5IG5vdCBhdXRob3JpemVkLCBlbnRlcmluZyBkZW1vIG1vZGUuICovDQogICAgQkRfUEpfRVJST1JfSU1BRF9MSUJfTk9UX0FVVEhPUklaRUQgICAgICAgICAgPSAxNiwNCiAgICAvKio8IFRoZSBpbnB1dCBjaGFubmVsIG1lbW9yeSBoYXMgbm90IGJlZW4gYWxsb2NhdGVkLiAqLw0KICAgIEJEX1BKX0VSUk9SX0lNQURfSU5QVVRfQ0hfTk9UX0FMTE9DQVRFRCAgICAgID0gMTcsDQogICAgLyoqPCBUaGUgbGlicmFyeSBoYXMgZXhwaXJlZCwgZW50ZXJpbmcgZGVtbyBtb2RlLiAqLw0KICAgIEJEX1BKX0VSUk9SX0lNQURfTElDRU5TRV9FWFBJUkVEICAgICAgICAgICAgID0gMTgsDQogICAgLyoqPCBPcGVuIG9mIGNhcHR1cmUgZGV2aWNlIGZhaWxlZC4gKi8NCiAgICBCRF9QSl9FUlJPUl9JTUFEX09QRU5fQ0FQVFVSRV9ERVZfRkFJTEVEICAgICA9IDE5LA0KICAgIC8qKjwgT3BlbiBvZiBwbGF5IGRldmljZSBmYWlsZWQuICAqLw0KICAgIEJEX1BKX0VSUk9SX0lNQURfT1BFTl9QTEFZX0RFVl9GQUlMRUQgICAgICAgID0gMjAsDQogICAgLyoqPCBTdGFydCBvZiBwbGF5IGRldmljZSBmYWlsZWQuICovDQogICAgQkRfUEpfRVJST1JfSU1BRF9TVEFSVF9QTEFZX0RFVl9GQUlMRUQgICAgICAgPSAyMSwNCiAgICAvKio8IFN0YXJ0IG9mIGNhcHR1cmUgZGV2aWNlIGZhaWxlZC4gKi8NCiAgICBCRF9QSl9FUlJPUl9JTUFEX1NUQVJUX0NBUFRVUkVfREVWX0ZBSUxFRCAgICA9IDIyLA0KICAgIC8qKjwgU3RhcnQgb2YgdGltZSBwcm9jZXNzIGZhaWxlZC4gKi8NCiAgICBCRF9QSl9FUlJPUl9JTUFEX1NUQVJUX1RJTUVfUFJPQ0VTU19GQUlMRUQgICA9IDIzLA0KICAgIC8qKjwgU3RhcnQgb2YgdGhyZWFkIHByb2Nlc3MgZmFpbGVkLiAqLw0KICAgIEJEX1BKX0VSUk9SX0lNQURfVEhSRUFEX1BST0NFU1NfRkFJTEVEICAgICAgID0gMjQsDQogICAgLyoqPCBObyB2b2x1bWUgY29udHJvbCBhdmFpbGFibGUuICovDQogICAgQkRfUEpfRVJST1JfSU1BRF9OT19WT0xfQ09OVFJPTF9BVkFJTEFCTEUgICAgPSAyNSwNCn0gYmRJTUFEcGpfU3RhdHVzOw0KDQovKioNCiAqIEBicmllZiBQYXJhbWV0ZXIgdG8gcGFzcyB0byBzZXQgYW5kIGdldCBwYXJhbWV0ZXIgZnVuY3Rpb25zLiANCiAqDQogKiBGb3IgZWFjaCBlbnVtZXJhdGlvbiBhcmUgZGVmaW5lZCB0aGUgZGF0YSB0eXBlIGFuZCB0aGUgc3VwcG9ydGVkIG9wZXJhdGlvbnMNCiAqIG9uIHRoYXQgcGFyYW1ldGVyIChzZXQgYW5kIGdldCkuDQogKi8NCiAgIA0KdHlwZWRlZiBlbnVtIGJkSU1BRHBqX1BhcmFtZXRlcnsNCiAgICAvKio8IGludCogICBcbiBzZXQvZ2V0IFxuIDEgZW5hYmxlIC8gMCBkaXNhYmxlIGVjaG8gY2FuY2VsbGF0aW9uLiAqLw0KICAgIEJEX1BBUkFNX0lNQURfUEpfQUVDX0VOQUJMRSAgICAgICAgICAgICAgICAgPSAxLA0KICAgIC8qKjwgaW50KiAgIFxuIHNldC9nZXQgXG4gMSBlbmFibGUgLyAwIGRpc2FibGUgbWljcm9waG9uZSBjb250cm9sDQogICAgICogKHdoZW4gcG9zc2libGUpLiAqLw0KICAgIEJEX1BBUkFNX0lNQURfUEpfTUlDX0NPTlRST0xfRU5BQkxFICAgICAgICAgPSAyLA0KICAgIC8qKjwgaW50KiAgIFxuIHNldC9nZXQgXG4gMSBlYmFibGUgLyAwIGRpc2FibGUgbm9pc2UgcmVkdWN0aW9uLiAqLw0KICAgIEJEX1BBUkFNX0lNQURfUEpfTk9JU0VfUkVEVUNUSU9OX0VOQUJMRSAgICAgPSAzLA0KICAgIC8qKjwgaW50KiAgIFxuIHNldCAgICAgXG4gbnVtYmVyIG9mIGNoYW5uZWwgdG8gcmVzZXQuIFVzZWQgdG8gcmVzZXQNCiAgICAgKiB0aGUgaW5wdXQgY2hhbm5lbCBzdGF0aXN0aWNzLiBUbyBiZSB1c2VkIHdoZW4gdGhlIHNhbWUgY2hhbm5lbA0KICAgICAqIGlzIGFzc2lnbmVkIHRvIGFub3RoZXIgcGFydGVjaXBhbnQuICovDQogICAgQkRfUEFSQU1fSU1BRF9QSl9SRVNFVF9TVEFUSVNUSUNfSU5fQ0ggICAgICA9IDQsDQogICAgLyoqPCBmbG9hdCogXG4gc2V0L2dldCBcbiAwLjBmIC0+IDEuMGYgdm9sdW1lIG9mDQogICAgICogdGhlIG1pY3JvcGhvbmUod2hlbiBwb3NzaWJsZSkuICovDQogICAgQkRfUEFSQU1fSU1BRF9QSl9NSUNfVk9MVU1FICAgICAgICAgICAgICAgICA9IDUsDQogICAgLyoqPCBpbnQqICAgXG4gc2V0L2dldCBcbiAwIG11dGUgLyAxIG5vdCBtdXRlIG9uIG1pY3JvcGhvbmUNCiAgICAgKiAod2hlbiBwb3NzaWJsZSkuICovDQogICAgQkRfUEFSQU1fSU1BRF9QSl9NSUNfTVVURSAgICAgICAgICAgICAgICAgICA9IDYsDQogICAgLyoqPCBmbG9hdCogXG4gc2V0L2dldCBcbiAwLjBmIC0+IDEuMGYgdm9sdW1lIG9mIHRoZSBzcGVha2VyLiAqLw0KICAgIEJEX1BBUkFNX0lNQURfUEpfU1BLX1ZPTFVNRSAgICAgICAgICAgICAgICAgPSA3LA0KICAgIC8qKjwgaW50KiAgIFxuIHNldC9nZXQgXG4gMCBtdXRlIC8gMSBub3QgbXV0ZSBvbiBzcGVha2VyLiAqLw0KICAgIEJEX1BBUkFNX0lNQURfUEpfU1BLX01VVEUgICAgICAgICAgICAgICAgICAgPSA4LA0KfSBiZElNQURwal9QYXJhbWV0ZXI7DQoNCg0KLyoqDQogKiBAYnJpZWYgSW5zdGFuY2Ugc3RydWN0dXJlIGZvciB0aGUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBhZWMgZW5naW5lLg0KICovDQoNCnR5cGVkZWYgc3RydWN0IGJkSU1BRHBqX1NldHRpbmdfdHsNCiAgICAvKio8IFNhbXBsZSBmcmVxdWVuY3kgKDhrSHogb3IgMTZrSHopLiAqLw0KICAgIGludCAgICAgICAgICAgICAgICAgU2FtcGxpbmdGcmVxdWVuY3k7DQogICAgLyoqPCBBdWRpbyBidWZmZXIgbWFuYWdlZCBieSB0aGUgYWVjIGJkSU1BRCBmdW5jdGlvbnMuDQogICAgICogKGZyb20gMTZtcyB0byA4MG1zLCAxNm1zIHJlY29tbWVuZGVkKS4gKi8NCiAgICBpbnQgICAgICAgICAgICAgICAgIEZyYW1lU2l6ZV9tczsNCiAgICAvKio8IFBvaW50cyB0byB0aGUgdmFsaWRhdGlvbiBmdW5jdGlvbnMgaW4gdGhlIHZhbGlkYXRpb24gbGlicmFyeS4gKi8NCiAgICB2b2lkICAgICAgICAgICAgICAgICp2YWxpZGF0ZTsNCiAgICAvKio8IFBvaW50cyB0byB0aGUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHVzZWQgZm9yIGZpbGxpbmcNCiAgICAgKiB0aGUgcGxheWJhY2sgYnVmZmVyIG9mIGJkSU1BRC4gKi8NCiAgICBjYl9maWxsUGxheUJhY2tCX3QgIGNiX2ZpbGxQbGF5QmFja0J1ZmZlcjsNCiAgICAvKio8IFBvaW50cyB0byB1c2VyIGRhdGEgdG8gcGFzcyB0byB0aGUgY2FsbGJhY2suICovDQogICAgdm9pZCAgICAgICAgICAgICAgICAqY2JfZmlsbFBsYXlCYWNrQnVmZmVyX3VzZXJfZGF0YTsNCiAgICAvKio8IFBvaW50cyB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdXNlZCBmb3IgcmV0cmVpdmUgdGhlIHByb2Nlc3NlZA0KICAgICAqIGF1ZGlvIHByZXNlbnQgaW4gdGhlIGNhcHR1cmUgYnVmZmVyIG9mIGJkSU1BRC4gKi8NCiAgICBjYl9lbXB0eUNhcHR1cmVCX3QgIGNiX2VtcHR5Q2FwdHVyZUJ1ZmZlcjsNCiAgICAvKio8IFBvaW50cyB0byB1c2VyIGRhdGEgdG8gcGFzcyB0byB0aGUgY2FsbGJhY2suICovDQogICAgdm9pZCAgICAgICAgICAgICAgICAqY2JfZW1wdHlDYXB0dXJlQnVmZmVyX3VzZXJfZGF0YTsNCiAgICAvKio8IElzIGEgd2lkZSBjaGFyIHBvaW50ZXIgdG8gdGhlIGNhcHR1cmUgZGV2aWNlIG5hbWUuICovDQogICAgd2NoYXJfdCAgICAgICAgICAgICAqQ2FwdHVyZURldmljZTsNCiAgICAvKio8IElzIGEgd2lkZSBjaGFyIHBvaW50ZXIgdG8gdGhlIHBsYXkgZGV2aWNlIG5hbWUuICovDQogICAgd2NoYXJfdCAgICAgICAgICAgICAqUGxheURldmljZTsNCiAgICAvKio8IFRydWUgdG8gZW5hYmxlIGRpYWdub3N0aWMsIGZhbHNlIHRvIGRpc2FibGUuICovDQogICAgaW50IAkgICAgICAgICAgICBEaWFnbm9zdGljRW5hYmxlOw0KICAgIC8qKjwgRGlyZWN0b3J5IHdoaWNoIHdpbGwgY29udGFpbnMgdGhlIGZpbGVzIGdlbmVyYXRlZCBmb3IgZGlhZ25vc3RpYy4gKi8NCiAgICB3Y2hhcl90ICAgICAgICAgICAgICpEaWFnbm9zdGljRm9sZGVyUGF0aDsNCiAgICAvKio8IElzIGFuIGF1eGlsaWFyeSBzZXR0aW5ncyBwb2ludGVyIHVzZWQgaW50ZXJuYWxseSBieSBiZElNQUQuICovDQogICAgdm9pZCAgICAgICAgICAgICAgICAqYmRJTUFEd3JfU2V0dGluZ3NEYXRhOw0KfSBiZElNQURwal9TZXR0aW5nX3Q7DQoNCi8qKg0KICogQGJyaWVmIEluc3RhbmNlIHN0cnVjdHVyZSBmb3IgdGhlIHdhcm5pbmdzIGdlbmVyYXRlZCBieSB0aGUgaW5pdGlhbGl6YXRpb24NCiAqIGZ1bmN0aW9ucy4NCiAqLw0KDQp0eXBlZGVmIHN0cnVjdCBiZElNQURwal9XYXJuaW5nc190ew0KICAgIC8qKjwgVGhlIGNhcHR1cmUgZGV2aWNlIGluZGljYXRlZCBjYW4ndCBiZSBvcGVuZWQsIGhhcyBiZWVuIHNlbGVjdGVkDQogICAgICogdGhlIGRlZmF1bHQgY2FwdHVyZSBkZXZpY2UuICovDQogICAgaW50IERlZmF1bHRDYXB0dXJlRGV2aWNlQXV0b21hdGljYWxseVNlbGVjdGVkOw0KICAgIC8qKjwgVGhlIGNhcHR1cmUgZGV2aWNlIG9wZW5lZCBoYXMgbm90IHZvbHVtZSBjb250cm9sLiAqLw0KICAgIGludCBDYXB0dXJlRGV2aWNlV2l0aG91dFZvbHVtZUNvbnRyb2w7DQogICAgLyoqPCBUaGUgcGxheSBkZXZpY2UgaW5kaWNhdGVkIGNhbid0IGJlIG9wZW5lZCwgaGFzIGJlZW4gc2VsZWN0ZWQNCiAgICAgKiB0aGUgZGVmYXVsdCBwbGF5IGRldmljZS4gKi8NCiAgICBpbnQgRGVmYXVsdFBsYXlEZXZpY2VBdXRvbWF0aWNhbGx5U2VsZWN0ZWQ7DQogICAgLyoqPCBUaGUgbnVtYmVyIG9mIGNoYW5uZWwgcmVxdWVzdGVkIGlzIG91dCBvZiByYW5nZS4gVGhlIG51bWJlciBvZg0KICAgICAqIGNoYW5uZWwgb3BlbmVkIGlzIGVxdWFsIHRvIHRoZSBtYXhpbXVtLiAqLw0KICAgIGludCBOdW1iZXJPZkNoYW5uZWxzT3V0T2ZSYW5nZTsNCiAgICAvKio8IFRoZSBkaWFnbm9zdGljIGZpbGVzIGNvdWxkIG5vdCBiZSBzYXZlZC4gKi8NCiAgICBpbnQgRGlhZ25vc3RpY1NhdmVOb3RBbGxvd2VkOw0KICAgIC8qKjwgVGhlIG5scCBsZXZlbCByZXF1ZXN0ZWQgaXMgbm90IGFsbG93ZWQsIGl0IGhhcyBiZWVuIGF1dG9tYXRpY2FsbHkNCiAgICAgKiBjaGFuZ2VkIHRvIHRoZSBkZWZhdWx0IHZhbHVlLiAqLw0KICAgIGludCBubHBMZXZlbENoYW5nZVNldHR0aW5nOw0KICAgIC8qKjwgTm8gY2FwdHVyZSBkZXZpY2UgaXMgcHJlc2VudC4gQW55d2F5IHRoZSBiZFNFUyBoYXMgYmVlbg0KICAgICAqIGlzdGFudGlhdGVkIG9ubHkgZm9yIHBsYXliYWNrLiAqLw0KICAgIGludCBOb0NhcHR1cmVEZXZpY2VQcmVzZW50Ow0KICAgIC8qKjwgVGhlIGNwdSBpcyBub3QgYWRhcHQgdG8gcnVuIHRoZSBhZWMgZW5naW5lLCB0aGUgYWVjIGhhcyBiZWVuIGRpc2FibGVkLg0KICAgICAqIFRoaXMgYXBwZW5zIGZvciB2ZXJ5IG9sZCBjcHUgbGlrZSBwZW50aXVtIElJSS4gKi8NCiAgICBpbnQgb2xkQ1BVZGV0ZWN0ZWRfQUVDZGlzYWJsZTsNCiAgICAvKio8IFdpbmRvd3MgRGlyZWN0IFNvdW5kIGVycm9yLiAqLw0KICAgIGxvbmcgZGlyZWN0U291bmRFcnJvcjsNCiAgICAvKio8IFdpbmRvd3MgRGlyZWN0IFNvdW5kIHZvbHVtZSBlcnJvci4gKi8NCiAgICBsb25nIGRpcmVjdFNvdW5kTGV2ZWw7DQogICAgLyoqPCBObyBwbGF5IGRldmljZSBpcyBwcmVzZW50LiBBbnl3YXkgdGhlIGJkU0VTIGhhcyBiZWVuIGlzdGFudGlhdGVkDQogICAgICogb25seSBmb3IgY2FwdHVyZS4gKi8NCiAgICBpbnQgTm9QbGF5RGV2aWNlUHJlc2VudDsNCn0gYmRJTUFEcGpfV2FybmluZ3NfdDsNCg0KLyoqDQogKiBAYnJpZWYgSW5zdGFuY2Ugc3RydWN0dXJlIGZvciB0aGUgbGlicmFyeSB2ZXJzaW9uDQogKi8NCg0KdHlwZWRlZiBzdHJ1Y3QgYmRJTUFEcGpfbGliVmVyc2lvbl90ew0KICAgIGludCAgICAgbWFqb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IG1ham9yIHZlcnNpb24uICovDQogICAgaW50CSAgICBtaW5vcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgbWlub3IgdmVyc2lvbi4gKi8NCiAgICBpbnQJICAgIGJ1aWxkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBidWlsZCBudW1iZXIuICovDQogICAgY2hhciAgICAqbmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgbmFtZSAiYmRJTUFEcGogdmVyLlgiLiAqLw0KICAgIGNoYXIgICAgKnZlcnNpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJldGEsIFJDLCByZWxlYXNlLiAqLw0KICAgIGNoYXIgICAgKmJ1aWxkRGF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJ1aWxkIGRhdGUuICovDQp9IGJkSU1BRHBqX2xpYlZlcnNpb25fdDsNCg0KLyoqDQogKiBAfQ0KICovDQoNCg0KDQovKioNCiAqIEBhZGR0b2dyb3VwIGdyb3VwRnVuY3Rpb24NCiAqIEB7DQogKi8NCg0KI2lmZGVmIF9fY3BsdXNwbHVzDQpleHRlcm4gIkMiIHsNCiNlbmRpZg0KDQovKioNCiAqIEBicmllZiBNdXN0IGJlIHVzZWQgdG8gYWxsb2NhdGUgYW5kIHNldCB0byBkZWZhdWx0IHBhcmFtZXRlciB0aGUgbWVtb3J5DQogKiBmb3IgdGhlIGJkSU1BRC4NCiAqDQogKiBUaGUgZnVuY3Rpb24gZ2VuZXJhdGUgYSBzdHJ1Y3R1cmUgYmRJTUFEcGpfU2V0dGluZ190IGZpbGxlZCB3aXRoIHRoZQ0KICogZGVmYXVsdCBzZXR0aW5ncy4NCiAqIFxuIFRoZSB1c2VyIGNhbiBjaGFuZ2UgdGhpcyBzZXR0aW5ncyBhY2NvcmRpbmcgdG8gdGhlIG5lZWQgYW5kIHRoZW4NCiAqIGxhdW5jaCB0aGUgOjpiZElNQURwal9Jbml0QUVDLg0KICogXG4gVGhlIGZ1bmN0aW9uIGdlbmVyYXRlIGFsc28gYSB3YXJuaW5nIHN0cnVjdHVyZSAoOjpiZElNQURwal9XYXJuaW5nc190KQ0KICogdGhhdCBjb3VsZCBiZSB1c2VkIGluIDo6YmRJTUFEcGpfSW5pdEFFQyB0byBoYW5kbGUgZXZlbnR1YWwgd2FybmluZ3MuDQogKiBAcGFyYW1bb3V0XSAqKnBwU2V0dGluZ3MgICAgICAgICAgICBQb2ludHMgdG8gdGhlIHBvaW50ZXIgb2YgdGhlDQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgOjpiZElNQURwal9TZXR0aW5nX3QuDQogKiBAcGFyYW1bb3V0XSAqKnBwV2FybmluZ01lc3NhZ2VzICAgICBQb2ludHMgdG8gdGhlIHBvaW50ZXIgb2YgdGhlDQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgOjpiZElNQURwal9XYXJuaW5nc190Lg0KICogQHJldHVybiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpCRF9QSl9PSyBpZiB0aGUgZnVuY3Rpb24gaGFzIGJlZW4NCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZCBzdWNjZXNzZnVsbHksIG90aGVyd2lzZSByZXR1cm4NCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIGVycm9yIChyZWZlciB0byA6OmJkSU1BRHBqX1N0YXR1cykuDQogKi8NCkJESU1BRFBKX0FQSSBiZElNQURwal9TdGF0dXMgYmRJTUFEcGpfQ3JlYXRlU3RydWN0dXJlcygNCgkJCQkgICAgYmRJTUFEcGpfU2V0dGluZ190ICoqcHBTZXR0aW5ncywNCgkJCQkgICAgYmRJTUFEcGpfV2FybmluZ3NfdCAqKnBwV2FybmluZ01lc3NhZ2VzKTsNCg0KLyoqDQogKiBAYnJpZWYgSXMgdXNlZCB0byBmcmVlIHRoZSBtZW1vcnkgZm9yIHRoZSA6OmJkSU1BRHBqX1NldHRpbmdfdCBzdHJ1Y3R1cmUgYW5kDQogKiA6OmJkSU1BRHBqX1dhcm5pbmdzX3Qgc3RydWN0dXJlIGFsbG9jYXRlZCB3aXRoDQogKiB0aGUgOjpiZElNQURwal9DcmVhdGVTdHJ1Y3R1cmVzLg0KICogQHBhcmFtW2luXSAqKnBwU2V0dGluZ3MgICAgICAgICAgICAgUG9pbnRlciB0byBhIG1lbW9yeSBsb2NhdGlvbiBmaWxsZWQNCiAqIAkJCQkgICAgICAgd2l0aCB0aGUgYWRkcmVzcyBvZiB0aGUNCiAqIAkJCQkgICAgICAgOjpiZElNQURwal9TZXR0aW5nX3Qgc3RydWN0dXJlIHRvIGZyZWUuDQogKiBUaGlzIGFkZHJlc3Mgd2lsbCBiZSBzZXQgdG8gTlVMTC4NCiAqIEBwYXJhbVtpbl0gKipwcFdhcm5pbmdNZXNzYWdlcyAgICAgIFBvaW50ZXIgdG8gYSBtZW1vcnkgbG9jYXRpb24gZmlsbGVkDQogKiAJCQkJICAgICAgIHdpdGggdGhlIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZA0KICogCQkJCSAgICAgICA6OmJkSU1BRHBqX1dhcm5pbmdzX3Qgc3RydWN0dXJlIHRvIGZyZWUuDQogKiAJCQkJICAgICAgIFRoaXMgYWRkcmVzcyB3aWxsIGJlIHNldCB0byBOVUxMLg0KICogQHJldHVybiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpCRF9QSl9PSyBpZiB0aGUgZnVuY3Rpb24gaGFzIGJlZW4NCiAqIAkJCQkgICAgICAgcGVyZm9ybWVkIHN1Y2Nlc3NmdWxseSwgb3RoZXJ3aXNlIHJldHVybg0KICogCQkJCSAgICAgICBhbiBlcnJvciAocmVmZXIgdG8gOjpiZElNQURwal9TdGF0dXMpLg0KICovDQpCRElNQURQSl9BUEkgYmRJTUFEcGpfU3RhdHVzIGJkSU1BRHBqX0ZyZWVTdHJ1Y3R1cmVzKA0KCQkJCSAgICBiZElNQURwal9TZXR0aW5nX3QgKipwcFNldHRpbmdzLA0KCQkJCSAgICBiZElNQURwal9XYXJuaW5nc190ICoqcHBXYXJuaW5nTWVzc2FnZXMpOw0KDQovKioNCiAqIEBicmllZiBJcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIG1lbW9yeSBmb3IgYmRJTUFEIHdpdGggdGhlIHNldHRpbmdzDQogKiBjb250YWluZWQgaW4gdGhlIDxjb2RlPnBwU2V0dGluZ3M8L2NvZGU+Lg0KICogQHBhcmFtW291dF0gKnBCZElNQURJbnN0YW5jZSAgICAgICAgSXMgdGhlIHBvaW50ZXIgdG8gdGhlIGJkSU1BRCBvYmplY3QuDQogKiBAcGFyYW1baW5dICoqcHBTZXR0aW5ncyAgICAgICAgICAgICBQb2ludGVyIHRvIHBvaW50ZXIgdG8gYQ0KICogCQkJCSAgICAgICA6OmJkSU1BRHBqX1NldHRpbmdfdCBzdHJ1Y3R1cmUsIGZpbGxlZA0KICogCQkJCSAgICAgICB3aXRoIGluaXRpYWxpemF0aW9uIHNldHRpbmdzIHRvIGJlDQogKiAJCQkJICAgICAgIGFwcGxpZWQgdG8gdGhlIGJkSU1BRC4NCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIE5vdGUsIHRoZSA8Y29kZT5wQmRJTUFESW5zdGFuY2U8L2NvZGU+DQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBtb2RpZmllZCB3aXRoIHRoZSBhcHBsaWVkIHNldHRpbmdzLg0KICogQHBhcmFtW291dF0gKipwcFdhcm5pbmdNZXNzYWdlcyAgICAgUG9pbnRlciB0byBwb2ludGVyIHRvIGENCiAqIAkJCQkgICAgICAgOjpiZElNQURwal9XYXJuaW5nc190IHNydWN0dXJlLA0KICogCQkJCSAgICAgICB3aGljaCByZXBvcnRzIHRoZSB3YXJuaW5ncyBhZnRlciB0aGUNCiAqIAkJCQkgICAgICAgaW5pdGlhbGl6YXRpb24uDQogKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OkJEX1BKX09LIGlmIHRoZSBmdW5jdGlvbiBoYXMgYmVlbg0KICogCQkJCSAgICAgICBwZXJmb3JtZWQgc3VjY2Vzc2Z1bGx5LCBvdGhlcndpc2UgcmV0dXJuDQogKiAJCQkJICAgICAgIGFuIGVycm9yIChyZWZlciB0byA6OmJkSU1BRHBqX1N0YXR1cykuDQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiBJZiB0aGUgZXJyb3IgaXMNCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6QkRfUEpfV0FSTl9CRElNQURfV0FSTklOR19BU1NFUlRFRA0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGluaXQgaGFzIGJlZW4gcGVyZm9ybWVkIHdpdGggc3VjY2VzcywNCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCB3aXRoIGEgZGlmZmVyZW50IHNldHRpbmdzDQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwZWN0IHRvIHRoZSBvbmVzIHJlcXVpcmVkLg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBtYWlubHkgaGFwcGVucyBpZiB0aGUgYXVkaW8NCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSBvcGVuZWQgaXMgZGlmZmVyZW50IHRvIHRoZQ0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lIHJlcXVlc3RlZC4NCiAqLw0KQkRJTUFEUEpfQVBJIGJkSU1BRHBqX1N0YXR1cyBiZElNQURwal9Jbml0QUVDKGJkSU1BRHBqICpwQmRJTUFESW5zdGFuY2UsDQoJCQkJICAgICAgYmRJTUFEcGpfU2V0dGluZ190ICoqcHBTZXR0aW5ncywNCgkJCQkgICAgICBiZElNQURwal9XYXJuaW5nc190ICoqcHBXYXJuaW5nTWVzc2FnZXMpOw0KDQovKioNCiAqIEBicmllZiBJcyB1c2VkIHRvIGZyZWUgdGhlIGJkSU1BRCBvYmplY3QgcG9pbnRlZCBieSB0aGUNCiAqIDxjb2RlPnBCZElNQURJbnN0YW5jZTwvY29kZT4uDQogKiBAcGFyYW1baW5dICpwQmRJTUFESW5zdGFuY2UgICAgICAgICBQb2ludGVyIHRvIHRoZSBiZElNQUQgb2JqZWN0IHRvIGZyZWUuDQogKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OkJEX1BKX09LIGlmIHRoZSBmdW5jdGlvbiBoYXMgYmVlbg0KICogCQkJCSAgICAgICBwZXJmb3JtZWQgc3VjY2Vzc2Z1bGx5LCBvdGhlcndpc2UgcmV0dXJuDQogKiAJCQkJICAgICAgIGFuIGVycm9yIChyZWZlciB0byA6OmJkSU1BRHBqX1N0YXR1cykuDQogKi8NCkJESU1BRFBKX0FQSSBiZElNQURwal9TdGF0dXMgYmRJTUFEcGpfRnJlZUFFQyhiZElNQURwaiAqcEJkSU1BREluc3RhbmNlKTsNCg0KLyoqDQogKiBAYnJpZWYgSXMgdXNlZCB0byBtYWtlIGEgbGlzdCBvZiBjYXB1cmUgYW5kIHBsYXkgZGV2aWNlcyBhdmFpbGFibGUNCiAqIG9uIHRoZSBzeXN0ZW0uDQogKiBAcGFyYW1baW5dIGNhcHR1cmVEZXZpY2UgICAgICAgICAgICBTZXQgdG8gMSB0byBnZXQgdGhlIGxpc3Qgb2YgY2FwdHVyZQ0KICogCQkJCSAgICAgICBkZXZpY2VzLiBTZXQgdG8gMCB0byBnZXQgdGhlIGxpc3Qgb2YNCiAqIAkJCQkgICAgICAgcGxheSBkZXZpY2VzLg0KICogQHBhcmFtW2luXSAqKmRldmljZU5hbWUgICAgICAgICAgICAgUG9pbnRlciB0byBwb2ludGVyIHRvIGEgd2lkZSBjaGFyDQogKiAJCQkJICAgICAgIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGNhcHR1cmUvcGxheQ0KICogCQkJCSAgICAgICBkZXZpY2VzLg0KICogQHJldHVybiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpCRF9QSl9PSyBpZiB0aGUgZnVuY3Rpb24gaGFzIGJlZW4NCiAqIAkJCQkgICAgICAgcGVyZm9ybWVkIHN1Y2Nlc3NmdWxseSwgb3RoZXJ3aXNlIHJldHVybg0KICogCQkJCSAgICAgICBhbiBlcnJvciAocmVmZXIgdG8gOjpiZElNQURwal9TdGF0dXMpLg0KICovDQpCRElNQURQSl9BUEkgYmRJTUFEcGpfU3RhdHVzIGJkSU1BRHBqX2dldERldmljZU5hbWUoaW50IGNhcHR1cmVEZXZpY2UsDQoJCQkJCQkgICAgd2NoYXJfdCAqKmRldmljZU5hbWUpOw0KDQovKioNCiAqIEBicmllZiBJcyB1c2VkIHRvIGZyZWV6ZSB0aGUgYmRJTUFELCBzdG9wcGluZyB0aGUgYXVkaW8gcGxheWJhY2sNCiAqIGFuZCByZWNvcmRpbmcuDQogKiBAcGFyYW1baW5dIGJkSU1BREluc3RhbmNlICAgICAgICAgICBiZElNQUQgb2JqZWN0Lg0KICogQHJldHVybiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpCRF9QSl9PSyBpZiB0aGUgZnVuY3Rpb24gaGFzIGJlZW4NCiAqIAkJCQkgICAgICAgcGVyZm9ybWVkIHN1Y2Nlc3NmdWxseSwgb3RoZXJ3aXNlDQogKiAJCQkJICAgICAgIHJldHVybiBhbiBlcnJvciAocmVmZXIgdG8NCiAqIAkJCQkgICAgICAgOjpiZElNQURwal9TdGF0dXMpLg0KICovDQpCRElNQURQSl9BUEkgYmRJTUFEcGpfU3RhdHVzIGJkSU1BRHBqX3N0b3AoYmRJTUFEcGogYmRJTUFESW5zdGFuY2UpOw0KDQovKioNCiAqIEBicmllZiBJcyB1c2VkIHRvIHB1dCBiYWNrIGluIHBsYXkgdGhlIGF1ZGlvIGFmdGVyIGl0IGhhcyBiZWVuIHN0b3BwZWQgYnkgdGhlDQogKiA6OmJkSU1BRHBqX3N0b3AgZnVuY3Rpb25zLg0KICogQHBhcmFtW2luXSBiZElNQURJbnN0YW5jZSAgICAgICAgICAgYmRJTUFEIG9iamVjdC4NCiAqIEByZXR1cm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6QkRfUEpfT0sgaWYgdGhlIGZ1bmN0aW9uIGhhcyBiZWVuDQogKiAJCQkJICAgICAgIHBlcmZvcm1lZCBzdWNjZXNzZnVsbHksIG90aGVyd2lzZQ0KICogCQkJCSAgICAgICByZXR1cm4gYW4gZXJyb3IgKHJlZmVyIHRvDQogKiAJCQkJICAgICAgIDo6YmRJTUFEcGpfU3RhdHVzKS4NCiAqLw0KQkRJTUFEUEpfQVBJIGJkSU1BRHBqX1N0YXR1cyBiZElNQURwal9ydW4oYmRJTUFEcGogYmRJTUFESW5zdGFuY2UpOw0KDQovKioNCiAqIEBicmllZiBQcmludCBvbiBhIHN0YW5kYXJkIG91dHB1dCB0aGUgd2FybmluZyBtZXNzYWdlcy4NCiAqIEBwYXJhbVtpbl0gKnBXYXJuaW5nTWVzc2FnZXMgICAgICAgIFBvaW50ZXIgdG8gdGhlIHdhcm5pbmcgc3RydWN0dXJlDQogKiAJCQkJICAgICAgIHRvIGJlIHByaW50ZWQuDQogKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OkJEX1BKX09LIGlmIHRoZSBmdW5jdGlvbiBoYXMgYmVlbg0KICogCQkJCSAgICAgICBwZXJmb3JtZWQgc3VjY2Vzc2Z1bGx5LCBvdGhlcndpc2UNCiAqIAkJCQkgICAgICAgcmV0dXJuIGFuIGVycm9yDQogKiAJCQkJICAgICAgIChyZWZlciB0byA6OmJkSU1BRHBqX1N0YXR1cykuDQogKi8NCkJESU1BRFBKX0FQSSBiZElNQURwal9TdGF0dXMgYmRJTUFEcGpfRGlzcGxheVdhcm5pbmdzKA0KCQkJCQliZElNQURwal9XYXJuaW5nc190ICpwV2FybmluZ01lc3NhZ2VzKTsNCg0KLyoqDQogKiBAYnJpZWYgQ2xlYXIgdGhlIHdhcm5pbmcgc3RydWN0dXJlIGFmdGVyIGJlaW5nIHJlYWQuDQogKiBAcGFyYW1bb3V0XSAqKnBwV2FybmluZ01lc3NhZ2VzICAgICBQb2ludGVyIHRvIHBvaW50ZXIgdG8gdGhlIHdhcm5pbmcNCiAqIAkJCQkgICAgICAgc3RydWN0dXJlIHRvIGJlIGNsZWFyZWQuDQogKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OkJEX1BKX09LIGlmIHRoZSBmdW5jdGlvbiBoYXMgYmVlbg0KICogCQkJCSAgICAgICBwZXJmb3JtZWQgc3VjY2Vzc2Z1bGx5LCBvdGhlcndpc2UNCiAqIAkJCQkgICAgICAgcmV0dXJuIGFuIGVycm9yIChyZWZlciB0bw0KICogCQkJCSAgICAgICA6OmJkSU1BRHBqX1N0YXR1cykuDQogKi8NCkJESU1BRFBKX0FQSSBiZElNQURwal9TdGF0dXMgYmRJTUFEcGpfQ2xlYXJBbGxXYXJuaW5ncygNCgkJCQkgICAgICAgYmRJTUFEcGpfV2FybmluZ3NfdCAqKnBwV2FybmluZ01lc3NhZ2VzKTsNCg0KLyoqDQogKiBAYnJpZWYgSXMgdXNlZCB0byBzZXQgYSBwYXJhbWV0ZXIgb2YgdGhlIGJkSU1BRCBvYmplY3QgcG9pbnRlZCBieSB0aGUNCiAqIDxjb2RlPnBCZElNQURJbnN0YW5jZTwvY29kZT4uDQogKiBAcGFyYW1baW5dIGJkSU1BREluc3RhbmNlICAgICAgICAgICBiZElNQUQgb2JqZWN0Lg0KICogQHBhcmFtW2luXSBwYXJhbWV0ZXJOYW1lICAgICAgICAgICAgSW5kaWNhdGUgdGhlIHBhcmFtZXRlciB0byBzZXQuDQogKiBAcGFyYW1baW5dICpwVmFsdWUgICAgICAgICAgICAgICAgICBJcyBhIHBvaW50ZXIgdG8gdGhlIHZhbHVlIHRvIHNldA0KICogCQkJCSAgICAgICBjYXN0IHRvIHZvaWQuDQogKiAJCQkJICAgICAgIFxuIEluIHRoZSA6OmJkSU1BRHBqX1BhcmFtZXRlcg0KICogCQkJCSAgICAgICBkZWNsYXJhdGlvbiBpcyBpbmRpY2F0ZWQgdGhlIHJlYWwgdHlwZSBvZg0KICogCQkJCSAgICAgICB0aGUgdmFsdWUsIGRlcGVuZGluZyBvbiB0aGUNCiAqIAkJCQkgICAgICAgPGNvZGU+cGFyYW1ldGVyTmFtZTwvY29kZT4uDQogKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OkJEX1BKX09LIGlmIHRoZSBmdW5jdGlvbiBoYXMgYmVlbg0KICogCQkJCSAgICAgICBwZXJmb3JtZWQgc3VjY2Vzc2Z1bGx5LCBvdGhlcndpc2UNCiAqIAkJCQkgICAgICAgcmV0dXJuIGFuIGVycm9yIChyZWZlciB0bw0KICogCQkJCSAgICAgICCnOjpiZElNQURwal9TdGF0dXMpLg0KICovDQpCRElNQURQSl9BUEkgYmRJTUFEcGpfU3RhdHVzIGJkSU1BRHBqX3NldFBhcmFtZXRlcihiZElNQURwaiBiZElNQURJbnN0YW5jZSwNCgkJCQliZElNQURwal9QYXJhbWV0ZXIgcGFyYW1ldGVyTmFtZSwgdm9pZCAqcFZhbHVlKTsNCg0KLyoqDQogKiBAYnJpZWYgSXMgdXNlZCB0byBnZXQgYSBwYXJhbWV0ZXIgb2YgdGhlIGJkSU1BRCBvYmplY3QgcG9pbnRlZCBieSB0aGUNCiAqIDxjb2RlPnBCZElNQURJbnN0YW5jZTwvY29kZT4uDQogKiBAcGFyYW1baW5dIGJkSU1BREluc3RhbmNlICAgICAgICAgICBiZElNQUQgb2JqZWN0Lg0KICogQHBhcmFtW2luXSBwYXJhbWV0ZXJOYW1lICAgICAgICAgICAgSW5kaWNhdGUgdGhlIHBhcmFtZXRlciB0byBnZXQuDQogKiBAcGFyYW1bb3V0XSAqcFZhbHVlICAgICAgICAgICAgICAgICBJcyBhIHBvaW50ZXIgdG8gdGhlIHZhbHVlIHRvIGdldCBjYXN0DQogKiAJCQkJICAgICAgIHRvIHZvaWQuIFxuIEluIHRoZQ0KICogCQkJCSAgICAgICA6OmJkSU1BRHBqX1BhcmFtZXRlciBkZWNsYXJhdGlvbiBpcw0KICogCQkJCSAgICAgICBpbmRpY2F0ZWQgdGhlIHJlYWwgdHlwZSBvZiB0aGUgdmFsdWUsDQogKiAJCQkJICAgICAgIGRlcGVuZGluZyBvbiB0aGUNCiAqIAkJCQkgICAgICAgPGNvZGU+cGFyYW1ldGVyTmFtZTwvY29kZT4uDQogKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OkJEX1BKX09LIGlmIHRoZSBmdW5jdGlvbiBoYXMgYmVlbg0KICogCQkJCSAgICAgICBwZXJmb3JtZWQgc3VjY2Vzc2Z1bGx5LCBvdGhlcndpc2UgcmV0dXJuDQogKiAJCQkJICAgICAgIGFuIGVycm9yIChyZWZlciB0byA6OmJkSU1BRHBqX1N0YXR1cykuDQogKi8NCkJESU1BRFBKX0FQSSBiZElNQURwal9TdGF0dXMgYmRJTUFEcGpfZ2V0UGFyYW1ldGVyKGJkSU1BRHBqIGJkSU1BREluc3RhbmNlLA0KCQkJCWJkSU1BRHBqX1BhcmFtZXRlciBwYXJhbWV0ZXJOYW1lLCB2b2lkICpwVmFsdWUpOw0KDQoNCiNpZmRlZiBfX2NwbHVzcGx1cw0KfQ0KI2VuZGlmDQovKioNCiAqIEB9DQogKi8NCg0KI2VuZGlmIC8vQkRfSU1BRF9QSl9IX18NCg==