I2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgojaW5jbHVkZSA8YXNtL2RtYS5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CiNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiNpbmNsdWRlIDxhc20vdGltZXIuaD4KI2luY2x1ZGUgPGFzbS9wY2ktZGlyZWN0Lmg+CgojaW5jbHVkZSAiY3B1LmgiCgovKgogKiBSZWFkIE5TQy9DeXJpeCBERVZJRCByZWdpc3RlcnMgKERJUikgdG8gZ2V0IG1vcmUgZGV0YWlsZWQgaW5mby4gYWJvdXQgdGhlIENQVQogKi8Kc3RhdGljIHZvaWQgX19jcHVpbml0IGRvX2N5cml4X2RldmlkKHVuc2lnbmVkIGNoYXIgKmRpcjAsIHVuc2lnbmVkIGNoYXIgKmRpcjEpCnsKCXVuc2lnbmVkIGNoYXIgY2NyMiwgY2NyMzsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgkKCS8qIHdlIHRlc3QgZm9yIERFVklEIGJ5IGNoZWNraW5nIHdoZXRoZXIgQ0NSMyBpcyB3cml0YWJsZSAqLwoJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwoJY2NyMyA9IGdldEN4ODYoQ1g4Nl9DQ1IzKTsKCXNldEN4ODYoQ1g4Nl9DQ1IzLCBjY3IzIF4gMHg4MCk7CglnZXRDeDg2KDB4YzApOyAgIC8qIGR1bW15IHRvIGNoYW5nZSBidXMgKi8KCglpZiAoZ2V0Q3g4NihDWDg2X0NDUjMpID09IGNjcjMpIHsgICAgICAgLyogbm8gREVWSUQgcmVncy4gKi8KCQljY3IyID0gZ2V0Q3g4NihDWDg2X0NDUjIpOwoJCXNldEN4ODYoQ1g4Nl9DQ1IyLCBjY3IyIF4gMHgwNCk7CgkJZ2V0Q3g4NigweGMwKTsgIC8qIGR1bW15ICovCgoJCWlmIChnZXRDeDg2KENYODZfQ0NSMikgPT0gY2NyMikgLyogb2xkIEN4NDg2U0xDL0RMQyAqLwoJCQkqZGlyMCA9IDB4ZmQ7CgkJZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDeDQ4NlMgQSBzdGVwICovCgkJCXNldEN4ODYoQ1g4Nl9DQ1IyLCBjY3IyKTsKCQkJKmRpcjAgPSAweGZlOwoJCX0KCX0KCWVsc2UgewoJCXNldEN4ODYoQ1g4Nl9DQ1IzLCBjY3IzKTsgIC8qIHJlc3RvcmUgQ0NSMyAqLwoKCQkvKiByZWFkIERJUjAgYW5kIERJUjEgQ1BVIHJlZ2lzdGVycyAqLwoJCSpkaXIwID0gZ2V0Q3g4NihDWDg2X0RJUjApOwoJCSpkaXIxID0gZ2V0Q3g4NihDWDg2X0RJUjEpOwoJfQoJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwp9CgovKgogKiBDeDg2X2RpcjBfbXNiIGlzIGEgSEFDSyBuZWVkZWQgYnkgY2hlY2tfY3g2ODZfY3B1aWQvc2xvcCBpbiBidWdzLmggaW4KICogb3JkZXIgdG8gaWRlbnRpZnkgdGhlIEN5cml4IENQVSBtb2RlbCBhZnRlciB3ZSdyZSBvdXQgb2Ygc2V0dXAuYwogKgogKiBBY3R1YWxseSBzaW5jZSBidWdzLmggZG9lc24ndCBldmVuIHJlZmVyZW5jZSB0aGlzIHBlcmhhcHMgc29tZW9uZSBzaG91bGQKICogZml4IHRoZSBkb2N1bWVudGF0aW9uID8/PwogKi8Kc3RhdGljIHVuc2lnbmVkIGNoYXIgQ3g4Nl9kaXIwX21zYiBfX2NwdWluaXRkYXRhID0gMDsKCnN0YXRpYyBjaGFyIEN4ODZfbW9kZWxbXVs5XSBfX2NwdWluaXRkYXRhID0gewoJIkN4NDg2IiwgIkN4NDg2IiwgIjV4ODYgIiwgIjZ4ODYiLCAiTWVkaWFHWCAiLCAiNng4Nk1YICIsCgkiTSBJSSAiLCAiVW5rbm93biIKfTsKc3RhdGljIGNoYXIgQ3g0ODZfbmFtZVtdWzVdIF9fY3B1aW5pdGRhdGEgPSB7CgkiU0xDIiwgIkRMQyIsICJTTEMyIiwgIkRMQzIiLCAiU1J4IiwgIkRSeCIsCgkiU1J4MiIsICJEUngyIgp9OwpzdGF0aWMgY2hhciBDeDQ4NlNfbmFtZVtdWzRdIF9fY3B1aW5pdGRhdGEgPSB7CgkiUyIsICJTMiIsICJTZSIsICJTMmUiCn07CnN0YXRpYyBjaGFyIEN4NDg2RF9uYW1lW11bNF0gX19jcHVpbml0ZGF0YSA9IHsKCSJEWCIsICJEWDIiLCAiPyIsICI/IiwgIj8iLCAiRFg0Igp9OwpzdGF0aWMgY2hhciBDeDg2X2NiW10gX19jcHVpbml0ZGF0YSA9ICI/LjV4IENvcmUvQnVzIENsb2NrIjsKc3RhdGljIGNoYXIgY3lyaXhfbW9kZWxfbXVsdDFbXSBfX2NwdWluaXRkYXRhID0gIjEyPz80MyI7CnN0YXRpYyBjaGFyIGN5cml4X21vZGVsX211bHQyW10gX19jcHVpbml0ZGF0YSA9ICIxMjIzMzQ0NSI7CgovKgogKiBSZXNldCB0aGUgc2xvdy1sb29wIChTTE9QKSBiaXQgb24gdGhlIDY4NihMKSB3aGljaCBpcyBzZXQgYnkgc29tZSBvbGQKICogQklPU2VzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggRE9TIGdhbWVzLiAgVGhpcyBtYWtlcyB0aGUgdWRlbGF5IGxvb3AKICogd29yayBjb3JyZWN0bHksIGFuZCBpbXByb3ZlcyBwZXJmb3JtYW5jZS4KICoKICogRklYTUU6IG91ciBuZXdlciB1ZGVsYXkgdXNlcyB0aGUgdHNjLiBXZSBkb24ndCBuZWVkIHRvIGZyb2Igd2l0aCBTTE9QCiAqLwoKZXh0ZXJuIHZvaWQgY2FsaWJyYXRlX2RlbGF5KHZvaWQpIF9faW5pdDsKCnN0YXRpYyB2b2lkIF9fY3B1aW5pdCBjaGVja19jeDY4Nl9zbG9wKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKewoJdW5zaWduZWQgbG9uZyBmbGFnczsKCQoJaWYgKEN4ODZfZGlyMF9tc2IgPT0gMykgewoJCXVuc2lnbmVkIGNoYXIgY2NyMywgY2NyNTsKCgkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwoJCWNjcjMgPSBnZXRDeDg2KENYODZfQ0NSMyk7CgkJc2V0Q3g4NihDWDg2X0NDUjMsIChjY3IzICYgMHgwZikgfCAweDEwKTsgLyogZW5hYmxlIE1BUEVOICAqLwoJCWNjcjUgPSBnZXRDeDg2KENYODZfQ0NSNSk7CgkJaWYgKGNjcjUgJiAyKQoJCQlzZXRDeDg2KENYODZfQ0NSNSwgY2NyNSAmIDB4ZmQpOyAgLyogcmVzZXQgU0xPUCAqLwoJCXNldEN4ODYoQ1g4Nl9DQ1IzLCBjY3IzKTsgICAgICAgICAgICAgICAgIC8qIGRpc2FibGUgTUFQRU4gKi8KCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CgoJCWlmIChjY3I1ICYgMikgeyAvKiBwb3NzaWJsZSB3cm9uZyBjYWxpYnJhdGlvbiBkb25lICovCgkJCXByaW50ayhLRVJOX0lORk8gIlJlY2FsaWJyYXRpbmcgZGVsYXkgbG9vcCB3aXRoIFNMT1AgYml0IHJlc2V0XG4iKTsKCQkJY2FsaWJyYXRlX2RlbGF5KCk7CgkJCWMtPmxvb3BzX3Blcl9qaWZmeSA9IGxvb3BzX3Blcl9qaWZmeTsKCQl9Cgl9Cn0KCgpzdGF0aWMgdm9pZCBfX2NwdWluaXQgc2V0X2N4ODZfcmVvcmRlcih2b2lkKQp7Cgl1OCBjY3IzOwoKCXByaW50ayhLRVJOX0lORk8gIkVuYWJsZSBNZW1vcnkgYWNjZXNzIHJlb3JkZXIgb24gQ3lyaXgvTlNDIHByb2Nlc3Nvci5cbiIpOwoJY2NyMyA9IGdldEN4ODYoQ1g4Nl9DQ1IzKTsKCXNldEN4ODYoQ1g4Nl9DQ1IzLCAoY2NyMyAmIDB4MGYpIHwgMHgxMCk7IC8qIGVuYWJsZSBNQVBFTqAgKi8KCgkvKiBMb2FkL1N0b3JlIFNlcmlhbGl6ZSB0byBtZW0gYWNjZXNzIGRpc2FibGUgKD1yZW9yZGVyIGl0KaAgKi8KCXNldEN4ODYoQ1g4Nl9QQ1IwLCBnZXRDeDg2KENYODZfUENSMCkgJiB+MHg4MCk7CgkvKiBzZXQgbG9hZC9zdG9yZSBzZXJpYWxpemUgZnJvbSAxR0IgdG8gNEdCICovCgljY3IzIHw9IDB4ZTA7CglzZXRDeDg2KENYODZfQ0NSMywgY2NyMyk7Cn0KCnN0YXRpYyB2b2lkIF9fY3B1aW5pdCBzZXRfY3g4Nl9tZW13Yih2b2lkKQp7Cgl1MzIgY3IwOwoKCXByaW50ayhLRVJOX0lORk8gIkVuYWJsZSBNZW1vcnktV3JpdGUtYmFjayBtb2RlIG9uIEN5cml4L05TQyBwcm9jZXNzb3IuXG4iKTsKCgkvKiBDQ1IyIGJpdCAyOiB1bmxvY2sgTlcgYml0ICovCglzZXRDeDg2KENYODZfQ0NSMiwgZ2V0Q3g4NihDWDg2X0NDUjIpICYgfjB4MDQpOwoJLyogc2V0ICdOb3QgV3JpdGUtdGhyb3VnaCcgKi8KCWNyMCA9IDB4MjAwMDAwMDA7Cgl3cml0ZV9jcjAocmVhZF9jcjAoKSB8IGNyMCk7CgkvKiBDQ1IyIGJpdCAyOiBsb2NrIE5XIGJpdCBhbmQgc2V0IFdUMSAqLwoJc2V0Q3g4NihDWDg2X0NDUjIsIGdldEN4ODYoQ1g4Nl9DQ1IyKSB8IDB4MTQgKTsKfQoKc3RhdGljIHZvaWQgX19jcHVpbml0IHNldF9jeDg2X2luYyh2b2lkKQp7Cgl1bnNpZ25lZCBjaGFyIGNjcjM7CgoJcHJpbnRrKEtFUk5fSU5GTyAiRW5hYmxlIEluY3JlbWVudG9yIG9uIEN5cml4L05TQyBwcm9jZXNzb3IuXG4iKTsKCgljY3IzID0gZ2V0Q3g4NihDWDg2X0NDUjMpOwoJc2V0Q3g4NihDWDg2X0NDUjMsIChjY3IzICYgMHgwZikgfCAweDEwKTsgLyogZW5hYmxlIE1BUEVOoCAqLwoJLyogUENSMSAtLSBQZXJmb3JtYW5jZSBDb250cm9sICovCgkvKiBJbmNyZW1lbnRvciBvbiwgd2hhdGV2ZXIgdGhhdCBpcyAqLwoJc2V0Q3g4NihDWDg2X1BDUjEsIGdldEN4ODYoQ1g4Nl9QQ1IxKSB8IDB4MDIpOwoJLyogUENSMCAtLSBQZXJmb3JtYW5jZSBDb250cm9sICovCgkvKiBJbmNyZW1lbnRvciBNYXJnaW4gMTAgKi8KCXNldEN4ODYoQ1g4Nl9QQ1IwLCBnZXRDeDg2KENYODZfUENSMCkgfCAweDA0KTsgCglzZXRDeDg2KENYODZfQ0NSMywgY2NyMyk7CS8qIGRpc2FibGUgTUFQRU4gKi8KfQoKLyoKICoJQ29uZmlndXJlIGxhdGVyIE1lZGlhR1ggYW5kL29yIEdlb2RlIHByb2Nlc3Nvci4KICovCgpzdGF0aWMgdm9pZCBfX2NwdWluaXQgZ2VvZGVfY29uZmlndXJlKHZvaWQpCnsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cgl1OCBjY3IzOwoJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwoKCS8qIFN1c3BlbmQgb24gaGFsdCBwb3dlciBzYXZpbmcgYW5kIGVuYWJsZSAjU1VTUCBwaW4gKi8KCXNldEN4ODYoQ1g4Nl9DQ1IyLCBnZXRDeDg2KENYODZfQ0NSMikgfCAweDg4KTsKCgljY3IzID0gZ2V0Q3g4NihDWDg2X0NDUjMpOwoJc2V0Q3g4NihDWDg2X0NDUjMsIChjY3IzICYgMHgwZikgfCAweDEwKTsJLyogZW5hYmxlIE1BUEVOICovCgkKCgkvKiBGUFUgZmFzdCwgRFRFIGNhY2hlLCBNZW0gYnlwYXNzICovCglzZXRDeDg2KENYODZfQ0NSNCwgZ2V0Q3g4NihDWDg2X0NDUjQpIHwgMHgzOCk7CglzZXRDeDg2KENYODZfQ0NSMywgY2NyMyk7CQkJLyogZGlzYWJsZSBNQVBFTiAqLwoJCglzZXRfY3g4Nl9tZW13YigpOwoJc2V0X2N4ODZfcmVvcmRlcigpOwkKCXNldF9jeDg2X2luYygpOwoJCglsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cn0KCgpzdGF0aWMgdm9pZCBfX2NwdWluaXQgaW5pdF9jeXJpeChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCnsKCXVuc2lnbmVkIGNoYXIgZGlyMCwgZGlyMF9tc24sIGRpcjBfbHNuLCBkaXIxID0gMDsKCWNoYXIgKmJ1ZiA9IGMtPng4Nl9tb2RlbF9pZDsKCWNvbnN0IGNoYXIgKnAgPSBOVUxMOwoKCS8qIEJpdCAzMSBpbiBub3JtYWwgQ1BVSUQgdXNlZCBmb3Igbm9uc3RhbmRhcmQgM0ROb3cgSUQ7CgkgICAzRE5vdyBpcyBJRGQgYnkgYml0IDMxIGluIGV4dGVuZGVkIENQVUlEICgxKjMyKzMxKSBhbnl3YXkgKi8KCWNsZWFyX2JpdCgwKjMyKzMxLCBjLT54ODZfY2FwYWJpbGl0eSk7CgoJLyogQ3lyaXggdXNlZCBiaXQgMjQgaW4gZXh0ZW5kZWQgKEFNRCkgQ1BVSUQgZm9yIEN5cml4IE1NWCBleHRlbnNpb25zICovCglpZiAoIHRlc3RfYml0KDEqMzIrMjQsIGMtPng4Nl9jYXBhYmlsaXR5KSApIHsKCQljbGVhcl9iaXQoMSozMisyNCwgYy0+eDg2X2NhcGFiaWxpdHkpOwoJCXNldF9iaXQoWDg2X0ZFQVRVUkVfQ1hNTVgsIGMtPng4Nl9jYXBhYmlsaXR5KTsKCX0KCglkb19jeXJpeF9kZXZpZCgmZGlyMCwgJmRpcjEpOwoKCWNoZWNrX2N4Njg2X3Nsb3AoYyk7CgoJQ3g4Nl9kaXIwX21zYiA9IGRpcjBfbXNuID0gZGlyMCA+PiA0OyAvKiBpZGVudGlmaWVzIENQVSAiZmFtaWx5IiAgICovCglkaXIwX2xzbiA9IGRpcjAgJiAweGY7ICAgICAgICAgICAgICAgIC8qIG1vZGVsIG9yIGNsb2NrIG11bHRpcGxpZXIgKi8KCgkvKiBjb21tb24gY2FzZSBzdGVwIG51bWJlci9yZXYgLS0gZXhjZXB0aW9ucyBoYW5kbGVkIGJlbG93ICovCgljLT54ODZfbW9kZWwgPSAoZGlyMSA+PiA0KSArIDE7CgljLT54ODZfbWFzayA9IGRpcjEgJiAweGY7CgoJLyogTm93IGNvb2s7IHRoZSBvcmlnaW5hbCByZWNpcGUgaXMgYnkgQ2hhbm5pbmcgQ29ybiwgZnJvbSBDeXJpeC4KCSAqIFdlIGRvIHRoZSBzYW1lIHRoaW5nIGZvciBlYWNoIGdlbmVyYXRpb246IHdlIHdvcmsgb3V0CgkgKiB0aGUgbW9kZWwsIG11bHRpcGxpZXIgYW5kIHN0ZXBwaW5nLiAgQmxhY2sgbWFnaWMgaW5jbHVkZWQsCgkgKiB0byBtYWtlIHRoZSBzaWxpY29uIHN0ZXAvcmV2IG51bWJlcnMgbWF0Y2ggdGhlIHByaW50ZWQgb25lcy4KCSAqLwoJIAoJc3dpdGNoIChkaXIwX21zbikgewoJCXVuc2lnbmVkIGNoYXIgdG1wOwoKCWNhc2UgMDogLyogQ3g0ODZTTEMvRExDL1NSeC9EUnggKi8KCQlwID0gQ3g0ODZfbmFtZVtkaXIwX2xzbiAmIDddOwoJCWJyZWFrOwoKCWNhc2UgMTogLyogQ3g0ODZTL0RYL0RYMi9EWDQgKi8KCQlwID0gKGRpcjBfbHNuICYgOCkgPyBDeDQ4NkRfbmFtZVtkaXIwX2xzbiAmIDVdCgkJCTogQ3g0ODZTX25hbWVbZGlyMF9sc24gJiAzXTsKCQlicmVhazsKCgljYXNlIDI6IC8qIDV4ODYgKi8KCQlDeDg2X2NiWzJdID0gY3lyaXhfbW9kZWxfbXVsdDFbZGlyMF9sc24gJiA1XTsKCQlwID0gQ3g4Nl9jYisyOwoJCWJyZWFrOwoKCWNhc2UgMzogLyogNng4Ni82eDg2TCAqLwoJCUN4ODZfY2JbMV0gPSAnICc7CgkJQ3g4Nl9jYlsyXSA9IGN5cml4X21vZGVsX211bHQxW2RpcjBfbHNuICYgNV07CgkJaWYgKGRpcjEgPiAweDIxKSB7IC8qIDY4NkwgKi8KCQkJQ3g4Nl9jYlswXSA9ICdMJzsKCQkJcCA9IEN4ODZfY2I7CgkJCShjLT54ODZfbW9kZWwpKys7CgkJfSBlbHNlICAgICAgICAgICAgIC8qIDY4NiAqLwoJCQlwID0gQ3g4Nl9jYisxOwoJCS8qIEVtdWxhdGUgTVRSUnMgdXNpbmcgQ3lyaXgncyBBUlJzLiAqLwoJCXNldF9iaXQoWDg2X0ZFQVRVUkVfQ1lSSVhfQVJSLCBjLT54ODZfY2FwYWJpbGl0eSk7CgkJLyogNng4NidzIGNvbnRhaW4gdGhpcyBidWcgKi8KCQljLT5jb21hX2J1ZyA9IDE7CgkJYnJlYWs7CgoJY2FzZSA0OiAvKiBNZWRpYUdYL0dYbSBvciBHZW9kZSBHWE0vR1hMVi9HWDEgKi8KI2lmZGVmIENPTkZJR19QQ0kKCXsKCQl1MzIgdmVuZG9yLCBkZXZpY2U7CgkJLyogSXQgaXNuJ3QgcmVhbGx5IGEgUENJIHF1aXJrIGRpcmVjdGx5LCBidXQgdGhlIGN1cmUgaXMgdGhlCgkJICAgc2FtZS4gVGhlIE1lZGlhR1ggaGFzIGRlZXAgbWFnaWMgU01NIHN0dWZmIHRoYXQgaGFuZGxlcyB0aGUKCQkgICBTQiBlbXVsYXRpb24uIEl0IHRob3dzIGF3YXkgdGhlIGZpZm8gb24gZGlzYWJsZV9kbWEoKSB3aGljaAoJCSAgIGlzIHdyb25nIGFuZCBydWlucyB0aGUgYXVkaW8uIAoKCQkgICBCdWcyOiBWU0ExIGhhcyBhIHdyYXAgYnVnIHNvIHRoYXQgdXNpbmcgbWF4aW11bSBzaXplZCBETUEgCgkJICAgY2F1c2VzIGJhZCB0aGluZ3MuIEFjY29yZGluZyB0byBOYXRTZW1pIFZTQTIgaGFzIGFub3RoZXIKCQkgICBidWcgdG8gZG8gd2l0aCAnaGx0Jy4gSSd2ZSBub3Qgc2VlbiBhbnkgYm9hcmRzIHVzaW5nIFZTQTIKCQkgICBhbmQgWCBkb2Vzbid0IHNlZW0gdG8gc3VwcG9ydCBpdCBlaXRoZXIgc28gd2hvIGNhcmVzIDgpLgoJCSAgIFZTQTEgd2Ugd29yayBhcm91bmQgaG93ZXZlci4KCQkqLwoKCQlwcmludGsoS0VSTl9JTkZPICJXb3JraW5nIGFyb3VuZCBDeXJpeCBNZWRpYUdYIHZpcnR1YWwgRE1BIGJ1Z3MuXG4iKTsKCQlpc2FfZG1hX2JyaWRnZV9idWdneSA9IDI7CgoJCS8qIFdlIGRvIHRoaXMgYmVmb3JlIHRoZSBQQ0kgbGF5ZXIgaXMgcnVubmluZy4gSG93ZXZlciB3ZQoJCSAgIGFyZSBzYWZlIGhlcmUgYXMgd2Uga25vdyB0aGUgYnJpZGdlIG11c3QgYmUgYSBDeXJpeAoJCSAgIGNvbXBhbmlvbiBhbmQgbXVzdCBiZSBwcmVzZW50ICovCgkJdmVuZG9yID0gcmVhZF9wY2lfY29uZmlnXzE2KDAsIDAsIDB4MTIsIFBDSV9WRU5ET1JfSUQpOwoJCWRldmljZSA9IHJlYWRfcGNpX2NvbmZpZ18xNigwLCAwLCAweDEyLCBQQ0lfREVWSUNFX0lEKTsKCgkJLyoKCQkgKiAgVGhlIDU1MTAvNTUyMCBjb21wYW5pb24gY2hpcHMgaGF2ZSBhIGZ1bmt5IFBJVC4KCQkgKi8gIAoJCWlmICh2ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9DWVJJWCAmJgoJIChkZXZpY2UgPT0gUENJX0RFVklDRV9JRF9DWVJJWF81NTEwIHx8IGRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MjApKQoJCQltYXJrX3RzY191bnN0YWJsZSgiY3lyaXggNTUxMC81NTIwIGRldGVjdGVkIik7Cgl9CiNlbmRpZgoJCWMtPng4Nl9jYWNoZV9zaXplPTE2OwkvKiBZZXAgMTZLIGludGVncmF0ZWQgY2FjaGUgdGhhdHMgaXQgKi8KCgkJLyogR1htIHN1cHBvcnRzIGV4dGVuZGVkIGNwdWlkIGxldmVscyAnYWxhJyBBTUQgKi8KCQlpZiAoYy0+Y3B1aWRfbGV2ZWwgPT0gMikgewoJCQkvKiBFbmFibGUgY3hNTVggZXh0ZW5zaW9ucyAoR1gxIERhdGFzaGVldCA1NCkgKi8KCQkJc2V0Q3g4NihDWDg2X0NDUjcsIGdldEN4ODYoQ1g4Nl9DQ1I3KSB8IDEpOwoJCQkKCQkJLyoKCQkJICogR1htIDogMHgzMCAuLi4gMHg1ZiBHWG0gIGRhdGFzaGVldCA1MQoJCQkgKiBHWGx2OiAweDZ4ICAgICAgICAgIEdYbHYgZGF0YXNoZWV0IDU0CgkJCSAqICA/ICA6IDB4N3gKCQkJICogR1gxIDogMHg4eCAgICAgICAgICBHWDEgIGRhdGFzaGVldCA1NgoJCQkgKi8KCQkJaWYoKDB4MzAgPD0gZGlyMSAmJiBkaXIxIDw9IDB4NmYpIHx8ICgweDgwIDw9ZGlyMSAmJiBkaXIxIDw9IDB4OGYpKQoJCQkJZ2VvZGVfY29uZmlndXJlKCk7CgkJCWdldF9tb2RlbF9uYW1lKGMpOyAgLyogZ2V0IENQVSBtYXJrZXRpbmcgbmFtZSAqLwoJCQlyZXR1cm47CgkJfQoJCWVsc2UgeyAgLyogTWVkaWFHWCAqLwoJCQlDeDg2X2NiWzJdID0gKGRpcjBfbHNuICYgMSkgPyAnMycgOiAnNCc7CgkJCXAgPSBDeDg2X2NiKzI7CgkJCWMtPng4Nl9tb2RlbCA9IChkaXIxICYgMHgyMCkgPyAxIDogMjsKCQl9CgkJYnJlYWs7CgogICAgICAgIGNhc2UgNTogLyogNng4Nk1YL00gSUkgKi8KCQlpZiAoZGlyMSA+IDcpCgkJewoJCQlkaXIwX21zbisrOyAgLyogTSBJSSAqLwoJCQkvKiBFbmFibGUgTU1YIGV4dGVuc2lvbnMgKEFwcCBub3RlIDEwOCkgKi8KCQkJc2V0Q3g4NihDWDg2X0NDUjcsIGdldEN4ODYoQ1g4Nl9DQ1I3KXwxKTsKCQl9CgkJZWxzZQoJCXsKCQkJYy0+Y29tYV9idWcgPSAxOyAgICAgIC8qIDZ4ODZNWCwgaXQgaGFzIHRoZSBidWcuICovCgkJfQoJCXRtcCA9ICghKGRpcjBfbHNuICYgNykgfHwgZGlyMF9sc24gJiAxKSA/IDIgOiAwOwoJCUN4ODZfY2JbdG1wXSA9IGN5cml4X21vZGVsX211bHQyW2RpcjBfbHNuICYgN107CgkJcCA9IEN4ODZfY2IrdG1wOwogICAgICAgIAlpZiAoKChkaXIxICYgMHgwZikgPiA0KSB8fCAoKGRpcjEgJiAweGYwKSA9PSAweDIwKSkKCQkJKGMtPng4Nl9tb2RlbCkrKzsKCQkvKiBFbXVsYXRlIE1UUlJzIHVzaW5nIEN5cml4J3MgQVJScy4gKi8KCQlzZXRfYml0KFg4Nl9GRUFUVVJFX0NZUklYX0FSUiwgYy0+eDg2X2NhcGFiaWxpdHkpOwoJCWJyZWFrOwoKCWNhc2UgMHhmOiAgLyogQ3lyaXggNDg2IHdpdGhvdXQgREVWSUQgcmVnaXN0ZXJzICovCgkJc3dpdGNoIChkaXIwX2xzbikgewoJCWNhc2UgMHhkOiAgLyogZWl0aGVyIGEgNDg2U0xDIG9yIERMQyB3L28gREVWSUQgKi8KCQkJZGlyMF9tc24gPSAwOwoJCQlwID0gQ3g0ODZfbmFtZVsoYy0+aGFyZF9tYXRoKSA/IDEgOiAwXTsKCQkJYnJlYWs7CgoJCWNhc2UgMHhlOiAgLyogYSA0ODZTIEEgc3RlcCAqLwoJCQlkaXIwX21zbiA9IDA7CgkJCXAgPSBDeDQ4NlNfbmFtZVswXTsKCQkJYnJlYWs7CgkJfQoJCWJyZWFrOwoKCWRlZmF1bHQ6ICAvKiB1bmtub3duIChzaG91bGRuJ3QgaGFwcGVuLCB3ZSBrbm93IGV2ZXJ5b25lIDstKSAqLwoJCWRpcjBfbXNuID0gNzsKCQlicmVhazsKCX0KCXN0cmNweShidWYsIEN4ODZfbW9kZWxbZGlyMF9tc24gJiA3XSk7CglpZiAocCkgc3RyY2F0KGJ1ZiwgcCk7CglyZXR1cm47Cn0KCi8qCiAqIEhhbmRsZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIGJyYW5kZWQgcHJvY2Vzc29ycwogKi8Kc3RhdGljIHZvaWQgX19jcHVpbml0IGluaXRfbnNjKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKewoJLyogVGhlcmUgbWF5IGJlIEdYMSBwcm9jZXNzb3JzIGluIHRoZSB3aWxkIHRoYXQgYXJlIGJyYW5kZWQKCSAqIE5TQyBhbmQgbm90IEN5cml4LgoJICoKCSAqIFRoaXMgZnVuY3Rpb24gb25seSBoYW5kbGVzIHRoZSBHWCBwcm9jZXNzb3IsIGFuZCBraWNrcyBldmVyeQoJICogdGhpbmcgZWxzZSB0byB0aGUgQ3lyaXggaW5pdCBmdW5jdGlvbiBhYm92ZSAtIHRoYXQgc2hvdWxkCgkgKiBjb3ZlciBhbnkgcHJvY2Vzc29ycyB0aGF0IG1pZ2h0IGhhdmUgYmVlbiBicmFuZGVkIGRpZmZlcmVudGx5CgkgKiBhZnRlciBOU0MgYWNxdWlyZWQgQ3lyaXguCgkgKgoJICogSWYgdGhpcyBicmVha3MgeW91ciBHWDEgaG9ycmlibHksIHBsZWFzZSBlLW1haWwKCSAqIGluZm8tbGludXhAbGRjbWFpbC5hbWQuY29tIHRvIHRlbGwgdXMuCgkgKi8KCgkvKiBIYW5kbGUgdGhlIEdYIChGb3JtYWxseSBrbm93biBhcyB0aGUgR1gyKSAqLwoKCWlmIChjLT54ODYgPT0gNSAmJiBjLT54ODZfbW9kZWwgPT0gNSkKCQlkaXNwbGF5X2NhY2hlaW5mbyhjKTsKCWVsc2UKCQlpbml0X2N5cml4KGMpOwp9CgovKgogKiBDeXJpeCBDUFVzIHdpdGhvdXQgY3B1aWQgb3Igd2l0aCBjcHVpZCBub3QgeWV0IGVuYWJsZWQgY2FuIGJlIGRldGVjdGVkCiAqIGJ5IHRoZSBmYWN0IHRoYXQgdGhleSBwcmVzZXJ2ZSB0aGUgZmxhZ3MgYWNyb3NzIHRoZSBkaXZpc2lvbiBvZiA1LzIuCiAqIFBJSSBhbmQgUFBybyBleGhpYml0IHRoaXMgYmVoYXZpb3IgdG9vLCBidXQgdGhleSBoYXZlIGNwdWlkIGF2YWlsYWJsZS4KICovCiAKLyoKICogUGVyZm9ybSB0aGUgQ3lyaXggNS8yIHRlc3QuIEEgQ3lyaXggd29uJ3QgY2hhbmdlCiAqIHRoZSBmbGFncywgd2hpbGUgb3RoZXIgNDg2IGNoaXBzIHdpbGwuCiAqLwpzdGF0aWMgaW5saW5lIGludCB0ZXN0X2N5cml4XzUyZGl2KHZvaWQpCnsKCXVuc2lnbmVkIGludCB0ZXN0OwoKCV9fYXNtX18gX192b2xhdGlsZV9fKAoJICAgICAic2FoZlxuXHQiCQkvKiBjbGVhciBmbGFncyAoJWVheCA9IDB4MDAwNSkgKi8KCSAgICAgImRpdiAlYjJcblx0IgkvKiBkaXZpZGUgNSBieSAyICovCgkgICAgICJsYWhmIgkJLyogc3RvcmUgZmxhZ3MgaW50byAlYWggKi8KCSAgICAgOiAiPWEiICh0ZXN0KQoJICAgICA6ICIwIiAoNSksICJxIiAoMikKCSAgICAgOiAiY2MiKTsKCgkvKiBBSCBpcyAweDAyIG9uIEN5cml4IGFmdGVyIHRoZSBkaXZpZGUuLiAqLwoJcmV0dXJuICh1bnNpZ25lZCBjaGFyKSAodGVzdCA+PiA4KSA9PSAweDAyOwp9CgpzdGF0aWMgdm9pZCBfX2NwdWluaXQgY3lyaXhfaWRlbnRpZnkoc3RydWN0IGNwdWluZm9feDg2ICogYykKewoJLyogRGV0ZWN0IEN5cml4IHdpdGggZGlzYWJsZWQgQ1BVSUQgKi8KCWlmICggYy0+eDg2ID09IDQgJiYgdGVzdF9jeXJpeF81MmRpdigpICkgewoJCXVuc2lnbmVkIGNoYXIgZGlyMCwgZGlyMTsKCQkKCQlzdHJjcHkoYy0+eDg2X3ZlbmRvcl9pZCwgIkN5cml4SW5zdGVhZCIpOwoJICAgICAgICBjLT54ODZfdmVuZG9yID0gWDg2X1ZFTkRPUl9DWVJJWDsKCSAgICAgICAgCgkgICAgICAgIC8qIEFjdHVhbGx5IGVuYWJsZSBjcHVpZCBvbiB0aGUgb2xkZXIgY3lyaXggKi8KCSAgICAKCSAgICAJLyogUmV0cmlldmUgQ1BVIHJldmlzaW9ucyAqLwoJICAgIAkKCQlkb19jeXJpeF9kZXZpZCgmZGlyMCwgJmRpcjEpOwoKCQlkaXIwPj49NDsJCQoJCQoJCS8qIENoZWNrIGl0IGlzIGFuIGFmZmVjdGVkIG1vZGVsICovCgkJCiAgIAkgICAgICAgIGlmIChkaXIwID09IDUgfHwgZGlyMCA9PSAzKQogICAJICAgICAgICB7CgkJCXVuc2lnbmVkIGNoYXIgY2NyMzsKCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKCQkJcHJpbnRrKEtFUk5fSU5GTyAiRW5hYmxpbmcgQ1BVSUQgb24gQ3lyaXggcHJvY2Vzc29yLlxuIik7CgkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKCQkJY2NyMyA9IGdldEN4ODYoQ1g4Nl9DQ1IzKTsKCQkJc2V0Q3g4NihDWDg2X0NDUjMsIChjY3IzICYgMHgwZikgfCAweDEwKTsgICAgICAgLyogZW5hYmxlIE1BUEVOICAqLwoJCQlzZXRDeDg2KENYODZfQ0NSNCwgZ2V0Q3g4NihDWDg2X0NDUjQpIHwgMHg4MCk7ICAvKiBlbmFibGUgY3B1aWQgICovCgkJCXNldEN4ODYoQ1g4Nl9DQ1IzLCBjY3IzKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2FibGUgTUFQRU4gKi8KCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwoJCX0KCX0KfQoKc3RhdGljIHN0cnVjdCBjcHVfZGV2IGN5cml4X2NwdV9kZXYgX19jcHVpbml0ZGF0YSA9IHsKCS5jX3ZlbmRvcgk9ICJDeXJpeCIsCgkuY19pZGVudCAJPSB7ICJDeXJpeEluc3RlYWQiIH0sCgkuY19pbml0CQk9IGluaXRfY3lyaXgsCgkuY19pZGVudGlmeQk9IGN5cml4X2lkZW50aWZ5LAp9OwoKaW50IF9faW5pdCBjeXJpeF9pbml0X2NwdSh2b2lkKQp7CgljcHVfZGV2c1tYODZfVkVORE9SX0NZUklYXSA9ICZjeXJpeF9jcHVfZGV2OwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBzdHJ1Y3QgY3B1X2RldiBuc2NfY3B1X2RldiBfX2NwdWluaXRkYXRhID0gewoJLmNfdmVuZG9yCT0gIk5TQyIsCgkuY19pZGVudCAJPSB7ICJHZW9kZSBieSBOU0MiIH0sCgkuY19pbml0CQk9IGluaXRfbnNjLAp9OwoKaW50IF9faW5pdCBuc2NfaW5pdF9jcHUodm9pZCkKewoJY3B1X2RldnNbWDg2X1ZFTkRPUl9OU0NdID0gJm5zY19jcHVfZGV2OwoJcmV0dXJuIDA7Cn0KCg==