LyoKICogIElQIE1JQiBncm91cCBpbXBsZW1lbnRhdGlvbiAtIGlwLmMKICoKICovCgovKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQocykuICBTZWUKICogdGhlIE5ldC1TTk1QJ3MgQ09QWUlORyBmaWxlIGZvciBtb3JlIGRldGFpbHMgYW5kIG90aGVyIGNvcHlyaWdodHMKICogdGhhdCBtYXkgYXBwbHk6CiAqLwovKgogKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGNvcHlyaWdodGVkIGJ5OgogKiBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KCiNpZiBkZWZpbmVkKElGTkVUX05FRURTX0tFUk5FTCkgJiYgIWRlZmluZWQoX0tFUk5FTCkKI2RlZmluZSBfS0VSTkVMIDEKI2RlZmluZSBfSV9ERUZJTkVEX0tFUk5FTAojZW5kaWYKI2lmIEhBVkVfU1lTX1BBUkFNX0gKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojZW5kaWYKI2lmIEhBVkVfVU5JU1REX0gKI2lmZGVmIGlyaXg2CiNkZWZpbmUgX1NUQU5EQUxPTkUgMQojZW5kaWYKI2luY2x1ZGUgPHVuaXN0ZC5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NPQ0tFVF9ICiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNlbmRpZgoKI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWYgSEFWRV9XSU5TT0NLX0gKI2luY2x1ZGUgPHdpbnNvY2suaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19TWVNDVExfSAojaWZkZWYgX0lfREVGSU5FRF9LRVJORUwKI3VuZGVmIF9LRVJORUwKI2VuZGlmCiNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CiNpZmRlZiBfSV9ERUZJTkVEX0tFUk5FTAojZGVmaW5lIF9LRVJORUwgMQojZW5kaWYKI2VuZGlmCiNpZiBIQVZFX1NZU19TWVNNUF9ICiNpbmNsdWRlIDxzeXMvc3lzbXAuaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19UQ1BJUFNUQVRTX0gKI2luY2x1ZGUgPHN5cy90Y3BpcHN0YXRzLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBIQVZFX05FVF9JRl9ICiNpbmNsdWRlIDxuZXQvaWYuaD4KI2VuZGlmCiNpZiBIQVZFX05FVF9JRl9WQVJfSAojaW5jbHVkZSA8bmV0L2lmX3Zhci5oPgojZW5kaWYKI2lmZGVmIF9JX0RFRklORURfS0VSTkVMCiN1bmRlZiBfS0VSTkVMCiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lOX1NZU1RNX0gKI2luY2x1ZGUgPG5ldGluZXQvaW5fc3lzdG0uaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19IQVNISU5HX0gKI2luY2x1ZGUgPHN5cy9oYXNoaW5nLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lOX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luX3Zhci5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JUF9ICiNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L2lwX3Zhci5oPgojZW5kaWYKI2lmIEhBVkVfSU5FVF9NSUIyX0gKI2luY2x1ZGUgPGluZXQvbWliMi5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NUUkVBTV9ICiNpbmNsdWRlIDxzeXMvc3RyZWFtLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRfUk9VVEVfSAojaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNMT0dfSAojaW5jbHVkZSA8c3lzbG9nLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfSU9DVExfSAojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNlbmRpZgoKI2lmIGRlZmluZWQoTUlCX0lQQ09VTlRFUl9TWU1CT0wpIHx8IGRlZmluZWQoaHB1eDExKQojaW5jbHVkZSA8c3lzL21pYi5oPgojaW5jbHVkZSA8bmV0aW5ldC9taWJfa2Vybi5oPgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1JQl9JUENPVU5URVJfU1lNQk9MIHx8IGhwdXgxMSAqLwoKI2lmZGVmIHNvbGFyaXMyCiNpbmNsdWRlICJrZXJuZWxfc3Vub3M1LmgiCiNlbHNlCiNpbmNsdWRlICJrZXJuZWwuaCIKI2VuZGlmCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtaW5jbHVkZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L25ldC1zbm1wLWFnZW50LWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9hdXRvX25saXN0Lmg+CiNpbmNsdWRlIDxuZXQtc25tcC9kYXRhX2FjY2Vzcy9pbnRlcmZhY2UuaD4KCiNpbmNsdWRlICJpcC5oIgojaW5jbHVkZSAiaW50ZXJmYWNlcy5oIgojaW5jbHVkZSAic3lzT1JUYWJsZS5oIgoKI2lmZGVmIGN5Z3dpbgojaW5jbHVkZSA8d2luZG93cy5oPgojZW5kaWYKCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKgoJICoKCSAqICBLZXJuZWwgJiBpbnRlcmZhY2UgaW5mb3JtYXRpb24sCgkgKiAgIGFuZCBpbnRlcm5hbCBmb3J3YXJkIGRlY2xhcmF0aW9ucwoJICoKCSAqKioqKioqKioqKioqKioqKioqKiovCgogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioKCSAqCgkgKiAgSW5pdGlhbGlzYXRpb24gJiBjb21tb24gaW1wbGVtZW50YXRpb24gZnVuY3Rpb25zCgkgKgoJICoqKioqKioqKioqKioqKioqKioqKi8KCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKgoJICoKCSAqICBTeXN0ZW0gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZnVuY3Rpb25zCgkgKgoJICoqKioqKioqKioqKioqKioqKioqKi8KCiNpZiAhZGVmaW5lZCAoV0lOMzIpICYmICFkZWZpbmVkIChjeWd3aW4pCgojaWYgIWRlZmluZWQoTkVUU05NUF9DQU5fVVNFX1NZU0NUTCkgfHwgIWRlZmluZWQoSVBDVExfU1RBVFMpCiNpZm5kZWYgc29sYXJpczIKCiNpZiBkZWZpbmVkKGZyZWVic2QyKSB8fCBkZWZpbmVkKGhwdXgxMSkgfHwgZGVmaW5lZChsaW51eCkKc3RhdGljIHZvaWQgICAgIEFkZHJlc3NfU2Nhbl9Jbml0KHZvaWQpOwojaWZkZWYgZnJlZWJzZDIKc3RhdGljIGludCAgICAgIEFkZHJlc3NfU2Nhbl9OZXh0KHNob3J0ICosIHN0cnVjdCBpbl9pZmFkZHIgKik7CiNlbHNlCiNpZmRlZiBsaW51eApzdGF0aWMgc3RydWN0IGlmY29uZiBpZmM7CnN0YXRpYyBpbnQgICAgICBBZGRyZXNzX1NjYW5fTmV4dChzaG9ydCAqLCBzdHJ1Y3QgaWZuZXQgKik7CiNlbHNlCnN0YXRpYyBpbnQgICAgICBBZGRyZXNzX1NjYW5fTmV4dChzaG9ydCAqLCBtaWJfaXBBZEVudCAqKTsKI2VuZGlmCiNlbmRpZgojZW5kaWYKCi8qCiAqIHZhcl9pcEFkZHJFbnRyeSguLi4KICogQXJndW1lbnRzOgogKiB2cCAgICAgSU4gICAgICAtIHBvaW50ZXIgdG8gdmFyaWFibGUgZW50cnkgdGhhdCBwb2ludHMgaGVyZQogKiBuYW1lICAgIElOL09VVCAgLSBJTi9uYW1lIHJlcXVlc3RlZCwgT1VUL25hbWUgZm91bmQKICogbGVuZ3RoICBJTi9PVVQgIC0gbGVuZ3RoIG9mIElOL09VVCBvaWQncyAKICogZXhhY3QgICBJTiAgICAgIC0gVFJVRSBpZiBhbiBleGFjdCBtYXRjaCB3YXMgcmVxdWVzdGVkCiAqIHZhcl9sZW4gT1VUICAgICAtIGxlbmd0aCBvZiB2YXJpYWJsZSBvciAwIGlmIGZ1bmN0aW9uIHJldHVybmVkCiAqIHdyaXRlX21ldGhvZAogKiAKICovCgp1X2NoYXIgICAgICAgICAqCnZhcl9pcEFkZHJFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKnZwLAogICAgICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiAgICAvKgogICAgICogb2JqZWN0IGlkZW50aWZpZXIgaXMgb2YgZm9ybToKICAgICAqIDEuMy42LjEuMi4xLjQuMjAuMS4/LkEuQi5DLkQsICB3aGVyZSBBLkIuQy5EIGlzIElQIGFkZHJlc3MuCiAgICAgKiBJUEFERFIgc3RhcnRzIGF0IG9mZnNldCAxMC4KICAgICAqLwogICAgb2lkICAgICAgICAgICAgIGxvd2VzdFsxNF07CiAgICBvaWQgICAgICAgICAgICAgY3VycmVudFsxNF0sICpvcDsKICAgIHVfY2hhciAgICAgICAgICpjcDsKICAgIGludCAgICAgICAgICAgICBsb3dpbnRlcmZhY2UgPSAwOwojaWZuZGVmIGZyZWVic2QyCiAgICBzaG9ydCAgICAgICAgICAgaW50ZXJmYWNlOwojZW5kaWYKI2lmZGVmIGhwdXgxMQogICAgc3RhdGljIG1pYl9pcEFkRW50IGluX2lmYWRkciwgbG93aW5faWZhZGRyOwojZWxzZQojaWYgIWRlZmluZWQobGludXgpICYmICFkZWZpbmVkKHN1blYzKQogICAgc3RhdGljIHN0cnVjdCBpbl9pZmFkZHIgaW5faWZhZGRyLCBsb3dpbl9pZmFkZHI7CiNlbHNlCiAgICBzdGF0aWMgc3RydWN0IGlmbmV0IGxvd2luX2lmbmV0OwojZW5kaWYKICAgIHN0YXRpYyBzdHJ1Y3QgaWZuZXQgaWZuZXQ7CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaHB1eDExICovCiAgICBzdGF0aWMgaW5fYWRkcl90CWFkZHJfcmV0OwoKICAgIC8qCiAgICAgKiBmaWxsIGluIG9iamVjdCBwYXJ0IG9mIG5hbWUgZm9yIGN1cnJlbnQgKGxlc3Mgc2l6ZW9mIGluc3RhbmNlIHBhcnQpIAogICAgICovCgogICAgbWVtY3B5KChjaGFyICopIGN1cnJlbnQsIChjaGFyICopIHZwLT5uYW1lLAogICAgICAgICAgIChpbnQpIHZwLT5uYW1lbGVuICogc2l6ZW9mKG9pZCkpOwoKI2lmICFkZWZpbmVkKGZyZWVic2QyKSAmJiAhZGVmaW5lZChocHV4MTEpICYmICFkZWZpbmVkKGxpbnV4KQogICAgSW50ZXJmYWNlX1NjYW5fSW5pdCgpOwojZWxzZQogICAgQWRkcmVzc19TY2FuX0luaXQoKTsKI2VuZGlmCiAgICBmb3IgKDs7KSB7CgojaWYgIWRlZmluZWQoZnJlZWJzZDIpICYmICFkZWZpbmVkKGhwdXgxMSkgJiYgIWRlZmluZWQobGludXgpCiAgICAgICAgaWYgKEludGVyZmFjZV9TY2FuX05leHQoJmludGVyZmFjZSwgTlVMTCwgJmlmbmV0LCAmaW5faWZhZGRyKSA9PSAwKQogICAgICAgICAgICBicmVhazsKI2lmZGVmIFNUUlVDVF9JRk5FVF9IQVNfSUZfQUREUkxJU1QKICAgICAgICBpZiAoaWZuZXQuaWZfYWRkcmxpc3QgPT0gMCkKICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAvKiBObyBhZGRyZXNzIGZvdW5kIGZvciBpbnRlcmZhY2UgKi8KI2VuZGlmCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIWZyZWVic2QyICYmICFocHV4MTEgKi8KI2lmIGRlZmluZWQobGludXgpCiAgICAgICAgaWYgKEFkZHJlc3NfU2Nhbl9OZXh0KCZpbnRlcmZhY2UsICZpZm5ldCkgPT0gMCkKICAgICAgICAgICAgYnJlYWs7CiNlbHNlCiAgICAgICAgaWYgKEFkZHJlc3NfU2Nhbl9OZXh0KCZpbnRlcmZhY2UsICZpbl9pZmFkZHIpID09IDApCiAgICAgICAgICAgIGJyZWFrOwojZW5kaWYKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhZnJlZWJzZDIgJiYgIWhwdXgxMSAmJiAhbGludXggKi8KCiNpZmRlZiBocHV4MTEKICAgICAgICBjcCA9ICh1X2NoYXIgKikgJiBpbl9pZmFkZHIuQWRkcjsKI2VsaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChzdW5WMykKICAgICAgICBjcCA9ICh1X2NoYXIgKikgJiAoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJihpZm5ldC5pZl9hZGRyKSktPgogICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5fYWRkci5zX2FkZHIpOwojZWxzZQogICAgICAgIGNwID0gKHVfY2hhciAqKSAmICgoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmKGluX2lmYWRkci5pYV9hZGRyKSktPgogICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5fYWRkci5zX2FkZHIpOwojZW5kaWYKCiAgICAgICAgb3AgPSBjdXJyZW50ICsgMTA7CiAgICAgICAgKm9wKysgPSAqY3ArKzsKICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICpvcCsrID0gKmNwKys7CiAgICAgICAgKm9wKysgPSAqY3ArKzsKICAgICAgICBpZiAoZXhhY3QpIHsKICAgICAgICAgICAgaWYgKHNubXBfb2lkX2NvbXBhcmUoY3VycmVudCwgMTQsIG5hbWUsICpsZW5ndGgpID09IDApIHsKICAgICAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSBsb3dlc3QsIChjaGFyICopIGN1cnJlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgMTQgKiBzaXplb2Yob2lkKSk7CiAgICAgICAgICAgICAgICBsb3dpbnRlcmZhY2UgPSBpbnRlcmZhY2U7CiNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKHN1blYzKQogICAgICAgICAgICAgICAgbG93aW5faWZuZXQgPSBpZm5ldDsKI2Vsc2UKICAgICAgICAgICAgICAgIGxvd2luX2lmYWRkciA9IGluX2lmYWRkcjsKI2VuZGlmCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgLyogbm8gbmVlZCB0byBzZWFyY2ggZnVydGhlciAqLwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKChzbm1wX29pZF9jb21wYXJlKGN1cnJlbnQsIDE0LCBuYW1lLCAqbGVuZ3RoKSA+IDApICYmCiAgICAgICAgICAgICAgICAoIWxvd2ludGVyZmFjZQogICAgICAgICAgICAgICAgIHx8IChzbm1wX29pZF9jb21wYXJlKGN1cnJlbnQsIDE0LCBsb3dlc3QsIDE0KSA8IDApKSkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIGlmIG5ldyBvbmUgaXMgZ3JlYXRlciB0aGFuIGlucHV0IGFuZCBjbG9zZXIgdG8gaW5wdXQgdGhhbgogICAgICAgICAgICAgICAgICogcHJldmlvdXMgbG93ZXN0LCBzYXZlIHRoaXMgb25lIGFzIHRoZSAibmV4dCIgb25lLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBsb3dpbnRlcmZhY2UgPSBpbnRlcmZhY2U7CiNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKHN1blYzKQogICAgICAgICAgICAgICAgbG93aW5faWZuZXQgPSBpZm5ldDsKI2Vsc2UKICAgICAgICAgICAgICAgIGxvd2luX2lmYWRkciA9IGluX2lmYWRkcjsKI2VuZGlmCiAgICAgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKikgbG93ZXN0LCAoY2hhciAqKSBjdXJyZW50LAogICAgICAgICAgICAgICAgICAgICAgIDE0ICogc2l6ZW9mKG9pZCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKI2lmIGRlZmluZWQobGludXgpCiAgICBTTk1QX0ZSRUUoaWZjLmlmY19idWYpOwojZW5kaWYKCiAgICBpZiAoIWxvd2ludGVyZmFjZSkKICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgbWVtY3B5KChjaGFyICopIG5hbWUsIChjaGFyICopIGxvd2VzdCwgMTQgKiBzaXplb2Yob2lkKSk7CiAgICAqbGVuZ3RoID0gMTQ7CiAgICAqd3JpdGVfbWV0aG9kID0gMDsKICAgICp2YXJfbGVuID0gc2l6ZW9mKGxvbmdfcmV0dXJuKTsKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIElQQURBRERSOgogICAgCSp2YXJfbGVuID0gc2l6ZW9mKGFkZHJfcmV0KTsKI2lmZGVmIGhwdXgxMQogICAgICAgIGFkZHJfcmV0ID0gbG93aW5faWZhZGRyLkFkZHI7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBhZGRyX3JldDsKI2VsaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChzdW5WMykKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmICgoc3RydWN0IHNvY2thZGRyX2luICopICZsb3dpbl9pZm5ldC5pZl9hZGRyKS0+CiAgICAgICAgICAgIHNpbl9hZGRyLnNfYWRkcjsKI2Vsc2UKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmICgoc3RydWN0IHNvY2thZGRyX2luICopICZsb3dpbl9pZmFkZHIuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWFfYWRkciktPnNpbl9hZGRyLnNfYWRkcjsKI2VuZGlmCiAgICBjYXNlIElQQURJRklOREVYOgogICAgICAgIGxvbmdfcmV0dXJuID0gbG93aW50ZXJmYWNlOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQQURORVRNQVNLOgogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKGFkZHJfcmV0KTsKI2lmZGVmIGhwdXgxMQogICAgICAgIGFkZHJfcmV0ID0gbG93aW5faWZhZGRyLk5ldE1hc2s7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBhZGRyX3JldDsKI2VsaWYgZGVmaW5lZChsaW51eCkKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmICgoc3RydWN0IHNvY2thZGRyX2luICopICZsb3dpbl9pZm5ldC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpYV9zdWJuZXRtYXNrKS0+c2luX2FkZHIuc19hZGRyOwojZWxpZiAhZGVmaW5lZChzdW5WMykKICAgICAgICBhZGRyX3JldCA9IGxvd2luX2lmYWRkci5pYV9zdWJuZXRtYXNrOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgYWRkcl9yZXQ7CiNlbmRpZgogICAgY2FzZSBJUEFEQkNBU1RBRERSOgojaWZkZWYgaHB1eDExCiAgICAgICAgbG9uZ19yZXR1cm4gPSBsb3dpbl9pZmFkZHIuQmNhc3RBZGRyICYgMTsKI2VsaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChzdW5WMykKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihsb25nX3JldHVybik7CiAgICAgICAgbG9uZ19yZXR1cm4gPQogICAgICAgICAgICBudG9obCgoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmbG93aW5faWZuZXQuaWZ1X2Jyb2FkYWRkciktPgogICAgICAgICAgICAgICAgICBzaW5fYWRkci5zX2FkZHIpICYgMTsKI2VsaWYgZGVmaW5lZChuZXRic2QxKQogICAgICAgIGxvbmdfcmV0dXJuID0KICAgICAgICAgICAgKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJmxvd2luX2lmYWRkci5pYV9icm9hZGFkZHIpLT5zaW5fYWRkci4KICAgICAgICAgICAgc19hZGRyICYgMTsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9CiAgICAgICAgICAgIG50b2hsKCgoc3RydWN0IHNvY2thZGRyX2luICopICZsb3dpbl9pZmFkZHIuaWFfYnJvYWRhZGRyKS0+CiAgICAgICAgICAgICAgICAgIHNpbl9hZGRyLnNfYWRkcikgJiAxOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUEFEUkVBU01NQVg6CiNpZmRlZiBocHV4MTEKICAgICAgICBsb25nX3JldHVybiA9IGxvd2luX2lmYWRkci5SZWFzbU1heFNpemU7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKI2VsaWYgZGVmaW5lZChORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUykKICAgICAgICByZXR1cm4gTlVMTDsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9IC0xOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiNlbmRpZgogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gdmFyX2lwQWRkckVudHJ5XG4iLAogICAgICAgICAgICAgICAgICAgIHZwLT5tYWdpYykpOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCiNpZmRlZiBmcmVlYnNkMgpzdGF0aWMgc3RydWN0IGluX2lmYWRkciAqaW5faWZhZGRyYWRkciA9IE5VTEw7CgpzdGF0aWMgdm9pZApBZGRyZXNzX1NjYW5fSW5pdCh2b2lkKQp7CiAgICBpbnQgcmMgPSBhdXRvX25saXN0KElGQUREUl9TWU1CT0wsIChjaGFyICopICZpbl9pZmFkZHJhZGRyLAogICAgICAgICAgICAgICBzaXplb2YoaW5faWZhZGRyYWRkcikpOwogICAgaWYgKDAgPT0gcmMpCiAgICAgICAgaW5faWZhZGRyYWRkciA9IE5VTEw7Cn0KCi8qCiAqIE5COiBJbmRleCBpcyB0aGUgbnVtYmVyIG9mIHRoZSBjb3JyZXNwb25kaW5nIGludGVyZmFjZSwgbm90IG9mIHRoZSBhZGRyZXNzIAogKi8Kc3RhdGljIGludApBZGRyZXNzX1NjYW5fTmV4dChJbmRleCwgUmV0aW5faWZhZGRyKQogICAgIHNob3J0ICAgICAgICAgICpJbmRleDsKICAgICBzdHJ1Y3QgaW5faWZhZGRyICpSZXRpbl9pZmFkZHI7CnsKICAgIHN0cnVjdCBpbl9pZmFkZHIgaW5faWZhZGRyOwogICAgc3RydWN0IGlmbmV0ICAgIGlmbmV0LCAqaWZuZXRhZGRyOyAgLyogTk9UQTogc2FtZSBuYW1lIGFzIGFub3RoZXIgb25lICovCiAgICBzaG9ydCAgICAgICAgICAgaWluZGV4ID0gMTsKCiAgICB3aGlsZSAoaW5faWZhZGRyYWRkcikgewogICAgICAgIC8qCiAgICAgICAgICogICAgICBHZXQgdGhlICJpbl9pZmFkZHIiIHN0cnVjdHVyZQogICAgICAgICAqLwogICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKGluX2lmYWRkcmFkZHIsIChjaGFyICopICZpbl9pZmFkZHIsIHNpemVvZiBpbl9pZmFkZHIpKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS9pcDpBZGRyZXNzX1NjYW5fTmV4dCIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgogICAgICAgIGluX2lmYWRkcmFkZHIgPSBpbl9pZmFkZHIuaWFfbmV4dDsKCiAgICAgICAgaWYgKFJldGluX2lmYWRkcikKICAgICAgICAgICAgKlJldGluX2lmYWRkciA9IGluX2lmYWRkcjsKCiAgICAgICAgLyoKICAgICAgICAgKiBOb3csIG1vcmUgZGlmZmljdWx0LCBmaW5kIHRoZSBpbmRleCBvZiB0aGUgaW50ZXJmYWNlIHRvIHdoaWNoCiAgICAgICAgICogdGhpcyBhZGRyZXNzIGJlbG9uZ3MKICAgICAgICAgKi8KCiAgICAgICAgYXV0b19ubGlzdChJRk5FVF9TWU1CT0wsIChjaGFyICopICZpZm5ldGFkZHIsIHNpemVvZihpZm5ldGFkZHIpKTsKICAgICAgICB3aGlsZSAoaWZuZXRhZGRyICYmIGlmbmV0YWRkciAhPSBpbl9pZmFkZHIuaWFfaWZwKSB7CiAgICAgICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKGlmbmV0YWRkciwgKGNoYXIgKikgJmlmbmV0LCBzaXplb2YgaWZuZXQpKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvaXA6QWRkcmVzc19TY2FuX05leHQiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmbmV0YWRkciA9IGlmbmV0LmlmX25leHQ7CiAgICAgICAgICAgIGlpbmRleCsrOwogICAgICAgIH0KCiAgICAgICAgLyoKICAgICAgICAgKiBYWFggLSBtaWdodCBub3QgZmluZCBpdD8gCiAgICAgICAgICovCgogICAgICAgIGlmIChJbmRleCkKICAgICAgICAgICAgKkluZGV4ID0gaWluZGV4OwoKICAgICAgICByZXR1cm4gKDEpOyAgICAgICAgICAgICAvKiBET05FICovCiAgICB9CiAgICByZXR1cm4gKDApOyAgICAgICAgICAgICAgICAgLyogRU9GICovCn0KCiNlbGlmIGRlZmluZWQoaHB1eDExKQoKc3RhdGljIGludCAgICAgIGlwdGFiX3NpemUsIGlwdGFiX2N1cnJlbnQ7CnN0YXRpYyBtaWJfaXBBZEVudCAqaXAgPSAobWliX2lwQWRFbnQgKikgMDsKCnN0YXRpYyB2b2lkCkFkZHJlc3NfU2Nhbl9Jbml0KHZvaWQpCnsKICAgIGludCAgICAgICAgICAgICBmZDsKICAgIHN0cnVjdCBubXBhcm1zICBwOwogICAgaW50ICAgICAgICAgICAgIHZhbDsKICAgIHVuc2lnbmVkIGludCAgICB1bGVuOwogICAgaW50ICAgICAgICAgICAgIHJldDsKCiAgICBpZiAoaXApCiAgICAgICAgZnJlZShpcCk7CiAgICBpcCA9IChtaWJfaXBBZEVudCAqKSAwOwogICAgaXB0YWJfc2l6ZSA9IDA7CgogICAgaWYgKChmZCA9IG9wZW5fbWliKCIvZGV2L2lwIiwgT19SRE9OTFksIDAsIE5NX0FTWU5DX09GRikpID49IDApIHsKICAgICAgICBwLm9iamlkID0gSURfaXBBZGRyTnVtRW50OwogICAgICAgIHAuYnVmZmVyID0gKHZvaWQgKikgJnZhbDsKICAgICAgICB1bGVuID0gc2l6ZW9mKGludCk7CiAgICAgICAgcC5sZW4gPSAmdWxlbjsKICAgICAgICBpZiAoKHJldCA9IGdldF9taWJfaW5mbyhmZCwgJnApKSA9PSAwKQogICAgICAgICAgICBpcHRhYl9zaXplID0gdmFsOwoKICAgICAgICBpZiAoaXB0YWJfc2l6ZSA+IDApIHsKICAgICAgICAgICAgdWxlbiA9ICh1bnNpZ25lZCkgaXB0YWJfc2l6ZSAqc2l6ZW9mKG1pYl9pcEFkRW50KTsKICAgICAgICAgICAgaXAgPSAobWliX2lwQWRFbnQgKikgbWFsbG9jKHVsZW4pOwogICAgICAgICAgICBwLm9iamlkID0gSURfaXBBZGRyVGFibGU7CiAgICAgICAgICAgIHAuYnVmZmVyID0gKHZvaWQgKikgaXA7CiAgICAgICAgICAgIHAubGVuID0gJnVsZW47CiAgICAgICAgICAgIGlmICgocmV0ID0gZ2V0X21pYl9pbmZvKGZkLCAmcCkpIDwgMCkKICAgICAgICAgICAgICAgIGlwdGFiX3NpemUgPSAwOwogICAgICAgIH0KCiAgICAgICAgY2xvc2VfbWliKGZkKTsKICAgIH0KCiAgICBpcHRhYl9jdXJyZW50ID0gMDsKfQoKLyoKICogTkI6IEluZGV4IGlzIHRoZSBudW1iZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJmYWNlLCBub3Qgb2YgdGhlIGFkZHJlc3MgCiAqLwpzdGF0aWMgaW50CkFkZHJlc3NfU2Nhbl9OZXh0KEluZGV4LCBSZXRpbl9pZmFkZHIpCiAgICAgc2hvcnQgICAgICAgICAgKkluZGV4OwogICAgIG1pYl9pcEFkRW50ICAgICpSZXRpbl9pZmFkZHI7CnsKICAgIGlmIChpcHRhYl9jdXJyZW50IDwgaXB0YWJfc2l6ZSkgewogICAgICAgIC8qCiAgICAgICAgICogY29weSB2YWx1ZXMgCiAgICAgICAgICovCiAgICAgICAgKkluZGV4ID0gaXBbaXB0YWJfY3VycmVudF0uSWZJbmRleDsKICAgICAgICAqUmV0aW5faWZhZGRyID0gaXBbaXB0YWJfY3VycmVudF07CiAgICAgICAgLyoKICAgICAgICAgKiBpbmNyZW1lbnQgdG8gcG9pbnQgdG8gbmV4dCBlbnRyeSAKICAgICAgICAgKi8KICAgICAgICBpcHRhYl9jdXJyZW50Kys7CiAgICAgICAgLyoKICAgICAgICAgKiByZXR1cm4gc3VjY2VzcyAKICAgICAgICAgKi8KICAgICAgICByZXR1cm4gKDEpOwogICAgfQoKICAgIC8qCiAgICAgKiByZXR1cm4gZG9uZSAKICAgICAqLwogICAgcmV0dXJuICgwKTsKfQoKI2VsaWYgZGVmaW5lZChsaW51eCkKc3RhdGljIHN0cnVjdCBpZnJlcSAqaWZyOwpzdGF0aWMgaW50IGlmcl9jb3VudGVyOwoKc3RhdGljIHZvaWQKQWRkcmVzc19TY2FuX0luaXQodm9pZCkKewogICAgaW50IG51bV9pbnRlcmZhY2VzID0gMDsKICAgIGludCBmZDsKCiAgICAvKiBnZXQgaW5mbyBhYm91dCBhbGwgaW50ZXJmYWNlcyAqLwoKICAgIGlmYy5pZmNfbGVuID0gMDsKICAgIFNOTVBfRlJFRShpZmMuaWZjX2J1Zik7CiAgICBpZnJfY291bnRlciA9IDA7CgogICAgZG8KICAgIHsKCWlmICgoZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCkpIDwgMCkKCXsKCSAgICBERUJVR01TR1RMKCgic25tcGQiLCAic29ja2V0IG9wZW4gZmFpbHVyZSBpbiBBZGRyZXNzX1NjYW5fSW5pdFxuIikpOwoJICAgIHJldHVybjsKCX0KCW51bV9pbnRlcmZhY2VzICs9IDE2OwoKCWlmYy5pZmNfbGVuID0gc2l6ZW9mKHN0cnVjdCBpZnJlcSkgKiBudW1faW50ZXJmYWNlczsKCWlmYy5pZmNfYnVmID0gKGNoYXIqKSByZWFsbG9jKGlmYy5pZmNfYnVmLCBpZmMuaWZjX2xlbik7CgkKCSAgICBpZiAoaW9jdGwoZmQsIFNJT0NHSUZDT05GLCAmaWZjKSA8IDApCgkgICAgewoJCWlmcj1OVUxMOwoJCWNsb3NlKGZkKTsKCSAgIAlyZXR1cm47CgkgICAgfQoJICAgIGNsb3NlKGZkKTsKICAgIH0KICAgIHdoaWxlIChpZmMuaWZjX2xlbiA+PSAoc2l6ZW9mKHN0cnVjdCBpZnJlcSkgKiBudW1faW50ZXJmYWNlcykpOwogICAgCiAgICBpZnIgPSBpZmMuaWZjX3JlcTsKICAgIGNsb3NlKGZkKTsKfQoKLyoKICogTkI6IEluZGV4IGlzIHRoZSBudW1iZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJmYWNlLCBub3Qgb2YgdGhlIGFkZHJlc3MgCiAqLwpzdGF0aWMgaW50CkFkZHJlc3NfU2Nhbl9OZXh0KHNob3J0ICpJbmRleCwgc3RydWN0IGlmbmV0ICpSZXRpZm5ldCkKewogICAgc3RydWN0IGlmbmV0ICAgaWZuZXRfc3RvcmU7CiAgICBpbnQgZmQ7CiAgICBpZiAoKGZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApKSA8IDApCiAgICB7CglERUJVR01TR1RMKCgic25tcGQiLCAic29ja2V0IG9wZW4gZmFpbHVyZSBpbiBBZGRyZXNzX1NjYW5fTmV4dFxuIikpOwoJcmV0dXJuKDApOwogICAgfQoKICAgIHdoaWxlIChpZnIpIHsKCQoJaWZuZXRfc3RvcmUuaWZfYWRkciA9IGlmci0+aWZyX2FkZHI7CgogICAgICAgIGlmIChSZXRpZm5ldCkKCXsKCSAgICBSZXRpZm5ldC0+aWZfYWRkciA9IGlmci0+aWZyX2FkZHI7CgkgICAgCgkgICAgaWYgKGlvY3RsKGZkLCBTSU9DR0lGQlJEQUREUiwgaWZyKSA8IDApCgkgICAgewoJCW1lbXNldCgoY2hhciAqKSAmUmV0aWZuZXQtPmlmdV9icm9hZGFkZHIsIDAsIHNpemVvZihSZXRpZm5ldC0+aWZ1X2Jyb2FkYWRkcikpOwoJICAgIH0KCSAgICBlbHNlCgkJUmV0aWZuZXQtPmlmdV9icm9hZGFkZHIgPSBpZnItPmlmcl9icm9hZGFkZHI7CgoJICAgIGlmci0+aWZyX2FkZHIgPSBSZXRpZm5ldC0+aWZfYWRkcjsKCSAgICBpZiAoaW9jdGwoZmQsIFNJT0NHSUZORVRNQVNLLCBpZnIpIDwgMCkKCSAgICB7CgkJbWVtc2V0KChjaGFyICopICZSZXRpZm5ldC0+aWFfc3VibmV0bWFzaywgMCwgc2l6ZW9mKFJldGlmbmV0LT5pYV9zdWJuZXRtYXNrKSk7CgkgICAgfQoJICAgIGVsc2UKCQlSZXRpZm5ldC0+aWFfc3VibmV0bWFzayA9IGlmci0+aWZyX25ldG1hc2s7CgoJfQoKICAgICAgICBpZiAoSW5kZXgpCgl7CgkgICAgaWZyLT5pZnJfYWRkciA9IGlmbmV0X3N0b3JlLmlmX2FkZHI7CiAgICAgICAgICAgICpJbmRleCA9IG5ldHNubXBfYWNjZXNzX2ludGVyZmFjZV9pbmRleF9maW5kKGlmci0+aWZyX25hbWUpOwoJfQoJCglpZnIrKzsKCWlmcl9jb3VudGVyKz1zaXplb2Yoc3RydWN0IGlmcmVxKTsKCWlmIChpZnJfY291bnRlciA+PSBpZmMuaWZjX2xlbikKCXsKCSAgICBpZnIgPSBOVUxMOwkvKiBiZXlvbmQgdGhlIGVuZCAqLwoJfQoKICAgICAgICBjbG9zZShmZCk7CiAgICAgICAgcmV0dXJuICgxKTsgICAgICAgICAgICAgLyogRE9ORSAqLwogICAgfQogICAgY2xvc2UoZmQpOwogICAgcmV0dXJuICgwKTsgICAgICAgICAgICAgICAgIC8qIEVPRiAqLwp9CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZyZWVic2QsaHB1eDExLGxpbnV4ICovCgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbGFyaXMyICovCgoKc3RhdGljIGludApJUF9DbXAodm9pZCAqYWRkciwgdm9pZCAqZXApCnsKICAgIGlmICgoKG1pYjJfaXBBZGRyRW50cnlfdCAqKSBlcCktPmlwQWRFbnRBZGRyID09ICooSXBBZGRyZXNzICopIGFkZHIpCiAgICAgICAgcmV0dXJuICgwKTsKICAgIGVsc2UKICAgICAgICByZXR1cm4gKDEpOwp9Cgp1X2NoYXIgICAgICAgICAqCnZhcl9pcEFkZHJFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKiB2cCwKICAgICAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgLyoKICAgICAqIG9iamVjdCBpZGVudGlmaWVyIGlzIG9mIGZvcm06CiAgICAgKiAxLjMuNi4xLjIuMS40LjIwLjEuPy5BLkIuQy5ELCAgd2hlcmUgQS5CLkMuRCBpcyBJUCBhZGRyZXNzLgogICAgICogSVBBRERSIHN0YXJ0cyBhdCBvZmZzZXQgMTAuCiAgICAgKi8KI2RlZmluZSBJUF9BRERSTkFNRV9MRU5HVEgJMTQKI2RlZmluZSBJUF9BRERSSU5ERVhfT0ZGCTEwCiAgICBvaWQgICAgICAgICAgICAgbG93ZXN0W0lQX0FERFJOQU1FX0xFTkdUSF07CiAgICBvaWQgICAgICAgICAgICAgY3VycmVudFtJUF9BRERSTkFNRV9MRU5HVEhdLCAqb3A7CiAgICB1X2NoYXIgICAgICAgICAqY3A7CiAgICBJcEFkZHJlc3MgICAgICAgTmV4dEFkZHI7CiAgICBtaWIyX2lwQWRkckVudHJ5X3QgZW50cnk7CiAgICBzdGF0aWMgbWliMl9pcEFkZHJFbnRyeV90IExvd2VudHJ5OwogICAgaW50ICAgICAgICAgICAgIEZvdW5kID0gMDsKICAgIHJlcV9lICAgICAgICAgICByZXFfdHlwZTsKICAgIHN0YXRpYyBpbl9hZGRyX3QgYWRkcl9yZXQ7CgogICAgLyoKICAgICAqIGZpbGwgaW4gb2JqZWN0IHBhcnQgb2YgbmFtZSBmb3IgY3VycmVudCAobGVzcyBzaXplb2YgaW5zdGFuY2UgcGFydCkgCiAgICAgKi8KCiAgICBERUJVR01TR1RMKCgibWliSUkvaXAiLCAidmFyX2lwQWRkckVudHJ5OiAiKSk7CiAgICBERUJVR01TR09JRCgoIm1pYklJL2lwIiwgbmFtZSwgKmxlbmd0aCkpOwogICAgREVCVUdNU0coKCJtaWJJSS9pcCIsICIgJWRcbiIsIGV4YWN0KSk7CgogICAgbWVtc2V0KCZMb3dlbnRyeSwgMCwgc2l6ZW9mKExvd2VudHJ5KSk7CiAgICBtZW1jcHkoKGNoYXIgKikgY3VycmVudCwgKGNoYXIgKikgdnAtPm5hbWUsCiAgICAgICAgICAgKGludCkgdnAtPm5hbWVsZW4gKiBzaXplb2Yob2lkKSk7CiAgICBpZiAoKmxlbmd0aCA9PSBJUF9BRERSTkFNRV9MRU5HVEgpICAvKiBBc3N1bWUgdGhhdCB0aGUgaW5wdXQgbmFtZSBpcyB0aGUgbG93ZXN0ICovCiAgICAgICAgbWVtY3B5KChjaGFyICopIGxvd2VzdCwgKGNoYXIgKikgbmFtZSwKICAgICAgICAgICAgICAgSVBfQUREUk5BTUVfTEVOR1RIICogc2l6ZW9mKG9pZCkpOwogICAgZWxzZQoJbG93ZXN0WzBdID0gMHhmZjsKICAgIGZvciAoTmV4dEFkZHIgPSAodV9sb25nKSAtIDEsIHJlcV90eXBlID0gR0VUX0ZJUlNUOzsKICAgICAgICAgTmV4dEFkZHIgPSBlbnRyeS5pcEFkRW50QWRkciwgcmVxX3R5cGUgPSBHRVRfTkVYVCkgewogICAgICAgIGlmIChnZXRNaWJzdGF0CiAgICAgICAgICAgIChNSUJfSVBfQUREUiwgJmVudHJ5LCBzaXplb2YobWliMl9pcEFkZHJFbnRyeV90KSwgcmVxX3R5cGUsCiAgICAgICAgICAgICAmSVBfQ21wLCAmTmV4dEFkZHIpICE9IDApCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIENPUFlfSVBBRERSKGNwLCAodV9jaGFyICopICYgZW50cnkuaXBBZEVudEFkZHIsIG9wLAogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgKyBJUF9BRERSSU5ERVhfT0ZGKTsKICAgICAgICBpZiAoZXhhY3QpIHsKICAgICAgICAgICAgaWYgKHNubXBfb2lkX2NvbXBhcmUKICAgICAgICAgICAgICAgIChjdXJyZW50LCBJUF9BRERSTkFNRV9MRU5HVEgsIG5hbWUsICpsZW5ndGgpID09IDApIHsKICAgICAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSBsb3dlc3QsIChjaGFyICopIGN1cnJlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgSVBfQUREUk5BTUVfTEVOR1RIICogc2l6ZW9mKG9pZCkpOwogICAgICAgICAgICAgICAgTG93ZW50cnkgPSBlbnRyeTsKICAgICAgICAgICAgICAgIEZvdW5kKys7CiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgLyogbm8gbmVlZCB0byBzZWFyY2ggZnVydGhlciAqLwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKChzbm1wX29pZF9jb21wYXJlCiAgICAgICAgICAgICAgICAgKGN1cnJlbnQsIElQX0FERFJOQU1FX0xFTkdUSCwgbmFtZSwgKmxlbmd0aCkgPiAwKQogICAgICAgICAgICAgICAgJiYgKCgoTmV4dEFkZHIgPT0gKHVfbG9uZykgLSAxKSkKICAgICAgICAgICAgICAgICAgICB8fAogICAgICAgICAgICAgICAgICAgIChzbm1wX29pZF9jb21wYXJlCiAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50LCBJUF9BRERSTkFNRV9MRU5HVEgsIGxvd2VzdCwKICAgICAgICAgICAgICAgICAgICAgIElQX0FERFJOQU1FX0xFTkdUSCkgPCAwKQogICAgICAgICAgICAgICAgICAgIHx8CiAgICAgICAgICAgICAgICAgICAgKHNubXBfb2lkX2NvbXBhcmUKICAgICAgICAgICAgICAgICAgICAgKG5hbWUsICpsZW5ndGgsIGxvd2VzdCwgSVBfQUREUk5BTUVfTEVOR1RIKSA9PSAwKSkpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBpZiBuZXcgb25lIGlzIGdyZWF0ZXIgdGhhbiBpbnB1dCBhbmQgY2xvc2VyIHRvIGlucHV0IHRoYW4KICAgICAgICAgICAgICAgICAqIHByZXZpb3VzIGxvd2VzdCwgYW5kIGlzIG5vdCBlcXVhbCB0byBpdCwgc2F2ZSB0aGlzIG9uZSBhcyB0aGUgIm5leHQiIG9uZS4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgTG93ZW50cnkgPSBlbnRyeTsKICAgICAgICAgICAgICAgIEZvdW5kKys7CiAgICAgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKikgbG93ZXN0LCAoY2hhciAqKSBjdXJyZW50LAogICAgICAgICAgICAgICAgICAgICAgIElQX0FERFJOQU1FX0xFTkdUSCAqIHNpemVvZihvaWQpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIERFQlVHTVNHVEwoKCJtaWJJSS9pcCIsICIuLi4gRm91bmQgPSAlZFxuIiwgRm91bmQpKTsKICAgIGlmIChGb3VuZCA9PSAwKQogICAgICAgIHJldHVybiAoTlVMTCk7CiAgICBtZW1jcHkoKGNoYXIgKikgbmFtZSwgKGNoYXIgKikgbG93ZXN0LAogICAgICAgICAgIElQX0FERFJOQU1FX0xFTkdUSCAqIHNpemVvZihvaWQpKTsKICAgICpsZW5ndGggPSBJUF9BRERSTkFNRV9MRU5HVEg7CiAgICAqd3JpdGVfbWV0aG9kID0gMDsKICAgICp2YXJfbGVuID0gc2l6ZW9mKGxvbmdfcmV0dXJuKTsKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIElQQURBRERSOgoJKnZhcl9sZW4gPSBzaXplb2YoYWRkcl9yZXQpOwogICAgICAgIGFkZHJfcmV0ID0gTG93ZW50cnkuaXBBZEVudEFkZHI7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBhZGRyX3JldDsKICAgIGNhc2UgSVBBRElGSU5ERVg6CiNpZmRlZiBORVRTTk1QX0lOQ0xVREVfSUZUQUJMRV9SRVdSSVRFUwogICAgICAgIExvd2VudHJ5LmlwQWRFbnRJZkluZGV4Lm9fYnl0ZXNbTG93ZW50cnkuaXBBZEVudElmSW5kZXgub19sZW5ndGhdID0gJ1wwJzsKICAgICAgICBsb25nX3JldHVybiA9CiAgICAgICAgICAgIG5ldHNubXBfYWNjZXNzX2ludGVyZmFjZV9pbmRleF9maW5kKExvd2VudHJ5LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcEFkRW50SWZJbmRleC5vX2J5dGVzKTsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9CiAgICAgICAgICAgSW50ZXJmYWNlX0luZGV4X0J5X05hbWUoTG93ZW50cnkuaXBBZEVudElmSW5kZXgub19ieXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb3dlbnRyeS5pcEFkRW50SWZJbmRleC5vX2xlbmd0aCk7CiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQQURORVRNQVNLOgoJKnZhcl9sZW4gPSBzaXplb2YoYWRkcl9yZXQpOwogICAgICAgIGFkZHJfcmV0ID0gTG93ZW50cnkuaXBBZEVudE5ldE1hc2s7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBhZGRyX3JldDsKICAgIGNhc2UgSVBBREJDQVNUQUREUjoKCWxvbmdfcmV0dXJuID0gTG93ZW50cnkuaXBBZEVudEJjYXN0QWRkcjsKCXJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQQURSRUFTTU1BWDoKCWxvbmdfcmV0dXJuID0gTG93ZW50cnkuaXBBZEVudFJlYXNtTWF4U2l6ZTsKCXJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZCIsICJ1bmtub3duIHN1Yi1pZCAlZCBpbiB2YXJfaXBBZGRyRW50cnlcbiIsCiAgICAgICAgICAgICAgICAgICAgdnAtPm1hZ2ljKSk7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzb2xhcmlzMiAqLwoKCgogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioKCSAqCgkgKiAgSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZnVuY3Rpb25zCgkgKgoJICoqKioqKioqKioqKioqKioqKioqKi8KCgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwgJiYgSVBDVExfU1RBVFMgKi8KCi8qCiAqIElkZWFsbHksIHRoaXMgd291bGQgYmUgY29tYmluZWQgd2l0aCB0aGUgY29kZSBpbiBpbnRlcmZhY2VzLmMuCiAqIEV2ZW4gc2VwYXJhdGUsIGl0J3Mgc3RpbGwgYmV0dGVyIHRoYW4gd2hhdCB3ZW50IGJlZm9yZS4KICovCnN0cnVjdCBpZmxpc3QgewogICAgaW50ICAgICAgICAgICAgIGZsYWdzOwogICAgaW50ICAgICAgICAgICAgIGluZGV4OwogICAgc3RydWN0IGluX2FkZHIgIGFkZHI7CiAgICBzdHJ1Y3QgaW5fYWRkciAgbWFzazsKICAgIHN0cnVjdCBpbl9hZGRyICBiY2FzdDsKfTsKc3RhdGljIHN0cnVjdCBpZmxpc3QgKmlmczsKc3RhdGljIGludCAgICAgIG5pZnM7CgpzdGF0aWMgdm9pZApnZXRfaWZsaXN0KHZvaWQpCnsKICAgIGludCAgICAgICAgICAgICBuYWRkcnMsIGJpdDsKICAgIHN0YXRpYyBpbnQgICAgICBtaWJbNl0KICAgID0geyBDVExfTkVULCBQRl9ST1VURSwgMCwgQUZfSU5FVCwgTkVUX1JUX0lGTElTVCwgMCB9OwogICAgY2hhciAgICAgICAgICAgKmNwLCAqaWZidWY7CiAgICBzaXplX3QgICAgICAgICAgbGVuOwogICAgc3RydWN0IHJ0X21zZ2hkciAqcnRtOwogICAgc3RydWN0IGlmX21zZ2hkciAqaWZtOwogICAgc3RydWN0IGlmYV9tc2doZHIgKmlmYW07CiAgICBzdHJ1Y3Qgc29ja2FkZHIgKnNhOwogICAgaW50ICAgICAgICAgICAgIGZsYWdzOwoKICAgIG5hZGRycyA9IDA7CiAgICBpZiAoaWZzKQogICAgICAgIGZyZWUoaWZzKTsKICAgIGlmcyA9IDA7CiAgICBuaWZzID0gMDsKICAgIGxlbiA9IDA7CiAgICBpZiAoc3lzY3RsKG1pYiwgNiwgMCwgJmxlbiwgMCwgMCkgPCAwKQogICAgICAgIHJldHVybjsKCiAgICBpZmJ1ZiA9IG1hbGxvYyhsZW4pOwogICAgaWYgKGlmYnVmID09IDApCiAgICAgICAgcmV0dXJuOwogICAgaWYgKHN5c2N0bChtaWIsIDYsIGlmYnVmLCAmbGVuLCAwLCAwKSA8IDApIHsKICAgICAgICBzeXNsb2coTE9HX1dBUk5JTkcsICJzeXNjdGwgbmV0LXJvdXRlLWlmbGlzdDogJW0iKTsKICAgICAgICBmcmVlKGlmYnVmKTsKICAgICAgICByZXR1cm47CiAgICB9CgogIGxvb3A6CiAgICBjcCA9IGlmYnVmOwogICAgd2hpbGUgKGNwIDwgJmlmYnVmW2xlbl0pIHsKICAgICAgICBpbnQgICAgICAgICAgICAgZ290YWRkcjsKCiAgICAgICAgZ290YWRkciA9IDA7CiAgICAgICAgcnRtID0gKHN0cnVjdCBydF9tc2doZHIgKikgY3A7CiAgICAgICAgaWYgKHJ0bS0+cnRtX3ZlcnNpb24gIT0gUlRNX1ZFUlNJT04gfHwgcnRtLT5ydG1fdHlwZSAhPSBSVE1fSUZJTkZPKSB7CiAgICAgICAgICAgIGZyZWUoaWZzKTsKICAgICAgICAgICAgaWZzID0gMDsKICAgICAgICAgICAgbmlmcyA9IDA7CiAgICAgICAgICAgIGZyZWUoaWZidWYpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmbSA9IChzdHJ1Y3QgaWZfbXNnaGRyICopIHJ0bTsKICAgICAgICBmbGFncyA9IGlmbS0+aWZtX2ZsYWdzOwogICAgICAgIGNwICs9IGlmbS0+aWZtX21zZ2xlbjsKICAgICAgICBydG0gPSAoc3RydWN0IHJ0X21zZ2hkciAqKSBjcDsKICAgICAgICB3aGlsZSAoY3AgPCAmaWZidWZbbGVuXSAmJiBydG0tPnJ0bV90eXBlID09IFJUTV9ORVdBRERSKSB7CiAgICAgICAgICAgIGlmYW0gPSAoc3RydWN0IGlmYV9tc2doZHIgKikgcnRtOwogICAgICAgICAgICBjcCArPSBzaXplb2YoKmlmYW0pOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBmcm9tIHJvdXRlLmMgCiAgICAgICAgICAgICAqLwojZGVmaW5lIFJPVU5EKGEpIFwKICAgICAgICAoKGEpID4gMCA/ICgxICsgKCgoYSkgLSAxKSB8IChzaXplb2YobG9uZykgLSAxKSkpIDogc2l6ZW9mKGxvbmcpKQogICAgICAgICAgICBmb3IgKGJpdCA9IDE7IGJpdCAmJiBjcCA8ICZpZmJ1ZltsZW5dOyBiaXQgPDw9IDEpIHsKICAgICAgICAgICAgICAgIGlmICghKGlmYW0tPmlmYW1fYWRkcnMgJiBiaXQpKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgc2EgPSAoc3RydWN0IHNvY2thZGRyICopIGNwOwogICAgICAgICAgICAgICAgY3AgKz0gUk9VTkQoc2EtPnNhX2xlbik7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIE5ldG1hc2tzIGFyZSByZXR1cm5lZCBhcyBiaXQKICAgICAgICAgICAgICAgICAqIHN0cmluZ3Mgb2YgdHlwZSBBRl9VTlNQRUMuICBUaGUKICAgICAgICAgICAgICAgICAqIG90aGVycyBhcmUgcHJldHR5IG9rLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAoYml0ID09IFJUQV9JRkEpIHsKI2RlZmluZSBzYXRvc2luKHNhKSAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKShzYSkpCiAgICAgICAgICAgICAgICAgICAgaWYgKGlmcykgewogICAgICAgICAgICAgICAgICAgICAgICBpZnNbbmFkZHJzXS5hZGRyID0gc2F0b3NpbihzYSktPnNpbl9hZGRyOwogICAgICAgICAgICAgICAgICAgICAgICBpZnNbbmFkZHJzXS5pbmRleCA9IGlmYW0tPmlmYW1faW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmc1tuYWRkcnNdLmZsYWdzID0gZmxhZ3M7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdvdGFkZHIgPSAxOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiaXQgPT0gUlRBX05FVE1BU0spIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaWZzKQogICAgICAgICAgICAgICAgICAgICAgICBpZnNbbmFkZHJzXS5tYXNrID0gc2F0b3NpbihzYSktPnNpbl9hZGRyOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiaXQgPT0gUlRBX0JSRCkgewogICAgICAgICAgICAgICAgICAgIGlmIChpZnMpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmc1tuYWRkcnNdLmJjYXN0ID0gc2F0b3NpbihzYSktPnNpbl9hZGRyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChnb3RhZGRyKQogICAgICAgICAgICAgICAgbmFkZHJzKys7CiAgICAgICAgICAgIGNwID0gKGNoYXIgKikgcnRtICsgcnRtLT5ydG1fbXNnbGVuOwogICAgICAgICAgICBydG0gPSAoc3RydWN0IHJ0X21zZ2hkciAqKSBjcDsKICAgICAgICB9CiAgICB9CiAgICBpZiAoaWZzKSB7CiAgICAgICAgbmlmcyA9IG5hZGRyczsKICAgICAgICBmcmVlKGlmYnVmKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZnMgPSBtYWxsb2MobmFkZHJzICogc2l6ZW9mKCppZnMpKTsKICAgIGlmIChpZnMgPT0gMCkgewogICAgICAgIGZyZWUoaWZidWYpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIG5hZGRycyA9IDA7CiAgICBnb3RvIGxvb3A7Cn0KCnVfY2hhciAgICAgICAgICoKdmFyX2lwQWRkckVudHJ5KHN0cnVjdCB2YXJpYWJsZSAqdnAsCiAgICAgICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKICAgIC8qCiAgICAgKiBvYmplY3QgaWRlbnRpZmllciBpcyBvZiBmb3JtOgogICAgICogMS4zLjYuMS4yLjEuNC4yMC4xLj8uQS5CLkMuRCwgIHdoZXJlIEEuQi5DLkQgaXMgSVAgYWRkcmVzcy4KICAgICAqIElQQUREUiBzdGFydHMgYXQgb2Zmc2V0IDEwLgogICAgICovCiAgICBvaWQgICAgICAgICAgICAgbG93ZXN0WzE0XTsKICAgIG9pZCAgICAgICAgICAgICBjdXJyZW50WzE0XSwgKm9wOwogICAgdV9jaGFyICAgICAgICAgKmNwOwogICAgaW50ICAgICAgICAgICAgIGxvd2ludGVyZmFjZSA9IC0xOwogICAgaW50ICAgICAgICAgICAgIGk7CiAgICBzdGF0aWMgaW5fYWRkcl90CWFkZHJfcmV0OwogICAgCiAgICAvKgogICAgICogZmlsbCBpbiBvYmplY3QgcGFydCBvZiBuYW1lIGZvciBjdXJyZW50IChsZXNzIHNpemVvZiBpbnN0YW5jZSBwYXJ0KSAKICAgICAqLwogICAgbWVtY3B5KGN1cnJlbnQsIHZwLT5uYW1lLCAoaW50KSB2cC0+bmFtZWxlbiAqIHNpemVvZihvaWQpKTsKCiAgICAvKgogICAgICogR2V0IGludGVyZmFjZSB0YWJsZSBmcm9tIGtlcm5lbC4KICAgICAqLwogICAgZ2V0X2lmbGlzdCgpOwoKICAgIGZvciAoaSA9IDA7IGkgPCBuaWZzOyBpKyspIHsKICAgICAgICBvcCA9ICZjdXJyZW50WzEwXTsKICAgICAgICBjcCA9ICh1X2NoYXIgKikgJiBpZnNbaV0uYWRkcjsKICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICpvcCsrID0gKmNwKys7CiAgICAgICAgKm9wKysgPSAqY3ArKzsKICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgIGlmIChleGFjdCkgewogICAgICAgICAgICBpZiAoc25tcF9vaWRfY29tcGFyZShjdXJyZW50LCAxNCwgbmFtZSwgKmxlbmd0aCkgPT0gMCkgewogICAgICAgICAgICAgICAgbWVtY3B5KGxvd2VzdCwgY3VycmVudCwgMTQgKiBzaXplb2Yob2lkKSk7CiAgICAgICAgICAgICAgICBsb3dpbnRlcmZhY2UgPSBpOwogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgIC8qIG5vIG5lZWQgdG8gc2VhcmNoIGZ1cnRoZXIgKi8KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgoc25tcF9vaWRfY29tcGFyZShjdXJyZW50LCAxNCwgbmFtZSwgKmxlbmd0aCkgPiAwKSAmJgogICAgICAgICAgICAgICAgKGxvd2ludGVyZmFjZSA8IDAKICAgICAgICAgICAgICAgICB8fCAoc25tcF9vaWRfY29tcGFyZShjdXJyZW50LCAxNCwgbG93ZXN0LCAxNCkgPCAwKSkpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBpZiBuZXcgb25lIGlzIGdyZWF0ZXIgdGhhbiBpbnB1dAogICAgICAgICAgICAgICAgICogYW5kIGNsb3NlciB0byBpbnB1dCB0aGFuIHByZXZpb3VzCiAgICAgICAgICAgICAgICAgKiBsb3dlc3QsIHNhdmUgdGhpcyBvbmUgYXMgdGhlICJuZXh0IgogICAgICAgICAgICAgICAgICogb25lLiAgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGxvd2ludGVyZmFjZSA9IGk7CiAgICAgICAgICAgICAgICBtZW1jcHkobG93ZXN0LCBjdXJyZW50LCAxNCAqIHNpemVvZihvaWQpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZiAobG93aW50ZXJmYWNlIDwgMCkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIGkgPSBsb3dpbnRlcmZhY2U7CiAgICBtZW1jcHkobmFtZSwgbG93ZXN0LCAxNCAqIHNpemVvZihvaWQpKTsKICAgICpsZW5ndGggPSAxNDsKICAgICp3cml0ZV9tZXRob2QgPSAwOwogICAgKnZhcl9sZW4gPSBzaXplb2YobG9uZ19yZXR1cm4pOwogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgSVBBREFERFI6CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoYWRkcl9yZXQpOwogICAgICAgIGFkZHJfcmV0ID0gaWZzW2ldLmFkZHIuc19hZGRyOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgYWRkcl9yZXQ7CgogICAgY2FzZSBJUEFESUZJTkRFWDoKICAgICAgICBsb25nX3JldHVybiA9IGlmc1tpXS5pbmRleDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwoKICAgIGNhc2UgSVBBRE5FVE1BU0s6CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoYWRkcl9yZXQpOwogICAgICAgIGFkZHJfcmV0ID0gaWZzW2ldLm1hc2suc19hZGRyOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgYWRkcl9yZXQ7CgogICAgY2FzZSBJUEFEQkNBU1RBRERSOgogICAgICAgIGxvbmdfcmV0dXJuID0gbnRvaGwoaWZzW2ldLmJjYXN0LnNfYWRkcikgJiAxOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CgogICAgY2FzZSBJUEFEUkVBU01NQVg6CiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gLTE7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKI2VuZGlmCgogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gdmFyX2lwQWRkckVudHJ5XG4iLAogICAgICAgICAgICAgICAgICAgIHZwLT5tYWdpYykpOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9DQU5fVVNFX1NZU0NUTCAmJiBJUENUTF9TVEFUUyAqLwoKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXSU4zMiBjeWd3aW4gKi8KI2luY2x1ZGUgPGlwaGxwYXBpLmg+CnVfY2hhciAgICAgICAgICoKdmFyX2lwQWRkckVudHJ5KHN0cnVjdCB2YXJpYWJsZSAqdnAsCiAgICAgICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKICAgIC8qCiAgICAgKiBvYmplY3QgaWRlbnRpZmllciBpcyBvZiBmb3JtOgogICAgICogMS4zLjYuMS4yLjEuNC4yMC4xLj8uQS5CLkMuRCwgIHdoZXJlIEEuQi5DLkQgaXMgSVAgYWRkcmVzcy4KICAgICAqIElQQUREUiBzdGFydHMgYXQgb2Zmc2V0IDEwLgogICAgICovCiAgICBvaWQgICAgICAgICAgICAgbG93ZXN0WzE0XTsKICAgIG9pZCAgICAgICAgICAgICBjdXJyZW50WzE0XSwgKm9wOwogICAgdV9jaGFyICAgICAgICAgKmNwOwogICAgaW50ICAgICAgICAgICAgIGxvd2ludGVyZmFjZSA9IC0xOwogICAgaW50ICAgICAgICAgICAgIGk7CiAgICBQTUlCX0lQQUREUlRBQkxFIHBJcEFkZHJUYWJsZSA9IE5VTEw7CiAgICBEV09SRCAgICAgICAgICAgc3RhdHVzID0gTk9fRVJST1I7CiAgICBEV09SRCAgICAgICAgICAgc3RhdHVzUmV0cnkgPSBOT19FUlJPUjsKICAgIERXT1JEICAgICAgICAgICBkd0FjdHVhbFNpemUgPSAwOwogICAgdm9pZCAgICAgICAgICAgKnJlc3VsdCA9IE5VTEw7CiAgICBzdGF0aWMgaW5fYWRkcl90IAlhZGRyX3JldDsKICAgIAogICAgLyoKICAgICAqIGZpbGwgaW4gb2JqZWN0IHBhcnQgb2YgbmFtZSBmb3IgY3VycmVudCAobGVzcyBzaXplb2YgaW5zdGFuY2UgcGFydCkgCiAgICAgKi8KICAgIG1lbWNweShjdXJyZW50LCB2cC0+bmFtZSwgKGludCkgdnAtPm5hbWVsZW4gKiBzaXplb2Yob2lkKSk7CgogICAgLyoKICAgICAqIEdldCBpbnRlcmZhY2UgdGFibGUgZnJvbSBrZXJuZWwuCiAgICAgKi8KICAgIHN0YXR1cyA9IEdldElwQWRkclRhYmxlKHBJcEFkZHJUYWJsZSwgJmR3QWN0dWFsU2l6ZSwgVFJVRSk7CiAgICBpZiAoc3RhdHVzID09IEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpIHsKICAgICAgICBwSXBBZGRyVGFibGUgPSAoUE1JQl9JUEFERFJUQUJMRSkgbWFsbG9jKGR3QWN0dWFsU2l6ZSk7CiAgICAgICAgaWYgKHBJcEFkZHJUYWJsZSAhPSBOVUxMKSB7CiAgICAgICAgICAgIHN0YXR1c1JldHJ5ID0KICAgICAgICAgICAgICAgIEdldElwQWRkclRhYmxlKHBJcEFkZHJUYWJsZSwgJmR3QWN0dWFsU2l6ZSwgVFJVRSk7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChzdGF0dXNSZXRyeSA9PSBOT19FUlJPUiB8fCBzdGF0dXMgPT0gTk9fRVJST1IpIHsKCiAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpIHBJcEFkZHJUYWJsZS0+ZHdOdW1FbnRyaWVzOyArK2kpIHsKICAgICAgICAgICAgb3AgPSAmY3VycmVudFsxMF07CiAgICAgICAgICAgIGNwID0gKHVfY2hhciAqKSAmIHBJcEFkZHJUYWJsZS0+dGFibGVbaV0uZHdBZGRyOwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICAgICBpZiAoZXhhY3QpIHsKICAgICAgICAgICAgICAgIGlmIChzbm1wX29pZF9jb21wYXJlKGN1cnJlbnQsIDE0LCBuYW1lLCAqbGVuZ3RoKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGxvd2VzdCwgY3VycmVudCwgMTQgKiBzaXplb2Yob2lkKSk7CiAgICAgICAgICAgICAgICAgICAgbG93aW50ZXJmYWNlID0gaTsKICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAvKiBubyBuZWVkIHRvIHNlYXJjaCBmdXJ0aGVyICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoc25tcF9vaWRfY29tcGFyZShjdXJyZW50LCAxNCwgbmFtZSwgKmxlbmd0aCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgbG93aW50ZXJmYWNlID0gaTsKICAgICAgICAgICAgICAgICAgICBtZW1jcHkobG93ZXN0LCBjdXJyZW50LCAxNCAqIHNpemVvZihvaWQpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAvKiBTaW5jZSB0aGUgdGFibGUgaXMgc29ydGVkLCBubyBuZWVkIHRvIHNlYXJjaCBmdXJ0aGVyICAqLwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmIChsb3dpbnRlcmZhY2UgPCAwKQogICAgICAgIGdvdG8gb3V0OwoKICAgIGkgPSBsb3dpbnRlcmZhY2U7CiAgICBtZW1jcHkobmFtZSwgbG93ZXN0LCAxNCAqIHNpemVvZihvaWQpKTsKICAgICpsZW5ndGggPSAxNDsKICAgICp3cml0ZV9tZXRob2QgPSAwOwogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgSVBBREFERFI6CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoYWRkcl9yZXQpOwogICAgICAgIGFkZHJfcmV0ID0gcElwQWRkclRhYmxlLT50YWJsZVtpXS5kd0FkZHI7CiAgICAgICAgcmVzdWx0ID0gJmFkZHJfcmV0OwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgSVBBRElGSU5ERVg6CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YobG9uZ19yZXR1cm4pOwogICAgICAgIGxvbmdfcmV0dXJuID0gcElwQWRkclRhYmxlLT50YWJsZVtpXS5kd0luZGV4OwogICAgICAgIHJlc3VsdCA9ICZsb25nX3JldHVybjsKICAgICAgICBicmVhazsKCiAgICBjYXNlIElQQURORVRNQVNLOgogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKGFkZHJfcmV0KTsKICAgICAgICBhZGRyX3JldCA9IHBJcEFkZHJUYWJsZS0+dGFibGVbaV0uZHdNYXNrOwogICAgICAgIHJlc3VsdCA9ICZhZGRyX3JldDsKICAgICAgICBicmVhazsKCiAgICBjYXNlIElQQURCQ0FTVEFERFI6CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YobG9uZ19yZXR1cm4pOwogICAgICAgIGxvbmdfcmV0dXJuID0gcElwQWRkclRhYmxlLT50YWJsZVtpXS5kd0JDYXN0QWRkcjsKICAgICAgICByZXN1bHQgPSAmbG9uZ19yZXR1cm47CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBJUEFEUkVBU01NQVg6CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YobG9uZ19yZXR1cm4pOwogICAgICAgIGxvbmdfcmV0dXJuID0gcElwQWRkclRhYmxlLT50YWJsZVtpXS5kd1JlYXNtU2l6ZTsKICAgICAgICByZXN1bHQgPSAmbG9uZ19yZXR1cm47CiAgICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gdmFyX2lwQWRkckVudHJ5XG4iLAogICAgICAgICAgICAgICAgICAgIHZwLT5tYWdpYykpOwogICAgICAgIGJyZWFrOwogICAgfQoKb3V0OgogICAgZnJlZShwSXBBZGRyVGFibGUpOwogICAgcmV0dXJuIHJlc3VsdDsKfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdJTjMyIGN5Z3dpbiAqLwo=