LyoKICogbWtzd2FwLmMgLSBzZXQgdXAgYSBsaW51eCBzd2FwIGRldmljZQogKgogKiAoQykgMTk5MSBMaW51cyBUb3J2YWxkcy4gVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIGFzIHBlcgogKiB0aGUgTGludXggY29weXJpZ2h0LgogKi8KCi8qCiAqIDIwLjEyLjkxICAtCXRpbWUgYmVnYW4uIEdvdCBWTSB3b3JraW5nIHllc3RlcmRheSBieSBkb2luZyB0aGlzIGJ5IGhhbmQuCiAqCiAqIFVzYWdlOiBta3N3YXAgWy1jXSBbLXZOXSBbLWZdIGRldmljZSBbc2l6ZS1pbi1ibG9ja3NdCiAqCiAqCS1jICAgZm9yIHJlYWRhYmlsaXR5IGNoZWNraW5nLiAoVXNlIGl0IHVubGVzcyB5b3UgYXJlIFNVUkUhKQogKgktdk4gIGZvciBzd2FwIGFyZWFzIHZlcnNpb24gTi4gKE9ubHkgTj0wLDEga25vd24gdG9kYXkuKQogKiAgICAgIC1mICAgZm9yIGZvcmNpbmcgc3dhcCBjcmVhdGlvbiBldmVuIGlmIGl0IHdvdWxkIHNtYXNoIHBhcnRpdGlvbiB0YWJsZS4KICoKICogVGhlIGRldmljZSBtYXkgYmUgYSBibG9jayBkZXZpY2Ugb3IgYW4gaW1hZ2Ugb2Ygb25lLCBidXQgdGhpcyBpc24ndAogKiBlbmZvcmNlZCAoYnV0IGl0J3Mgbm90IG11Y2ggZnVuIG9uIGEgY2hhcmFjdGVyIGRldmljZSA6LSkuCiAqCiAqIFBhdGNoZXMgZnJvbSBqYWdneUBwdXJwbGV0LmRlbW9uLmNvLnVrIChNaWtlIEphZ2RpcykgdG8gbWFrZSB0aGUKICogc2l6ZS1pbi1ibG9ja3MgcGFyYW1ldGVyIG9wdGlvbmFsIGFkZGVkIFdlZCBGZWIgIDggMTA6MzM6NDMgMTk5NS4KICoKICogVmVyc2lvbiAxIHN3YXAgYXJlYSBjb2RlIChmb3Iga2VybmVsIDIuMS4xMTcpLCBhZWIsIDk4MTAxMC4KICoKICogU3BhcmMgZml4ZXMsIGpqQHVsdHJhLmxpbnV4LmN6IChKYWt1YiBKZWxpbmVrKSwgOTgxMjAxIC0gbWFuZ2xlZCBieSBhZWIuCiAqIFYxX01BWF9QQUdFUyBmaXhlcywgamosIDk5MDMyNS4KICoKICogMTk5OS0wMi0yMiBBcmthZGl1c3ogTWm2a2lld2ljeiA8bWlzaWVrQG1pc2llay5ldS5vcmc+CiAqIC0gYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKICoKICogIGZyb20gdXRpbC1saW51eCAtLSBhZGFwdGVkIGZvciBidXN5Ym94IGJ5CiAqICBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlZUBkZWJpYW4ub3JnPi4gSSByaXBwZWQgb3V0IE5hdGl2ZSBMYW5ndWFnZQogKiAgU3VwcG9ydCwgbWFkZSBzb21lIHN0dWZmIHNtYWxsZXIsIGFuZCBmaXR0ZWQgZm9yIGxpZmUgaW4gYnVzeWJveC4KICoKICovCgojaW5jbHVkZSAiaW50ZXJuYWwuaCIKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CQkvKiBmb3IgX0lPICovCiNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPGFzbS9wYWdlLmg+CQkvKiBmb3IgUEFHRV9TSVpFIGFuZCBQQUdFX1NISUZUICovCgkJCQkvKiB3ZSBhbHNvIGdldCBQQUdFX1NJWkUgdmlhIGdldHBhZ2VzaXplKCkgKi8KCgpzdGF0aWMgY29uc3QgY2hhciBta3N3YXBfdXNhZ2VbXSA9ICJta3N3YXAgWy1jXSBbLXYwfC12MV0gZGV2aWNlIFtibG9jay1jb3VudF1cbiIKIlByZXBhcmUgYSBkaXNrIHBhcnRpdGlvbiB0byBiZSB1c2VkIGFzIGEgc3dhcCBwYXJ0aXRpb24uXG5cbiIKIlx0LWNcdENoZWNrIGZvciByZWFkLWFiaWxpdHkuXG4iCiJcdC12MFx0TWFrZSB2ZXJzaW9uIDAgc3dhcCBbbWF4IDEyOCBNZWdzXS5cbiIKIlx0LXYxXHRNYWtlIHZlcnNpb24gMSBzd2FwIFtiaWchXSAoZGVmYXVsdCBmb3Iga2VybmVscyA+IDIuMS4xMTcpLlxuIgoiXHRibG9jay1jb3VudFx0TnVtYmVyIG9mIGJsb2NrIHRvIHVzZSAoZGVmYXVsdCBpcyBlbnRpcmUgcGFydGl0aW9uKS5cbiI7CgoKI2lmbmRlZiBfSU8KLyogcHJlLTEuMy40NSAqLwojZGVmaW5lIEJMS0dFVFNJWkUgMHgxMjYwCiNlbHNlCi8qIHNhbWUgb24gaTM4NiwgbTY4aywgYXJtOyBkaWZmZXJlbnQgb24gYWxwaGEsIG1pcHMsIHNwYXJjLCBwcGMgKi8KI2RlZmluZSBCTEtHRVRTSVpFIF9JTygweDEyLDk2KQojZW5kaWYKCnN0YXRpYyBjaGFyICogcHJvZ3JhbV9uYW1lID0gIm1rc3dhcCI7CnN0YXRpYyBjaGFyICogZGV2aWNlX25hbWUgPSBOVUxMOwpzdGF0aWMgaW50IERFViA9IC0xOwpzdGF0aWMgbG9uZyBQQUdFUyA9IDA7CnN0YXRpYyBpbnQgY2hlY2sgPSAwOwpzdGF0aWMgaW50IGJhZHBhZ2VzID0gMDsKc3RhdGljIGludCB2ZXJzaW9uID0gLTE7CgojZGVmaW5lIE1BS0VfVkVSU0lPTihwLHEscikJKDY1NTM2KihwKSArIDI1NioocSkgKyAocikpCgpzdGF0aWMgaW50CmxpbnV4X3ZlcnNpb25fY29kZSh2b2lkKSB7CglzdHJ1Y3QgdXRzbmFtZSBteV91dHNuYW1lOwoJaW50IHAsIHEsIHI7CgoJaWYgKHVuYW1lKCZteV91dHNuYW1lKSA9PSAwKSB7CgkJcCA9IGF0b2koc3RydG9rKG15X3V0c25hbWUucmVsZWFzZSwgIi4iKSk7CgkJcSA9IGF0b2koc3RydG9rKE5VTEwsICIuIikpOwoJCXIgPSBhdG9pKHN0cnRvayhOVUxMLCAiLiIpKTsKCQlyZXR1cm4gTUFLRV9WRVJTSU9OKHAscSxyKTsKCX0KCXJldHVybiAwOwp9CgovKgogKiBUaGUgZGVmaW5pdGlvbiBvZiB0aGUgdW5pb24gc3dhcF9oZWFkZXIgdXNlcyB0aGUgY29uc3RhbnQgUEFHRV9TSVpFLgogKiBVbmZvcnR1bmF0ZWx5LCBvbiBzb21lIGFyY2hpdGVjdHVyZXMgdGhpcyBkZXBlbmRzIG9uIHRoZSBoYXJkd2FyZSBtb2RlbCwKICogYW5kIGNhbiBvbmx5IGJlIGZvdW5kIGF0IHJ1biB0aW1lIC0tIHdlIHVzZSBnZXRwYWdlc2l6ZSgpLgogKi8KCnN0YXRpYyBpbnQgcGFnZXNpemU7CnN0YXRpYyBpbnQgKnNpZ25hdHVyZV9wYWdlOwoKc3RydWN0IHN3YXBfaGVhZGVyX3YxIHsKICAgICAgICBjaGFyICAgICAgICAgYm9vdGJpdHNbMTAyNF07ICAgIC8qIFNwYWNlIGZvciBkaXNrbGFiZWwgZXRjLiAqLwoJdW5zaWduZWQgaW50IHZlcnNpb247Cgl1bnNpZ25lZCBpbnQgbGFzdF9wYWdlOwoJdW5zaWduZWQgaW50IG5yX2JhZHBhZ2VzOwoJdW5zaWduZWQgaW50IHBhZGRpbmdbMTI1XTsKCXVuc2lnbmVkIGludCBiYWRwYWdlc1sxXTsKfSAqcDsKCnN0YXRpYyB2b2lkCmluaXRfc2lnbmF0dXJlX3BhZ2UoKSB7CglwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7CgojaWZkZWYgUEFHRV9TSVpFCglpZiAocGFnZXNpemUgIT0gUEFHRV9TSVpFKQoJCWZwcmludGYoc3RkZXJyLCAiQXNzdW1pbmcgcGFnZXMgb2Ygc2l6ZSAlZFxuIiwgcGFnZXNpemUpOwojZW5kaWYKCXNpZ25hdHVyZV9wYWdlID0gKGludCAqKSBtYWxsb2MocGFnZXNpemUpOwoJbWVtc2V0KHNpZ25hdHVyZV9wYWdlLDAscGFnZXNpemUpOwoJcCA9IChzdHJ1Y3Qgc3dhcF9oZWFkZXJfdjEgKikgc2lnbmF0dXJlX3BhZ2U7Cn0KCnN0YXRpYyB2b2lkCndyaXRlX3NpZ25hdHVyZShjaGFyICpzaWcpIHsKCWNoYXIgKnNwID0gKGNoYXIgKikgc2lnbmF0dXJlX3BhZ2U7CgoJc3RybmNweShzcCtwYWdlc2l6ZS0xMCwgc2lnLCAxMCk7Cn0KCiNkZWZpbmUgVjBfTUFYX1BBR0VTCSg4ICogKHBhZ2VzaXplIC0gMTApKQovKiBCZWZvcmUgMi4yLjBwcmU5ICovCiNkZWZpbmUgVjFfT0xEX01BWF9QQUdFUwkoKDB4N2ZmZmZmZmYgLyBwYWdlc2l6ZSkgLSAxKQovKiBTaW5jZSAyLjIuMHByZTk6CiAgIGVycm9yIGlmIG5yIG9mIHBhZ2VzID49IFNXUF9PRkZTRVQoU1dQX0VOVFJZKDAsfjBVTCkpCiAgIHdpdGggdmFyaWF0aW9ucyBvbgoJI2RlZmluZSBTV1BfRU5UUlkodHlwZSxvZmZzZXQpICgoKHR5cGUpIDw8IDEpIHwgKChvZmZzZXQpIDw8IDgpKQoJI2RlZmluZSBTV1BfT0ZGU0VUKGVudHJ5KSAoKGVudHJ5KSA+PiA4KQogICBvbiB0aGUgdmFyaW91cyBhcmNoaXRlY3R1cmVzLiBCZWxvdyB0aGUgcmVzdWx0IC0geXVrLgoKICAgTWFjaGluZQlwYWdlc2l6ZQlTV1BfRU5UUlkJU1dQX09GRlNFVAlib3VuZCsxCW9sZGJvdW5kKzIKICAgaTM4NgkJMl4xMgkJbzw8OAkJZT4+OAkJMTw8MjQJMTw8MTkKICAgbWlwcwkJMl4xMgkJbzw8MTUJCWU+PjE1CQkxPDwxNwkxPDwxOQogICBhbHBoYQkyXjEzCQlvPDw0MAkJZT4+NDAJCTE8PDI0CTE8PDE4CiAgIG02OGsJCTJeMTIJCW88PDEyCQllPj4xMgkJMTw8MjAJMTw8MTkKICAgc3BhcmMJMl57MTIsMTN9CShvJjB4M2ZmZmYpPDw5CShlPj45KSYweDNmZmZmCTE8PDE4CTE8PHsxOSwxOH0KICAgc3BhcmM2NAkyXjEzCQlvPDwxMwkJZT4+MTMJCTE8PDUxCTE8PDE4CiAgIHBwYwkJMl4xMgkJbzw8OAkJZT4+OAkJMTw8MjQJMTw8MTkKICAgYXJtbwkJMl57MTMsMTQsMTV9CW88PDgJCWU+PjgJCTE8PDI0CTE8PHsxOCwxNywxNn0KICAgYXJtdgkJMl4xMgkJbzw8OQkJZT4+OQkJMTw8MjMJMTw8MTkKCiAgIGFzc3VtaW5nIHRoYXQgbG9uZ3MgaGF2ZSA2NCBiaXRzIG9uIGFscGhhIGFuZCBzcGFyYzY0IGFuZCAzMiBiaXRzIGVsc2V3aGVyZS4KCiAgIFRoZSBiYWQgcGFydCBpcyB0aGF0IHdlIG5lZWQgdG8ga25vdyB0aGlzIHNpbmNlIHRoZSBrZXJuZWwgd2lsbAogICByZWZ1c2UgYSBzd2FwIHNwYWNlIGlmIGl0IGlzIHRvbyBsYXJnZS4KKi8KLyogcGF0Y2ggZnJvbSBqaiAtIHdoeSBkb2VzIHRoaXMgZGlmZmVyIGZyb20gdGhlIGFib3ZlPyAqLwojaWYgZGVmaW5lZChfX2FscGhhX18pCiNkZWZpbmUgVjFfTUFYX1BBR0VTICAgICAgICAgICAoKDEgPDwgMjQpIC0gMSkKI2VsaWYgZGVmaW5lZChfX21pcHNfXykKI2RlZmluZSBWMV9NQVhfUEFHRVMgICAgICAgICAgICgoMSA8PCAxNykgLSAxKQojZWxpZiBkZWZpbmVkKF9fc3BhcmNfdjlfXykKI2RlZmluZSBWMV9NQVhfUEFHRVMgICAgICAgICAgICgoMyA8PCAyOSkgLSAxKQojZWxpZiBkZWZpbmVkKF9fc3BhcmNfXykKI2RlZmluZSBWMV9NQVhfUEFHRVMgICAgICAgICAgIChwYWdlc2l6ZSA9PSA4MTkyID8gKCgzIDw8IDI5KSAtIDEpIDogKCgxIDw8IDE4KSAtIDEpKQojZWxzZQojZGVmaW5lIFYxX01BWF9QQUdFUyAgICAgICAgICAgVjFfT0xEX01BWF9QQUdFUwojZW5kaWYKLyogbWFuIHBhZ2Ugbm93IHNheXM6ClRoZSBtYXhpbXVtIHVzZWZ1bCBzaXplIG9mIGEgc3dhcCBhcmVhIG5vdyBkZXBlbmRzIG9uIHRoZSBhcmNoaXRlY3R1cmUuCkl0IGlzIHJvdWdobHkgMkdCIG9uIGkzODYsIFBQQywgbTY4aywgQVJNLCAxR0Igb24gc3BhcmMsIDUxMk1CIG9uIG1pcHMsCjEyOEdCIG9uIGFscGhhIGFuZCAzVEIgb24gc3BhcmM2NC4KKi8KCiNkZWZpbmUgTUFYX0JBRFBBR0VTCSgocGFnZXNpemUtMTAyNC0xMjgqc2l6ZW9mKGludCktMTApL3NpemVvZihpbnQpKQoKc3RhdGljIHZvaWQgYml0X3NldCAodW5zaWduZWQgaW50ICphZGRyLCB1bnNpZ25lZCBpbnQgbnIpCnsKCXVuc2lnbmVkIGludCByLCBtOwoKCWFkZHIgKz0gbnIgLyAoOCAqIHNpemVvZihpbnQpKTsKCXIgPSAqYWRkcjsKCW0gPSAxIDw8IChuciAmICg4ICogc2l6ZW9mKGludCkgLSAxKSk7CgkqYWRkciA9IHIgfCBtOwp9CgpzdGF0aWMgaW50IGJpdF90ZXN0X2FuZF9jbGVhciAodW5zaWduZWQgaW50ICphZGRyLCB1bnNpZ25lZCBpbnQgbnIpCnsKCXVuc2lnbmVkIGludCByLCBtOwoKCWFkZHIgKz0gbnIgLyAoOCAqIHNpemVvZihpbnQpKTsKCXIgPSAqYWRkcjsKCW0gPSAxIDw8IChuciAmICg4ICogc2l6ZW9mKGludCkgLSAxKSk7CgkqYWRkciA9IHIgJiB+bTsKCXJldHVybiAociAmIG0pICE9IDA7Cn0KCgp2b2lkCmRpZShjb25zdCBjaGFyICpzdHIpIHsKCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzXG4iLCBwcm9ncmFtX25hbWUsIHN0cik7CglleGl0KCBGQUxTRSk7Cn0KCnZvaWQKcGFnZV9vayhpbnQgcGFnZSkgewoJaWYgKHZlcnNpb249PTApCgkJYml0X3NldChzaWduYXR1cmVfcGFnZSwgcGFnZSk7Cn0KCnZvaWQKcGFnZV9iYWQoaW50IHBhZ2UpIHsKCWlmICh2ZXJzaW9uID09IDApCgkJYml0X3Rlc3RfYW5kX2NsZWFyKHNpZ25hdHVyZV9wYWdlLCBwYWdlKTsKCWVsc2UgewoJCWlmIChiYWRwYWdlcyA9PSBNQVhfQkFEUEFHRVMpCgkJCWRpZSgidG9vIG1hbnkgYmFkIHBhZ2VzIik7CgkJcC0+YmFkcGFnZXNbYmFkcGFnZXNdID0gcGFnZTsKCX0KCWJhZHBhZ2VzKys7Cn0KCnZvaWQKY2hlY2tfYmxvY2tzKHZvaWQpIHsKCXVuc2lnbmVkIGludCBjdXJyZW50X3BhZ2U7CglpbnQgZG9fc2VlayA9IDE7CgljaGFyICpidWZmZXI7CgoJYnVmZmVyID0gbWFsbG9jKHBhZ2VzaXplKTsKCWlmICghYnVmZmVyKQoJCWRpZSgiT3V0IG9mIG1lbW9yeSIpOwoJY3VycmVudF9wYWdlID0gMDsKCXdoaWxlIChjdXJyZW50X3BhZ2UgPCBQQUdFUykgewoJCWlmICghY2hlY2spIHsKCQkJcGFnZV9vayhjdXJyZW50X3BhZ2UrKyk7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoZG9fc2VlayAmJiBsc2VlayhERVYsY3VycmVudF9wYWdlKnBhZ2VzaXplLFNFRUtfU0VUKSAhPQoJCSAgICBjdXJyZW50X3BhZ2UqcGFnZXNpemUpCgkJCWRpZSgic2VlayBmYWlsZWQgaW4gY2hlY2tfYmxvY2tzIik7CgkJaWYgKChkb19zZWVrID0gKHBhZ2VzaXplICE9IHJlYWQoREVWLCBidWZmZXIsIHBhZ2VzaXplKSkpKSB7CgkJCXBhZ2VfYmFkKGN1cnJlbnRfcGFnZSsrKTsKCQkJY29udGludWU7CgkJfQoJCXBhZ2Vfb2soY3VycmVudF9wYWdlKyspOwoJfQoJaWYgKGJhZHBhZ2VzID09IDEpCgkJcHJpbnRmKCJvbmUgYmFkIHBhZ2VcbiIpOwoJZWxzZSBpZiAoYmFkcGFnZXMgPiAxKQoJCXByaW50ZigiJWQgYmFkIHBhZ2VzXG4iLCBiYWRwYWdlcyk7Cn0KCnN0YXRpYyBsb25nIHZhbGlkX29mZnNldCAoaW50IGZkLCBpbnQgb2Zmc2V0KQp7CgljaGFyIGNoOwoKCWlmIChsc2VlayAoZmQsIG9mZnNldCwgMCkgPCAwKQoJCXJldHVybiAwOwoJaWYgKHJlYWQgKGZkLCAmY2gsIDEpIDwgMSkKCQlyZXR1cm4gMDsKCXJldHVybiAxOwp9CgpzdGF0aWMgaW50CmZpbmRfc2l6ZSAoaW50IGZkKQp7Cgl1bnNpZ25lZCBpbnQgaGlnaCwgbG93OwoKCWxvdyA9IDA7Cglmb3IgKGhpZ2ggPSAxOyBoaWdoID4gMCAmJiB2YWxpZF9vZmZzZXQgKGZkLCBoaWdoKTsgaGlnaCAqPSAyKQoJCWxvdyA9IGhpZ2g7Cgl3aGlsZSAobG93IDwgaGlnaCAtIDEpCgl7CgkJY29uc3QgaW50IG1pZCA9IChsb3cgKyBoaWdoKSAvIDI7CgoJCWlmICh2YWxpZF9vZmZzZXQgKGZkLCBtaWQpKQoJCQlsb3cgPSBtaWQ7CgkJZWxzZQoJCQloaWdoID0gbWlkOwoJfQoJcmV0dXJuIChsb3cgKyAxKTsKfQoKLyogcmV0dXJuIHNpemUgaW4gcGFnZXMsIHRvIGF2b2lkIGludGVnZXIgb3ZlcmZsb3cgKi8Kc3RhdGljIGxvbmcKZ2V0X3NpemUoY29uc3QgY2hhciAgKmZpbGUpCnsKCWludAlmZDsKCWxvbmcJc2l6ZTsKCglmZCA9IG9wZW4oZmlsZSwgT19SRE9OTFkpOwoJaWYgKGZkIDwgMCkgewoJCXBlcnJvcihmaWxlKTsKCQlleGl0KDEpOwoJfQoJaWYgKGlvY3RsKGZkLCBCTEtHRVRTSVpFLCAmc2l6ZSkgPj0gMCkgewoJCWludCBzZWN0b3JzX3Blcl9wYWdlID0gcGFnZXNpemUvNTEyOwoJCXNpemUgLz0gc2VjdG9yc19wZXJfcGFnZTsKCX0gZWxzZSB7CgkJc2l6ZSA9IGZpbmRfc2l6ZShmZCkgLyBwYWdlc2l6ZTsKCX0KCWNsb3NlKGZkKTsKCXJldHVybiBzaXplOwp9CgppbnQgbWtzd2FwX21haW4oaW50IGFyZ2MsIGNoYXIgKiogYXJndikKewoJY2hhciAqIHRtcDsKCXN0cnVjdCBzdGF0IHN0YXRidWY7CglpbnQgc3o7CglpbnQgbWF4cGFnZXM7CglpbnQgZ29vZHBhZ2VzOwoJaW50IG9mZnNldDsKCWludCBmb3JjZSA9IDA7CgoJaWYgKGFyZ2MgJiYgKmFyZ3YpCgkJcHJvZ3JhbV9uYW1lID0gKmFyZ3Y7CgoJaW5pdF9zaWduYXR1cmVfcGFnZSgpOwkvKiBnZXQgcGFnZXNpemUgKi8KCgl3aGlsZSAoYXJnYy0tID4gMSkgewoJCWFyZ3YrKzsKCQlpZiAoYXJndlswXVswXSAhPSAnLScpIHsKCQkJaWYgKGRldmljZV9uYW1lKSB7CgkJCQlpbnQgYmxvY2tzX3Blcl9wYWdlID0gcGFnZXNpemUvMTAyNDsKCQkJCVBBR0VTID0gc3RydG9sKGFyZ3ZbMF0sJnRtcCwwKS9ibG9ja3NfcGVyX3BhZ2U7CgkJCQlpZiAoKnRtcCkKCQkJCQl1c2FnZSggbWtzd2FwX3VzYWdlKTsKCQkJfSBlbHNlCgkJCQlkZXZpY2VfbmFtZSA9IGFyZ3ZbMF07CgkJfSBlbHNlIHsKCQkJc3dpdGNoIChhcmd2WzBdWzFdKSB7CgkJCQljYXNlICdjJzoKCQkJCQljaGVjaz0xOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAnZic6CgkJCQkJZm9yY2U9MTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ3YnOgoJCQkJCXZlcnNpb249YXRvaShhcmd2WzBdKzIpOwoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQl1c2FnZSggbWtzd2FwX3VzYWdlKTsKCQkJfQoJCX0KCX0KCWlmICghZGV2aWNlX25hbWUpIHsKCQlmcHJpbnRmKHN0ZGVyciwKCQkJIiVzOiBlcnJvcjogTm93aGVyZSB0byBzZXQgdXAgc3dhcCBvbj9cbiIsCgkJCXByb2dyYW1fbmFtZSk7CgkJdXNhZ2UoIG1rc3dhcF91c2FnZSk7Cgl9CglzeiA9IGdldF9zaXplKGRldmljZV9uYW1lKTsKCWlmICghUEFHRVMpIHsKCQlQQUdFUyA9IHN6OwoJfSBlbHNlIGlmIChQQUdFUyA+IHN6ICYmICFmb3JjZSkgewoJCWZwcmludGYoc3RkZXJyLAoJCQkiJXM6IGVycm9yOiAiCgkJCSAgInNpemUgJWxkIGlzIGxhcmdlciB0aGFuIGRldmljZSBzaXplICVkXG4iLAoJCQlwcm9ncmFtX25hbWUsCgkJCVBBR0VTKihwYWdlc2l6ZS8xMDI0KSwgc3oqKHBhZ2VzaXplLzEwMjQpKTsKCQlleGl0KCBGQUxTRSk7Cgl9CgoJaWYgKHZlcnNpb24gPT0gLTEpIHsKCQlpZiAoUEFHRVMgPD0gVjBfTUFYX1BBR0VTKQoJCQl2ZXJzaW9uID0gMDsKCQllbHNlIGlmIChsaW51eF92ZXJzaW9uX2NvZGUoKSA8IE1BS0VfVkVSU0lPTigyLDEsMTE3KSkKCQkJdmVyc2lvbiA9IDA7CgkJZWxzZSBpZiAocGFnZXNpemUgPCAyMDQ4KQoJCQl2ZXJzaW9uID0gMDsKCQllbHNlCgkJCXZlcnNpb24gPSAxOwoJfQoJaWYgKHZlcnNpb24gIT0gMCAmJiB2ZXJzaW9uICE9IDEpIHsKCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBlcnJvcjogdW5rbm93biB2ZXJzaW9uICVkXG4iLAoJCQlwcm9ncmFtX25hbWUsIHZlcnNpb24pOwoJCXVzYWdlKCBta3N3YXBfdXNhZ2UpOwoJfQoJaWYgKFBBR0VTIDwgMTApIHsKCQlmcHJpbnRmKHN0ZGVyciwKCQkJIiVzOiBlcnJvcjogc3dhcCBhcmVhIG5lZWRzIHRvIGJlIGF0IGxlYXN0ICVsZGtCXG4iLAoJCQlwcm9ncmFtX25hbWUsIChsb25nKSgxMCAqIHBhZ2VzaXplIC8gMTAyNCkpOwoJCXVzYWdlKCBta3N3YXBfdXNhZ2UpOwoJfQojaWYgMAoJbWF4cGFnZXMgPSAoKHZlcnNpb24gPT0gMCkgPyBWMF9NQVhfUEFHRVMgOiBWMV9NQVhfUEFHRVMpOwojZWxzZQoJaWYgKCF2ZXJzaW9uKQoJCW1heHBhZ2VzID0gVjBfTUFYX1BBR0VTOwoJZWxzZSBpZiAobGludXhfdmVyc2lvbl9jb2RlKCkgPj0gTUFLRV9WRVJTSU9OKDIsMiwxKSkKCQltYXhwYWdlcyA9IFYxX01BWF9QQUdFUzsKCWVsc2UgewoJCW1heHBhZ2VzID0gVjFfT0xEX01BWF9QQUdFUzsKCQlpZiAobWF4cGFnZXMgPiBWMV9NQVhfUEFHRVMpCgkJCW1heHBhZ2VzID0gVjFfTUFYX1BBR0VTOwoJfQojZW5kaWYKCWlmIChQQUdFUyA+IG1heHBhZ2VzKSB7CgkJUEFHRVMgPSBtYXhwYWdlczsKCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiB3YXJuaW5nOiB0cnVuY2F0aW5nIHN3YXAgYXJlYSB0byAlbGRrQlxuIiwKCQkJcHJvZ3JhbV9uYW1lLCBQQUdFUyAqIHBhZ2VzaXplIC8gMTAyNCk7Cgl9CgoJREVWID0gb3BlbihkZXZpY2VfbmFtZSxPX1JEV1IpOwoJaWYgKERFViA8IDAgfHwgZnN0YXQoREVWLCAmc3RhdGJ1ZikgPCAwKSB7CgkJcGVycm9yKGRldmljZV9uYW1lKTsKCQlleGl0KCBGQUxTRSk7Cgl9CglpZiAoIVNfSVNCTEsoc3RhdGJ1Zi5zdF9tb2RlKSkKCQljaGVjaz0wOwoJZWxzZSBpZiAoc3RhdGJ1Zi5zdF9yZGV2ID09IDB4MDMwMCB8fCBzdGF0YnVmLnN0X3JkZXYgPT0gMHgwMzQwKQoJCWRpZSgiV2lsbCBub3QgdHJ5IHRvIG1ha2Ugc3dhcGRldmljZSBvbiAnJXMnIik7CgojaWZkZWYgX19zcGFyY19fCglpZiAoIWZvcmNlICYmIHZlcnNpb24gPT0gMCkgewoJCS8qIERvbid0IG92ZXJ3cml0ZSBwYXJ0aXRpb24gdGFibGUgdW5sZXNzIGZvcmNlZCAqLwoJCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopc2lnbmF0dXJlX3BhZ2U7CgkJdW5zaWduZWQgc2hvcnQgKnEsIHN1bTsKCgkJaWYgKHJlYWQoREVWLCBidWZmZXIsIDUxMikgIT0gNTEyKQoJCQlkaWUoImZhdGFsOiBmaXJzdCBwYWdlIHVucmVhZGFibGUiKTsKCQlpZiAoYnVmZmVyWzUwOF0gPT0gMHhEQSAmJiBidWZmZXJbNTA5XSA9PSAweEJFKSB7CgkJCXEgPSAodW5zaWduZWQgc2hvcnQgKikoYnVmZmVyICsgNTEwKTsKCQkJZm9yIChzdW0gPSAwOyBxID49ICh1bnNpZ25lZCBzaG9ydCAqKSBidWZmZXI7KQoJCQkJc3VtIF49ICpxLS07CgkJCWlmICghc3VtKSB7CgkJCQlmcHJpbnRmKHN0ZGVyciwgIlwKJXM6IERldmljZSAnJXMnIGNvbnRhaW5zIGEgdmFsaWQgU3VuIGRpc2tsYWJlbC5cblwKVGhpcyBwcm9iYWJseSBtZWFucyBjcmVhdGluZyB2MCBzd2FwIHdvdWxkIGRlc3Ryb3kgeW91ciBwYXJ0aXRpb24gdGFibGVcblwKTm8gc3dhcCBjcmVhdGVkLiBJZiB5b3UgcmVhbGx5IHdhbnQgdG8gY3JlYXRlIHN3YXAgdjAgb24gdGhhdCBkZXZpY2UsIHVzZVxuXAp0aGUgLWYgb3B0aW9uIHRvIGZvcmNlIGl0LlxuIiwKCQkJCQlwcm9ncmFtX25hbWUsIGRldmljZV9uYW1lKTsKCQkJCWV4aXQoIEZBTFNFKTsKCQkJfQoJCX0KCX0KI2VuZGlmCgoJaWYgKHZlcnNpb24gPT0gMCB8fCBjaGVjaykKCQljaGVja19ibG9ja3MoKTsKCWlmICh2ZXJzaW9uID09IDAgJiYgIWJpdF90ZXN0X2FuZF9jbGVhcihzaWduYXR1cmVfcGFnZSwwKSkKCQlkaWUoImZhdGFsOiBmaXJzdCBwYWdlIHVucmVhZGFibGUiKTsKCWlmICh2ZXJzaW9uID09IDEpIHsKCQlwLT52ZXJzaW9uID0gdmVyc2lvbjsKCQlwLT5sYXN0X3BhZ2UgPSBQQUdFUy0xOwoJCXAtPm5yX2JhZHBhZ2VzID0gYmFkcGFnZXM7Cgl9CgoJZ29vZHBhZ2VzID0gUEFHRVMgLSBiYWRwYWdlcyAtIDE7CglpZiAoZ29vZHBhZ2VzIDw9IDApCgkJZGllKCJVbmFibGUgdG8gc2V0IHVwIHN3YXAtc3BhY2U6IHVucmVhZGFibGUiKTsKCXByaW50ZigiU2V0dGluZyB1cCBzd2Fwc3BhY2UgdmVyc2lvbiAlZCwgc2l6ZSA9ICVsZCBieXRlc1xuIiwKCQl2ZXJzaW9uLCAobG9uZykoZ29vZHBhZ2VzKnBhZ2VzaXplKSk7Cgl3cml0ZV9zaWduYXR1cmUoKHZlcnNpb24gPT0gMCkgPyAiU1dBUC1TUEFDRSIgOiAiU1dBUFNQQUNFMiIpOwoKCW9mZnNldCA9ICgodmVyc2lvbiA9PSAwKSA/IDAgOiAxMDI0KTsKCWlmIChsc2VlayhERVYsIG9mZnNldCwgU0VFS19TRVQpICE9IG9mZnNldCkKCQlkaWUoInVuYWJsZSB0byByZXdpbmQgc3dhcC1kZXZpY2UiKTsKCWlmICh3cml0ZShERVYsKGNoYXIqKXNpZ25hdHVyZV9wYWdlK29mZnNldCwgcGFnZXNpemUtb2Zmc2V0KQoJICAgICE9IHBhZ2VzaXplLW9mZnNldCkKCQlkaWUoInVuYWJsZSB0byB3cml0ZSBzaWduYXR1cmUgcGFnZSIpOwoKCS8qCgkgKiBBIHN1YnNlcXVlbnQgc3dhcG9uKCkgd2lsbCBmYWlsIGlmIHRoZSBzaWduYXR1cmUKCSAqIGlzIG5vdCBhY3R1YWxseSBvbiBkaXNrLiAoVGhpcyBpcyBhIGtlcm5lbCBidWcuKQoJICovCglpZiAoZnN5bmMoREVWKSkKCQkgZGllKCJmc3luYyBmYWlsZWQiKTsKCWV4aXQgKCBUUlVFKTsKfQo=