LyoKICogIGJpbmZtdF9taXNjLmMKICoKICogIENvcHlyaWdodCAoQykgMTk5NyBSaWNoYXJkIEf8bnRoZXIKICoKICogIGJpbmZtdF9taXNjIGRldGVjdHMgYmluYXJpZXMgdmlhIGEgbWFnaWMgb3IgZmlsZW5hbWUgZXh0ZW5zaW9uIGFuZCBpbnZva2VzCiAqICBhIHNwZWNpZmllZCB3cmFwcGVyLiBUaGlzIHNob3VsZCBvYnNvbGV0ZSBiaW5mbXRfamF2YSwgYmluZm10X2VtODYgYW5kCiAqICBiaW5mbXRfbXouCiAqCiAqICAxOTk3LTA0LTI1IGZpcnN0IHZlcnNpb24KICogIFsuLi5dCiAqICAxOTk3LTA1LTE5IGNsZWFudXAKICogIDE5OTctMDYtMjYgaHBhOiBwYXNzIHRoZSByZWFsIGZpbGVuYW1lIHJhdGhlciB0aGFuIGFyZ3ZbMF0KICogIDE5OTctMDYtMzAgbWlub3IgY2xlYW51cAogKiAgMTk5Ny0wOC0wOSByZW1vdmVkIGV4dGVuc2lvbiBzdHJpcHBpbmcsIGxvY2tpbmcgY2xlYW51cAogKiAgMjAwMS0wMi0yOCBBVjogcmV3cml0dGVuIGludG8gc29tZXRoaW5nIHRoYXQgcmVzZW1ibGVzIEMuIE9yaWdpbmFsIGRpZG4ndC4KICovCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CgojaW5jbHVkZSA8bGludXgvYmluZm10cy5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgojaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KCiNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgoKZW51bSB7CglWRVJCT1NFX1NUQVRVUyA9IDEgLyogbWFrZSBpdCB6ZXJvIHRvIHNhdmUgNDAwIGJ5dGVzIGtlcm5lbCBtZW1vcnkgKi8KfTsKCnN0YXRpYyBMSVNUX0hFQUQoZW50cmllcyk7CnN0YXRpYyBpbnQgZW5hYmxlZCA9IDE7CgplbnVtIHtFbmFibGVkLCBNYWdpY307CiNkZWZpbmUgTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjAgKDE8PDMxKQojZGVmaW5lIE1JU0NfRk1UX09QRU5fQklOQVJZICgxPDwzMCkKI2RlZmluZSBNSVNDX0ZNVF9DUkVERU5USUFMUyAoMTw8MjkpCgp0eXBlZGVmIHN0cnVjdCB7CglzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwkJLyogdHlwZSwgc3RhdHVzLCBldGMuICovCglpbnQgb2Zmc2V0OwkJCS8qIG9mZnNldCBvZiBtYWdpYyAqLwoJaW50IHNpemU7CQkJLyogc2l6ZSBvZiBtYWdpYy9tYXNrICovCgljaGFyICptYWdpYzsJCQkvKiBtYWdpYyBvciBmaWxlbmFtZSBleHRlbnNpb24gKi8KCWNoYXIgKm1hc2s7CQkJLyogbWFzaywgTlVMTCBmb3IgZXhhY3QgbWF0Y2ggKi8KCWNoYXIgKmludGVycHJldGVyOwkJLyogZmlsZW5hbWUgb2YgaW50ZXJwcmV0ZXIgKi8KCWNoYXIgKm5hbWU7CglzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7Cn0gTm9kZTsKCnN0YXRpYyBERUZJTkVfUldMT0NLKGVudHJpZXNfbG9jayk7CnN0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKmJtX21udDsKc3RhdGljIGludCBlbnRyeV9jb3VudDsKCi8qIAogKiBDaGVjayBpZiB3ZSBzdXBwb3J0IHRoZSBiaW5mbXQKICogaWYgd2UgZG8sIHJldHVybiB0aGUgbm9kZSwgZWxzZSBOVUxMCiAqIGxvY2tpbmcgaXMgZG9uZSBpbiBsb2FkX21pc2NfYmluYXJ5CiAqLwpzdGF0aWMgTm9kZSAqY2hlY2tfZmlsZShzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKQp7CgljaGFyICpwID0gc3RycmNocihicHJtLT5pbnRlcnAsICcuJyk7CglzdHJ1Y3QgbGlzdF9oZWFkICpsOwoKCWxpc3RfZm9yX2VhY2gobCwgJmVudHJpZXMpIHsKCQlOb2RlICplID0gbGlzdF9lbnRyeShsLCBOb2RlLCBsaXN0KTsKCQljaGFyICpzOwoJCWludCBqOwoKCQlpZiAoIXRlc3RfYml0KEVuYWJsZWQsICZlLT5mbGFncykpCgkJCWNvbnRpbnVlOwoKCQlpZiAoIXRlc3RfYml0KE1hZ2ljLCAmZS0+ZmxhZ3MpKSB7CgkJCWlmIChwICYmICFzdHJjbXAoZS0+bWFnaWMsIHAgKyAxKSkKCQkJCXJldHVybiBlOwoJCQljb250aW51ZTsKCQl9CgoJCXMgPSBicHJtLT5idWYgKyBlLT5vZmZzZXQ7CgkJaWYgKGUtPm1hc2spIHsKCQkJZm9yIChqID0gMDsgaiA8IGUtPnNpemU7IGorKykKCQkJCWlmICgoKnMrKyBeIGUtPm1hZ2ljW2pdKSAmIGUtPm1hc2tbal0pCgkJCQkJYnJlYWs7CgkJfSBlbHNlIHsKCQkJZm9yIChqID0gMDsgaiA8IGUtPnNpemU7IGorKykKCQkJCWlmICgoKnMrKyBeIGUtPm1hZ2ljW2pdKSkKCQkJCQlicmVhazsKCQl9CgkJaWYgKGogPT0gZS0+c2l6ZSkKCQkJcmV0dXJuIGU7Cgl9CglyZXR1cm4gTlVMTDsKfQoKLyoKICogdGhlIGxvYWRlciBpdHNlbGYKICovCnN0YXRpYyBpbnQgbG9hZF9taXNjX2JpbmFyeShzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKewoJTm9kZSAqZm10OwoJc3RydWN0IGZpbGUgKiBpbnRlcnBfZmlsZSA9IE5VTEw7CgljaGFyIGluYW1lW0JJTlBSTV9CVUZfU0laRV07CgljaGFyICppbmFtZV9hZGRyID0gaW5hbWU7CglpbnQgcmV0dmFsOwoJaW50IGZkX2JpbmFyeSA9IC0xOwoJc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMgPSBOVUxMOwoKCXJldHZhbCA9IC1FTk9FWEVDOwoJaWYgKCFlbmFibGVkKQoJCWdvdG8gX3JldDsKCgkvKiB0byBrZWVwIGxvY2tpbmcgdGltZSBsb3csIHdlIGNvcHkgdGhlIGludGVycHJldGVyIHN0cmluZyAqLwoJcmVhZF9sb2NrKCZlbnRyaWVzX2xvY2spOwoJZm10ID0gY2hlY2tfZmlsZShicHJtKTsKCWlmIChmbXQpCgkJc3RybGNweShpbmFtZSwgZm10LT5pbnRlcnByZXRlciwgQklOUFJNX0JVRl9TSVpFKTsKCXJlYWRfdW5sb2NrKCZlbnRyaWVzX2xvY2spOwoJaWYgKCFmbXQpCgkJZ290byBfcmV0OwoKCWlmICghKGZtdC0+ZmxhZ3MgJiBNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMCkpIHsKCQlyZW1vdmVfYXJnX3plcm8oYnBybSk7Cgl9CgoJaWYgKGZtdC0+ZmxhZ3MgJiBNSVNDX0ZNVF9PUEVOX0JJTkFSWSkgewoKCQlmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOwoJCXJldHZhbCA9IHVuc2hhcmVfZmlsZXMoKTsKCQlpZiAocmV0dmFsIDwgMCkKCQkJZ290byBfcmV0OwoJCWlmIChmaWxlcyA9PSBjdXJyZW50LT5maWxlcykgewoJCQlwdXRfZmlsZXNfc3RydWN0KGZpbGVzKTsKCQkJZmlsZXMgPSBOVUxMOwoJCX0KCQkvKiBpZiB0aGUgYmluYXJ5IHNob3VsZCBiZSBvcGVuZWQgb24gYmVoYWxmIG9mIHRoZQoJCSAqIGludGVycHJldGVyIHRoYW4ga2VlcCBpdCBvcGVuIGFuZCBhc3NpZ24gZGVzY3JpcHRvcgoJCSAqIHRvIGl0ICovCiAJCWZkX2JpbmFyeSA9IGdldF91bnVzZWRfZmQoKTsKIAkJaWYgKGZkX2JpbmFyeSA8IDApIHsKIAkJCXJldHZhbCA9IGZkX2JpbmFyeTsKIAkJCWdvdG8gX3Vuc2hhcmU7CiAJCX0KIAkJZmRfaW5zdGFsbChmZF9iaW5hcnksIGJwcm0tPmZpbGUpOwoKCQkvKiBpZiB0aGUgYmluYXJ5IGlzIG5vdCByZWFkYWJsZSB0aGFuIGVuZm9yY2UgbW0tPmR1bXBhYmxlPTAKCQkgICByZWdhcmRsZXNzIG9mIHRoZSBpbnRlcnByZXRlcidzIHBlcm1pc3Npb25zICovCgkJaWYgKGZpbGVfcGVybWlzc2lvbihicHJtLT5maWxlLCBNQVlfUkVBRCkpCgkJCWJwcm0tPmludGVycF9mbGFncyB8PSBCSU5QUk1fRkxBR1NfRU5GT1JDRV9OT05EVU1QOwoKCQlhbGxvd193cml0ZV9hY2Nlc3MoYnBybS0+ZmlsZSk7CgkJYnBybS0+ZmlsZSA9IE5VTEw7CgoJCS8qIG1hcmsgdGhlIGJwcm0gdGhhdCBmZCBzaG91bGQgYmUgcGFzc2VkIHRvIGludGVycCAqLwoJCWJwcm0tPmludGVycF9mbGFncyB8PSBCSU5QUk1fRkxBR1NfRVhFQ0ZEOwoJCWJwcm0tPmludGVycF9kYXRhID0gZmRfYmluYXJ5OwoKIAl9IGVsc2UgewogCQlhbGxvd193cml0ZV9hY2Nlc3MoYnBybS0+ZmlsZSk7CiAJCWZwdXQoYnBybS0+ZmlsZSk7CiAJCWJwcm0tPmZpbGUgPSBOVUxMOwogCX0KCS8qIG1ha2UgYXJndlsxXSBiZSB0aGUgcGF0aCB0byB0aGUgYmluYXJ5ICovCglyZXR2YWwgPSBjb3B5X3N0cmluZ3Nfa2VybmVsICgxLCAmYnBybS0+aW50ZXJwLCBicHJtKTsKCWlmIChyZXR2YWwgPCAwKQoJCWdvdG8gX2Vycm9yOwoJYnBybS0+YXJnYysrOwoKCS8qIGFkZCB0aGUgaW50ZXJwIGFzIGFyZ3ZbMF0gKi8KCXJldHZhbCA9IGNvcHlfc3RyaW5nc19rZXJuZWwgKDEsICZpbmFtZV9hZGRyLCBicHJtKTsKCWlmIChyZXR2YWwgPCAwKQoJCWdvdG8gX2Vycm9yOwoJYnBybS0+YXJnYyArKzsKCglicHJtLT5pbnRlcnAgPSBpbmFtZTsJLyogZm9yIGJpbmZtdF9zY3JpcHQgKi8KCglpbnRlcnBfZmlsZSA9IG9wZW5fZXhlYyAoaW5hbWUpOwoJcmV0dmFsID0gUFRSX0VSUiAoaW50ZXJwX2ZpbGUpOwoJaWYgKElTX0VSUiAoaW50ZXJwX2ZpbGUpKQoJCWdvdG8gX2Vycm9yOwoKCWJwcm0tPmZpbGUgPSBpbnRlcnBfZmlsZTsKCWlmIChmbXQtPmZsYWdzICYgTUlTQ19GTVRfQ1JFREVOVElBTFMpIHsKCQkvKgoJCSAqIE5vIG5lZWQgdG8gY2FsbCBwcmVwYXJlX2JpbnBybSgpLCBpdCdzIGFscmVhZHkgYmVlbgoJCSAqIGRvbmUuICBicHJtLT5idWYgaXMgc3RhbGUsIHVwZGF0ZSBmcm9tIGludGVycF9maWxlLgoJCSAqLwoJCW1lbXNldChicHJtLT5idWYsIDAsIEJJTlBSTV9CVUZfU0laRSk7CgkJcmV0dmFsID0ga2VybmVsX3JlYWQoYnBybS0+ZmlsZSwgMCwgYnBybS0+YnVmLCBCSU5QUk1fQlVGX1NJWkUpOwoJfSBlbHNlCgkJcmV0dmFsID0gcHJlcGFyZV9iaW5wcm0gKGJwcm0pOwoKCWlmIChyZXR2YWwgPCAwKQoJCWdvdG8gX2Vycm9yOwoKCXJldHZhbCA9IHNlYXJjaF9iaW5hcnlfaGFuZGxlciAoYnBybSwgcmVncyk7CglpZiAocmV0dmFsIDwgMCkKCQlnb3RvIF9lcnJvcjsKCglpZiAoZmlsZXMpIHsKCQlzdGVhbF9sb2NrcyhmaWxlcyk7CgkJcHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7CgkJZmlsZXMgPSBOVUxMOwoJfQpfcmV0OgoJcmV0dXJuIHJldHZhbDsKX2Vycm9yOgoJaWYgKGZkX2JpbmFyeSA+IDApCgkJc3lzX2Nsb3NlKGZkX2JpbmFyeSk7CglicHJtLT5pbnRlcnBfZmxhZ3MgPSAwOwoJYnBybS0+aW50ZXJwX2RhdGEgPSAwOwpfdW5zaGFyZToKCWlmIChmaWxlcykgewoJCXB1dF9maWxlc19zdHJ1Y3QoY3VycmVudC0+ZmlsZXMpOwoJCWN1cnJlbnQtPmZpbGVzID0gZmlsZXM7Cgl9Cglnb3RvIF9yZXQ7Cn0KCi8qIENvbW1hbmQgcGFyc2VycyAqLwoKLyoKICogcGFyc2VzIGFuZCBjb3BpZXMgb25lIGFyZ3VtZW50IGVuY2xvc2VkIGluIGRlbCBmcm9tICpzcCB0byAqZHAsCiAqIHJlY29nbmlzaW5nIHRoZSBceCBzcGVjaWFsLgogKiByZXR1cm5zIHBvaW50ZXIgdG8gdGhlIGNvcGllZCBhcmd1bWVudCBvciBOVUxMIGluIGNhc2Ugb2YgYW4KICogZXJyb3IgKGFuZCBzZXRzIGVycikgb3IgbnVsbCBhcmd1bWVudCBsZW5ndGguCiAqLwpzdGF0aWMgY2hhciAqc2NhbmFyZyhjaGFyICpzLCBjaGFyIGRlbCkKewoJY2hhciBjOwoKCXdoaWxlICgoYyA9ICpzKyspICE9IGRlbCkgewoJCWlmIChjID09ICdcXCcgJiYgKnMgPT0gJ3gnKSB7CgkJCXMrKzsKCQkJaWYgKCFpc3hkaWdpdCgqcysrKSkKCQkJCXJldHVybiBOVUxMOwoJCQlpZiAoIWlzeGRpZ2l0KCpzKyspKQoJCQkJcmV0dXJuIE5VTEw7CgkJfQoJfQoJcmV0dXJuIHM7Cn0KCnN0YXRpYyBpbnQgdW5xdW90ZShjaGFyICpmcm9tKQp7CgljaGFyIGMgPSAwLCAqcyA9IGZyb20sICpwID0gZnJvbTsKCgl3aGlsZSAoKGMgPSAqcysrKSAhPSAnXDAnKSB7CgkJaWYgKGMgPT0gJ1xcJyAmJiAqcyA9PSAneCcpIHsKCQkJcysrOwoJCQljID0gdG91cHBlcigqcysrKTsKCQkJKnAgPSAoYyAtIChpc2RpZ2l0KGMpID8gJzAnIDogJ0EnIC0gMTApKSA8PCA0OwoJCQljID0gdG91cHBlcigqcysrKTsKCQkJKnArKyB8PSBjIC0gKGlzZGlnaXQoYykgPyAnMCcgOiAnQScgLSAxMCk7CgkJCWNvbnRpbnVlOwoJCX0KCQkqcCsrID0gYzsKCX0KCXJldHVybiBwIC0gZnJvbTsKfQoKc3RhdGljIGlubGluZSBjaGFyICogY2hlY2tfc3BlY2lhbF9mbGFncyAoY2hhciAqIHNmcywgTm9kZSAqIGUpCnsKCWNoYXIgKiBwID0gc2ZzOwoJaW50IGNvbnQgPSAxOwoKCS8qIHNwZWNpYWwgZmxhZ3MgKi8KCXdoaWxlIChjb250KSB7CgkJc3dpdGNoICgqcCkgewoJCQljYXNlICdQJzoKCQkJCXArKzsKCQkJCWUtPmZsYWdzIHw9IE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ08nOgoJCQkJcCsrOwoJCQkJZS0+ZmxhZ3MgfD0gTUlTQ19GTVRfT1BFTl9CSU5BUlk7CgkJCQlicmVhazsKCQkJY2FzZSAnQyc6CgkJCQlwKys7CgkJCQkvKiB0aGlzIGZsYWdzIGFsc28gaW1wbGllcyB0aGUKCQkJCSAgIG9wZW4tYmluYXJ5IGZsYWcgKi8KCQkJCWUtPmZsYWdzIHw9IChNSVNDX0ZNVF9DUkVERU5USUFMUyB8CgkJCQkJCU1JU0NfRk1UX09QRU5fQklOQVJZKTsKCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJY29udCA9IDA7CgkJfQoJfQoKCXJldHVybiBwOwp9Ci8qCiAqIFRoaXMgcmVnaXN0ZXJzIGEgbmV3IGJpbmFyeSBmb3JtYXQsIGl0IHJlY29nbmlzZXMgdGhlIHN5bnRheAogKiAnOm5hbWU6dHlwZTpvZmZzZXQ6bWFnaWM6bWFzazppbnRlcnByZXRlcjpmbGFncycKICogd2hlcmUgdGhlICc6JyBpcyB0aGUgSUZTLCB0aGF0IGNhbiBiZSBjaG9zZW4gd2l0aCB0aGUgZmlyc3QgY2hhcgogKi8Kc3RhdGljIE5vZGUgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpCnsKCU5vZGUgKmU7CglpbnQgbWVtc2l6ZSwgZXJyOwoJY2hhciAqYnVmLCAqcDsKCWNoYXIgZGVsOwoKCS8qIHNvbWUgc2FuaXR5IGNoZWNrcyAqLwoJZXJyID0gLUVJTlZBTDsKCWlmICgoY291bnQgPCAxMSkgfHwgKGNvdW50ID4gMjU2KSkKCQlnb3RvIG91dDsKCgllcnIgPSAtRU5PTUVNOwoJbWVtc2l6ZSA9IHNpemVvZihOb2RlKSArIGNvdW50ICsgODsKCWUgPSAoTm9kZSAqKSBrbWFsbG9jKG1lbXNpemUsIEdGUF9VU0VSKTsKCWlmICghZSkKCQlnb3RvIG91dDsKCglwID0gYnVmID0gKGNoYXIgKillICsgc2l6ZW9mKE5vZGUpOwoKCW1lbXNldChlLCAwLCBzaXplb2YoTm9kZSkpOwoJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgYnVmZmVyLCBjb3VudCkpCgkJZ290byBFZmF1bHQ7CgoJZGVsID0gKnArKzsJLyogZGVsaW1ldGVyICovCgoJbWVtc2V0KGJ1Zitjb3VudCwgZGVsLCA4KTsKCgllLT5uYW1lID0gcDsKCXAgPSBzdHJjaHIocCwgZGVsKTsKCWlmICghcCkKCQlnb3RvIEVpbnZhbDsKCSpwKysgPSAnXDAnOwoJaWYgKCFlLT5uYW1lWzBdIHx8CgkgICAgIXN0cmNtcChlLT5uYW1lLCAiLiIpIHx8CgkgICAgIXN0cmNtcChlLT5uYW1lLCAiLi4iKSB8fAoJICAgIHN0cmNocihlLT5uYW1lLCAnLycpKQoJCWdvdG8gRWludmFsOwoJc3dpdGNoICgqcCsrKSB7CgkJY2FzZSAnRSc6IGUtPmZsYWdzID0gMTw8RW5hYmxlZDsgYnJlYWs7CgkJY2FzZSAnTSc6IGUtPmZsYWdzID0gKDE8PEVuYWJsZWQpIHwgKDE8PE1hZ2ljKTsgYnJlYWs7CgkJZGVmYXVsdDogZ290byBFaW52YWw7Cgl9CglpZiAoKnArKyAhPSBkZWwpCgkJZ290byBFaW52YWw7CglpZiAodGVzdF9iaXQoTWFnaWMsICZlLT5mbGFncykpIHsKCQljaGFyICpzID0gc3RyY2hyKHAsIGRlbCk7CgkJaWYgKCFzKQoJCQlnb3RvIEVpbnZhbDsKCQkqcysrID0gJ1wwJzsKCQllLT5vZmZzZXQgPSBzaW1wbGVfc3RydG91bChwLCAmcCwgMTApOwoJCWlmICgqcCsrKQoJCQlnb3RvIEVpbnZhbDsKCQllLT5tYWdpYyA9IHA7CgkJcCA9IHNjYW5hcmcocCwgZGVsKTsKCQlpZiAoIXApCgkJCWdvdG8gRWludmFsOwoJCXBbLTFdID0gJ1wwJzsKCQlpZiAoIWUtPm1hZ2ljWzBdKQoJCQlnb3RvIEVpbnZhbDsKCQllLT5tYXNrID0gcDsKCQlwID0gc2NhbmFyZyhwLCBkZWwpOwoJCWlmICghcCkKCQkJZ290byBFaW52YWw7CgkJcFstMV0gPSAnXDAnOwoJCWlmICghZS0+bWFza1swXSkKCQkJZS0+bWFzayA9IE5VTEw7CgkJZS0+c2l6ZSA9IHVucXVvdGUoZS0+bWFnaWMpOwoJCWlmIChlLT5tYXNrICYmIHVucXVvdGUoZS0+bWFzaykgIT0gZS0+c2l6ZSkKCQkJZ290byBFaW52YWw7CgkJaWYgKGUtPnNpemUgKyBlLT5vZmZzZXQgPiBCSU5QUk1fQlVGX1NJWkUpCgkJCWdvdG8gRWludmFsOwoJfSBlbHNlIHsKCQlwID0gc3RyY2hyKHAsIGRlbCk7CgkJaWYgKCFwKQoJCQlnb3RvIEVpbnZhbDsKCQkqcCsrID0gJ1wwJzsKCQllLT5tYWdpYyA9IHA7CgkJcCA9IHN0cmNocihwLCBkZWwpOwoJCWlmICghcCkKCQkJZ290byBFaW52YWw7CgkJKnArKyA9ICdcMCc7CgkJaWYgKCFlLT5tYWdpY1swXSB8fCBzdHJjaHIoZS0+bWFnaWMsICcvJykpCgkJCWdvdG8gRWludmFsOwoJCXAgPSBzdHJjaHIocCwgZGVsKTsKCQlpZiAoIXApCgkJCWdvdG8gRWludmFsOwoJCSpwKysgPSAnXDAnOwoJfQoJZS0+aW50ZXJwcmV0ZXIgPSBwOwoJcCA9IHN0cmNocihwLCBkZWwpOwoJaWYgKCFwKQoJCWdvdG8gRWludmFsOwoJKnArKyA9ICdcMCc7CglpZiAoIWUtPmludGVycHJldGVyWzBdKQoJCWdvdG8gRWludmFsOwoKCglwID0gY2hlY2tfc3BlY2lhbF9mbGFncyAocCwgZSk7CgoJaWYgKCpwID09ICdcbicpCgkJcCsrOwoJaWYgKHAgIT0gYnVmICsgY291bnQpCgkJZ290byBFaW52YWw7CglyZXR1cm4gZTsKCm91dDoKCXJldHVybiBFUlJfUFRSKGVycik7CgpFZmF1bHQ6CglrZnJlZShlKTsKCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOwpFaW52YWw6CglrZnJlZShlKTsKCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwp9CgovKgogKiBTZXQgc3RhdHVzIG9mIGVudHJ5L2JpbmZtdF9taXNjOgogKiAnMScgZW5hYmxlcywgJzAnIGRpc2FibGVzIGFuZCAnLTEnIGNsZWFycyBlbnRyeS9iaW5mbXRfbWlzYwogKi8Kc3RhdGljIGludCBwYXJzZV9jb21tYW5kKGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCkKewoJY2hhciBzWzRdOwoKCWlmICghY291bnQpCgkJcmV0dXJuIDA7CglpZiAoY291bnQgPiAzKQoJCXJldHVybiAtRUlOVkFMOwoJaWYgKGNvcHlfZnJvbV91c2VyKHMsIGJ1ZmZlciwgY291bnQpKQoJCXJldHVybiAtRUZBVUxUOwoJaWYgKHNbY291bnQtMV0gPT0gJ1xuJykKCQljb3VudC0tOwoJaWYgKGNvdW50ID09IDEgJiYgc1swXSA9PSAnMCcpCgkJcmV0dXJuIDE7CglpZiAoY291bnQgPT0gMSAmJiBzWzBdID09ICcxJykKCQlyZXR1cm4gMjsKCWlmIChjb3VudCA9PSAyICYmIHNbMF0gPT0gJy0nICYmIHNbMV0gPT0gJzEnKQoJCXJldHVybiAzOwoJcmV0dXJuIC1FSU5WQUw7Cn0KCi8qIGdlbmVyaWMgc3R1ZmYgKi8KCnN0YXRpYyB2b2lkIGVudHJ5X3N0YXR1cyhOb2RlICplLCBjaGFyICpwYWdlKQp7CgljaGFyICpkcDsKCWNoYXIgKnN0YXR1cyA9ICJkaXNhYmxlZCI7Cgljb25zdCBjaGFyICogZmxhZ3MgPSAiZmxhZ3M6ICI7CgoJaWYgKHRlc3RfYml0KEVuYWJsZWQsICZlLT5mbGFncykpCgkJc3RhdHVzID0gImVuYWJsZWQiOwoKCWlmICghVkVSQk9TRV9TVEFUVVMpIHsKCQlzcHJpbnRmKHBhZ2UsICIlc1xuIiwgc3RhdHVzKTsKCQlyZXR1cm47Cgl9CgoJc3ByaW50ZihwYWdlLCAiJXNcbmludGVycHJldGVyICVzXG4iLCBzdGF0dXMsIGUtPmludGVycHJldGVyKTsKCWRwID0gcGFnZSArIHN0cmxlbihwYWdlKTsKCgkvKiBwcmludCB0aGUgc3BlY2lhbCBmbGFncyAqLwoJc3ByaW50ZiAoZHAsICIlcyIsIGZsYWdzKTsKCWRwICs9IHN0cmxlbiAoZmxhZ3MpOwoJaWYgKGUtPmZsYWdzICYgTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjApIHsKCQkqZHAgKysgPSAnUCc7Cgl9CglpZiAoZS0+ZmxhZ3MgJiBNSVNDX0ZNVF9PUEVOX0JJTkFSWSkgewoJCSpkcCArKyA9ICdPJzsKCX0KCWlmIChlLT5mbGFncyAmIE1JU0NfRk1UX0NSRURFTlRJQUxTKSB7CgkJKmRwICsrID0gJ0MnOwoJfQoJKmRwICsrID0gJ1xuJzsKCgoJaWYgKCF0ZXN0X2JpdChNYWdpYywgJmUtPmZsYWdzKSkgewoJCXNwcmludGYoZHAsICJleHRlbnNpb24gLiVzXG4iLCBlLT5tYWdpYyk7Cgl9IGVsc2UgewoJCWludCBpOwoKCQlzcHJpbnRmKGRwLCAib2Zmc2V0ICVpXG5tYWdpYyAiLCBlLT5vZmZzZXQpOwoJCWRwID0gcGFnZSArIHN0cmxlbihwYWdlKTsKCQlmb3IgKGkgPSAwOyBpIDwgZS0+c2l6ZTsgaSsrKSB7CgkJCXNwcmludGYoZHAsICIlMDJ4IiwgMHhmZiAmIChpbnQpIChlLT5tYWdpY1tpXSkpOwoJCQlkcCArPSAyOwoJCX0KCQlpZiAoZS0+bWFzaykgewoJCQlzcHJpbnRmKGRwLCAiXG5tYXNrICIpOwoJCQlkcCArPSA2OwoJCQlmb3IgKGkgPSAwOyBpIDwgZS0+c2l6ZTsgaSsrKSB7CgkJCQlzcHJpbnRmKGRwLCAiJTAyeCIsIDB4ZmYgJiAoaW50KSAoZS0+bWFza1tpXSkpOwoJCQkJZHAgKz0gMjsKCQkJfQoJCX0KCQkqZHArKyA9ICdcbic7CgkJKmRwID0gJ1wwJzsKCX0KfQoKc3RhdGljIHN0cnVjdCBpbm9kZSAqYm1fZ2V0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBtb2RlKQp7CglzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IG5ld19pbm9kZShzYik7CgoJaWYgKGlub2RlKSB7CgkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CgkJaW5vZGUtPmlfdWlkID0gMDsKCQlpbm9kZS0+aV9naWQgPSAwOwoJCWlub2RlLT5pX2Jsa3NpemUgPSBQQUdFX0NBQ0hFX1NJWkU7CgkJaW5vZGUtPmlfYmxvY2tzID0gMDsKCQlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPQoJCQljdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpOwoJfQoJcmV0dXJuIGlub2RlOwp9CgpzdGF0aWMgdm9pZCBibV9jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQp7CglrZnJlZShpbm9kZS0+dS5nZW5lcmljX2lwKTsKfQoKc3RhdGljIHZvaWQga2lsbF9ub2RlKE5vZGUgKmUpCnsKCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKCgl3cml0ZV9sb2NrKCZlbnRyaWVzX2xvY2spOwoJZGVudHJ5ID0gZS0+ZGVudHJ5OwoJaWYgKGRlbnRyeSkgewoJCWxpc3RfZGVsX2luaXQoJmUtPmxpc3QpOwoJCWUtPmRlbnRyeSA9IE5VTEw7Cgl9Cgl3cml0ZV91bmxvY2soJmVudHJpZXNfbG9jayk7CgoJaWYgKGRlbnRyeSkgewoJCWRlbnRyeS0+ZF9pbm9kZS0+aV9ubGluay0tOwoJCWRfZHJvcChkZW50cnkpOwoJCWRwdXQoZGVudHJ5KTsKCQlzaW1wbGVfcmVsZWFzZV9mcygmYm1fbW50LCAmZW50cnlfY291bnQpOwoJfQp9CgovKiAvPGVudHJ5PiAqLwoKc3RhdGljIHNzaXplX3QKYm1fZW50cnlfcmVhZChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpCnsKCU5vZGUgKmUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+dS5nZW5lcmljX2lwOwoJbG9mZl90IHBvcyA9ICpwcG9zOwoJc3NpemVfdCByZXM7CgljaGFyICpwYWdlOwoJaW50IGxlbjsKCglpZiAoIShwYWdlID0gKGNoYXIqKSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCkpKQoJCXJldHVybiAtRU5PTUVNOwoKCWVudHJ5X3N0YXR1cyhlLCBwYWdlKTsKCWxlbiA9IHN0cmxlbihwYWdlKTsKCglyZXMgPSAtRUlOVkFMOwoJaWYgKHBvcyA8IDApCgkJZ290byBvdXQ7CglyZXMgPSAwOwoJaWYgKHBvcyA+PSBsZW4pCgkJZ290byBvdXQ7CglpZiAobGVuIDwgcG9zICsgbmJ5dGVzKQoJCW5ieXRlcyA9IGxlbiAtIHBvczsKCXJlcyA9IC1FRkFVTFQ7CglpZiAoY29weV90b191c2VyKGJ1ZiwgcGFnZSArIHBvcywgbmJ5dGVzKSkKCQlnb3RvIG91dDsKCSpwcG9zID0gcG9zICsgbmJ5dGVzOwoJcmVzID0gbmJ5dGVzOwpvdXQ6CglmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIHBhZ2UpOwoJcmV0dXJuIHJlczsKfQoKc3RhdGljIHNzaXplX3QgYm1fZW50cnlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCgkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKewoJc3RydWN0IGRlbnRyeSAqcm9vdDsKCU5vZGUgKmUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+dS5nZW5lcmljX2lwOwoJaW50IHJlcyA9IHBhcnNlX2NvbW1hbmQoYnVmZmVyLCBjb3VudCk7CgoJc3dpdGNoIChyZXMpIHsKCQljYXNlIDE6IGNsZWFyX2JpdChFbmFibGVkLCAmZS0+ZmxhZ3MpOwoJCQlicmVhazsKCQljYXNlIDI6IHNldF9iaXQoRW5hYmxlZCwgJmUtPmZsYWdzKTsKCQkJYnJlYWs7CgkJY2FzZSAzOiByb290ID0gZGdldChmaWxlLT5mX3Zmc21udC0+bW50X3NiLT5zX3Jvb3QpOwoJCQlkb3duKCZyb290LT5kX2lub2RlLT5pX3NlbSk7CgoJCQlraWxsX25vZGUoZSk7CgoJCQl1cCgmcm9vdC0+ZF9pbm9kZS0+aV9zZW0pOwoJCQlkcHV0KHJvb3QpOwoJCQlicmVhazsKCQlkZWZhdWx0OiByZXR1cm4gcmVzOwoJfQoJcmV0dXJuIGNvdW50Owp9CgpzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBibV9lbnRyeV9vcGVyYXRpb25zID0gewoJLnJlYWQJCT0gYm1fZW50cnlfcmVhZCwKCS53cml0ZQkJPSBibV9lbnRyeV93cml0ZSwKfTsKCi8qIC9yZWdpc3RlciAqLwoKc3RhdGljIHNzaXplX3QgYm1fcmVnaXN0ZXJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCgkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKewoJTm9kZSAqZTsKCXN0cnVjdCBpbm9kZSAqaW5vZGU7CglzdHJ1Y3QgZGVudHJ5ICpyb290LCAqZGVudHJ5OwoJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGZpbGUtPmZfdmZzbW50LT5tbnRfc2I7CglpbnQgZXJyID0gMDsKCgllID0gY3JlYXRlX2VudHJ5KGJ1ZmZlciwgY291bnQpOwoKCWlmIChJU19FUlIoZSkpCgkJcmV0dXJuIFBUUl9FUlIoZSk7CgoJcm9vdCA9IGRnZXQoc2ItPnNfcm9vdCk7Cglkb3duKCZyb290LT5kX2lub2RlLT5pX3NlbSk7CglkZW50cnkgPSBsb29rdXBfb25lX2xlbihlLT5uYW1lLCByb290LCBzdHJsZW4oZS0+bmFtZSkpOwoJZXJyID0gUFRSX0VSUihkZW50cnkpOwoJaWYgKElTX0VSUihkZW50cnkpKQoJCWdvdG8gb3V0OwoKCWVyciA9IC1FRVhJU1Q7CglpZiAoZGVudHJ5LT5kX2lub2RlKQoJCWdvdG8gb3V0MjsKCglpbm9kZSA9IGJtX2dldF9pbm9kZShzYiwgU19JRlJFRyB8IDA2NDQpOwoKCWVyciA9IC1FTk9NRU07CglpZiAoIWlub2RlKQoJCWdvdG8gb3V0MjsKCgllcnIgPSBzaW1wbGVfcGluX2ZzKCJiaW5mbXRfbWlzYyIsICZibV9tbnQsICZlbnRyeV9jb3VudCk7CglpZiAoZXJyKSB7CgkJaXB1dChpbm9kZSk7CgkJaW5vZGUgPSBOVUxMOwoJCWdvdG8gb3V0MjsKCX0KCgllLT5kZW50cnkgPSBkZ2V0KGRlbnRyeSk7Cglpbm9kZS0+dS5nZW5lcmljX2lwID0gZTsKCWlub2RlLT5pX2ZvcCA9ICZibV9lbnRyeV9vcGVyYXRpb25zOwoKCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7Cgl3cml0ZV9sb2NrKCZlbnRyaWVzX2xvY2spOwoJbGlzdF9hZGQoJmUtPmxpc3QsICZlbnRyaWVzKTsKCXdyaXRlX3VubG9jaygmZW50cmllc19sb2NrKTsKCgllcnIgPSAwOwpvdXQyOgoJZHB1dChkZW50cnkpOwpvdXQ6Cgl1cCgmcm9vdC0+ZF9pbm9kZS0+aV9zZW0pOwoJZHB1dChyb290KTsKCglpZiAoZXJyKSB7CgkJa2ZyZWUoZSk7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CglyZXR1cm4gY291bnQ7Cn0KCnN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJtX3JlZ2lzdGVyX29wZXJhdGlvbnMgPSB7Cgkud3JpdGUJCT0gYm1fcmVnaXN0ZXJfd3JpdGUsCn07CgovKiAvc3RhdHVzICovCgpzdGF0aWMgc3NpemVfdApibV9zdGF0dXNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwcG9zKQp7CgljaGFyICpzID0gZW5hYmxlZCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCI7CglpbnQgbGVuID0gc3RybGVuKHMpOwoJbG9mZl90IHBvcyA9ICpwcG9zOwoKCWlmIChwb3MgPCAwKQoJCXJldHVybiAtRUlOVkFMOwoJaWYgKHBvcyA+PSBsZW4pCgkJcmV0dXJuIDA7CglpZiAobGVuIDwgcG9zICsgbmJ5dGVzKQoJCW5ieXRlcyA9IGxlbiAtIHBvczsKCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBzICsgcG9zLCBuYnl0ZXMpKQoJCXJldHVybiAtRUZBVUxUOwoJKnBwb3MgPSBwb3MgKyBuYnl0ZXM7CglyZXR1cm4gbmJ5dGVzOwp9CgpzdGF0aWMgc3NpemVfdCBibV9zdGF0dXNfd3JpdGUoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKewoJaW50IHJlcyA9IHBhcnNlX2NvbW1hbmQoYnVmZmVyLCBjb3VudCk7CglzdHJ1Y3QgZGVudHJ5ICpyb290OwoKCXN3aXRjaCAocmVzKSB7CgkJY2FzZSAxOiBlbmFibGVkID0gMDsgYnJlYWs7CgkJY2FzZSAyOiBlbmFibGVkID0gMTsgYnJlYWs7CgkJY2FzZSAzOiByb290ID0gZGdldChmaWxlLT5mX3Zmc21udC0+bW50X3NiLT5zX3Jvb3QpOwoJCQlkb3duKCZyb290LT5kX2lub2RlLT5pX3NlbSk7CgoJCQl3aGlsZSAoIWxpc3RfZW1wdHkoJmVudHJpZXMpKQoJCQkJa2lsbF9ub2RlKGxpc3RfZW50cnkoZW50cmllcy5uZXh0LCBOb2RlLCBsaXN0KSk7CgoJCQl1cCgmcm9vdC0+ZF9pbm9kZS0+aV9zZW0pOwoJCQlkcHV0KHJvb3QpOwoJCWRlZmF1bHQ6IHJldHVybiByZXM7Cgl9CglyZXR1cm4gY291bnQ7Cn0KCnN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJtX3N0YXR1c19vcGVyYXRpb25zID0gewoJLnJlYWQJCT0gYm1fc3RhdHVzX3JlYWQsCgkud3JpdGUJCT0gYm1fc3RhdHVzX3dyaXRlLAp9OwoKLyogU3VwZXJibG9jayBoYW5kbGluZyAqLwoKc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHNfb3BzID0gewoJLnN0YXRmcwkJPSBzaW1wbGVfc3RhdGZzLAoJLmNsZWFyX2lub2RlCT0gYm1fY2xlYXJfaW5vZGUsCn07CgpzdGF0aWMgaW50IGJtX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIHZvaWQgKiBkYXRhLCBpbnQgc2lsZW50KQp7CglzdGF0aWMgc3RydWN0IHRyZWVfZGVzY3IgYm1fZmlsZXNbXSA9IHsKCQlbMV0gPSB7InN0YXR1cyIsICZibV9zdGF0dXNfb3BlcmF0aW9ucywgU19JV1VTUnxTX0lSVUdPfSwKCQlbMl0gPSB7InJlZ2lzdGVyIiwgJmJtX3JlZ2lzdGVyX29wZXJhdGlvbnMsIFNfSVdVU1J9LAoJCS8qIGxhc3Qgb25lICovIHsiIn0KCX07CglpbnQgZXJyID0gc2ltcGxlX2ZpbGxfc3VwZXIoc2IsIDB4NDI0OTRlNGQsIGJtX2ZpbGVzKTsKCWlmICghZXJyKQoJCXNiLT5zX29wID0gJnNfb3BzOwoJcmV0dXJuIGVycjsKfQoKc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqYm1fZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAoJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKewoJcmV0dXJuIGdldF9zYl9zaW5nbGUoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIGJtX2ZpbGxfc3VwZXIpOwp9CgpzdGF0aWMgc3RydWN0IGxpbnV4X2JpbmZtdCBtaXNjX2Zvcm1hdCA9IHsKCS5tb2R1bGUgPSBUSElTX01PRFVMRSwKCS5sb2FkX2JpbmFyeSA9IGxvYWRfbWlzY19iaW5hcnksCn07CgpzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYm1fZnNfdHlwZSA9IHsKCS5vd25lcgkJPSBUSElTX01PRFVMRSwKCS5uYW1lCQk9ICJiaW5mbXRfbWlzYyIsCgkuZ2V0X3NiCQk9IGJtX2dldF9zYiwKCS5raWxsX3NiCT0ga2lsbF9saXR0ZXJfc3VwZXIsCn07CgpzdGF0aWMgaW50IF9faW5pdCBpbml0X21pc2NfYmluZm10KHZvaWQpCnsKCWludCBlcnIgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZibV9mc190eXBlKTsKCWlmICghZXJyKSB7CgkJZXJyID0gcmVnaXN0ZXJfYmluZm10KCZtaXNjX2Zvcm1hdCk7CgkJaWYgKGVycikKCQkJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZibV9mc190eXBlKTsKCX0KCXJldHVybiBlcnI7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCBleGl0X21pc2NfYmluZm10KHZvaWQpCnsKCXVucmVnaXN0ZXJfYmluZm10KCZtaXNjX2Zvcm1hdCk7Cgl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmJtX2ZzX3R5cGUpOwp9Cgpjb3JlX2luaXRjYWxsKGluaXRfbWlzY19iaW5mbXQpOwptb2R1bGVfZXhpdChleGl0X21pc2NfYmluZm10KTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwo=