Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qCiAqIGZzY2suYyAtIGEgZmlsZSBzeXN0ZW0gY29uc2lzdGVuY3kgY2hlY2tlciBmb3IgTGludXguCiAqCiAqIChDKSAxOTkxLCAxOTkyIExpbnVzIFRvcnZhbGRzLiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQKICogYXMgcGVyIHRoZSBHTlUgY29weWxlZnQuCiAqLwoKLyoKICogMDkuMTEuOTEgIC0gIG1hZGUgdGhlIGZpcnN0IHJ1ZGltZXRhcnkgZnVuY3Rpb25zCiAqCiAqIDEwLjExLjkxICAtICB1cGRhdGVkLCBkb2VzIGNoZWNraW5nLCBubyByZXBhaXJzIHlldC4KICoJCVNlbnQgb3V0IHRvIHRoZSBtYWlsaW5nLWxpc3QgZm9yIHRlc3RpbmcuCiAqCiAqIDE0LjExLjkxICAtCVRlc3Rpbmcgc2VlbXMgdG8gaGF2ZSBnb25lIHdlbGwuIEFkZGVkIHNvbWUKICoJCWNvcnJlY3Rpb24tY29kZSwgYW5kIGNoYW5nZWQgc29tZSBmdW5jdGlvbnMuCiAqCiAqIDE1LjExLjkxICAtICBNb3JlIGNvcnJlY3Rpb24gY29kZS4gSG9wZWZ1bGx5IGl0IG5vdGljZXMgbW9zdAogKgkJY2FzZXMgbm93LCBhbmQgdHJpZXMgdG8gZG8gc29tZXRoaW5nIGFib3V0IHRoZW0uCiAqCiAqIDE2LjExLjkxICAtICBNb3JlIGNvcnJlY3Rpb25zICh0aGFua3MgdG8gTWlrYSBKYWxhdmEpLiBNb3N0CiAqCQl0aGluZ3Mgc2VlbSB0byB3b3JrIG5vdy4gWWVhaCwgc3VyZS4KICoKICoKICogMTkuMDQuOTIgIC0JSGFkIHRvIHN0YXJ0IG92ZXIgYWdhaW4gZnJvbSB0aGlzIG9sZCB2ZXJzaW9uLCBhcyBhCiAqCQlrZXJuZWwgYnVnIGF0ZSBteSBlbmhhbmNlZCBmc2NrIGluIGZlYnJ1YXJ5LgogKgogKiAyOC4wMi45MyAgLQlhZGRlZCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgZGlyZWN0b3J5IGVudHJ5IHNpemVzLi4KICoKICogU2F0IE1hciAgNiAxODo1OTo0MiAxOTkzLCBmYWl0aEBjcy51bmMuZWR1OiBPdXRwdXQgbmFtZWxlbiB3aXRoCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXItYmxvY2sgaW5mb3JtYXRpb24KICoKICogU2F0IE9jdCAgOSAxMToxNzoxMSAxOTkzLCBmYWl0aEBjcy51bmMuZWR1OiBtYWtlIGV4aXQgc3RhdHVzIGNvbmZvcm0KICogICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGF0IHJlcXVpcmVkIGJ5IGZzdXRpbAogKgogKiBNb24gSmFuICAzIDExOjA2OjUyIDE5OTQgLSBEci4gV2V0dHN0ZWluIChncmVnJXdpbmQudXVjcEBwbGFpbnMubm9kYWsuZWR1KQogKgkJCSAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGZpbGUgc3lzdGVtIHZhbGlkIGZsYWcuICBBbHNvCiAqCQkJICAgICAgYWRkZWQgcHJvZ3JhbV92ZXJzaW9uIHZhcmlhYmxlIGFuZCBvdXRwdXQgb2YKICoJCQkgICAgICBwcm9ncmFtIG5hbWUgYW5kIHZlcnNpb24gbnVtYmVyIHdoZW4gcHJvZ3JhbQogKgkJCSAgICAgIGlzIGV4ZWN1dGVkLgogKgogKiAzMC4xMC45NCAtIGFkZGVkIHN1cHBvcnQgZm9yIHYyIGZpbGVzeXN0ZW0KICogICAgICAgICAgICAoQW5kcmVhcyBTY2h3YWIsIHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZSkKICoKICogMTAuMTIuOTQgIC0gIGFkZGVkIHRlc3QgdG8gcHJldmVudCBjaGVja2luZyBvZiBtb3VudGVkIGZzIGFkYXB0ZWQKICogICAgICAgICAgICAgIGZyb20gVGhlb2RvcmUgVHMnbydzICh0eXRzb0BhdGhlbmEubWl0LmVkdSkgZTJmc2NrCiAqICAgICAgICAgICAgICBwcm9ncmFtLiAgKERhbmllbCBRdWlubGFuLCBxdWlubGFuQHlnZ2RyYXNpbC5jb20pCiAqCiAqIDAxLjA3Ljk2ICAtIEZpeGVkIHRoZSB2MiBmcyBzdHVmZiB0byB1c2UgdGhlIHJpZ2h0ICNkZWZpbmVzIGFuZCBzdWNoCiAqCSAgICAgICBmb3IgbW9kZXJuIGxpYmNzIChqYW5sQG1hdGgudWlvLm5vLCBOaWNvbGFpIExhbmdmZWxkdCkKICoKICogMDIuMDcuOTYgIC0gQWRkZWQgQyBiaXQgZmlkZGxpbmcgcm91dGluZXMgZnJvbSBybWtAZWNzLnNvdG9uLmFjLnVrIAogKiAgICAgICAgICAgICAoUnVzc2VsbCBLaW5nKS4gIEhlIG1hZGUgdGhlbSBmb3IgQVJNLiAgSXQgd291bGQgc2VlbQogKgkgICAgICAgdGhhdCB0aGUgQVJNIGlzIHBvd2VyZnVsIGVub3VnaCB0byBkbyB0aGlzIGluIEMgd2hlcmVhcwogKiAgICAgICAgICAgICBpMzg2IGFuZCBtNjRrIG11c3QgdXNlIGFzc2VtYmx5IHRvIGdldCBpdCBmYXN0ID46LSkKICoJICAgICAgIFRoaXMgc2hvdWxkIG1ha2UgbWluaXggZnNjayBzeXN0ZW1pbmRlcGVuZGVudC4KICoJICAgICAgIChqYW5sQG1hdGgudWlvLm5vLCBOaWNvbGFpIExhbmdmZWxkdCkKICoKICogMDQuMTEuOTYgIC0gQWRkZWQgbWlub3IgZml4ZXMgZnJvbSBBbmRyZWFzIFNjaHdhYiB0byBhdm9pZCBjb21waWxlcgogKiAgICAgICAgICAgICB3YXJuaW5ncy4gIEFkZGVkIG1jNjhrIGJpdG9wcyBmcm9tIAogKgkgICAgICAgSm9lcmcgRG9yY2hhaW4gPGRvcmNoYWluQG1waS1zYi5tcGcuZGU+LgogKgogKiAwNi4xMS45NiAgLSBBZGRlZCB2MiBjb2RlIHN1Ym1pdHRlZCBieSBKb2VyZyBEb3JjaGFpbiwgYnV0IHdyaXR0ZW4gYnkKICogICAgICAgICAgICAgQW5kcmVhcyBTY2h3YWIuCiAqCiAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BtaXNpZWsuZXUub3JnPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqCiAqIEkndmUgaGFkIG5vIHRpbWUgdG8gYWRkIGNvbW1lbnRzIC0gaG9wZWZ1bGx5IHRoZSBmdW5jdGlvbiBuYW1lcwogKiBhcmUgY29tbWVudHMgZW5vdWdoLiBBcyB3aXRoIGFsbCBmaWxlIHN5c3RlbSBjaGVja2VycywgdGhpcyBhc3N1bWVzCiAqIHRoZSBmaWxlIHN5c3RlbSBpcyBxdWllc2NlbnQgLSBkb24ndCB1c2UgaXQgb24gYSBtb3VudGVkIGRldmljZQogKiB1bmxlc3MgeW91IGNhbiBiZSBzdXJlIG5vYm9keSBpcyB3cml0aW5nIHRvIGl0IChhbmQgcmVtZW1iZXIgdGhhdCB0aGUKICoga2VybmVsIGNhbiB3cml0ZSB0byBpdCB3aGVuIGl0IHNlYXJjaGVzIGZvciBmaWxlcykuCiAqCiAqIFVzdWFnZTogZnNjayBbLWxhcnZzbV0gZGV2aWNlCiAqCS1sIGZvciBhIGxpc3Rpbmcgb2YgYWxsIHRoZSBmaWxlbmFtZXMKICoJLWEgZm9yIGF1dG9tYXRpYyByZXBhaXJzIChub3QgaW1wbGVtZW50ZWQpCiAqCS1yIGZvciByZXBhaXJzIChpbnRlcmFjdGl2ZSkgKG5vdCBpbXBsZW1lbnRlZCkKICoJLXYgZm9yIHZlcmJvc2UgKHRlbGxzIGhvdyBtYW55IGZpbGVzKQogKgktcyBmb3Igc3VwZXItYmxvY2sgaW5mbwogKgktbSBmb3IgbWluaXgtbGlrZSAibW9kZSBub3QgY2xlYXJlZCIgd2FybmluZ3MKICoJLWYgZm9yY2UgZmlsZXN5c3RlbSBjaGVjayBldmVuIGlmIGZpbGVzeXN0ZW0gbWFya2VkIGFzIHZhbGlkCiAqCiAqIFRoZSBkZXZpY2UgbWF5IGJlIGEgYmxvY2sgZGV2aWNlIG9yIGEgaW1hZ2Ugb2Ygb25lLCBidXQgdGhpcyBpc24ndAogKiBlbmZvcmNlZCAoYnV0IGl0J3Mgbm90IG11Y2ggZnVuIG9uIGEgY2hhcmFjdGVyIGRldmljZSA6LSkuIAogKi8KCiNpbmNsdWRlICJpbnRlcm5hbC5oIgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHRlcm1pb3MuaD4KI2luY2x1ZGUgPG1udGVudC5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgoKIAogdHlwZWRlZiB1bnNpZ25lZCBjaGFyIHU4Owp0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHUxNjsKdHlwZWRlZiB1bnNpZ25lZCBpbnQgdTMyOwoKCiNkZWZpbmUgTUlOSVhfUk9PVF9JTk8gMQojZGVmaW5lIE1JTklYX0xJTktfTUFYCTI1MAojZGVmaW5lIE1JTklYMl9MSU5LX01BWAk2NTUzMAoKI2RlZmluZSBNSU5JWF9JX01BUF9TTE9UUwk4CiNkZWZpbmUgTUlOSVhfWl9NQVBfU0xPVFMJNjQKI2RlZmluZSBNSU5JWF9TVVBFUl9NQUdJQwkweDEzN0YJCS8qIG9yaWdpbmFsIG1pbml4IGZzICovCiNkZWZpbmUgTUlOSVhfU1VQRVJfTUFHSUMyCTB4MTM4RgkJLyogbWluaXggZnMsIDMwIGNoYXIgbmFtZXMgKi8KI2RlZmluZSBNSU5JWDJfU1VQRVJfTUFHSUMJMHgyNDY4CQkvKiBtaW5peCBWMiBmcyAqLwojZGVmaW5lIE1JTklYMl9TVVBFUl9NQUdJQzIJMHgyNDc4CQkvKiBtaW5peCBWMiBmcywgMzAgY2hhciBuYW1lcyAqLwojZGVmaW5lIE1JTklYX1ZBTElEX0ZTCQkweDAwMDEJCS8qIENsZWFuIGZzLiAqLwojZGVmaW5lIE1JTklYX0VSUk9SX0ZTCQkweDAwMDIJCS8qIGZzIGhhcyBlcnJvcnMuICovCgojZGVmaW5lIE1JTklYX0lOT0RFU19QRVJfQkxPQ0sgKChCTE9DS19TSVpFKS8oc2l6ZW9mIChzdHJ1Y3QgbWluaXhfaW5vZGUpKSkKI2RlZmluZSBNSU5JWDJfSU5PREVTX1BFUl9CTE9DSyAoKEJMT0NLX1NJWkUpLyhzaXplb2YgKHN0cnVjdCBtaW5peDJfaW5vZGUpKSkKCiNkZWZpbmUgTUlOSVhfVjEJCTB4MDAwMQkJLyogb3JpZ2luYWwgbWluaXggZnMgKi8KI2RlZmluZSBNSU5JWF9WMgkJMHgwMDAyCQkvKiBtaW5peCBWMiBmcyAqLwoKI2RlZmluZSBJTk9ERV9WRVJTSU9OKGlub2RlKQlpbm9kZS0+aV9zYi0+dS5taW5peF9zYi5zX3ZlcnNpb24KCi8qCiAqIFRoaXMgaXMgdGhlIG9yaWdpbmFsIG1pbml4IGlub2RlIGxheW91dCBvbiBkaXNrLgogKiBOb3RlIHRoZSA4LWJpdCBnaWQgYW5kIGF0aW1lIGFuZCBjdGltZS4KICovCnN0cnVjdCBtaW5peF9pbm9kZSB7Cgl1MTYgaV9tb2RlOwoJdTE2IGlfdWlkOwoJdTMyIGlfc2l6ZTsKCXUzMiBpX3RpbWU7Cgl1OCAgaV9naWQ7Cgl1OCAgaV9ubGlua3M7Cgl1MTYgaV96b25lWzldOwp9OwoKLyoKICogVGhlIG5ldyBtaW5peCBpbm9kZSBoYXMgYWxsIHRoZSB0aW1lIGVudHJpZXMsIGFzIHdlbGwgYXMKICogbG9uZyBibG9jayBudW1iZXJzIGFuZCBhIHRoaXJkIGluZGlyZWN0IGJsb2NrICg3KzErMSsxCiAqIGluc3RlYWQgb2YgNysxKzEpLiBBbHNvLCBzb21lIHByZXZpb3VzbHkgOC1iaXQgdmFsdWVzIGFyZQogKiBub3cgMTYtYml0LiBUaGUgaW5vZGUgaXMgbm93IDY0IGJ5dGVzIGluc3RlYWQgb2YgMzIuCiAqLwpzdHJ1Y3QgbWluaXgyX2lub2RlIHsKCXUxNiBpX21vZGU7Cgl1MTYgaV9ubGlua3M7Cgl1MTYgaV91aWQ7Cgl1MTYgaV9naWQ7Cgl1MzIgaV9zaXplOwoJdTMyIGlfYXRpbWU7Cgl1MzIgaV9tdGltZTsKCXUzMiBpX2N0aW1lOwoJdTMyIGlfem9uZVsxMF07Cn07CgovKgogKiBtaW5peCBzdXBlci1ibG9jayBkYXRhIG9uIGRpc2sKICovCnN0cnVjdCBtaW5peF9zdXBlcl9ibG9jayB7Cgl1MTYgc19uaW5vZGVzOwoJdTE2IHNfbnpvbmVzOwoJdTE2IHNfaW1hcF9ibG9ja3M7Cgl1MTYgc196bWFwX2Jsb2NrczsKCXUxNiBzX2ZpcnN0ZGF0YXpvbmU7Cgl1MTYgc19sb2dfem9uZV9zaXplOwoJdTMyIHNfbWF4X3NpemU7Cgl1MTYgc19tYWdpYzsKCXUxNiBzX3N0YXRlOwoJdTMyIHNfem9uZXM7Cn07CgpzdHJ1Y3QgbWluaXhfZGlyX2VudHJ5IHsKCXUxNiBpbm9kZTsKCWNoYXIgbmFtZVswXTsKfTsKCiNkZWZpbmUgQkxPQ0tfU0laRV9CSVRTIDEwCiNkZWZpbmUgQkxPQ0tfU0laRSAoMTw8QkxPQ0tfU0laRV9CSVRTKQoKI2RlZmluZSBOQU1FX01BWCAgICAgICAgIDI1NSAgIC8qICMgY2hhcnMgaW4gYSBmaWxlIG5hbWUgKi8KCiNkZWZpbmUgTUlOSVhfSU5PREVTX1BFUl9CTE9DSyAoKEJMT0NLX1NJWkUpLyhzaXplb2YgKHN0cnVjdCBtaW5peF9pbm9kZSkpKQoKI2RlZmluZSBNSU5JWF9WQUxJRF9GUyAgICAgICAgICAgICAgIDB4MDAwMSAgICAgICAgICAvKiBDbGVhbiBmcy4gKi8KI2RlZmluZSBNSU5JWF9FUlJPUl9GUyAgICAgICAgICAgICAgIDB4MDAwMiAgICAgICAgICAvKiBmcyBoYXMgZXJyb3JzLiAqLwoKI2RlZmluZSBNSU5JWF9TVVBFUl9NQUdJQyAgICAweDEzN0YgICAgICAgICAgLyogb3JpZ2luYWwgbWluaXggZnMgKi8KI2RlZmluZSBNSU5JWF9TVVBFUl9NQUdJQzIgICAweDEzOEYgICAgICAgICAgLyogbWluaXggZnMsIDMwIGNoYXIgbmFtZXMgKi8KCiNpZm5kZWYgQkxLR0VUU0laRQojZGVmaW5lIEJMS0dFVFNJWkUgX0lPKDB4MTIsOTYpICAgIC8qIHJldHVybiBkZXZpY2Ugc2l6ZSAqLwojZW5kaWYKCiNpZmRlZiBNSU5JWDJfU1VQRVJfTUFHSUMyCiNkZWZpbmUgSEFWRV9NSU5JWDIgMQojZW5kaWYKCiNpZm5kZWYgX19saW51eF9fCiNkZWZpbmUgdm9sYXRpbGUKI2VuZGlmCgojZGVmaW5lIFJPT1RfSU5PIDEKCiNkZWZpbmUgVVBQRVIoc2l6ZSxuKSAoKHNpemUrKChuKS0xKSkvKG4pKQojZGVmaW5lIElOT0RFX1NJWkUgKHNpemVvZihzdHJ1Y3QgbWluaXhfaW5vZGUpKQojaWZkZWYgSEFWRV9NSU5JWDIKI2RlZmluZSBJTk9ERV9TSVpFMiAoc2l6ZW9mKHN0cnVjdCBtaW5peDJfaW5vZGUpKQojZGVmaW5lIElOT0RFX0JMT0NLUyBVUFBFUihJTk9ERVMsICh2ZXJzaW9uMiA/IE1JTklYMl9JTk9ERVNfUEVSX0JMT0NLIFwKCQkJCSAgICA6IE1JTklYX0lOT0RFU19QRVJfQkxPQ0spKQojZWxzZQojZGVmaW5lIElOT0RFX0JMT0NLUyBVUFBFUihJTk9ERVMsIChNSU5JWF9JTk9ERVNfUEVSX0JMT0NLKSkKI2VuZGlmCiNkZWZpbmUgSU5PREVfQlVGRkVSX1NJWkUgKElOT0RFX0JMT0NLUyAqIEJMT0NLX1NJWkUpCgojZGVmaW5lIEJJVFNfUEVSX0JMT0NLIChCTE9DS19TSVpFPDwzKQoKc3RhdGljIGNoYXIgKnByb2dyYW1fbmFtZSA9ICJmc2NrLm1pbml4IjsKc3RhdGljIGNoYXIgKnByb2dyYW1fdmVyc2lvbiA9ICIxLjIgLSAxMS8xMS85NiI7CnN0YXRpYyBjaGFyICpkZXZpY2VfbmFtZSA9IE5VTEw7CnN0YXRpYyBpbnQgSU47CnN0YXRpYyBpbnQgcmVwYWlyID0gMCwgYXV0b21hdGljID0gMCwgdmVyYm9zZSA9IDAsIGxpc3QgPSAwLCBzaG93ID0KCTAsIHdhcm5fbW9kZSA9IDAsIGZvcmNlID0gMDsKc3RhdGljIGludCBkaXJlY3RvcnkgPSAwLCByZWd1bGFyID0gMCwgYmxvY2tkZXYgPSAwLCBjaGFyZGV2ID0gMCwgbGlua3MgPQoJMCwgc3ltbGlua3MgPSAwLCB0b3RhbCA9IDA7CgpzdGF0aWMgaW50IGNoYW5nZWQgPSAwOwkJCS8qIGZsYWdzIGlmIHRoZSBmaWxlc3lzdGVtIGhhcyBiZWVuIGNoYW5nZWQgKi8Kc3RhdGljIGludCBlcnJvcnNfdW5jb3JyZWN0ZWQgPSAwOwkvKiBmbGFnIGlmIHNvbWUgZXJyb3Igd2FzIG5vdCBjb3JyZWN0ZWQgKi8Kc3RhdGljIGludCBkaXJzaXplID0gMTY7CnN0YXRpYyBpbnQgbmFtZWxlbiA9IDE0OwpzdGF0aWMgaW50IHZlcnNpb24yID0gMDsKc3RhdGljIHN0cnVjdCB0ZXJtaW9zIHRlcm1pb3M7CnN0YXRpYyBpbnQgdGVybWlvc19zZXQgPSAwOwoKLyogRmlsZS1uYW1lIGRhdGEgKi8KI2RlZmluZSBNQVhfREVQVEggMzIKc3RhdGljIGludCBuYW1lX2RlcHRoID0gMDsKLy8gc3RhdGljIGNoYXIgbmFtZV9saXN0W01BWF9ERVBUSF1bQlVGU0laICsgMV07CnN0YXRpYyBjaGFyICoqbmFtZV9saXN0ID0gTlVMTDsKCnN0YXRpYyBjaGFyICppbm9kZV9idWZmZXIgPSBOVUxMOwoKI2RlZmluZSBJbm9kZSAoKChzdHJ1Y3QgbWluaXhfaW5vZGUgKikgaW5vZGVfYnVmZmVyKS0xKQojZGVmaW5lIElub2RlMiAoKChzdHJ1Y3QgbWluaXgyX2lub2RlICopIGlub2RlX2J1ZmZlciktMSkKc3RhdGljIGNoYXIgc3VwZXJfYmxvY2tfYnVmZmVyW0JMT0NLX1NJWkVdOwoKI2RlZmluZSBTdXBlciAoKihzdHJ1Y3QgbWluaXhfc3VwZXJfYmxvY2sgKilzdXBlcl9ibG9ja19idWZmZXIpCiNkZWZpbmUgSU5PREVTICgodW5zaWduZWQgbG9uZylTdXBlci5zX25pbm9kZXMpCiNpZmRlZiBIQVZFX01JTklYMgojZGVmaW5lIFpPTkVTICgodW5zaWduZWQgbG9uZykodmVyc2lvbjIgPyBTdXBlci5zX3pvbmVzIDogU3VwZXIuc19uem9uZXMpKQojZWxzZQojZGVmaW5lIFpPTkVTICgodW5zaWduZWQgbG9uZykoU3VwZXIuc19uem9uZXMpKQojZW5kaWYKI2RlZmluZSBJTUFQUyAoKHVuc2lnbmVkIGxvbmcpU3VwZXIuc19pbWFwX2Jsb2NrcykKI2RlZmluZSBaTUFQUyAoKHVuc2lnbmVkIGxvbmcpU3VwZXIuc196bWFwX2Jsb2NrcykKI2RlZmluZSBGSVJTVFpPTkUgKCh1bnNpZ25lZCBsb25nKVN1cGVyLnNfZmlyc3RkYXRhem9uZSkKI2RlZmluZSBaT05FU0laRSAoKHVuc2lnbmVkIGxvbmcpU3VwZXIuc19sb2dfem9uZV9zaXplKQojZGVmaW5lIE1BWFNJWkUgKCh1bnNpZ25lZCBsb25nKVN1cGVyLnNfbWF4X3NpemUpCiNkZWZpbmUgTUFHSUMgKFN1cGVyLnNfbWFnaWMpCiNkZWZpbmUgTk9STV9GSVJTVFpPTkUgKDIrSU1BUFMrWk1BUFMrSU5PREVfQkxPQ0tTKQoKc3RhdGljIGNoYXIgKmlub2RlX21hcDsKc3RhdGljIGNoYXIgKnpvbmVfbWFwOwoKc3RhdGljIHVuc2lnbmVkIGNoYXIgKmlub2RlX2NvdW50ID0gTlVMTDsKc3RhdGljIHVuc2lnbmVkIGNoYXIgKnpvbmVfY291bnQgPSBOVUxMOwoKc3RhdGljIHZvaWQgcmVjdXJzaXZlX2NoZWNrKHVuc2lnbmVkIGludCBpbm8pOwpzdGF0aWMgdm9pZCByZWN1cnNpdmVfY2hlY2syKHVuc2lnbmVkIGludCBpbm8pOwoKI2RlZmluZSBpbm9kZV9pbl91c2UoeCkgKGlzc2V0KGlub2RlX21hcCwoeCkpKQojZGVmaW5lIHpvbmVfaW5fdXNlKHgpIChpc3NldCh6b25lX21hcCwoeCktRklSU1RaT05FKzEpKQoKI2RlZmluZSBtYXJrX2lub2RlKHgpIChzZXRiaXQoaW5vZGVfbWFwLCh4KSksY2hhbmdlZD0xKQojZGVmaW5lIHVubWFya19pbm9kZSh4KSAoY2xyYml0KGlub2RlX21hcCwoeCkpLGNoYW5nZWQ9MSkKCiNkZWZpbmUgbWFya196b25lKHgpIChzZXRiaXQoem9uZV9tYXAsKHgpLUZJUlNUWk9ORSsxKSxjaGFuZ2VkPTEpCiNkZWZpbmUgdW5tYXJrX3pvbmUoeCkgKGNscmJpdCh6b25lX21hcCwoeCktRklSU1RaT05FKzEpLGNoYW5nZWQ9MSkKCnN0YXRpYyB2b2lkIGxlYXZlKGludCkgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuKSk7CnN0YXRpYyB2b2lkIGxlYXZlKGludCBzdGF0dXMpCnsKCWlmICh0ZXJtaW9zX3NldCkKCQl0Y3NldGF0dHIoMCwgVENTQU5PVywgJnRlcm1pb3MpOwoJZXhpdChzdGF0dXMpOwp9CgpzdGF0aWMgdm9pZCBzaG93X3VzYWdlKHZvaWQpCnsKCWZwcmludGYoc3RkZXJyLCAiQnVzeUJveCB2JXMgKCVzKSBtdWx0aS1jYWxsIGJpbmFyeSAtLSBHUEwyXG5cbiIsCgkJCUJCX1ZFUiwgQkJfQlQpOwoJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgWy1sYXJ2c21mXSAvZGV2L25hbWVcbiIsIHByb2dyYW1fbmFtZSk7CiNpZm5kZWYgQkJfRkVBVFVSRV9UUklWSUFMX0hFTFAKCWZwcmludGYoc3RkZXJyLAoJCQkiXG5QZXJmb3JtcyBhIGNvbnNpc3RlbmN5IGNoZWNrIGZvciBNSU5JWCBmaWxlc3lzdGVtcy5cblxuIik7CglmcHJpbnRmKHN0ZGVyciwgIk9wdGlvbnM6XG4iKTsKCWZwcmludGYoc3RkZXJyLCAiXHQtbFx0TGlzdHMgYWxsIGZpbGVuYW1lc1xuIik7CglmcHJpbnRmKHN0ZGVyciwgIlx0LXJcdFBlcmZvcm0gaW50ZXJhY3RpdmUgcmVwYWlyc1xuIik7CglmcHJpbnRmKHN0ZGVyciwgIlx0LWFcdFBlcmZvcm0gYXV0b21hdGljIHJlcGFpcnNcbiIpOwoJZnByaW50ZihzdGRlcnIsICJcdC12XHR2ZXJib3NlXG4iKTsKCWZwcmludGYoc3RkZXJyLCAiXHQtc1x0T3V0cHV0cyBzdXBlci1ibG9jayBpbmZvcm1hdGlvblxuIik7CglmcHJpbnRmKHN0ZGVyciwKCQkJIlx0LW1cdEFjdGl2YXRlcyBNSU5JWC1saWtlIFwibW9kZSBub3QgY2xlYXJlZFwiIHdhcm5pbmdzXG4iKTsKCWZwcmludGYoc3RkZXJyLCAiXHQtZlx0Rm9yY2UgZmlsZSBzeXN0ZW0gY2hlY2suXG5cbiIpOwojZW5kaWYKCWxlYXZlKDE2KTsKfQoKc3RhdGljIHZvaWQgZGllKGNvbnN0IGNoYXIgKnN0cikKewoJZnByaW50ZihzdGRlcnIsICIlczogJXNcbiIsIHByb2dyYW1fbmFtZSwgc3RyKTsKCWxlYXZlKDgpOwp9CgovKgogKiBUaGlzIHNpbXBseSBnb2VzIHRocm91Z2ggdGhlIGZpbGUtbmFtZSBkYXRhIGFuZCBwcmludHMgb3V0IHRoZQogKiBjdXJyZW50IGZpbGUuCiAqLwpzdGF0aWMgdm9pZCBwcmludF9jdXJyZW50X25hbWUodm9pZCkKewoJaW50IGkgPSAwOwoKCXdoaWxlIChpIDwgbmFtZV9kZXB0aCkKCQlwcmludGYoIi8lLipzIiwgbmFtZWxlbiwgbmFtZV9saXN0W2krK10pOwoJaWYgKGkgPT0gMCkKCQlwcmludGYoIi8iKTsKfQoKc3RhdGljIGludCBhc2soY29uc3QgY2hhciAqc3RyaW5nLCBpbnQgZGVmKQp7CglpbnQgYzsKCglpZiAoIXJlcGFpcikgewoJCXByaW50ZigiXG4iKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCXJldHVybiAwOwoJfQoJaWYgKGF1dG9tYXRpYykgewoJCXByaW50ZigiXG4iKTsKCQlpZiAoIWRlZikKCQkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQlyZXR1cm4gZGVmOwoJfQoJcHJpbnRmKGRlZiA/ICIlcyAoeS9uKT8gIiA6ICIlcyAobi95KT8gIiwgc3RyaW5nKTsKCWZvciAoOzspIHsKCQlmZmx1c2goc3Rkb3V0KTsKCQlpZiAoKGMgPSBnZXRjaGFyKCkpID09IEVPRikgewoJCQlpZiAoIWRlZikKCQkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJCXJldHVybiBkZWY7CgkJfQoJCWMgPSB0b3VwcGVyKGMpOwoJCWlmIChjID09ICdZJykgewoJCQlkZWYgPSAxOwoJCQlicmVhazsKCQl9IGVsc2UgaWYgKGMgPT0gJ04nKSB7CgkJCWRlZiA9IDA7CgkJCWJyZWFrOwoJCX0gZWxzZSBpZiAoYyA9PSAnICcgfHwgYyA9PSAnXG4nKQoJCQlicmVhazsKCX0KCWlmIChkZWYpCgkJcHJpbnRmKCJ5XG4iKTsKCWVsc2UgewoJCXByaW50ZigiblxuIik7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KCXJldHVybiBkZWY7Cn0KCi8qCiAqIE1ha2UgY2VydGFpbiB0aGF0IHdlIGFyZW4ndCBjaGVja2luZyBhIGZpbGVzeXN0ZW0gdGhhdCBpcyBvbiBhCiAqIG1vdW50ZWQgcGFydGl0aW9uLiAgQ29kZSBhZGFwdGVkIGZyb20gZTJmc2NrLCBDb3B5cmlnaHQgKEMpIDE5OTMsCiAqIDE5OTQgVGhlb2RvcmUgVHMnby4gIEFsc28gbGljZW5zZWQgdW5kZXIgR1BMLgogKi8Kc3RhdGljIHZvaWQgY2hlY2tfbW91bnQodm9pZCkKewoJRklMRSAqZjsKCXN0cnVjdCBtbnRlbnQgKm1udDsKCWludCBjb250OwoJaW50IGZkOwoKCWlmICgoZiA9IHNldG1udGVudChNT1VOVEVELCAiciIpKSA9PSBOVUxMKQoJCXJldHVybjsKCXdoaWxlICgobW50ID0gZ2V0bW50ZW50KGYpKSAhPSBOVUxMKQoJCWlmIChzdHJjbXAoZGV2aWNlX25hbWUsIG1udC0+bW50X2ZzbmFtZSkgPT0gMCkKCQkJYnJlYWs7CgllbmRtbnRlbnQoZik7CglpZiAoIW1udCkKCQlyZXR1cm47CgoJLyoKCSAqIElmIHRoZSByb290IGlzIG1vdW50ZWQgcmVhZC1vbmx5LCB0aGVuIC9ldGMvbXRhYiBpcwoJICogcHJvYmFibHkgbm90IGNvcnJlY3Q7IHNvIHdlIHdvbid0IGlzc3VlIGEgd2FybmluZyBiYXNlZCBvbgoJICogaXQuCgkgKi8KCWZkID0gb3BlbihNT1VOVEVELCBPX1JEV1IpOwoJaWYgKGZkIDwgMCAmJiBlcnJubyA9PSBFUk9GUykKCQlyZXR1cm47CgllbHNlCgkJY2xvc2UoZmQpOwoKCXByaW50ZigiJXMgaXMgbW91bnRlZC4JICIsIGRldmljZV9uYW1lKTsKCWlmIChpc2F0dHkoMCkgJiYgaXNhdHR5KDEpKQoJCWNvbnQgPSBhc2soIkRvIHlvdSByZWFsbHkgd2FudCB0byBjb250aW51ZSIsIDApOwoJZWxzZQoJCWNvbnQgPSAwOwoJaWYgKCFjb250KSB7CgkJcHJpbnRmKCJjaGVjayBhYm9ydGVkLlxuIik7CgkJZXhpdCgwKTsKCX0KCXJldHVybjsKfQoKLyoKICogY2hlY2tfem9uZV9uciBjaGVja3MgdG8gc2VlIHRoYXQgKm5yIGlzIGEgdmFsaWQgem9uZSBuci4gSWYgaXQKICogaXNuJ3QsIGl0IHdpbGwgcG9zc2libHkgYmUgcmVwYWlyZWQuIENoZWNrX3pvbmVfbnIgc2V0cyAqY29ycmVjdGVkCiAqIGlmIGFuIGVycm9yIHdhcyBjb3JyZWN0ZWQsIGFuZCByZXR1cm5zIHRoZSB6b25lICgwIGZvciBubyB6b25lCiAqIG9yIGEgYmFkIHpvbmUtbnVtYmVyKS4KICovCnN0YXRpYyBpbnQgY2hlY2tfem9uZV9ucih1bnNpZ25lZCBzaG9ydCAqbnIsIGludCAqY29ycmVjdGVkKQp7CglpZiAoISpucikKCQlyZXR1cm4gMDsKCWlmICgqbnIgPCBGSVJTVFpPTkUpCgkJcHJpbnRmKCJab25lIG5yIDwgRklSU1RaT05FIGluIGZpbGUgYCIpOwoJZWxzZSBpZiAoKm5yID49IFpPTkVTKQoJCXByaW50ZigiWm9uZSBuciA+PSBaT05FUyBpbiBmaWxlIGAiKTsKCWVsc2UKCQlyZXR1cm4gKm5yOwoJcHJpbnRfY3VycmVudF9uYW1lKCk7CglwcmludGYoIicuIik7CglpZiAoYXNrKCJSZW1vdmUgYmxvY2siLCAxKSkgewoJCSpuciA9IDA7CgkJKmNvcnJlY3RlZCA9IDE7Cgl9CglyZXR1cm4gMDsKfQoKI2lmZGVmIEhBVkVfTUlOSVgyCnN0YXRpYyBpbnQgY2hlY2tfem9uZV9ucjIodW5zaWduZWQgaW50ICpuciwgaW50ICpjb3JyZWN0ZWQpCnsKCWlmICghKm5yKQoJCXJldHVybiAwOwoJaWYgKCpuciA8IEZJUlNUWk9ORSkKCQlwcmludGYoIlpvbmUgbnIgPCBGSVJTVFpPTkUgaW4gZmlsZSBgIik7CgllbHNlIGlmICgqbnIgPj0gWk9ORVMpCgkJcHJpbnRmKCJab25lIG5yID49IFpPTkVTIGluIGZpbGUgYCIpOwoJZWxzZQoJCXJldHVybiAqbnI7CglwcmludF9jdXJyZW50X25hbWUoKTsKCXByaW50ZigiJy4iKTsKCWlmIChhc2soIlJlbW92ZSBibG9jayIsIDEpKSB7CgkJKm5yID0gMDsKCQkqY29ycmVjdGVkID0gMTsKCX0KCXJldHVybiAwOwp9CiNlbmRpZgoKLyoKICogcmVhZC1ibG9jayByZWFkcyBibG9jayBuciBpbnRvIHRoZSBidWZmZXIgYXQgYWRkci4KICovCnN0YXRpYyB2b2lkIHJlYWRfYmxvY2sodW5zaWduZWQgaW50IG5yLCBjaGFyICphZGRyKQp7CglpZiAoIW5yKSB7CgkJbWVtc2V0KGFkZHIsIDAsIEJMT0NLX1NJWkUpOwoJCXJldHVybjsKCX0KCWlmIChCTE9DS19TSVpFICogbnIgIT0gbHNlZWsoSU4sIEJMT0NLX1NJWkUgKiBuciwgU0VFS19TRVQpKSB7CgkJcHJpbnRmKCJSZWFkIGVycm9yOiB1bmFibGUgdG8gc2VlayB0byBibG9jayBpbiBmaWxlICciKTsKCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQlwcmludGYoIidcbiIpOwoJCW1lbXNldChhZGRyLCAwLCBCTE9DS19TSVpFKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfSBlbHNlIGlmIChCTE9DS19TSVpFICE9IHJlYWQoSU4sIGFkZHIsIEJMT0NLX1NJWkUpKSB7CgkJcHJpbnRmKCJSZWFkIGVycm9yOiBiYWQgYmxvY2sgaW4gZmlsZSAnIik7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJcHJpbnRmKCInXG4iKTsKCQltZW1zZXQoYWRkciwgMCwgQkxPQ0tfU0laRSk7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KfQoKLyoKICogd3JpdGVfYmxvY2sgd3JpdGVzIGJsb2NrIG5yIHRvIGRpc2suCiAqLwpzdGF0aWMgdm9pZCB3cml0ZV9ibG9jayh1bnNpZ25lZCBpbnQgbnIsIGNoYXIgKmFkZHIpCnsKCWlmICghbnIpCgkJcmV0dXJuOwoJaWYgKG5yIDwgRklSU1RaT05FIHx8IG5yID49IFpPTkVTKSB7CgkJcHJpbnRmKCJJbnRlcm5hbCBlcnJvcjogdHJ5aW5nIHRvIHdyaXRlIGJhZCBibG9ja1xuIgoJCQkgICAiV3JpdGUgcmVxdWVzdCBpZ25vcmVkXG4iKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCXJldHVybjsKCX0KCWlmIChCTE9DS19TSVpFICogbnIgIT0gbHNlZWsoSU4sIEJMT0NLX1NJWkUgKiBuciwgU0VFS19TRVQpKQoJCWRpZSgic2VlayBmYWlsZWQgaW4gd3JpdGVfYmxvY2siKTsKCWlmIChCTE9DS19TSVpFICE9IHdyaXRlKElOLCBhZGRyLCBCTE9DS19TSVpFKSkgewoJCXByaW50ZigiV3JpdGUgZXJyb3I6IGJhZCBibG9jayBpbiBmaWxlICciKTsKCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQlwcmludGYoIidcbiIpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9Cn0KCi8qCiAqIG1hcC1ibG9jayBjYWxjdWxhdGVzIHRoZSBhYnNvbHV0ZSBibG9jayBuciBvZiBhIGJsb2NrIGluIGEgZmlsZS4KICogSXQgc2V0cyAnY2hhbmdlZCcgaWYgdGhlIGlub2RlIGhhcyBuZWVkZWQgY2hhbmdpbmcsIGFuZCByZS13cml0ZXMKICogYW55IGluZGlyZWN0IGJsb2NrcyB3aXRoIGVycm9ycy4KICovCnN0YXRpYyBpbnQgbWFwX2Jsb2NrKHN0cnVjdCBtaW5peF9pbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGludCBibGtucikKewoJdW5zaWduZWQgc2hvcnQgaW5kW0JMT0NLX1NJWkUgPj4gMV07Cgl1bnNpZ25lZCBzaG9ydCBkaW5kW0JMT0NLX1NJWkUgPj4gMV07CglpbnQgYmxrX2NoZywgYmxvY2ssIHJlc3VsdDsKCglpZiAoYmxrbnIgPCA3KQoJCXJldHVybiBjaGVja196b25lX25yKGlub2RlLT5pX3pvbmUgKyBibGtuciwgJmNoYW5nZWQpOwoJYmxrbnIgLT0gNzsKCWlmIChibGtuciA8IDUxMikgewoJCWJsb2NrID0gY2hlY2tfem9uZV9ucihpbm9kZS0+aV96b25lICsgNywgJmNoYW5nZWQpOwoJCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CgkJYmxrX2NoZyA9IDA7CgkJcmVzdWx0ID0gY2hlY2tfem9uZV9ucihibGtuciArIGluZCwgJmJsa19jaGcpOwoJCWlmIChibGtfY2hnKQoJCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCQlyZXR1cm4gcmVzdWx0OwoJfQoJYmxrbnIgLT0gNTEyOwoJYmxvY2sgPSBjaGVja196b25lX25yKGlub2RlLT5pX3pvbmUgKyA4LCAmY2hhbmdlZCk7CglyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBkaW5kKTsKCWJsa19jaGcgPSAwOwoJcmVzdWx0ID0gY2hlY2tfem9uZV9ucihkaW5kICsgKGJsa25yIC8gNTEyKSwgJmJsa19jaGcpOwoJaWYgKGJsa19jaGcpCgkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIGRpbmQpOwoJYmxvY2sgPSByZXN1bHQ7CglyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJYmxrX2NoZyA9IDA7CglyZXN1bHQgPSBjaGVja196b25lX25yKGluZCArIChibGtuciAlIDUxMiksICZibGtfY2hnKTsKCWlmIChibGtfY2hnKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJcmV0dXJuIHJlc3VsdDsKfQoKI2lmZGVmIEhBVkVfTUlOSVgyCnN0YXRpYyBpbnQgbWFwX2Jsb2NrMihzdHJ1Y3QgbWluaXgyX2lub2RlICppbm9kZSwgdW5zaWduZWQgaW50IGJsa25yKQp7Cgl1bnNpZ25lZCBpbnQgaW5kW0JMT0NLX1NJWkUgPj4gMl07Cgl1bnNpZ25lZCBpbnQgZGluZFtCTE9DS19TSVpFID4+IDJdOwoJdW5zaWduZWQgaW50IHRpbmRbQkxPQ0tfU0laRSA+PiAyXTsKCWludCBibGtfY2hnLCBibG9jaywgcmVzdWx0OwoKCWlmIChibGtuciA8IDcpCgkJcmV0dXJuIGNoZWNrX3pvbmVfbnIyKGlub2RlLT5pX3pvbmUgKyBibGtuciwgJmNoYW5nZWQpOwoJYmxrbnIgLT0gNzsKCWlmIChibGtuciA8IDI1NikgewoJCWJsb2NrID0gY2hlY2tfem9uZV9ucjIoaW5vZGUtPmlfem9uZSArIDcsICZjaGFuZ2VkKTsKCQlyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJCWJsa19jaGcgPSAwOwoJCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyKGJsa25yICsgaW5kLCAmYmxrX2NoZyk7CgkJaWYgKGJsa19jaGcpCgkJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJCXJldHVybiByZXN1bHQ7Cgl9CglibGtuciAtPSAyNTY7CglpZiAoYmxrbnIgPj0gMjU2ICogMjU2KSB7CgkJYmxvY2sgPSBjaGVja196b25lX25yMihpbm9kZS0+aV96b25lICsgOCwgJmNoYW5nZWQpOwoJCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGRpbmQpOwoJCWJsa19jaGcgPSAwOwoJCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyKGRpbmQgKyBibGtuciAvIDI1NiwgJmJsa19jaGcpOwoJCWlmIChibGtfY2hnKQoJCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgZGluZCk7CgkJYmxvY2sgPSByZXN1bHQ7CgkJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCQlibGtfY2hnID0gMDsKCQlyZXN1bHQgPSBjaGVja196b25lX25yMihpbmQgKyBibGtuciAlIDI1NiwgJmJsa19jaGcpOwoJCWlmIChibGtfY2hnKQoJCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCQlyZXR1cm4gcmVzdWx0OwoJfQoJYmxrbnIgLT0gMjU2ICogMjU2OwoJYmxvY2sgPSBjaGVja196b25lX25yMihpbm9kZS0+aV96b25lICsgOSwgJmNoYW5nZWQpOwoJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgdGluZCk7CglibGtfY2hnID0gMDsKCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyKHRpbmQgKyBibGtuciAvICgyNTYgKiAyNTYpLCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgdGluZCk7CglibG9jayA9IHJlc3VsdDsKCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGRpbmQpOwoJYmxrX2NoZyA9IDA7CglyZXN1bHQgPSBjaGVja196b25lX25yMihkaW5kICsgKGJsa25yIC8gMjU2KSAlIDI1NiwgJmJsa19jaGcpOwoJaWYgKGJsa19jaGcpCgkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIGRpbmQpOwoJYmxvY2sgPSByZXN1bHQ7CglyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJYmxrX2NoZyA9IDA7CglyZXN1bHQgPSBjaGVja196b25lX25yMihpbmQgKyBibGtuciAlIDI1NiwgJmJsa19jaGcpOwoJaWYgKGJsa19jaGcpCgkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CglyZXR1cm4gcmVzdWx0Owp9CiNlbmRpZgoKc3RhdGljIHZvaWQgd3JpdGVfc3VwZXJfYmxvY2sodm9pZCkKewoJLyoKCSAqIFNldCB0aGUgc3RhdGUgb2YgdGhlIGZpbGVzeXN0ZW0gYmFzZWQgb24gd2hldGhlciBvciBub3QgdGhlcmUKCSAqIGFyZSB1bmNvcnJlY3RlZCBlcnJvcnMuICBUaGUgZmlsZXN5c3RlbSB2YWxpZCBmbGFnIGlzCgkgKiB1bmNvbmRpdGlvbmFsbHkgc2V0IGlmIHdlIGdldCB0aGlzIGZhci4KCSAqLwoJU3VwZXIuc19zdGF0ZSB8PSBNSU5JWF9WQUxJRF9GUzsKCWlmIChlcnJvcnNfdW5jb3JyZWN0ZWQpCgkJU3VwZXIuc19zdGF0ZSB8PSBNSU5JWF9FUlJPUl9GUzsKCWVsc2UKCQlTdXBlci5zX3N0YXRlICY9IH5NSU5JWF9FUlJPUl9GUzsKCglpZiAoQkxPQ0tfU0laRSAhPSBsc2VlayhJTiwgQkxPQ0tfU0laRSwgU0VFS19TRVQpKQoJCWRpZSgic2VlayBmYWlsZWQgaW4gd3JpdGVfc3VwZXJfYmxvY2siKTsKCWlmIChCTE9DS19TSVpFICE9IHdyaXRlKElOLCBzdXBlcl9ibG9ja19idWZmZXIsIEJMT0NLX1NJWkUpKQoJCWRpZSgidW5hYmxlIHRvIHdyaXRlIHN1cGVyLWJsb2NrIik7CgoJcmV0dXJuOwp9CgpzdGF0aWMgdm9pZCB3cml0ZV90YWJsZXModm9pZCkKewoJd3JpdGVfc3VwZXJfYmxvY2soKTsKCglpZiAoSU1BUFMgKiBCTE9DS19TSVpFICE9IHdyaXRlKElOLCBpbm9kZV9tYXAsIElNQVBTICogQkxPQ0tfU0laRSkpCgkJZGllKCJVbmFibGUgdG8gd3JpdGUgaW5vZGUgbWFwIik7CglpZiAoWk1BUFMgKiBCTE9DS19TSVpFICE9IHdyaXRlKElOLCB6b25lX21hcCwgWk1BUFMgKiBCTE9DS19TSVpFKSkKCQlkaWUoIlVuYWJsZSB0byB3cml0ZSB6b25lIG1hcCIpOwoJaWYgKElOT0RFX0JVRkZFUl9TSVpFICE9IHdyaXRlKElOLCBpbm9kZV9idWZmZXIsIElOT0RFX0JVRkZFUl9TSVpFKSkKCQlkaWUoIlVuYWJsZSB0byB3cml0ZSBpbm9kZXMiKTsKfQoKc3RhdGljIHZvaWQgZ2V0X2RpcnNpemUodm9pZCkKewoJaW50IGJsb2NrOwoJY2hhciBibGtbQkxPQ0tfU0laRV07CglpbnQgc2l6ZTsKCiNpZiBIQVZFX01JTklYMgoJaWYgKHZlcnNpb24yKQoJCWJsb2NrID0gSW5vZGUyW1JPT1RfSU5PXS5pX3pvbmVbMF07CgllbHNlCiNlbmRpZgoJCWJsb2NrID0gSW5vZGVbUk9PVF9JTk9dLmlfem9uZVswXTsKCXJlYWRfYmxvY2soYmxvY2ssIGJsayk7Cglmb3IgKHNpemUgPSAxNjsgc2l6ZSA8IEJMT0NLX1NJWkU7IHNpemUgPDw9IDEpIHsKCQlpZiAoc3RyY21wKGJsayArIHNpemUgKyAyLCAiLi4iKSA9PSAwKSB7CgkJCWRpcnNpemUgPSBzaXplOwoJCQluYW1lbGVuID0gc2l6ZSAtIDI7CgkJCXJldHVybjsKCQl9Cgl9CgkvKiB1c2UgZGVmYXVsdHMgKi8KfQoKc3RhdGljIHZvaWQgcmVhZF9zdXBlcmJsb2NrKHZvaWQpCnsKCWlmIChCTE9DS19TSVpFICE9IGxzZWVrKElOLCBCTE9DS19TSVpFLCBTRUVLX1NFVCkpCgkJZGllKCJzZWVrIGZhaWxlZCIpOwoJaWYgKEJMT0NLX1NJWkUgIT0gcmVhZChJTiwgc3VwZXJfYmxvY2tfYnVmZmVyLCBCTE9DS19TSVpFKSkKCQlkaWUoInVuYWJsZSB0byByZWFkIHN1cGVyIGJsb2NrIik7CglpZiAoTUFHSUMgPT0gTUlOSVhfU1VQRVJfTUFHSUMpIHsKCQluYW1lbGVuID0gMTQ7CgkJZGlyc2l6ZSA9IDE2OwoJCXZlcnNpb24yID0gMDsKCX0gZWxzZSBpZiAoTUFHSUMgPT0gTUlOSVhfU1VQRVJfTUFHSUMyKSB7CgkJbmFtZWxlbiA9IDMwOwoJCWRpcnNpemUgPSAzMjsKCQl2ZXJzaW9uMiA9IDA7CiNpZmRlZiBIQVZFX01JTklYMgoJfSBlbHNlIGlmIChNQUdJQyA9PSBNSU5JWDJfU1VQRVJfTUFHSUMpIHsKCQluYW1lbGVuID0gMTQ7CgkJZGlyc2l6ZSA9IDE2OwoJCXZlcnNpb24yID0gMTsKCX0gZWxzZSBpZiAoTUFHSUMgPT0gTUlOSVgyX1NVUEVSX01BR0lDMikgewoJCW5hbWVsZW4gPSAzMDsKCQlkaXJzaXplID0gMzI7CgkJdmVyc2lvbjIgPSAxOwojZW5kaWYKCX0gZWxzZQoJCWRpZSgiYmFkIG1hZ2ljIG51bWJlciBpbiBzdXBlci1ibG9jayIpOwoJaWYgKFpPTkVTSVpFICE9IDAgfHwgQkxPQ0tfU0laRSAhPSAxMDI0KQoJCWRpZSgiT25seSAxayBibG9ja3Mvem9uZXMgc3VwcG9ydGVkIik7CglpZiAoSU1BUFMgKiBCTE9DS19TSVpFICogOCA8IElOT0RFUyArIDEpCgkJZGllKCJiYWQgc19pbWFwX2Jsb2NrcyBmaWVsZCBpbiBzdXBlci1ibG9jayIpOwoJaWYgKFpNQVBTICogQkxPQ0tfU0laRSAqIDggPCBaT05FUyAtIEZJUlNUWk9ORSArIDEpCgkJZGllKCJiYWQgc196bWFwX2Jsb2NrcyBmaWVsZCBpbiBzdXBlci1ibG9jayIpOwp9CgpzdGF0aWMgdm9pZCByZWFkX3RhYmxlcyh2b2lkKQp7Cglpbm9kZV9tYXAgPSB4bWFsbG9jKElNQVBTICogQkxPQ0tfU0laRSk7Cgl6b25lX21hcCA9IHhtYWxsb2MoWk1BUFMgKiBCTE9DS19TSVpFKTsKCW1lbXNldChpbm9kZV9tYXAsIDAsIHNpemVvZihpbm9kZV9tYXApKTsKCW1lbXNldCh6b25lX21hcCwgMCwgc2l6ZW9mKHpvbmVfbWFwKSk7Cglpbm9kZV9idWZmZXIgPSB4bWFsbG9jKElOT0RFX0JVRkZFUl9TSVpFKTsKCWlub2RlX2NvdW50ID0geG1hbGxvYyhJTk9ERVMgKyAxKTsKCXpvbmVfY291bnQgPSB4bWFsbG9jKFpPTkVTKTsKCWlmIChJTUFQUyAqIEJMT0NLX1NJWkUgIT0gcmVhZChJTiwgaW5vZGVfbWFwLCBJTUFQUyAqIEJMT0NLX1NJWkUpKQoJCWRpZSgiVW5hYmxlIHRvIHJlYWQgaW5vZGUgbWFwIik7CglpZiAoWk1BUFMgKiBCTE9DS19TSVpFICE9IHJlYWQoSU4sIHpvbmVfbWFwLCBaTUFQUyAqIEJMT0NLX1NJWkUpKQoJCWRpZSgiVW5hYmxlIHRvIHJlYWQgem9uZSBtYXAiKTsKCWlmIChJTk9ERV9CVUZGRVJfU0laRSAhPSByZWFkKElOLCBpbm9kZV9idWZmZXIsIElOT0RFX0JVRkZFUl9TSVpFKSkKCQlkaWUoIlVuYWJsZSB0byByZWFkIGlub2RlcyIpOwoJaWYgKE5PUk1fRklSU1RaT05FICE9IEZJUlNUWk9ORSkgewoJCXByaW50ZigiV2FybmluZzogRmlyc3R6b25lICE9IE5vcm1fZmlyc3R6b25lXG4iKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQoJZ2V0X2RpcnNpemUoKTsKCWlmIChzaG93KSB7CgkJcHJpbnRmKCIlbGQgaW5vZGVzXG4iLCBJTk9ERVMpOwoJCXByaW50ZigiJWxkIGJsb2Nrc1xuIiwgWk9ORVMpOwoJCXByaW50ZigiRmlyc3RkYXRhem9uZT0lbGQgKCVsZClcbiIsIEZJUlNUWk9ORSwgTk9STV9GSVJTVFpPTkUpOwoJCXByaW50ZigiWm9uZXNpemU9JWRcbiIsIEJMT0NLX1NJWkUgPDwgWk9ORVNJWkUpOwoJCXByaW50ZigiTWF4c2l6ZT0lbGRcbiIsIE1BWFNJWkUpOwoJCXByaW50ZigiRmlsZXN5c3RlbSBzdGF0ZT0lZFxuIiwgU3VwZXIuc19zdGF0ZSk7CgkJcHJpbnRmKCJuYW1lbGVuPSVkXG5cbiIsIG5hbWVsZW4pOwoJfQp9CgpzdHJ1Y3QgbWluaXhfaW5vZGUgKmdldF9pbm9kZSh1bnNpZ25lZCBpbnQgbnIpCnsKCXN0cnVjdCBtaW5peF9pbm9kZSAqaW5vZGU7CgoJaWYgKCFuciB8fCBuciA+IElOT0RFUykKCQlyZXR1cm4gTlVMTDsKCXRvdGFsKys7Cglpbm9kZSA9IElub2RlICsgbnI7CglpZiAoIWlub2RlX2NvdW50W25yXSkgewoJCWlmICghaW5vZGVfaW5fdXNlKG5yKSkgewoJCQlwcmludGYoIklub2RlICVkIG1hcmtlZCBub3QgdXNlZCwgYnV0IHVzZWQgZm9yIGZpbGUgJyIsIG5yKTsKCQkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJCXByaW50ZigiJ1xuIik7CgkJCWlmIChyZXBhaXIpIHsKCQkJCWlmIChhc2soIk1hcmsgaW4gdXNlIiwgMSkpCgkJCQkJbWFya19pbm9kZShucik7CgkJCX0gZWxzZSB7CgkJCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCQl9CgkJfQoJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCQlkaXJlY3RvcnkrKzsKCQllbHNlIGlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKQoJCQlyZWd1bGFyKys7CgkJZWxzZSBpZiAoU19JU0NIUihpbm9kZS0+aV9tb2RlKSkKCQkJY2hhcmRldisrOwoJCWVsc2UgaWYgKFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpCgkJCWJsb2NrZGV2Kys7CgkJZWxzZSBpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKCQkJc3ltbGlua3MrKzsKCQllbHNlIGlmIChTX0lTU09DSyhpbm9kZS0+aV9tb2RlKSk7CgkJZWxzZSBpZiAoU19JU0ZJRk8oaW5vZGUtPmlfbW9kZSkpOwoJCWVsc2UgewoJCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQkJcHJpbnRmKCIgaGFzIG1vZGUgJTA1b1xuIiwgaW5vZGUtPmlfbW9kZSk7CgkJfQoKCX0gZWxzZQoJCWxpbmtzKys7CglpZiAoISsraW5vZGVfY291bnRbbnJdKSB7CgkJcHJpbnRmKCJXYXJuaW5nOiBpbm9kZSBjb3VudCB0b28gYmlnLlxuIik7CgkJaW5vZGVfY291bnRbbnJdLS07CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KCXJldHVybiBpbm9kZTsKfQoKI2lmZGVmIEhBVkVfTUlOSVgyCnN0cnVjdCBtaW5peDJfaW5vZGUgKmdldF9pbm9kZTIodW5zaWduZWQgaW50IG5yKQp7CglzdHJ1Y3QgbWluaXgyX2lub2RlICppbm9kZTsKCglpZiAoIW5yIHx8IG5yID4gSU5PREVTKQoJCXJldHVybiBOVUxMOwoJdG90YWwrKzsKCWlub2RlID0gSW5vZGUyICsgbnI7CglpZiAoIWlub2RlX2NvdW50W25yXSkgewoJCWlmICghaW5vZGVfaW5fdXNlKG5yKSkgewoJCQlwcmludGYoIklub2RlICVkIG1hcmtlZCBub3QgdXNlZCwgYnV0IHVzZWQgZm9yIGZpbGUgJyIsIG5yKTsKCQkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJCXByaW50ZigiJ1xuIik7CgkJCWlmIChyZXBhaXIpIHsKCQkJCWlmIChhc2soIk1hcmsgaW4gdXNlIiwgMSkpCgkJCQkJbWFya19pbm9kZShucik7CgkJCQllbHNlCgkJCQkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQkJfQoJCX0KCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKCQkJZGlyZWN0b3J5Kys7CgkJZWxzZSBpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKCQkJcmVndWxhcisrOwoJCWVsc2UgaWYgKFNfSVNDSFIoaW5vZGUtPmlfbW9kZSkpCgkJCWNoYXJkZXYrKzsKCQllbHNlIGlmIChTX0lTQkxLKGlub2RlLT5pX21vZGUpKQoJCQlibG9ja2RldisrOwoJCWVsc2UgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCgkJCXN5bWxpbmtzKys7CgkJZWxzZSBpZiAoU19JU1NPQ0soaW5vZGUtPmlfbW9kZSkpOwoJCWVsc2UgaWYgKFNfSVNGSUZPKGlub2RlLT5pX21vZGUpKTsKCQllbHNlIHsKCQkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJCXByaW50ZigiIGhhcyBtb2RlICUwNW9cbiIsIGlub2RlLT5pX21vZGUpOwoJCX0KCX0gZWxzZQoJCWxpbmtzKys7CglpZiAoISsraW5vZGVfY291bnRbbnJdKSB7CgkJcHJpbnRmKCJXYXJuaW5nOiBpbm9kZSBjb3VudCB0b28gYmlnLlxuIik7CgkJaW5vZGVfY291bnRbbnJdLS07CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KCXJldHVybiBpbm9kZTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGNoZWNrX3Jvb3Qodm9pZCkKewoJc3RydWN0IG1pbml4X2lub2RlICppbm9kZSA9IElub2RlICsgUk9PVF9JTk87CgoJaWYgKCFpbm9kZSB8fCAhU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKCQlkaWUoInJvb3QgaW5vZGUgaXNuJ3QgYSBkaXJlY3RvcnkiKTsKfQoKI2lmZGVmIEhBVkVfTUlOSVgyCnN0YXRpYyB2b2lkIGNoZWNrX3Jvb3QyKHZvaWQpCnsKCXN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlID0gSW5vZGUyICsgUk9PVF9JTk87CgoJaWYgKCFpbm9kZSB8fCAhU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKCQlkaWUoInJvb3QgaW5vZGUgaXNuJ3QgYSBkaXJlY3RvcnkiKTsKfQojZW5kaWYKCnN0YXRpYyBpbnQgYWRkX3pvbmUodW5zaWduZWQgc2hvcnQgKnpuciwgaW50ICpjb3JyZWN0ZWQpCnsKCWludCByZXN1bHQ7CglpbnQgYmxvY2s7CgoJcmVzdWx0ID0gMDsKCWJsb2NrID0gY2hlY2tfem9uZV9ucih6bnIsIGNvcnJlY3RlZCk7CglpZiAoIWJsb2NrKQoJCXJldHVybiAwOwoJaWYgKHpvbmVfY291bnRbYmxvY2tdKSB7CgkJcHJpbnRmKCJCbG9jayBoYXMgYmVlbiB1c2VkIGJlZm9yZS4gTm93IGluIGZpbGUgYCIpOwoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCXByaW50ZigiJy4iKTsKCQlpZiAoYXNrKCJDbGVhciIsIDEpKSB7CgkJCSp6bnIgPSAwOwoJCQlibG9jayA9IDA7CgkJCSpjb3JyZWN0ZWQgPSAxOwoJCX0KCX0KCWlmICghYmxvY2spCgkJcmV0dXJuIDA7CglpZiAoIXpvbmVfaW5fdXNlKGJsb2NrKSkgewoJCXByaW50ZigiQmxvY2sgJWQgaW4gZmlsZSBgIiwgYmxvY2spOwoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCXByaW50ZigiJyBpcyBtYXJrZWQgbm90IGluIHVzZS4iKTsKCQlpZiAoYXNrKCJDb3JyZWN0IiwgMSkpCgkJCW1hcmtfem9uZShibG9jayk7Cgl9CglpZiAoISsrem9uZV9jb3VudFtibG9ja10pCgkJem9uZV9jb3VudFtibG9ja10tLTsKCXJldHVybiBibG9jazsKfQoKI2lmZGVmIEhBVkVfTUlOSVgyCnN0YXRpYyBpbnQgYWRkX3pvbmUyKHVuc2lnbmVkIGludCAqem5yLCBpbnQgKmNvcnJlY3RlZCkKewoJaW50IHJlc3VsdDsKCWludCBibG9jazsKCglyZXN1bHQgPSAwOwoJYmxvY2sgPSBjaGVja196b25lX25yMih6bnIsIGNvcnJlY3RlZCk7CglpZiAoIWJsb2NrKQoJCXJldHVybiAwOwoJaWYgKHpvbmVfY291bnRbYmxvY2tdKSB7CgkJcHJpbnRmKCJCbG9jayBoYXMgYmVlbiB1c2VkIGJlZm9yZS4gTm93IGluIGZpbGUgYCIpOwoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCXByaW50ZigiJy4iKTsKCQlpZiAoYXNrKCJDbGVhciIsIDEpKSB7CgkJCSp6bnIgPSAwOwoJCQlibG9jayA9IDA7CgkJCSpjb3JyZWN0ZWQgPSAxOwoJCX0KCX0KCWlmICghYmxvY2spCgkJcmV0dXJuIDA7CglpZiAoIXpvbmVfaW5fdXNlKGJsb2NrKSkgewoJCXByaW50ZigiQmxvY2sgJWQgaW4gZmlsZSBgIiwgYmxvY2spOwoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCXByaW50ZigiJyBpcyBtYXJrZWQgbm90IGluIHVzZS4iKTsKCQlpZiAoYXNrKCJDb3JyZWN0IiwgMSkpCgkJCW1hcmtfem9uZShibG9jayk7Cgl9CglpZiAoISsrem9uZV9jb3VudFtibG9ja10pCgkJem9uZV9jb3VudFtibG9ja10tLTsKCXJldHVybiBibG9jazsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGFkZF96b25lX2luZCh1bnNpZ25lZCBzaG9ydCAqem5yLCBpbnQgKmNvcnJlY3RlZCkKewoJc3RhdGljIGNoYXIgYmxrW0JMT0NLX1NJWkVdOwoJaW50IGksIGNoZ19ibGsgPSAwOwoJaW50IGJsb2NrOwoKCWJsb2NrID0gYWRkX3pvbmUoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm47CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJZm9yIChpID0gMDsgaSA8IChCTE9DS19TSVpFID4+IDEpOyBpKyspCgkJYWRkX3pvbmUoaSArICh1bnNpZ25lZCBzaG9ydCAqKSBibGssICZjaGdfYmxrKTsKCWlmIChjaGdfYmxrKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCBibGspOwp9CgojaWZkZWYgSEFWRV9NSU5JWDIKc3RhdGljIHZvaWQgYWRkX3pvbmVfaW5kMih1bnNpZ25lZCBpbnQgKnpuciwgaW50ICpjb3JyZWN0ZWQpCnsKCXN0YXRpYyBjaGFyIGJsa1tCTE9DS19TSVpFXTsKCWludCBpLCBjaGdfYmxrID0gMDsKCWludCBibG9jazsKCglibG9jayA9IGFkZF96b25lMih6bnIsIGNvcnJlY3RlZCk7CglpZiAoIWJsb2NrKQoJCXJldHVybjsKCXJlYWRfYmxvY2soYmxvY2ssIGJsayk7Cglmb3IgKGkgPSAwOyBpIDwgQkxPQ0tfU0laRSA+PiAyOyBpKyspCgkJYWRkX3pvbmUyKGkgKyAodW5zaWduZWQgaW50ICopIGJsaywgJmNoZ19ibGspOwoJaWYgKGNoZ19ibGspCgkJd3JpdGVfYmxvY2soYmxvY2ssIGJsayk7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCBhZGRfem9uZV9kaW5kKHVuc2lnbmVkIHNob3J0ICp6bnIsIGludCAqY29ycmVjdGVkKQp7CglzdGF0aWMgY2hhciBibGtbQkxPQ0tfU0laRV07CglpbnQgaSwgYmxrX2NoZyA9IDA7CglpbnQgYmxvY2s7CgoJYmxvY2sgPSBhZGRfem9uZSh6bnIsIGNvcnJlY3RlZCk7CglpZiAoIWJsb2NrKQoJCXJldHVybjsKCXJlYWRfYmxvY2soYmxvY2ssIGJsayk7Cglmb3IgKGkgPSAwOyBpIDwgKEJMT0NLX1NJWkUgPj4gMSk7IGkrKykKCQlhZGRfem9uZV9pbmQoaSArICh1bnNpZ25lZCBzaG9ydCAqKSBibGssICZibGtfY2hnKTsKCWlmIChibGtfY2hnKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCBibGspOwp9CgojaWZkZWYgSEFWRV9NSU5JWDIKc3RhdGljIHZvaWQgYWRkX3pvbmVfZGluZDIodW5zaWduZWQgaW50ICp6bnIsIGludCAqY29ycmVjdGVkKQp7CglzdGF0aWMgY2hhciBibGtbQkxPQ0tfU0laRV07CglpbnQgaSwgYmxrX2NoZyA9IDA7CglpbnQgYmxvY2s7CgoJYmxvY2sgPSBhZGRfem9uZTIoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm47CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJZm9yIChpID0gMDsgaSA8IEJMT0NLX1NJWkUgPj4gMjsgaSsrKQoJCWFkZF96b25lX2luZDIoaSArICh1bnNpZ25lZCBpbnQgKikgYmxrLCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgYmxrKTsKfQoKc3RhdGljIHZvaWQgYWRkX3pvbmVfdGluZDIodW5zaWduZWQgaW50ICp6bnIsIGludCAqY29ycmVjdGVkKQp7CglzdGF0aWMgY2hhciBibGtbQkxPQ0tfU0laRV07CglpbnQgaSwgYmxrX2NoZyA9IDA7CglpbnQgYmxvY2s7CgoJYmxvY2sgPSBhZGRfem9uZTIoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm47CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJZm9yIChpID0gMDsgaSA8IEJMT0NLX1NJWkUgPj4gMjsgaSsrKQoJCWFkZF96b25lX2RpbmQyKGkgKyAodW5zaWduZWQgaW50ICopIGJsaywgJmJsa19jaGcpOwoJaWYgKGJsa19jaGcpCgkJd3JpdGVfYmxvY2soYmxvY2ssIGJsayk7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCBjaGVja196b25lcyh1bnNpZ25lZCBpbnQgaSkKewoJc3RydWN0IG1pbml4X2lub2RlICppbm9kZTsKCglpZiAoIWkgfHwgaSA+IElOT0RFUykKCQlyZXR1cm47CglpZiAoaW5vZGVfY291bnRbaV0gPiAxKQkJLyogaGF2ZSB3ZSBjb3VudGVkIHRoaXMgZmlsZSBhbHJlYWR5PyAqLwoJCXJldHVybjsKCWlub2RlID0gSW5vZGUgKyBpOwoJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpICYmICFTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmCgkJIVNfSVNMTksoaW5vZGUtPmlfbW9kZSkpIHJldHVybjsKCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCgkJYWRkX3pvbmUoaSArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKCWFkZF96b25lX2luZCg3ICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwoJYWRkX3pvbmVfZGluZCg4ICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwp9CgojaWZkZWYgSEFWRV9NSU5JWDIKc3RhdGljIHZvaWQgY2hlY2tfem9uZXMyKHVuc2lnbmVkIGludCBpKQp7CglzdHJ1Y3QgbWluaXgyX2lub2RlICppbm9kZTsKCglpZiAoIWkgfHwgaSA+IElOT0RFUykKCQlyZXR1cm47CglpZiAoaW5vZGVfY291bnRbaV0gPiAxKQkJLyogaGF2ZSB3ZSBjb3VudGVkIHRoaXMgZmlsZSBhbHJlYWR5PyAqLwoJCXJldHVybjsKCWlub2RlID0gSW5vZGUyICsgaTsKCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJiAhU19JU1JFRyhpbm9kZS0+aV9tb2RlKQoJCSYmICFTX0lTTE5LKGlub2RlLT5pX21vZGUpKQoJCXJldHVybjsKCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCgkJYWRkX3pvbmUyKGkgKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7CglhZGRfem9uZV9pbmQyKDcgKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7CglhZGRfem9uZV9kaW5kMig4ICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwoJYWRkX3pvbmVfdGluZDIoOSArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGNoZWNrX2ZpbGUoc3RydWN0IG1pbml4X2lub2RlICpkaXIsIHVuc2lnbmVkIGludCBvZmZzZXQpCnsKCXN0YXRpYyBjaGFyIGJsa1tCTE9DS19TSVpFXTsKCXN0cnVjdCBtaW5peF9pbm9kZSAqaW5vZGU7CglpbnQgaW5vOwoJY2hhciAqbmFtZTsKCWludCBibG9jazsKCglibG9jayA9IG1hcF9ibG9jayhkaXIsIG9mZnNldCAvIEJMT0NLX1NJWkUpOwoJcmVhZF9ibG9jayhibG9jaywgYmxrKTsKCW5hbWUgPSBibGsgKyAob2Zmc2V0ICUgQkxPQ0tfU0laRSkgKyAyOwoJaW5vID0gKih1bnNpZ25lZCBzaG9ydCAqKSAobmFtZSAtIDIpOwoJaWYgKGlubyA+IElOT0RFUykgewoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCXByaW50ZigiIGNvbnRhaW5zIGEgYmFkIGlub2RlIG51bWJlciBmb3IgZmlsZSAnIik7CgkJcHJpbnRmKCIlLipzJy4iLCBuYW1lbGVuLCBuYW1lKTsKCQlpZiAoYXNrKCIgUmVtb3ZlIiwgMSkpIHsKCQkJKih1bnNpZ25lZCBzaG9ydCAqKSAobmFtZSAtIDIpID0gMDsKCQkJd3JpdGVfYmxvY2soYmxvY2ssIGJsayk7CgkJfQoJCWlubyA9IDA7Cgl9CglpZiAobmFtZV9kZXB0aCA8IE1BWF9ERVBUSCkKCQlzdHJuY3B5KG5hbWVfbGlzdFtuYW1lX2RlcHRoXSwgbmFtZSwgbmFtZWxlbik7CgluYW1lX2RlcHRoKys7Cglpbm9kZSA9IGdldF9pbm9kZShpbm8pOwoJbmFtZV9kZXB0aC0tOwoJaWYgKCFvZmZzZXQpIHsKCQlpZiAoIWlub2RlIHx8IHN0cmNtcCgiLiIsIG5hbWUpKSB7CgkJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCQlwcmludGYoIjogYmFkIGRpcmVjdG9yeTogJy4nIGlzbid0IGZpcnN0XG4iKTsKCQkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQl9IGVsc2UKCQkJcmV0dXJuOwoJfQoJaWYgKG9mZnNldCA9PSBkaXJzaXplKSB7CgkJaWYgKCFpbm9kZSB8fCBzdHJjbXAoIi4uIiwgbmFtZSkpIHsKCQkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJCXByaW50ZigiOiBiYWQgZGlyZWN0b3J5OiAnLi4nIGlzbid0IHNlY29uZFxuIik7CgkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJfSBlbHNlCgkJCXJldHVybjsKCX0KCWlmICghaW5vZGUpCgkJcmV0dXJuOwoJaWYgKG5hbWVfZGVwdGggPCBNQVhfREVQVEgpCgkJc3RybmNweShuYW1lX2xpc3RbbmFtZV9kZXB0aF0sIG5hbWUsIG5hbWVsZW4pOwoJbmFtZV9kZXB0aCsrOwoJaWYgKGxpc3QpIHsKCQlpZiAodmVyYm9zZSkKCQkJcHJpbnRmKCIlNmQgJTA3byAlM2QgIiwgaW5vLCBpbm9kZS0+aV9tb2RlLCBpbm9kZS0+aV9ubGlua3MpOwoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCQlwcmludGYoIjpcbiIpOwoJCWVsc2UKCQkJcHJpbnRmKCJcbiIpOwoJfQoJY2hlY2tfem9uZXMoaW5vKTsKCWlmIChpbm9kZSAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCXJlY3Vyc2l2ZV9jaGVjayhpbm8pOwoJbmFtZV9kZXB0aC0tOwoJcmV0dXJuOwp9CgojaWZkZWYgSEFWRV9NSU5JWDIKc3RhdGljIHZvaWQgY2hlY2tfZmlsZTIoc3RydWN0IG1pbml4Ml9pbm9kZSAqZGlyLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQp7CglzdGF0aWMgY2hhciBibGtbQkxPQ0tfU0laRV07CglzdHJ1Y3QgbWluaXgyX2lub2RlICppbm9kZTsKCWludCBpbm87CgljaGFyICpuYW1lOwoJaW50IGJsb2NrOwoKCWJsb2NrID0gbWFwX2Jsb2NrMihkaXIsIG9mZnNldCAvIEJMT0NLX1NJWkUpOwoJcmVhZF9ibG9jayhibG9jaywgYmxrKTsKCW5hbWUgPSBibGsgKyAob2Zmc2V0ICUgQkxPQ0tfU0laRSkgKyAyOwoJaW5vID0gKih1bnNpZ25lZCBzaG9ydCAqKSAobmFtZSAtIDIpOwoJaWYgKGlubyA+IElOT0RFUykgewoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCXByaW50ZigiIGNvbnRhaW5zIGEgYmFkIGlub2RlIG51bWJlciBmb3IgZmlsZSAnIik7CgkJcHJpbnRmKCIlLipzJy4iLCBuYW1lbGVuLCBuYW1lKTsKCQlpZiAoYXNrKCIgUmVtb3ZlIiwgMSkpIHsKCQkJKih1bnNpZ25lZCBzaG9ydCAqKSAobmFtZSAtIDIpID0gMDsKCQkJd3JpdGVfYmxvY2soYmxvY2ssIGJsayk7CgkJfQoJCWlubyA9IDA7Cgl9CglpZiAobmFtZV9kZXB0aCA8IE1BWF9ERVBUSCkKCQlzdHJuY3B5KG5hbWVfbGlzdFtuYW1lX2RlcHRoXSwgbmFtZSwgbmFtZWxlbik7CgluYW1lX2RlcHRoKys7Cglpbm9kZSA9IGdldF9pbm9kZTIoaW5vKTsKCW5hbWVfZGVwdGgtLTsKCWlmICghb2Zmc2V0KSB7CgkJaWYgKCFpbm9kZSB8fCBzdHJjbXAoIi4iLCBuYW1lKSkgewoJCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQkJcHJpbnRmKCI6IGJhZCBkaXJlY3Rvcnk6ICcuJyBpc24ndCBmaXJzdFxuIik7CgkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJfSBlbHNlCgkJCXJldHVybjsKCX0KCWlmIChvZmZzZXQgPT0gZGlyc2l6ZSkgewoJCWlmICghaW5vZGUgfHwgc3RyY21wKCIuLiIsIG5hbWUpKSB7CgkJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCQlwcmludGYoIjogYmFkIGRpcmVjdG9yeTogJy4uJyBpc24ndCBzZWNvbmRcbiIpOwoJCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCX0gZWxzZQoJCQlyZXR1cm47Cgl9CglpZiAoIWlub2RlKQoJCXJldHVybjsKCW5hbWVfZGVwdGgrKzsKCWlmIChsaXN0KSB7CgkJaWYgKHZlcmJvc2UpCgkJCXByaW50ZigiJTZkICUwN28gJTNkICIsIGlubywgaW5vZGUtPmlfbW9kZSwgaW5vZGUtPmlfbmxpbmtzKTsKCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKCQkJcHJpbnRmKCI6XG4iKTsKCQllbHNlCgkJCXByaW50ZigiXG4iKTsKCX0KCWNoZWNrX3pvbmVzMihpbm8pOwoJaWYgKGlub2RlICYmIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCgkJcmVjdXJzaXZlX2NoZWNrMihpbm8pOwoJbmFtZV9kZXB0aC0tOwoJcmV0dXJuOwp9CiNlbmRpZgoKc3RhdGljIHZvaWQgcmVjdXJzaXZlX2NoZWNrKHVuc2lnbmVkIGludCBpbm8pCnsKCXN0cnVjdCBtaW5peF9pbm9kZSAqZGlyOwoJdW5zaWduZWQgaW50IG9mZnNldDsKCglkaXIgPSBJbm9kZSArIGlubzsKCWlmICghU19JU0RJUihkaXItPmlfbW9kZSkpCgkJZGllKCJpbnRlcm5hbCBlcnJvciIpOwoJaWYgKGRpci0+aV9zaXplIDwgMiAqIGRpcnNpemUpIHsKCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQlwcmludGYoIjogYmFkIGRpcmVjdG9yeTogc2l6ZTwzMiIpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9Cglmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGRpci0+aV9zaXplOyBvZmZzZXQgKz0gZGlyc2l6ZSkKCQljaGVja19maWxlKGRpciwgb2Zmc2V0KTsKfQoKI2lmZGVmIEhBVkVfTUlOSVgyCnN0YXRpYyB2b2lkIHJlY3Vyc2l2ZV9jaGVjazIodW5zaWduZWQgaW50IGlubykKewoJc3RydWN0IG1pbml4Ml9pbm9kZSAqZGlyOwoJdW5zaWduZWQgaW50IG9mZnNldDsKCglkaXIgPSBJbm9kZTIgKyBpbm87CglpZiAoIVNfSVNESVIoZGlyLT5pX21vZGUpKQoJCWRpZSgiaW50ZXJuYWwgZXJyb3IiKTsKCWlmIChkaXItPmlfc2l6ZSA8IDIgKiBkaXJzaXplKSB7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJcHJpbnRmKCI6IGJhZCBkaXJlY3Rvcnk6IHNpemUgPCAzMiIpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9Cglmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGRpci0+aV9zaXplOyBvZmZzZXQgKz0gZGlyc2l6ZSkKCQljaGVja19maWxlMihkaXIsIG9mZnNldCk7Cn0KI2VuZGlmCgpzdGF0aWMgaW50IGJhZF96b25lKGludCBpKQp7CgljaGFyIGJ1ZmZlclsxMDI0XTsKCglpZiAoQkxPQ0tfU0laRSAqIGkgIT0gbHNlZWsoSU4sIEJMT0NLX1NJWkUgKiBpLCBTRUVLX1NFVCkpCgkJZGllKCJzZWVrIGZhaWxlZCBpbiBiYWRfem9uZSIpOwoJcmV0dXJuIChCTE9DS19TSVpFICE9IHJlYWQoSU4sIGJ1ZmZlciwgQkxPQ0tfU0laRSkpOwp9CgpzdGF0aWMgdm9pZCBjaGVja19jb3VudHModm9pZCkKewoJaW50IGk7CgoJZm9yIChpID0gMTsgaSA8PSBJTk9ERVM7IGkrKykgewoJCWlmICghaW5vZGVfaW5fdXNlKGkpICYmIElub2RlW2ldLmlfbW9kZSAmJiB3YXJuX21vZGUpIHsKCQkJcHJpbnRmKCJJbm9kZSAlZCBtb2RlIG5vdCBjbGVhcmVkLiIsIGkpOwoJCQlpZiAoYXNrKCJDbGVhciIsIDEpKSB7CgkJCQlJbm9kZVtpXS5pX21vZGUgPSAwOwoJCQkJY2hhbmdlZCA9IDE7CgkJCX0KCQl9CgkJaWYgKCFpbm9kZV9jb3VudFtpXSkgewoJCQlpZiAoIWlub2RlX2luX3VzZShpKSkKCQkJCWNvbnRpbnVlOwoJCQlwcmludGYoIklub2RlICVkIG5vdCB1c2VkLCBtYXJrZWQgdXNlZCBpbiB0aGUgYml0bWFwLiIsIGkpOwoJCQlpZiAoYXNrKCJDbGVhciIsIDEpKQoJCQkJdW5tYXJrX2lub2RlKGkpOwoJCQljb250aW51ZTsKCQl9CgkJaWYgKCFpbm9kZV9pbl91c2UoaSkpIHsKCQkJcHJpbnRmKCJJbm9kZSAlZCB1c2VkLCBtYXJrZWQgdW51c2VkIGluIHRoZSBiaXRtYXAuIiwgaSk7CgkJCWlmIChhc2soIlNldCIsIDEpKQoJCQkJbWFya19pbm9kZShpKTsKCQl9CgkJaWYgKElub2RlW2ldLmlfbmxpbmtzICE9IGlub2RlX2NvdW50W2ldKSB7CgkJCXByaW50ZigiSW5vZGUgJWQgKG1vZGUgPSAlMDdvKSwgaV9ubGlua3M9JWQsIGNvdW50ZWQ9JWQuIiwKCQkJCSAgIGksIElub2RlW2ldLmlfbW9kZSwgSW5vZGVbaV0uaV9ubGlua3MsIGlub2RlX2NvdW50W2ldKTsKCQkJaWYgKGFzaygiU2V0IGlfbmxpbmtzIHRvIGNvdW50IiwgMSkpIHsKCQkJCUlub2RlW2ldLmlfbmxpbmtzID0gaW5vZGVfY291bnRbaV07CgkJCQljaGFuZ2VkID0gMTsKCQkJfQoJCX0KCX0KCWZvciAoaSA9IEZJUlNUWk9ORTsgaSA8IFpPTkVTOyBpKyspIHsKCQlpZiAoem9uZV9pbl91c2UoaSkgPT0gem9uZV9jb3VudFtpXSkKCQkJY29udGludWU7CgkJaWYgKCF6b25lX2NvdW50W2ldKSB7CgkJCWlmIChiYWRfem9uZShpKSkKCQkJCWNvbnRpbnVlOwoJCQlwcmludGYoIlpvbmUgJWQ6IG1hcmtlZCBpbiB1c2UsIG5vIGZpbGUgdXNlcyBpdC4iLCBpKTsKCQkJaWYgKGFzaygiVW5tYXJrIiwgMSkpCgkJCQl1bm1hcmtfem9uZShpKTsKCQkJY29udGludWU7CgkJfQoJCXByaW50ZigiWm9uZSAlZDogJXNpbiB1c2UsIGNvdW50ZWQ9JWRcbiIsCgkJCSAgIGksIHpvbmVfaW5fdXNlKGkpID8gIiIgOiAibm90ICIsIHpvbmVfY291bnRbaV0pOwoJfQp9CgojaWZkZWYgSEFWRV9NSU5JWDIKc3RhdGljIHZvaWQgY2hlY2tfY291bnRzMih2b2lkKQp7CglpbnQgaTsKCglmb3IgKGkgPSAxOyBpIDw9IElOT0RFUzsgaSsrKSB7CgkJaWYgKCFpbm9kZV9pbl91c2UoaSkgJiYgSW5vZGUyW2ldLmlfbW9kZSAmJiB3YXJuX21vZGUpIHsKCQkJcHJpbnRmKCJJbm9kZSAlZCBtb2RlIG5vdCBjbGVhcmVkLiIsIGkpOwoJCQlpZiAoYXNrKCJDbGVhciIsIDEpKSB7CgkJCQlJbm9kZTJbaV0uaV9tb2RlID0gMDsKCQkJCWNoYW5nZWQgPSAxOwoJCQl9CgkJfQoJCWlmICghaW5vZGVfY291bnRbaV0pIHsKCQkJaWYgKCFpbm9kZV9pbl91c2UoaSkpCgkJCQljb250aW51ZTsKCQkJcHJpbnRmKCJJbm9kZSAlZCBub3QgdXNlZCwgbWFya2VkIHVzZWQgaW4gdGhlIGJpdG1hcC4iLCBpKTsKCQkJaWYgKGFzaygiQ2xlYXIiLCAxKSkKCQkJCXVubWFya19pbm9kZShpKTsKCQkJY29udGludWU7CgkJfQoJCWlmICghaW5vZGVfaW5fdXNlKGkpKSB7CgkJCXByaW50ZigiSW5vZGUgJWQgdXNlZCwgbWFya2VkIHVudXNlZCBpbiB0aGUgYml0bWFwLiIsIGkpOwoJCQlpZiAoYXNrKCJTZXQiLCAxKSkKCQkJCW1hcmtfaW5vZGUoaSk7CgkJfQoJCWlmIChJbm9kZTJbaV0uaV9ubGlua3MgIT0gaW5vZGVfY291bnRbaV0pIHsKCQkJcHJpbnRmKCJJbm9kZSAlZCAobW9kZSA9ICUwN28pLCBpX25saW5rcz0lZCwgY291bnRlZD0lZC4iLAoJCQkJICAgaSwgSW5vZGUyW2ldLmlfbW9kZSwgSW5vZGUyW2ldLmlfbmxpbmtzLAoJCQkJICAgaW5vZGVfY291bnRbaV0pOwoJCQlpZiAoYXNrKCJTZXQgaV9ubGlua3MgdG8gY291bnQiLCAxKSkgewoJCQkJSW5vZGUyW2ldLmlfbmxpbmtzID0gaW5vZGVfY291bnRbaV07CgkJCQljaGFuZ2VkID0gMTsKCQkJfQoJCX0KCX0KCWZvciAoaSA9IEZJUlNUWk9ORTsgaSA8IFpPTkVTOyBpKyspIHsKCQlpZiAoem9uZV9pbl91c2UoaSkgPT0gem9uZV9jb3VudFtpXSkKCQkJY29udGludWU7CgkJaWYgKCF6b25lX2NvdW50W2ldKSB7CgkJCWlmIChiYWRfem9uZShpKSkKCQkJCWNvbnRpbnVlOwoJCQlwcmludGYoIlpvbmUgJWQ6IG1hcmtlZCBpbiB1c2UsIG5vIGZpbGUgdXNlcyBpdC4iLCBpKTsKCQkJaWYgKGFzaygiVW5tYXJrIiwgMSkpCgkJCQl1bm1hcmtfem9uZShpKTsKCQkJY29udGludWU7CgkJfQoJCXByaW50ZigiWm9uZSAlZDogJXNpbiB1c2UsIGNvdW50ZWQ9JWRcbiIsCgkJCSAgIGksIHpvbmVfaW5fdXNlKGkpID8gIiIgOiAibm90ICIsIHpvbmVfY291bnRbaV0pOwoJfQp9CiNlbmRpZgoKc3RhdGljIHZvaWQgY2hlY2sodm9pZCkKewoJbWVtc2V0KGlub2RlX2NvdW50LCAwLCAoSU5PREVTICsgMSkgKiBzaXplb2YoKmlub2RlX2NvdW50KSk7CgltZW1zZXQoem9uZV9jb3VudCwgMCwgWk9ORVMgKiBzaXplb2YoKnpvbmVfY291bnQpKTsKCWNoZWNrX3pvbmVzKFJPT1RfSU5PKTsKCXJlY3Vyc2l2ZV9jaGVjayhST09UX0lOTyk7CgljaGVja19jb3VudHMoKTsKfQoKI2lmZGVmIEhBVkVfTUlOSVgyCnN0YXRpYyB2b2lkIGNoZWNrMih2b2lkKQp7CgltZW1zZXQoaW5vZGVfY291bnQsIDAsIChJTk9ERVMgKyAxKSAqIHNpemVvZigqaW5vZGVfY291bnQpKTsKCW1lbXNldCh6b25lX2NvdW50LCAwLCBaT05FUyAqIHNpemVvZigqem9uZV9jb3VudCkpOwoJY2hlY2tfem9uZXMyKFJPT1RfSU5PKTsKCXJlY3Vyc2l2ZV9jaGVjazIoUk9PVF9JTk8pOwoJY2hlY2tfY291bnRzMigpOwp9CiNlbmRpZgoKLyogV2VkIEZlYiAgOSAxNToxNzowNiBNU1QgMjAwMCAqLwovKiBkeW5hbWljYWxseSBhbGxvY2F0ZSBuYW1lX2xpc3QgKGluc3RlYWQgb2YgbWFraW5nIGl0IHN0YXRpYykgKi8Kc3RhdGljIHZvaWQgYWxsb2NfbmFtZV9saXN0KHZvaWQpCnsKCWludCBpOwoKCW5hbWVfbGlzdCA9IHhtYWxsb2Moc2l6ZW9mKGNoYXIgKikgKiBNQVhfREVQVEgpOwoJZm9yIChpID0gMDsgaSA8IE1BWF9ERVBUSDsgaSsrKQoJCW5hbWVfbGlzdFtpXSA9IHhtYWxsb2Moc2l6ZW9mKGNoYXIpICogQlVGU0laICsgMSk7Cn0KCiNpZiAwCi8qIGV4ZWN1dGUgdGhpcyBhdGV4aXQoKSB0byBkZWFsbG9jYXRlIG5hbWVfbGlzdFtdICovCi8qIHBpcHRpZ2dlciB3YXMgaGVyZSAqLwpzdGF0aWMgdm9pZCBmcmVlX25hbWVfbGlzdCh2b2lkKQp7CglpbnQgaTsKCglpZiAobmFtZV9saXN0KSB7IAoJCWZvciAoaSA9IDA7IGkgPCBNQVhfREVQVEg7IGkrKykgewoJCQlpZiAobmFtZV9saXN0W2ldKSB7CgkJCQlmcmVlKG5hbWVfbGlzdFtpXSk7CgkJCX0KCQl9CgkJZnJlZShuYW1lX2xpc3QpOwoJfQp9CiNlbmRpZgoKZXh0ZXJuIGludCBmc2NrX21pbml4X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CglzdHJ1Y3QgdGVybWlvcyB0bXA7CglpbnQgY291bnQ7CglpbnQgcmV0Y29kZSA9IDA7CgoJYWxsb2NfbmFtZV9saXN0KCk7CgkvKiBEb24ndCBib3RoZXIgdG8gZnJlZSBtZW1vcnkuICBFeGl0IGRvZXMKCSAqIHRoYXQgYXV0b21hZ2ljYWxseSwgc28gd2UgY2FuIHNhdmUgYSBmZXcgYnl0ZXMgKi8KCS8vYXRleGl0KGZyZWVfbmFtZV9saXN0KTsKCglpZiAoYXJnYyAmJiAqYXJndikKCQlwcm9ncmFtX25hbWUgPSAqYXJndjsKCWlmIChJTk9ERV9TSVpFICogTUlOSVhfSU5PREVTX1BFUl9CTE9DSyAhPSBCTE9DS19TSVpFKQoJCWRpZSgiYmFkIGlub2RlIHNpemUiKTsKI2lmZGVmIEhBVkVfTUlOSVgyCglpZiAoSU5PREVfU0laRTIgKiBNSU5JWDJfSU5PREVTX1BFUl9CTE9DSyAhPSBCTE9DS19TSVpFKQoJCWRpZSgiYmFkIHYyIGlub2RlIHNpemUiKTsKI2VuZGlmCgl3aGlsZSAoYXJnYy0tID4gMSkgewoJCWFyZ3YrKzsKCQlpZiAoYXJndlswXVswXSAhPSAnLScpIHsKCQkJaWYgKGRldmljZV9uYW1lKQoJCQkJc2hvd191c2FnZSgpOwoJCQllbHNlCgkJCQlkZXZpY2VfbmFtZSA9IGFyZ3ZbMF07CgkJfSBlbHNlCgkJCXdoaWxlICgqKythcmd2WzBdKQoJCQkJc3dpdGNoIChhcmd2WzBdWzBdKSB7CgkJCQljYXNlICdsJzoKCQkJCQlsaXN0ID0gMTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ2EnOgoJCQkJCWF1dG9tYXRpYyA9IDE7CgkJCQkJcmVwYWlyID0gMTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ3InOgoJCQkJCWF1dG9tYXRpYyA9IDA7CgkJCQkJcmVwYWlyID0gMTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ3YnOgoJCQkJCXZlcmJvc2UgPSAxOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAncyc6CgkJCQkJc2hvdyA9IDE7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdtJzoKCQkJCQl3YXJuX21vZGUgPSAxOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAnZic6CgkJCQkJZm9yY2UgPSAxOwoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQlzaG93X3VzYWdlKCk7CgkJCQl9Cgl9CglpZiAoIWRldmljZV9uYW1lKQoJCXNob3dfdXNhZ2UoKTsKCWNoZWNrX21vdW50KCk7CQkJCS8qIHRyeWluZyB0byBjaGVjayBhIG1vdW50ZWQgZmlsZXN5c3RlbT8gKi8KCWlmIChyZXBhaXIgJiYgIWF1dG9tYXRpYykgewoJCWlmICghaXNhdHR5KDApIHx8ICFpc2F0dHkoMSkpCgkJCWRpZSgibmVlZCB0ZXJtaW5hbCBmb3IgaW50ZXJhY3RpdmUgcmVwYWlycyIpOwoJfQoJSU4gPSBvcGVuKGRldmljZV9uYW1lLCByZXBhaXIgPyBPX1JEV1IgOiBPX1JET05MWSk7CglpZiAoSU4gPCAwKQoJCWRpZSgidW5hYmxlIHRvIG9wZW4gJyVzJyIpOwoJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMzsgY291bnQrKykKCQlzeW5jKCk7CglyZWFkX3N1cGVyYmxvY2soKTsKCgkvKgoJICogRGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBjb250aW51ZSB3aXRoIHRoZSBjaGVja2luZy4KCSAqIFRoaXMgaXMgYmFzZWQgb24gdGhlIHN0YXR1cyBvZiB0aGUgZmlsZXN5c3RlbSB2YWxpZCBhbmQgZXJyb3IKCSAqIGZsYWdzIGFuZCB3aGV0aGVyIG9yIG5vdCB0aGUgLWYgc3dpdGNoIHdhcyBzcGVjaWZpZWQgb24gdGhlIAoJICogY29tbWFuZCBsaW5lLgoJICovCglwcmludGYoIiVzLCAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBwcm9ncmFtX3ZlcnNpb24pOwoJaWYgKCEoU3VwZXIuc19zdGF0ZSAmIE1JTklYX0VSUk9SX0ZTKSAmJgoJCShTdXBlci5zX3N0YXRlICYgTUlOSVhfVkFMSURfRlMpICYmICFmb3JjZSkgewoJCWlmIChyZXBhaXIpCgkJCXByaW50ZigiJXMgaXMgY2xlYW4sIG5vIGNoZWNrLlxuIiwgZGV2aWNlX25hbWUpOwoJCXJldHVybiByZXRjb2RlOwoJfSBlbHNlIGlmIChmb3JjZSkKCQlwcmludGYoIkZvcmNpbmcgZmlsZXN5c3RlbSBjaGVjayBvbiAlcy5cbiIsIGRldmljZV9uYW1lKTsKCWVsc2UgaWYgKHJlcGFpcikKCQlwcmludGYoIkZpbGVzeXN0ZW0gb24gJXMgaXMgZGlydHksIG5lZWRzIGNoZWNraW5nLlxuIiwKCQkJICAgZGV2aWNlX25hbWUpOwoKCXJlYWRfdGFibGVzKCk7CgoJaWYgKHJlcGFpciAmJiAhYXV0b21hdGljKSB7CgkJdGNnZXRhdHRyKDAsICZ0ZXJtaW9zKTsKCQl0bXAgPSB0ZXJtaW9zOwoJCXRtcC5jX2xmbGFnICY9IH4oSUNBTk9OIHwgRUNITyk7CgkJdGNzZXRhdHRyKDAsIFRDU0FOT1csICZ0bXApOwoJCXRlcm1pb3Nfc2V0ID0gMTsKCX0KI2lmIEhBVkVfTUlOSVgyCglpZiAodmVyc2lvbjIpIHsKCQljaGVja19yb290MigpOwoJCWNoZWNrMigpOwoJfSBlbHNlCiNlbmRpZgoJewoJCWNoZWNrX3Jvb3QoKTsKCQljaGVjaygpOwoJfQoJaWYgKHZlcmJvc2UpIHsKCQlpbnQgaSwgZnJlZTsKCgkJZm9yIChpID0gMSwgZnJlZSA9IDA7IGkgPD0gSU5PREVTOyBpKyspCgkJCWlmICghaW5vZGVfaW5fdXNlKGkpKQoJCQkJZnJlZSsrOwoJCXByaW50ZigiXG4lNmxkIGlub2RlcyB1c2VkICglbGQlJSlcbiIsIChJTk9ERVMgLSBmcmVlKSwKCQkJICAgMTAwICogKElOT0RFUyAtIGZyZWUpIC8gSU5PREVTKTsKCQlmb3IgKGkgPSBGSVJTVFpPTkUsIGZyZWUgPSAwOyBpIDwgWk9ORVM7IGkrKykKCQkJaWYgKCF6b25lX2luX3VzZShpKSkKCQkJCWZyZWUrKzsKCQlwcmludGYoIiU2bGQgem9uZXMgdXNlZCAoJWxkJSUpXG4iLCAoWk9ORVMgLSBmcmVlKSwKCQkJICAgMTAwICogKFpPTkVTIC0gZnJlZSkgLyBaT05FUyk7CgkJcHJpbnRmKCJcbiU2ZCByZWd1bGFyIGZpbGVzXG4iCgkJCSAgICIlNmQgZGlyZWN0b3JpZXNcbiIKCQkJICAgIiU2ZCBjaGFyYWN0ZXIgZGV2aWNlIGZpbGVzXG4iCgkJCSAgICIlNmQgYmxvY2sgZGV2aWNlIGZpbGVzXG4iCgkJCSAgICIlNmQgbGlua3NcbiIKCQkJICAgIiU2ZCBzeW1ib2xpYyBsaW5rc1xuIgoJCQkgICAiLS0tLS0tXG4iCgkJCSAgICIlNmQgZmlsZXNcbiIsCgkJCSAgIHJlZ3VsYXIsIGRpcmVjdG9yeSwgY2hhcmRldiwgYmxvY2tkZXYsCgkJCSAgIGxpbmtzIC0gMiAqIGRpcmVjdG9yeSArIDEsIHN5bWxpbmtzLAoJCQkgICB0b3RhbCAtIDIgKiBkaXJlY3RvcnkgKyAxKTsKCX0KCWlmIChjaGFuZ2VkKSB7CgkJd3JpdGVfdGFibGVzKCk7CgkJcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCgkJCSAgICJGSUxFIFNZU1RFTSBIQVMgQkVFTiBDSEFOR0VEXG4iCgkJCSAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAzOyBjb3VudCsrKQoJCQlzeW5jKCk7Cgl9IGVsc2UgaWYgKHJlcGFpcikKCQl3cml0ZV9zdXBlcl9ibG9jaygpOwoKCWlmIChyZXBhaXIgJiYgIWF1dG9tYXRpYykKCQl0Y3NldGF0dHIoMCwgVENTQU5PVywgJnRlcm1pb3MpOwoKCWlmIChjaGFuZ2VkKQoJCXJldGNvZGUgKz0gMzsKCWlmIChlcnJvcnNfdW5jb3JyZWN0ZWQpCgkJcmV0Y29kZSArPSA0OwoJcmV0dXJuIHJldGNvZGU7Cn0K