Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qCiAqIG1rc3dhcC5jIC0gc2V0IHVwIGEgbGludXggc3dhcCBkZXZpY2UKICoKICogKEMpIDE5OTEgTGludXMgVG9ydmFsZHMuIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCBhcyBwZXIKICogdGhlIExpbnV4IGNvcHlyaWdodC4KICovCgovKgogKiAyMC4xMi45MSAgLQl0aW1lIGJlZ2FuLiBHb3QgVk0gd29ya2luZyB5ZXN0ZXJkYXkgYnkgZG9pbmcgdGhpcyBieSBoYW5kLgogKgogKiBVc2FnZTogbWtzd2FwIFstY10gWy12Tl0gWy1mXSBkZXZpY2UgW3NpemUtaW4tYmxvY2tzXQogKgogKgktYyAgIGZvciByZWFkYWJpbGl0eSBjaGVja2luZy4gKFVzZSBpdCB1bmxlc3MgeW91IGFyZSBTVVJFISkKICoJLXZOICBmb3Igc3dhcCBhcmVhcyB2ZXJzaW9uIE4uIChPbmx5IE49MCwxIGtub3duIHRvZGF5LikKICogICAgICAtZiAgIGZvciBmb3JjaW5nIHN3YXAgY3JlYXRpb24gZXZlbiBpZiBpdCB3b3VsZCBzbWFzaCBwYXJ0aXRpb24gdGFibGUuCiAqCiAqIFRoZSBkZXZpY2UgbWF5IGJlIGEgYmxvY2sgZGV2aWNlIG9yIGFuIGltYWdlIG9mIG9uZSwgYnV0IHRoaXMgaXNuJ3QKICogZW5mb3JjZWQgKGJ1dCBpdCdzIG5vdCBtdWNoIGZ1biBvbiBhIGNoYXJhY3RlciBkZXZpY2UgOi0pLgogKgogKiBQYXRjaGVzIGZyb20gamFnZ3lAcHVycGxldC5kZW1vbi5jby51ayAoTWlrZSBKYWdkaXMpIHRvIG1ha2UgdGhlCiAqIHNpemUtaW4tYmxvY2tzIHBhcmFtZXRlciBvcHRpb25hbCBhZGRlZCBXZWQgRmViICA4IDEwOjMzOjQzIDE5OTUuCiAqCiAqIFZlcnNpb24gMSBzd2FwIGFyZWEgY29kZSAoZm9yIGtlcm5lbCAyLjEuMTE3KSwgYWViLCA5ODEwMTAuCiAqCiAqIFNwYXJjIGZpeGVzLCBqakB1bHRyYS5saW51eC5jeiAoSmFrdWIgSmVsaW5layksIDk4MTIwMSAtIG1hbmdsZWQgYnkgYWViLgogKiBWMV9NQVhfUEFHRVMgZml4ZXMsIGpqLCA5OTAzMjUuCiAqCiAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BtaXNpZWsuZXUub3JnPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqICBmcm9tIHV0aWwtbGludXggLS0gYWRhcHRlZCBmb3IgYnVzeWJveCBieQogKiAgRXJpayBBbmRlcnNlbiA8YW5kZXJzZWVAZGViaWFuLm9yZz4uIEkgcmlwcGVkIG91dCBOYXRpdmUgTGFuZ3VhZ2UKICogIFN1cHBvcnQsIG1hZGUgc29tZSBzdHVmZiBzbWFsbGVyLCBhbmQgZml0dGVkIGZvciBsaWZlIGluIGJ1c3lib3guCiAqCiAqLwoKI2luY2x1ZGUgImludGVybmFsLmgiCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgkJCS8qIGZvciBfSU8gKi8KI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaW5jbHVkZSA8YXNtL3BhZ2UuaD4JCQkvKiBmb3IgUEFHRV9TSVpFIGFuZCBQQUdFX1NISUZUICovCgkJCQkvKiB3ZSBhbHNvIGdldCBQQUdFX1NJWkUgdmlhIGdldHBhZ2VzaXplKCkgKi8KCgpzdGF0aWMgY29uc3QgY2hhciBta3N3YXBfdXNhZ2VbXSA9CgkibWtzd2FwIFstY10gWy12MHwtdjFdIGRldmljZSBbYmxvY2stY291bnRdXG5cbiIKCSJQcmVwYXJlIGEgZGlzayBwYXJ0aXRpb24gdG8gYmUgdXNlZCBhcyBhIHN3YXAgcGFydGl0aW9uLlxuXG4iCgkiT3B0aW9uczpcbiIgIlx0LWNcdFx0Q2hlY2sgZm9yIHJlYWQtYWJpbGl0eS5cbiIKCSJcdC12MFx0XHRNYWtlIHZlcnNpb24gMCBzd2FwIFttYXggMTI4IE1lZ3NdLlxuIgoJIlx0LXYxXHRcdE1ha2UgdmVyc2lvbiAxIHN3YXAgW2JpZyFdIChkZWZhdWx0IGZvciBrZXJuZWxzID4gMi4xLjExNykuXG4iCgoJIlx0YmxvY2stY291bnRcdE51bWJlciBvZiBibG9jayB0byB1c2UgKGRlZmF1bHQgaXMgZW50aXJlIHBhcnRpdGlvbikuXG4iOwoKCiNpZm5kZWYgX0lPCi8qIHByZS0xLjMuNDUgKi8KI2RlZmluZSBCTEtHRVRTSVpFIDB4MTI2MAojZWxzZQovKiBzYW1lIG9uIGkzODYsIG02OGssIGFybTsgZGlmZmVyZW50IG9uIGFscGhhLCBtaXBzLCBzcGFyYywgcHBjICovCiNkZWZpbmUgQkxLR0VUU0laRSBfSU8oMHgxMiw5NikKI2VuZGlmCgpzdGF0aWMgY2hhciAqcHJvZ3JhbV9uYW1lID0gIm1rc3dhcCI7CnN0YXRpYyBjaGFyICpkZXZpY2VfbmFtZSA9IE5VTEw7CnN0YXRpYyBpbnQgREVWID0gLTE7CnN0YXRpYyBsb25nIFBBR0VTID0gMDsKc3RhdGljIGludCBjaGVjayA9IDA7CnN0YXRpYyBpbnQgYmFkcGFnZXMgPSAwOwpzdGF0aWMgaW50IHZlcnNpb24gPSAtMTsKCiNkZWZpbmUgTUFLRV9WRVJTSU9OKHAscSxyKQkoNjU1MzYqKHApICsgMjU2KihxKSArIChyKSkKCnN0YXRpYyBpbnQgbGludXhfdmVyc2lvbl9jb2RlKHZvaWQpCnsKCXN0cnVjdCB1dHNuYW1lIG15X3V0c25hbWU7CglpbnQgcCwgcSwgcjsKCglpZiAodW5hbWUoJm15X3V0c25hbWUpID09IDApIHsKCQlwID0gYXRvaShzdHJ0b2sobXlfdXRzbmFtZS5yZWxlYXNlLCAiLiIpKTsKCQlxID0gYXRvaShzdHJ0b2soTlVMTCwgIi4iKSk7CgkJciA9IGF0b2koc3RydG9rKE5VTEwsICIuIikpOwoJCXJldHVybiBNQUtFX1ZFUlNJT04ocCwgcSwgcik7Cgl9CglyZXR1cm4gMDsKfQoKLyoKICogVGhlIGRlZmluaXRpb24gb2YgdGhlIHVuaW9uIHN3YXBfaGVhZGVyIHVzZXMgdGhlIGNvbnN0YW50IFBBR0VfU0laRS4KICogVW5mb3J0dW5hdGVseSwgb24gc29tZSBhcmNoaXRlY3R1cmVzIHRoaXMgZGVwZW5kcyBvbiB0aGUgaGFyZHdhcmUgbW9kZWwsCiAqIGFuZCBjYW4gb25seSBiZSBmb3VuZCBhdCBydW4gdGltZSAtLSB3ZSB1c2UgZ2V0cGFnZXNpemUoKS4KICovCgpzdGF0aWMgaW50IHBhZ2VzaXplOwpzdGF0aWMgaW50ICpzaWduYXR1cmVfcGFnZTsKCnN0cnVjdCBzd2FwX2hlYWRlcl92MSB7CgljaGFyIGJvb3RiaXRzWzEwMjRdOwkJLyogU3BhY2UgZm9yIGRpc2tsYWJlbCBldGMuICovCgl1bnNpZ25lZCBpbnQgdmVyc2lvbjsKCXVuc2lnbmVkIGludCBsYXN0X3BhZ2U7Cgl1bnNpZ25lZCBpbnQgbnJfYmFkcGFnZXM7Cgl1bnNpZ25lZCBpbnQgcGFkZGluZ1sxMjVdOwoJdW5zaWduZWQgaW50IGJhZHBhZ2VzWzFdOwp9ICpwOwoKc3RhdGljIHZvaWQgaW5pdF9zaWduYXR1cmVfcGFnZSgpCnsKCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKCiNpZmRlZiBQQUdFX1NJWkUKCWlmIChwYWdlc2l6ZSAhPSBQQUdFX1NJWkUpCgkJZnByaW50ZihzdGRlcnIsICJBc3N1bWluZyBwYWdlcyBvZiBzaXplICVkXG4iLCBwYWdlc2l6ZSk7CiNlbmRpZgoJc2lnbmF0dXJlX3BhZ2UgPSAoaW50ICopIHhtYWxsb2MocGFnZXNpemUpOwoJbWVtc2V0KHNpZ25hdHVyZV9wYWdlLCAwLCBwYWdlc2l6ZSk7CglwID0gKHN0cnVjdCBzd2FwX2hlYWRlcl92MSAqKSBzaWduYXR1cmVfcGFnZTsKfQoKc3RhdGljIHZvaWQgd3JpdGVfc2lnbmF0dXJlKGNoYXIgKnNpZykKewoJY2hhciAqc3AgPSAoY2hhciAqKSBzaWduYXR1cmVfcGFnZTsKCglzdHJuY3B5KHNwICsgcGFnZXNpemUgLSAxMCwgc2lnLCAxMCk7Cn0KCiNkZWZpbmUgVjBfTUFYX1BBR0VTCSg4ICogKHBhZ2VzaXplIC0gMTApKQovKiBCZWZvcmUgMi4yLjBwcmU5ICovCiNkZWZpbmUgVjFfT0xEX01BWF9QQUdFUwkoKDB4N2ZmZmZmZmYgLyBwYWdlc2l6ZSkgLSAxKQovKiBTaW5jZSAyLjIuMHByZTk6CiAgIGVycm9yIGlmIG5yIG9mIHBhZ2VzID49IFNXUF9PRkZTRVQoU1dQX0VOVFJZKDAsfjBVTCkpCiAgIHdpdGggdmFyaWF0aW9ucyBvbgoJI2RlZmluZSBTV1BfRU5UUlkodHlwZSxvZmZzZXQpICgoKHR5cGUpIDw8IDEpIHwgKChvZmZzZXQpIDw8IDgpKQoJI2RlZmluZSBTV1BfT0ZGU0VUKGVudHJ5KSAoKGVudHJ5KSA+PiA4KQogICBvbiB0aGUgdmFyaW91cyBhcmNoaXRlY3R1cmVzLiBCZWxvdyB0aGUgcmVzdWx0IC0geXVrLgoKICAgTWFjaGluZQlwYWdlc2l6ZQlTV1BfRU5UUlkJU1dQX09GRlNFVAlib3VuZCsxCW9sZGJvdW5kKzIKICAgaTM4NgkJMl4xMgkJbzw8OAkJZT4+OAkJMTw8MjQJMTw8MTkKICAgbWlwcwkJMl4xMgkJbzw8MTUJCWU+PjE1CQkxPDwxNwkxPDwxOQogICBhbHBoYQkyXjEzCQlvPDw0MAkJZT4+NDAJCTE8PDI0CTE8PDE4CiAgIG02OGsJCTJeMTIJCW88PDEyCQllPj4xMgkJMTw8MjAJMTw8MTkKICAgc3BhcmMJMl57MTIsMTN9CShvJjB4M2ZmZmYpPDw5CShlPj45KSYweDNmZmZmCTE8PDE4CTE8PHsxOSwxOH0KICAgc3BhcmM2NAkyXjEzCQlvPDwxMwkJZT4+MTMJCTE8PDUxCTE8PDE4CiAgIHBwYwkJMl4xMgkJbzw8OAkJZT4+OAkJMTw8MjQJMTw8MTkKICAgYXJtbwkJMl57MTMsMTQsMTV9CW88PDgJCWU+PjgJCTE8PDI0CTE8PHsxOCwxNywxNn0KICAgYXJtdgkJMl4xMgkJbzw8OQkJZT4+OQkJMTw8MjMJMTw8MTkKCiAgIGFzc3VtaW5nIHRoYXQgbG9uZ3MgaGF2ZSA2NCBiaXRzIG9uIGFscGhhIGFuZCBzcGFyYzY0IGFuZCAzMiBiaXRzIGVsc2V3aGVyZS4KCiAgIFRoZSBiYWQgcGFydCBpcyB0aGF0IHdlIG5lZWQgdG8ga25vdyB0aGlzIHNpbmNlIHRoZSBrZXJuZWwgd2lsbAogICByZWZ1c2UgYSBzd2FwIHNwYWNlIGlmIGl0IGlzIHRvbyBsYXJnZS4KKi8KLyogcGF0Y2ggZnJvbSBqaiAtIHdoeSBkb2VzIHRoaXMgZGlmZmVyIGZyb20gdGhlIGFib3ZlPyAqLwojaWYgZGVmaW5lZChfX2FscGhhX18pCiNkZWZpbmUgVjFfTUFYX1BBR0VTICAgICAgICAgICAoKDEgPDwgMjQpIC0gMSkKI2VsaWYgZGVmaW5lZChfX21pcHNfXykKI2RlZmluZSBWMV9NQVhfUEFHRVMgICAgICAgICAgICgoMSA8PCAxNykgLSAxKQojZWxpZiBkZWZpbmVkKF9fc3BhcmNfdjlfXykKI2RlZmluZSBWMV9NQVhfUEFHRVMgICAgICAgICAgICgoMyA8PCAyOSkgLSAxKQojZWxpZiBkZWZpbmVkKF9fc3BhcmNfXykKI2RlZmluZSBWMV9NQVhfUEFHRVMgICAgICAgICAgIChwYWdlc2l6ZSA9PSA4MTkyID8gKCgzIDw8IDI5KSAtIDEpIDogKCgxIDw8IDE4KSAtIDEpKQojZWxzZQojZGVmaW5lIFYxX01BWF9QQUdFUyAgICAgICAgICAgVjFfT0xEX01BWF9QQUdFUwojZW5kaWYKLyogbWFuIHBhZ2Ugbm93IHNheXM6ClRoZSBtYXhpbXVtIHVzZWZ1bCBzaXplIG9mIGEgc3dhcCBhcmVhIG5vdyBkZXBlbmRzIG9uIHRoZSBhcmNoaXRlY3R1cmUuCkl0IGlzIHJvdWdobHkgMkdCIG9uIGkzODYsIFBQQywgbTY4aywgQVJNLCAxR0Igb24gc3BhcmMsIDUxMk1CIG9uIG1pcHMsCjEyOEdCIG9uIGFscGhhIGFuZCAzVEIgb24gc3BhcmM2NC4KKi8KCiNkZWZpbmUgTUFYX0JBRFBBR0VTCSgocGFnZXNpemUtMTAyNC0xMjgqc2l6ZW9mKGludCktMTApL3NpemVvZihpbnQpKQoKc3RhdGljIHZvaWQgYml0X3NldCh1bnNpZ25lZCBpbnQgKmFkZHIsIHVuc2lnbmVkIGludCBucikKewoJdW5zaWduZWQgaW50IHIsIG07CgoJYWRkciArPSBuciAvICg4ICogc2l6ZW9mKGludCkpOwoKCXIgPSAqYWRkcjsKCW0gPSAxIDw8IChuciAmICg4ICogc2l6ZW9mKGludCkgLSAxKSk7CgoJKmFkZHIgPSByIHwgbTsKfQoKc3RhdGljIGludCBiaXRfdGVzdF9hbmRfY2xlYXIodW5zaWduZWQgaW50ICphZGRyLCB1bnNpZ25lZCBpbnQgbnIpCnsKCXVuc2lnbmVkIGludCByLCBtOwoKCWFkZHIgKz0gbnIgLyAoOCAqIHNpemVvZihpbnQpKTsKCglyID0gKmFkZHI7CgltID0gMSA8PCAobnIgJiAoOCAqIHNpemVvZihpbnQpIC0gMSkpOwoKCSphZGRyID0gciAmIH5tOwoJcmV0dXJuIChyICYgbSkgIT0gMDsKfQoKCnZvaWQgZGllKGNvbnN0IGNoYXIgKnN0cikKewoJZnByaW50ZihzdGRlcnIsICIlczogJXNcbiIsIHByb2dyYW1fbmFtZSwgc3RyKTsKCWV4aXQoRkFMU0UpOwp9Cgp2b2lkIHBhZ2Vfb2soaW50IHBhZ2UpCnsKCWlmICh2ZXJzaW9uID09IDApCgkJYml0X3NldChzaWduYXR1cmVfcGFnZSwgcGFnZSk7Cn0KCnZvaWQgcGFnZV9iYWQoaW50IHBhZ2UpCnsKCWlmICh2ZXJzaW9uID09IDApCgkJYml0X3Rlc3RfYW5kX2NsZWFyKHNpZ25hdHVyZV9wYWdlLCBwYWdlKTsKCWVsc2UgewoJCWlmIChiYWRwYWdlcyA9PSBNQVhfQkFEUEFHRVMpCgkJCWRpZSgidG9vIG1hbnkgYmFkIHBhZ2VzIik7CgkJcC0+YmFkcGFnZXNbYmFkcGFnZXNdID0gcGFnZTsKCX0KCWJhZHBhZ2VzKys7Cn0KCnZvaWQgY2hlY2tfYmxvY2tzKHZvaWQpCnsKCXVuc2lnbmVkIGludCBjdXJyZW50X3BhZ2U7CglpbnQgZG9fc2VlayA9IDE7CgljaGFyICpidWZmZXI7CgoJYnVmZmVyID0geG1hbGxvYyhwYWdlc2l6ZSk7CgljdXJyZW50X3BhZ2UgPSAwOwoJd2hpbGUgKGN1cnJlbnRfcGFnZSA8IFBBR0VTKSB7CgkJaWYgKCFjaGVjaykgewoJCQlwYWdlX29rKGN1cnJlbnRfcGFnZSsrKTsKCQkJY29udGludWU7CgkJfQoJCWlmIChkb19zZWVrICYmIGxzZWVrKERFViwgY3VycmVudF9wYWdlICogcGFnZXNpemUsIFNFRUtfU0VUKSAhPQoJCQljdXJyZW50X3BhZ2UgKiBwYWdlc2l6ZSkKCQkJZGllKCJzZWVrIGZhaWxlZCBpbiBjaGVja19ibG9ja3MiKTsKCQlpZiAoKGRvX3NlZWsgPSAocGFnZXNpemUgIT0gcmVhZChERVYsIGJ1ZmZlciwgcGFnZXNpemUpKSkpIHsKCQkJcGFnZV9iYWQoY3VycmVudF9wYWdlKyspOwoJCQljb250aW51ZTsKCQl9CgkJcGFnZV9vayhjdXJyZW50X3BhZ2UrKyk7Cgl9CglpZiAoYmFkcGFnZXMgPT0gMSkKCQlwcmludGYoIm9uZSBiYWQgcGFnZVxuIik7CgllbHNlIGlmIChiYWRwYWdlcyA+IDEpCgkJcHJpbnRmKCIlZCBiYWQgcGFnZXNcbiIsIGJhZHBhZ2VzKTsKfQoKc3RhdGljIGxvbmcgdmFsaWRfb2Zmc2V0KGludCBmZCwgaW50IG9mZnNldCkKewoJY2hhciBjaDsKCglpZiAobHNlZWsoZmQsIG9mZnNldCwgMCkgPCAwKQoJCXJldHVybiAwOwoJaWYgKHJlYWQoZmQsICZjaCwgMSkgPCAxKQoJCXJldHVybiAwOwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgZmluZF9zaXplKGludCBmZCkKewoJdW5zaWduZWQgaW50IGhpZ2gsIGxvdzsKCglsb3cgPSAwOwoJZm9yIChoaWdoID0gMTsgaGlnaCA+IDAgJiYgdmFsaWRfb2Zmc2V0KGZkLCBoaWdoKTsgaGlnaCAqPSAyKQoJCWxvdyA9IGhpZ2g7Cgl3aGlsZSAobG93IDwgaGlnaCAtIDEpIHsKCQljb25zdCBpbnQgbWlkID0gKGxvdyArIGhpZ2gpIC8gMjsKCgkJaWYgKHZhbGlkX29mZnNldChmZCwgbWlkKSkKCQkJbG93ID0gbWlkOwoJCWVsc2UKCQkJaGlnaCA9IG1pZDsKCX0KCXJldHVybiAobG93ICsgMSk7Cn0KCi8qIHJldHVybiBzaXplIGluIHBhZ2VzLCB0byBhdm9pZCBpbnRlZ2VyIG92ZXJmbG93ICovCnN0YXRpYyBsb25nIGdldF9zaXplKGNvbnN0IGNoYXIgKmZpbGUpCnsKCWludCBmZDsKCWxvbmcgc2l6ZTsKCglmZCA9IG9wZW4oZmlsZSwgT19SRE9OTFkpOwoJaWYgKGZkIDwgMCkgewoJCXBlcnJvcihmaWxlKTsKCQlleGl0KDEpOwoJfQoJaWYgKGlvY3RsKGZkLCBCTEtHRVRTSVpFLCAmc2l6ZSkgPj0gMCkgewoJCWludCBzZWN0b3JzX3Blcl9wYWdlID0gcGFnZXNpemUgLyA1MTI7CgoJCXNpemUgLz0gc2VjdG9yc19wZXJfcGFnZTsKCX0gZWxzZSB7CgkJc2l6ZSA9IGZpbmRfc2l6ZShmZCkgLyBwYWdlc2l6ZTsKCX0KCWNsb3NlKGZkKTsKCXJldHVybiBzaXplOwp9CgppbnQgbWtzd2FwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CgljaGFyICp0bXA7CglzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwoJaW50IHN6OwoJaW50IG1heHBhZ2VzOwoJaW50IGdvb2RwYWdlczsKCWludCBvZmZzZXQ7CglpbnQgZm9yY2UgPSAwOwoKCWlmIChhcmdjICYmICphcmd2KQoJCXByb2dyYW1fbmFtZSA9ICphcmd2OwoKCWluaXRfc2lnbmF0dXJlX3BhZ2UoKTsJCS8qIGdldCBwYWdlc2l6ZSAqLwoKCXdoaWxlIChhcmdjLS0gPiAxKSB7CgkJYXJndisrOwoJCWlmIChhcmd2WzBdWzBdICE9ICctJykgewoJCQlpZiAoZGV2aWNlX25hbWUpIHsKCQkJCWludCBibG9ja3NfcGVyX3BhZ2UgPSBwYWdlc2l6ZSAvIDEwMjQ7CgoJCQkJUEFHRVMgPSBzdHJ0b2woYXJndlswXSwgJnRtcCwgMCkgLyBibG9ja3NfcGVyX3BhZ2U7CgkJCQlpZiAoKnRtcCkKCQkJCQl1c2FnZShta3N3YXBfdXNhZ2UpOwoJCQl9IGVsc2UKCQkJCWRldmljZV9uYW1lID0gYXJndlswXTsKCQl9IGVsc2UgewoJCQlzd2l0Y2ggKGFyZ3ZbMF1bMV0pIHsKCQkJY2FzZSAnYyc6CgkJCQljaGVjayA9IDE7CgkJCQlicmVhazsKCQkJY2FzZSAnZic6CgkJCQlmb3JjZSA9IDE7CgkJCQlicmVhazsKCQkJY2FzZSAndic6CgkJCQl2ZXJzaW9uID0gYXRvaShhcmd2WzBdICsgMik7CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCXVzYWdlKG1rc3dhcF91c2FnZSk7CgkJCX0KCQl9Cgl9CglpZiAoIWRldmljZV9uYW1lKSB7CgkJZnByaW50ZihzdGRlcnIsCgkJCQkiJXM6IGVycm9yOiBOb3doZXJlIHRvIHNldCB1cCBzd2FwIG9uP1xuIiwgcHJvZ3JhbV9uYW1lKTsKCQl1c2FnZShta3N3YXBfdXNhZ2UpOwoJfQoJc3ogPSBnZXRfc2l6ZShkZXZpY2VfbmFtZSk7CglpZiAoIVBBR0VTKSB7CgkJUEFHRVMgPSBzejsKCX0gZWxzZSBpZiAoUEFHRVMgPiBzeiAmJiAhZm9yY2UpIHsKCQlmcHJpbnRmKHN0ZGVyciwKCQkJCSIlczogZXJyb3I6ICIKCQkJCSJzaXplICVsZCBpcyBsYXJnZXIgdGhhbiBkZXZpY2Ugc2l6ZSAlZFxuIiwKCQkJCXByb2dyYW1fbmFtZSwKCQkJCVBBR0VTICogKHBhZ2VzaXplIC8gMTAyNCksIHN6ICogKHBhZ2VzaXplIC8gMTAyNCkpOwoJCWV4aXQoRkFMU0UpOwoJfQoKCWlmICh2ZXJzaW9uID09IC0xKSB7CgkJaWYgKFBBR0VTIDw9IFYwX01BWF9QQUdFUykKCQkJdmVyc2lvbiA9IDA7CgkJZWxzZSBpZiAobGludXhfdmVyc2lvbl9jb2RlKCkgPCBNQUtFX1ZFUlNJT04oMiwgMSwgMTE3KSkKCQkJdmVyc2lvbiA9IDA7CgkJZWxzZSBpZiAocGFnZXNpemUgPCAyMDQ4KQoJCQl2ZXJzaW9uID0gMDsKCQllbHNlCgkJCXZlcnNpb24gPSAxOwoJfQoJaWYgKHZlcnNpb24gIT0gMCAmJiB2ZXJzaW9uICE9IDEpIHsKCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBlcnJvcjogdW5rbm93biB2ZXJzaW9uICVkXG4iLAoJCQkJcHJvZ3JhbV9uYW1lLCB2ZXJzaW9uKTsKCQl1c2FnZShta3N3YXBfdXNhZ2UpOwoJfQoJaWYgKFBBR0VTIDwgMTApIHsKCQlmcHJpbnRmKHN0ZGVyciwKCQkJCSIlczogZXJyb3I6IHN3YXAgYXJlYSBuZWVkcyB0byBiZSBhdCBsZWFzdCAlbGRrQlxuIiwKCQkJCXByb2dyYW1fbmFtZSwgKGxvbmcpICgxMCAqIHBhZ2VzaXplIC8gMTAyNCkpOwoJCXVzYWdlKG1rc3dhcF91c2FnZSk7Cgl9CiNpZiAwCgltYXhwYWdlcyA9ICgodmVyc2lvbiA9PSAwKSA/IFYwX01BWF9QQUdFUyA6IFYxX01BWF9QQUdFUyk7CiNlbHNlCglpZiAoIXZlcnNpb24pCgkJbWF4cGFnZXMgPSBWMF9NQVhfUEFHRVM7CgllbHNlIGlmIChsaW51eF92ZXJzaW9uX2NvZGUoKSA+PSBNQUtFX1ZFUlNJT04oMiwgMiwgMSkpCgkJbWF4cGFnZXMgPSBWMV9NQVhfUEFHRVM7CgllbHNlIHsKCQltYXhwYWdlcyA9IFYxX09MRF9NQVhfUEFHRVM7CgkJaWYgKG1heHBhZ2VzID4gVjFfTUFYX1BBR0VTKQoJCQltYXhwYWdlcyA9IFYxX01BWF9QQUdFUzsKCX0KI2VuZGlmCglpZiAoUEFHRVMgPiBtYXhwYWdlcykgewoJCVBBR0VTID0gbWF4cGFnZXM7CgkJZnByaW50ZihzdGRlcnIsICIlczogd2FybmluZzogdHJ1bmNhdGluZyBzd2FwIGFyZWEgdG8gJWxka0JcbiIsCgkJCQlwcm9ncmFtX25hbWUsIFBBR0VTICogcGFnZXNpemUgLyAxMDI0KTsKCX0KCglERVYgPSBvcGVuKGRldmljZV9uYW1lLCBPX1JEV1IpOwoJaWYgKERFViA8IDAgfHwgZnN0YXQoREVWLCAmc3RhdGJ1ZikgPCAwKSB7CgkJcGVycm9yKGRldmljZV9uYW1lKTsKCQlleGl0KEZBTFNFKTsKCX0KCWlmICghU19JU0JMSyhzdGF0YnVmLnN0X21vZGUpKQoJCWNoZWNrID0gMDsKCWVsc2UgaWYgKHN0YXRidWYuc3RfcmRldiA9PSAweDAzMDAgfHwgc3RhdGJ1Zi5zdF9yZGV2ID09IDB4MDM0MCkKCQlkaWUoIldpbGwgbm90IHRyeSB0byBtYWtlIHN3YXBkZXZpY2Ugb24gJyVzJyIpOwoKI2lmZGVmIF9fc3BhcmNfXwoJaWYgKCFmb3JjZSAmJiB2ZXJzaW9uID09IDApIHsKCQkvKiBEb24ndCBvdmVyd3JpdGUgcGFydGl0aW9uIHRhYmxlIHVubGVzcyBmb3JjZWQgKi8KCQl1bnNpZ25lZCBjaGFyICpidWZmZXIgPSAodW5zaWduZWQgY2hhciAqKSBzaWduYXR1cmVfcGFnZTsKCQl1bnNpZ25lZCBzaG9ydCAqcSwgc3VtOwoKCQlpZiAocmVhZChERVYsIGJ1ZmZlciwgNTEyKSAhPSA1MTIpCgkJCWRpZSgiZmF0YWw6IGZpcnN0IHBhZ2UgdW5yZWFkYWJsZSIpOwoJCWlmIChidWZmZXJbNTA4XSA9PSAweERBICYmIGJ1ZmZlcls1MDldID09IDB4QkUpIHsKCQkJcSA9ICh1bnNpZ25lZCBzaG9ydCAqKSAoYnVmZmVyICsgNTEwKTsKCQkJZm9yIChzdW0gPSAwOyBxID49ICh1bnNpZ25lZCBzaG9ydCAqKSBidWZmZXI7KQoJCQkJc3VtIF49ICpxLS07CgkJCWlmICghc3VtKSB7CgkJCQlmcHJpbnRmKHN0ZGVyciwgIlwKJXM6IERldmljZSAnJXMnIGNvbnRhaW5zIGEgdmFsaWQgU3VuIGRpc2tsYWJlbC5cblwKVGhpcyBwcm9iYWJseSBtZWFucyBjcmVhdGluZyB2MCBzd2FwIHdvdWxkIGRlc3Ryb3kgeW91ciBwYXJ0aXRpb24gdGFibGVcblwKTm8gc3dhcCBjcmVhdGVkLiBJZiB5b3UgcmVhbGx5IHdhbnQgdG8gY3JlYXRlIHN3YXAgdjAgb24gdGhhdCBkZXZpY2UsIHVzZVxuXAp0aGUgLWYgb3B0aW9uIHRvIGZvcmNlIGl0LlxuIiwgcHJvZ3JhbV9uYW1lLCBkZXZpY2VfbmFtZSk7CgkJCQlleGl0KEZBTFNFKTsKCQkJfQoJCX0KCX0KI2VuZGlmCgoJaWYgKHZlcnNpb24gPT0gMCB8fCBjaGVjaykKCQljaGVja19ibG9ja3MoKTsKCWlmICh2ZXJzaW9uID09IDAgJiYgIWJpdF90ZXN0X2FuZF9jbGVhcihzaWduYXR1cmVfcGFnZSwgMCkpCgkJZGllKCJmYXRhbDogZmlyc3QgcGFnZSB1bnJlYWRhYmxlIik7CglpZiAodmVyc2lvbiA9PSAxKSB7CgkJcC0+dmVyc2lvbiA9IHZlcnNpb247CgkJcC0+bGFzdF9wYWdlID0gUEFHRVMgLSAxOwoJCXAtPm5yX2JhZHBhZ2VzID0gYmFkcGFnZXM7Cgl9CgoJZ29vZHBhZ2VzID0gUEFHRVMgLSBiYWRwYWdlcyAtIDE7CglpZiAoZ29vZHBhZ2VzIDw9IDApCgkJZGllKCJVbmFibGUgdG8gc2V0IHVwIHN3YXAtc3BhY2U6IHVucmVhZGFibGUiKTsKCXByaW50ZigiU2V0dGluZyB1cCBzd2Fwc3BhY2UgdmVyc2lvbiAlZCwgc2l6ZSA9ICVsZCBieXRlc1xuIiwKCQkgICB2ZXJzaW9uLCAobG9uZykgKGdvb2RwYWdlcyAqIHBhZ2VzaXplKSk7Cgl3cml0ZV9zaWduYXR1cmUoKHZlcnNpb24gPT0gMCkgPyAiU1dBUC1TUEFDRSIgOiAiU1dBUFNQQUNFMiIpOwoKCW9mZnNldCA9ICgodmVyc2lvbiA9PSAwKSA/IDAgOiAxMDI0KTsKCWlmIChsc2VlayhERVYsIG9mZnNldCwgU0VFS19TRVQpICE9IG9mZnNldCkKCQlkaWUoInVuYWJsZSB0byByZXdpbmQgc3dhcC1kZXZpY2UiKTsKCWlmICh3cml0ZShERVYsIChjaGFyICopIHNpZ25hdHVyZV9wYWdlICsgb2Zmc2V0LCBwYWdlc2l6ZSAtIG9mZnNldCkKCQkhPSBwYWdlc2l6ZSAtIG9mZnNldCkKCQlkaWUoInVuYWJsZSB0byB3cml0ZSBzaWduYXR1cmUgcGFnZSIpOwoKCS8qCgkgKiBBIHN1YnNlcXVlbnQgc3dhcG9uKCkgd2lsbCBmYWlsIGlmIHRoZSBzaWduYXR1cmUKCSAqIGlzIG5vdCBhY3R1YWxseSBvbiBkaXNrLiAoVGhpcyBpcyBhIGtlcm5lbCBidWcuKQoJICovCglpZiAoZnN5bmMoREVWKSkKCQlkaWUoImZzeW5jIGZhaWxlZCIpOwoJZXhpdChUUlVFKTsKfQo=