Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qCiAqIG1rc3dhcC5jIC0gc2V0IHVwIGEgbGludXggc3dhcCBkZXZpY2UKICoKICogKEMpIDE5OTEgTGludXMgVG9ydmFsZHMuIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCBhcyBwZXIKICogdGhlIExpbnV4IGNvcHlyaWdodC4KICovCgovKgogKiAyMC4xMi45MSAgLQl0aW1lIGJlZ2FuLiBHb3QgVk0gd29ya2luZyB5ZXN0ZXJkYXkgYnkgZG9pbmcgdGhpcyBieSBoYW5kLgogKgogKiBVc2FnZTogbWtzd2FwIFstY10gWy12Tl0gWy1mXSBkZXZpY2UgW3NpemUtaW4tYmxvY2tzXQogKgogKgktYyAgIGZvciByZWFkYWJpbGl0eSBjaGVja2luZy4gKFVzZSBpdCB1bmxlc3MgeW91IGFyZSBTVVJFISkKICoJLXZOICBmb3Igc3dhcCBhcmVhcyB2ZXJzaW9uIE4uIChPbmx5IE49MCwxIGtub3duIHRvZGF5LikKICogICAgICAtZiAgIGZvciBmb3JjaW5nIHN3YXAgY3JlYXRpb24gZXZlbiBpZiBpdCB3b3VsZCBzbWFzaCBwYXJ0aXRpb24gdGFibGUuCiAqCiAqIFRoZSBkZXZpY2UgbWF5IGJlIGEgYmxvY2sgZGV2aWNlIG9yIGFuIGltYWdlIG9mIG9uZSwgYnV0IHRoaXMgaXNuJ3QKICogZW5mb3JjZWQgKGJ1dCBpdCdzIG5vdCBtdWNoIGZ1biBvbiBhIGNoYXJhY3RlciBkZXZpY2UgOi0pLgogKgogKiBQYXRjaGVzIGZyb20gamFnZ3lAcHVycGxldC5kZW1vbi5jby51ayAoTWlrZSBKYWdkaXMpIHRvIG1ha2UgdGhlCiAqIHNpemUtaW4tYmxvY2tzIHBhcmFtZXRlciBvcHRpb25hbCBhZGRlZCBXZWQgRmViICA4IDEwOjMzOjQzIDE5OTUuCiAqCiAqIFZlcnNpb24gMSBzd2FwIGFyZWEgY29kZSAoZm9yIGtlcm5lbCAyLjEuMTE3KSwgYWViLCA5ODEwMTAuCiAqCiAqIFNwYXJjIGZpeGVzLCBqakB1bHRyYS5saW51eC5jeiAoSmFrdWIgSmVsaW5layksIDk4MTIwMSAtIG1hbmdsZWQgYnkgYWViLgogKiBWMV9NQVhfUEFHRVMgZml4ZXMsIGpqLCA5OTAzMjUuCiAqCiAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BtaXNpZWsuZXUub3JnPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqICBmcm9tIHV0aWwtbGludXggLS0gYWRhcHRlZCBmb3IgYnVzeWJveCBieQogKiAgRXJpayBBbmRlcnNlbiA8YW5kZXJzZWVAZGViaWFuLm9yZz4uIEkgcmlwcGVkIG91dCBOYXRpdmUgTGFuZ3VhZ2UKICogIFN1cHBvcnQsIG1hZGUgc29tZSBzdHVmZiBzbWFsbGVyLCBhbmQgZml0dGVkIGZvciBsaWZlIGluIGJ1c3lib3guCiAqCiAqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CQkJLyogZm9yIF9JTyAqLwojaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KI2luY2x1ZGUgPGFzbS9wYWdlLmg+CQkJLyogZm9yIFBBR0VfU0laRSBhbmQgUEFHRV9TSElGVCAqLwoJCQkJLyogd2UgYWxzbyBnZXQgUEFHRV9TSVpFIHZpYSBnZXRwYWdlc2l6ZSgpICovCiNpbmNsdWRlICJidXN5Ym94LmgiCgojaWZuZGVmIF9JTwovKiBwcmUtMS4zLjQ1ICovCnN0YXRpYyBjb25zdCBpbnQgQkxLR0VUU0laRSA9IDB4MTI2MDsKI2Vsc2UKLyogc2FtZSBvbiBpMzg2LCBtNjhrLCBhcm07IGRpZmZlcmVudCBvbiBhbHBoYSwgbWlwcywgc3BhcmMsIHBwYyAqLwojZGVmaW5lIEJMS0dFVFNJWkUgX0lPKDB4MTIsOTYpCiNlbmRpZgoKc3RhdGljIGNoYXIgKmRldmljZV9uYW1lID0gTlVMTDsKc3RhdGljIGludCBERVYgPSAtMTsKc3RhdGljIGxvbmcgUEFHRVMgPSAwOwpzdGF0aWMgaW50IGNoZWNrID0gMDsKc3RhdGljIGludCBiYWRwYWdlcyA9IDA7CnN0YXRpYyBpbnQgdmVyc2lvbiA9IC0xOwoKI2RlZmluZSBNQUtFX1ZFUlNJT04ocCxxLHIpCSg2NTUzNioocCkgKyAyNTYqKHEpICsgKHIpKQoKLyoKICogVGhlIGRlZmluaXRpb24gb2YgdGhlIHVuaW9uIHN3YXBfaGVhZGVyIHVzZXMgdGhlIGNvbnN0YW50IFBBR0VfU0laRS4KICogVW5mb3J0dW5hdGVseSwgb24gc29tZSBhcmNoaXRlY3R1cmVzIHRoaXMgZGVwZW5kcyBvbiB0aGUgaGFyZHdhcmUgbW9kZWwsCiAqIGFuZCBjYW4gb25seSBiZSBmb3VuZCBhdCBydW4gdGltZSAtLSB3ZSB1c2UgZ2V0cGFnZXNpemUoKS4KICovCgpzdGF0aWMgaW50IHBhZ2VzaXplOwpzdGF0aWMgaW50ICpzaWduYXR1cmVfcGFnZTsKCnN0YXRpYyBzdHJ1Y3Qgc3dhcF9oZWFkZXJfdjEgewoJY2hhciBib290Yml0c1sxMDI0XTsJCS8qIFNwYWNlIGZvciBkaXNrbGFiZWwgZXRjLiAqLwoJdW5zaWduZWQgaW50IHZlcnNpb247Cgl1bnNpZ25lZCBpbnQgbGFzdF9wYWdlOwoJdW5zaWduZWQgaW50IG5yX2JhZHBhZ2VzOwoJdW5zaWduZWQgaW50IHBhZGRpbmdbMTI1XTsKCXVuc2lnbmVkIGludCBiYWRwYWdlc1sxXTsKfSAqcDsKCnN0YXRpYyBpbmxpbmUgdm9pZCBpbml0X3NpZ25hdHVyZV9wYWdlKHZvaWQpCnsKCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKCiNpZmRlZiBQQUdFX1NJWkUKCWlmIChwYWdlc2l6ZSAhPSBQQUdFX1NJWkUpCgkJZXJyb3JfbXNnKCJBc3N1bWluZyBwYWdlcyBvZiBzaXplICVkIiwgcGFnZXNpemUpOwojZW5kaWYKCXNpZ25hdHVyZV9wYWdlID0gKGludCAqKSB4bWFsbG9jKHBhZ2VzaXplKTsKCW1lbXNldChzaWduYXR1cmVfcGFnZSwgMCwgcGFnZXNpemUpOwoJcCA9IChzdHJ1Y3Qgc3dhcF9oZWFkZXJfdjEgKikgc2lnbmF0dXJlX3BhZ2U7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9zaWduYXR1cmUoY2hhciAqc2lnKQp7CgljaGFyICpzcCA9IChjaGFyICopIHNpZ25hdHVyZV9wYWdlOwoKCXN0cm5jcHkoc3AgKyBwYWdlc2l6ZSAtIDEwLCBzaWcsIDEwKTsKfQoKI2RlZmluZSBWMF9NQVhfUEFHRVMJKDggKiAocGFnZXNpemUgLSAxMCkpCi8qIEJlZm9yZSAyLjIuMHByZTkgKi8KI2RlZmluZSBWMV9PTERfTUFYX1BBR0VTCSgoMHg3ZmZmZmZmZiAvIHBhZ2VzaXplKSAtIDEpCi8qIFNpbmNlIDIuMi4wcHJlOToKICAgZXJyb3IgaWYgbnIgb2YgcGFnZXMgPj0gU1dQX09GRlNFVChTV1BfRU5UUlkoMCx+MFVMKSkKICAgd2l0aCB2YXJpYXRpb25zIG9uCgkjZGVmaW5lIFNXUF9FTlRSWSh0eXBlLG9mZnNldCkgKCgodHlwZSkgPDwgMSkgfCAoKG9mZnNldCkgPDwgOCkpCgkjZGVmaW5lIFNXUF9PRkZTRVQoZW50cnkpICgoZW50cnkpID4+IDgpCiAgIG9uIHRoZSB2YXJpb3VzIGFyY2hpdGVjdHVyZXMuIEJlbG93IHRoZSByZXN1bHQgLSB5dWsuCgogICBNYWNoaW5lCXBhZ2VzaXplCVNXUF9FTlRSWQlTV1BfT0ZGU0VUCWJvdW5kKzEJb2xkYm91bmQrMgogICBpMzg2CQkyXjEyCQlvPDw4CQllPj44CQkxPDwyNAkxPDwxOQogICBtaXBzCQkyXjEyCQlvPDwxNQkJZT4+MTUJCTE8PDE3CTE8PDE5CiAgIGFscGhhCTJeMTMJCW88PDQwCQllPj40MAkJMTw8MjQJMTw8MTgKICAgbTY4awkJMl4xMgkJbzw8MTIJCWU+PjEyCQkxPDwyMAkxPDwxOQogICBzcGFyYwkyXnsxMiwxM30JKG8mMHgzZmZmZik8PDkJKGU+PjkpJjB4M2ZmZmYJMTw8MTgJMTw8ezE5LDE4fQogICBzcGFyYzY0CTJeMTMJCW88PDEzCQllPj4xMwkJMTw8NTEJMTw8MTgKICAgcHBjCQkyXjEyCQlvPDw4CQllPj44CQkxPDwyNAkxPDwxOQogICBhcm1vCQkyXnsxMywxNCwxNX0Jbzw8OAkJZT4+OAkJMTw8MjQJMTw8ezE4LDE3LDE2fQogICBhcm12CQkyXjEyCQlvPDw5CQllPj45CQkxPDwyMwkxPDwxOQoKICAgYXNzdW1pbmcgdGhhdCBsb25ncyBoYXZlIDY0IGJpdHMgb24gYWxwaGEgYW5kIHNwYXJjNjQgYW5kIDMyIGJpdHMgZWxzZXdoZXJlLgoKICAgVGhlIGJhZCBwYXJ0IGlzIHRoYXQgd2UgbmVlZCB0byBrbm93IHRoaXMgc2luY2UgdGhlIGtlcm5lbCB3aWxsCiAgIHJlZnVzZSBhIHN3YXAgc3BhY2UgaWYgaXQgaXMgdG9vIGxhcmdlLgoqLwovKiBwYXRjaCBmcm9tIGpqIC0gd2h5IGRvZXMgdGhpcyBkaWZmZXIgZnJvbSB0aGUgYWJvdmU/ICovCiNpZiBkZWZpbmVkKF9fYWxwaGFfXykKI2RlZmluZSBWMV9NQVhfUEFHRVMgICAgICAgICAgICgoMSA8PCAyNCkgLSAxKQojZWxpZiBkZWZpbmVkKF9fbWlwc19fKQojZGVmaW5lIFYxX01BWF9QQUdFUyAgICAgICAgICAgKCgxIDw8IDE3KSAtIDEpCiNlbGlmIGRlZmluZWQoX19zcGFyY192OV9fKQojZGVmaW5lIFYxX01BWF9QQUdFUyAgICAgICAgICAgKCgzIDw8IDI5KSAtIDEpCiNlbGlmIGRlZmluZWQoX19zcGFyY19fKQojZGVmaW5lIFYxX01BWF9QQUdFUyAgICAgICAgICAgKHBhZ2VzaXplID09IDgxOTIgPyAoKDMgPDwgMjkpIC0gMSkgOiAoKDEgPDwgMTgpIC0gMSkpCiNlbHNlCiNkZWZpbmUgVjFfTUFYX1BBR0VTICAgICAgICAgICBWMV9PTERfTUFYX1BBR0VTCiNlbmRpZgovKiBtYW4gcGFnZSBub3cgc2F5czoKVGhlIG1heGltdW0gdXNlZnVsIHNpemUgb2YgYSBzd2FwIGFyZWEgbm93IGRlcGVuZHMgb24gdGhlIGFyY2hpdGVjdHVyZS4KSXQgaXMgcm91Z2hseSAyR0Igb24gaTM4NiwgUFBDLCBtNjhrLCBBUk0sIDFHQiBvbiBzcGFyYywgNTEyTUIgb24gbWlwcywKMTI4R0Igb24gYWxwaGEgYW5kIDNUQiBvbiBzcGFyYzY0LgoqLwoKI2RlZmluZSBNQVhfQkFEUEFHRVMJKChwYWdlc2l6ZS0xMDI0LTEyOCpzaXplb2YoaW50KS0xMCkvc2l6ZW9mKGludCkpCgpzdGF0aWMgaW5saW5lIHZvaWQgYml0X3NldCh1bnNpZ25lZCBpbnQgKmFkZHIsIHVuc2lnbmVkIGludCBucikKewoJdW5zaWduZWQgaW50IHIsIG07CgoJYWRkciArPSBuciAvICg4ICogc2l6ZW9mKGludCkpOwoKCXIgPSAqYWRkcjsKCW0gPSAxIDw8IChuciAmICg4ICogc2l6ZW9mKGludCkgLSAxKSk7CgoJKmFkZHIgPSByIHwgbTsKfQoKc3RhdGljIGludCBiaXRfdGVzdF9hbmRfY2xlYXIodW5zaWduZWQgaW50ICphZGRyLCB1bnNpZ25lZCBpbnQgbnIpCnsKCXVuc2lnbmVkIGludCByLCBtOwoKCWFkZHIgKz0gbnIgLyAoOCAqIHNpemVvZihpbnQpKTsKCglyID0gKmFkZHI7CgltID0gMSA8PCAobnIgJiAoOCAqIHNpemVvZihpbnQpIC0gMSkpOwoKCSphZGRyID0gciAmIH5tOwoJcmV0dXJuIChyICYgbSkgIT0gMDsKfQoKCnN0YXRpYyB2b2lkIHBhZ2Vfb2soaW50IHBhZ2UpCnsKCWlmICh2ZXJzaW9uID09IDApCgkJYml0X3NldChzaWduYXR1cmVfcGFnZSwgcGFnZSk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBwYWdlX2JhZChpbnQgcGFnZSkKewoJaWYgKHZlcnNpb24gPT0gMCkKCQliaXRfdGVzdF9hbmRfY2xlYXIoc2lnbmF0dXJlX3BhZ2UsIHBhZ2UpOwoJZWxzZSB7CgkJaWYgKGJhZHBhZ2VzID09IE1BWF9CQURQQUdFUykKCQkJZXJyb3JfbXNnX2FuZF9kaWUoInRvbyBtYW55IGJhZCBwYWdlcyIpOwoJCXAtPmJhZHBhZ2VzW2JhZHBhZ2VzXSA9IHBhZ2U7Cgl9CgliYWRwYWdlcysrOwp9CgpzdGF0aWMgdm9pZCBjaGVja19ibG9ja3Modm9pZCkKewoJdW5zaWduZWQgaW50IGN1cnJlbnRfcGFnZTsKCWludCBkb19zZWVrID0gMTsKCWNoYXIgKmJ1ZmZlcjsKCglidWZmZXIgPSB4bWFsbG9jKHBhZ2VzaXplKTsKCWN1cnJlbnRfcGFnZSA9IDA7Cgl3aGlsZSAoY3VycmVudF9wYWdlIDwgUEFHRVMpIHsKCQlpZiAoIWNoZWNrKSB7CgkJCXBhZ2Vfb2soY3VycmVudF9wYWdlKyspOwoJCQljb250aW51ZTsKCQl9CgkJaWYgKGRvX3NlZWsgJiYgbHNlZWsoREVWLCBjdXJyZW50X3BhZ2UgKiBwYWdlc2l6ZSwgU0VFS19TRVQpICE9CgkJCWN1cnJlbnRfcGFnZSAqIHBhZ2VzaXplKQoJCQllcnJvcl9tc2dfYW5kX2RpZSgic2VlayBmYWlsZWQgaW4gY2hlY2tfYmxvY2tzIik7CgkJaWYgKChkb19zZWVrID0gKHBhZ2VzaXplICE9IHJlYWQoREVWLCBidWZmZXIsIHBhZ2VzaXplKSkpKSB7CgkJCXBhZ2VfYmFkKGN1cnJlbnRfcGFnZSsrKTsKCQkJY29udGludWU7CgkJfQoJCXBhZ2Vfb2soY3VycmVudF9wYWdlKyspOwoJfQoJaWYgKGJhZHBhZ2VzID09IDEpCgkJcHJpbnRmKCJvbmUgYmFkIHBhZ2VcbiIpOwoJZWxzZSBpZiAoYmFkcGFnZXMgPiAxKQoJCXByaW50ZigiJWQgYmFkIHBhZ2VzXG4iLCBiYWRwYWdlcyk7Cn0KCnN0YXRpYyBsb25nIHZhbGlkX29mZnNldChpbnQgZmQsIGludCBvZmZzZXQpCnsKCWNoYXIgY2g7CgoJaWYgKGxzZWVrKGZkLCBvZmZzZXQsIDApIDwgMCkKCQlyZXR1cm4gMDsKCWlmIChyZWFkKGZkLCAmY2gsIDEpIDwgMSkKCQlyZXR1cm4gMDsKCXJldHVybiAxOwp9CgpzdGF0aWMgaW50IGZpbmRfc2l6ZShpbnQgZmQpCnsKCXVuc2lnbmVkIGludCBoaWdoLCBsb3c7CgoJbG93ID0gMDsKCWZvciAoaGlnaCA9IDE7IGhpZ2ggPiAwICYmIHZhbGlkX29mZnNldChmZCwgaGlnaCk7IGhpZ2ggKj0gMikKCQlsb3cgPSBoaWdoOwoJd2hpbGUgKGxvdyA8IGhpZ2ggLSAxKSB7CgkJY29uc3QgaW50IG1pZCA9IChsb3cgKyBoaWdoKSAvIDI7CgoJCWlmICh2YWxpZF9vZmZzZXQoZmQsIG1pZCkpCgkJCWxvdyA9IG1pZDsKCQllbHNlCgkJCWhpZ2ggPSBtaWQ7Cgl9CglyZXR1cm4gKGxvdyArIDEpOwp9CgovKiByZXR1cm4gc2l6ZSBpbiBwYWdlcywgdG8gYXZvaWQgaW50ZWdlciBvdmVyZmxvdyAqLwpzdGF0aWMgbG9uZyBnZXRfc2l6ZShjb25zdCBjaGFyICpmaWxlKQp7CglpbnQgZmQ7Cglsb25nIHNpemU7CgoJaWYgKChmZCA9IG9wZW4oZmlsZSwgT19SRE9OTFkpKSA8IDApCgkJcGVycm9yX21zZ19hbmRfZGllKCIlcyIsIGZpbGUpOwoJaWYgKGlvY3RsKGZkLCBCTEtHRVRTSVpFLCAmc2l6ZSkgPj0gMCkgewoJCWludCBzZWN0b3JzX3Blcl9wYWdlID0gcGFnZXNpemUgLyA1MTI7CgoJCXNpemUgLz0gc2VjdG9yc19wZXJfcGFnZTsKCX0gZWxzZSB7CgkJc2l6ZSA9IGZpbmRfc2l6ZShmZCkgLyBwYWdlc2l6ZTsKCX0KCWNsb3NlKGZkKTsKCXJldHVybiBzaXplOwp9CgppbnQgbWtzd2FwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CgljaGFyICp0bXA7CglzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwoJaW50IHN6OwoJaW50IG1heHBhZ2VzOwoJaW50IGdvb2RwYWdlczsKCWludCBvZmZzZXQ7CglpbnQgZm9yY2UgPSAwOwoKCWluaXRfc2lnbmF0dXJlX3BhZ2UoKTsJCS8qIGdldCBwYWdlc2l6ZSAqLwoKCXdoaWxlIChhcmdjLS0gPiAxKSB7CgkJYXJndisrOwoJCWlmIChhcmd2WzBdWzBdICE9ICctJykgewoJCQlpZiAoZGV2aWNlX25hbWUpIHsKCQkJCWludCBibG9ja3NfcGVyX3BhZ2UgPSBwYWdlc2l6ZSAvIDEwMjQ7CgoJCQkJUEFHRVMgPSBzdHJ0b2woYXJndlswXSwgJnRtcCwgMCkgLyBibG9ja3NfcGVyX3BhZ2U7CgkJCQlpZiAoKnRtcCkKCQkJCQlzaG93X3VzYWdlKCk7CgkJCX0gZWxzZQoJCQkJZGV2aWNlX25hbWUgPSBhcmd2WzBdOwoJCX0gZWxzZSB7CgkJCXN3aXRjaCAoYXJndlswXVsxXSkgewoJCQljYXNlICdjJzoKCQkJCWNoZWNrID0gMTsKCQkJCWJyZWFrOwoJCQljYXNlICdmJzoKCQkJCWZvcmNlID0gMTsKCQkJCWJyZWFrOwoJCQljYXNlICd2JzoKCQkJCXZlcnNpb24gPSBhdG9pKGFyZ3ZbMF0gKyAyKTsKCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJc2hvd191c2FnZSgpOwoJCQl9CgkJfQoJfQoJaWYgKCFkZXZpY2VfbmFtZSkgewoJCWVycm9yX21zZygiZXJyb3I6IE5vd2hlcmUgdG8gc2V0IHVwIHN3YXAgb24/Iik7CgkJc2hvd191c2FnZSgpOwoJfQoJc3ogPSBnZXRfc2l6ZShkZXZpY2VfbmFtZSk7CglpZiAoIVBBR0VTKSB7CgkJUEFHRVMgPSBzejsKCX0gZWxzZSBpZiAoUEFHRVMgPiBzeiAmJiAhZm9yY2UpIHsKCQllcnJvcl9tc2coImVycm9yOiBzaXplICVsZCBpcyBsYXJnZXIgdGhhbiBkZXZpY2Ugc2l6ZSAlZCIsCgkJCQlQQUdFUyAqIChwYWdlc2l6ZSAvIDEwMjQpLCBzeiAqIChwYWdlc2l6ZSAvIDEwMjQpKTsKCQlyZXR1cm4gRVhJVF9GQUlMVVJFOwoJfQoKCWlmICh2ZXJzaW9uID09IC0xKSB7CgkJaWYgKFBBR0VTIDw9IFYwX01BWF9QQUdFUykKCQkJdmVyc2lvbiA9IDA7CgkJZWxzZSBpZiAoZ2V0X2tlcm5lbF9yZXZpc2lvbigpIDwgTUFLRV9WRVJTSU9OKDIsIDEsIDExNykpCgkJCXZlcnNpb24gPSAwOwoJCWVsc2UgaWYgKHBhZ2VzaXplIDwgMjA0OCkKCQkJdmVyc2lvbiA9IDA7CgkJZWxzZQoJCQl2ZXJzaW9uID0gMTsKCX0KCWlmICh2ZXJzaW9uICE9IDAgJiYgdmVyc2lvbiAhPSAxKSB7CgkJZXJyb3JfbXNnKCJlcnJvcjogdW5rbm93biB2ZXJzaW9uICVkIiwgdmVyc2lvbik7CgkJc2hvd191c2FnZSgpOwoJfQoJaWYgKFBBR0VTIDwgMTApIHsKCQllcnJvcl9tc2coImVycm9yOiBzd2FwIGFyZWEgbmVlZHMgdG8gYmUgYXQgbGVhc3QgJWxka0IiLAoJCQkJKGxvbmcpICgxMCAqIHBhZ2VzaXplIC8gMTAyNCkpOwoJCXNob3dfdXNhZ2UoKTsKCX0KI2lmIDAKCW1heHBhZ2VzID0gKCh2ZXJzaW9uID09IDApID8gVjBfTUFYX1BBR0VTIDogVjFfTUFYX1BBR0VTKTsKI2Vsc2UKCWlmICghdmVyc2lvbikKCQltYXhwYWdlcyA9IFYwX01BWF9QQUdFUzsKCWVsc2UgaWYgKGdldF9rZXJuZWxfcmV2aXNpb24oKSA+PSBNQUtFX1ZFUlNJT04oMiwgMiwgMSkpCgkJbWF4cGFnZXMgPSBWMV9NQVhfUEFHRVM7CgllbHNlIHsKCQltYXhwYWdlcyA9IFYxX09MRF9NQVhfUEFHRVM7CgkJaWYgKG1heHBhZ2VzID4gVjFfTUFYX1BBR0VTKQoJCQltYXhwYWdlcyA9IFYxX01BWF9QQUdFUzsKCX0KI2VuZGlmCglpZiAoUEFHRVMgPiBtYXhwYWdlcykgewoJCVBBR0VTID0gbWF4cGFnZXM7CgkJZXJyb3JfbXNnKCJ3YXJuaW5nOiB0cnVuY2F0aW5nIHN3YXAgYXJlYSB0byAlbGRrQiIsCgkJCQlQQUdFUyAqIHBhZ2VzaXplIC8gMTAyNCk7Cgl9CgoJREVWID0gb3BlbihkZXZpY2VfbmFtZSwgT19SRFdSKTsKCWlmIChERVYgPCAwIHx8IGZzdGF0KERFViwgJnN0YXRidWYpIDwgMCkKCQlwZXJyb3JfbXNnX2FuZF9kaWUoIiVzIiwgZGV2aWNlX25hbWUpOwoJaWYgKCFTX0lTQkxLKHN0YXRidWYuc3RfbW9kZSkpCgkJY2hlY2sgPSAwOwoJZWxzZSBpZiAoc3RhdGJ1Zi5zdF9yZGV2ID09IDB4MDMwMCB8fCBzdGF0YnVmLnN0X3JkZXYgPT0gMHgwMzQwKQoJCWVycm9yX21zZ19hbmRfZGllKCJXaWxsIG5vdCB0cnkgdG8gbWFrZSBzd2FwZGV2aWNlIG9uICclcyciLCBkZXZpY2VfbmFtZSk7CgojaWZkZWYgX19zcGFyY19fCglpZiAoIWZvcmNlICYmIHZlcnNpb24gPT0gMCkgewoJCS8qIERvbid0IG92ZXJ3cml0ZSBwYXJ0aXRpb24gdGFibGUgdW5sZXNzIGZvcmNlZCAqLwoJCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopIHNpZ25hdHVyZV9wYWdlOwoJCXVuc2lnbmVkIHNob3J0ICpxLCBzdW07CgoJCWlmIChyZWFkKERFViwgYnVmZmVyLCA1MTIpICE9IDUxMikKCQkJZXJyb3JfbXNnX2FuZF9kaWUoImZhdGFsOiBmaXJzdCBwYWdlIHVucmVhZGFibGUiKTsKCQlpZiAoYnVmZmVyWzUwOF0gPT0gMHhEQSAmJiBidWZmZXJbNTA5XSA9PSAweEJFKSB7CgkJCXEgPSAodW5zaWduZWQgc2hvcnQgKikgKGJ1ZmZlciArIDUxMCk7CgkJCWZvciAoc3VtID0gMDsgcSA+PSAodW5zaWduZWQgc2hvcnQgKikgYnVmZmVyOykKCQkJCXN1bSBePSAqcS0tOwoJCQlpZiAoIXN1bSkgewoJCQkJZXJyb3JfbXNnKCJEZXZpY2UgJyVzJyBjb250YWlucyBhIHZhbGlkIFN1biBkaXNrbGFiZWwuXG4iCiJUaGlzIHByb2JhYmx5IG1lYW5zIGNyZWF0aW5nIHYwIHN3YXAgd291bGQgZGVzdHJveSB5b3VyIHBhcnRpdGlvbiB0YWJsZVxuIgoiTm8gc3dhcCBjcmVhdGVkLiBJZiB5b3UgcmVhbGx5IHdhbnQgdG8gY3JlYXRlIHN3YXAgdjAgb24gdGhhdCBkZXZpY2UsIHVzZVxuIgoidGhlIC1mIG9wdGlvbiB0byBmb3JjZSBpdC4iLCBkZXZpY2VfbmFtZSk7CgkJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOwoJCQl9CgkJfQoJfQojZW5kaWYKCglpZiAodmVyc2lvbiA9PSAwIHx8IGNoZWNrKQoJCWNoZWNrX2Jsb2NrcygpOwoJaWYgKHZlcnNpb24gPT0gMCAmJiAhYml0X3Rlc3RfYW5kX2NsZWFyKHNpZ25hdHVyZV9wYWdlLCAwKSkKCQllcnJvcl9tc2dfYW5kX2RpZSgiZmF0YWw6IGZpcnN0IHBhZ2UgdW5yZWFkYWJsZSIpOwoJaWYgKHZlcnNpb24gPT0gMSkgewoJCXAtPnZlcnNpb24gPSB2ZXJzaW9uOwoJCXAtPmxhc3RfcGFnZSA9IFBBR0VTIC0gMTsKCQlwLT5ucl9iYWRwYWdlcyA9IGJhZHBhZ2VzOwoJfQoKCWdvb2RwYWdlcyA9IFBBR0VTIC0gYmFkcGFnZXMgLSAxOwoJaWYgKGdvb2RwYWdlcyA8PSAwKQoJCWVycm9yX21zZ19hbmRfZGllKCJVbmFibGUgdG8gc2V0IHVwIHN3YXAtc3BhY2U6IHVucmVhZGFibGUiKTsKCXByaW50ZigiU2V0dGluZyB1cCBzd2Fwc3BhY2UgdmVyc2lvbiAlZCwgc2l6ZSA9ICVsZCBieXRlc1xuIiwKCQkgICB2ZXJzaW9uLCAobG9uZykgKGdvb2RwYWdlcyAqIHBhZ2VzaXplKSk7Cgl3cml0ZV9zaWduYXR1cmUoKHZlcnNpb24gPT0gMCkgPyAiU1dBUC1TUEFDRSIgOiAiU1dBUFNQQUNFMiIpOwoKCW9mZnNldCA9ICgodmVyc2lvbiA9PSAwKSA/IDAgOiAxMDI0KTsKCWlmIChsc2VlayhERVYsIG9mZnNldCwgU0VFS19TRVQpICE9IG9mZnNldCkKCQllcnJvcl9tc2dfYW5kX2RpZSgidW5hYmxlIHRvIHJld2luZCBzd2FwLWRldmljZSIpOwoJaWYgKHdyaXRlKERFViwgKGNoYXIgKikgc2lnbmF0dXJlX3BhZ2UgKyBvZmZzZXQsIHBhZ2VzaXplIC0gb2Zmc2V0KQoJCSE9IHBhZ2VzaXplIC0gb2Zmc2V0KQoJCWVycm9yX21zZ19hbmRfZGllKCJ1bmFibGUgdG8gd3JpdGUgc2lnbmF0dXJlIHBhZ2UiKTsKCgkvKgoJICogQSBzdWJzZXF1ZW50IHN3YXBvbigpIHdpbGwgZmFpbCBpZiB0aGUgc2lnbmF0dXJlCgkgKiBpcyBub3QgYWN0dWFsbHkgb24gZGlzay4gKFRoaXMgaXMgYSBrZXJuZWwgYnVnLikKCSAqLwoJaWYgKGZzeW5jKERFVikpCgkJZXJyb3JfbXNnX2FuZF9kaWUoImZzeW5jIGZhaWxlZCIpOwoJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKfQo=