LyoKICogIFRlbXBsYXRlIE1JQiBncm91cCBpbXBsZW1lbnRhdGlvbiAtIGF0LmMKICoKICovCgovKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQocykuICBTZWUKICogdGhlIE5ldC1TTk1QJ3MgQ09QWUlORyBmaWxlIGZvciBtb3JlIGRldGFpbHMgYW5kIG90aGVyIGNvcHlyaWdodHMKICogdGhhdCBtYXkgYXBwbHk6CiAqLwovKgogKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGNvcHlyaWdodGVkIGJ5OgogKiBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KI2luY2x1ZGUgIm1pYklJX2NvbW1vbi5oIiAvKiBmb3IgTkVUU05NUF9LTE9PS1VQICovCgojaWYgSEFWRV9TVFJJTkdfSAojaW5jbHVkZSA8c3RyaW5nLmg+CiNlbHNlCiNpbmNsdWRlIDxzdHJpbmdzLmg+CiNlbmRpZgojaWYgSEFWRV9TVERMSUJfSAojaW5jbHVkZSA8c3RkbGliLmg+CiNlbmRpZgojaWYgZGVmaW5lZChORVRTTk1QX0lGTkVUX05FRURTX0tFUk5FTCkgJiYgIWRlZmluZWQoX0tFUk5FTCkKI2RlZmluZSBfS0VSTkVMIDEKI2RlZmluZSBfSV9ERUZJTkVEX0tFUk5FTAojZW5kaWYKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWYgVElNRV9XSVRIX1NZU19USU1FCiMgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBpbmNsdWRlIDx0aW1lLmg+CiNlbHNlCiMgaWYgSEFWRV9TWVNfVElNRV9ICiMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgZWxzZQojICBpbmNsdWRlIDx0aW1lLmg+CiMgZW5kaWYKI2VuZGlmCiNpZiBIQVZFX1NZU19TT0NLRVRfSAojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojZW5kaWYKCiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKI2lmIEhBVkVfTkVUX0lGX0gKI2luY2x1ZGUgPG5ldC9pZi5oPgojZW5kaWYKI2lmIEhBVkVfTkVUX0lGX1ZBUl9ICiNpbmNsdWRlIDxuZXQvaWZfdmFyLmg+CiNlbmRpZgojaWZkZWYgX0lfREVGSU5FRF9LRVJORUwKI3VuZGVmIF9LRVJORUwKI2VuZGlmCgojaWYgSEFWRV9ORVRJTkVUX0lGX0VUSEVSX0gKI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KI2VuZGlmCiNpZiBIQVZFX0lORVRfTUlCMl9ICiNpbmNsdWRlIDxpbmV0L21pYjIuaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19TWVNDVExfSAojaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgojZW5kaWYKI2lmIEhBVkVfTkVUX0lGX0RMX0gKI2lmbmRlZiBkeW5peAojaW5jbHVkZSA8bmV0L2lmX2RsLmg+CiNlbHNlCiNpbmNsdWRlIDxzeXMvbmV0L2lmX2RsLmg+CiNlbmRpZgojZW5kaWYKI2lmIEhBVkVfU1lTX1NUUkVBTV9ICiNpbmNsdWRlIDxzeXMvc3RyZWFtLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRfUk9VVEVfSAojaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiNlbmRpZgojaWZkZWYgc29sYXJpczIKI2luY2x1ZGUgImtlcm5lbF9zdW5vczUuaCIKI2VuZGlmCgojaWZkZWYgaHB1eDExCiNpbmNsdWRlIDxzeXMvbWliLmg+CiNpbmNsdWRlIDxuZXRpbmV0L21pYl9rZXJuLmg+CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaHB1eDExICovCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtaW5jbHVkZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L25ldC1zbm1wLWFnZW50LWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9hdXRvX25saXN0Lmg+CgojaW5jbHVkZSAiYXQuaCIKI2luY2x1ZGUgImludGVyZmFjZXMuaCIKCiNpbmNsdWRlIDxuZXQtc25tcC9kYXRhX2FjY2Vzcy9pbnRlcmZhY2UuaD4KCiNpZiBkZWZpbmVkKEhBVkVfU1lTX1NZU0NUTF9IKSAmJiAhZGVmaW5lZChORVRTTk1QX0NBTl9VU0VfU1lTQ1RMKQojIGlmIGRlZmluZWQoUlRGX0xMSU5GTykgCiMgIGRlZmluZSBORVRTTk1QX0NBTl9VU0VfU1lTQ1RMIDEKIyBlbmRpZgojZW5kaWYKCiNpZmRlZiBjeWd3aW4KI2luY2x1ZGUgPHdpbmRvd3MuaD4KI2VuZGlmCgogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioKCSAqCgkgKiAgS2VybmVsICYgaW50ZXJmYWNlIGluZm9ybWF0aW9uLAoJICogICBhbmQgaW50ZXJuYWwgZm9yd2FyZCBkZWNsYXJhdGlvbnMKCSAqCgkgKioqKioqKioqKioqKioqKioqKioqLwoKI2lmICFkZWZpbmVkIChXSU4zMikgJiYgIWRlZmluZWQgKGN5Z3dpbikKI2lmbmRlZiBzb2xhcmlzMgpzdGF0aWMgdm9pZCAgICAgQVJQX1NjYW5fSW5pdCh2b2lkKTsKI2lmZGVmIEFSUF9TQ0FOX0ZPVVJfQVJHVU1FTlRTCnN0YXRpYyBpbnQgICAgICBBUlBfU2Nhbl9OZXh0KGluX2FkZHJfdCAqLCBjaGFyICosIGludCAqLCB1X2xvbmcgKiwgdV9zaG9ydCAqKTsKI2Vsc2UKc3RhdGljIGludCAgICAgIEFSUF9TY2FuX05leHQoaW5fYWRkcl90ICosIGNoYXIgKiwgaW50ICosIHVfbG9uZyAqKTsKI2VuZGlmCiNlbmRpZgojZW5kaWYKCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKgoJICoKCSAqICBQdWJsaWMgaW50ZXJmYWNlIGZ1bmN0aW9ucwoJICoKCSAqKioqKioqKioqKioqKioqKioqKiovCgovKgogKiBkZWZpbmUgdGhlIHN0cnVjdHVyZSB3ZSdyZSBnb2luZyB0byBhc2sgdGhlIGFnZW50IHRvIHJlZ2lzdGVyIG91cgogKiBpbmZvcm1hdGlvbiBhdCAKICovCnN0cnVjdCB2YXJpYWJsZTEgYXRfdmFyaWFibGVzW10gPSB7CiAgICB7QVRJRklOREVYLCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2F0RW50cnksIDEsIHsxfX0sCiAgICB7QVRQSFlTQUREUkVTUywgQVNOX09DVEVUX1NUUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2F0RW50cnksIDEsIHsyfX0sCiAgICB7QVRORVRBRERSRVNTLCBBU05fSVBBRERSRVNTLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfYXRFbnRyeSwgMSwgezN9fQp9OwoKLyoKICogRGVmaW5lIHRoZSBPSUQgcG9pbnRlciB0byB0aGUgdG9wIG9mIHRoZSBtaWIgdHJlZSB0aGF0IHdlJ3JlCiAqIHJlZ2lzdGVyaW5nIHVuZGVybmVhdGggCiAqLwpvaWQgICAgICAgICAgICAgYXRfdmFyaWFibGVzX29pZFtdID0geyBTTk1QX09JRF9NSUIyLCAzLCAxLCAxIH07Cgp2b2lkCmluaXRfYXQodm9pZCkKewogICAgLyoKICAgICAqIHJlZ2lzdGVyIG91cnNlbHZlcyB3aXRoIHRoZSBhZ2VudCB0byBoYW5kbGUgb3VyIG1pYiB0cmVlIAogICAgICovCiAgICBSRUdJU1RFUl9NSUIoIm1pYklJL2F0IiwgYXRfdmFyaWFibGVzLCB2YXJpYWJsZTEsIGF0X3ZhcmlhYmxlc19vaWQpOwojaWZkZWYgc29sYXJpczIKICAgIGluaXRfa2VybmVsX3N1bm9zNSgpOwojZW5kaWYKfQoKI2lmICFkZWZpbmVkIChXSU4zMikgJiYgIWRlZmluZWQgKGN5Z3dpbikKI2lmbmRlZiBzb2xhcmlzMgoKLyoKICogdmFyX2F0RW50cnkoLi4uCiAqIEFyZ3VtZW50czoKICogdnAgICAgIElOICAgICAgLSBwb2ludGVyIHRvIHZhcmlhYmxlIGVudHJ5IHRoYXQgcG9pbnRzIGhlcmUKICogbmFtZSAgICBJTi9PVVQgIC0gSU4vbmFtZSByZXF1ZXN0ZWQsIE9VVC9uYW1lIGZvdW5kCiAqIGxlbmd0aCAgSU4vT1VUICAtIGxlbmd0aCBvZiBJTi9PVVQgb2lkJ3MgCiAqIGV4YWN0ICAgSU4gICAgICAtIFRSVUUgaWYgYW4gZXhhY3QgbWF0Y2ggd2FzIHJlcXVlc3RlZAogKiB2YXJfbGVuIE9VVCAgICAgLSBsZW5ndGggb2YgdmFyaWFibGUgb3IgMCBpZiBmdW5jdGlvbiByZXR1cm5lZAogKiB3cml0ZV9tZXRob2QKICogCiAqLwoKdV9jaGFyICAgICAgICAgKgp2YXJfYXRFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKnZwLAogICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiAgICAvKgogICAgICogQWRkcmVzcyBUcmFuc2xhdGlvbiB0YWJsZSBvYmplY3QgaWRlbnRpZmllciBpcyBvZiBmb3JtOgogICAgICogMS4zLjYuMS4yLjEuMy4xLjEuMS5pbnRlcmZhY2UuMS5BLkIuQy5ELCAgd2hlcmUgQS5CLkMuRCBpcyBJUCBhZGRyZXNzLgogICAgICogSW50ZXJmYWNlIGlzIGF0IG9mZnNldCAxMCwKICAgICAqIElQQUREUiBzdGFydHMgYXQgb2Zmc2V0IDEyLgogICAgICoKICAgICAqIElQIE5ldCB0byBNZWRpYSB0YWJsZSBvYmplY3QgaWRlbnRpZmllciBpcyBvZiBmb3JtOgogICAgICogMS4zLjYuMS4yLjEuNC4yMi4xLjEuMS5pbnRlcmZhY2UuQS5CLkMuRCwgIHdoZXJlIEEuQi5DLkQgaXMgSVAgYWRkcmVzcy4KICAgICAqIEludGVyZmFjZSBpcyBhdCBvZmZzZXQgMTAsCiAgICAgKiBJUEFERFIgc3RhcnRzIGF0IG9mZnNldCAxMS4KICAgICAqLwogICAgdV9jaGFyICAgICAgICAgKmNwOwogICAgb2lkICAgICAgICAgICAgKm9wOwogICAgb2lkICAgICAgICAgICAgIGxvd2VzdFsxNl07CiAgICBvaWQgICAgICAgICAgICAgY3VycmVudFsxNl07CiAgICBzdGF0aWMgY2hhciAgICAgUGh5c0FkZHJbTUFYX01BQ19BRERSX0xFTl0sIExvd1BoeXNBZGRyW01BWF9NQUNfQUREUl9MRU5dOwogICAgc3RhdGljIGludCAgICAgIFBoeXNBZGRyTGVuLCBMb3dQaHlzQWRkckxlbjsKICAgIGluX2FkZHJfdCAgICAgICBBZGRyLCBMb3dBZGRyOwogICAgaW50ICAgICAgICAgICAgIGZvdW5kb25lOwogICAgc3RhdGljIGluX2FkZHJfdCAgICAgIGFkZHJfcmV0OwojaWZkZWYgQVJQX1NDQU5fRk9VUl9BUkdVTUVOVFMKICAgIHVfc2hvcnQgICAgICAgICBpZkluZGV4LCBsb3dJZkluZGV4ID0gMDsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBUlBfU0NBTl9GT1VSX0FSR1VNRU5UUyAqLwogICAgdV9sb25nICAgICAgICAgIGlmVHlwZSwgbG93SWZUeXBlID0gMDsKCiAgICBpbnQgICAgICAgICAgICAgb2lkX2xlbmd0aDsKCiAgICAvKgogICAgICogZmlsbCBpbiBvYmplY3QgcGFydCBvZiBuYW1lIGZvciBjdXJyZW50IChsZXNzIHNpemVvZiBpbnN0YW5jZSBwYXJ0KSAKICAgICAqLwogICAgbWVtY3B5KChjaGFyICopIGN1cnJlbnQsIChjaGFyICopIHZwLT5uYW1lLAogICAgICAgICAgIChpbnQpIHZwLT5uYW1lbGVuICogc2l6ZW9mKG9pZCkpOwoKICAgIGlmIChjdXJyZW50WzZdID09IDMpIHsgICAgICAvKiBBVCBncm91cCBvaWQgKi8KICAgICAgICBvaWRfbGVuZ3RoID0gMTY7CiAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogSVAgTmV0VG9NZWRpYSBncm91cCBvaWQgKi8KICAgICAgICBvaWRfbGVuZ3RoID0gMTU7CiAgICB9CgogICAgTG93QWRkciA9IDA7ICAgICAgICAgICAgICAgIC8qIERvbid0IGhhdmUgb25lIHlldCAqLwogICAgZm91bmRvbmUgPSAwOwogICAgQVJQX1NjYW5fSW5pdCgpOwogICAgZm9yICg7OykgewojaWZkZWYgQVJQX1NDQU5fRk9VUl9BUkdVTUVOVFMKICAgICAgICBpZiAoQVJQX1NjYW5fTmV4dCgmQWRkciwgUGh5c0FkZHIsICZQaHlzQWRkckxlbiwgJmlmVHlwZSwgJmlmSW5kZXgpID09IDApCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGN1cnJlbnRbMTBdID0gaWZJbmRleDsKCiAgICAgICAgaWYgKGN1cnJlbnRbNl0gPT0gMykgeyAgLyogQVQgZ3JvdXAgb2lkICovCiAgICAgICAgICAgIGN1cnJlbnRbMTFdID0gMTsKICAgICAgICAgICAgb3AgPSBjdXJyZW50ICsgMTI7CiAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgLyogSVAgTmV0VG9NZWRpYSBncm91cCBvaWQgKi8KICAgICAgICAgICAgb3AgPSBjdXJyZW50ICsgMTE7CiAgICAgICAgfQojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFSUF9TQ0FOX0ZPVVJfQVJHVU1FTlRTICovCiAgICAgICAgaWYgKEFSUF9TY2FuX05leHQoJkFkZHIsIFBoeXNBZGRyLCAmUGh5c0FkZHJMZW4sICZpZlR5cGUpID09IDApCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGN1cnJlbnRbMTBdID0gMTsKCiAgICAgICAgaWYgKGN1cnJlbnRbNl0gPT0gMykgeyAgLyogQVQgZ3JvdXAgb2lkICovCiAgICAgICAgICAgIGN1cnJlbnRbMTFdID0gMTsKICAgICAgICAgICAgb3AgPSBjdXJyZW50ICsgMTI7CiAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgLyogSVAgTmV0VG9NZWRpYSBncm91cCBvaWQgKi8KICAgICAgICAgICAgb3AgPSBjdXJyZW50ICsgMTE7CiAgICAgICAgfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFSUF9TQ0FOX0ZPVVJfQVJHVU1FTlRTICovCiAgICAgICAgY3AgPSAodV9jaGFyICopICYgQWRkcjsKICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICpvcCsrID0gKmNwKys7CiAgICAgICAgKm9wKysgPSAqY3ArKzsKICAgICAgICAqb3ArKyA9ICpjcCsrOwoKICAgICAgICBpZiAoZXhhY3QpIHsKICAgICAgICAgICAgaWYgKHNubXBfb2lkX2NvbXBhcmUoY3VycmVudCwgb2lkX2xlbmd0aCwgbmFtZSwgKmxlbmd0aCkgPT0gMCkgewogICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopIGxvd2VzdCwgKGNoYXIgKikgY3VycmVudCwKICAgICAgICAgICAgICAgICAgICAgICBvaWRfbGVuZ3RoICogc2l6ZW9mKG9pZCkpOwogICAgICAgICAgICAgICAgTG93QWRkciA9IEFkZHI7CiAgICAgICAgICAgICAgICBmb3VuZG9uZSA9IDE7CiNpZmRlZiBBUlBfU0NBTl9GT1VSX0FSR1VNRU5UUwogICAgICAgICAgICAgICAgbG93SWZJbmRleCA9IGlmSW5kZXg7CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIEFSUF9TQ0FOX0ZPVVJfQVJHVU1FTlRTICovCiAgICAgICAgICAgICAgICBtZW1jcHkoTG93UGh5c0FkZHIsIFBoeXNBZGRyLCBzaXplb2YoUGh5c0FkZHIpKTsKICAgICAgICAgICAgICAgIExvd1BoeXNBZGRyTGVuID0gUGh5c0FkZHJMZW47CiAgICAgICAgICAgICAgICBsb3dJZlR5cGUgPSBpZlR5cGU7CiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgLyogbm8gbmVlZCB0byBzZWFyY2ggZnVydGhlciAqLwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKChzbm1wX29pZF9jb21wYXJlKGN1cnJlbnQsIG9pZF9sZW5ndGgsIG5hbWUsICpsZW5ndGgpID4gMCkKICAgICAgICAgICAgICAgICYmICgoZm91bmRvbmUgPT0gMCkKICAgICAgICAgICAgICAgICAgICB8fAogICAgICAgICAgICAgICAgICAgIChzbm1wX29pZF9jb21wYXJlCiAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50LCBvaWRfbGVuZ3RoLCBsb3dlc3QsIG9pZF9sZW5ndGgpIDwgMCkpKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogaWYgbmV3IG9uZSBpcyBncmVhdGVyIHRoYW4gaW5wdXQgYW5kIGNsb3NlciB0byBpbnB1dCB0aGFuCiAgICAgICAgICAgICAgICAgKiBwcmV2aW91cyBsb3dlc3QsIHNhdmUgdGhpcyBvbmUgYXMgdGhlICJuZXh0IiBvbmUuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSBsb3dlc3QsIChjaGFyICopIGN1cnJlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgb2lkX2xlbmd0aCAqIHNpemVvZihvaWQpKTsKICAgICAgICAgICAgICAgIExvd0FkZHIgPSBBZGRyOwogICAgICAgICAgICAgICAgZm91bmRvbmUgPSAxOwojaWZkZWYgQVJQX1NDQU5fRk9VUl9BUkdVTUVOVFMKICAgICAgICAgICAgICAgIGxvd0lmSW5kZXggPSBpZkluZGV4OwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBBUlBfU0NBTl9GT1VSX0FSR1VNRU5UUyAqLwogICAgICAgICAgICAgICAgbWVtY3B5KExvd1BoeXNBZGRyLCBQaHlzQWRkciwgc2l6ZW9mKFBoeXNBZGRyKSk7CiAgICAgICAgICAgICAgICBMb3dQaHlzQWRkckxlbiA9IFBoeXNBZGRyTGVuOwogICAgICAgICAgICAgICAgbG93SWZUeXBlID0gaWZUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYgKGZvdW5kb25lID09IDApCiAgICAgICAgcmV0dXJuIChOVUxMKTsKCiAgICBtZW1jcHkoKGNoYXIgKikgbmFtZSwgKGNoYXIgKikgbG93ZXN0LCBvaWRfbGVuZ3RoICogc2l6ZW9mKG9pZCkpOwogICAgKmxlbmd0aCA9IG9pZF9sZW5ndGg7CiAgICAqd3JpdGVfbWV0aG9kID0gKFdyaXRlTWV0aG9kKikwOwogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgSVBNRURJQUlGSU5ERVg6ICAgICAgIC8qIGFsc28gQVRJRklOREVYICovCiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YgbG9uZ19yZXR1cm47CiNpZmRlZiBBUlBfU0NBTl9GT1VSX0FSR1VNRU5UUwogICAgICAgIGxvbmdfcmV0dXJuID0gbG93SWZJbmRleDsKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBUlBfU0NBTl9GT1VSX0FSR1VNRU5UUyAqLwojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAxOyAgICAgICAgLyogWFhYICovCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQVJQX1NDQU5fRk9VUl9BUkdVTUVOVFMgKi8KICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUE1FRElBUEhZU0FERFJFU1M6ICAgLyogYWxzbyBBVFBIWVNBRERSRVNTICovCiAgICAgICAgKnZhcl9sZW4gPSBMb3dQaHlzQWRkckxlbjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBMb3dQaHlzQWRkcjsKICAgIGNhc2UgSVBNRURJQU5FVEFERFJFU1M6ICAgIC8qIGFsc28gQVRORVRBRERSRVNTICovCiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoYWRkcl9yZXQpOwogICAgICAgIGFkZHJfcmV0ID0gTG93QWRkcjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGFkZHJfcmV0OwogICAgY2FzZSBJUE1FRElBVFlQRToKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZiBsb25nX3JldHVybjsKICAgICAgICBsb25nX3JldHVybiA9IGxvd0lmVHlwZTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gdmFyX2F0RW50cnlcbiIsCiAgICAgICAgICAgICAgICAgICAgdnAtPm1hZ2ljKSk7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbGFyaXMyICovCgp0eXBlZGVmIHN0cnVjdCBpZl9pcCB7CiAgICBpbnQgICAgICAgICAgICAgaWZJZHg7CiAgICBJcEFkZHJlc3MgICAgICAgaXBBZGRyOwp9IGlmX2lwX3Q7CgpzdGF0aWMgaW50CkFUX0NtcCh2b2lkICphZGRyLCB2b2lkICplcCkKewogICAgbWliMl9pcE5ldFRvTWVkaWFFbnRyeV90ICptcCA9IChtaWIyX2lwTmV0VG9NZWRpYUVudHJ5X3QgKikgZXA7CiAgICBpbnQgICAgICAgICAgICAgcmV0ID0gLTE7CiAgICBvaWQgICAgICAgICAgICAgaW5kZXg7CgojaWZkZWYgTkVUU05NUF9JTkNMVURFX0lGVEFCTEVfUkVXUklURVMKICAgIG1wLT5pcE5ldFRvTWVkaWFJZkluZGV4Lm9fYnl0ZXNbbXAtPmlwTmV0VG9NZWRpYUlmSW5kZXgub19sZW5ndGhdID0gJ1wwJzsKICAgIGluZGV4ID0gbmV0c25tcF9hY2Nlc3NfaW50ZXJmYWNlX2luZGV4X2ZpbmQoCiAgICAgICAgICAgICAgICAgICAgbXAtPmlwTmV0VG9NZWRpYUlmSW5kZXgub19ieXRlcyk7CiNlbHNlCiAgICBpbmRleCA9IEludGVyZmFjZV9JbmRleF9CeV9OYW1lKG1wLT5pcE5ldFRvTWVkaWFJZkluZGV4Lm9fYnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wLT5pcE5ldFRvTWVkaWFJZkluZGV4Lm9fbGVuZ3RoKTsKI2VuZGlmCiAgICBERUJVR01TR1RMKCgibWliSUkvYXQiLCAiLi4uLi4uLi4uIEFUX0NtcCAlbHg8PiVseCAlZDw+JWQgKCUuNXMpXG4iLAogICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpbXAtPmlwTmV0VG9NZWRpYU5ldEFkZHJlc3MsCiAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykoKGlmX2lwX3QgKikgYWRkciktPmlwQWRkciwKICAgICAgICAgICAgICAgICgoaWZfaXBfdCAqKSBhZGRyKS0+aWZJZHgsIGluZGV4LAogICAgICAgICAgICAgICAgbXAtPmlwTmV0VG9NZWRpYUlmSW5kZXgub19ieXRlcykpOwogICAgaWYgKG1wLT5pcE5ldFRvTWVkaWFOZXRBZGRyZXNzICE9ICgoaWZfaXBfdCAqKSBhZGRyKS0+aXBBZGRyKQogICAgICAgIHJldCA9IDE7CiAgICBlbHNlIGlmICgoKGlmX2lwX3QgKikgYWRkciktPmlmSWR4ICE9IGluZGV4KQogICAgICAgIHJldCA9IDE7CiAgICBlbHNlCiAgICAgICAgcmV0ID0gMDsKICAgIERFQlVHTVNHVEwoKCJtaWJJSS9hdCIsICIuLi4uLi4uLi4gQVRfQ21wIHJldHVybnMgJWRcbiIsIHJldCkpOwogICAgcmV0dXJuIHJldDsKfQoKdV9jaGFyICAgICAgICAgKgp2YXJfYXRFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKiB2cCwKICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgLyoKICAgICAqIG9iamVjdCBpZGVudGlmaWVyIGlzIG9mIGZvcm06CiAgICAgKiAxLjMuNi4xLjIuMS4zLjEuMS4xLmludGVyZmFjZS4xLkEuQi5DLkQsICB3aGVyZSBBLkIuQy5EIGlzIElQIGFkZHJlc3MuCiAgICAgKiBJbnRlcmZhY2UgaXMgYXQgb2Zmc2V0IDEwLAogICAgICogSVBBRERSIHN0YXJ0cyBhdCBvZmZzZXQgMTIuCiAgICAgKi8KI2RlZmluZSBBVF9NQVhfTkFNRV9MRU5HVEgJMTYKI2RlZmluZSBBVF9JRklOREVYX09GRgkxMAogICAgdV9jaGFyICAgICAgICAgKmNwOwogICAgb2lkICAgICAgICAgICAgKm9wOwogICAgb2lkICAgICAgICAgICAgIGxvd2VzdFtBVF9NQVhfTkFNRV9MRU5HVEhdOwogICAgb2lkICAgICAgICAgICAgIGN1cnJlbnRbQVRfTUFYX05BTUVfTEVOR1RIXTsKICAgIGlmX2lwX3QgICAgICAgICBOZXh0QWRkcjsKICAgIG1pYjJfaXBOZXRUb01lZGlhRW50cnlfdCBlbnRyeTsKICAgIHN0YXRpYyBtaWIyX2lwTmV0VG9NZWRpYUVudHJ5X3QgTG93ZW50cnk7CiAgICBpbnQgICAgICAgICAgICAgRm91bmQgPSAwOwogICAgcmVxX2UgICAgICAgICAgIHJlcV90eXBlOwogICAgaW50ICAgICAgICAgICAgIG9mZnNldCwgb2xlbmd0aCA9IDA7CiAgICBzdGF0aWMgaW5fYWRkcl90ICAgICAgYWRkcl9yZXQ7CgogICAgLyoKICAgICAqIGZpbGwgaW4gb2JqZWN0IHBhcnQgb2YgbmFtZSBmb3IgY3VycmVudCAobGVzcyBzaXplb2YgaW5zdGFuY2UgcGFydCkgCiAgICAgKi8KCiAgICBERUJVR01TR1RMKCgibWliSUkvYXQiLCAidmFyX2F0RW50cnk6ICIpKTsKICAgIERFQlVHTVNHT0lEKCgibWliSUkvYXQiLCB2cC0+bmFtZSwgdnAtPm5hbWVsZW4pKTsKICAgIERFQlVHTVNHKCgibWliSUkvYXQiLCAiICVkXG4iLCBleGFjdCkpOwoKICAgIG1lbXNldCgmTG93ZW50cnksIDAsIHNpemVvZihMb3dlbnRyeSkpOwogICAgbWVtY3B5KChjaGFyICopIGN1cnJlbnQsIChjaGFyICopIHZwLT5uYW1lLCB2cC0+bmFtZWxlbiAqIHNpemVvZihvaWQpKTsKICAgIGxvd2VzdFswXSA9IDEwMjQ7CiAgICBmb3IgKE5leHRBZGRyLmlwQWRkciA9ICh1X2xvbmcpIC0gMSwgTmV4dEFkZHIuaWZJZHggPSAyNTUsIHJlcV90eXBlID0KICAgICAgICAgR0VUX0ZJUlNUOzsKICAgICAgICAgTmV4dEFkZHIuaXBBZGRyID0gZW50cnkuaXBOZXRUb01lZGlhTmV0QWRkcmVzcywgTmV4dEFkZHIuaWZJZHggPQogICAgICAgICBjdXJyZW50W0FUX0lGSU5ERVhfT0ZGXSwgcmVxX3R5cGUgPSBHRVRfTkVYVCkgewogICAgICAgIGlmIChnZXRNaWJzdGF0CiAgICAgICAgICAgIChNSUJfSVBfTkVULCAmZW50cnksIHNpemVvZihtaWIyX2lwTmV0VG9NZWRpYUVudHJ5X3QpLAogICAgICAgICAgICAgcmVxX3R5cGUsICZBVF9DbXAsICZOZXh0QWRkcikgIT0gMCkKICAgICAgICAgICAgYnJlYWs7CiNpZmRlZiBORVRTTk1QX0lOQ0xVREVfSUZUQUJMRV9SRVdSSVRFUwogICAgICAgIGVudHJ5LmlwTmV0VG9NZWRpYUlmSW5kZXgub19ieXRlc1tlbnRyeS5pcE5ldFRvTWVkaWFJZkluZGV4Lm9fbGVuZ3RoXSA9ICdcMCc7CiAgICAgICAgY3VycmVudFtBVF9JRklOREVYX09GRl0gPSBuZXRzbm1wX2FjY2Vzc19pbnRlcmZhY2VfaW5kZXhfZmluZCgKICAgICAgICAgICBlbnRyeS5pcE5ldFRvTWVkaWFJZkluZGV4Lm9fYnl0ZXMpOwojZWxzZQogICAgICAgIGN1cnJlbnRbQVRfSUZJTkRFWF9PRkZdID0gCiAgICAgICAgICAgSW50ZXJmYWNlX0luZGV4X0J5X05hbWUoZW50cnkuaXBOZXRUb01lZGlhSWZJbmRleC5vX2J5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmlwTmV0VG9NZWRpYUlmSW5kZXgub19sZW5ndGgpOwojZW5kaWYKICAgICAgICBpZiAoY3VycmVudFs2XSA9PSAzKSB7ICAvKiBBVCBncm91cCBvaWQgKi8KICAgICAgICAgICAgY3VycmVudFtBVF9JRklOREVYX09GRiArIDFdID0gMTsKICAgICAgICAgICAgb2Zmc2V0ID0gQVRfSUZJTkRFWF9PRkYgKyAyOwogICAgICAgICAgICBvbGVuZ3RoID0gQVRfSUZJTkRFWF9PRkYgKyA2OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG9mZnNldCA9IEFUX0lGSU5ERVhfT0ZGICsgMTsKICAgICAgICAgICAgb2xlbmd0aCA9IEFUX0lGSU5ERVhfT0ZGICsgNTsKICAgICAgICB9CiAgICAgICAgQ09QWV9JUEFERFIoY3AsICh1X2NoYXIgKikgJiBlbnRyeS5pcE5ldFRvTWVkaWFOZXRBZGRyZXNzLCBvcCwKICAgICAgICAgICAgICAgICAgICBjdXJyZW50ICsgb2Zmc2V0KTsKICAgICAgICBpZiAoZXhhY3QpIHsKICAgICAgICAgICAgaWYgKHNubXBfb2lkX2NvbXBhcmUoY3VycmVudCwgb2xlbmd0aCwgbmFtZSwgKmxlbmd0aCkgPT0gMCkgewogICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopIGxvd2VzdCwgKGNoYXIgKikgY3VycmVudCwKICAgICAgICAgICAgICAgICAgICAgICBvbGVuZ3RoICogc2l6ZW9mKG9pZCkpOwogICAgICAgICAgICAgICAgTG93ZW50cnkgPSBlbnRyeTsKICAgICAgICAgICAgICAgIEZvdW5kKys7CiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgLyogbm8gbmVlZCB0byBzZWFyY2ggZnVydGhlciAqLwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKHNubXBfb2lkX2NvbXBhcmUoY3VycmVudCwgb2xlbmd0aCwgbmFtZSwgKmxlbmd0aCkgPiAwCiAgICAgICAgICAgICAgICAmJiBzbm1wX29pZF9jb21wYXJlKGN1cnJlbnQsIG9sZW5ndGgsIGxvd2VzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxlbmd0aCkgPCAwKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogaWYgbmV3IG9uZSBpcyBncmVhdGVyIHRoYW4gaW5wdXQgYW5kIGNsb3NlciB0byBpbnB1dCB0aGFuCiAgICAgICAgICAgICAgICAgKiBwcmV2aW91cyBsb3dlc3QsIGFuZCBpcyBub3QgZXF1YWwgdG8gaXQsIHNhdmUgdGhpcyBvbmUgYXMgdGhlICJuZXh0IiBvbmUuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSBsb3dlc3QsIChjaGFyICopIGN1cnJlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgb2xlbmd0aCAqIHNpemVvZihvaWQpKTsKICAgICAgICAgICAgICAgIExvd2VudHJ5ID0gZW50cnk7CiAgICAgICAgICAgICAgICBGb3VuZCsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgREVCVUdNU0dUTCgoIm1pYklJL2F0IiwgIi4uLiBGb3VuZCA9ICVkXG4iLCBGb3VuZCkpOwogICAgaWYgKEZvdW5kID09IDApCiAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgIG1lbWNweSgoY2hhciAqKSBuYW1lLCAoY2hhciAqKSBsb3dlc3QsIG9sZW5ndGggKiBzaXplb2Yob2lkKSk7CiAgICAqbGVuZ3RoID0gb2xlbmd0aDsKICAgICp3cml0ZV9tZXRob2QgPSAwOwogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgSVBNRURJQUlGSU5ERVg6CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YgbG9uZ19yZXR1cm47CiNpZmRlZiBORVRTTk1QX0lOQ0xVREVfSUZUQUJMRV9SRVdSSVRFUwogICAgICAgIExvd2VudHJ5LmlwTmV0VG9NZWRpYUlmSW5kZXgub19ieXRlc1sKICAgICAgICAgICAgTG93ZW50cnkuaXBOZXRUb01lZGlhSWZJbmRleC5vX2xlbmd0aF0gPSAnXDAnOwogICAgICAgIGxvbmdfcmV0dXJuID0gbmV0c25tcF9hY2Nlc3NfaW50ZXJmYWNlX2luZGV4X2ZpbmQoCiAgICAgICAgICAgIExvd2VudHJ5LmlwTmV0VG9NZWRpYUlmSW5kZXgub19ieXRlcyk7CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSBJbnRlcmZhY2VfSW5kZXhfQnlfTmFtZSgKICAgICAgICAgICAgTG93ZW50cnkuaXBOZXRUb01lZGlhSWZJbmRleC5vX2J5dGVzLAogICAgICAgICAgICBMb3dlbnRyeS5pcE5ldFRvTWVkaWFJZkluZGV4Lm9fbGVuZ3RoKTsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBNRURJQVBIWVNBRERSRVNTOgogICAgICAgICp2YXJfbGVuID0gTG93ZW50cnkuaXBOZXRUb01lZGlhUGh5c0FkZHJlc3Mub19sZW5ndGg7CiAgICAgICAgcmV0dXJuIExvd2VudHJ5LmlwTmV0VG9NZWRpYVBoeXNBZGRyZXNzLm9fYnl0ZXM7CiAgICBjYXNlIElQTUVESUFORVRBRERSRVNTOgogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKGFkZHJfcmV0KTsKICAgICAgICBhZGRyX3JldCA9IExvd2VudHJ5LmlwTmV0VG9NZWRpYU5ldEFkZHJlc3M7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJmFkZHJfcmV0OwogICAgY2FzZSBJUE1FRElBVFlQRToKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZiBsb25nX3JldHVybjsKICAgICAgICBsb25nX3JldHVybiA9IExvd2VudHJ5LmlwTmV0VG9NZWRpYVR5cGU7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkIiwgInVua25vd24gc3ViLWlkICVkIGluIHZhcl9hdEVudHJ5XG4iLAogICAgICAgICAgICAgICAgICAgIHZwLT5tYWdpYykpOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzb2xhcmlzMiAqLwoKCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKgoJICoKCSAqICBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBmdW5jdGlvbnMKCSAqCgkgKioqKioqKioqKioqKioqKioqKioqLwoKI2lmbmRlZiBzb2xhcmlzMgoKc3RhdGljIGludCAgICAgIGFycHRhYl9zaXplLCBhcnB0YWJfY3VycmVudDsKI2lmIE5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwKc3RhdGljIGNoYXIgICAgKmxpbSwgKnJ0bmV4dDsKc3RhdGljIGNoYXIgICAgKmF0ID0gMDsKI2Vsc2UKI2lmZGVmIEhBVkVfU1RSVUNUX0FSUEhEX0FUX05FWFQKc3RhdGljIHN0cnVjdCBhcnBoZCAqYXQgPSAwOwpzdGF0aWMgc3RydWN0IGFycHRhYiAqYXRfcHRyLCBhdF9lbnRyeTsKc3RhdGljIHN0cnVjdCBhcnBjb20gYXRfY29tOwojZWxpZiBkZWZpbmVkKGhwdXgxMSkKc3RhdGljIG1pYl9pcE5ldFRvTWVkaWFFbnQgKmF0ID0gKG1pYl9pcE5ldFRvTWVkaWFFbnQgKikgMDsKI2Vsc2UKCi8qCiAqIGF0IHVzZWQgdG8gYmUgYWxsb2NhdGVkIGV2ZXJ5IHRpbWUgd2UgbmVlZGVkIHRvIGxvb2sgYXQgdGhlIGFycCBjYWNoZS4KICogVGhpcyBjYXVzZSB1cyB0byBwYXJzZSAvcHJvYy9uZXQvYXJwIHR3aWNlIGZvciBlYWNoIHJlcXVlc3QgYW5kIGRpZG4ndAogKiBhbGxvdyB1cyB0byBmaWx0ZXIgdGhpbmdzIGxpa2Ugd2UnZCBsaWtlIHRvLiAgU28gbm93IHdlIHVzZSBpdCAKICogc2VtaS1zdGF0aWNhbGx5LiAgV2UgaW5pdGlhbGl6ZSBpdCB0byBzaXplIDAgYW5kIGlmIHdlIG5lZWQgbW9yZSByb29tCiAqIHdlIHJlYWxsb2Mgcm9vbSBmb3IgQVJQX0NBQ0hFX0lOQ1IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZS4KICogV2UgbmV2ZXIgcmVsZWFzZSB3aGF0IHdlJ3ZlIHRha2VuIC4gLiAuCiAqLwojZGVmaW5lIEFSUF9DQUNIRV9JTkNSIDEwMjQKc3RhdGljIHN0cnVjdCBhcnB0YWIgKmF0ID0gTlVMTDsKCiNlbmRpZgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwgKi8KCnN0YXRpYyB2b2lkCkFSUF9TY2FuX0luaXQodm9pZCkKewojaWZuZGVmIE5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwKI2lmbmRlZiBsaW51eAojaWZkZWYgaHB1eDExCgogICAgaW50ICAgICAgICAgICAgIGZkOwogICAgc3RydWN0IG5tcGFybXMgIHA7CiAgICBpbnQgICAgICAgICAgICAgdmFsOwogICAgdW5zaWduZWQgaW50ICAgIHVsZW47CiAgICBpbnQgICAgICAgICAgICAgcmV0OwoKICAgIGlmIChhdCkKICAgICAgICBmcmVlKGF0KTsKICAgIGF0ID0gKG1pYl9pcE5ldFRvTWVkaWFFbnQgKikgMDsKICAgIGFycHRhYl9zaXplID0gMDsKCiAgICBpZiAoKGZkID0gb3Blbl9taWIoIi9kZXYvaXAiLCBPX1JET05MWSwgMCwgTk1fQVNZTkNfT0ZGKSkgPj0gMCkgewogICAgICAgIHAub2JqaWQgPSBJRF9pcE5ldFRvTWVkaWFUYWJsZU51bTsKICAgICAgICBwLmJ1ZmZlciA9ICh2b2lkICopICZ2YWw7CiAgICAgICAgdWxlbiA9IHNpemVvZihpbnQpOwogICAgICAgIHAubGVuID0gJnVsZW47CiAgICAgICAgaWYgKChyZXQgPSBnZXRfbWliX2luZm8oZmQsICZwKSkgPT0gMCkKICAgICAgICAgICAgYXJwdGFiX3NpemUgPSB2YWw7CgogICAgICAgIGlmIChhcnB0YWJfc2l6ZSA+IDApIHsKICAgICAgICAgICAgdWxlbiA9ICh1bnNpZ25lZCkgYXJwdGFiX3NpemUgKnNpemVvZihtaWJfaXBOZXRUb01lZGlhRW50KTsKICAgICAgICAgICAgYXQgPSAobWliX2lwTmV0VG9NZWRpYUVudCAqKSBtYWxsb2ModWxlbik7CiAgICAgICAgICAgIG1lbXNldChhdCwgMCwgdWxlbik7CiAgICAgICAgICAgIHAub2JqaWQgPSBJRF9pcE5ldFRvTWVkaWFUYWJsZTsKICAgICAgICAgICAgcC5idWZmZXIgPSAodm9pZCAqKSBhdDsKICAgICAgICAgICAgcC5sZW4gPSAmdWxlbjsKICAgICAgICAgICAgaWYgKChyZXQgPSBnZXRfbWliX2luZm8oZmQsICZwKSkgPCAwKQogICAgICAgICAgICAgICAgYXJwdGFiX3NpemUgPSAwOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBhcnB0YWJfc2l6ZSA9ICpwLmxlbiAvIHNpemVvZihtaWJfaXBOZXRUb01lZGlhRW50KTsKICAgICAgICB9CgogICAgICAgIGNsb3NlX21pYihmZCk7CiAgICB9CgogICAgYXJwdGFiX2N1cnJlbnQgPSAwOwoKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBocHV4MTEgKi8KCiAgICBpZiAoIWF0KSB7CiNpZmRlZiBBUlBUQUJfU0laRV9TWU1CT0wKICAgICAgICBhdXRvX25saXN0KEFSUFRBQl9TSVpFX1NZTUJPTCwgKGNoYXIgKikgJmFycHRhYl9zaXplLAogICAgICAgICAgICAgICAgICAgc2l6ZW9mIGFycHRhYl9zaXplKTsKI2lmZGVmIEhBVkVfU1RSVUNUX0FSUEhEX0FUX05FWFQKICAgICAgICBhdCA9IChzdHJ1Y3QgYXJwaGQgKikgbWFsbG9jKGFycHRhYl9zaXplICogc2l6ZW9mKHN0cnVjdCBhcnBoZCkpOwojZWxzZQogICAgICAgIGF0ID0gKHN0cnVjdCBhcnB0YWIgKikgbWFsbG9jKGFycHRhYl9zaXplICogc2l6ZW9mKHN0cnVjdCBhcnB0YWIpKTsKI2VuZGlmCiNlbHNlCiAgICAgICAgcmV0dXJuOwojZW5kaWYKICAgIH0KI2lmZGVmIEhBVkVfU1RSVUNUX0FSUEhEX0FUX05FWFQKICAgIGF1dG9fbmxpc3QoQVJQVEFCX1NZTUJPTCwgKGNoYXIgKikgYXQsCiAgICAgICAgICAgICAgIGFycHRhYl9zaXplICogc2l6ZW9mKHN0cnVjdCBhcnBoZCkpOwogICAgYXRfcHRyID0gYXRbMF0uYXRfbmV4dDsKI2Vsc2UKICAgIGF1dG9fbmxpc3QoQVJQVEFCX1NZTUJPTCwgKGNoYXIgKikgYXQsCiAgICAgICAgICAgICAgIGFycHRhYl9zaXplICogc2l6ZW9mKHN0cnVjdCBhcnB0YWIpKTsKI2VuZGlmCiAgICBhcnB0YWJfY3VycmVudCA9IDA7CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXgxMSAqLwojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpbnV4ICovCgogICAgc3RhdGljIHRpbWVfdCAgIHRtID0gMDsgICAgIC8qIFRpbWUgb2YgbGFzdCBzY2FuICovCiAgICBGSUxFICAgICAgICAgICAqaW47CiAgICBpbnQgICAgICAgICAgICAgaSwgajsKICAgIGNoYXIgICAgICAgICAgICBsaW5lWzEyOF07CiAgICBpbnQgICAgICAgICAgICAgemEsIHpiLCB6YywgemQ7CiAgICBjaGFyICAgICAgICAgICAgaWZuYW1lWzIxXTsKICAgIGNoYXIgICAgICAgICAgICBtYWNbMypNQVhfTUFDX0FERFJfTEVOKzFdOwogICAgY2hhciAgICAgICAgICAgKnRvazsKCiAgICBhcnB0YWJfY3VycmVudCA9IDA7ICAgICAgICAgLyogQW55dGltZSB0aGlzIGlzIGNhbGxlZCB3ZSBuZWVkIHRvIHJlc2V0ICdjdXJyZW50JyAqLwoKICAgIGlmICh0aW1lKE5VTEwpIDwgdG0gKyAxKSB7ICAvKk91ciBjb29sIG9uZSBzZWNvbmQgY2FjaGUgaW1wbGVtZW50YXRpb24gOi0pICovCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGluID0gZm9wZW4oIi9wcm9jL25ldC9hcnAiLCAiciIpOwogICAgaWYgKCFpbikgewogICAgICAgIHNubXBfbG9nKExPR19FUlIsICJzbm1wZDogQ2Fubm90IG9wZW4gL3Byb2MvbmV0L2FycFxuIik7CiAgICAgICAgYXJwdGFiX3NpemUgPSAwOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKgogICAgICogR2V0IHJpZCBvZiB0aGUgaGVhZGVyIGxpbmUgCiAgICAgKi8KICAgIGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgaW4pOwoKICAgIGkgPSAwOwogICAgd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgaW4pKSB7CiAgICAgICAgc3RhdGljIGludCAgICAgIGFycHRhYl9jdXJyX21heF9zaXplOwogICAgICAgIHVfbG9uZyAgICAgICAgICB0bXBfYTsKICAgICAgICB1bnNpZ25lZCBpbnQgICAgdG1wX2ZsYWdzOwoKICAgICAgICBpZiAoaSA+PSBhcnB0YWJfY3Vycl9tYXhfc2l6ZSkgewogICAgICAgICAgICBzdHJ1Y3QgYXJwdGFiICAqbmV3dGFiID0gKHN0cnVjdCBhcnB0YWIgKikKICAgICAgICAgICAgICAgIHJlYWxsb2MoYXQsIChzaXplb2Yoc3RydWN0IGFycHRhYikgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcnB0YWJfY3Vycl9tYXhfc2l6ZSArIEFSUF9DQUNIRV9JTkNSKSkpOwogICAgICAgICAgICBpZiAobmV3dGFiID09IGF0KSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGFsbG9jYXRpbmcgbW9yZSBzcGFjZSBmb3IgYXJwY2FjaGUuICAiCiAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FjaGUgd2lsbCBjb250aW51ZSB0byBiZSBsaW1pdGVkIHRvICVkIGVudHJpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgYXJwdGFiX2N1cnJfbWF4X3NpemUpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhcnB0YWJfY3Vycl9tYXhfc2l6ZSArPSBBUlBfQ0FDSEVfSU5DUjsKICAgICAgICAgICAgICAgIGF0ID0gbmV3dGFiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICg3ICE9CiAgICAgICAgICAgIHNzY2FuZihsaW5lLAogICAgICAgICAgICAgICAgICAgIiVkLiVkLiVkLiVkIDB4JSp4IDB4JXggJXMgJSpbXiBdICUyMHNcbiIsCiAgICAgICAgICAgICAgICAgICAmemEsICZ6YiwgJnpjLCAmemQsICZ0bXBfZmxhZ3MsIG1hYywgaWZuYW1lKSkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiQmFkIGxpbmUgaW4gL3Byb2MvbmV0L2FycDogJXMiLCBsaW5lKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIC8qCiAgICAgICAgICogSW52YWxpZGF0ZWQgZW50cmllcyBoYXZlIHRoZWlyIGZsYWcgc2V0IHRvIDAuCiAgICAgICAgICogKiBXZSB3YW50IHRvIGlnbm9yZSB0aGVtIAogICAgICAgICAqLwogICAgICAgIGlmICh0bXBfZmxhZ3MgPT0gMCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWZuYW1lW3NpemVvZihpZm5hbWUpLTFdID0gMDsgLyogbWFrZSBzdXJlIG5hbWUgaXMgbnVsbCB0ZXJtaW5hdGVkICovCiAgICAgICAgYXRbaV0uYXRfZmxhZ3MgPSB0bXBfZmxhZ3M7CiAgICAgICAgdG1wX2EgPSAoKHVfbG9uZykgemEgPDwgMjQpIHwKICAgICAgICAgICAgKCh1X2xvbmcpIHpiIDw8IDE2KSB8ICgodV9sb25nKSB6YyA8PCA4KSB8ICgodV9sb25nKSB6ZCk7CiAgICAgICAgYXRbaV0uYXRfaWFkZHIuc19hZGRyID0gaHRvbmwodG1wX2EpOwogICAgICAgIGF0W2ldLmlmX2luZGV4ID0gbmV0c25tcF9hY2Nlc3NfaW50ZXJmYWNlX2luZGV4X2ZpbmQoaWZuYW1lKTsKICAgICAgICAKICAgICAgICBmb3IgKGo9MCx0b2s9c3RydG9rKG1hYywgIjoiKTsgdG9rICE9IE5VTEw7IHRvaz1zdHJ0b2soTlVMTCwgIjoiKSxqKyspIHsKICAgICAgICAJYXRbaV0uYXRfZW5hZGRyW2pdID0gc3RydG9sKHRvaywgTlVMTCwgMTYpOwogICAgICAgIH0KICAgICAgICBhdFtpXS5hdF9lbmFkZHJfbGVuID0gajsKICAgICAgICBpKys7CiAgICB9CiAgICBhcnB0YWJfc2l6ZSA9IGk7CgogICAgZmNsb3NlKGluKTsKICAgIHRpbWUoJnRtKTsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaW51eCAqLwojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwgKi8KCiAgICBpbnQgICAgICAgICAgICAgbWliWzZdOwogICAgc2l6ZV90ICAgICAgICAgIG5lZWRlZDsKCiAgICBtaWJbMF0gPSBDVExfTkVUOwogICAgbWliWzFdID0gUEZfUk9VVEU7CiAgICBtaWJbMl0gPSAwOwogICAgbWliWzNdID0gQUZfSU5FVDsKICAgIG1pYls0XSA9IE5FVF9SVF9GTEFHUzsKI2lmIGRlZmluZWQgUlRGX0xMSU5GTwogICAgbWliWzVdID0gUlRGX0xMSU5GTzsKI2Vsc2UKICAgIG1pYls1XSA9IDA7CiNlbmRpZgoKICAgIGlmIChhdCkKICAgICAgICBmcmVlKGF0KTsKICAgIHJ0bmV4dCA9IGxpbSA9IGF0ID0gMDsKCiAgICBpZiAoc3lzY3RsKG1pYiwgNiwgTlVMTCwgJm5lZWRlZCwgTlVMTCwgMCkgPCAwKQogICAgICAgIHNubXBfbG9nX3BlcnJvcigicm91dGUtc3lzY3RsLWVzdGltYXRlIik7CiAgICBlbHNlIHsKICAgICAgICBpZiAoKGF0ID0gbWFsbG9jKG5lZWRlZCA/IG5lZWRlZCA6IDEpKSA9PSBOVUxMKQogICAgICAgICAgICBzbm1wX2xvZ19wZXJyb3IoIm1hbGxvYyIpOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAoc3lzY3RsKG1pYiwgNiwgYXQsICZuZWVkZWQsIE5VTEwsIDApIDwgMCkKICAgICAgICAgICAgICAgIHNubXBfbG9nX3BlcnJvcigiYWN0dWFsIHJldHJpZXZhbCBvZiByb3V0aW5nIHRhYmxlIik7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbGltID0gYXQgKyBuZWVkZWQ7CiAgICAgICAgICAgICAgICBydG5leHQgPSBhdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9DQU5fVVNFX1NZU0NUTCAqLwp9CgojaWZkZWYgQVJQX1NDQU5fRk9VUl9BUkdVTUVOVFMKc3RhdGljIGludApBUlBfU2Nhbl9OZXh0KGluX2FkZHJfdCAqIElQQWRkciwgY2hhciAqUGh5c0FkZHIsIGludCAqUGh5c0FkZHJMZW4sCiAgICAgICAgICAgICAgdV9sb25nICogaWZUeXBlLCB1X3Nob3J0ICogaWZJbmRleCkKI2Vsc2UKc3RhdGljIGludApBUlBfU2Nhbl9OZXh0KGluX2FkZHJfdCAqIElQQWRkciwgY2hhciAqUGh5c0FkZHIsIGludCAqUGh5c0FkZHJMZW4sCiAgICAgICAgICAgICAgdV9sb25nICogaWZUeXBlKQojZW5kaWYKewojaWZuZGVmIE5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwKI2lmZGVmIGxpbnV4CiAgICBpZiAoYXJwdGFiX2N1cnJlbnQgPCBhcnB0YWJfc2l6ZSkgewogICAgICAgIC8qCiAgICAgICAgICogY29weSB2YWx1ZXMgCiAgICAgICAgICovCiAgICAgICAgKklQQWRkciA9IGF0W2FycHRhYl9jdXJyZW50XS5hdF9pYWRkci5zX2FkZHI7CiAgICAgICAgKmlmVHlwZSA9CiAgICAgICAgICAgIChhdFthcnB0YWJfY3VycmVudF0uCiAgICAgICAgICAgICBhdF9mbGFncyAmIEFURl9QRVJNKSA/IDQgLypzdGF0aWMgKi8gOiAzIC8qZHluYW1pYyAqLyA7CiAgICAgICAgKmlmSW5kZXggPSBhdFthcnB0YWJfY3VycmVudF0uaWZfaW5kZXg7CiAgICAgICAgbWVtY3B5KFBoeXNBZGRyLCAmYXRbYXJwdGFiX2N1cnJlbnRdLmF0X2VuYWRkciwKICAgICAgICAgICAgICAgc2l6ZW9mKGF0W2FycHRhYl9jdXJyZW50XS5hdF9lbmFkZHIpKTsKICAgICAgICAqUGh5c0FkZHJMZW4gPSBhdFthcnB0YWJfY3VycmVudF0uYXRfZW5hZGRyX2xlbjsKCiAgICAgICAgLyoKICAgICAgICAgKiBpbmNyZW1lbnQgdG8gcG9pbnQgbmV4dCBlbnRyeSAKICAgICAgICAgKi8KICAgICAgICBhcnB0YWJfY3VycmVudCsrOwogICAgICAgIC8qCiAgICAgICAgICogcmV0dXJuIHN1Y2Nlc3MgCiAgICAgICAgICovCiAgICAgICAgcmV0dXJuICgxKTsKICAgIH0KI2VsaWYgZGVmaW5lZChocHV4MTEpCiAgICBpZiAoYXJwdGFiX2N1cnJlbnQgPCBhcnB0YWJfc2l6ZSkgewogICAgICAgIC8qCiAgICAgICAgICogY29weSB2YWx1ZXMgCiAgICAgICAgICovCiAgICAgICAgKklQQWRkciA9IGF0W2FycHRhYl9jdXJyZW50XS5OZXRBZGRyOwogICAgICAgIG1lbWNweShQaHlzQWRkciwgYXRbYXJwdGFiX2N1cnJlbnRdLlBoeXNBZGRyLm9fYnl0ZXMsCiAgICAgICAgICAgICAgIGF0W2FycHRhYl9jdXJyZW50XS5QaHlzQWRkci5vX2xlbmd0aCk7CiAgICAgICAgKmlmVHlwZSA9IGF0W2FycHRhYl9jdXJyZW50XS5UeXBlOwogICAgICAgICppZkluZGV4ID0gYXRbYXJwdGFiX2N1cnJlbnRdLklmSW5kZXg7CiAgICAgICAgKlBoeXNBZGRyTGVuID0gYXRbYXJwdGFiX2N1cnJlbnRdLlBoeXNBZGRyLm9fbGVuZ3RoOwogICAgICAgIC8qCiAgICAgICAgICogaW5jcmVtZW50IHRvIHBvaW50IG5leHQgZW50cnkgCiAgICAgICAgICovCiAgICAgICAgYXJwdGFiX2N1cnJlbnQrKzsKICAgICAgICAvKgogICAgICAgICAqIHJldHVybiBzdWNjZXNzIAogICAgICAgICAqLwogICAgICAgIHJldHVybiAoMSk7CiAgICB9CiNlbGlmICFkZWZpbmVkKEFSUF9TQ0FOX0ZPVVJfQVJHVU1FTlRTKSB8fCBkZWZpbmVkKGhwdXgpCiAgICByZWdpc3RlciBzdHJ1Y3QgYXJwdGFiICphdGFiOwoKICAgIHdoaWxlIChhcnB0YWJfY3VycmVudCA8IGFycHRhYl9zaXplKSB7CiNpZmRlZiBIQVZFX1NUUlVDVF9BUlBIRF9BVF9ORVhUCiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgYXJwIHRhYmxlIGlzIGFuIGFycmF5IG9mIGxpbmtlZCBsaXN0cyBvZiBhcnB0YWIgZW50cmllcy4KICAgICAgICAgKiBVbnVzZWQgc2xvdHMgaGF2ZSBwb2ludGVycyBiYWNrIHRvIHRoZSBhcnJheSBlbnRyeSBpdHNlbGYgCiAgICAgICAgICovCgogICAgICAgIGlmIChhdF9wdHIgPT0gKGF1dG9fbmxpc3RfdmFsdWUoQVJQVEFCX1NZTUJPTCkgKwogICAgICAgICAgICAgICAgICAgICAgIGFycHRhYl9jdXJyZW50ICogc2l6ZW9mKHN0cnVjdCBhcnBoZCkpKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFVzdXNlZCAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGFycHRhYl9jdXJyZW50Kys7CiAgICAgICAgICAgIGF0X3B0ciA9IGF0W2FycHRhYl9jdXJyZW50XS5hdF9uZXh0OwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKGF0X3B0ciwgKGNoYXIgKikgJmF0X2VudHJ5LCBzaXplb2Yoc3RydWN0IGFycHRhYikpKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS9hdDpBUlBfU2Nhbl9OZXh0IiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAoYXRfZW50cnkuYXRfYWMsIChjaGFyICopICZhdF9jb20sIHNpemVvZihzdHJ1Y3QgYXJwY29tKSkpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL2F0OkFSUF9TY2FuX05leHQiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBhdF9wdHIgPSBhdF9lbnRyeS5hdF9uZXh0OwogICAgICAgIGF0YWIgPSAmYXRfZW50cnk7CiAgICAgICAgKmlmSW5kZXggPSBhdF9jb20uYWNfaWYuaWZfaW5kZXg7ICAgICAgIC8qIG5vdCBzdHJpY3RseSBBUlBIRCAqLwojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhBVkVfU1RSVUNUX0FSUEhEX0FUX05FWFQgKi8KICAgICAgICBhdGFiID0gJmF0W2FycHRhYl9jdXJyZW50KytdOwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhBVkVfU1RSVUNUX0FSUEhEX0FUX05FWFQgKi8KICAgICAgICBpZiAoIShhdGFiLT5hdF9mbGFncyAmIEFURl9DT00pKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAqaWZUeXBlID0gKGF0YWItPmF0X2ZsYWdzICYgQVRGX1BFUk0pID8gNCA6IDM7CiAgICAgICAgKklQQWRkciA9IGF0YWItPmF0X2lhZGRyLnNfYWRkcjsKI2lmIGRlZmluZWQgKHN1blYzKSB8fCBkZWZpbmVkKHNwYXJjKSB8fCBkZWZpbmVkKGhwdXgpCiAgICAgICAgbWVtY3B5KFBoeXNBZGRyLCAoY2hhciAqKSAmYXRhYi0+YXRfZW5hZGRyLAogICAgICAgICAgICAgICBzaXplb2YoYXRhYi0+YXRfZW5hZGRyKSk7CiAgICAgICAgKlBoeXNBZGRyTGVuID0gc2l6ZW9mKGF0YWItPmF0X2VuYWRkcik7CiNlbmRpZgojaWYgZGVmaW5lZChtaXBzKSB8fCBkZWZpbmVkKGlibTAzMikKICAgICAgICBtZW1jcHkoUGh5c0FkZHIsIChjaGFyICopIGF0YWItPmF0X2VuYWRkciwKICAgICAgICAgICAgICAgc2l6ZW9mKGF0YWItPmF0X2VuYWRkcikpOwogICAgICAgICpQaHlzQWRkckxlbiA9IHNpemVvZihhdGFiLT5hdF9lbmFkZHIpOwojZW5kaWYKICAgICAgICByZXR1cm4gKDEpOwogICAgfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpbnV4IHx8IGhwdXgxMSB8fCAhQVJQX1NDQU5fRk9VUl9BUkdVTUVOVFMgfHwgaHB1eCAqLwoKICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAvKiB3ZSBuZWVkIHNvbWVvbmUgd2l0aCBhbiBpcml4IGJveCB0byBmaXggdGhpcyBzZWN0aW9uICovCgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICFORVRTTk1QX0NBTl9VU0VfU1lTQ1RMICovCiAgICBzdHJ1Y3QgcnRfbXNnaGRyICpydG07CiAgICBzdHJ1Y3Qgc29ja2FkZHJfaW5hcnAgKnNpbjsKICAgIHN0cnVjdCBzb2NrYWRkcl9kbCAqc2RsOwoKICAgIHdoaWxlIChydG5leHQgPCBsaW0pIHsKICAgICAgICBydG0gPSAoc3RydWN0IHJ0X21zZ2hkciAqKSBydG5leHQ7CiAgICAgICAgc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbmFycCAqKSAocnRtICsgMSk7CiAgICAgICAgc2RsID0gKHN0cnVjdCBzb2NrYWRkcl9kbCAqKSAoc2luICsgMSk7CiAgICAgICAgcnRuZXh0ICs9IHJ0bS0+cnRtX21zZ2xlbjsKICAgICAgICBpZiAoc2RsLT5zZGxfYWxlbikgewojaWZkZWYgaXJpeDYKICAgICAgICAgICAgKklQQWRkciA9IHNpbi0+c2FycF9hZGRyLnNfYWRkcjsKI2Vsc2UKICAgICAgICAgICAgKklQQWRkciA9IHNpbi0+c2luX2FkZHIuc19hZGRyOwojZW5kaWYKICAgICAgICAgICAgbWVtY3B5KFBoeXNBZGRyLCAoY2hhciAqKSBMTEFERFIoc2RsKSwgc2RsLT5zZGxfYWxlbik7CiAgICAgICAgICAgICpQaHlzQWRkckxlbiA9IHNkbC0+c2RsX2FsZW47CiAgICAgICAgICAgICppZkluZGV4ID0gc2RsLT5zZGxfaW5kZXg7CiAgICAgICAgICAgICppZlR5cGUgPSAxOyAgICAgICAgLyogWFhYICovCiAgICAgICAgICAgIHJldHVybiAoMSk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICgwKTsgICAgICAgICAgICAgICAgIC8qICJFT0YiICovCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIU5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwgKi8KfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbGFyaXMyICovCgojZWxpZiBkZWZpbmVkKEhBVkVfSVBITFBBUElfSCkgIC8qIFdJTjMyIGN5Z3dpbiAqLwojaW5jbHVkZSA8aXBobHBhcGkuaD4KCmV4dGVybiBXcml0ZU1ldGhvZCB3cml0ZV9hcnA7Ck1JQl9JUE5FVFJPVyAgICphcnBfcm93ID0gTlVMTDsKaW50ICAgICAgICAgICAgIGNyZWF0ZV9mbGFnID0gMDsKCnVfY2hhciAgICAgICAgICoKdmFyX2F0RW50cnkoc3RydWN0IHZhcmlhYmxlICp2cCwKICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgLyoKICAgICAqIEFkZHJlc3MgVHJhbnNsYXRpb24gdGFibGUgb2JqZWN0IGlkZW50aWZpZXIgaXMgb2YgZm9ybToKICAgICAqIDEuMy42LjEuMi4xLjMuMS4/LmludGVyZmFjZS4xLkEuQi5DLkQsICB3aGVyZSBBLkIuQy5EIGlzIElQIGFkZHJlc3MuCiAgICAgKiBJbnRlcmZhY2UgaXMgYXQgb2Zmc2V0IDEwLAogICAgICogSVBBRERSIHN0YXJ0cyBhdCBvZmZzZXQgMTIuCiAgICAgKgogICAgICogSVAgTmV0IHRvIE1lZGlhIHRhYmxlIG9iamVjdCBpZGVudGlmaWVyIGlzIG9mIGZvcm06CiAgICAgKiAxLjMuNi4xLjIuMS40LjIyLjEuPy5pbnRlcmZhY2UuQS5CLkMuRCwgIHdoZXJlIEEuQi5DLkQgaXMgSVAgYWRkcmVzcy4KICAgICAqIEludGVyZmFjZSBpcyBhdCBvZmZzZXQgMTAsCiAgICAgKiBJUEFERFIgc3RhcnRzIGF0IG9mZnNldCAxMS4KICAgICAqLwogICAgdV9jaGFyICAgICAgICAgKmNwOwogICAgb2lkICAgICAgICAgICAgKm9wOwogICAgb2lkICAgICAgICAgICAgIGxvd2VzdFsxNl07CiAgICBvaWQgICAgICAgICAgICAgY3VycmVudFsxNl07CiAgICBpbnQgICAgICAgICAgICAgb2lkX2xlbmd0aDsKICAgIGludCAgICAgICAgICAgICBsb3dTdGF0ZSA9IC0xOyAgICAgIC8qIERvbid0IGhhdmUgb25lIHlldCAqLwogICAgUE1JQl9JUE5FVFRBQkxFIHBJcE5ldFRhYmxlID0gTlVMTDsKICAgIERXT1JEICAgICAgICAgICBzdGF0dXMgPSBOT19FUlJPUjsKICAgIERXT1JEICAgICAgICAgICBkd0FjdHVhbFNpemUgPSAwOwogICAgVUlOVCAgICAgICAgICAgIGk7CiAgICBpbnQgICAgICAgICAgICAgajsKICAgIHVfY2hhciAgICAgICAgICBkZXN0X2FkZHJbNF07CiAgICB2b2lkICAgICAgICAgICAqcmVzdWx0ID0gTlVMTDsKICAgIHN0YXRpYyBpbl9hZGRyX3QJYWRkcl9yZXQ7CiAgICAKICAgIC8qCiAgICAgKiBmaWxsIGluIG9iamVjdCBwYXJ0IG9mIG5hbWUgZm9yIGN1cnJlbnQgKGxlc3Mgc2l6ZW9mIGluc3RhbmNlIHBhcnQpIAogICAgICovCiAgICBtZW1jcHkoKGNoYXIgKikgY3VycmVudCwgKGNoYXIgKikgdnAtPm5hbWUsCiAgICAgICAgICAgKGludCkgdnAtPm5hbWVsZW4gKiBzaXplb2Yob2lkKSk7CgogICAgaWYgKGN1cnJlbnRbNl0gPT0gMykgeyAgICAgIC8qIEFUIGdyb3VwIG9pZCAqLwogICAgICAgIG9pZF9sZW5ndGggPSAxNjsKICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAvKiBJUCBOZXRUb01lZGlhIGdyb3VwIG9pZCAqLwogICAgICAgIG9pZF9sZW5ndGggPSAxNTsKICAgIH0KCiAgICBzdGF0dXMgPSBHZXRJcE5ldFRhYmxlKHBJcE5ldFRhYmxlLCAmZHdBY3R1YWxTaXplLCBUUlVFKTsKICAgIGlmIChzdGF0dXMgPT0gRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUikgewogICAgICAgIHBJcE5ldFRhYmxlID0gbWFsbG9jKGR3QWN0dWFsU2l6ZSk7CiAgICAgICAgaWYgKHBJcE5ldFRhYmxlKQogICAgICAgICAgICBzdGF0dXMgPSBHZXRJcE5ldFRhYmxlKHBJcE5ldFRhYmxlLCAmZHdBY3R1YWxTaXplLCBUUlVFKTsKICAgIH0KCiAgICBpID0gLTE7CgogICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCBwSXBOZXRUYWJsZS0+ZHdOdW1FbnRyaWVzOyArK2kpIHsKICAgICAgICAgICAgY3VycmVudFsxMF0gPSBwSXBOZXRUYWJsZS0+dGFibGVbaV0uZHdJbmRleDsKCgogICAgICAgICAgICBpZiAoY3VycmVudFs2XSA9PSAzKSB7ICAgICAgLyogQVQgZ3JvdXAgb2lkICovCiAgICAgICAgICAgICAgICBjdXJyZW50WzExXSA9IDE7CiAgICAgICAgICAgICAgICBvcCA9IGN1cnJlbnQgKyAxMjsKICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAvKiBJUCBOZXRUb01lZGlhIGdyb3VwIG9pZCAqLwogICAgICAgICAgICAgICAgb3AgPSBjdXJyZW50ICsgMTE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3AgPSAodV9jaGFyICopICYgcElwTmV0VGFibGUtPnRhYmxlW2ldLmR3QWRkcjsKICAgICAgICAgICAgKm9wKysgPSAqY3ArKzsKICAgICAgICAgICAgKm9wKysgPSAqY3ArKzsKICAgICAgICAgICAgKm9wKysgPSAqY3ArKzsKICAgICAgICAgICAgKm9wKysgPSAqY3ArKzsKCiAgICAgICAgICAgIGlmIChleGFjdCkgewogICAgICAgICAgICAgICAgaWYgKHNubXBfb2lkX2NvbXBhcmUoY3VycmVudCwgb2lkX2xlbmd0aCwgbmFtZSwgKmxlbmd0aCkgPT0KICAgICAgICAgICAgICAgICAgICAwKSB7CiAgICAgICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopIGxvd2VzdCwgKGNoYXIgKikgY3VycmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkX2xlbmd0aCAqIHNpemVvZihvaWQpKTsKICAgICAgICAgICAgICAgICAgICBsb3dTdGF0ZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgLyogbm8gbmVlZCB0byBzZWFyY2ggZnVydGhlciAqLwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKHNubXBfb2lkX2NvbXBhcmUoY3VycmVudCwgb2lkX2xlbmd0aCwgbmFtZSwgKmxlbmd0aCkgPgogICAgICAgICAgICAgICAgICAgIDApIHsKICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKikgbG93ZXN0LCAoY2hhciAqKSBjdXJyZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICBvaWRfbGVuZ3RoICogc2l6ZW9mKG9pZCkpOwogICAgICAgICAgICAgICAgICAgIGxvd1N0YXRlID0gMDsKICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAvKiBBcyB0aGUgdGFibGUgaXMgc29ydGVkLCBubyBuZWVkIHRvIHNlYXJjaCBmdXJ0aGVyICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBpZiAoYXJwX3JvdyA9PSBOVUxMKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBGcmVlIGFsbG9jYXRlZCBtZW1vcnkgaW4gY2FzZSBvZiBTRVQgcmVxdWVzdCdzIEZSRUUgcGhhc2UgCiAgICAgICAgICovCiAgICAgICAgYXJwX3JvdyA9IChQTUlCX0lQTkVUUk9XKSBtYWxsb2Moc2l6ZW9mKE1JQl9JUE5FVFJPVykpOwogICAgfQoKICAgIGlmIChsb3dTdGF0ZSA8IDAgfHwgc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBmb3IgY3JlYXRpb24gb2YgbmV3IHJvdywgb25seSBpcE5ldFRvTWVkaWFUYWJsZSBjYXNlIGlzIGNvbnNpZGVyZWQgCiAgICAgICAgICovCiAgICAgICAgaWYgKCpsZW5ndGggPT0gMTUgfHwgKmxlbmd0aCA9PSAxNikgewogICAgICAgICAgICBjcmVhdGVfZmxhZyA9IDE7CiAgICAgICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV9hcnA7CiAgICAgICAgICAgIGFycF9yb3ctPmR3SW5kZXggPSBuYW1lWzEwXTsKCiAgICAgICAgICAgIGlmICgqbGVuZ3RoID09IDE1KSB7ICAgICAgICAvKiBpcE5ldFRvTWVkaWFUYWJsZSAqLwogICAgICAgICAgICAgICAgaiA9IDExOwogICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgIC8qIGF0IFRhYmxlICovCgogICAgICAgICAgICAgICAgaiA9IDEyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkZXN0X2FkZHJbMF0gPSAodV9jaGFyKSBuYW1lW2pdOwogICAgICAgICAgICBkZXN0X2FkZHJbMV0gPSAodV9jaGFyKSBuYW1lW2ogKyAxXTsKICAgICAgICAgICAgZGVzdF9hZGRyWzJdID0gKHVfY2hhcikgbmFtZVtqICsgMl07CiAgICAgICAgICAgIGRlc3RfYWRkclszXSA9ICh1X2NoYXIpIG5hbWVbaiArIDNdOwogICAgICAgICAgICBhcnBfcm93LT5kd0FkZHIgPSAqKChEV09SRCAqKSBkZXN0X2FkZHIpOwoKICAgICAgICAgICAgYXJwX3Jvdy0+ZHdUeXBlID0gNDsgICAgICAgIC8qIFN0YXRpYyAqLwogICAgICAgICAgICBhcnBfcm93LT5kd1BoeXNBZGRyTGVuID0gMDsKICAgICAgICB9CiAgICAgICAgZ290byBvdXQ7CiAgICB9CgogICAgY3JlYXRlX2ZsYWcgPSAwOwogICAgbWVtY3B5KChjaGFyICopIG5hbWUsIChjaGFyICopIGxvd2VzdCwgb2lkX2xlbmd0aCAqIHNpemVvZihvaWQpKTsKICAgICpsZW5ndGggPSBvaWRfbGVuZ3RoOwogICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX2FycDsKICAgIG5ldHNubXBfYXNzZXJ0KDAgPD0gaSAmJiBpIDwgcElwTmV0VGFibGUtPmR3TnVtRW50cmllcyk7CiAgICAqYXJwX3JvdyA9IHBJcE5ldFRhYmxlLT50YWJsZVtpXTsKCiAgICBzd2l0Y2ggKHZwLT5tYWdpYykgewogICAgY2FzZSBJUE1FRElBSUZJTkRFWDogICAgICAgLyogYWxzbyBBVElGSU5ERVggKi8KICAgICAgICAqdmFyX2xlbiA9IHNpemVvZiBsb25nX3JldHVybjsKICAgICAgICBsb25nX3JldHVybiA9IHBJcE5ldFRhYmxlLT50YWJsZVtpXS5kd0luZGV4OwogICAgICAgIHJlc3VsdCA9ICZsb25nX3JldHVybjsKICAgICAgICBicmVhazsKICAgIGNhc2UgSVBNRURJQVBIWVNBRERSRVNTOiAgIC8qIGFsc28gQVRQSFlTQUREUkVTUyAqLwogICAgICAgICp2YXJfbGVuID0gcElwTmV0VGFibGUtPnRhYmxlW2ldLmR3UGh5c0FkZHJMZW47CiAgICAgICAgbWVtY3B5KHJldHVybl9idWYsIHBJcE5ldFRhYmxlLT50YWJsZVtpXS5iUGh5c0FkZHIsICp2YXJfbGVuKTsKICAgICAgICByZXN1bHQgPSByZXR1cm5fYnVmOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBJUE1FRElBTkVUQUREUkVTUzogICAgLyogYWxzbyBBVE5FVEFERFJFU1MgKi8KICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihhZGRyX3JldCk7CiAgICAgICAgYWRkcl9yZXQgPSBwSXBOZXRUYWJsZS0+dGFibGVbaV0uZHdBZGRyOwogICAgICAgIHJlc3VsdCA9ICZhZGRyX3JldDsKICAgICAgICBicmVhazsKICAgIGNhc2UgSVBNRURJQVRZUEU6CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YgbG9uZ19yZXR1cm47CiAgICAgICAgbG9uZ19yZXR1cm4gPSBwSXBOZXRUYWJsZS0+dGFibGVbaV0uZHdUeXBlOwogICAgICAgIHJlc3VsdCA9ICZsb25nX3JldHVybjsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkIiwgInVua25vd24gc3ViLWlkICVkIGluIHZhcl9hdEVudHJ5XG4iLAogICAgICAgICAgICAgICAgICAgIHZwLT5tYWdpYykpOwogICAgICAgIGJyZWFrOwogICAgfQpvdXQ6CiAgICBmcmVlKHBJcE5ldFRhYmxlKTsKICAgIHJldHVybiByZXN1bHQ7Cn0KCmludAp3cml0ZV9hcnAoaW50IGFjdGlvbiwKICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLCB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IGxlbmd0aCkKewogICAgaW50ICAgICAgICAgICAgIHZhciwgcmV0dmFsID0gU05NUF9FUlJfTk9FUlJPUjsKICAgIHN0YXRpYyBQTUlCX0lQTkVUUk9XIG9sZGFycF9yb3cgPSBOVUxMOwogICAgTUlCX0lQTkVUUk9XICAgIHRlbXBfcm93OwogICAgRFdPUkQgICAgICAgICAgIHN0YXR1cyA9IE5PX0VSUk9SOwoKICAgIC8qCiAgICAgKiBJUCBOZXQgdG8gTWVkaWEgdGFibGUgb2JqZWN0IGlkZW50aWZpZXIgaXMgb2YgZm9ybToKICAgICAqIDEuMy42LjEuMi4xLjQuMjIuMS4/LmludGVyZmFjZS5BLkIuQy5ELCAgd2hlcmUgQS5CLkMuRCBpcyBJUCBhZGRyZXNzLgogICAgICogSW50ZXJmYWNlIGlzIGF0IG9mZnNldCAxMCwKICAgICAqIElQQUREUiBzdGFydHMgYXQgb2Zmc2V0IDExLgogICAgICovCgogICAgaWYgKG5hbWVbNl0gPT0gMykgeyAgICAgICAgIC8qIEFUIGdyb3VwIG9pZCAqLwogICAgICAgIGlmIChsZW5ndGggIT0gMTYpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgImxlbmd0aCBlcnJvclxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9OT0NSRUFUSU9OOwogICAgICAgIH0KICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAvKiBJUCBOZXRUb01lZGlhIGdyb3VwIG9pZCAqLwogICAgICAgIGlmIChsZW5ndGggIT0gMTUpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgImxlbmd0aCBlcnJvclxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9OT0NSRUFUSU9OOwogICAgICAgIH0KICAgIH0KCgogICAgLyoKICAgICAqICNkZWZpbmUgZm9yIGlwTmV0VG9NZWRpYVRhYmxlIGVudHJpZXMgYXJlIDEgbGVzcyB0aGFuIGNvcnJlc3BvbmRpbmcgc3ViLWlkIGluIE1JQgogICAgICogKiBpLmUuIElQTUVESUFJRklOREVYIGRlZmluZWQgYXMgMCwgYnV0IGlwTmV0VG9NZWRpYUlmSW5kZXggcmVnaXN0ZXJlZCBhcyAxCiAgICAgKi8KICAgIHZhciA9IG5hbWVbOV0gLSAxOwogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgc3dpdGNoICh2YXIpIHsKICAgICAgICBjYXNlIElQTUVESUFJRklOREVYOgogICAgICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9JTlRFR0VSKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAibm90IGludGVnZXJcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKCooKGludCAqKSB2YXJfdmFsKSkgPCAwKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiaW52YWxpZCBtZWRpYSBpZkluZGV4Iik7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdWQUxVRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodmFyX3ZhbF9sZW4gPiBzaXplb2YoaW50KSkgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgImJhZCBsZW5ndGhcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HTEVOR1RIOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgSVBNRURJQU5FVEFERFJFU1M6CiAgICAgICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX0lQQUREUkVTUykgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIm5vdCBJUCBBZGRyZXNzXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCgqKChpbnQgKikgdmFyX3ZhbCkpIDwgMCkgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgImludmFsaWQgbWVkaWEgbmV0IGFkZHJlc3MiKTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1ZBTFVFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh2YXJfdmFsX2xlbiA+IHNpemVvZihEV09SRCkpIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJiYWQgbGVuZ3RoXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR0xFTkdUSDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIElQTUVESUFUWVBFOgogICAgICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9JTlRFR0VSKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAibm90IGludGVnZXJcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKCooKGludCAqKSB2YXJfdmFsKSkgPCAxIHx8ICgqKChpbnQgKikgdmFyX3ZhbCkpID4gNCkgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgImludmFsaWQgbWVkaWEgdHlwZSIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVkFMVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHZhcl92YWxfbGVuID4gc2l6ZW9mKGludCkpIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJiYWQgbGVuZ3RoXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR0xFTkdUSDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIElQTUVESUFQSFlTQUREUkVTUzoKICAgICAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fT0NURVRfU1RSKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAibm90IG9jdGV0IHN0ciIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodmFyX3ZhbF9sZW4gIT0gNikgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIm5vdCBjb3JyZWN0IGlwQWRkcmVzcyBsZW5ndGg6ICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl92YWxfbGVuKTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR0xFTkdUSDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gd3JpdGVfcnRlXG4iLAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgKyAxKSk7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogU2F2ZSB0aGUgb2xkIHZhbHVlLCBpbiBjYXNlIG9mIFVORE8gCiAgICAgICAgICovCiAgICAgICAgaWYgKG9sZGFycF9yb3cgPT0gTlVMTCkgewogICAgICAgICAgICBvbGRhcnBfcm93ID0gKFBNSUJfSVBORVRST1cpIG1hbGxvYyhzaXplb2YoTUlCX0lQTkVUUk9XKSk7CiAgICAgICAgICAgICpvbGRhcnBfcm93ID0gKmFycF9yb3c7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgY2FzZSBBQ1RJT046ICAgICAgICAgICAgICAgLyogUGVyZm9ybSB0aGUgU0VUIGFjdGlvbiAoaWYgcmV2ZXJzaWJsZSkgKi8KICAgICAgICBzd2l0Y2ggKHZhcikgewoKICAgICAgICBjYXNlIElQTUVESUFJRklOREVYOgogICAgICAgICAgICB0ZW1wX3JvdyA9ICphcnBfcm93OwogICAgICAgICAgICBhcnBfcm93LT5kd0luZGV4ID0gKigoaW50ICopIHZhcl92YWwpOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBJbiBjYXNlIG9mIG5ldyBlbnRyeSwgcGh5c2ljYWwgYWRkcmVzcyBpcyBtYW5kYXRvcnkuCiAgICAgICAgICAgICAqICogU2V0SXBOZXRFbnRyeSB3aWxsIGJlIGRvbmUgaW4gQ09NTUlUIGNhc2UgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoIWNyZWF0ZV9mbGFnKSB7CiAgICAgICAgICAgICAgICBpZiAoU2V0SXBOZXRFbnRyeShhcnBfcm93KSAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgICAgIGFycF9yb3ctPmR3SW5kZXggPSB0ZW1wX3Jvdy5kd0luZGV4OwogICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IFNOTVBfRVJSX0NPTU1JVEZBSUxFRDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBEb24ndCBrbm93IHlldCwgd2hldGhlciBjaGFuZ2UgaW4gaWZJbmRleCBjcmVhdGVzIG5ldyByb3cgb3Igbm90IAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogZWxzZXsgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiB0ZW1wX3Jvdy5kd1R5cGUgPSAyOyAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIGlmKFNldElwTmV0RW50cnkoJnRlbXBfcm93KSAhPSBOT19FUlJPUikgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiByZXR2YWwgPSBTTk1QX0VSUl9DT01NSVRGQUlMRUQ7IAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogfSAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgSVBNRURJQU5FVEFERFJFU1M6CiAgICAgICAgICAgIHRlbXBfcm93ID0gKmFycF9yb3c7CiAgICAgICAgICAgIGFycF9yb3ctPmR3QWRkciA9ICooKGludCAqKSB2YXJfdmFsKTsKICAgICAgICAgICAgaWYgKCFjcmVhdGVfZmxhZykgewogICAgICAgICAgICAgICAgaWYgKFNldElwTmV0RW50cnkoYXJwX3JvdykgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICBhcnBfcm93LT5kd0FkZHIgPSBvbGRhcnBfcm93LT5kd0FkZHI7CiAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gU05NUF9FUlJfQ09NTUlURkFJTEVEOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wX3Jvdy5kd1R5cGUgPSAyOwogICAgICAgICAgICAgICAgICAgIGlmIChTZXRJcE5ldEVudHJ5KCZ0ZW1wX3JvdykgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCBpbiBBQ1RJT04sIHdoaWxlIGRlbGV0aW5nIG9sZCByb3cgXG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gU05NUF9FUlJfQ09NTUlURkFJTEVEOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIElQTUVESUFUWVBFOgogICAgICAgICAgICBhcnBfcm93LT5kd1R5cGUgPSAqKChpbnQgKikgdmFyX3ZhbCk7CiAgICAgICAgICAgIGlmICghY3JlYXRlX2ZsYWcpIHsKICAgICAgICAgICAgICAgIGlmIChTZXRJcE5ldEVudHJ5KGFycF9yb3cpICE9IE5PX0VSUk9SKQogICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IFNOTVBfRVJSX0NPTU1JVEZBSUxFRDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIElQTUVESUFQSFlTQUREUkVTUzoKICAgICAgICAgICAgbWVtY3B5KGFycF9yb3ctPmJQaHlzQWRkciwgdmFyX3ZhbCwgdmFyX3ZhbF9sZW4pOwogICAgICAgICAgICBhcnBfcm93LT5kd1BoeXNBZGRyTGVuID0gdmFyX3ZhbF9sZW47CiAgICAgICAgICAgIGlmICghY3JlYXRlX2ZsYWcpIHsKICAgICAgICAgICAgICAgIGlmIChTZXRJcE5ldEVudHJ5KGFycF9yb3cpICE9IE5PX0VSUk9SKQogICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IFNOTVBfRVJSX0NPTU1JVEZBSUxFRDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gd3JpdGVfYXJwXG4iLAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgKyAxKSk7CiAgICAgICAgICAgIHJldHZhbCA9IFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0dmFsOwogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogUmV2ZXJzZSB0aGUgU0VUIGFjdGlvbiBhbmQgZnJlZSByZXNvdXJjZXMgCiAgICAgICAgICovCiAgICAgICAgaWYgKG9sZGFycF9yb3cgIT0gTlVMTCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBVTkRPIHRoZSBjaGFuZ2VzIGRvbmUgZm9yIGV4aXN0aW5nIGVudHJ5LiAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmICghY3JlYXRlX2ZsYWcpIHsKICAgICAgICAgICAgICAgIGlmICgoc3RhdHVzID0gU2V0SXBOZXRFbnRyeShvbGRhcnBfcm93KSkgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiRXJyb3IgaW4gY2FzZSBVTkRPLCBzdGF0dXMgOiAlbHVcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBTTk1QX0VSUl9VTkRPRkFJTEVEOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAob2xkYXJwX3Jvdy0+ZHdBZGRyICE9IGFycF9yb3ctPmR3QWRkcikgewogICAgICAgICAgICAgICAgYXJwX3Jvdy0+ZHdUeXBlID0gMjsgICAgLypJZiByb3cgd2FzIGFkZGVkL2NyZWF0ZWQgZGVsZXRlIHRoYXQgcm93ICovCgogICAgICAgICAgICAgICAgaWYgKChzdGF0dXMgPSBTZXRJcE5ldEVudHJ5KGFycF9yb3cpKSAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHdoaWxlIGRlbGV0aW5nIGFkZGVkIHJvdywgc3RhdHVzIDogJWx1XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gU05NUF9FUlJfVU5ET0ZBSUxFRDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmcmVlKG9sZGFycF9yb3cpOwogICAgICAgICAgICBvbGRhcnBfcm93ID0gTlVMTDsKICAgICAgICAgICAgZnJlZShhcnBfcm93KTsKICAgICAgICAgICAgYXJwX3JvdyA9IE5VTEw7CiAgICAgICAgICAgIHJldHVybiByZXR2YWw7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBpZiBuZXcgZW50cnkgYW5kIHBoeXNpY2FsIGFkZHJlc3Mgc3BlY2lmaWVkLCBjcmVhdGUgbmV3IGVudHJ5IAogICAgICAgICAqLwogICAgICAgIGlmIChjcmVhdGVfZmxhZykgewogICAgICAgICAgICBpZiAoYXJwX3Jvdy0+ZHdQaHlzQWRkckxlbiAhPSAwKSB7CiAgICAgICAgICAgICAgICBpZiAoKHN0YXR1cyA9IENyZWF0ZUlwTmV0RW50cnkoYXJwX3JvdykpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5zaWRlIENPTU1JVDogQ3JlYXRlSXBOZXRFbnRyeSBmYWlsZWQsIHN0YXR1cyAlbHVcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBTTk1QX0VSUl9DT01NSVRGQUlMRUQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogRm9yIG5ldyBlbnRyeSwgcGh5c2ljYWwgYWRkcmVzcyBtdXN0IGJlIHNldC4gCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgY3JlYXRlIG5ldyBlbnRyeSB3aXRob3V0IHBoeXNpY2FsIGFkZHJlc3NcbiIpOwogICAgICAgICAgICAgICAgcmV0dmFsID0gU05NUF9FUlJfV1JPTkdWQUxVRTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiB1bnNldCB0aGUgY3JlYXRlX2ZsYWcsIHNvIHRoYXQgQ3JlYXRlSXBOZXRFbnRyeSBjYWxsZWQgb25seSBvbmNlIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgY3JlYXRlX2ZsYWcgPSAwOwogICAgICAgIH0KCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBGcmVlIGFueSByZXNvdXJjZXMgYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGZyZWUob2xkYXJwX3Jvdyk7CiAgICAgICAgb2xkYXJwX3JvdyA9IE5VTEw7CiAgICAgICAgZnJlZShhcnBfcm93KTsKICAgICAgICBhcnBfcm93ID0gTlVMTDsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiByZXR2YWw7Cn0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXSU4zMiBjeWd3aW4gKi8K