LyoKICogaXBjcy5jIC0tIHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIGFsbG9jYXRlZCBpcGMgcmVzb3VyY2VzLgogKgogKiAwMSBTZXB0IDIwMDQgLSBSb2RuZXkgUmFkZm9yZCA8cnJhZGZvcmRAbWluZHNwcmluZy5jb20+CiAqIEFkYXB0ZWQgZm9yIGJ1c3lib3ggZnJvbSB1dGlsLWxpbnV4LTIuMTJhLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQogKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAqCiAqIC0tLSBQcmUtYnVzeWJveCBoaXN0b3J5IGZyb20gdXRpbC1saW51eC0yLjEyYSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogMTk5OS0wMi0yMiBBcmthZGl1c3ogTWn/a2lld2ljeiA8bWlzaWVrQHBsZC5PUkcuUEw+CiAqIC0gYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKICoKICogUGF0Y2hlZCB0byBkaXNwbGF5IHRoZSBrZXkgZmllbGQgLS0gaHlAcGlja3N5cy5jb20gMTIvMTgvOTYKICoKICogUGF0Y2ggZnJvbSBhcm5vbGRzQGlmbnMuZGUgKEhlaW56LUFkbyBBcm5vbGRzKSBhcHBsaWVkIE1vbiBKdWwgMQogKiAxOTozMDo0MSAxOTk2IGJ5IGphbmxAbWF0aC51aW8ubm8gdG8gYWRkIGNvZGUgbWlzc2luZyBpbiBjYXNlIFBJRDoKICogY2xhdXNlcy4KICoKICogUGF0Y2hlcyBmcm9tIE1pa2UgSmFnZGlzIChqYWdneUBwdXJwbGV0LmRlbW9uLmNvLnVrKSBhcHBsaWVkCiAqIFdlZCBGZWIgOCAxMjoxMjoyMSAxOTk1IGJ5IGZhaXRoQGNzLnVuYy5lZHUgdG8gcHJpbnQgbnVtZXJpYyB1aWRzCiAqIGlmIG5vIHBhc3N3ZCBmaWxlIGVudHJ5LgogKgogKiBNb2RpZmllZCBTYXQgT2N0ICA5IDEwOjU1OjI4IDE5OTMgZm9yIDAuOTkuMTMKICogT3JpZ2luYWwgYXV0aG9yIHVua25vd24sIG1heSBiZSAia3Jpc2huYSBiYWxhc3ViQGNpcy5vaGlvLXN0YXRlLmVkdSIKICoKICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8Z2V0b3B0Lmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8cHdkLmg+CiNpbmNsdWRlIDxncnAuaD4KCi8qIFgvT1BFTiB0ZWxscyB1cyB0byB1c2UgPHN5cy97dHlwZXMsaXBjLHNlbX0uaD4gZm9yIHNlbWN0bCgpICovCi8qIFgvT1BFTiB0ZWxscyB1cyB0byB1c2UgPHN5cy97dHlwZXMsaXBjLG1zZ30uaD4gZm9yIG1zZ2N0bCgpICovCi8qIFgvT1BFTiB0ZWxscyB1cyB0byB1c2UgPHN5cy97dHlwZXMsaXBjLHNobX0uaD4gZm9yIHNobWN0bCgpICovCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9pcGMuaD4KI2luY2x1ZGUgPHN5cy9zZW0uaD4KI2luY2x1ZGUgPHN5cy9tc2cuaD4KI2luY2x1ZGUgPHN5cy9zaG0uaD4KCiNpbmNsdWRlICJidXN5Ym94LmgiCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBTSE1fREVTVCBhbmQgU0hNX0xPQ0tFRCBhcmUgZGVmaW5lZCBpbiBrZXJuZWwgaGVhZGVycywKICAgYnV0IGluc2lkZSAjaWZkZWYgX19LRVJORUxfXyAuLi4gI2VuZGlmICovCiNpZm5kZWYgU0hNX0RFU1QKLyogc2htX21vZGUgdXBwZXIgYnl0ZSBmbGFncyAqLwojZGVmaW5lIFNITV9ERVNUICAgICAgICAwMTAwMCAgIC8qIHNlZ21lbnQgd2lsbCBiZSBkZXN0cm95ZWQgb24gbGFzdCBkZXRhY2ggKi8KI2RlZmluZSBTSE1fTE9DS0VEICAgICAgMDIwMDAgICAvKiBzZWdtZW50IHdpbGwgbm90IGJlIHN3YXBwZWQgKi8KI2VuZGlmCgovKiBGb3Igb2xkZXIga2VybmVscyB0aGUgc2FtZSBob2xkcyBmb3IgdGhlIGRlZmluZXMgYmVsb3cgKi8KI2lmbmRlZiBNU0dfU1RBVAojZGVmaW5lIE1TR19TVEFUCTExCiNkZWZpbmUgTVNHX0lORk8JMTIKI2VuZGlmCgojaWZuZGVmIFNITV9TVEFUCiNkZWZpbmUgU0hNX1NUQVQgICAgICAgIDEzCiNkZWZpbmUgU0hNX0lORk8gICAgICAgIDE0CnN0cnVjdCBzaG1faW5mbyB7CgkgaW50ICAgdXNlZF9pZHM7CgkgdWxvbmcgc2htX3RvdDsgLyogdG90YWwgYWxsb2NhdGVkIHNobSAqLwoJIHVsb25nIHNobV9yc3M7IC8qIHRvdGFsIHJlc2lkZW50IHNobSAqLwoJIHVsb25nIHNobV9zd3A7IC8qIHRvdGFsIHN3YXBwZWQgc2htICovCgkgdWxvbmcgc3dhcF9hdHRlbXB0czsKCSB1bG9uZyBzd2FwX3N1Y2Nlc3NlczsKfTsKI2VuZGlmCgojaWZuZGVmIFNFTV9TVEFUCiNkZWZpbmUgU0VNX1NUQVQJMTgKI2RlZmluZSBTRU1fSU5GTwkxOQojZW5kaWYKCi8qIFNvbWUgdmVyc2lvbnMgb2YgbGliYyBvbmx5IGRlZmluZSBJUENfSU5GTyB3aGVuIF9fVVNFX0dOVSBpcyBkZWZpbmVkLiAqLwojaWZuZGVmIElQQ19JTkZPCiNkZWZpbmUgSVBDX0lORk8gICAgICAgIDMKI2VuZGlmCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKiBUaGUgbGFzdCBhcmcgb2Ygc2VtY3RsIGlzIGEgdW5pb24gc2VtdW4sIGJ1dCB3aGVyZSBpcyBpdCBkZWZpbmVkPwogICBYL09QRU4gdGVsbHMgdXMgdG8gZGVmaW5lIGl0IG91cnNlbHZlcywgYnV0IHVudGlsIHJlY2VudGx5CiAgIExpbnV4IGluY2x1ZGUgZmlsZXMgd291bGQgYWxzbyBkZWZpbmUgaXQuICovCiNpZiBkZWZpbmVkIChfX0dOVV9MSUJSQVJZX18pICYmICFkZWZpbmVkKF9TRU1fU0VNVU5fVU5ERUZJTkVEKQovKiB1bmlvbiBzZW11biBpcyBkZWZpbmVkIGJ5IGluY2x1ZGluZyA8c3lzL3NlbS5oPiAqLwojZWxzZQovKiBhY2NvcmRpbmcgdG8gWC9PUEVOIHdlIGhhdmUgdG8gZGVmaW5lIGl0IG91cnNlbHZlcyAqLwp1bmlvbiBzZW11biB7CglpbnQgdmFsOwoJc3RydWN0IHNlbWlkX2RzICpidWY7Cgl1bnNpZ25lZCBzaG9ydCBpbnQgKmFycmF5OwoJc3RydWN0IHNlbWluZm8gKl9fYnVmOwp9OwojZW5kaWYKCi8qIFgvT1BFTiAoSmFuIDE5ODcpIGRvZXMgbm90IGRlZmluZSBmaWVsZHMga2V5LCBzZXEgaW4gc3RydWN0IGlwY19wZXJtOwogICBsaWJjIDQvNSBkb2VzIG5vdCBtZW50aW9uIHN0cnVjdCBpcGNfdGVybSBhdCBhbGwsIGJ1dCBpbmNsdWRlcwogICA8bGludXgvaXBjLmg+LCB3aGljaCBkZWZpbmVzIGEgc3RydWN0IGlwY19wZXJtIHdpdGggc3VjaCBmaWVsZHMuCiAgIGdsaWJjLTEuMDkgaGFzIG5vIHN1cHBvcnQgZm9yIHN5c3YgaXBjLgogICBnbGliYyAyIHVzZXMgX19rZXksIF9fc2VxICovCiNpZiBkZWZpbmVkIChfX0dOVV9MSUJSQVJZX18pICYmIF9fR05VX0xJQlJBUllfXyA+IDEKI2RlZmluZSBLRVkgX19rZXkKI2Vsc2UKI2RlZmluZSBLRVkga2V5CiNlbmRpZgoKI2RlZmluZSBMSU1JVFMgMQojZGVmaW5lIFNUQVRVUyAyCiNkZWZpbmUgQ1JFQVRPUiAzCiNkZWZpbmUgVElNRSA0CiNkZWZpbmUgUElEIDUKCnN0YXRpYyB2b2lkIGRvX3NobSAoY2hhciBmb3JtYXQpOwpzdGF0aWMgdm9pZCBkb19zZW0gKGNoYXIgZm9ybWF0KTsKc3RhdGljIHZvaWQgZG9fbXNnIChjaGFyIGZvcm1hdCk7CnN0YXRpYyB2b2lkIHByaW50X3NobSAoaW50IGlkKTsKc3RhdGljIHZvaWQgcHJpbnRfbXNnIChpbnQgaWQpOwpzdGF0aWMgdm9pZCBwcmludF9zZW0gKGludCBpZCk7CgppbnQgaXBjc19tYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKCWludCBvcHQsIG1zZyA9IDAsIHNlbSA9IDAsIHNobSA9IDAsIGlkPTAsIHByaW50PTA7CgljaGFyIGZvcm1hdCA9IDA7CgljaGFyIG9wdGlvbnNbXSA9ICJhdGNsdXBzbXFpOmloPyI7CgoJd2hpbGUgKChvcHQgPSBnZXRvcHQgKGFyZ2MsIGFyZ3YsIG9wdGlvbnMpKSAhPSAtMSkgewoJCXN3aXRjaCAob3B0KSB7CgkJY2FzZSAnaSc6CgkJCWlkID0gYXRvaSAob3B0YXJnKTsKCQkJcHJpbnQgPSAxOwoJCQlicmVhazsKCQljYXNlICdhJzoKCQkJbXNnID0gc2htID0gc2VtID0gMTsKCQkJYnJlYWs7CgkJY2FzZSAncSc6CgkJCW1zZyA9IDE7CgkJCWJyZWFrOwoJCWNhc2UgJ3MnOgoJCQlzZW0gPSAxOwoJCQlicmVhazsKCQljYXNlICdtJzoKCQkJc2htID0gMTsKCQkJYnJlYWs7CgkJY2FzZSAndCc6CgkJCWZvcm1hdCA9IFRJTUU7CgkJCWJyZWFrOwoJCWNhc2UgJ2MnOgoJCQlmb3JtYXQgPSBDUkVBVE9SOwoJCQlicmVhazsKCQljYXNlICdwJzoKCQkJZm9ybWF0ID0gUElEOwoJCQlicmVhazsKCQljYXNlICdsJzoKCQkJZm9ybWF0ID0gTElNSVRTOwoJCQlicmVhazsKCQljYXNlICd1JzoKCQkJZm9ybWF0ID0gU1RBVFVTOwoJCQlicmVhazsKCQljYXNlICdoJzoKCQljYXNlICc/JzoKCQkJYmJfc2hvd191c2FnZSgpOwoJCQliYl9mZmx1c2hfc3Rkb3V0X2FuZF9leGl0ICgwKTsKCQl9Cgl9CgoJaWYgIChwcmludCkgewoJCWlmIChzaG0pIHsKCQkJcHJpbnRfc2htIChpZCk7CgkJCWJiX2ZmbHVzaF9zdGRvdXRfYW5kX2V4aXQgKDApOwoJCX0KCQlpZiAoc2VtKSB7CgkJCXByaW50X3NlbSAoaWQpOwoJCQliYl9mZmx1c2hfc3Rkb3V0X2FuZF9leGl0ICgwKTsKCQl9CgkJaWYgKG1zZykgewoJCQlwcmludF9tc2cgKGlkKTsKCQkJYmJfZmZsdXNoX3N0ZG91dF9hbmRfZXhpdCAoMCk7CgkJfQoJCWJiX3Nob3dfdXNhZ2UoKTsKCQliYl9mZmx1c2hfc3Rkb3V0X2FuZF9leGl0ICgwKTsKCX0KCglpZiAoICFzaG0gJiYgIW1zZyAmJiAhc2VtKQoJCW1zZyA9IHNlbSA9IHNobSA9IDE7CgliYl9wcmludGYgKCJcbiIpOwoKCWlmIChzaG0pIHsKCQlkb19zaG0gKGZvcm1hdCk7CgkJYmJfcHJpbnRmICgiXG4iKTsKCX0KCWlmIChzZW0pIHsKCQlkb19zZW0gKGZvcm1hdCk7CgkJYmJfcHJpbnRmICgiXG4iKTsKCX0KCWlmIChtc2cpIHsKCQlkb19tc2cgKGZvcm1hdCk7CgkJYmJfcHJpbnRmICgiXG4iKTsKCX0KCXJldHVybiAwOwp9CgoKc3RhdGljIHZvaWQKcHJpbnRfcGVybXMgKGludCBpZCwgc3RydWN0IGlwY19wZXJtICppcGNwKSB7CglzdHJ1Y3QgcGFzc3dkICpwdzsKCXN0cnVjdCBncm91cCAqZ3I7CgoJYmJfcHJpbnRmICgiJS0xMGQgJS0xMG8iLCBpZCwgaXBjcC0+bW9kZSAmIDA3NzcpOwoKCWlmICgocHcgPSBnZXRwd3VpZChpcGNwLT5jdWlkKSkpCgkJYmJfcHJpbnRmKCIgJS0xMHMiLCBwdy0+cHdfbmFtZSk7CgllbHNlCgkJYmJfcHJpbnRmKCIgJS0xMGQiLCBpcGNwLT5jdWlkKTsKCWlmICgoZ3IgPSBnZXRncmdpZChpcGNwLT5jZ2lkKSkpCgkJYmJfcHJpbnRmKCIgJS0xMHMiLCBnci0+Z3JfbmFtZSk7CgllbHNlCgkJYmJfcHJpbnRmKCIgJS0xMGQiLCBpcGNwLT5jZ2lkKTsKCglpZiAoKHB3ID0gZ2V0cHd1aWQoaXBjcC0+dWlkKSkpCgkJYmJfcHJpbnRmKCIgJS0xMHMiLCBwdy0+cHdfbmFtZSk7CgllbHNlCgkJYmJfcHJpbnRmKCIgJS0xMGQiLCBpcGNwLT51aWQpOwoJaWYgKChnciA9IGdldGdyZ2lkKGlwY3AtPmdpZCkpKQoJCWJiX3ByaW50ZigiICUtMTBzXG4iLCBnci0+Z3JfbmFtZSk7CgllbHNlCgkJYmJfcHJpbnRmKCIgJS0xMGRcbiIsIGlwY3AtPmdpZCk7Cn0KCgp2b2lkIGRvX3NobSAoY2hhciBmb3JtYXQpCnsKCWludCBtYXhpZCwgc2htaWQsIGlkOwoJc3RydWN0IHNobWlkX2RzIHNobXNlZzsKCXN0cnVjdCBzaG1faW5mbyBzaG1faW5mbzsKCXN0cnVjdCBzaG1pbmZvIHNobWluZm87CglzdHJ1Y3QgaXBjX3Blcm0gKmlwY3AgPSAmc2htc2VnLnNobV9wZXJtOwoJc3RydWN0IHBhc3N3ZCAqcHc7CgoJbWF4aWQgPSBzaG1jdGwgKDAsIFNITV9JTkZPLCAoc3RydWN0IHNobWlkX2RzICopICh2b2lkICopICZzaG1faW5mbyk7CglpZiAobWF4aWQgPCAwKSB7CgkJYmJfcHJpbnRmICgia2VybmVsIG5vdCBjb25maWd1cmVkIGZvciBzaGFyZWQgbWVtb3J5XG4iKTsKCQlyZXR1cm47Cgl9CgoJc3dpdGNoIChmb3JtYXQpIHsKCWNhc2UgTElNSVRTOgoJCWJiX3ByaW50ZiAoIi0tLS0tLSBTaGFyZWQgTWVtb3J5IExpbWl0cyAtLS0tLS0tLVxuIik7CgkJaWYgKChzaG1jdGwgKDAsIElQQ19JTkZPLCAoc3RydWN0IHNobWlkX2RzICopICh2b2lkICopICZzaG1pbmZvKSkgPCAwICkKCQkJcmV0dXJuOwoJCS8qIGdsaWJjIDIuMS4zIGFuZCBhbGwgZWFybGllciBsaWJjJ3MgaGF2ZSBpbnRzIGFzIGZpZWxkcwoJCSAgIG9mIHN0cnVjdCBzaG1pbmZvOyBnbGliYyAyLjEuOTEgaGFzIHVuc2lnbmVkIGxvbmc7IGFjaCAqLwoJCWJiX3ByaW50ZiAoIm1heCBudW1iZXIgb2Ygc2VnbWVudHMgPSAlbHVcbiIsCgkJCSh1bnNpZ25lZCBsb25nKSBzaG1pbmZvLnNobW1uaSk7CgkJYmJfcHJpbnRmICgibWF4IHNlZyBzaXplIChrYnl0ZXMpID0gJWx1XG4iLAoJCQkodW5zaWduZWQgbG9uZykgKHNobWluZm8uc2htbWF4ID4+IDEwKSk7CgkJYmJfcHJpbnRmICgibWF4IHRvdGFsIHNoYXJlZCBtZW1vcnkgKHBhZ2VzKSA9ICVsdVxuIiwKCQkJKHVuc2lnbmVkIGxvbmcpIHNobWluZm8uc2htYWxsKTsKCQliYl9wcmludGYgKCJtaW4gc2VnIHNpemUgKGJ5dGVzKSA9ICVsdVxuIiwKCQkJKHVuc2lnbmVkIGxvbmcpIHNobWluZm8uc2htbWluKTsKCQlyZXR1cm47CgoJY2FzZSBTVEFUVVM6CgkJYmJfcHJpbnRmICgiLS0tLS0tIFNoYXJlZCBNZW1vcnkgU3RhdHVzIC0tLS0tLS0tXG4iKTsKCQliYl9wcmludGYgKCJzZWdtZW50cyBhbGxvY2F0ZWQgJWRcbiIsIHNobV9pbmZvLnVzZWRfaWRzKTsKCQliYl9wcmludGYgKCJwYWdlcyBhbGxvY2F0ZWQgJWxkXG4iLCBzaG1faW5mby5zaG1fdG90KTsKCQliYl9wcmludGYgKCJwYWdlcyByZXNpZGVudCAgJWxkXG4iLCBzaG1faW5mby5zaG1fcnNzKTsKCQliYl9wcmludGYgKCJwYWdlcyBzd2FwcGVkICAgJWxkXG4iLCBzaG1faW5mby5zaG1fc3dwKTsKCQliYl9wcmludGYgKCJTd2FwIHBlcmZvcm1hbmNlOiAlbGQgYXR0ZW1wdHNcdCAlbGQgc3VjY2Vzc2VzXG4iLAoJCQlzaG1faW5mby5zd2FwX2F0dGVtcHRzLCBzaG1faW5mby5zd2FwX3N1Y2Nlc3Nlcyk7CgkJcmV0dXJuOwoKCWNhc2UgQ1JFQVRPUjoKCQliYl9wcmludGYgKCItLS0tLS0gU2hhcmVkIE1lbW9yeSBTZWdtZW50IENyZWF0b3JzL093bmVycyAtLS0tLS0tLVxuIik7CgkJYmJfcHJpbnRmICgiJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHNcbiIsCgkJICJzaG1pZCIsInBlcm1zIiwiY3VpZCIsImNnaWQiLCJ1aWQiLCJnaWQiKTsKCQlicmVhazsKCgljYXNlIFRJTUU6CgkJYmJfcHJpbnRmICgiLS0tLS0tIFNoYXJlZCBNZW1vcnkgQXR0YWNoL0RldGFjaC9DaGFuZ2UgVGltZXMgLS0tLS0tLS1cbiIpOwoJCWJiX3ByaW50ZiAoIiUtMTBzICUtMTBzICUtMjBzICUtMjBzICUtMjBzXG4iLAoJCQkic2htaWQiLCJvd25lciIsImF0dGFjaGVkIiwiZGV0YWNoZWQiLCJjaGFuZ2VkIik7CgkJYnJlYWs7CgoJY2FzZSBQSUQ6CgkJYmJfcHJpbnRmICgiLS0tLS0tIFNoYXJlZCBNZW1vcnkgQ3JlYXRvci9MYXN0LW9wIC0tLS0tLS0tXG4iKTsKCQliYl9wcmludGYgKCIlLTEwcyAlLTEwcyAlLTEwcyAlLTEwc1xuIiwKCQkJInNobWlkIiwib3duZXIiLCJjcGlkIiwibHBpZCIpOwoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJYmJfcHJpbnRmICgiLS0tLS0tIFNoYXJlZCBNZW1vcnkgU2VnbWVudHMgLS0tLS0tLS1cbiIpOwoJCWJiX3ByaW50ZiAoIiUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTJzXG4iLAoJCQkia2V5Iiwic2htaWQiLCJvd25lciIsInBlcm1zIiwiYnl0ZXMiLCJuYXR0Y2giLCJzdGF0dXMiKTsKCQlicmVhazsKCX0KCglmb3IgKGlkID0gMDsgaWQgPD0gbWF4aWQ7IGlkKyspIHsKCQlzaG1pZCA9IHNobWN0bCAoaWQsIFNITV9TVEFULCAmc2htc2VnKTsKCQlpZiAoc2htaWQgPCAwKQoJCQljb250aW51ZTsKCQlpZiAoZm9ybWF0ID09IENSRUFUT1IpICB7CgkJCXByaW50X3Blcm1zIChzaG1pZCwgaXBjcCk7CgkJCWNvbnRpbnVlOwoJCX0KCQlwdyA9IGdldHB3dWlkKGlwY3AtPnVpZCk7CgkJc3dpdGNoIChmb3JtYXQpIHsKCQljYXNlIFRJTUU6CgkJCWlmIChwdykKCQkJCWJiX3ByaW50ZiAoIiUtMTBkICUtMTAuMTBzIiwgc2htaWQsIHB3LT5wd19uYW1lKTsKCQkJZWxzZQoJCQkJYmJfcHJpbnRmICgiJS0xMGQgJS0xMGQiLCBzaG1pZCwgaXBjcC0+dWlkKTsKCQkJLyogY3RpbWUgdXNlcyBzdGF0aWMgYnVmZmVyOiB1c2Ugc2VwYXJhdGUgY2FsbHMgKi8KCQkJYmJfcHJpbnRmKCIgICUtMjAuMTZzIiwgc2htc2VnLnNobV9hdGltZQoJCQkJICAgPyBjdGltZSgmc2htc2VnLnNobV9hdGltZSkgKyA0IDogIk5vdCBzZXQiKTsKCQkJYmJfcHJpbnRmKCIgJS0yMC4xNnMiLCBzaG1zZWcuc2htX2R0aW1lCgkJCQkgICA/IGN0aW1lKCZzaG1zZWcuc2htX2R0aW1lKSArIDQgOiAiTm90IHNldCIpOwoJCQliYl9wcmludGYoIiAlLTIwLjE2c1xuIiwgc2htc2VnLnNobV9jdGltZQoJCQkJICAgPyBjdGltZSgmc2htc2VnLnNobV9jdGltZSkgKyA0IDogIk5vdCBzZXQiKTsKCQkJYnJlYWs7CgkJY2FzZSBQSUQ6CgkJCWlmIChwdykKCQkJCWJiX3ByaW50ZiAoIiUtMTBkICUtMTAuMTBzIiwgc2htaWQsIHB3LT5wd19uYW1lKTsKCQkJZWxzZQoJCQkJYmJfcHJpbnRmICgiJS0xMGQgJS0xMGQiLCBzaG1pZCwgaXBjcC0+dWlkKTsKCQkJYmJfcHJpbnRmICgiICUtMTBkICUtMTBkXG4iLAoJCQkJc2htc2VnLnNobV9jcGlkLCBzaG1zZWcuc2htX2xwaWQpOwoJCQlicmVhazsKCgkJZGVmYXVsdDoKCQkJCWJiX3ByaW50ZigiMHglMDh4ICIsaXBjcC0+S0VZICk7CgkJCWlmIChwdykKCQkJCWJiX3ByaW50ZiAoIiUtMTBkICUtMTAuMTBzIiwgc2htaWQsIHB3LT5wd19uYW1lKTsKCQkJZWxzZQoJCQkJYmJfcHJpbnRmICgiJS0xMGQgJS0xMGQiLCBzaG1pZCwgaXBjcC0+dWlkKTsKCQkJYmJfcHJpbnRmICgiJS0xMG8gJS0xMGx1ICUtMTBsZCAlLTZzICUtNnNcbiIsCgkJCQlpcGNwLT5tb2RlICYgMDc3NywKCQkJCS8qCgkJCQkgKiBlYXJsaWVyOiBpbnQsIEF1c3RpbiBoYXMgc2l6ZV90CgkJCQkgKi8KCQkJCSh1bnNpZ25lZCBsb25nKSBzaG1zZWcuc2htX3NlZ3N6LAoJCQkJLyoKCQkJCSAqIGdsaWJjLTIuMS4zIGFuZCBlYXJsaWVyIGhhcyB1bnNpZ25lZCBzaG9ydDsKCQkJCSAqIEF1c3RpbiBoYXMgc2htYXR0X3QKCQkJCSAqLwoJCQkJKGxvbmcpIHNobXNlZy5zaG1fbmF0dGNoLAoJCQkJaXBjcC0+bW9kZSAmIFNITV9ERVNUID8gImRlc3QiIDogIiAiLAoJCQkJaXBjcC0+bW9kZSAmIFNITV9MT0NLRUQgPyAibG9ja2VkIiA6ICIgIik7CgkJCWJyZWFrOwoJCX0KCX0KCXJldHVybjsKfQoKCnZvaWQgZG9fc2VtIChjaGFyIGZvcm1hdCkKewoJaW50IG1heGlkLCBzZW1pZCwgaWQ7CglzdHJ1Y3Qgc2VtaWRfZHMgc2VtYXJ5OwoJc3RydWN0IHNlbWluZm8gc2VtaW5mbzsKCXN0cnVjdCBpcGNfcGVybSAqaXBjcCA9ICZzZW1hcnkuc2VtX3Blcm07CglzdHJ1Y3QgcGFzc3dkICpwdzsKCXVuaW9uIHNlbXVuIGFyZzsKCglhcmcuYXJyYXkgPSAodXNob3J0ICopICAodm9pZCAqKSAmc2VtaW5mbzsKCW1heGlkID0gc2VtY3RsICgwLCAwLCBTRU1fSU5GTywgYXJnKTsKCWlmIChtYXhpZCA8IDApIHsKCQliYl9wcmludGYgKCJrZXJuZWwgbm90IGNvbmZpZ3VyZWQgZm9yIHNlbWFwaG9yZXNcbiIpOwoJCXJldHVybjsKCX0KCglzd2l0Y2ggKGZvcm1hdCkgewoJY2FzZSBMSU1JVFM6CgkJYmJfcHJpbnRmICgiLS0tLS0tIFNlbWFwaG9yZSBMaW1pdHMgLS0tLS0tLS1cbiIpOwoJCWFyZy5hcnJheSA9ICh1c2hvcnQgKikgKHZvaWQgKikgJnNlbWluZm87IC8qIGRhbW4gdW5pb24gKi8KCQlpZiAoKHNlbWN0bCAoMCwgMCwgSVBDX0lORk8sIGFyZykpIDwgMCApCgkJCXJldHVybjsKCQliYl9wcmludGYgKCJtYXggbnVtYmVyIG9mIGFycmF5cyA9ICVkXG4iLCBzZW1pbmZvLnNlbW1uaSk7CgkJYmJfcHJpbnRmICgibWF4IHNlbWFwaG9yZXMgcGVyIGFycmF5ID0gJWRcbiIsIHNlbWluZm8uc2VtbXNsKTsKCQliYl9wcmludGYgKCJtYXggc2VtYXBob3JlcyBzeXN0ZW0gd2lkZSA9ICVkXG4iLCBzZW1pbmZvLnNlbW1ucyk7CgkJYmJfcHJpbnRmICgibWF4IG9wcyBwZXIgc2Vtb3AgY2FsbCA9ICVkXG4iLCBzZW1pbmZvLnNlbW9wbSk7CgkJYmJfcHJpbnRmICgic2VtYXBob3JlIG1heCB2YWx1ZSA9ICVkXG4iLCBzZW1pbmZvLnNlbXZteCk7CgkJcmV0dXJuOwoKCWNhc2UgU1RBVFVTOgoJCWJiX3ByaW50ZiAoIi0tLS0tLSBTZW1hcGhvcmUgU3RhdHVzIC0tLS0tLS0tXG4iKTsKCQliYl9wcmludGYgKCJ1c2VkIGFycmF5cyA9ICVkXG4iLCBzZW1pbmZvLnNlbXVzeik7CgkJYmJfcHJpbnRmICgiYWxsb2NhdGVkIHNlbWFwaG9yZXMgPSAlZFxuIiwgc2VtaW5mby5zZW1hZW0pOwoJCXJldHVybjsKCgljYXNlIENSRUFUT1I6CgkJYmJfcHJpbnRmICgiLS0tLS0tIFNlbWFwaG9yZSBBcnJheXMgQ3JlYXRvcnMvT3duZXJzIC0tLS0tLS0tXG4iKTsKCQliYl9wcmludGYgKCIlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwc1xuIiwKCQkgInNlbWlkIiwicGVybXMiLCJjdWlkIiwiY2dpZCIsInVpZCIsImdpZCIpOwoJCWJyZWFrOwoKCWNhc2UgVElNRToKCQliYl9wcmludGYgKCItLS0tLS0gU2hhcmVkIE1lbW9yeSBPcGVyYXRpb24vQ2hhbmdlIFRpbWVzIC0tLS0tLS0tXG4iKTsKCQliYl9wcmludGYgKCIlLThzICUtMTBzICUtMjYuMjRzICUtMjYuMjRzXG4iLAoJCQkic2htaWQiLCJvd25lciIsImxhc3Qtb3AiLCJsYXN0LWNoYW5nZWQiKTsKCQlicmVhazsKCgljYXNlIFBJRDoKCQlicmVhazsKCglkZWZhdWx0OgoJCWJiX3ByaW50ZiAoIi0tLS0tLSBTZW1hcGhvcmUgQXJyYXlzIC0tLS0tLS0tXG4iKTsKCQliYl9wcmludGYgKCIlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwc1xuIiwKCQkJImtleSIsInNlbWlkIiwib3duZXIiLCJwZXJtcyIsIm5zZW1zIik7CgkJYnJlYWs7Cgl9CgoJZm9yIChpZCA9IDA7IGlkIDw9IG1heGlkOyBpZCsrKSB7CgkJYXJnLmJ1ZiA9IChzdHJ1Y3Qgc2VtaWRfZHMgKikgJnNlbWFyeTsKCQlzZW1pZCA9IHNlbWN0bCAoaWQsIDAsIFNFTV9TVEFULCBhcmcpOwoJCWlmIChzZW1pZCA8IDApCgkJCWNvbnRpbnVlOwoJCWlmIChmb3JtYXQgPT0gQ1JFQVRPUikgIHsKCQkJcHJpbnRfcGVybXMgKHNlbWlkLCBpcGNwKTsKCQkJY29udGludWU7CgkJfQoJCXB3ID0gZ2V0cHd1aWQoaXBjcC0+dWlkKTsKCQlzd2l0Y2ggKGZvcm1hdCkgewoJCWNhc2UgVElNRToKCQkJaWYgKHB3KQoJCQkJYmJfcHJpbnRmICgiJS04ZCAlLTEwLjEwcyIsIHNlbWlkLCBwdy0+cHdfbmFtZSk7CgkJCWVsc2UKCQkJCWJiX3ByaW50ZiAoIiUtOGQgJS0xMGQiLCBzZW1pZCwgaXBjcC0+dWlkKTsKCQkJYmJfcHJpbnRmICgiICAlLTI2LjI0cyIsIHNlbWFyeS5zZW1fb3RpbWUKCQkJCT8gY3RpbWUoJnNlbWFyeS5zZW1fb3RpbWUpIDogIk5vdCBzZXQiKTsKCQkJYmJfcHJpbnRmICgiICUtMjYuMjRzXG4iLCBzZW1hcnkuc2VtX2N0aW1lCgkJCQk/IGN0aW1lKCZzZW1hcnkuc2VtX2N0aW1lKSA6ICJOb3Qgc2V0Iik7CgkJCWJyZWFrOwoJCWNhc2UgUElEOgoJCQlicmVhazsKCgkJZGVmYXVsdDoKCQkJCWJiX3ByaW50ZigiMHglMDh4ICIsIGlwY3AtPktFWSk7CgkJCWlmIChwdykKCQkJCWJiX3ByaW50ZiAoIiUtMTBkICUtMTAuOXMiLCBzZW1pZCwgcHctPnB3X25hbWUpOwoJCQllbHNlCgkJCQliYl9wcmludGYgKCIlLTEwZCAlLTlkIiwgc2VtaWQsIGlwY3AtPnVpZCk7CgkJCQkJYmJfcHJpbnRmICgiJS0xMG8gJS0xMGxkXG4iLAoJCQkJaXBjcC0+bW9kZSAmIDA3NzcsCgkJCQkvKgoJCQkJICogZ2xpYmMtMi4xLjMgYW5kIGVhcmxpZXIgaGFzIHVuc2lnbmVkIHNob3J0OwoJCQkJICogZ2xpYmMtMi4xLjkxIGhhcyB2YXJpYXRpb24gYmV0d2VlbgoJCQkJICogdW5zaWduZWQgc2hvcnQgYW5kIHVuc2lnbmVkIGxvbmcKCQkJCSAqIEF1c3RpbiBwcmVzY3JpYmVzIHVuc2lnbmVkIHNob3J0LgoJCQkJICovCgkJCQkobG9uZykgc2VtYXJ5LnNlbV9uc2Vtcyk7CgkJCWJyZWFrOwoJCX0KCX0KfQoKCnZvaWQgZG9fbXNnIChjaGFyIGZvcm1hdCkKewoJaW50IG1heGlkLCBtc3FpZCwgaWQ7CglzdHJ1Y3QgbXNxaWRfZHMgbXNncXVlOwoJc3RydWN0IG1zZ2luZm8gbXNnaW5mbzsKCXN0cnVjdCBpcGNfcGVybSAqaXBjcCA9ICZtc2dxdWUubXNnX3Blcm07CglzdHJ1Y3QgcGFzc3dkICpwdzsKCgltYXhpZCA9IG1zZ2N0bCAoMCwgTVNHX0lORk8sIChzdHJ1Y3QgbXNxaWRfZHMgKikgKHZvaWQgKikgJm1zZ2luZm8pOwoJaWYgKG1heGlkIDwgMCkgewoJCWJiX3ByaW50ZiAoImtlcm5lbCBub3QgY29uZmlndXJlZCBmb3IgbWVzc2FnZSBxdWV1ZXNcbiIpOwoJCXJldHVybjsKCX0KCglzd2l0Y2ggKGZvcm1hdCkgewoJY2FzZSBMSU1JVFM6CgkJaWYgKChtc2djdGwgKDAsIElQQ19JTkZPLCAoc3RydWN0IG1zcWlkX2RzICopICh2b2lkICopICZtc2dpbmZvKSkgPCAwICkKCQkJcmV0dXJuOwoJCWJiX3ByaW50ZiAoIi0tLS0tLSBNZXNzYWdlczogTGltaXRzIC0tLS0tLS0tXG4iKTsKCQliYl9wcmludGYgKCJtYXggcXVldWVzIHN5c3RlbSB3aWRlID0gJWRcbiIsIG1zZ2luZm8ubXNnbW5pKTsKCQliYl9wcmludGYgKCJtYXggc2l6ZSBvZiBtZXNzYWdlIChieXRlcykgPSAlZFxuIiwgbXNnaW5mby5tc2dtYXgpOwoJCWJiX3ByaW50ZiAoImRlZmF1bHQgbWF4IHNpemUgb2YgcXVldWUgKGJ5dGVzKSA9ICVkXG4iLCBtc2dpbmZvLm1zZ21uYik7CgkJcmV0dXJuOwoKCWNhc2UgU1RBVFVTOgoJCWJiX3ByaW50ZiAoIi0tLS0tLSBNZXNzYWdlczogU3RhdHVzIC0tLS0tLS0tXG4iKTsKCQliYl9wcmludGYgKCJhbGxvY2F0ZWQgcXVldWVzID0gJWRcbiIsIG1zZ2luZm8ubXNncG9vbCk7CgkJYmJfcHJpbnRmICgidXNlZCBoZWFkZXJzID0gJWRcbiIsIG1zZ2luZm8ubXNnbWFwKTsKCQliYl9wcmludGYgKCJ1c2VkIHNwYWNlID0gJWQgYnl0ZXNcbiIsIG1zZ2luZm8ubXNndHFsKTsKCQlyZXR1cm47CgoJY2FzZSBDUkVBVE9SOgoJCWJiX3ByaW50ZiAoIi0tLS0tLSBNZXNzYWdlIFF1ZXVlczogQ3JlYXRvcnMvT3duZXJzIC0tLS0tLS0tXG4iKTsKCQliYl9wcmludGYgKCIlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwc1xuIiwKCQkgIm1zcWlkIiwicGVybXMiLCJjdWlkIiwiY2dpZCIsInVpZCIsImdpZCIpOwoJCWJyZWFrOwoKCWNhc2UgVElNRToKCQliYl9wcmludGYgKCItLS0tLS0gTWVzc2FnZSBRdWV1ZXMgU2VuZC9SZWN2L0NoYW5nZSBUaW1lcyAtLS0tLS0tLVxuIik7CgkJYmJfcHJpbnRmICgiJS04cyAlLTEwcyAlLTIwcyAlLTIwcyAlLTIwc1xuIiwKCQkJIm1zcWlkIiwib3duZXIiLCJzZW5kIiwicmVjdiIsImNoYW5nZSIpOwoJCWJyZWFrOwoKCWNhc2UgUElEOgoJCWJiX3ByaW50ZiAoIi0tLS0tLSBNZXNzYWdlIFF1ZXVlcyBQSURzIC0tLS0tLS0tXG4iKTsKCQliYl9wcmludGYgKCIlLTEwcyAlLTEwcyAlLTEwcyAlLTEwc1xuIiwKCQkJIm1zcWlkIiwib3duZXIiLCJsc3BpZCIsImxycGlkIik7CgkJYnJlYWs7CgoJZGVmYXVsdDoKCQliYl9wcmludGYgKCItLS0tLS0gTWVzc2FnZSBRdWV1ZXMgLS0tLS0tLS1cbiIpOwoJCWJiX3ByaW50ZiAoIiUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTJzICUtMTJzXG4iLAoJCQkia2V5IiwgIm1zcWlkIiwgIm93bmVyIiwgInBlcm1zIiwidXNlZC1ieXRlcyIsICJtZXNzYWdlcyIpOwoJCWJyZWFrOwoJfQoKCWZvciAoaWQgPSAwOyBpZCA8PSBtYXhpZDsgaWQrKykgewoJCW1zcWlkID0gbXNnY3RsIChpZCwgTVNHX1NUQVQsICZtc2dxdWUpOwoJCWlmIChtc3FpZCA8IDApCgkJCWNvbnRpbnVlOwoJCWlmIChmb3JtYXQgPT0gQ1JFQVRPUikgIHsKCQkJcHJpbnRfcGVybXMgKG1zcWlkLCBpcGNwKTsKCQkJY29udGludWU7CgkJfQoJCXB3ID0gZ2V0cHd1aWQoaXBjcC0+dWlkKTsKCQlzd2l0Y2ggKGZvcm1hdCkgewoJCWNhc2UgVElNRToKCQkJaWYgKHB3KQoJCQkJYmJfcHJpbnRmICgiJS04ZCAlLTEwLjEwcyIsIG1zcWlkLCBwdy0+cHdfbmFtZSk7CgkJCWVsc2UKCQkJCWJiX3ByaW50ZiAoIiUtOGQgJS0xMGQiLCBtc3FpZCwgaXBjcC0+dWlkKTsKCQkJYmJfcHJpbnRmICgiICUtMjAuMTZzIiwgbXNncXVlLm1zZ19zdGltZQoJCQkJPyBjdGltZSgmbXNncXVlLm1zZ19zdGltZSkgKyA0IDogIk5vdCBzZXQiKTsKCQkJYmJfcHJpbnRmICgiICUtMjAuMTZzIiwgbXNncXVlLm1zZ19ydGltZQoJCQkJPyBjdGltZSgmbXNncXVlLm1zZ19ydGltZSkgKyA0IDogIk5vdCBzZXQiKTsKCQkJYmJfcHJpbnRmICgiICUtMjAuMTZzXG4iLCBtc2dxdWUubXNnX2N0aW1lCgkJCQk/IGN0aW1lKCZtc2dxdWUubXNnX2N0aW1lKSArIDQgOiAiTm90IHNldCIpOwoJCQlicmVhazsKCQljYXNlIFBJRDoKCQkJaWYgKHB3KQoJCQkJYmJfcHJpbnRmICgiJS04ZCAlLTEwLjEwcyIsIG1zcWlkLCBwdy0+cHdfbmFtZSk7CgkJCWVsc2UKCQkJCWJiX3ByaW50ZiAoIiUtOGQgJS0xMGQiLCBtc3FpZCwgaXBjcC0+dWlkKTsKCQkJYmJfcHJpbnRmICgiICAlNWQgICAgICU1ZFxuIiwKCQkJCW1zZ3F1ZS5tc2dfbHNwaWQsIG1zZ3F1ZS5tc2dfbHJwaWQpOwoJCQlicmVhazsKCgkJZGVmYXVsdDoKCQkJCWJiX3ByaW50ZiggIjB4JTA4eCAiLGlwY3AtPktFWSApOwoJCQlpZiAocHcpCgkJCQliYl9wcmludGYgKCIlLTEwZCAlLTEwLjEwcyIsIG1zcWlkLCBwdy0+cHdfbmFtZSk7CgkJCWVsc2UKCQkJCWJiX3ByaW50ZiAoIiUtMTBkICUtMTBkIiwgbXNxaWQsIGlwY3AtPnVpZCk7CgkJCQkJYmJfcHJpbnRmICgiICUtMTBvICUtMTJsZCAlLTEybGRcbiIsCgkJCQlpcGNwLT5tb2RlICYgMDc3NywKCQkJCS8qCgkJCQkgKiBnbGliYy0yLjEuMyBhbmQgZWFybGllciBoYXMgdW5zaWduZWQgc2hvcnQ7CgkJCQkgKiBnbGliYy0yLjEuOTEgaGFzIHZhcmlhdGlvbiBiZXR3ZWVuCgkJCQkgKiB1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgbG9uZwoJCQkJICogQXVzdGluIGhhcyBtc2dxbnVtX3QKCQkJCSAqLwoJCQkJKGxvbmcpIG1zZ3F1ZS5tc2dfY2J5dGVzLAoJCQkJKGxvbmcpIG1zZ3F1ZS5tc2dfcW51bSk7CgkJCWJyZWFrOwoJCX0KCX0KCXJldHVybjsKfQoKCnZvaWQgcHJpbnRfc2htIChpbnQgc2htaWQpCnsKCXN0cnVjdCBzaG1pZF9kcyBzaG1kczsKCXN0cnVjdCBpcGNfcGVybSAqaXBjcCA9ICZzaG1kcy5zaG1fcGVybTsKCglpZiAoc2htY3RsIChzaG1pZCwgSVBDX1NUQVQsICZzaG1kcykgPT0gLTEpIHsKCQlwZXJyb3IgKCJzaG1jdGwgIik7CgkJcmV0dXJuOwoJfQoKCWJiX3ByaW50ZiAoIlxuU2hhcmVkIG1lbW9yeSBTZWdtZW50IHNobWlkPSVkXG4iLCBzaG1pZCk7CgliYl9wcmludGYgKCJ1aWQ9JWRcdGdpZD0lZFx0Y3VpZD0lZFx0Y2dpZD0lZFxuIiwKCQlpcGNwLT51aWQsIGlwY3AtPmdpZCwgaXBjcC0+Y3VpZCwgaXBjcC0+Y2dpZCk7CgliYl9wcmludGYgKCJtb2RlPSUjb1x0YWNjZXNzX3Blcm1zPSUjb1xuIiwKCQlpcGNwLT5tb2RlLCBpcGNwLT5tb2RlICYgMDc3Nyk7CgliYl9wcmludGYgKCJieXRlcz0lbGRcdGxwaWQ9JWRcdGNwaWQ9JWRcdG5hdHRjaD0lbGRcbiIsCgkJKGxvbmcpIHNobWRzLnNobV9zZWdzeiwgc2htZHMuc2htX2xwaWQsIHNobWRzLnNobV9jcGlkLAoJCShsb25nKSBzaG1kcy5zaG1fbmF0dGNoKTsKCWJiX3ByaW50ZiAoImF0dF90aW1lPSUtMjYuMjRzXG4iLAoJCXNobWRzLnNobV9hdGltZSA/IGN0aW1lICgmc2htZHMuc2htX2F0aW1lKSA6ICJOb3Qgc2V0Iik7CgliYl9wcmludGYgKCJkZXRfdGltZT0lLTI2LjI0c1xuIiwKCQlzaG1kcy5zaG1fZHRpbWUgPyBjdGltZSAoJnNobWRzLnNobV9kdGltZSkgOiAiTm90IHNldCIpOwoJYmJfcHJpbnRmICgiY2hhbmdlX3RpbWU9JS0yNi4yNHNcbiIsIGN0aW1lICgmc2htZHMuc2htX2N0aW1lKSk7CgliYl9wcmludGYgKCJcbiIpOwoJcmV0dXJuOwp9CgoKdm9pZCBwcmludF9tc2cgKGludCBtc3FpZCkKewoJc3RydWN0IG1zcWlkX2RzIGJ1ZjsKCXN0cnVjdCBpcGNfcGVybSAqaXBjcCA9ICZidWYubXNnX3Blcm07CgoJaWYgKG1zZ2N0bCAobXNxaWQsIElQQ19TVEFULCAmYnVmKSA9PSAtMSkgewoJCXBlcnJvciAoIm1zZ2N0bCAiKTsKCQlyZXR1cm47Cgl9CgoJYmJfcHJpbnRmICgiXG5NZXNzYWdlIFF1ZXVlIG1zcWlkPSVkXG4iLCBtc3FpZCk7CgliYl9wcmludGYgKCJ1aWQ9JWRcdGdpZD0lZFx0Y3VpZD0lZFx0Y2dpZD0lZFx0bW9kZT0lI29cbiIsCgkJaXBjcC0+dWlkLCBpcGNwLT5naWQsIGlwY3AtPmN1aWQsIGlwY3AtPmNnaWQsIGlwY3AtPm1vZGUpOwoJYmJfcHJpbnRmICgiY2J5dGVzPSVsZFx0cWJ5dGVzPSVsZFx0cW51bT0lbGRcdGxzcGlkPSVkXHRscnBpZD0lZFxuIiwKCQkvKgoJCSAqIGdsaWJjLTIuMS4zIGFuZCBlYXJsaWVyIGhhcyB1bnNpZ25lZCBzaG9ydDsKCQkgKiBnbGliYy0yLjEuOTEgaGFzIHZhcmlhdGlvbiBiZXR3ZWVuCgkJICogdW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIGxvbmcKCQkgKiBBdXN0aW4gaGFzIG1zZ3FudW1fdCAoZm9yIG1zZ19xYnl0ZXMpCgkJICovCgkJKGxvbmcpIGJ1Zi5tc2dfY2J5dGVzLCAobG9uZykgYnVmLm1zZ19xYnl0ZXMsCgkJKGxvbmcpIGJ1Zi5tc2dfcW51bSwgYnVmLm1zZ19sc3BpZCwgYnVmLm1zZ19scnBpZCk7CgliYl9wcmludGYgKCJzZW5kX3RpbWU9JS0yNi4yNHNcbiIsCgkJYnVmLm1zZ19zdGltZSA/IGN0aW1lICgmYnVmLm1zZ19zdGltZSkgOiAiTm90IHNldCIpOwoJYmJfcHJpbnRmICgicmN2X3RpbWU9JS0yNi4yNHNcbiIsCgkJYnVmLm1zZ19ydGltZSA/IGN0aW1lICgmYnVmLm1zZ19ydGltZSkgOiAiTm90IHNldCIpOwoJYmJfcHJpbnRmICgiY2hhbmdlX3RpbWU9JS0yNi4yNHNcbiIsCgkJYnVmLm1zZ19jdGltZSA/IGN0aW1lICgmYnVmLm1zZ19jdGltZSkgOiAiTm90IHNldCIpOwoJYmJfcHJpbnRmICgiXG4iKTsKCXJldHVybjsKfQoKdm9pZCBwcmludF9zZW0gKGludCBzZW1pZCkKewoJc3RydWN0IHNlbWlkX2RzIHNlbWRzOwoJc3RydWN0IGlwY19wZXJtICppcGNwID0gJnNlbWRzLnNlbV9wZXJtOwoJdW5pb24gc2VtdW4gYXJnOwoJaW50IGk7CgoJYXJnLmJ1ZiA9ICZzZW1kczsKCWlmIChzZW1jdGwgKHNlbWlkLCAwLCBJUENfU1RBVCwgYXJnKSA8IDApIHsKCQlwZXJyb3IgKCJzZW1jdGwgIik7CgkJcmV0dXJuOwoJfQoKCWJiX3ByaW50ZiAoIlxuU2VtYXBob3JlIEFycmF5IHNlbWlkPSVkXG4iLCBzZW1pZCk7CgliYl9wcmludGYgKCJ1aWQ9JWRcdCBnaWQ9JWRcdCBjdWlkPSVkXHQgY2dpZD0lZFxuIiwKCQlpcGNwLT51aWQsIGlwY3AtPmdpZCwgaXBjcC0+Y3VpZCwgaXBjcC0+Y2dpZCk7CgliYl9wcmludGYgKCJtb2RlPSUjbywgYWNjZXNzX3Blcm1zPSUjb1xuIiwKCQlpcGNwLT5tb2RlLCBpcGNwLT5tb2RlICYgMDc3Nyk7CgliYl9wcmludGYgKCJuc2VtcyA9ICVsZFxuIiwgKGxvbmcpIHNlbWRzLnNlbV9uc2Vtcyk7CgliYl9wcmludGYgKCJvdGltZSA9ICUtMjYuMjRzXG4iLAoJCXNlbWRzLnNlbV9vdGltZSA/IGN0aW1lICgmc2VtZHMuc2VtX290aW1lKSA6ICJOb3Qgc2V0Iik7CgliYl9wcmludGYgKCJjdGltZSA9ICUtMjYuMjRzXG4iLCBjdGltZSAoJnNlbWRzLnNlbV9jdGltZSkpOwoKCWJiX3ByaW50ZiAoIiUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzXG4iLAoJCSJzZW1udW0iLCJ2YWx1ZSIsIm5jb3VudCIsInpjb3VudCIsInBpZCIpOwoKCWFyZy52YWwgPSAwOwoJZm9yIChpPTA7IGk8IHNlbWRzLnNlbV9uc2VtczsgaSsrKSB7CgkJaW50IHZhbCwgbmNudCwgemNudCwgcGlkOwoJCXZhbCA9IHNlbWN0bCAoc2VtaWQsIGksIEdFVFZBTCwgYXJnKTsKCQluY250ID0gc2VtY3RsIChzZW1pZCwgaSwgR0VUTkNOVCwgYXJnKTsKCQl6Y250ID0gc2VtY3RsIChzZW1pZCwgaSwgR0VUWkNOVCwgYXJnKTsKCQlwaWQgPSBzZW1jdGwgKHNlbWlkLCBpLCBHRVRQSUQsIGFyZyk7CgkJaWYgKHZhbCA8IDAgfHwgbmNudCA8IDAgfHwgemNudCA8IDAgfHwgcGlkIDwgMCkgewoJCQlwZXJyb3IgKCJzZW1jdGwgIik7CgkJCWJiX2ZmbHVzaF9zdGRvdXRfYW5kX2V4aXQgKDEpOwoJCX0KCQliYl9wcmludGYgKCIlLTEwZCAlLTEwZCAlLTEwZCAlLTEwZCAlLTEwZFxuIiwKCQkJaSwgdmFsLCBuY250LCB6Y250LCBwaWQpOwoJfQoJYmJfcHJpbnRmICgiXG4iKTsKCXJldHVybjsKfQo=